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

jianingwang pushed a commit to branch online-prometheus-parser
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/online-prometheus-parser by 
this push:
     new e3a458786c switch to online parser
e3a458786c is described below

commit e3a458786c09049d23e264ab6c691eb0c14440c9
Author: vinci <[email protected]>
AuthorDate: Sat Apr 5 19:36:18 2025 +0800

    switch to online parser
---
 .../prometheus/PrometheusAutoCollectImpl.java      | 31 +++++++---------------
 .../prometheus/parser/OnlineParserTest.java        |  6 +++--
 2 files changed, 14 insertions(+), 23 deletions(-)

diff --git 
a/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/prometheus/PrometheusAutoCollectImpl.java
 
b/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/prometheus/PrometheusAutoCollectImpl.java
index f92c3d6455..3892df9e90 100644
--- 
a/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/prometheus/PrometheusAutoCollectImpl.java
+++ 
b/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/prometheus/PrometheusAutoCollectImpl.java
@@ -19,6 +19,7 @@ package org.apache.hertzbeat.collector.collect.prometheus;
 
 import static org.apache.hertzbeat.common.constants.SignConstants.RIGHT_DASH;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InterruptedIOException;
 import java.net.ConnectException;
 import java.net.UnknownHostException;
@@ -46,6 +47,7 @@ import org.apache.hertzbeat.common.entity.message.CollectRep;
 import org.apache.hertzbeat.common.util.Base64Util;
 import org.apache.hertzbeat.common.util.CommonUtil;
 import org.apache.hertzbeat.common.util.IpDomainUtil;
+import org.apache.hertzbeat.common.util.OnlineParser;
 import org.apache.http.HttpHeaders;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpStatus;
@@ -99,25 +101,12 @@ public class PrometheusAutoCollectImpl {
                 builder.setMsg(NetworkConstants.STATUS_CODE + 
SignConstants.BLANK + statusCode);
                 return null;
             }
-            // todo: The InputStream is directly converted to a String here
-            //       For large data in the Prometheus exporter, this can 
generate large objects, which could severely impact JVM memory space
-            // todo: Option one: Use InputStream for parsing, but this 
requires significant code changes
-            //       Option two: Manually trigger garbage collection, which 
can be referenced from Dubbo for long i
-            String resp = EntityUtils.toString(response.getEntity(), 
StandardCharsets.UTF_8);
-            long collectTime = System.currentTimeMillis();
-            builder.setTime(collectTime);
-            if (resp == null || !StringUtils.hasText(resp)) {
-                log.error("http response content is empty, status: {}.", 
statusCode);
+            try {
+                return 
parseResponseByPrometheusExporter(response.getEntity().getContent(), 
metrics.getAliasFields(), builder);
+            } catch (Exception e) {
+                log.info("parse error: {}.", e.getMessage(), e);
                 builder.setCode(CollectRep.Code.FAIL);
-                builder.setMsg("http response content is empty");
-            } else {
-                try {
-                    return parseResponseByPrometheusExporter(resp, 
metrics.getAliasFields(), builder);
-                } catch (Exception e) {
-                    log.info("parse error: {}.", e.getMessage(), e);
-                    builder.setCode(CollectRep.Code.FAIL);
-                    builder.setMsg("parse response data error:" + 
e.getMessage());
-                }   
+                builder.setMsg("parse response data error:" + e.getMessage());
             }
         } catch (ClientProtocolException e1) {
             String errorMsg = CommonUtil.getMessageFromThrowable(e1);
@@ -168,9 +157,9 @@ public class PrometheusAutoCollectImpl {
         }
     }
     
-    private List<CollectRep.MetricsData> 
parseResponseByPrometheusExporter(String resp, List<String> aliasFields,
-                                                                           
CollectRep.MetricsData.Builder builder) {
-        Map<String, MetricFamily> metricFamilyMap = 
TextParser.textToMetricFamilies(resp);
+    private List<CollectRep.MetricsData> 
parseResponseByPrometheusExporter(InputStream inputStream, List<String> 
aliasFields,
+                                                                           
CollectRep.MetricsData.Builder builder) throws IOException {
+        Map<String, MetricFamily> metricFamilyMap = 
OnlineParser.parseMetrics(inputStream);
         List<CollectRep.MetricsData> metricsDataList = new LinkedList<>();
         for (Map.Entry<String, MetricFamily> entry : 
metricFamilyMap.entrySet()) {
             builder.clearFields();
diff --git 
a/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/prometheus/parser/OnlineParserTest.java
 
b/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/prometheus/parser/OnlineParserTest.java
index f01da4a5ac..9747650417 100644
--- 
a/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/prometheus/parser/OnlineParserTest.java
+++ 
b/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/prometheus/parser/OnlineParserTest.java
@@ -75,7 +75,9 @@ class OnlineParserTest {
                 # TYPE go_memstats_gc_sys_bytes gauge
                 go_memstats_gc_sys_bytes 4.614808e+06""";
         InputStream inputStream = new 
ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));
-        Map<String, MetricFamily> metricFamilyMap = 
OnlineParser.parseMetrics(inputStream);
-        assertNotNull(metricFamilyMap);
+        Map<String, MetricFamily> metricFamilyMap1 = 
OnlineParser.parseMetrics(inputStream);
+        Map<String, MetricFamily> metricFamilyMap2 = 
TextParser.textToMetricFamilies(str);
+        assertNotNull(metricFamilyMap1);
+        assertNotNull(metricFamilyMap2);
     }
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to