如何解决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 端点以进行轮询。 我们有许多有趣的指标,希望保留它们。
真的,我们只是计算了指标的总数,在第一轮投票中,我们有大约 300 个,一分钟后,在第二轮投票中,我们有大约 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.如何控制/限制指标上的标签数量
您也可以使用 MeterFilter
来实现此目的。您可以使用 MeterFilter
为特定指标的特定标签设置基数限制,从而限制这些指标的增长并限制它们对您的应用程序的影响
@Bean
public MeterFilter myMeterFilter() {
return MeterFilter.maximumAllowableTags("data_received_bytes","tagWithHighCardinality",100,MeterFilter.deny());
}
上述两个解决方案是您所观察到的问题的解决方法,您最终可能想了解为什么这些特定指标的基数会随着时间的推移而增加。
,我建议您使用 HttpServer
公开的 API,即
HttpServer.create().metrics(true,Function)
这将启用与 Micrometer
的默认集成
或
metrics(boolean,Supplier,CustomHttpServerMetricsRecorder::new,Function)
这会向您展示 考虑检查 reference guide 和那里的建议。HttpServer
指标。请注意,在此 API 中,CustomHttpServerMetricsRecorder
实现了 HttpServerMetricsRecorder
,而不是您的示例 MicrometerChannelMetricsRecorder
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。