Я хочу получить DistributionSummary для некоторых данных домена, которые меняются не очень часто. Так что речь не идет о мониторинге запросов или чего-то подобного.
Давайте возьмем количество мест в офисе в качестве примера. Ценность для каждого офиса может время от времени меняться, и могут быть новые офисы, а также офисы удаляются.
Так что теперь мне нужен текущий DistributionSummary по всем офисам, который должен рассчитываться каждый раз, когда я думаю (аналогично датчику).
У меня есть приложение Spring Boot 2 с микрометром, я собираю метрики с помощью prometheus и отображаю их в графане.
Что я пробовал до сих пор:
Когда я регистрирую 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
по-прежнему возвращает значения для старых (удаленных) метрик, поэтому все существует несколько раз.
Для sth как 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, который принимает лямбда или что-то подобное для получения значений. Но, возможно, эти инструменты не предназначены для этого варианта использования, и я должен использовать что-то еще. Можете ли вы порекомендовать STH?