Подключение express-botx к системам мониторинга.
Endpoint /api/v1/alertmanager включён по умолчанию — никакой дополнительной настройки не требуется. Если в конфиге определён один чат, он используется автоматически. Секция alertmanager нужна только для кастомизации:
server:
listen: ":8080"
base_path: /api/v1
api_keys:
- name: alertmanager
key: env:ALERTMANAGER_API_KEY
alertmanager: # опционально — endpoint работает и без этой секции
default_chat_id: alerts # чат по умолчанию для алертов
error_severities: # при каких severity ставить статус "error"
- critical
- warningДобавьте receiver в alertmanager.yml:
receivers:
- name: express
webhook_configs:
- url: http://express-botx:8080/api/v1/alertmanager
send_resolved: true
http_config:
bearer_token: "<api-key>"
route:
receiver: express
# Или для конкретных алертов:
routes:
- match:
severity: critical
receiver: expressЕсли нужно отправлять разные алерты в разные чаты, используйте разные receiver'ы с query-параметром chat_id:
receivers:
- name: express-infra
webhook_configs:
- url: http://express-botx:8080/api/v1/alertmanager?chat_id=infra-alerts
send_resolved: true
http_config:
bearer_token: "<api-key>"
- name: express-app
webhook_configs:
- url: http://express-botx:8080/api/v1/alertmanager?chat_id=app-alerts
send_resolved: true
http_config:
bearer_token: "<api-key>"
route:
routes:
- match:
team: infra
receiver: express-infra
- match:
team: app
receiver: express-appcurl -X POST http://localhost:8080/api/v1/alertmanager \
-H "Authorization: Bearer <api-key>" \
-H "Content-Type: application/json" \
-d '{
"status": "firing",
"alerts": [
{
"status": "firing",
"labels": {
"alertname": "HighCPU",
"severity": "critical",
"instance": "server1:9090"
},
"annotations": {
"summary": "CPU usage is above 90%"
},
"startsAt": "2026-01-01T00:00:00Z",
"endsAt": "0001-01-01T00:00:00Z"
}
]
}'Endpoint /api/v1/grafana включён по умолчанию — никакой дополнительной настройки не требуется. Если в конфиге определён один чат, он используется автоматически. Секция grafana нужна только для кастомизации:
server:
listen: ":8080"
base_path: /api/v1
api_keys:
- name: grafana
key: env:GRAFANA_API_KEY
grafana: # опционально — endpoint работает и без этой секции
default_chat_id: alerts # чат по умолчанию
error_states: # при каких состояниях ставить статус "error"
- alerting- Перейдите в Alerting → Contact points → Add contact point
- Выберите тип Webhook
- Заполните:
- URL:
http://express-botx:8080/api/v1/grafana - HTTP Method: POST
- Authorization Header:
Bearer <api-key>
- URL:
- Сохраните и привяжите к notification policy
Аналогично Alertmanager — создайте несколько contact point'ов с ?chat_id=:
http://express-botx:8080/api/v1/grafana?chat_id=infra-alertshttp://express-botx:8080/api/v1/grafana?chat_id=app-alerts
curl -X POST http://localhost:8080/api/v1/grafana \
-H "Authorization: Bearer <api-key>" \
-H "Content-Type: application/json" \
-d '{
"status": "firing",
"alerts": [
{
"status": "firing",
"labels": {
"alertname": "DiskFull"
},
"annotations": {
"summary": "Disk usage above 90%"
},
"startsAt": "2026-01-01T00:00:00Z",
"dashboardURL": "https://grafana.company.ru/d/abc123"
}
]
}'express-botx может принимать callback-и от сервера Express и маршрутизировать их на внешние обработчики (скрипты или вебхуки). Это позволяет реагировать на системные события (добавление в чат, вход/выход пользователя и др.) без написания полноценного бота.
Добавьте секцию callbacks в конфигурацию сервера:
server:
listen: ":8080"
callbacks:
base_path: /botx
verify_jwt: true
rules:
- events: [chat_created, added_to_chat]
handler:
type: exec
command: ./on-membership.sh
timeout: 10s
- events: [notification_callback]
handler:
type: exec
command: ./on-delivery.sh
- events: ["*"]
async: true
handler:
type: webhook
url: http://my-service/events
timeout: 30sВ настройках бота на сервере Express укажите URL callback-а:
- Command callback URL:
http://express-botx:8080/botx/command - Notification callback URL:
http://express-botx:8080/botx/notification/callback
#!/bin/bash
# on-membership.sh — обработка добавления в чат
EVENT="$EXPRESS_CALLBACK_EVENT"
CHAT_ID="$EXPRESS_CALLBACK_CHAT_ID"
echo "Event: $EVENT, Chat: $CHAT_ID"
# Полный JSON доступен через stdin
PAYLOAD=$(cat)
echo "$PAYLOAD" | jq .Webhook-обработчик получает POST-запрос с оригинальным JSON callback-а в теле.
Заголовки X-Express-Event и X-Express-Sync-ID содержат тип события и sync_id.
# Flask-пример
from flask import Flask, request
app = Flask(__name__)
@app.route("/events", methods=["POST"])
def handle_event():
event = request.headers.get("X-Express-Event")
payload = request.get_json()
print(f"Event: {event}, Payload: {payload}")
return "", 200- sync (
async: false, по умолчанию) — сервер ждёт завершения обработчика перед ответом клиенту. Подходит для быстрых обработчиков. - async (
async: true) — сервер сразу отвечает 202 и запускает обработчик в фоне. Подходит для долгих операций. При graceful shutdown сервер дожидается завершения фоновых обработчиков.
Подробнее о полях конфигурации — см. Конфигурация.
Для систем без специальных эндпоинтов используйте /send:
# JSON
curl -X POST http://express-botx:8080/api/v1/send \
-H "Authorization: Bearer <api-key>" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "deploy",
"message": "Deploy v1.2.3 completed",
"status": "ok"
}'
# С файлом (multipart)
curl -X POST http://express-botx:8080/api/v1/send \
-H "Authorization: Bearer <api-key>" \
-F "chat_id=deploy" \
-F "message=Отчёт за март" \
-F "file=@report.pdf"GitLab CI:
notify:
stage: notify
script:
- |
curl -sf -X POST "$EXPRESS_BOTX_URL/api/v1/send" \
-H "Authorization: Bearer $EXPRESS_BOTX_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"chat_id\": \"deploy\", \"message\": \"Deploy $CI_PROJECT_NAME:$CI_COMMIT_TAG completed\"}"Jenkins Pipeline:
post {
success {
sh '''
curl -sf -X POST "$EXPRESS_BOTX_URL/api/v1/send" \
-H "Authorization: Bearer $EXPRESS_BOTX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"chat_id": "deploy", "message": "Build #'"$BUILD_NUMBER"' OK"}'
'''
}
}Bash-скрипт (cron):
#!/bin/bash
# Мониторинг места на диске
USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$USAGE" -gt 90 ]; then
express-botx send --chat-id alerts --status error \
"Диск заполнен на ${USAGE}% на $(hostname)"
fi