калибровочный расчет DistributionSummary с микрометром и прометеем - PullRequest
0 голосов
/ 14 января 2019

Я хочу получить 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...