在spring boot的管理端口中使用prometheus metrics servlet

Posted

技术标签:

【中文标题】在spring boot的管理端口中使用prometheus metrics servlet【英文标题】:Use prometheus metrics servlet in management port of springboot 【发布时间】:2016-04-22 14:16:47 【问题描述】:

我正在使用 prometheus 度量 servlet 来公开我的度量,并提供 java 客户端 api prometheus。

我注册 servlet 的方式与注册任何 serverlt 的方式相同,见下文:

 @Bean
public ServletRegistrationBean registerPrometheusExporterServlet(CollectorRegistry metricRegistry) 
    return new ServletRegistrationBean(new MetricsServlet(metricRegistry), "/metrics");

但是,我想将此 servlet 添加到管理端口,或者如果 prometheus 版本可能会替换 springboot 的默认 /metrics 服务。 可以做这样的事情吗?以及如何?

谢谢, 丹妮拉

【问题讨论】:

【参考方案1】:

我不知道你是否能够将 Spring Boot 与 Prometheus 集成,但现在 Prometheus 官方client-java 项目中有一个专用的连接器。

项目的Github页面如下:simpleclient_spring_boot

你可以使用它为你添加以下依赖pom.xml

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_spring_boot</artifactId>
    <version>0.0.17</version>
</dependency>

要使用它,请将 Spring Boot 配置添加到您的项目中,如下所示。

@Configuration
public class MetricsConfiguration 

    @Bean
    public ServletRegistrationBean servletRegistrationBean() 
        DefaultExports.initialize();
        return new ServletRegistrationBean(new MetricsServlet(), "/prometheus");
    

    @Bean
    public SpringBootMetricsCollector springBootMetricsCollector(Collection<PublicMetrics> publicMetrics) 
        SpringBootMetricsCollector springBootMetricsCollector = new SpringBootMetricsCollector(
            publicMetrics);
        springBootMetricsCollector.register();
        return springBootMetricsCollector;
    

现在,Spring Boot Actuator 公开的指标将作为 Prometheus Counters 和 Gauges 提供。

信息发布到您的应用程序的路径/prometheus。然后你必须指示 Prometheus 使用这些信息,配置如下。

# my global config
global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.
  evaluation_interval: 15s # By default, scrape targets every 15 seconds.

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
- job_name: 'your-application-name'

  scrape_interval: 5s

  metrics_path: '/prometheus'

  static_configs:
    - targets: ['localhost:8080']

如果您将浏览器指向/metrics,您将继续看到 Spring Boot 格式的信息。但是,将浏览器指向http://localhost:9090/graph,您将直接在 Prometheus 查询浏览器中查询此类信息。

试试看this Github pull-request。

更新simpleclient_spring_boot 的下一个版本 0.0.18 中,将注解 @EnablePrometheusEndpoint 添加到 Spring Boot 的配置类中就足以自动配置 Prometheus 适配器(看看这个test)!

希望对你有帮助。

【讨论】:

我做了这个并且它有效,但是在一个工作区中我得到了这个构造函数 ServletRegistrationBean(MetricsServlet, String) 是未定义的,我不知道如何解决 ti。这是什么原因造成的? 忘记配置类。在您的应用程序中使用注释 @EnablePrometheusEndpoint 直接从 Boot 启用 Prometheus :) 感谢您的快速响应。我这样做了,现在在哪条路线上查看指标? 通过配置,我可以设置指标 servlet 和 url (/prometheus),我可以在那里看到指标。使用此注释可以在哪里查看指标。我正在访问 /prometheus,我得到:未找到 对不起,已经过去了很多时间。你在/metrics 下看到了什么吗?

以上是关于在spring boot的管理端口中使用prometheus metrics servlet的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中配置 Tomcat 关闭端口?

Spring Boot Management 安全性与端口集的工作方式不同

如何在端口 443 上运行 Spring Boot

Spring Boot Test 无法使用 LocalServerPort 注释自动连接端口

指定端口时,Spring Boot Actuator 端点的单元测试不起作用

如何在 Spring Boot 测试中获取正在运行的服务器端口?