Как стать автором
Обновить
89.43

Prometheus: как Бог огня стал Богом мониторинга

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров5.7K

1. Введение

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

Метрики собирает и анализирует Prometheus – гибкая система с открытым исходным кодом, являющаяся одним из самых распространенных инструментов для реализации мониторинга.

Цель данной статьи - рассмотреть процесс разработки сервиса мониторинга на основе Prometheus и оценить его значимость в контексте современной разработки программного обеспечения.

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

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

 2. Задачи мониторинга

 Основными задачами сервиса мониторинга являются:

  • непрерывное отслеживание состояния приложений и инфраструктуры; 

  • своевременное обнаружение проблем и аномалий;

  • мониторинг ключевых метрик производительности и доступности;

  • анализ трендов и прогнозирование нагрузки;

  • улучшение процесса принятия решений на основе данных.

 3. Технологии и инструменты

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:

Один из вариантов простого процесса, который можно применить для сервиса с одним экземпляром.

Стандартный процесс, в котором идет получение структуры для регистрации метрики, сама регистрация и обработка метрики, установка значения или его увеличение.

Процесс №2:

Если присутствует работа с несколькими экземплярами сервиса, то может потребоваться использование базы данных, обработка метрики перейдет в 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:

Gauge

7. Сопровождение мониторинга

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

8. Заключение

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

Благодаря Prometheus, сервисы будут иметь возможность более быстро и эффективно решать проблемы, и следить за состоянием своих систем. Сервисы смогут легко работать с другими инструментами и обрабатывать большие объемы данных. Все эти изменения сделают сервисы эффективнее и надежнее, соответствующими современным требованиям.

9. Список использованных источников

  • официальная документация Prometheus: https://prometheus.io/docs;

  • официальная документация Grafana: https://grafana.com/docs.

Теги:
Хабы:
+13
Комментарии14

Публикации

Информация

Сайт
axenix.pro
Дата регистрации
Дата основания
Численность
1 001–5 000 человек
Местоположение
Россия
Представитель
Илья Деревенько