«Это 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