Prometheus Custom Buried Point Pose II из серии SpringBoot

Spring Boot задняя часть

«Это 16-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г.".

Prometheus Custom Buried Point Pose II из серии SpringBoot

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

Друзья, читавшие предыдущую статью, возможно, знают, что принятый ранееsimpleclientРеализуется несколькими метриками, определенными пакетом, на самом деле есть более простая и удобная поза, которая заключается в прямом использованииMeterRegistryЧтобы создать Метрику для сбора данных

По сравнению с реализацией предыдущей статьи, в целом, простота использования видна в целом.Предыдущую статью можно посмотреть, нажав ниже.

II. Пользовательская эскалация

Еще предстоит построить базовый проект проекта.Проект, показанный в этой статье, в основном представляет собой версию SpringBoot 2.2.1.Положение более высоких версий не сильно отличается.Что касается версии 1.x, то она не гарантируется возможно (потому что я не проверял)

1. Зависимость

pom зависимости, в основном следующие пакеты

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
</dependencies>

2. Информация о конфигурации

Второй — файл конфигурации, регистрирующий соответствующую информацию Prometheus.

spring:
  application:
    name: prometheus-example
management:
  endpoints:
    web:
      exposure:
        include: "*"
  metrics:
    tags:
      application: ${spring.application.name}

В приведенной выше конфигурации есть две ключевые информации, которые также представлены в предыдущем сообщении в блоге, вот краткое описание

  • management.endpoints.web.exposure.includeВсе веб-интерфейсы, указанные здесь, будут включены в отчет.
  • metrics.tags.applicationВсе показатели, сообщаемые этим приложением, будут помечены приложением.

После завершения настройки появится/actuator/prometheusКонечная точка для prometheus для извлечения информации о метриках

3. Пользовательский перехватчик для достижения коллекции и отчетности

Реализуйте базовый перехватчик для перехвата всех HTTP-запросов, а затем соберите информацию о запросах для создания отчетов.

public class MetricInterceptor extends HandlerInterceptorAdapter {
    @Autowired
    private MeterRegistry meterRegistry;
    private ThreadLocal<Timer.Sample> threadLocal = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 总计数 + 1
        meterRegistry.counter("micro_req_total", Tags.of("url", request.getRequestURI(), "method", request.getMethod())).increment();
        // 处理中计数 +1
        meterRegistry.gauge("micro_process_req", Tags.of("url", request.getRequestURI(), "method", request.getMethod()), 1);

        Timer.Sample sample = Timer.start();
        threadLocal.set(sample);
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        try {
            super.postHandle(request, response, handler, modelAndView);
        } finally {
            meterRegistry.gauge("micro_process_req", Tags.of("url", request.getRequestURI(), "method", request.getMethod()), -1);
            //  Timer timer = meterRegistry.timer("micro_req_histogram", Tags.of("url", request.getRequestURI(), "method", request.getMethod(), "code", String.valueOf(response.getStatus())));
            Timer timer = Timer.builder("micro_req_histogram").minimumExpectedValue(Duration.ofMillis(1)).maximumExpectedValue(Duration.ofMinutes(3))
                    .sla(Duration.ofMillis(10), Duration.ofMillis(50), Duration.ofMillis(100), Duration.ofMillis(300), Duration.ofMillis(1000))
                    .tags(Tags.of("url", request.getRequestURI(), "method", request.getMethod(), "code", String.valueOf(response.getStatus())))
                    .register(meterRegistry);
            threadLocal.get().stop(timer);
            threadLocal.remove();
        }
    }
}

Обратите внимание, как создаются три вышеуказанные метрики.

  • Счетчик: использовать напрямуюmeterRegistry.counter()чтобы создать метрику и достичь количества +1
    • При передаче параметров теги состоят из метки, определенной в формате propmetheus, kv, первый параметр используется для определения MetricName.
  • Калибр: положение использования в основном такое же, как указано выше, но следует отметить, что сложение и вычитание счетчика осуществляется непосредственно при передаче параметров.
  • Гистограмма: Поза использования требует особого внимания, определенная в preHander.Timer.Samplerобъект, вpostHandlerСбор данных реализован в

С небольшим количеством кода, приведенного выше, реализуется простой настраиваемый информационный отчет; следующим шагом является регистрация перехватчика.

4. Зарегистрируйтесь и протестируйте

Перехватчик зависит от объекта bean-компонента Spring, поэтому его необходимо определить как объект bean-компонента.

@RestController
@SpringBootApplication
public class Application implements WebMvcConfigurer {
    private Random random = new Random();

    @Bean
    public MetricInterceptor metricInterceptor() {
        return new MetricInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(metricInterceptor()).addPathPatterns("/**");
    }

    @GetMapping(path = "hello")
    public String hello(String name) {
        int sleep = random.nextInt(200);
        try {
            Thread.sleep(sleep);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "hello sleep: " + sleep + " for " + name;
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

На основании этого составляется простой настраиваемый отчет о сборе; после запуска проекта проверьте, есть ли какой-либо отчет о данных, обратившись к конечной точке сбора.

Наконец, подведем итог: хотя SpringBoot может легко получить доступ к prometheus для сбора некоторых общих индикаторов, когда нам нужны настраиваемые индикаторы отчетов, мы можем напрямую использоватьMeterRegistryСбор информации и создание метрики — хороший выбор, обычно мы выбираем три типа:

  • Всего запросов: использованиеCounter
  • Количество запросов, которые в настоящее время обрабатываются: takeGauge
  • Запросить трудоемкую гистограмму:Histogram

III. Исходный код и связанные с ним знания, которые нельзя пропустить

0. Проект

1. Публичный аккаунт WeChat: блог Yihuihui

Это не так хорошо, как письмо. Вышеупомянутое содержание чисто из семьи. Из-за ограниченных личных способностей неизбежно будут упущения и ошибки. Если вы обнаружите ошибки или у вас есть лучшие предложения, вы можете критиковать и поправьте их.

Ниже представлен серый личный блог, в котором записываются все посты в блоге по учебе и работе, приглашаю всех посетить

  • One Grey BlogПерсональный блогblog.hhui.top
  • Серый блог - специальный весенний блогspring.hhui.top