From 7765806da0f00cec0ba626d59238e457e4c297cc Mon Sep 17 00:00:00 2001
From: SavitarC <71271200+savitarc@users.noreply.github.com>
Date: Fri, 13 Mar 2026 20:03:34 +0800
Subject: [PATCH 1/2] feat: support legacy and new prometheus client stacks
- add an adapter-based Prometheus reporter for both Micrometer registries
- detect both legacy and new Prometheus dependencies at runtime
- wire new Prometheus pushgateway dependencies into the BOM and Spring Boot autoconfigure
---
dubbo-dependencies-bom/pom.xml | 13 ++
.../metrics/utils/MetricsSupportUtil.java | 35 +++-
dubbo-metrics/dubbo-metrics-otlp/pom.xml | 5 -
.../dubbo-metrics-prometheus/pom.xml | 8 +
.../prometheus/PrometheusMetricsReporter.java | 181 +++++++++++++++---
.../PrometheusMetricsReporterFactory.java | 12 +-
.../PrometheusMetricsReporterTest.java | 88 ++++++++-
.../PrometheusMetricsThreadPoolTest.java | 2 +-
.../dubbo-spring-boot-autoconfigure/pom.xml | 16 ++
9 files changed, 314 insertions(+), 46 deletions(-)
diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml
index c3424c64542..fb966cf2c64 100644
--- a/dubbo-dependencies-bom/pom.xml
+++ b/dubbo-dependencies-bom/pom.xml
@@ -128,6 +128,7 @@
1.6.3
3.3
0.16.0
+ 1.5.0
1.0.4
3.8.3
2.9.5
@@ -260,6 +261,13 @@
pom
import
+
+ io.prometheus
+ prometheus-metrics-bom
+ ${prometheus_metrics.version}
+ pom
+ import
+
org.springframework.boot
@@ -945,6 +953,11 @@
simpleclient_pushgateway
${prometheus_client.version}
+
+ io.prometheus
+ prometheus-metrics-exporter-pushgateway
+ ${prometheus_metrics.version}
+
org.reactivestreams
diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/utils/MetricsSupportUtil.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/utils/MetricsSupportUtil.java
index b304197bb8b..3415eac6319 100644
--- a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/utils/MetricsSupportUtil.java
+++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/utils/MetricsSupportUtil.java
@@ -20,18 +20,45 @@
public class MetricsSupportUtil {
+ private static final String[] LEGACY_PROMETHEUS_STACK = {
+ "io.micrometer.prometheus.PrometheusConfig",
+ "io.micrometer.prometheus.PrometheusMeterRegistry",
+ "io.prometheus.client.exporter.PushGateway",
+ "io.prometheus.client.exporter.BasicAuthHttpConnectionFactory"
+ };
+
+ private static final String[] NEW_PROMETHEUS_STACK = {
+ "io.micrometer.prometheusmetrics.PrometheusConfig",
+ "io.micrometer.prometheusmetrics.PrometheusMeterRegistry",
+ "io.prometheus.metrics.exporter.pushgateway.PushGateway"
+ };
+
public static boolean isSupportMetrics() {
return isClassPresent("io.micrometer.core.instrument.MeterRegistry");
}
public static boolean isSupportPrometheus() {
- return isClassPresent("io.micrometer.prometheus.PrometheusConfig")
- && isClassPresent("io.prometheus.client.exporter.BasicAuthHttpConnectionFactory")
- && isClassPresent("io.prometheus.client.exporter.HttpConnectionFactory")
- && isClassPresent("io.prometheus.client.exporter.PushGateway");
+ return isAllClassPresent(LEGACY_PROMETHEUS_STACK) || isAllClassPresent(NEW_PROMETHEUS_STACK);
+ }
+
+ public static boolean isSupportLegacyPrometheus() {
+ return isAllClassPresent(LEGACY_PROMETHEUS_STACK);
+ }
+
+ public static boolean isSupportNewPrometheus() {
+ return isAllClassPresent(NEW_PROMETHEUS_STACK);
}
private static boolean isClassPresent(String className) {
return ClassUtils.isPresent(className, MetricsSupportUtil.class.getClassLoader());
}
+
+ private static boolean isAllClassPresent(String... classNames) {
+ for (String className : classNames) {
+ if (!isClassPresent(className)) {
+ return false;
+ }
+ }
+ return true;
+ }
}
diff --git a/dubbo-metrics/dubbo-metrics-otlp/pom.xml b/dubbo-metrics/dubbo-metrics-otlp/pom.xml
index 16f7b54e62e..45b1ba467b5 100644
--- a/dubbo-metrics/dubbo-metrics-otlp/pom.xml
+++ b/dubbo-metrics/dubbo-metrics-otlp/pom.xml
@@ -59,11 +59,6 @@
io.micrometer
micrometer-registry-otlp
-
- org.apache.dubbo
- dubbo-metrics-default
- ${project.parent.version}
-
com.squareup.okhttp3
mockwebserver
diff --git a/dubbo-metrics/dubbo-metrics-prometheus/pom.xml b/dubbo-metrics/dubbo-metrics-prometheus/pom.xml
index 96e3e18b927..ba6e7854b50 100644
--- a/dubbo-metrics/dubbo-metrics-prometheus/pom.xml
+++ b/dubbo-metrics/dubbo-metrics-prometheus/pom.xml
@@ -41,10 +41,18 @@
dubbo-metrics-default
${project.parent.version}
+
+ io.micrometer
+ micrometer-registry-prometheus
+
io.micrometer
micrometer-registry-prometheus-simpleclient
+
+ io.prometheus
+ prometheus-metrics-exporter-pushgateway
+
io.prometheus
simpleclient_pushgateway
diff --git a/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporter.java b/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporter.java
index 96948e15317..8fef1cf5821 100644
--- a/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporter.java
+++ b/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporter.java
@@ -22,6 +22,7 @@
import org.apache.dubbo.common.utils.NamedThreadFactory;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.metrics.report.AbstractMetricsReporter;
+import org.apache.dubbo.metrics.utils.MetricsSupportUtil;
import org.apache.dubbo.rpc.model.ApplicationModel;
import java.io.IOException;
@@ -29,10 +30,7 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
-import io.micrometer.prometheus.PrometheusConfig;
-import io.micrometer.prometheus.PrometheusMeterRegistry;
-import io.prometheus.client.exporter.BasicAuthHttpConnectionFactory;
-import io.prometheus.client.exporter.PushGateway;
+import io.micrometer.core.instrument.MeterRegistry;
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_METRICS_COLLECTOR_EXCEPTION;
import static org.apache.dubbo.common.constants.MetricsConstants.PROMETHEUS_DEFAULT_JOB_NAME;
@@ -51,21 +49,23 @@ public class PrometheusMetricsReporter extends AbstractMetricsReporter {
private final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(PrometheusMetricsReporter.class);
- private final PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
+ private final PrometheusClientAdapter adapter;
private ScheduledExecutorService pushJobExecutor = null;
public PrometheusMetricsReporter(URL url, ApplicationModel applicationModel) {
super(url, applicationModel);
+ this.adapter = createAdapter();
}
@Override
public void doInit() {
- addMeterRegistry(prometheusRegistry);
+ addMeterRegistry(adapter.getMeterRegistry());
schedulePushJob();
}
+ @Override
public String getResponse() {
- return prometheusRegistry.scrape();
+ return adapter.scrape();
}
private void schedulePushJob() {
@@ -80,9 +80,10 @@ private void schedulePushJob() {
NamedThreadFactory threadFactory = new NamedThreadFactory("prometheus-push-job", true);
pushJobExecutor = Executors.newScheduledThreadPool(1, threadFactory);
- PushGateway pushGateway = new PushGateway(baseUrl);
+
+ Object pushGateway = adapter.createPushGateway(baseUrl);
if (!StringUtils.isBlank(username)) {
- pushGateway.setConnectionFactory(new BasicAuthHttpConnectionFactory(username, password));
+ adapter.setBasicAuth(pushGateway, username, password);
}
pushJobExecutor.scheduleWithFixedDelay(
@@ -90,20 +91,6 @@ private void schedulePushJob() {
}
}
- protected void push(PushGateway pushGateway, String job) {
- try {
- resetIfSamplesChanged();
- pushGateway.pushAdd(prometheusRegistry.getPrometheusRegistry(), job);
- } catch (IOException e) {
- logger.error(
- COMMON_METRICS_COLLECTOR_EXCEPTION,
- "",
- "",
- "Error occurred when pushing metrics to prometheus: ",
- e);
- }
- }
-
@Override
public void doDestroy() {
@@ -120,11 +107,155 @@ public ScheduledExecutorService getPushJobExecutor() {
return pushJobExecutor;
}
+ protected void push(Object pushGateway, String job) {
+ try {
+ resetIfSamplesChanged();
+ adapter.pushAdd(pushGateway, job);
+ } catch (IOException e) {
+ logger.error(
+ COMMON_METRICS_COLLECTOR_EXCEPTION,
+ "",
+ "",
+ "Error occurred when pushing metrics to prometheus: ",
+ e);
+ }
+ }
+
/**
* ut only
*/
@Deprecated
- public PrometheusMeterRegistry getPrometheusRegistry() {
- return prometheusRegistry;
+ public MeterRegistry getPrometheusRegistry() {
+ return adapter.getMeterRegistry();
+ }
+
+ private PrometheusClientAdapter createAdapter() {
+ PrometheusClientAdapter adapter = tryCreateNewPrometheusClientAdapter();
+ if (adapter != null) {
+ logger.info("Using new Prometheus client implementation.");
+ return adapter;
+ }
+ adapter = tryCreateLegacyPrometheusClientAdapter();
+ if (adapter != null) {
+ logger.info("Using legacy Prometheus client implementation.");
+ return adapter;
+ }
+ throw new IllegalStateException("No supported Prometheus client implementation found.");
+ }
+
+ private PrometheusClientAdapter tryCreateNewPrometheusClientAdapter() {
+ try {
+ if (NewPrometheusClientAdapter.isAvailable()) {
+ return new NewPrometheusClientAdapter();
+ }
+ } catch (NoClassDefFoundError ignored) {
+ // The new Prometheus stack is only partially present. Treat it as unavailable
+ // so that we can fall back to the legacy implementation or to NOP reporting.
+ }
+ return null;
+ }
+
+ private PrometheusClientAdapter tryCreateLegacyPrometheusClientAdapter() {
+ try {
+ if (LegacyPrometheusClientAdapter.isAvailable()) {
+ return new LegacyPrometheusClientAdapter();
+ }
+ } catch (NoClassDefFoundError ignored) {
+ // The legacy Prometheus stack is only partially present. Treat it as unavailable
+ // so that factory-level fallback can downgrade to a NOP reporter.
+ }
+ return null;
+ }
+
+ private interface PrometheusClientAdapter {
+
+ MeterRegistry getMeterRegistry();
+
+ String scrape();
+
+ Object createPushGateway(String baseUrl);
+
+ void setBasicAuth(Object pushGateway, String username, String password);
+
+ void pushAdd(Object pushGateway, String job) throws IOException;
+ }
+
+ private static class LegacyPrometheusClientAdapter implements PrometheusClientAdapter {
+
+ private final io.micrometer.prometheus.PrometheusMeterRegistry registry =
+ new io.micrometer.prometheus.PrometheusMeterRegistry(io.micrometer.prometheus.PrometheusConfig.DEFAULT);
+
+ static boolean isAvailable() {
+ return MetricsSupportUtil.isSupportLegacyPrometheus();
+ }
+
+ @Override
+ public MeterRegistry getMeterRegistry() {
+ return registry;
+ }
+
+ @Override
+ public String scrape() {
+ return registry.scrape();
+ }
+
+ @Override
+ public Object createPushGateway(String baseUrl) {
+ return new io.prometheus.client.exporter.PushGateway(baseUrl);
+ }
+
+ @Override
+ public void setBasicAuth(Object pushGateway, String username, String password) {
+ ((io.prometheus.client.exporter.PushGateway) pushGateway)
+ .setConnectionFactory(
+ new io.prometheus.client.exporter.BasicAuthHttpConnectionFactory(username, password));
+ }
+
+ @Override
+ public void pushAdd(Object pushGateway, String job) throws IOException {
+ ((io.prometheus.client.exporter.PushGateway) pushGateway).pushAdd(registry.getPrometheusRegistry(), job);
+ }
+ }
+
+ private static class NewPrometheusClientAdapter implements PrometheusClientAdapter {
+
+ private final io.micrometer.prometheusmetrics.PrometheusMeterRegistry registry =
+ new io.micrometer.prometheusmetrics.PrometheusMeterRegistry(
+ io.micrometer.prometheusmetrics.PrometheusConfig.DEFAULT);
+
+ static boolean isAvailable() {
+ return MetricsSupportUtil.isSupportNewPrometheus();
+ }
+
+ @Override
+ public MeterRegistry getMeterRegistry() {
+ return registry;
+ }
+
+ @Override
+ public String scrape() {
+ return registry.scrape();
+ }
+
+ @Override
+ public Object createPushGateway(String baseUrl) {
+ return io.prometheus.metrics.exporter.pushgateway.PushGateway.builder()
+ .registry(registry.getPrometheusRegistry())
+ .address(baseUrl);
+ }
+
+ @Override
+ public void setBasicAuth(Object pushGateway, String username, String password) {
+ ((io.prometheus.metrics.exporter.pushgateway.PushGateway.Builder) pushGateway)
+ .basicAuth(username, password);
+ }
+
+ @Override
+ public void pushAdd(Object pushGateway, String job) throws IOException {
+ ((io.prometheus.metrics.exporter.pushgateway.PushGateway.Builder) pushGateway)
+ .job(job)
+ .build()
+ .pushAdd();
+ }
}
}
diff --git a/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterFactory.java b/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterFactory.java
index fcad830e1e8..b18c2cbfe50 100644
--- a/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterFactory.java
+++ b/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterFactory.java
@@ -67,6 +67,9 @@ public MetricsReporter createMetricsReporter(URL url) {
logger.error(INTERNAL_ERROR, "", "", "Failed to instantiate PrometheusMetricsReporter", ncde);
throw ncde;
}
+ } catch (IllegalStateException ise) {
+ logger.error(INTERNAL_ERROR, "", "", "Failed to initialize PrometheusMetricsReporter", ise);
+ return new NopPrometheusMetricsReporter();
}
}
@@ -77,6 +80,13 @@ private static boolean dependenciesNotFound(String msg) {
if (msg.contains("io/micrometer/core/instrument/composite/CompositeMeterRegistry")) {
return true;
}
- return msg.contains("io.micrometer.core.instrument.composite.CompositeMeterRegistry");
+ if (msg.contains("io.micrometer.core.instrument.composite.CompositeMeterRegistry")) {
+ return true;
+ }
+ return msg.contains("io/micrometer/prometheus/") || msg.contains("io.micrometer.prometheus.")
+ || msg.contains("io/micrometer/prometheusmetrics/") || msg.contains("io.micrometer.prometheusmetrics.")
+ || msg.contains("io/prometheus/client/exporter/") || msg.contains("io.prometheus.client.exporter.")
+ || msg.contains("io/prometheus/metrics/exporter/pushgateway/")
+ || msg.contains("io.prometheus.metrics.exporter.pushgateway.");
}
}
diff --git a/dubbo-metrics/dubbo-metrics-prometheus/src/test/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterTest.java b/dubbo-metrics/dubbo-metrics-prometheus/src/test/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterTest.java
index e8198a3d05f..8aa4fbb915a 100644
--- a/dubbo-metrics/dubbo-metrics-prometheus/src/test/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterTest.java
+++ b/dubbo-metrics/dubbo-metrics-prometheus/src/test/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterTest.java
@@ -30,11 +30,14 @@
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import com.sun.net.httpserver.HttpServer;
-import io.micrometer.prometheus.PrometheusMeterRegistry;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
@@ -79,14 +82,9 @@ void testJvmMetrics() {
PrometheusMetricsReporter reporter = new PrometheusMetricsReporter(metricsConfig.toUrl(), applicationModel);
reporter.init();
- PrometheusMeterRegistry prometheusRegistry = reporter.getPrometheusRegistry();
- Double d1 = prometheusRegistry.getPrometheusRegistry().getSampleValue("none_exist_metric");
- Double d2 = prometheusRegistry
- .getPrometheusRegistry()
- .getSampleValue(
- "jvm_gc_memory_promoted_bytes_total", new String[] {"application_name"}, new String[] {name});
- Assertions.assertNull(d1);
- Assertions.assertNull(d2);
+ String response = reporter.getResponse();
+ Assertions.assertNotNull(response);
+ Assertions.assertFalse(response.isEmpty());
}
@Test
@@ -147,13 +145,57 @@ void testPushgateway() {
Assertions.assertTrue(executor.isTerminated() || executor.isShutdown());
}
+ @Test
+ void testPushgatewayUsesBasicAuthWithNewAdapter() throws Exception {
+ CountDownLatch requestReceived = new CountDownLatch(1);
+ AtomicReference requestMethod = new AtomicReference<>();
+ AtomicReference requestPath = new AtomicReference<>();
+ AtomicReference authorization = new AtomicReference<>();
+ AtomicReference requestBody = new AtomicReference<>();
+ String username = "demo";
+ String password = "secret";
+ String job = "auth-job";
+
+ prometheusExporterHttpServer = HttpServer.create(new InetSocketAddress(0), 0);
+ prometheusExporterHttpServer.createContext("/", httpExchange -> {
+ requestMethod.set(httpExchange.getRequestMethod());
+ requestPath.set(httpExchange.getRequestURI().getPath());
+ authorization.set(httpExchange.getRequestHeaders().getFirst("Authorization"));
+ try (InputStream inputStream = httpExchange.getRequestBody()) {
+ requestBody.set(new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))
+ .lines()
+ .collect(Collectors.joining("\n")));
+ }
+ httpExchange.sendResponseHeaders(202, -1);
+ httpExchange.close();
+ requestReceived.countDown();
+ });
+ prometheusExporterHttpServer.start();
+
+ PrometheusMetricsReporter reporter = createPushgatewayReporter(
+ "localhost:" + prometheusExporterHttpServer.getAddress().getPort(), job, username, password);
+ try {
+ Assertions.assertEquals(
+ "io.micrometer.prometheusmetrics.PrometheusMeterRegistry",
+ reporter.getPrometheusRegistry().getClass().getName());
+
+ Assertions.assertTrue(requestReceived.await(10, TimeUnit.SECONDS));
+ Assertions.assertEquals("POST", requestMethod.get());
+ Assertions.assertEquals("/metrics/job/" + job, requestPath.get());
+ Assertions.assertEquals(basicAuthHeader(username, password), authorization.get());
+ Assertions.assertTrue(requestBody.get().contains("jvm_memory_used_bytes"));
+ } finally {
+ reporter.destroy();
+ }
+ }
+
private void exportHttpServer(PrometheusMetricsReporter reporter, int port) {
try {
prometheusExporterHttpServer = HttpServer.create(new InetSocketAddress(port), 0);
prometheusExporterHttpServer.createContext("/metrics", httpExchange -> {
reporter.resetIfSamplesChanged();
- String response = reporter.getPrometheusRegistry().scrape();
+ String response = reporter.getResponse();
httpExchange.sendResponseHeaders(200, response.getBytes().length);
try (OutputStream os = httpExchange.getResponseBody()) {
os.write(response.getBytes());
@@ -166,4 +208,30 @@ private void exportHttpServer(PrometheusMetricsReporter reporter, int port) {
throw new RuntimeException(e);
}
}
+
+ private PrometheusMetricsReporter createPushgatewayReporter(
+ String baseUrl, String job, String username, String password) {
+ metricsConfig.setEnableJvm(true);
+ applicationModel.getApplicationConfigManager().setApplication(new ApplicationConfig("metrics-test"));
+
+ PrometheusConfig prometheusConfig = new PrometheusConfig();
+ PrometheusConfig.Pushgateway pushgateway = new PrometheusConfig.Pushgateway();
+ pushgateway.setEnabled(true);
+ pushgateway.setBaseUrl(baseUrl);
+ pushgateway.setJob(job);
+ pushgateway.setPushInterval(1);
+ pushgateway.setUsername(username);
+ pushgateway.setPassword(password);
+ prometheusConfig.setPushgateway(pushgateway);
+ metricsConfig.setPrometheus(prometheusConfig);
+
+ PrometheusMetricsReporter reporter = new PrometheusMetricsReporter(metricsConfig.toUrl(), applicationModel);
+ reporter.init();
+ return reporter;
+ }
+
+ private String basicAuthHeader(String username, String password) {
+ String credentials = username + ":" + password;
+ return "Basic " + Base64.getEncoder().encodeToString(credentials.getBytes(StandardCharsets.UTF_8));
+ }
}
diff --git a/dubbo-metrics/dubbo-metrics-prometheus/src/test/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsThreadPoolTest.java b/dubbo-metrics/dubbo-metrics-prometheus/src/test/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsThreadPoolTest.java
index 2727b349807..64fb0ad0656 100644
--- a/dubbo-metrics/dubbo-metrics-prometheus/src/test/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsThreadPoolTest.java
+++ b/dubbo-metrics/dubbo-metrics-prometheus/src/test/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsThreadPoolTest.java
@@ -124,7 +124,7 @@ private void exportHttpServer(PrometheusMetricsReporter reporter, int port) {
prometheusExporterHttpServer = HttpServer.create(new InetSocketAddress(port), 0);
prometheusExporterHttpServer.createContext("/metrics", httpExchange -> {
reporter.resetIfSamplesChanged();
- String response = reporter.getPrometheusRegistry().scrape();
+ String response = reporter.getResponse();
httpExchange.sendResponseHeaders(200, response.getBytes().length);
try (OutputStream os = httpExchange.getResponseBody()) {
os.write(response.getBytes());
diff --git a/dubbo-spring-boot-project/dubbo-spring-boot-autoconfigure/pom.xml b/dubbo-spring-boot-project/dubbo-spring-boot-autoconfigure/pom.xml
index 45e6e4a3b68..6b98ad05010 100644
--- a/dubbo-spring-boot-project/dubbo-spring-boot-autoconfigure/pom.xml
+++ b/dubbo-spring-boot-project/dubbo-spring-boot-autoconfigure/pom.xml
@@ -128,6 +128,17 @@
micrometer-core
provided
+
+ io.micrometer
+ micrometer-registry-prometheus
+ provided
+
+
+ io.micrometer
+ micrometer-core
+
+
+
io.micrometer
micrometer-registry-prometheus-simpleclient
@@ -151,6 +162,11 @@
simpleclient
provided
+
+ io.prometheus
+ prometheus-metrics-exporter-pushgateway
+ provided
+
io.prometheus
simpleclient_pushgateway
From 71296ad3a5438cb2d176d663ba2c9d50dd16547f Mon Sep 17 00:00:00 2001
From: SavitarC <71271200+savitarc@users.noreply.github.com>
Date: Sat, 14 Mar 2026 17:32:17 +0800
Subject: [PATCH 2/2] spotless apply
---
.../prometheus/PrometheusMetricsReporterFactory.java | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterFactory.java b/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterFactory.java
index b18c2cbfe50..94d66656169 100644
--- a/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterFactory.java
+++ b/dubbo-metrics/dubbo-metrics-prometheus/src/main/java/org/apache/dubbo/metrics/prometheus/PrometheusMetricsReporterFactory.java
@@ -83,9 +83,12 @@ private static boolean dependenciesNotFound(String msg) {
if (msg.contains("io.micrometer.core.instrument.composite.CompositeMeterRegistry")) {
return true;
}
- return msg.contains("io/micrometer/prometheus/") || msg.contains("io.micrometer.prometheus.")
- || msg.contains("io/micrometer/prometheusmetrics/") || msg.contains("io.micrometer.prometheusmetrics.")
- || msg.contains("io/prometheus/client/exporter/") || msg.contains("io.prometheus.client.exporter.")
+ return msg.contains("io/micrometer/prometheus/")
+ || msg.contains("io.micrometer.prometheus.")
+ || msg.contains("io/micrometer/prometheusmetrics/")
+ || msg.contains("io.micrometer.prometheusmetrics.")
+ || msg.contains("io/prometheus/client/exporter/")
+ || msg.contains("io.prometheus.client.exporter.")
|| msg.contains("io/prometheus/metrics/exporter/pushgateway/")
|| msg.contains("io.prometheus.metrics.exporter.pushgateway.");
}