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

zhaoqingran pushed a commit to branch self-monitor
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/self-monitor by this push:
     new 8d9bfd3e78 feat(collector): integrate Prometheus metrics- Add 
Prometheus metrics support to the collector - Move metrics collection from OTel 
module to collector - Update CommonDispatcher to use HertzBeatMetricsCollector- 
Add management endpoints for Prometheus metrics exposure
8d9bfd3e78 is described below

commit 8d9bfd3e78798b300dc304c7d531be0d2ebac5cc
Author: Logic <[email protected]>
AuthorDate: Tue Jul 15 17:06:08 2025 +0800

    feat(collector): integrate Prometheus metrics- Add Prometheus metrics 
support to the collector
    - Move metrics collection from OTel module to collector
    - Update CommonDispatcher to use HertzBeatMetricsCollector- Add management 
endpoints for Prometheus metrics exposure
---
 .../hertzbeat-collector-collector/pom.xml          | 13 +++++-----
 .../collector/dispatch/CommonDispatcher.java       | 28 ++++++++++------------
 .../metrics/HertzBeatMetricsCollector.java         | 24 ++++++++++++++++---
 .../src/main/resources/application.yml             | 18 +++++++++++++-
 hertzbeat-otel/pom.xml                             |  8 -------
 5 files changed, 58 insertions(+), 33 deletions(-)

diff --git a/hertzbeat-collector/hertzbeat-collector-collector/pom.xml 
b/hertzbeat-collector/hertzbeat-collector-collector/pom.xml
index 0584537b77..0e7cfd1cbe 100644
--- a/hertzbeat-collector/hertzbeat-collector-collector/pom.xml
+++ b/hertzbeat-collector/hertzbeat-collector-collector/pom.xml
@@ -70,14 +70,11 @@
             <version>${hertzbeat.version}</version>
         </dependency>
 
-
-
         <!-- spring -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-configuration-processor</artifactId>
@@ -87,11 +84,15 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-autoconfigure</artifactId>
         </dependency>
+        <!-- metrics -->
         <dependency>
-            <groupId>org.apache.hertzbeat</groupId>
-            <artifactId>hertzbeat-otel</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
         </dependency>
-
     </dependencies>
 
     <build>
diff --git 
a/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/dispatch/CommonDispatcher.java
 
b/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/dispatch/CommonDispatcher.java
index a49726aa1b..6e68756248 100644
--- 
a/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/dispatch/CommonDispatcher.java
+++ 
b/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/dispatch/CommonDispatcher.java
@@ -23,6 +23,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import 
org.apache.hertzbeat.collector.dispatch.entrance.internal.CollectJobService;
+import org.apache.hertzbeat.collector.metrics.HertzBeatMetricsCollector;
 import org.apache.hertzbeat.common.timer.Timeout;
 import org.apache.hertzbeat.collector.timer.TimerDispatch;
 import org.apache.hertzbeat.collector.timer.WheelTimerTask;
@@ -33,8 +34,7 @@ import org.apache.hertzbeat.common.entity.job.Job;
 import org.apache.hertzbeat.common.entity.job.Metrics;
 import org.apache.hertzbeat.common.entity.message.CollectRep;
 import org.apache.hertzbeat.common.queue.CommonDataQueue;
-import org.apache.hertzbeat.otel.service.MetricsService; // 新增
-import org.springframework.beans.factory.annotation.Autowired; // 新增
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.HashMap;
@@ -93,7 +93,7 @@ public class CommonDispatcher implements MetricsTaskDispatch, 
CollectDataDispatc
     private final String collectorIdentity;
 
     @Autowired
-    private MetricsService metricsService; // 新增注入
+    private HertzBeatMetricsCollector metricsCollector;
 
     public CommonDispatcher(MetricsCollectorQueue jobRequestQueue,
                             TimerDispatch timerDispatch,
@@ -165,12 +165,12 @@ public class CommonDispatcher implements 
MetricsTaskDispatch, CollectDataDispatc
                     }
                     WheelTimerTask timerJob = (WheelTimerTask) 
metricsTime.getTimeout().task();
                     Job job = timerJob.getJob();
-                    // ========================> 超时埋点 <========================
-                    if (metricsService != null) {
+                    // timeout metrics
+                    if (metricsCollector != null) {
                         long duration = System.currentTimeMillis() - 
removedMetricsTime.getStartTime();
-                        metricsService.recordCollectMetrics(job, duration, 
"timeout");
+                        metricsCollector.recordCollectMetrics(job, duration, 
"timeout");
                     }
-                    // ========================> 埋点结束 <========================
+
                     CollectRep.MetricsData metricsData = 
CollectRep.MetricsData.newBuilder()
                             .setId(job.getMonitorId())
                             .setTenantId(job.getTenantId())
@@ -223,13 +223,13 @@ public class CommonDispatcher implements 
MetricsTaskDispatch, CollectDataDispatc
             monitorKey = job.getId() + "-" + metrics.getName();
         }
         MetricsTime metricsTime = metricsTimeoutMonitorMap.remove(monitorKey);
