Merge branch 'stable-2.16'

* stable-2.16:
  Add Metric containing Gerrit and Java version information

Change-Id: Ic06704d9bdf3d9e8e62b27969ed9039a61b96550
diff --git a/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritBuildInformationMetric.java b/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritBuildInformationMetric.java
new file mode 100644
index 0000000..0f567b5
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritBuildInformationMetric.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.metricsreporterprometheus;
+
+import com.google.gerrit.common.Version;
+import io.prometheus.client.Counter;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+
+public class GerritBuildInformationMetric {
+  static final Counter requests =
+      Counter.build()
+          .name("gerrit_build_info")
+          .help("Gerrit build information.")
+          .labelNames("javaversion", "version", "revision")
+          .register();
+
+  public void compute() {
+    GerritVersionInfo versionInfo = extractVersionComponents();
+    requests.labels(getJavaVersion(), versionInfo.version, versionInfo.revision);
+  }
+
+  private static String getJavaVersion() {
+    RuntimeMXBean mxBean = ManagementFactory.getRuntimeMXBean();
+    return String.format("%s(%s)", mxBean.getSpecVersion(), mxBean.getVmVersion());
+  }
+
+  private static GerritVersionInfo extractVersionComponents() {
+    GerritVersionInfo versionInfo = new GerritVersionInfo();
+    String fullVersion = Version.getVersion();
+
+    if (fullVersion == null) {
+      return versionInfo;
+    }
+
+    String[] versionComponents = fullVersion.split("-");
+
+    versionInfo.version = versionComponents[0];
+
+    if (versionComponents.length > 2) {
+      versionInfo.revision = versionComponents.length > 2 ? versionComponents[2].substring(1) : "";
+    } else {
+      versionInfo.revision = "";
+    }
+
+    return versionInfo;
+  }
+
+  private static class GerritVersionInfo {
+    String revision = "unknown";
+    String version = "unknown";
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritPrometheusExporter.java b/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritPrometheusExporter.java
index b7c96cc..0dba67a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritPrometheusExporter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritPrometheusExporter.java
@@ -42,6 +42,7 @@
   private static final String PROMETHEUS_BEARER_TOKEN = "prometheusBearerToken";
   private static final String EXCLUDE_KEY = "excludeMetrics";
 
+  private final GerritBuildInformationMetric gerritBuildInfoMetric;
   private final CapabilityChecker capabilityChecker;
   private final String prometheusBearerToken;
 
@@ -54,6 +55,7 @@
     this.capabilityChecker = capabilityChecker;
     this.prometheusBearerToken =
         cfgFactory.getFromGerritConfig(pluginName).getString(PROMETHEUS_BEARER_TOKEN);
+    this.gerritBuildInfoMetric = new GerritBuildInformationMetric();
 
     List<Pattern> excludes =
         Arrays.stream(cfgFactory.getFromGerritConfig(pluginName).getStringList(EXCLUDE_KEY))
@@ -73,6 +75,7 @@
   public void service(ServletRequest req, ServletResponse res)
       throws ServletException, IOException {
     if (capabilityChecker.canViewMetrics() || canExportUsingPrometheusBearerToken(req)) {
+      gerritBuildInfoMetric.compute();
       super.service(req, res);
     } else {
       HttpServletResponse httpResponse = (HttpServletResponse) res;