Прометей + Микрометр: как записывать временные интервалы и показатели успеха / неудач - PullRequest
0 голосов
/ 28 февраля 2019

Я отправляю с внешнего клиента метрик-микросервису JSON со следующими данными:

{
    totalTimeOnTheNetwork: number;
    timeElasticsearch: number;
    isSuccessful: boolean;
}

Метрика-микросервис в настоящее время обрабатывает данные следующим образом:

@AllArgsConstructor
@Service
public class ClientMetricsService {
    @Autowired
    MeterRegistry registry; // abstract class, SimpleMeterRegistry gets injected
    public void metrics(final MetricsProperty metrics) {
        final long networkTime = metrics.getTotalTime() - metrics.getElasticTime();
        registry.timer(ELASTIC_TIME_LABEL).record(metrics.getElasticTime(), TimeUnit.MILLISECONDS);
        registry.timer(TOTAL_TIME_LABEL).record(metrics.getTotalTime(), TimeUnit.MILLISECONDS);
        registry.timer(NETWORK_TIME_LABEL).record(networkTime, TimeUnit.MILLISECONDS);
    }
}

Как видите, я делаю новую метрику для каждого временного интервала.Мне было интересно, могу ли я поместить все интервалы в одну метрику?Было бы замечательно, если бы мне не приходилось рассчитывать сетевое время на метрике-микросервисе, а скорее в Grafana.

Кроме того, могу ли я поместить тег успеха / неудачи в Registry.timer?Я предполагаю, что мне нужно использовать timer.builder при каждом запросе, например, так:

Timer timer = Timer
    .builder("my.timer")
    .description("a description of what this timer does") // optional
    .tags("region", "test") // optional
    .register(registry);

Это типичный способ сделать это (например, создать новый таймер для каждого HTTP-запроса и связать его с реестром) или таймер должен быть получен из MeterRegistry, как в моей текущей версии?

Или вы бы использовали другую метрику для регистрации успеха / неудачи?В будущем, вместо логического значения, метрика может измениться, например, на http-код ошибки, поэтому я не уверен, как реализовать его в понятном виде

1 Ответ

0 голосов
/ 06 марта 2019
Timer timer = Timer
    .builder("your-timer-name-here")
    .tags("ResponseStatus", isSuccessful.toString, "ResponseCode", http-error-code.toString)
    .register(registry);

timer.record(metrics.getTotalTime);

Должен быть рабочий код, который отвечает на ваш вопрос, но у меня есть ощущение, что есть недоразумение.Почему вы хотите все в одной метрике?

В любом случае вы, вероятно, сможете разобраться с тегами.Я не знаю возможностей на стороне Grafana, но это может быть так же просто, как выбросить информацию .getElasticTime в другой тег и отправить ее через.

...