千分尺和普罗米修斯的DistributionSummary的量表式计算

时间:2019-01-14 08:23:53

标签: spring-boot grafana prometheus micrometer

我想获取一些不经常更改的域数据的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来获取值。但是也许这些工具不是为此用例制作的,我应该再使用其他工具。你能推荐某事吗?

1 个答案:

答案 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);