This is an automated email from the ASF dual-hosted git repository.

nicoloboschi pushed a commit to branch branch-2.9
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/branch-2.9 by this push:
     new f94c8cb1fc1 [fix][monitor] topic with double quote breaks the 
prometheus format (#20230)
f94c8cb1fc1 is described below

commit f94c8cb1fc137f72ce23e53552749c60c36b03a9
Author: Nicolò Boschi <boschi1...@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)
---
 .../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 84a4e250a6a..e8c55c5236e 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
@@ -53,6 +53,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;
@@ -1517,4 +1518,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");
+    }
+
 }

Reply via email to