OpsGenie: настройка Incidents и Incidents Management проекта в целом

Автор: | 03/03/2021

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

Раньше вели документ в Confluence, который заполняли руками – но решение так себе, ибо 90% инцидентов просто решали без добавления записей о них.

Захотелось как-то навести порядок, ввести более адекватный Incidents Management (IcM), и вообще автоматизировать это дело.

Для отправки уведомлений кроме Prometheus Alertmanager, который шлёт уведомления в Slack, мы используем OpsGenie, который шлёт уведомления в мобильное приложение и выполняет звонок бота. Кроме того, в нём есть возможность создавать Incidents, которым и решил воспользоваться.

Причём, создавать их можно как вручную (см. Manual Incident Creation) так и автоматически при срабатывании алерта, см. Automate Incident Creation.

Сами Incidents по сути являются продвинутыми алертами: в них можно вносить комментарии, апдейты по процессу фикса, отправлять уведомления и так далее.

Документация тут>>>, но местами устаревшая. Однако, у OpsGenie отличная поддержка и все вопросы можно решить в минуты через чатик.

Alerts notifications rules

И в целом хочется пересмотреть систему нашего алертинга: сейчас у нас Prometheus Alertmanager шлёт алерты уровня WARNING и CRITICAL в Slack и OpsGenie, см. Prometheus: OpsGenie и Alertmanager — уведомления в почту/SMS/телефон и Prometheus: роутинг алертов в Alertmanager.

OpsGenie в свою очередь алерты уровня Critical шлёт в почту + выполняет звонок держурному инженеру.

Вместо этого сделаем иначе – Prometheus будет слать алерты прямо в OpsGenie и только, а уже OpsGenie будет выполнять отправку в Slack через Slack-интеграцию (по интеграции OpsGenie и Slack будет отдельный пост.).

Нужно это для того, что бы через интеграцию OpsGenie с другими системами (Logz.io, Instana, AWS CloudWatch, Jenkins) иметь единую точку отправки алертов.

Т.е. мы сначала собираем все алерты в самом OpsGenie, а потом уже его настройки определяют, что делать с алертом – проигнорировать, отправить сообщение только в Slack, если это Warning, или отправить в Slack + отправить на почту + позвонить держурному + создать инцидент.

При этом из Slack можно сразу установить Acknowledge для алерта.

Incidents Management processes

Как говорил один хороший человек – “Процессы прежде утилит“, поэтому сначала опишите процессы – кто, как и за что отвечает, процесс рекции на инциденты.

Я набросал черновик, который включает в себя:

Roles

В Roles пока описаны только две роли: Incident Commander – “вечный дежурный”, главное ответсвенное лицо, и OnCall duty – наша DevOps team, чередуются через день по расписанию в OpsGenie.

Incidents severity

В Incidents severity описаны уровни важности – от P5 (Info) до P1 (Critical) в зависимости от влияния события на бизнесс-процессы и процессы разработки приложений.

Например, уровень P1 может означать, что затронуты конечные пользователи наших приложений – они не могут совершать покупки или полноценно пользоваться приложением. Тут может быть затронут API-бекенд, к которому обращаются мобильные клиенты, или падение AWS-сервиса, того же RDS, к которому обращается приложение API-бекенда.

P2, более низкий – влияет на процессы разработки. К примеру – падение Jenkins, что приводит к простою в билдах-деплоях. Уровень высокий, т.к. это тоже business-value, но не такой критичный, как влияние на конечных пользователей.

Ну а самый нижний уровень P5 – просто Info/Debug сообщения типа “На Dev-кластере Kubernetes какой-то под ушёл в постоянный рестарт”.

Incident domains

Области инцидентов. К ним потом можно будет “замапить” Services из OpsGenie (Сервисы рассмотрим ниже).

Пока в виде черновика выглядит так:

Почитать:

OpsGenie – включение Incidents

Как подключить:

  • Opsgenie is included in all cloud plans of Jira Service Management – если вы пользуетесь Jira Service Management, то OpsGenie там уже есть
  • Opsgenie is available as a standalone offering –  купить отдельно (есть бесплатный доступ, но он очень ограничен, мы пользуемся Standart)

