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]