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);