У нас возникла проблема из-за того, что наш аккаунт OpsGenie покупался давно, ещё до покупки OpsGenie компанией Atlassian, и у нас не было Incidents в панели вообще.

Что бы активировать их – надо перевести аккаунт из Legace Subscriptions в Atlassian Subscriptions.

Для этого идём в управление подписками и просто выбираем Standart ещё раз:

План поменяется со следующего биллинг-периода, но через обращение в Саппорт можно переключить сразу

Теперь Инциденты должны быть доступны.

Настройка OpsGenie Services

Инциденты привязаны к конкретным Services, т.н. Service-Aware Incident Management, поэтому начнём с создания такого Сервиса.

В роли Сервиса может выступать часть инфрастуктуры (например – AWS RDS, или весь AWS), какая-то утилита, к примеру система сборки и деплоя типа Jenkins, или ваше приложение, в нашем случае это может быть API-бекенд наших мобильных приложений.

Сначала создаём Service, а для этого сервиса настраиваются Rules, Responders и Stakeholders.

  • Rules: описывают правила, по которым создаются Инциденты. Кроме того, эти Правила потом используются для проверки статуса Сервиса – выводят список связанных с этим сервисом Алертов.
  • Responders: ответственные за работу этого Сервиса, которым будут отправляться уведомления о новых Инцидентах, связанных с этим Сервисом.
  • Stakeholders: условно говоря люди, которые этим Сервисом пользуются. Им можно будет отправлять апдейты во время работы над инцидентом.

Создание Service

Переходим в Services:

Кликаем Add service, создадим Сервис для нашего Jenkins.

В Owner team указываем группу, ответственную за этот сервис. Но в нашем OpsGenie всего одна команда DevOps, так что везде будет фигурировать она:

Для настройки Rules и прочего – кликаем на Team settings:

В Service relationship можем связать несколько сервисов.

К примеру, у нас будет сервис AWS, в котором работает EC2, на котором работает Jenkins. Либо можно добавить сервис Kubernetes, в котором Jenkins запускает своих слейвов – тогда Jenkins будет Depends On Kubernetes (а Kubernetes – Depends On AWS):

Добавление Rules

Правила описывают то, как мы хотим автоматически создавать Инциденты из Алертов.

Переходим в Rules, кликаем Add incident rule:

В поле If the following condition(s) are met выбираем условия, при которых Инцидент будет создан, и как к нему потом будут подзвязываться алерты.

К примеру, у нас есть алерт для Jenkins с уровнем Critical, который сообщает о том, что у него на диске заканчивается свободное место:

  - alert: JenkinsLowDataDiskCritical
    expr: ((node_filesystem_size_bytes{mountpoint="/rootfs/data",host="jenkins-production"} - node_filesystem_free_bytes{mountpoint="/rootfs/data",host="jenkins-production"} ) / node_filesystem_size_bytes{mountpoint="/rootfs/data",host="jenkins-production"} * 100) > 95
    for: 1s
    labels:
      severity: critical
...

Изменим > на <, что бы он затриггерился, и получаем алерт в OpsGenie с уровнем P1:

Теперь настраиваем создание Инцидента по такому алерту, используя поля алерта Message и Priority:

В поля Incident Message и Incident Summary можно добавить дополнительную информацию, например – priority и source, с которого получен алерт, а в Incident Priority указать важность инцидента:

Жмём Create, рестартим Prometheus, что бы повторно затриггерить срабатывание алерта – и инцидент создан:

И сам инцидент:

А в списке Сервисов у сервиса Jenkins появляется уведомление о том, что есть открытый Инцидент:

Отсюда можем отправить апдейт “стейкхолдерам” (которыми в нашему случае выступаем мы сами):

Сообщение появится в Timeline справа:

Там же через Add entry можно добавить просто комментарий:

И посмотреть связанные алерты, которые попадают под Rules, описанные в начале:

И в конце-концов зарезолвить этот Инцидент:

После чего связанный алерт будет переведён в статус Acknowledged, а к Инциденту можно будет создать Postmortem – “расследование”.

Postmortem

После того, как инцидент решён или закрыт – ему можно добавить Postmortem с описанием причин и способов решения этого инцидента:

Который потом можно найти в Reports > Postmortems:

И даже заекспортить в Confluence:

Готово.