1. Введение
Одним из важных компонентов современной разработки программного обеспечения является мониторинг. Он позволяет непрерывно следить за состоянием приложений и инфраструктуры, что дает возможность активно обнаруживать проблемы, предотвращать возникновение аварий и оптимизировать работу системы.
Метрики собирает и анализирует Prometheus – гибкая система с открытым исходным кодом, являющаяся одним из самых распространенных инструментов для реализации мониторинга.
Цель данной статьи - рассмотреть процесс разработки сервиса мониторинга на основе Prometheus и оценить его значимость в контексте современной разработки программного обеспечения.
Основная идея заключается в том, чтобы создать отдельный сервис для мониторинга, который будет специализироваться на обработке различных видов метрик. Это решение было принято из-за большого числа приложений в системе, каждое из которых требовала регистрацию метрик.
Для улучшения взаимодействия с сервисом мониторинга, создана библиотека, которая обеспечивает возможность передачи всех необходимых данных для регистрации метрик в системе мониторинга.
2. Задачи мониторинга
Основными задачами сервиса мониторинга являются:
непрерывное отслеживание состояния приложений и инфраструктуры;
своевременное обнаружение проблем и аномалий;
мониторинг ключевых метрик производительности и доступности;
анализ трендов и прогнозирование нагрузки;
улучшение процесса принятия решений на основе данных.
3. Технологии и инструменты
![](https://habrastorage.org/getpro/habr/upload_files/d0b/e98/b79/d0be98b79b99ac5aaef595a4bc2793e2.jpg)
4. Проблемы, с которыми столкнулись:
Использование нескольких экземпляров сервиса:
возникали проблемы с формированием метрик типа Timer, т.к. для регистрации метрики требовалось рассчитать время и заводились такие поля в базе данных, как start и stop. В случае с несколькими экземплярами приложения stop приходил раньше, чем start, тем самым регистрировалась неправильная метрика;
возникает проблема при формировании метрики типа Gauge, т.к. события регистрировались на одном из доступных экземпляре сервиса, что мешало их объединению.
Решением стало вынос регистрации метрик в scheduling, который раз в определенное время забирает метрику из базы данных (первоначально получая сообщение через Kafka, дополняя сущность и записывая ее в базу) и регистрирует ее, при этом добавлены ограничения, которые позволяют регистрировать метрику на одном экземпляре сервиса.
5. Разработка и настройка мониторинга
Процесс разработки и настройки мониторинга включает в себя следующие этапы:
проектирование системы мониторинга: определение задач, выбор метрик для отслеживания, архитектура системы;
настройка Prometheus;
установка соответствующих параметров, чтобы обеспечить эффективный сбор данных.
Для отображения графиков в Grafana используется три вида метрик:
counter - совокупный показатель, представляющий собой один монотонно увеличивающийся счетчик, значение которого может увеличиваться или сбрасываться на ноль только при перезапуске приложения;
gauge — метрика, является числовым значением, которое можно изменять в произвольном порядке, увеличивая или уменьшая его;
timer - инструмент, который используется для мониторинга времени выполнения задач и операций в системах.
Для каждой из этих метрик требуется своя сущность с данными.
Пример сущностей:
CounterData:
public class CounterData {
private String code;
private Long value;
private List<LabelsData> additionalLabels;
}
GaugeData:
public class GaugeData {
private String code;
private Long currentParameter;
private List<LabelsData> additionalLabels;
}
TimerData:
public class TimerData {
private String code;
private String id;
private Long time;
}
Сохранение всех сущностей в сервисе мониторинга при использовании микросервисной архитектуры является неоптимальным, поскольку это потребует дублирования сущностей на стороне другого микросервиса для их вызова. Поэтому было принято решение реализовать библиотеку мониторинга, которая предоставляет доступ к методам для взаимодействия с сервисом мониторинга.
Чтобы общаться с сервисом мониторинга, достаточно подключить библиотеку к себе в приложение и вызвать нужный метод для отправки метрики в сервис мониторинга.
В качестве основного интерфейса общения с сервисом мониторинга был выбран Apache Kafka.
Пример использования через метод:
private void sendCounter(String code) {
monitoringSender.sendCounterData(code)
}
Пример с аннотацией:
@MonitoringTimeEvent(
onStart = "start",
onStop = "stop",
onError = "error"
)
private void getReport();
Обработка метрик сервисом мониторинга:
В процессе обработки метрик, отправленных через Kafka в топик сервиса мониторинга с использованием библиотеки, вначале происходит расширение сущности метрики путем обращения в dictionary (сделано для того чтобы передавать дополнительную информацию по метрике в label).
Для того чтобы обеспечить корректную обработку данных в дальнейшем, необходимо записать информацию в базу данных для метрик типа gauge и timer, так как имеется несколько экземпляров сервиса, что может мешать корректной обработки метрики.
Регистрация метрик осуществляется через scheduler в сервисе мониторинга, который периодически извлекает данные и регистрирует их.
Пример scheduler-а по регистрации метрик типа timer:
public class SchedulingTimerProcessingService {
@Scheduled(fixedDelay = 10000)
public void processTimer() {
processingTimer();
}
/**
* Обработка метрик типа Timer
*/
private void processingTimer() {
// Получение данных из базы и обработка метрики
}
}
Пример классов с регистрацией метрик:
Counter:
public class CounterFactory {
public Counter createMetrics(final CounterEventData data) {
return Counter.builder()
.tags()
.register();
}
}
Gauge:
public class GaugeFactory {
public Map<Gauge, AtomicLong> createComplexMetrics(final GaugeEventData data,
Long currentParameter) {
Gauge gauge = Gauge.builder()
.tags()
.register();
return Map.of(gauge, currentParameter);
})
}
Timer:
public class TimerFactory {
public Timer createMetrics(final TimerEventData data) {
return Timer.builder(data.getEventName())
.tags()
.publishPercentileHistogram()
.maximumExpectedValue()
.publishPercentiles()
.register();
}
}
Рассмотрим два из возможных процесса реализации обработки метрики:
Процесс №1:
![](https://habrastorage.org/getpro/habr/upload_files/b39/568/835/b39568835606779967e62dfbacda9c51.png)
Один из вариантов простого процесса, который можно применить для сервиса с одним экземпляром.
Стандартный процесс, в котором идет получение структуры для регистрации метрики, сама регистрация и обработка метрики, установка значения или его увеличение.
Процесс №2:
![](https://habrastorage.org/getpro/habr/upload_files/da5/e2a/3a5/da5e2a3a584d3944a92c237afbbeb669.jpg)
Если присутствует работа с несколькими экземплярами сервиса, то может потребоваться использование базы данных, обработка метрики перейдет в scheduler, который раз в определенное время регистрирует метрики.
6. Grafana
Инструмент, который используется для визуализации метрик, собранных с помощью Prometheus, позволяя представлять их в виде графиков.
Рассмотрим процесс: «Интернет-магазин»
У нас есть «интернет-магазин», где мы отслеживаем следующие бизнес-метрики:
количество заказов – Counter;
количество добавлений в корзину – Counter;
количество активных пользователей на сайте в реальном времени – Gauge;
время обработки заказа – Timer.
Для отображения графиков потребуется завести новый дашборд.
Общие шаги:
добавить новую панель;
выбрать источник данных (в нашем случае Prometheus);
ввод запроса;
настраиваем тип графика (например, линия или столбчатая диаграмма);
добавляем подписи для ясности.
Панель 1: Количество заказов
Запрос - sum(orders_total)
Панель 2: Количество добавлений в корзину
Запрос - sum(add_to_cart_total)
Панель 3: Количество активных пользователей на сайте в реальном времени
Запрос - active_users
Панель 4: Время обработки заказа
Запрос - histogram_quantile(0.95, sum(rate(order_processing_seconds_bucket[5m])) by (le) – покажет 95-й процентиль времени обработки заказов за последние 5 минут.
Пример демонстрирует, как можно использовать Grafana для визуализации и анализа бизнес-метрик интернет-магазина.
Примеры графиков, которые не относятся к «интернет-магазину», но демонстрируют визуализацию:
Timer:
![](https://habrastorage.org/getpro/habr/upload_files/273/f62/1f2/273f621f216eef61624e5d0547656ba9.png)
Gauge
![](https://habrastorage.org/getpro/habr/upload_files/719/46d/189/71946d1893c4ade5b0bdf55e98b9585c.png)
7. Сопровождение мониторинга
Сопровождение системы мониторинга включает в себя регулярное обновление компонентов, добавление новых метрик при необходимости, а также адаптацию системы к изменяющимся требованиям и условиям эксплуатации.
8. Заключение
Внедрение сервиса мониторинга на базе Prometheus играет ключевую роль в обеспечении стабильной работы приложений и инфраструктуры. Правильно спроектированный и настроенный мониторинг позволяет оперативно реагировать на проблемы, оптимизировать ресурсы и повышать эффективность работы системы в целом.
Благодаря Prometheus, сервисы будут иметь возможность более быстро и эффективно решать проблемы, и следить за состоянием своих систем. Сервисы смогут легко работать с другими инструментами и обрабатывать большие объемы данных. Все эти изменения сделают сервисы эффективнее и надежнее, соответствующими современным требованиям.
9. Список использованных источников
официальная документация Prometheus: https://prometheus.io/docs;
официальная документация Grafana: https://grafana.com/docs.