Гибкий open-source инструмент alertmanager-jira
Привет, хабровчане!
Если вы работаете с мониторингом в Prometheus или VictoriaMetrics, то наверняка знаете, и Alertmanager для убобного конфигурирования алертов. Но ведь круто было бы их трекать в привычнй Jira, не правда ли? А что если автоматизировать это полностью — с назначением исполнителей, метками, компонентами и даже шаблонами для описаний? Знакомьтесь с alertmanager-jira — классным инструментом для обеспечения интеграции Alertmanager
(с Prometheus
или VictoriaMetrics
). Это Alertmanager (webhook
) плагин, который создаёт и управляет задачами в Jira
на основе алертов, с акцентом на гибкость. Написан на Quarkus, лёгкий и готов к деплою в docker (podman).
В посте разберём, зачем это нужно, почему не подошли альтернативы, как использовать и что под капотом. Давайте по порядку.
Зачем нужна интеграция
В мире DevOps
и SRE
мониторинг — это не только дашборды, но и оперативное реагирование. Jira здесь часто выступает центральным хабом для задач (да и вообще наиболее популярный трекер задач, как мне кажется). Вот ключевые причины, почему такая интеграция — must-have:
Многие используют Jira в разработке и поддержке процессов. В командах разработчиков или
SRE
Jira
— стандарт для багов, фич и инцидентов. Когда алерт срабатывает (скажем, на перегрузкуCPU
или дрейф данных), его нужно быстро превратить в тикет. Alertmanager-jira делает это автоматически: алерт → webhook → Jira-issue с полным контекстом. Это снижаетMTTR
и избавляет от рутины.Также удобно для
ITSM
-процессов, например запросов пользователей, инцидентов, обеспечения качества данных (Data Quality) и т.д. В ITIL-подобных workflows Jira идеальна для запросов пользователй, инцидентов и compliance-задач вроде data quality. Алерты на аномалии в ETL или BI-пайплайнах ночью? Утром в Jira уже готовый тикет с лейблами (labels), компонентами, исполнителями, командами... А дальше просто уже идём по процессу задачи (workflow) и строим живые дашбордыБыло б здорово иметь полный контроль над задачами без самописных скриптов. Представьте: назначить
исполнителя
(assignee
) по ролям, задать любые поля (даже кастомные), использовать шаблоны для динамического описания и избежать дубликатов черезJQL
-поиск. Именно это даёт alertmanager-jira — гибкость без enterprise-ценников.
Имеющиеся альтернативы и почему потребовалось новое решение
Многие знают jiralert от prometheus-community
— это webhook-ресивер для Alertmanager, который создаёт задачи по group_key
алертов. Он классный для базовых сценариев: поддерживает Go
-шаблоны для полей, авто-разрешение и переоткрытие задач. Но у него ряд серьёзных недостатков, которые мы ощутили на практике:
Очень ограниченное количество настроек (переоткрывать или нет, шаблон, ну ещё парочку). Конфиг по ресиверам, но без глубокого контроля над полями — всё через
YAML
с базовыми шаблонами. Нет нормальной поддержки кастомных полей или динамическихJQL
-запросов для обновлений.Очень длинный хеш алерта для идентификации, такой, что часто даже рушит интерфейс. Работать очень неудобно. Хеш по
group_key
может быть огромным, ломая UI Jira. На одном из предыдущих мест работы мы даже специально патчили его, чтобы укоротить.Развивается не активно — есть баги открытые аж с 2018 года. Проект под MIT, с 30+ контрибьюторами, но обновления редкие — последние коммиты не меняют картину существенно.
Других альтернатив практически нет: на рынке либо тяжёлые дорогие тулы вроде PagerDuty (ничего не могу сказать плохого) с Jira-интеграцией, либо пишут что-то сами. Нам же очень хотелось иметь полный контроль над задачами — на кого назначить, какие метки и компоненты указать... да и вообще, использовать любые поля! Именно с этим прицелом и был сделан alertmanager-jira
: можно настроить как дефолты (например в какой инстанс слать, какой проект использовать и тип задачи), так и управлять любым этим параметром, или заполняемым полем в каждом алерте, поиск по JQL
для избежания дублей, возможность комментировать задачи, если проблема такая уже была создана и задача не закрыта.
Как использовать
Проект готов к быстрому старту: есть docker
-образы на hub.docker.com, и они собираются с новыми релизами автоматически.
Запуск в контейнере
приведём прямой пример запуска, но конечно вы можете использовать docker-compose
или развернуть в kubernetes
. Пример запуска:
podman run -it --rm --name alertmanager-jira \
--env JIRA_URL=https://your-jira.com \
--env JIRA_USERNAME=service-account \
--env JIRA_PASSWORD=your-token \
-p 8080:8080 \
hubbitus/alertmanager-jira:latest
Скрытый текст
Я люблю podman
, особенно rootless
. Но если вы используете docker
, просто поменяйте podman
➫ docker
, нет никакой разницы в запуске
Настройка Alertmanager
В alertmanager.yml
добавляем назначение
(receiver
):
receivers:
- name: 'jira'
webhook_configs:
- url: 'http://your-host:8080'
send_resolved: true # Для обработки resolved-алертов
Пример конфигурирования алертов
Как уже упоминал вначале статьи, упор на гибкость: разными способами можно задать абсолютно любое поле, и можно использовать шаблоны! Для указания полей, относящихся к нему, используются поля с префиксом jira__
. Они задаются в правилах
(rules
) Prometheus
(или VictoriaMetrics
) указываем в разделах labels
/annotations
.
Пример в prometheus-rules.yml
:
groups:
- name: example
rules:
- alert: HighCPU
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 1m
labels:
severity: critical
jira__field__severity: High # Поле priority в Jira
annotations:
summary: "High CPU on {{ $labels.instance }}"
description: "CPU usage above 80%."
jira__project_key: OPS # Ключ проекта
jira__issue_type_name: Incident # Тип задачи
jira__field__assignee: oncall-sre # Исполнитель
jira__field__labels: 'monitoring, cpu, alert' # Массив через запятую
jira__field__component_s: 'DevOps+infrastructure, DQ-issues+alerts' # Нормализация для "Component/s"
jira__field__name__1: 'Custom Field' # Пара name/value для кастомных
jira__field__value__1: 'Some dynamic value: ${context.alert.severity}' # Шаблон!
Уже упоминал, чтобы не повторять одно и то же в каждом алерте, рекомендую задать дефолты. Например, в alert_relabel_configs
файла prometheus.yml
:
alerting:
alert_relabel_configs:
- source_labels: [__alert_severity]
target_label: jira__field__severity
regex: critical;High
- target_label: jira__project_key
replacement: OPS
В любом алерте, если нужно, можете переопределить эти значения - там они будут иметь приоритет.
В любых полях можно использовать шаблоны с синтаксисом Groovy SimpleTemplate и подстановки вроде:
${context.alert.fingerprint}
для хэша${context.jiraProject.name}
для метаданных.Поиск уже существующих задач, которые стоит прокомментировать на
JQL
: (labels = "alert[${context.alert.hashCode()}]" AND statusCategory != Done).
Я не буду полностью переносить сюда ридми, чтобы не растягивать, в нём я старался привести примеры, указать 3 возможных способа настройки, там же есть podman-compose
чтобы поднять весь стек для разработки и отладки, просто загляните в проект. Если чего-то не хватает, в тестах можно также подсмотреть примеры.
Как сделано и что можно было бы улучшить
Под капотом — Java + Groovy на Quarkus. Используется официальный SDK от Atlassian для Jira API.
Имеются автоматические тесты: модульные для парсинга, интеграционные на внешнем инстансе Jira
. Стоит заметить, однако, что автотесты не запускаются на CI
. Знаю, что это очень плохо, но к сожалению Jira
— не бесплатный продукт, и его так просто не поднимешь в testcontainers
— требуется лицензия. И хотя временную её можно иногда получить у них на портале (не уверен, что это сейчас возможно вообще для России), всё равно вводить вручную, и она временная, да ещё и именная, требуется замена периодически... Поэтому сейчас тесты сделаны так, что запускаются на отдельно развёрнутый инстанс. Очень хотелось бы это конечно изменить, но "хороших" путей не вижу.
Обратная связь только приветствуется!
Alertmanager-jira
— открытый проект под Apache 2.0, с фокусом на гибкость для реальных команд. Мы уже 2 года используем решение в продакшене. Конечно были незначительные баги, которые мы исправили, но в целом всё отлично — это стало основной автоматизации обслуживания алертов по данным дата платформы.
Предложения и пожелания, а также багрепорты в проекте GitHub приветствуются!
P.S. А для тех, кто уже переходит на отечественные решения, планирую скоро рассказать про подобное решение на EvaTeam, если конечно кому-то интересно.
Z55
Честно говоря, не очень понятно, это замена классическому алертменеджеру?
Ну и несколько моментов:
А что ещё нужно? Можете рассказать про какую-то киллер-фичу, которая есть у alertmanager-jira, но нет у jiralert? И что значит "нет нормальной поддержки кастомных полей"? Такого недостаточно "
customfield_13011: {"value": "Другое"}"
? Конфиг через yaml. Но вроде и в статье тоже yaml?Даже с активным флагом
hash-jira-label
? Но тут больше вопросы к создателям jira, ибо если в поле 255 символов, и полное заполнение поля ломает разметку, то выглядит как баг.