java - 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 握手时间很长时设置了警报,这非常有用。
不幸的是,增长太残酷了。我想问一下:
如何禁用这四个?(如果可能,不要无意中禁用其他一些有用的指标)
对于未来,如何使它们保持启用状态,但随着时间的推移,新指标不会出现这种无法控制的增长。
谢谢
解决方案
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());
}
上面的两个解决方案是您正在观察的问题的解决方法,您最终可能想了解为什么这些特定指标的基数会随着时间的推移而增加。
推荐阅读
- java - 将 Spring Boot 1.5.8 迁移到 2.1.5 -- Gradle 问题
- javascript - amCharts:禁用 Legend 中某些项目的切换
- javascript - 您可以在选项卡更改时激活单独的事件吗?
- ruby - 从 file.write 修复文本的宽度
- python - Python:如何将函数拟合到点?
- pandas - 如何使用 Pandas 分组和求和
- matlab - 寻求有关尝试在 MATLAB 中为流行病模拟器读取 2D 元胞自动机的摩尔邻域的建议
- docker - Springboot 微服务和 Mongo 容器
- html - 浮动元素之间的奇怪间距
- javascript - 如何使用 ejs 将一些 JS 代码包含到 Bootstrap 模式中?