Browse Source

HDDS-1870. ConcurrentModification at PrometheusMetricsSink (#1179)

Doroszlai, Attila 5 years ago
parent
commit
f4df97fd89

+ 16 - 8
hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/PrometheusMetricsSink.java

@@ -21,8 +21,8 @@ import static org.apache.hadoop.utils.RocksDBStoreMBean.ROCKSDB_CONTEXT_PREFIX;
 
 
 import java.io.IOException;
 import java.io.IOException;
 import java.io.Writer;
 import java.io.Writer;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
 
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -44,7 +44,7 @@ public class PrometheusMetricsSink implements MetricsSink {
   /**
   /**
    * Cached output lines for each metrics.
    * Cached output lines for each metrics.
    */
    */
-  private Map<String, String> metricLines = new HashMap<>();
+  private final Map<String, String> metricLines = new ConcurrentHashMap<>();
 
 
   private static final Pattern SPLIT_PATTERN =
   private static final Pattern SPLIT_PATTERN =
       Pattern.compile("(?<!(^|[A-Z_]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])");
       Pattern.compile("(?<!(^|[A-Z_]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])");
@@ -65,9 +65,13 @@ public class PrometheusMetricsSink implements MetricsSink {
             metricsRecord.name(), metrics.name());
             metricsRecord.name(), metrics.name());
 
 
         StringBuilder builder = new StringBuilder();
         StringBuilder builder = new StringBuilder();
-        builder.append("# TYPE " + key + " " +
-            metrics.type().toString().toLowerCase() + "\n");
-        builder.append(key + "{");
+        builder.append("# TYPE ")
+            .append(key)
+            .append(" ")
+            .append(metrics.type().toString().toLowerCase())
+            .append("\n")
+            .append(key)
+            .append("{");
         String sep = "";
         String sep = "";
 
 
         //add tags
         //add tags
@@ -76,13 +80,17 @@ public class PrometheusMetricsSink implements MetricsSink {
 
 
           //ignore specific tag which includes sub-hierarchy
           //ignore specific tag which includes sub-hierarchy
           if (!tagName.equals("numopenconnectionsperuser")) {
           if (!tagName.equals("numopenconnectionsperuser")) {
-            builder.append(
-                sep + tagName + "=\"" + tag.value() + "\"");
+            builder.append(sep)
+                .append(tagName)
+                .append("=\"")
+                .append(tag.value())
+                .append("\"");
             sep = ",";
             sep = ",";
           }
           }
         }
         }
         builder.append("} ");
         builder.append("} ");
         builder.append(metrics.value());
         builder.append(metrics.value());
+        builder.append("\n");
         metricLines.put(key, builder.toString());
         metricLines.put(key, builder.toString());
 
 
       }
       }
@@ -121,7 +129,7 @@ public class PrometheusMetricsSink implements MetricsSink {
 
 
   public void writeMetrics(Writer writer) throws IOException {
   public void writeMetrics(Writer writer) throws IOException {
     for (String line : metricLines.values()) {
     for (String line : metricLines.values()) {
-      writer.write(line + "\n");
+      writer.write(line);
     }
     }
   }
   }
 }
 }