From f6ecdbb6996eb4040012cb357c759f1fefb24d6a Mon Sep 17 00:00:00 2001 From: Hugo Picado Date: Wed, 6 Jun 2018 19:53:05 +0100 Subject: [PATCH 1/2] Registering JMX Exporter build info By adding the Implementation-Version manifest entry it is possible to retrieve the lib version at runtime by checking the class Package. This allows the tracking of which JVMs are running which versions of the exporter. Closes #278 Signed-off-by: Hugo Picado --- .../io/prometheus/jmx/BuildInfoCollector.java | 40 +++++++++++++++++++ .../jmx/BuildInfoCollectorTest.java | 30 ++++++++++++++ jmx_prometheus_javaagent/pom.xml | 1 + .../java/io/prometheus/jmx/JavaAgent.java | 1 + 4 files changed, 72 insertions(+) create mode 100755 collector/src/main/java/io/prometheus/jmx/BuildInfoCollector.java create mode 100644 collector/src/test/java/io/prometheus/jmx/BuildInfoCollectorTest.java 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..2a9b1927 --- /dev/null +++ b/collector/src/main/java/io/prometheus/jmx/BuildInfoCollector.java @@ -0,0 +1,40 @@ +package io.prometheus.jmx; + +import io.prometheus.client.Collector; +import io.prometheus.client.GaugeMetricFamily; + +import java.util.*; + +import static java.util.Collections.singletonList; + +/** + * Collects jmx_exporter build version info. + *

+ * Example usage: + *

+ * {@code
+ *   new BuildInfoCollector().register();
+ * }
+ * 
+ * Metrics being exported: + *
+ *   jmx_exporter_build_info{version="3.2.0",} 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.", + singletonList("version")); + + String version = this.getClass().getPackage().getImplementationVersion(); + + artifactInfo.addMetric(singletonList(version != null ? version : "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..17c54df1 --- /dev/null +++ b/collector/src/test/java/io/prometheus/jmx/BuildInfoCollectorTest.java @@ -0,0 +1,30 @@ +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(); + + assertEquals( + 1L, + registry.getSampleValue( + "jmx_exporter_build_info", new String[]{"version"}, new String[]{ + version != null ? version : "unknown" + }), + .0000001); + } +} diff --git a/jmx_prometheus_javaagent/pom.xml b/jmx_prometheus_javaagent/pom.xml index 7889fdbd..e4215c19 100644 --- a/jmx_prometheus_javaagent/pom.xml +++ b/jmx_prometheus_javaagent/pom.xml @@ -82,6 +82,7 @@ io.prometheus.jmx.shaded.io.prometheus.jmx.JavaAgent + ${project.version} 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); From 2472f4c953e428acbb05a5517718d329ae3ae5a6 Mon Sep 17 00:00:00 2001 From: Hugo Picado Date: Thu, 7 Jun 2018 18:04:14 +0100 Subject: [PATCH 2/2] Registering jmx_exporter build info for HTTP Server As now we are exporting the build info for different modules, besides the version, the name of the module was also added so we can distinguish between both. Signed-off-by: Hugo Picado Closes #278 --- .../io/prometheus/jmx/BuildInfoCollector.java | 18 ++++++++++++------ .../prometheus/jmx/BuildInfoCollectorTest.java | 6 ++++-- jmx_prometheus_httpserver/pom.xml | 1 + .../main/java/io/prometheus/jmx/WebServer.java | 1 + jmx_prometheus_javaagent/pom.xml | 1 + 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/collector/src/main/java/io/prometheus/jmx/BuildInfoCollector.java b/collector/src/main/java/io/prometheus/jmx/BuildInfoCollector.java index 2a9b1927..dd114839 100755 --- a/collector/src/main/java/io/prometheus/jmx/BuildInfoCollector.java +++ b/collector/src/main/java/io/prometheus/jmx/BuildInfoCollector.java @@ -3,9 +3,10 @@ import io.prometheus.client.Collector; import io.prometheus.client.GaugeMetricFamily; -import java.util.*; +import java.util.ArrayList; +import java.util.List; -import static java.util.Collections.singletonList; +import static java.util.Arrays.asList; /** * Collects jmx_exporter build version info. @@ -18,7 +19,7 @@ * * Metrics being exported: *
- *   jmx_exporter_build_info{version="3.2.0",} 1.0
+ *   jmx_exporter_build_info{version="3.2.0",name="jmx_prometheus_httpserver",} 1.0
  * 
*/ public class BuildInfoCollector extends Collector { @@ -28,11 +29,16 @@ public List collect() { GaugeMetricFamily artifactInfo = new GaugeMetricFamily( "jmx_exporter_build_info", "A metric with a constant '1' value labeled with the version of the JMX exporter.", - singletonList("version")); + asList("version", "name")); - String version = this.getClass().getPackage().getImplementationVersion(); + Package pkg = this.getClass().getPackage(); + String version = pkg.getImplementationVersion(); + String name = pkg.getImplementationTitle(); - artifactInfo.addMetric(singletonList(version != null ? version : "unknown"), 1L); + 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 index 17c54df1..523e7bff 100644 --- a/collector/src/test/java/io/prometheus/jmx/BuildInfoCollectorTest.java +++ b/collector/src/test/java/io/prometheus/jmx/BuildInfoCollectorTest.java @@ -18,12 +18,14 @@ public void setUp() { @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"}, new String[]{ - version != null ? version : "unknown" + "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 e4215c19..5d6567b3 100644 --- a/jmx_prometheus_javaagent/pom.xml +++ b/jmx_prometheus_javaagent/pom.xml @@ -83,6 +83,7 @@ io.prometheus.jmx.shaded.io.prometheus.jmx.JavaAgent ${project.version} + ${project.artifactId}