-        // ========================> 任务完成埋点 <========================
-        if (metricsTime != null && metricsService != null) {
+
+        // job completed metrics
+        if (metricsTime != null && metricsCollector != null) {
             long duration = System.currentTimeMillis() - 
metricsTime.getStartTime();
             String status = metricsData.getCode() == CollectRep.Code.SUCCESS ? 
"success" : "fail";
-            metricsService.recordCollectMetrics(job, duration, status);
+            metricsCollector.recordCollectMetrics(job, duration, status);
         }
-        // ========================> 埋点结束 <========================
         if (metrics.isHasSubTask()) {
             boolean isLastTask = metrics.consumeSubTaskResponse(metricsData);
             if (isLastTask) {
@@ -349,14 +349,12 @@ public class CommonDispatcher implements 
MetricsTaskDispatch, CollectDataDispatc
         WheelTimerTask timerJob = (WheelTimerTask) timeout.task();
         Job job = timerJob.getJob();
         MetricsTime metricsTime = 
metricsTimeoutMonitorMap.remove(String.valueOf(job.getId()));
-        // ========================> Prometheus任务完成埋点 <========================
-        if (metricsTime != null && metricsService != null) {
+        if (metricsTime != null && metricsCollector != null) {
             long duration = System.currentTimeMillis() - 
metricsTime.getStartTime();
             // For a list, we consider it a success if at least one item is 
successful.
             boolean isSuccess = metricsDataList.stream().anyMatch(item -> 
item.getCode() == CollectRep.Code.SUCCESS);
-            metricsService.recordCollectMetrics(job, duration, isSuccess ? 
"success" : "fail");
+            metricsCollector.recordCollectMetrics(job, duration, isSuccess ? 
"success" : "fail");
         }
-        // ========================> 埋点结束 <========================
         if (job.isCyclic()) {
             // The collection and execution of all task of this job are 
completed.
             // The periodic task pushes the task to the time wheel again.
diff --git 
a/hertzbeat-otel/src/main/java/org/apache/hertzbeat/otel/service/MetricsService.java
 
b/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/metrics/HertzBeatMetricsCollector.java
similarity index 73%
rename from 
hertzbeat-otel/src/main/java/org/apache/hertzbeat/otel/service/MetricsService.java
rename to 
hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/metrics/HertzBeatMetricsCollector.java
index 5c536de257..66e4b99955 100644
--- 
a/hertzbeat-otel/src/main/java/org/apache/hertzbeat/otel/service/MetricsService.java
+++ 
b/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/metrics/HertzBeatMetricsCollector.java
@@ -1,4 +1,22 @@
-package org.apache.hertzbeat.otel.service;
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements.  See the NOTICE file distributed with
+ *   this work for additional information regarding copyright ownership.
+ *   The ASF licenses this file to You under the Apache License, Version 2.0
+ *   (the "License"); you may not use this file except in compliance with
+ *   the License.  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.hertzbeat.collector.metrics;
 
 import io.micrometer.core.instrument.Counter;
 import io.micrometer.core.instrument.MeterRegistry;
@@ -16,11 +34,11 @@ import java.util.Map;
  */
 @Service
 @Slf4j
-public class MetricsService {
+public class HertzBeatMetricsCollector {
 
     private final MeterRegistry meterRegistry;
 
-    public MetricsService(MeterRegistry meterRegistry) {
+    public HertzBeatMetricsCollector(MeterRegistry meterRegistry) {
         this.meterRegistry = meterRegistry;
         log.info("MetricsService initialized with MeterRegistry: {}", 
meterRegistry.getClass().getSimpleName());
     }
diff --git 
a/hertzbeat-collector/hertzbeat-collector-collector/src/main/resources/application.yml
 
b/hertzbeat-collector/hertzbeat-collector-collector/src/main/resources/application.yml
index 94e69a1e44..c797edccf7 100644
--- 
a/hertzbeat-collector/hertzbeat-collector-collector/src/main/resources/application.yml
+++ 
b/hertzbeat-collector/hertzbeat-collector-collector/src/main/resources/application.yml
@@ -30,7 +30,23 @@ spring:
   # need to disable spring boot mongodb auto config, or default mongodb 
connection tried and failed...
   autoconfigure:
     exclude: 
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, 
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, 
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, 
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
-
+management:
+  endpoints:
+    web:
+      exposure:
+        include:
+          - 'prometheus'
+  endpoint:
+    prometheus:
+      access: read_only
+  metrics:
+    tags:
+      application: ${spring.application.name}
+      environment: ${spring.profiles.active}
+  prometheus:
+    metrics:
+      export:
+        enabled: true
 ---
 spring:
   config:
diff --git a/hertzbeat-otel/pom.xml b/hertzbeat-otel/pom.xml
index c6fbab8d2e..0a03179e66 100644
--- a/hertzbeat-otel/pom.xml
+++ b/hertzbeat-otel/pom.xml
@@ -55,13 +55,5 @@
             <groupId>io.opentelemetry.instrumentation</groupId>
             <artifactId>opentelemetry-spring-boot-starter</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-actuator</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.micrometer</groupId>
-            <artifactId>micrometer-registry-prometheus</artifactId>
-        </dependency>
     </dependencies>
 </project>


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

Reply via email to