Включение метрик Apache Camel в Spring Boot Actuator Prometheus

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Оглавление

  • Введение

  • Популярный подход

  • Проблема

  • Ход решения

  • Решение

  • Заключение

Введение

На одном из проектов передо мной стояла задача по включению метрик-счетчиков на маршрутах при штатном прохождении и при отклонении запросов.

Дано:

  • Spring Boot (2.5.6) для инъекции зависимостей, безопасности, предоставления веб-страничек для служебных целей.

  • Apache Camel (3.13.0) для маршрутизации запросов, троттлинга, направления метрик по каждому маршруту в точку сбора (в нашем случае /actuator/prometheus).

  • Micrometer (1.18.0) для сбора метрик и выставления их по адресу /actuator/prometheus.

Популярный подход

Самый частый подход, который мне встречался в интернете (во всех статьях от 2016 года и новее, а также во многих видео) состоит в следующем:

  • Добавление следующей зависимости

<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-micrometer-starter</artifactId>
</dependency>
  • Добавление следующей записи в application.properties файл

camel.component.metrics.metric-registry=prometheusMeterRegistry

  • Создание следующего кода в конфигурационном классе:

    @Bean
    public CamelContextConfiguration camelContextConfiguration() {

    return new CamelContextConfiguration() {
        @Override
        public void beforeApplicationStart(CamelContext camelContext) {
            camelContext.addRoutePolicyFactory(new MicrometerRoutePolicyFactory());
            camelContext.setMessageHistoryFactory(new MicrometerMessageHistoryFactory());
        }

        @Override
        public void afterApplicationStart(CamelContext camelContext) {

        }
    };
}

По сообщениям и по результатам на видео это должно приводить к появлению стандартных метрик Apache Camel на странице /actuator/prometheus, таких как CamelMessageHistory_seconds_count, и, в дальнейшем, возможности добавлять свои метрики, пользуясь синтаксисом micrometer:counter:simple.counter.

Проблема

В моём случае проблема заключается в том что у меня это не работает.

Попытки (ход) решения

  1. Попробовал учесть староватость способа приведённого выше и перебрал кучу комбинаций версий зависимостей (в данном случае у меня была некоторая гибкость):

    • Spring Boot 2.4.2 - 2.5.6

    • Apache Camel 3.8.0 - 3.13.0

    • io.micrometer 1.7.2 - 1.8.0

  2. Множество раз проверил код на опечатки. Попутно выяснил что они присутствуют во многих местах в интернете на данную тему, включая документацию Apache Camel (речь про похожесть синтаксиса метрик через metrics: и micrometer: )

  3. Много дебаггинга разных мест из моего сервиса, Apache Camel, Spring Boot, Micrometer.

  4. В процессе дебаггинга выяснилось слушатель канала micrometer: не "видит" ссылку на prometheusMeterRegistry.

  5. Попытался прописать явно добавление PrometheusMeterRegistry

@Bean(name = { MicrometerConstants.METRICS_REGISTRY_NAME })
public PrometheusMeterRegistry prometheusMeterRegistry() {
    return new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
}
  1. Это не решило проблему в полной мере. По ссылке /actuator/metrics всё-таки появились искомые метрики (как дефолтные от Apache Camel, так и новые, добавленные в коде). Но на странице /actuator/prometheus метрики Apache Camel не появлялись, а также использование micrometer:counter:simple.counter не добавляет simple.counter к списку метрик.

  2. Метрики удаётся добавить в список примерно следующим способом:

@Bean
public void initCounter(MeterRegistry meterRegistry) {
    Counter.builder("simple.counter")
            .register(meterRegistry);
}
  1. Но в таком случае они не обновляются на странице /actuator/prometheus и имеют константное значение - 0.

  2. Ещё после некоторого дебага выяснилась следующая картина - в экземпляре CamelContext лежит 3 объекта MeterRegistry (один JmxMeterRegistry и два PrometheusMeterRegistry). Что говорит о том что где-то инициализируется ещё один PrometheusMeterRegistry помимо описанного выше.

  3. Так и есть, spring-boot-actuator-autoconfigure имеет свой Bean с данным типом.

Как итог - остаётся проинициализировать и для /actuator и для Apache Camel один и тот же bean.

Финальное (моё) решение

Итоговое решение выглядит так:

  • Добавить зависимость:

<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-micrometer-starter</artifactId>
    <version>${org.apache.camel.springboot.version}</version>
</dependency>
  • Объявить @Bean следующим образом

@Bean(name = { MicrometerConstants.METRICS_REGISTRY_NAME, "prometheusMeterRegistry" })
public PrometheusMeterRegistry prometheusMeterRegistry(
        PrometheusConfig prometheusConfig, CollectorRegistry collectorRegistry, Clock clock) {
    return new PrometheusMeterRegistry(prometheusConfig, collectorRegistry, clock);
}

В данном случае у нас среди MeterRegistry оказываются всего один JmxMeterRegistry и один PrometheusMeterRegistry который доступен и для ApacheCamel и для Spring Boot Actuator.

Также сразу заметен результат работы данного решения, а именно - по адресу /actuator/prometheus доступны как метрики Apache Camel так и кастомные:

Часть содержимого по адресу /actuator/prometheus
Часть содержимого по адресу /actuator/prometheus

Заключение

По итогу проделанной работы было найдено рабочее решение по интеграции Apache Camel метрик в Spring Boot Actuator и проброской их в Prometheus.

Спасибо за внимание.

Источник: https://habr.com/ru/post/593371/


Интересные статьи

Интересные статьи

Я - студент университета, знаком с машинным обучением в рамках пройденного курса, есть интерес к современным кластерным технологиям, конкретно - к Apache Ignite. Под катом — история о том, как я запус...
Спешу поделиться радостной новостью — наконец-то вышел Spring Fu версии 0.3.0. Напомню, что это инкубатор для программного конфигурирования Spring Boot с использован...
В этой статье речь пойдёт о защите програмного обеспечения на процессоре S905X. Конечная цель — запустить неавторизованный софт. S905X Процессор S905X — это ARM Cortex-A53 с тактовой частотой...
Битрикс24 — популярная в малом бизнесе CRM c большими возможностями даже на бесплатном тарифе. Благодаря API Битрикс24 (даже в облачной редакции) можно легко интегрировать с другими системами.
Как широко известно, с 1 января 2017 года наступает три важных события в жизни интернет-магазинов.