You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by ni...@apache.org on 2023/05/11 11:54:26 UTC
[pulsar] branch branch-2.10 updated: [fix][monitor] topic with double quote breaks the prometheus format (#20230)
This is an automated email from the ASF dual-hosted git repository.
nicoloboschi pushed a commit to branch branch-2.10
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/branch-2.10 by this push:
new d8bf38ebc3e [fix][monitor] topic with double quote breaks the prometheus format (#20230)
d8bf38ebc3e is described below
commit d8bf38ebc3e0e44cf42d5aa821657596b8126d50
Author: Nicolò Boschi <bo...@gmail.com>
AuthorDate: Wed May 10 13:26:16 2023 +0200
[fix][monitor] topic with double quote breaks the prometheus format (#20230)
(cherry picked from commit ea56197d18d8d1f5b06c26246d920cb736d4e6a6)
(cherry picked from commit f94c8cb1fc137f72ce23e53552749c60c36b03a9)
---
.../stats/prometheus/PrometheusMetricStreams.java | 6 ++++-
.../pulsar/broker/stats/PrometheusMetricsTest.java | 27 ++++++++++++++++++++++
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/stats/prometheus/PrometheusMetricStreams.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/stats/prometheus/PrometheusMetricStreams.java
index c7e09b5df60..2e32e216a02 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/stats/prometheus/PrometheusMetricStreams.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/stats/prometheus/PrometheusMetricStreams.java
@@ -41,7 +41,11 @@ public class PrometheusMetricStreams {
SimpleTextOutputStream stream = initGaugeType(metricName);
stream.write(metricName).write('{');
for (int i = 0; i < labelsAndValuesArray.length; i += 2) {
- stream.write(labelsAndValuesArray[i]).write("=\"").write(labelsAndValuesArray[i + 1]).write('\"');
+ String labelValue = labelsAndValuesArray[i + 1];
+ if (labelValue != null) {
+ labelValue = labelValue.replace("\"", "\\\"");
+ }
+ stream.write(labelsAndValuesArray[i]).write("=\"").write(labelValue).write('\"');
if (i + 2 != labelsAndValuesArray.length) {
stream.write(',');
}
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/PrometheusMetricsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/PrometheusMetricsTest.java
index 8aec2b3eed0..1f21706f7dc 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/PrometheusMetricsTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/PrometheusMetricsTest.java
@@ -51,6 +51,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
import javax.crypto.SecretKey;
import javax.naming.AuthenticationException;
import lombok.Cleanup;
@@ -1684,4 +1685,30 @@ public class PrometheusMetricsTest extends BrokerTestBase {
}
}
+ @Test
+ public void testEscapeLabelValue() throws Exception {
+ String ns1 = "prop/ns-abc1";
+ admin.namespaces().createNamespace(ns1);
+ String topic = "persistent://" + ns1 + "/\"mytopic";
+ admin.topics().createNonPartitionedTopic(topic);
+
+ @Cleanup
+ final Consumer<?> consumer = pulsarClient.newConsumer()
+ .subscriptionName("sub")
+ .topic(topic)
+ .subscribe();
+ @Cleanup
+ ByteArrayOutputStream statsOut = new ByteArrayOutputStream();
+ PrometheusMetricsGenerator.generate(pulsar, true, false,
+ false, statsOut);
+ String metricsStr = statsOut.toString();
+ final List<String> subCountLines = Arrays.stream(metricsStr.split("\n"))
+ .filter(line -> line.startsWith("pulsar_subscriptions_count") && line.contains("topic="))
+ .collect(Collectors.toList());
+ System.out.println(subCountLines);
+ assertEquals(subCountLines.size(), 1);
+ assertEquals(subCountLines.get(0),
+ "pulsar_subscriptions_count{cluster=\"test\",namespace=\"prop/ns-abc1\",topic=\"persistent://prop/ns-abc1/\\\"mytopic\"} 1");
+ }
+
}