Пружинный привод с Prometheus, кастомный MetricWriter никогда не вызывается

Я хотел бы добавить метрическое измерение для своего приложения Spring boot. Показатели будут отображаться через графану.

Я нашел интересную статью для интеграции пружинного привода с Prometheus.

Согласно образцу, я должен реализовать свой собственный MetricWriter для обновления соответствующего Counter или Gauge в Prometheus CollectorRegistry Это выглядит так:

class PrometheusMetricWriter implements MetricWriter {

    CollectorRegistry registry

    private final ConcurrentMap<String, Gauge> counters = new ConcurrentHashMap<>()
    private final ConcurrentHashMap<String, Gauge> gauges = new ConcurrentHashMap<>()

    @Autowired
    PrometheusMetricWriter(CollectorRegistry registry) {
        this.registry = registry
    }

    @Override
    void increment(Delta<?> delta) {
        counter(delta.name).inc(delta.value.doubleValue())
    }

    @Override
    void reset(String metricName) {
        counter(metricName).clear()
    }

    @Override
    void set(Metric<?> value) {
        println "inside metric writer"
        gauge(value.name).set(value.value.doubleValue())
    }

    private Counter counter(String name) {
        def key = sanitizeName(name)
        counters.computeIfAbsent key, { k ->
            Counter.build().name(k).help(k).register(registry)
        }
    }

    private Gauge gauge(String name) {
        def key = sanitizeName(name)
        gauges.computeIfAbsent key, { k ->
            Gauge.build().name(k).help(k).register(registry)
        }
    }

    private String sanitizeName(String name) {
        return name.replaceAll("[^a-zA-Z0-9_]", "_")
    }
}

Остальные 3 обязательных элемента: PrometheusEndpoint, PrometheusMvcEndpoint, PrometheusEndpointContextConfiguration.

В конце концов, собранные метрики можно просмотреть, позвонив по URL-адресу «http://localhost:8080/prometheus».

И результат должен выглядеть так:

# HELP gauge_com_egalacoral_spark_stage_vto gauge_com_egalacoral_spark_stage_vto
# TYPE gauge_com_egalacoral_spark_stage_vto gauge
gauge_com_egalacoral_spark_stage_vto 4.0
# HELP gauge_com_egalacoral_spark_test_vfl gauge_com_egalacoral_spark_test_vfl
# TYPE gauge_com_egalacoral_spark_test_vfl gauge
gauge_com_egalacoral_spark_test_vfl 16.0

Но я получаю пустую страницу. Вот тестовый класс для сбора некоторых метрик.

class Runner {

    @Autowired
    GaugeService gaugeService

    private static final Logger logger = LoggerFactory.getLogger(Runner.class)

    private ZoneId zoneId = ZoneId.of('Europe/London')

    private Integer delay = 10

    @Scheduled(fixedDelay = 10000L)
    void runOnTest() throws Exception {

        def now = ZonedDateTime.now(zoneId)
        println "collect metrics"
        gaugeService.submit("test", 2.0)

    }
}

P.S: Я заметил, что GaugeService имеет несколько реализаций, и в моем приложении это DropwizardMetricServices. Эта реализация уже содержит собственный реестр метрик, в который собираются мои метрики. Итак, когда я вызываю конечную точку / prometheus, я получаю пустую страницу, поскольку CollectorRegistry' in my customPrometheusMetricWriter` никогда не заполняется моими метриками.

Подскажите, пожалуйста, как я могу решить эту проблему?


person I. Domshchikov    schedule 29.11.2016    source источник


Ответы (1)


Итак, я нашел причину, по которой используется DropwizardMetricServices реализация GaugeService.

Согласно весенним документам:

50.10 Показатели Dropwizard

Компонент Spring по умолчанию MetricRegistry будет создан, когда вы объявите зависимость от библиотеки io.dropwizard.metrics: metrics-core; вы также можете зарегистрировать собственный экземпляр @Bean, если вам нужны настройки. Пользователи библиотеки Dropwizard «Metrics» обнаружат, что показатели Spring Boot автоматически публикуются в com.codahale.metrics.MetricRegistry. Метрики из MetricRegistry также автоматически отображаются через конечную точку / metrics.

Когда используются метрики Dropwizard, CounterService и GaugeService по умолчанию заменяются DropwizardMetricServices, который является оболочкой для MetricRegistry (так что вы можете @Autowired одну из этих служб и использовать ее как обычно). Вы также можете создать «специальные» метрики Dropwizard, указав перед именами метрик соответствующий тип (например, timer. , histogram. для датчиков и meter. * Для счетчиков).

Каким-то образом библиотека io.dropwizard.metrics: metrics-core была включена в зависимости проекта. После того, как я его снял, все начинает работать как положено.

person I. Domshchikov    schedule 29.11.2016