Улучшите процессы отказов вашего приложения

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

Отличную информацию об автоматических выключателях можно найти в блоге Мартина Фаулера. Далее в статье рассказывается о том, как эффективно их реализовать с помощью Опоссума и Прометея. Opossum - это реализация автоматических выключателей для Node.js, доступная на NPM. Prometheus - это база данных временных рядов, созданная для мониторинга и обеспечивающая функции запросов и предупреждений.

Создание автоматического выключателя

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

Чтобы выполнить исходную функцию через выключатель, вы вызываете функцию fire() на объекте выключателя. Любые аргументы, переданные в fire(), будут переданы исходной функции для использования. Имейте в виду, что предыдущие тесты могут привести к размыканию автоматического выключателя, что приведет к сбою последующих тестов.

Для получения дополнительной информации см. Документацию по Опоссуму.

Автоматические выключатели для КИПиА

Библиотека opossum-prometheus предоставляет инструментарий для Opossum с помощью prom-client. В приведенном выше примере показана простая реализация с добавлением одного прерывателя для оснащения. В реальном приложении объект PrometheusMetrics следует повторно использовать для нескольких автоматических выключателей.

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

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

Мониторинг

Чтобы сделать наши метрики доступными, нам нужно предоставить метрики Prometheus. Если вы используете Экспресс, это можно сделать, создав /metrics маршрут для Прометея следующим образом:

app.get(‘/metrics’, (_, res)=>res.end(register.metrics()))

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

Prometheus использует PromQL для опроса своих данных. Прекрасным инструментом для визуализации запросов в виде графиков является Grafana. opossum-prometheus имеет метрику с метками для каждого автоматического выключателя и генерируемых им событий. Метрика называется circuit с метками name и event для названия автоматического выключателя и генерируемых им событий соответственно.

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

Чтобы узнать, сколько событий запускается для каждого автоматического выключателя, можно использовать запрос PromQL rate(circuit[15s]).

Пример приложения

Пример приложения и файла docker-compose для настройки Prometheus и Grafana с помощью панели инструментов можно найти на GitHub. После загрузки запустите docker-compose up, чтобы развернуть приложение, Prometheus и Grafana, а также отправить несколько примеров запросов.

Сначала функция автоматического выключателя настроена на работу 100% времени. Через 60 секунд это значение изменится на 75%, затем на 25%, а затем снова на 100%. Это имитирует ухудшение обслуживания до точки, в которой размыкаются автоматические выключатели. Вы можете увидеть это на панели управления Grafana. Обратите внимание, когда 75% запросов успешны, событий отклонения не происходит. Только при успешном выполнении 25% автоматический выключатель размыкается и запускаются события отказа. Это связано с порогом по умолчанию в 50%.

Загляните в этот проект и посмотрите, как он работает.