如何将Prometheus指标重定向到默认的Spring Boot服务器

发布于 2025-02-07 09:53:18 字数 3699 浏览 2 评论 0原文

我正在尝试从我的Spring Boot应用程序中揭示自定义量规指标。我正在将千分尺与Prometheus注册表一起使用。我已经设置了PrometheusRegistry并按照 - 千分尺样本 - github ,但它创建了另一台HTTP服务器,用于公开Prometheus指标。我需要将所有指标重定向或将所有指标置于Spring Boot的默认上下文路径 - /coletuator/Prometheus,而不是新端口上的新上下文路径。到目前为止,我已经实施了以下代码 -

PrometheusRegistry.java-

package com.xyz.abc.prometheus;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.time.Duration;

import com.sun.net.httpserver.HttpServer;

import io.micrometer.core.lang.Nullable;
import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry;

public class PrometheusRegistry {

    public static PrometheusMeterRegistry prometheus() {
        PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(new PrometheusConfig() {
            @Override
            public Duration step() {
                return Duration.ofSeconds(10);
            }

            @Override
            @Nullable
            public String get(String k) {
                return null;
            }
        });

        try {
            HttpServer server = HttpServer.create(new InetSocketAddress(8081), 0);
            server.createContext("/sample-data/prometheus", httpExchange -> {
                String response = prometheusRegistry.scrape();
                httpExchange.sendResponseHeaders(200, response.length());
                OutputStream os = httpExchange.getResponseBody();
                os.write(response.getBytes());
                os.close();
            });

            new Thread(server::start).run();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return prometheusRegistry;
    }
    
}

micrometerConfig.java-

package com.xyz.abc.prometheus;

import io.micrometer.core.instrument.MeterRegistry;


public class MicrometerConfig {

    public static MeterRegistry carMonitoringSystem() {
        // Pick a monitoring system here to use in your samples.
        return PrometheusRegistry.prometheus();
    }
}

代码片段,我正在创建自定义规程。截至目前,这是一个简单的REST API,可以测试 - (请阅读两者之间的注释)

@SuppressWarnings({ "unchecked", "rawtypes" })
@RequestMapping(value = "/sampleApi", method= RequestMethod.GET)
@ResponseBody
//This Timed annotation is working fine and this metrics comes in /actuator/prometheus by default
@Timed(value = "car.healthcheck", description = "Time taken to return healthcheck")
public ResponseEntity healthCheck(){
    MeterRegistry registry = MicrometerConfig.carMonitoringSystem();
    AtomicLong n = new AtomicLong();
    //Starting from here none of the Gauge metrics shows up in /actuator/prometheus path instead it goes to /sample-data/prometheus on port 8081 as configured.
    registry.gauge("car.gauge.one", Tags.of("k", "v"), n);
    registry.gauge("car.gauge.two", Tags.of("k", "v1"), n, n2 -> n2.get() - 1);
    registry.gauge("car.help.gauge", 89);
    
    //This thing never works! This gauge metrics never shows up in any URI configured
    Gauge.builder("car.gauge.test", cpu)
         .description("car.device.cpu")
         .tags("customer", "demo")
         .register(registry);
    return new ResponseEntity("Car is working fine.", HttpStatus.OK);
}

我需要所有的指标才能在内部显示 - /cartuator/cartuator/prometheus而不是创建新的HTTP服务器。我知道我正在明确创建一个新的HTTP服务器,以便在那里弹出指标。请让我知道如何避免创建新的HTTP服务器,并将所有Prometheus指标重定向到默认路径 - /coartuator/Prometheus。另外,如果我使用gauge.builder来定义自定义量规指标,则永远无法使用。请解释一下我如何也可以使这项工作。让我知道我在哪里做错了。 谢谢。

I am trying to expose a custom Gauge metric from my Spring Boot Application. I am using Micrometer with the Prometheus registry to do so. I have set up the PrometheusRegistry and configs as per - Micrometer Samples - Github but it creates one more HTTP server for exposing the Prometheus metrics. I need to redirect or expose all the metrics to the Spring boot's default context path - /actuator/prometheus instead of a new context path on a new port. I have implemented the following code so far -

PrometheusRegistry.java -

package com.xyz.abc.prometheus;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.time.Duration;

import com.sun.net.httpserver.HttpServer;

import io.micrometer.core.lang.Nullable;
import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry;

public class PrometheusRegistry {

    public static PrometheusMeterRegistry prometheus() {
        PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(new PrometheusConfig() {
            @Override
            public Duration step() {
                return Duration.ofSeconds(10);
            }

            @Override
            @Nullable
            public String get(String k) {
                return null;
            }
        });

        try {
            HttpServer server = HttpServer.create(new InetSocketAddress(8081), 0);
            server.createContext("/sample-data/prometheus", httpExchange -> {
                String response = prometheusRegistry.scrape();
                httpExchange.sendResponseHeaders(200, response.length());
                OutputStream os = httpExchange.getResponseBody();
                os.write(response.getBytes());
                os.close();
            });

            new Thread(server::start).run();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return prometheusRegistry;
    }
    
}

MicrometerConfig.java -

package com.xyz.abc.prometheus;

import io.micrometer.core.instrument.MeterRegistry;


public class MicrometerConfig {

    public static MeterRegistry carMonitoringSystem() {
        // Pick a monitoring system here to use in your samples.
        return PrometheusRegistry.prometheus();
    }
}

Code snippet where I am creating a custom Gauge metric. As of now, it's a simple REST API to test - (Please read the comments in between)

@SuppressWarnings({ "unchecked", "rawtypes" })
@RequestMapping(value = "/sampleApi", method= RequestMethod.GET)
@ResponseBody
//This Timed annotation is working fine and this metrics comes in /actuator/prometheus by default
@Timed(value = "car.healthcheck", description = "Time taken to return healthcheck")
public ResponseEntity healthCheck(){
    MeterRegistry registry = MicrometerConfig.carMonitoringSystem();
    AtomicLong n = new AtomicLong();
    //Starting from here none of the Gauge metrics shows up in /actuator/prometheus path instead it goes to /sample-data/prometheus on port 8081 as configured.
    registry.gauge("car.gauge.one", Tags.of("k", "v"), n);
    registry.gauge("car.gauge.two", Tags.of("k", "v1"), n, n2 -> n2.get() - 1);
    registry.gauge("car.help.gauge", 89);
    
    //This thing never works! This gauge metrics never shows up in any URI configured
    Gauge.builder("car.gauge.test", cpu)
         .description("car.device.cpu")
         .tags("customer", "demo")
         .register(registry);
    return new ResponseEntity("Car is working fine.", HttpStatus.OK);
}

I need all the metrics to show up inside - /actuator/prometheus instead of a new HTTP Server getting created. I know that I am explicitly creating a new HTTP Server so metrics are popping up there. Please let me know how to avoid creating a new HTTP Server and redirect all the prometheus metrics to the default path - /actuator/prometheus. Also if I use Gauge.builder to define a custom gauge metrics, it never works. Please explain how I can make that work also. Let me know where I am doing wrong.
Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哑剧 2025-02-14 09:53:18

每当您调用MicrometerConfig.carmonitoringsystem();都在创建new Prometheus注册表(并尝试启动新服务器),

您都需要注入meterregistry meterregistry < /代码>在创建量规的类中,并使用注射MeterRegistry这样。

Every time you call MicrometerConfig.carMonitoringSystem(); it is creating a new prometheus registry (and trying to start a new server)

You need to inject the MeterRegistry in your class that is creating the gauge and use the injected MeterRegistry that way.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文