球衣应用中的 Micrometer Prometheus 指标(非弹簧)

Posted

技术标签:

【中文标题】球衣应用中的 Micrometer Prometheus 指标(非弹簧)【英文标题】:Micrometer Prometheus metrics in jersey application (Non spring) 【发布时间】:2021-06-02 11:28:06 【问题描述】:

我有一个带有 Jersey REST 端点的 Web 应用程序(战争)。我正在与 prometheus / micrometer 集成以生成指标。我在这里公开了“/metrics”端点

@Path("/metrics")
public class Metrics 
    private static final PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);

    static 
        new JvmGcMetrics().bindTo(prometheusRegistry);
        new JvmMemoryMetrics().bindTo(prometheusRegistry);
        new JvmCompilationMetrics().bindTo(prometheusRegistry);
        new JvmThreadMetrics().bindTo(prometheusRegistry);
    
    @GET
    public String getMetrics() 
        return prometheusRegistry.scrape();
    

我被困在如何生成 http 请求指标上。我找不到任何与获取这些指标相关的代码。有人可以帮我吗?

【问题讨论】:

为了清楚起见,您的 JVM 指标正在正确地发布到 Prometheus。您希望记录 HTTP 请求并将其作为指标公开? 是的,没错。没有直接的方法可以实现。刚刚遇到github.com/micrometer-metrics/micrometer/tree/master/…。你试过这个吗? 【参考方案1】:

除了checketts 提出的建议之外,您还可以使用在1.0.0 发布之前以micrometer-jersey2 库的形式存在的Micrometer 的Jersey 服务器工具。可以找到源here。

您的入口点是MetricsApplicationEventListener,可以使用球衣ResourceConfig 注册。例如,您可以查看test class,了解如何做到这一点。

您还可以看看这是如何在 Spring Boot here 中集成/自动配置的。

最后一点:Spring Boot 指标名称是 http.server.requests(以将它们与 HTTP 客户端请求指标区分开来),如果您有一天将迁移到 Spring Boot 或您的平台已经在运行 Spring Boot 应用程序,那么您的非 Spring Boot HTTP请求指标将很好地匹配,无需多言。

【讨论】:

我更新了我的示例以使用 http.server.requests 命名,以防其他人从 Stack Overflow 复制代码并且从不更改它... @mweiranch,有没有办法跳过一些 URI 被测量?例如,健康检查和指标端点。 上述答案也是正确的。如果有人采用上述方法,请确保您使用 ExceptionMapper 将异常转换为适当的 HTTP 响应代码。 @DBS 只需用使用的MeterRegistry 注册一个适当的千分尺MeterFilter。 (registry.config().meterFilter(...))【参考方案2】:

您需要包含一个Filter 来记录每个通过的请求。请参阅 https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilter.java 了解 Spring 是如何做到的。

如果可能,我建议不要使用static 注册表,而是使用依赖注入。

这是一个小例子,说明您可以在过滤器的 doFilter 方法中执行的操作

        long start = System.nanoTime()
        try 
            filterChain.doFilter(request, response);
            long durationNanos = System.nanoTime() - start;
            prometheusRegistry.timer("http.server.requests", "status", response.getStatus().toString()).record(durationNanos, TimeUnit.NANOSECONDS)
         catch (Exception ex) 
            //Equivalent exception timer recording
            throw ex;
        

【讨论】:

如果你碰巧使用 Tomcat 或 Jetty,你也可以使用他们的 MeterBinders 添加一些额外的仪表(例如:TomcatMetrics)。

以上是关于球衣应用中的 Micrometer Prometheus 指标(非弹簧)的主要内容,如果未能解决你的问题,请参考以下文章

给你的SpringBoot做埋点监控--JVM应用度量框架Micrometer

如何验证 PoolingHttpClientConnectionManager 是不是应用于球衣客户端

Micrometer 快速入门

单元测试中的“请求范围已关闭”球衣错误

使用 Micrometer 发布 Spring Batch 指标

为 AWS cloudwatch 的 Micrometer 配置 SpringBoot 2 应用程序