首页 > 解决方案 > Spring Webflux 2.4.4 - 指标随时间无限增长

问题描述

关于 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 握手时间很长时设置了警报,这非常有用。

不幸的是,增长太残酷了。我想问一下:

谢谢

标签: javaspring-bootspring-webfluxreactor-netty

解决方案


1.如何禁用特定指标

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

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

2.如何控制/限制指标上的标签数量

您也可以使用 aMeterFilter来实现此目的。您可以使用 aMeterFilter为特定指标的特定标签设置基数限制,从而限制这些指标的增长并限制它们对您的应用程序可能产生的影响

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

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

MeterFilter 文档


推荐阅读