我想获取一些不经常更改的域数据的DistributionSummary。因此,这与监视请求或类似操作无关。
让我们以办公室的座位数为例。每个办公室的价值可能会不时发生变化,可能会有新的办公室,也可能会删除办公室。
所以现在我需要所有办公室的当前DistributionSummary,需要在每次考虑时进行计算(类似于Gauge)。
我有一个带有测微计的Spring Boot 2应用程序,并使用Prometheus收集了指标并以grafana显示。
到目前为止我尝试过的事情:
当我注册DistributionSummary时,我可以在启动过程中记录一次所有值...这为我提供了分布,但是 max 之类的计算值会随着时间的流逝而丢失,因此我无法更新DistributionSummary(记录新的办公室是可以的,但不能更改现有的办公室。
// during startup
seatsInOffice = DistributionSummary.builder("office.seats")
.publishPercentileHistogram()
.sla(1, 5, 20, 50)
.register(meterRegistry);
officeService.getAllOffices().forEach(p -> seatsInOffice.record(o.getNumberOfSeats()));
我还尝试使用@Scheduled
任务来删除并完全重建DistributionSummary。这似乎可行,但以某种方式感到不对。这是推荐的方法吗?可能还需要一些同步,才能不收集删除和重新计算分发之间的指标。
@Scheduled(fixedRate = 5 * 60 * 1000)
public void recalculateMetrics() {
if (seatsInOffice != null) {
meterRegistry.remove(seatsInOffice);
}
seatsInOffice = DistributionSummary.builder("office.seats")
.publishPercentileHistogram()
.sla(1, 5, 20, 50)
.register(meterRegistry);
officeService.getAllOffices().forEach(p -> seatsInOffice.record(o.getNumberOfSeats()));
}
我刚刚通过这种方法认识到的另一个问题:/actuator/prometheus
端点仍然返回旧(已删除)指标的值,因此一切都存在很多时间。
对于诸如sla边界之类的东西,我还可以使用一些量规来提供值(通过自己计算),但这不会给我分位数。是否可以创建一个新的DistributionSummary而不进行注册,而仅提供以某种方式收集的值?
meterRegistry.gauge("office.seats", Tags.of("le", "1"), officeService,
x -> x.getAllOfficesWithLessThanXSeats(1).size());
meterRegistry.gauge("office.seats", Tags.of("le", "5"), officeService,
x -> x.getAllOfficesWithLessThanXSeats(5).size());
meterRegistry.gauge("office.seats", Tags.of("le", "20"), officeService,
x -> x.getAllOfficesWithLessThanXSeats(20).size());
meterRegistry.gauge("office.seats", Tags.of("le", "50"), officeService,
x -> x.getAllOfficesWithLessThanXSeats(50).size());
我想要一个DistributionSummary,它需要一个lambda或sth来获取值。但是也许这些工具不是为此用例制作的,我应该再使用其他工具。你能推荐某事吗?
答案 0 :(得分:0)
DistributionSummary 有一个配置 distributionStatisticExpiry 可以控制旋转数据。这是一种解决方法
但是 PrometheusDistributionSummary 不会使用这个字段
case Prometheus:
histogram = new TimeWindowFixedBoundaryHistogram(clock, DistributionStatisticConfig.builder()
.expiry(Duration.ofDays(1825)) // effectively never roll over
.bufferLength(1)
.build()
.merge(distributionStatisticConfig), true);