Intro
Так короче… Есть у нас ELK от куда мы хотим срать алертами. Че нам понадобится
- Наш вайбговнокод на go
- Телеграм бот созданый как обычно…
- Датастрим в кибане куда будем складывать алерты.
Наш вайбговнокод на go
Вообщем тут особо не ча распыляться я сложил эт чудо сюда: github
Ему надо несколько переменных окружения:
1
2
3
4
5
6
7
export ES_URL="https://your-elastic-host:9200"
export ES_INDEX="telegaalert"
export ES_API_KEY="your_api_key_here"
export TG_TOKEN="your_bot_token"
export TG_CHAT_ID="-100123456789"
export RULES_FILE="/opt/trololo.yaml"
export KIBANAURL=http://192.168.97.11:5601
ES_INDEX - эт индекс куда мы будем складывать алерты (ниже будет)
ES_API_KEY - apikey c необходимыми правами типа:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"write-only-role": {
"cluster": [],
"indices": [
{
"names": [
"telegaalert"
],
"privileges": [
"read",
"write",
"maintenance"
],
"allow_restricted_indices": false
}
],
"applications": [],
"run_as": [],
"metadata": {},
"transient_metadata": {
"enabled": true
}
}
}
Так же я накидал некий темплейтинг дескать че бум высирать в алерте:
1
2
3
4
5
6
- rule_name: "default"
title: "🚨 {{.SpaceID}} - {{.RuleName}}"
recoveryTitle: "✅ Recovered: {{.SpaceID}} - {{.RuleName}}"
message: |
{{.ContextMessage}}
URL: <a href="${KIBANAURL}{{.Link}}">link</a>
тут знач
rule_name - это имя должно соответствевать rule_name которое вы ебанули когда делали правило в kibana/terraform и тд. Ни как в телеге его не видно.
Дальше значит поля которые мы с телеге уже бум видеть:
title - собстенно заголовок алерта.
message - сообщение в алерте.
recoveryTitle - заголовок если алерт разрезолвился
recoveryMessage - сообщение если алерт разрезолвился
Можно использовать всякие поля которые нам дает эластик. (но не все, хаха епты…).
Эт штука работает так типа оно групирует:
RuleName+SpaceID+Status если у них tsend: false то ебашим алерт.
Проставляем всем таким алертам дескать tsend: true. Если мы так не сделаем мы будем получать миллиард алертов на каждую запись которая прилетела пока наш бот отдыхал умирал а мы его “воскрешали”.
На кой хуй так сделано, потому что у меня не получилось на одном event заставить ее нормално обновить запись в индексе, дескать алерт отрекаверился (т.е если мы пишем в индекс только на status change). Кто настраивал тот поймет.
Телеграм бот созданый как обычно…
BotFather бла бла бла короче я хз че тут написать
Датастрим в кибане куда будем складывать алерты.
Тут значит остановимся подробнее т.к. это основная часть которая нам нужна что бы эт работало.
Скаладываем тестовые данные
Идем в кибану и пуляем в некий индекс в данном случае testalert3 всякую хуйню: дату сгенерить:
1
date -u +"%Y-%m-%dT%H:%M:%SZ"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST testalert3/_bulk
{ "index": {} }
{ "alert": 1, "@timestamp": "2026-11-07T16:34:52Z" }
{ "index": {} }
{ "alert": 1, "@timestamp": "2026-11-07T16:34:52Z" }
{ "index": {} }
{ "alert": 1, "@timestamp": "2026-11-07T16:34:52Z" }
{ "index": {} }
{ "alert": 1, "@timestamp": "2026-11-07T16:34:52Z" }
{ "index": {} }
{ "alert": 1, "@timestamp": "2026-11-07T16:34:52Z" }
{ "index": {} }
{ "alert": 1, "@timestamp": "2026-11-07T16:34:52Z" }
{ "index": {} }
{ "alert": 1, "@timestamp": "2026-11-07T16:34:52Z" }
Видимо чтов все заебись
1
2
3
4
5
{
"errors": false,
"took": 405,
...
}
Создаем Template DataView для этого индекса куда будем пулять алерты.
Create alert rule
Создаем Connector в нашем случае индекс куда мы будем кидать алерты:

Можно просто save в целом.
Создаем сам алерт:

Elasticsearch query rule ->
Тут переименовываем правило + добавляем че нам надо, что бы протестить эт чудо:

Сохраняем.
Че забыл добавить коннектор… идем обратно в влерт
ТУТ ЕБАТЬ ВАЖНО че собственно будем писать в индекс!!!

json собстна (хуй знает может тут столько и не надо потом разберемся…)
1
2
3
4
5
6
7
8
{
"rule_name": "{{rule.name}}",
"context_message": "{{context.message}}",
"SpaceID": "{{rule.spaceId}}",
"link": "{{context.link}}",
"status": "{{alert.actionGroup}}",
"tsend": "false"
}
tsend - т.е мы типа еще не отправили в телегу.
link - тут можно вкарячить че нить свое ссылку на какой нить дашборд.
Так же надо добавить Recovery Alert что бы когда ошибка пропадет нам прилетел алерт дескать все заебись.

1
2
3
4
5
6
7
{
"rule_name": "{{rule.name}}",
"context_message": "{{context.message}}",
"SpaceID": "{{rule.spaceId}}",
"status": "recovered",
"tsend": "false"
}
tsend - т.е мы типа еще не отправили в телегу. Остальное стандартное кроме
status - дескать эт recovered т.е восстановили/восстановилось.
link - тут можно вкарячить че нить свое ссылку на какой нить дашборд.
Я тут пишу все эт для теста на самом деле эту штуку с алертами надо автоматизировать и добавлять терраформом.
Потому что понятно что копировать эту ебанину в каждое правило будет всем в падлу… а вот пулять терраформ где можно шаблонизировать часть этого говна, гораздо проще.
Короче заебало чет писать… потом допишу… когда настроение будет…
Да и в целом хули я все дописал почти..