diff --git a/collector/src/main/java/io/prometheus/jmx/BuildInfoCollector.java b/collector/src/main/java/io/prometheus/jmx/BuildInfoCollector.java new file mode 100755 index 00000000..dd114839 --- /dev/null +++ b/collector/src/main/java/io/prometheus/jmx/BuildInfoCollector.java @@ -0,0 +1,46 @@ +package io.prometheus.jmx; + +import io.prometheus.client.Collector; +import io.prometheus.client.GaugeMetricFamily; + +import java.util.ArrayList; +import java.util.List; + +import static java.util.Arrays.asList; + +/** + * Collects jmx_exporter build version info. + *

+ * Example usage: + *

+ * {@code
+ *   new BuildInfoCollector().register();
+ * }
+ * 
+ * Metrics being exported: + *
+ *   jmx_exporter_build_info{version="3.2.0",name="jmx_prometheus_httpserver",} 1.0
+ * 
+ */ +public class BuildInfoCollector extends Collector { + public List collect() { + List mfs = new ArrayList(); + + GaugeMetricFamily artifactInfo = new GaugeMetricFamily( + "jmx_exporter_build_info", + "A metric with a constant '1' value labeled with the version of the JMX exporter.", + asList("version", "name")); + + Package pkg = this.getClass().getPackage(); + String version = pkg.getImplementationVersion(); + String name = pkg.getImplementationTitle(); + + artifactInfo.addMetric(asList( + version != null ? version : "unknown", + name != null ? name : "unknown" + ), 1L); + mfs.add(artifactInfo); + + return mfs; + } +} diff --git a/collector/src/test/java/io/prometheus/jmx/BuildInfoCollectorTest.java b/collector/src/test/java/io/prometheus/jmx/BuildInfoCollectorTest.java new file mode 100644 index 00000000..523e7bff --- /dev/null +++ b/collector/src/test/java/io/prometheus/jmx/BuildInfoCollectorTest.java @@ -0,0 +1,32 @@ +package io.prometheus.jmx; + +import io.prometheus.client.CollectorRegistry; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class BuildInfoCollectorTest { + + private CollectorRegistry registry = new CollectorRegistry(); + + @Before + public void setUp() { + new BuildInfoCollector().register(registry); + } + + @Test + public void testBuildInfo() { + String version = this.getClass().getPackage().getImplementationVersion(); + String name = this.getClass().getPackage().getImplementationTitle(); + + assertEquals( + 1L, + registry.getSampleValue( + "jmx_exporter_build_info", new String[]{"version", "name"}, new String[]{ + version != null ? version : "unknown", + name != null ? name : "unknown" + }), + .0000001); + } +} diff --git a/jmx_prometheus_httpserver/pom.xml b/jmx_prometheus_httpserver/pom.xml index 4238ec1a..1746ea4c 100644 --- a/jmx_prometheus_httpserver/pom.xml +++ b/jmx_prometheus_httpserver/pom.xml @@ -36,6 +36,7 @@ io.prometheus.jmx.WebServer + true diff --git a/jmx_prometheus_httpserver/src/main/java/io/prometheus/jmx/WebServer.java b/jmx_prometheus_httpserver/src/main/java/io/prometheus/jmx/WebServer.java index 199ad077..ade7c0da 100644 --- a/jmx_prometheus_httpserver/src/main/java/io/prometheus/jmx/WebServer.java +++ b/jmx_prometheus_httpserver/src/main/java/io/prometheus/jmx/WebServer.java @@ -26,6 +26,7 @@ public static void main(String[] args) throws Exception { socket = new InetSocketAddress(port); } + new BuildInfoCollector().register(); new JmxCollector(new File(args[1])).register(); new HTTPServer(socket, CollectorRegistry.defaultRegistry); } diff --git a/jmx_prometheus_javaagent/pom.xml b/jmx_prometheus_javaagent/pom.xml index 7889fdbd..5d6567b3 100644 --- a/jmx_prometheus_javaagent/pom.xml +++ b/jmx_prometheus_javaagent/pom.xml @@ -82,6 +82,8 @@ io.prometheus.jmx.shaded.io.prometheus.jmx.JavaAgent + ${project.version} + ${project.artifactId} diff --git a/jmx_prometheus_javaagent/src/main/java/io/prometheus/jmx/JavaAgent.java b/jmx_prometheus_javaagent/src/main/java/io/prometheus/jmx/JavaAgent.java index d1b2e5e0..c1ab413a 100644 --- a/jmx_prometheus_javaagent/src/main/java/io/prometheus/jmx/JavaAgent.java +++ b/jmx_prometheus_javaagent/src/main/java/io/prometheus/jmx/JavaAgent.java @@ -44,6 +44,7 @@ public static void premain(String agentArgument, Instrumentation instrumentation file = args[1]; } + new BuildInfoCollector().register(); new JmxCollector(new File(file)).register(); DefaultExports.initialize(); server = new HTTPServer(socket, CollectorRegistry.defaultRegistry, true);