球衣应用中的 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 是不是应用于球衣客户端