«Это 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 - Количество запросов, которые в настоящее время обрабатываются: take
Gauge - Запросить трудоемкую гистограмму:
Histogram
III. Исходный код и связанные с ним знания, которые нельзя пропустить
0. Проект
- проект:GitHub.com/JuneB/tickets…
- Исходный код:GitHub.com/JuneB/tickets…
1. Публичный аккаунт WeChat: блог Yihuihui
Это не так хорошо, как письмо. Вышеупомянутое содержание чисто из семьи. Из-за ограниченных личных способностей неизбежно будут упущения и ошибки. Если вы обнаружите ошибки или у вас есть лучшие предложения, вы можете критиковать и поправьте их.
Ниже представлен серый личный блог, в котором записываются все посты в блоге по учебе и работе, приглашаю всех посетить
- One Grey BlogПерсональный блогblog.hhui.top
- Серый блог - специальный весенний блогspring.hhui.top