当前位置: 首页 > 知识库问答 >
问题:

如何将Prometheus Metrics重定向到默认的spring boot服务器

东门修文
2023-03-14

我正在尝试从我的Spring启动应用程序中公开自定义仪表指标。我正在使用千分尺和普罗米修斯注册表来做到这一点。我已经设置了普罗米修斯注册和配置根据 - 千分尺样本 - Github,但它创建了一个HTTP服务器来公开普罗米修斯指标。我需要将所有指标重定向或公开到Spring boot的默认上下文路径 - /actuator/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);
}

我需要所有的指标都显示在-< code >/actuator/Prometheus 中,而不是创建一个新的HTTP服务器。我知道我正在显式地创建一个新的HTTP服务器,所以这里会出现一些指标。请告诉我如何避免创建一个新的HTTP服务器,并将所有prometheus指标重定向到默认路径-< code >/actuator/Prometheus 。此外,如果我使用< code>Gauge.builder来定义一个自定义的计量器指标,它永远不会工作。请解释我如何才能使这一工作。让我知道我哪里做错了。谢谢你。

共有1个答案

南门烈
2023-03-14

每次调用<code>microConfig时。carMonitoringSystem()它正在创建一个新的prometheus注册表(并尝试启动一个新服务器

您需要在创建仪表的类中注入计量注册,并以这种方式使用注入的计量注册

 类似资料:
  • 在我的apache服务器上,我希望能够将所有传入的http请求重定向到等效的https请求。问题是,我希望能够在不指定的情况下为我的默认虚拟主机执行此操作,并使用请求url中出现的任何服务器名称进行重定向。我希望得到这样的东西: 这是可以使用还是我必须求助于?

  • 问题内容: 我正在尝试将服务的输出重定向到文件,但它似乎不起作用: 请更正我的方法。 问题答案: 我认为有一种解决问题的更优雅的方法:将stdout / stderr发送给具有标识符的syslog,并指示syslog管理器按程序名称拆分其输出。 在您的systemd服务单元文件中使用以下属性: 然后,假设您的发行版正在使用rsyslog管理syslog,请在其中创建一个包含以下内容的文件: 现在,

  • 我试图将服务的输出重定向到一个文件,但似乎不起作用: 请纠正我的做法。

  • 我有多个Java Spring Boot服务(大约20个),使用Amazon SDK for S3、SQS、DynamoDB等。 目前,要使用Amazon Web服务,我只需要指定我的AWS密钥&秘密。 然而,我想要设置离线开发环境,所以我开始对接我的服务,并建立一个单一的多Docker容器,我的所有服务都对接了,应该使用localstack而不是远程AWS服务,以允许完成离线开发。 Amazon

  • 环境Centos与apache 正在尝试设置从http到https的自动重定向 我试图添加以下内容到我的httpd.conf但它不工作 有什么想法吗?

  • 我是微服务和Spring Boot的新手。我有几个Spring Cloud微服务,它有一个运行在8080端口上的Zuul网关。 提前道谢!