Spring Webflux 2.4.4 - 指标随时间无限增长

Spring Webflux 2.4.4 - Metrics growing infinitely over time

关于 SpringBoot Webflux 项目的小问题,以及一些随时间增长过快的指标。

我们的 Web 应用程序使用 Netty,我们声明一个 bean 如下:

 @Bean
    public NettyServerCustomizer nettyServerCustomizer() {
        return httpServer -> httpServer.metrics(true, () -> new MicrometerChannelMetricsRecorder("name", "name"));
    }

我们的 Web 应用程序公开了一个 /metrics 端点以进行轮询。 我们有很多有趣的指标,希望保留它们。

真的,我们只是计算了指标的总数,在投票 1 中,我们有大约 300 个,一分钟后,在投票 2 中,我们有大约 1300 个,然后是大约 2300 个,等等,你可以想象,之后一天的应用程序,这个端点响应和网络字节发送到屋顶。

我注意到有四个特定指标在无限期增长,而且增长速度非常快。

 tls_handshake_time_seconds_count
 data_received_bytes_count
 data_received_bytes_max
 data_received_bytes_sum

每次我们轮询 /metrics 时,这四个指标每分钟都会增加 1000 个条目。 这令人担忧,因为轮询响应时间不断增加,发送的字节数也在不断增加。

请问如何禁用这四个特定指标?我想保持其他一切不变。

老实说,我发现这些指标非常有用,因为我们在 SSL 握手时间较长时设置了警报,这非常有用。

可惜,成长太残酷了。我想问:

谢谢

1.如何禁用特定指标

您可以使用 MeterFilter 按名称禁用特定指标。您需要将 MeterFilter 注册为 spring 托管 bean

    @Bean
    public MeterFilter myMeterFilter() {
        return MeterFilter.deny(id -> id.getName().startsWith("data_received_bytes") ||
                id.getName().startsWith("tls_handshake_time")
        );
    }

2。如何 control/limit 指标上的标签数

您也可以使用 MeterFilter 来实现这一点。您可以使用 MeterFilter 为特定指标的特定标签设置基数限制,从而允许您限制这些指标的增长并限制它们对您的应用程序的影响

    @Bean
    public MeterFilter myMeterFilter() {
        return MeterFilter.maximumAllowableTags("data_received_bytes", "tagWithHighCardinality", 100,
                MeterFilter.deny());
    }

上面的两个解决方案是针对您所观察到的问题的解决方法,您最终可能想了解为什么这些特定指标的基数会随着时间的推移而增加。

MeterFilter Docs

我建议您使用 HttpServer 公开的 API 即

metrics(boolean, Function)

HttpServer.create().metrics(true, Function)

这将启用与 Micrometer

的默认集成

metrics(boolean, Supplier, Function)

HttpServer.create().metrics(true, CustomHttpServerMetricsRecorder::new, Function)

这会向您展示 HttpServer 指标。请注意,在此 API 中,CustomHttpServerMetricsRecorder 实现 HttpServerMetricsRecorder 而不是您的示例 MicrometerChannelMetricsRecorder.

考虑查看 reference guide 和那里的建议。