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());
}
上面的两个解决方案是针对您所观察到的问题的解决方法,您最终可能想了解为什么这些特定指标的基数会随着时间的推移而增加。
我建议您使用 HttpServer
公开的 API 即
HttpServer.create().metrics(true, Function)
这将启用与 Micrometer
的默认集成
或
metrics(boolean, Supplier, Function)
HttpServer.create().metrics(true, CustomHttpServerMetricsRecorder::new, Function)
这会向您展示 HttpServer
指标。请注意,在此 API 中,CustomHttpServerMetricsRecorder
实现 HttpServerMetricsRecorder
而不是您的示例 MicrometerChannelMetricsRecorder
.
考虑查看 reference guide 和那里的建议。
关于 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());
}
上面的两个解决方案是针对您所观察到的问题的解决方法,您最终可能想了解为什么这些特定指标的基数会随着时间的推移而增加。
我建议您使用 HttpServer
公开的 API 即
HttpServer.create().metrics(true, Function)
这将启用与 Micrometer
或
metrics(boolean, Supplier, Function)
HttpServer.create().metrics(true, CustomHttpServerMetricsRecorder::new, Function)
这会向您展示 HttpServer
指标。请注意,在此 API 中,CustomHttpServerMetricsRecorder
实现 HttpServerMetricsRecorder
而不是您的示例 MicrometerChannelMetricsRecorder
.
考虑查看 reference guide 和那里的建议。