From f2000a7d3d510d1316039ffa1fbd0391d1ecd130 Mon Sep 17 00:00:00 2001 From: Navina Ramesh Date: Sun, 17 May 2020 21:08:45 -0700 Subject: [PATCH 1/3] KAFKA-10012 Reducing memory overhead associated with strings in MetricName --- .../apache/kafka/common/network/Selector.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/clients/src/main/java/org/apache/kafka/common/network/Selector.java b/clients/src/main/java/org/apache/kafka/common/network/Selector.java index 06f7048793fc5..7e3bfb023268c 100644 --- a/clients/src/main/java/org/apache/kafka/common/network/Selector.java +++ b/clients/src/main/java/org/apache/kafka/common/network/Selector.java @@ -1114,9 +1114,10 @@ public void close() { class SelectorMetrics implements AutoCloseable { private final Metrics metrics; - private final String metricGrpPrefix; private final Map metricTags; private final boolean metricsPerConnection; + private final String metricGrpName; + private final String perConnectionMetricGrpName; public final Sensor connectionClosed; public final Sensor connectionCreated; @@ -1142,10 +1143,10 @@ class SelectorMetrics implements AutoCloseable { public SelectorMetrics(Metrics metrics, String metricGrpPrefix, Map metricTags, boolean metricsPerConnection) { this.metrics = metrics; - this.metricGrpPrefix = metricGrpPrefix; this.metricTags = metricTags; this.metricsPerConnection = metricsPerConnection; - String metricGrpName = metricGrpPrefix + "-metrics"; + this.metricGrpName = metricGrpPrefix + "-metrics"; + this.perConnectionMetricGrpName = metricGrpPrefix + "-node-metrics"; StringBuilder tagsSuffix = new StringBuilder(); for (Map.Entry tag: metricTags.entrySet()) { @@ -1256,10 +1257,10 @@ public SelectorMetrics(Metrics metrics, String metricGrpPrefix, Map metricTags, SampledStat stat, String baseName, String descriptiveName) { - MetricName rateMetricName = metrics.metricName(baseName + "-rate", groupName, - String.format("The number of %s per second", descriptiveName), metricTags); - MetricName totalMetricName = metrics.metricName(baseName + "-total", groupName, - String.format("The total number of %s", descriptiveName), metricTags); + MetricName rateMetricName = metrics.metricName((baseName + "-rate").intern(), groupName, + String.format("The number of %s per second", descriptiveName).intern(), metricTags); + MetricName totalMetricName = metrics.metricName((baseName + "-total").intern(), groupName, + String.format("The total number of %s", descriptiveName).intern(), metricTags); if (stat == null) return new Meter(rateMetricName, totalMetricName); else @@ -1293,34 +1294,33 @@ public void maybeRegisterConnectionMetrics(String connectionId) { String nodeRequestName = "node-" + connectionId + ".requests-sent"; Sensor nodeRequest = this.metrics.getSensor(nodeRequestName); if (nodeRequest == null) { - String metricGrpName = metricGrpPrefix + "-node-metrics"; Map tags = new LinkedHashMap<>(metricTags); tags.put("node-id", "node-" + connectionId); nodeRequest = sensor(nodeRequestName); - nodeRequest.add(createMeter(metrics, metricGrpName, tags, new WindowedCount(), "request", "requests sent")); - MetricName metricName = metrics.metricName("request-size-avg", metricGrpName, "The average size of requests sent.", tags); + nodeRequest.add(createMeter(metrics, perConnectionMetricGrpName, tags, new WindowedCount(), "request", "requests sent")); + MetricName metricName = metrics.metricName("request-size-avg", perConnectionMetricGrpName, "The average size of requests sent.", tags); nodeRequest.add(metricName, new Avg()); - metricName = metrics.metricName("request-size-max", metricGrpName, "The maximum size of any request sent.", tags); + metricName = metrics.metricName("request-size-max", perConnectionMetricGrpName, "The maximum size of any request sent.", tags); nodeRequest.add(metricName, new Max()); String bytesSentName = "node-" + connectionId + ".bytes-sent"; Sensor bytesSent = sensor(bytesSentName); - bytesSent.add(createMeter(metrics, metricGrpName, tags, "outgoing-byte", "outgoing bytes")); + bytesSent.add(createMeter(metrics, perConnectionMetricGrpName, tags, "outgoing-byte", "outgoing bytes")); String nodeResponseName = "node-" + connectionId + ".responses-received"; Sensor nodeResponse = sensor(nodeResponseName); - nodeResponse.add(createMeter(metrics, metricGrpName, tags, new WindowedCount(), "response", "responses received")); + nodeResponse.add(createMeter(metrics, perConnectionMetricGrpName, tags, new WindowedCount(), "response", "responses received")); String bytesReceivedName = "node-" + connectionId + ".bytes-received"; Sensor bytesReceive = sensor(bytesReceivedName); - bytesReceive.add(createMeter(metrics, metricGrpName, tags, "incoming-byte", "incoming bytes")); + bytesReceive.add(createMeter(metrics, perConnectionMetricGrpName, tags, "incoming-byte", "incoming bytes")); String nodeTimeName = "node-" + connectionId + ".latency"; Sensor nodeRequestTime = sensor(nodeTimeName); - metricName = metrics.metricName("request-latency-avg", metricGrpName, tags); + metricName = metrics.metricName("request-latency-avg", perConnectionMetricGrpName, tags); nodeRequestTime.add(metricName, new Avg()); - metricName = metrics.metricName("request-latency-max", metricGrpName, tags); + metricName = metrics.metricName("request-latency-max", perConnectionMetricGrpName, tags); nodeRequestTime.add(metricName, new Max()); } } From 8d3db0d84348ed564ecdadf67967719ce6313105 Mon Sep 17 00:00:00 2001 From: Navina Ramesh Date: Mon, 1 Jun 2020 14:59:09 -0700 Subject: [PATCH 2/3] Removing intern() on metric name strings --- .../java/org/apache/kafka/common/network/Selector.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clients/src/main/java/org/apache/kafka/common/network/Selector.java b/clients/src/main/java/org/apache/kafka/common/network/Selector.java index 7e3bfb023268c..e312a9027537a 100644 --- a/clients/src/main/java/org/apache/kafka/common/network/Selector.java +++ b/clients/src/main/java/org/apache/kafka/common/network/Selector.java @@ -1257,10 +1257,10 @@ public SelectorMetrics(Metrics metrics, String metricGrpPrefix, Map metricTags, SampledStat stat, String baseName, String descriptiveName) { - MetricName rateMetricName = metrics.metricName((baseName + "-rate").intern(), groupName, - String.format("The number of %s per second", descriptiveName).intern(), metricTags); - MetricName totalMetricName = metrics.metricName((baseName + "-total").intern(), groupName, - String.format("The total number of %s", descriptiveName).intern(), metricTags); + MetricName rateMetricName = metrics.metricName((baseName + "-rate"), groupName, + String.format("The number of %s per second", descriptiveName), metricTags); + MetricName totalMetricName = metrics.metricName((baseName + "-total"), groupName, + String.format("The total number of %s", descriptiveName), metricTags); if (stat == null) return new Meter(rateMetricName, totalMetricName); else From 96d2b31f07f5df2c57c8cc0de03db1743aed734e Mon Sep 17 00:00:00 2001 From: Navina Ramesh Date: Mon, 1 Jun 2020 15:11:50 -0700 Subject: [PATCH 3/3] Removing redundant brackets --- .../main/java/org/apache/kafka/common/network/Selector.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/src/main/java/org/apache/kafka/common/network/Selector.java b/clients/src/main/java/org/apache/kafka/common/network/Selector.java index e312a9027537a..c367f05168254 100644 --- a/clients/src/main/java/org/apache/kafka/common/network/Selector.java +++ b/clients/src/main/java/org/apache/kafka/common/network/Selector.java @@ -1257,9 +1257,9 @@ public SelectorMetrics(Metrics metrics, String metricGrpPrefix, Map metricTags, SampledStat stat, String baseName, String descriptiveName) { - MetricName rateMetricName = metrics.metricName((baseName + "-rate"), groupName, + MetricName rateMetricName = metrics.metricName(baseName + "-rate", groupName, String.format("The number of %s per second", descriptiveName), metricTags); - MetricName totalMetricName = metrics.metricName((baseName + "-total"), groupName, + MetricName totalMetricName = metrics.metricName(baseName + "-total", groupName, String.format("The total number of %s", descriptiveName), metricTags); if (stat == null) return new Meter(rateMetricName, totalMetricName);