Browse Source

HADOOP-16495. Fix invalid metric types in PrometheusMetricsSink (#1244)

Akira Ajisaka 5 years ago
parent
commit
0f8add8a60

+ 3 - 2
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/sink/PrometheusMetricsSink.java

@@ -46,6 +46,7 @@ public class PrometheusMetricsSink implements MetricsSink {
 
   private static final Pattern SPLIT_PATTERN =
       Pattern.compile("(?<!(^|[A-Z_]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])");
+  private static final Pattern DELIMITERS = Pattern.compile("[^a-zA-Z0-9]+");
 
   public PrometheusMetricsSink() {
   }
@@ -92,9 +93,9 @@ public class PrometheusMetricsSink implements MetricsSink {
                                String metricName) {
     String baseName = StringUtils.capitalize(recordName)
         + StringUtils.capitalize(metricName);
-    baseName = baseName.replace('-', '_');
     String[] parts = SPLIT_PATTERN.split(baseName);
-    return String.join("_", parts).toLowerCase();
+    String joined =  String.join("_", parts).toLowerCase();
+    return DELIMITERS.matcher(joined).replaceAll("_");
   }
 
   @Override

+ 22 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/sink/TestPrometheusMetricsSink.java

@@ -99,6 +99,28 @@ public class TestPrometheusMetricsSink {
         sink.prometheusName(recordName, metricName));
   }
 
+  @Test
+  public void testNamingPeriods() {
+    PrometheusMetricsSink sink = new PrometheusMetricsSink();
+
+    String recordName = "org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl";
+    String metricName = "DfsUsed";
+    Assert.assertEquals(
+        "org_apache_hadoop_hdfs_server_datanode_fsdataset_impl_fs_dataset_impl_dfs_used",
+        sink.prometheusName(recordName, metricName));
+  }
+
+  @Test
+  public void testNamingWhitespaces() {
+    PrometheusMetricsSink sink = new PrometheusMetricsSink();
+
+    String recordName = "JvmMetrics";
+    String metricName = "GcCount" + "G1 Old Generation";
+    Assert.assertEquals(
+        "jvm_metrics_gc_count_g1_old_generation",
+        sink.prometheusName(recordName, metricName));
+  }
+
   /**
    * Example metric pojo.
    */