Что получится в результате
Соберем ИИ-агента для мониторинга и DevOps, который помогает on-call инженеру быстрее разбирать инциденты: читает alerts, метрики, логи, deploy-события, runbooks и incident history, собирает контекст, формулирует гипотезы, предлагает безопасные проверки, готовит status update и postmortem draft.
Рабочая версия будет делать так:
- настройки хранятся в `settings`;
- сервисы хранятся в `service_catalog`;
- окружения хранятся в `environments`;
- владельцы и escalation хранятся в `oncall_roster`;
- источники наблюдаемости хранятся в `observability_sources`;
- alert rules хранятся в `alert_rules`;
- активные alerts пишутся в `alert_inbox`;
- обогащенные alerts пишутся в `alert_enrichment`;
- метрики и PromQL-запросы пишутся в `metric_snapshots`;
- логи пишутся в `log_samples`;
- deploy-события пишутся в `deploy_events`;
- runbooks хранятся в `runbook_catalog`;
- безопасные команды хранятся в `safe_commands`;
- опасные действия хранятся в `dangerous_actions`;
- инциденты пишутся в `incident_queue`;
- первичный разбор пишется в `triage_notes`;
- гипотезы пишутся в `root_cause_hypotheses`;
- status updates пишутся в `incident_updates`;
- задачи на действия пишутся в `remediation_tasks`;
- спорные и опасные действия уходят в `approval_queue`;
- одобренные действия попадают в `execution_queue`;
- черновики postmortem пишутся в `postmortem_drafts`;
- итоги инцидентов хранятся в `incident_results`;
- еженедельная сводка пишется в `weekly_devops_report`;
- все решения пишутся в `audit_log`;
- ошибки интеграций пишутся в `error_log`.
В первой версии агент не перезапускает production, не делает rollback, не меняет alert rules, не закрывает incident, не гасит alerts и не выполняет команды без подтверждения. Он собирает контекст и готовит действия, а on-call принимает решение.
Что понадобится
- n8n Cloud или self-hosted n8n.
- Google Sheets для MVP-таблиц.
- Prometheus HTTP API для метрик и alerts.
- Grafana HTTP API для dashboards и ссылок на панели.
- PagerDuty API, Opsgenie, Grafana OnCall или другой incident manager.
- Источник логов: Loki, Elasticsearch, Datadog, CloudWatch или выгрузка логов.
- Список сервисов, владельцев и окружений.
- Runbooks по критичным alerts.
- Канал approval: Telegram, Slack, Teams или PagerDuty note.
- API-ключ LLM-провайдера.
- On-call инженер, который подтверждает production-действия.
Шаг 1. Выберите первый DevOps-сценарий
Не начинайте с “агент чинит production”. Для MVP выберите один безопасный сценарий.
Подходящие варианты:
- обогащение alerts контекстом;
- поиск runbook по alert;
- сбор метрик и логов вокруг инцидента;
- подготовка incident summary;
- подготовка status update;
- группировка связанных alerts;
- postmortem draft после инцидента.
Самый безопасный старт: `alert -> сервис -> метрики -> логи -> deploys -> runbook -> triage note -> approval`.
Проверка: сценарий можно пройти на одном тестовом alert без изменения production.
Шаг 2. Запретите опасные действия
В первой версии запретите агенту:
- перезапускать production-сервисы;
- делать rollback;
- менять Kubernetes deployments;
- менять Terraform;
- менять alert rules;
- закрывать incident;
- silencing alerts;
- менять on-call escalation;
- удалять логи;
- выполнять shell-команды;
- менять базы данных;
- отправлять публичный status без approval.
Разрешите агенту:
- читать alerts;
- читать метрики;
- читать логи с маскированием секретов;
- читать runbooks;
- читать deploy-события;
- создавать triage note;
- готовить status update draft;
- готовить postmortem draft;
- создавать remediation task;
- отправлять опасные действия в approval.
Проверка: любое действие, которое меняет инфраструктуру, должно попадать в `approval_queue`.
Шаг 3. Создайте Google Sheet проекта
Создайте таблицу `devops_agent_mvp`.
Добавьте листы:
settings
service_catalog
environments
oncall_roster
observability_sources
alert_rules
alert_inbox
alert_enrichment
metric_snapshots
log_samples
deploy_events
runbook_catalog
safe_commands
dangerous_actions
incident_queue
triage_notes
root_cause_hypotheses
incident_updates
remediation_tasks
approval_queue
execution_queue
postmortem_drafts
incident_results
weekly_devops_report
audit_log
error_log
Проверка: названия листов совпадают один в один, потому что n8n будет обращаться к ним по имени.
Шаг 4. Заполните settings
В `settings` добавьте колонки:
key
value
description
Добавьте строки:
llm_model | gpt-4.1-mini | модель для triage и summary
max_logs_per_alert | 50 | лимит строк логов
metric_window_minutes | 30 | окно метрик вокруг alert
deploy_window_minutes | 120 | окно поиска deploy-событий
allow_production_actions | false | production-действия запрещены
allow_silence_alerts | false | silence только через approval
allow_incident_close | false | закрытие incident только человеком
approval_channel | telegram | канал согласований
report_channel | email | канал отчетов
mask_secrets | true | маскировать токены и пароли
Проверка: `allow_production_actions=false`, `allow_silence_alerts=false`, `mask_secrets=true`.
Шаг 5. Заполните service_catalog
В `service_catalog` добавьте колонки:
service_id
name
team
owner
criticality
slo
dashboard_url
runbook_id
status
Пример:
SVC-API | public-api | backend | backend-oncall | critical | 99.9 | https://grafana/d/api | RB-API-5XX | active
SVC-WEB | web-frontend | frontend | frontend-oncall | high | 99.5 | https://grafana/d/web | RB-WEB-LATENCY | active
Проверка: у критичного сервиса есть dashboard и runbook.
Шаг 6. Заполните environments
В `environments` добавьте колонки:
env_id
name
cluster
region
is_production
allowed_actions
status
Пример:
ENV-PROD | production | k8s-prod | ru-central | yes | read_only,approval_required | active
ENV-STAGE | staging | k8s-stage | ru-central | no | read_only,safe_checks | active
Проверка: production должен иметь `approval_required`.
Шаг 7. Заполните oncall_roster
В `oncall_roster` добавьте колонки:
roster_id
service_id
team
primary_oncall
secondary_oncall
escalation_channel
pagerduty_service_id
status
Пример:
ROSTER-API | SVC-API | backend | ivan | maria | #backend-oncall | PD-SVC-API | active
Проверка: агент знает, кого уведомлять при high и critical incidents.
Шаг 8. Заполните observability_sources
В `observability_sources` добавьте колонки:
source_id
source_type
api_slug
base_url
credential_ref
scope
status
Пример:
SRC-PROM | prometheus | prometheus-api | https://prometheus.example.com | n8n:prometheus | metrics,alerts | active
SRC-GRAF | grafana | grafana-http-api | https://grafana.example.com | n8n:grafana | dashboards,folders,alerts | active
SRC-PD | pagerduty | pagerduty-api | https://api.pagerduty.com | n8n:pagerduty | incidents,notes | active
SRC-LOKI | loki | loki-api | https://loki.example.com | n8n:loki | logs | active
Проверка: ключи хранятся в credentials, а не в таблице.
Шаг 9. Создайте alert_rules
В `alert_rules` добавьте колонки:
alert_rule_id
service_id
alert_name
severity
promql
threshold
for_duration
runbook_id
owner
status
Пример:
AR-API-5XX | SVC-API | High5xxRate | critical | rate(http_requests_total{status=~"5.."}[5m]) > 0.05 | 5% | 10m | RB-API-5XX | backend | active
Проверка: у каждого critical alert есть `runbook_id`.
Шаг 10. Создайте alert_inbox
В `alert_inbox` добавьте колонки:
alert_id
alert_rule_id
service_id
env_id
alert_name
severity
status
starts_at
ends_at
labels_json
annotations_json
source_url
created_at
Статусы:
firing
resolved
acknowledged
suppressed
unknown
Проверка: alert связан с сервисом и окружением.
Шаг 11. Подключите Prometheus HTTP API
Создайте workflow `DevOps Agent MVP`.
Добавьте узлы:
- `Manual Trigger`;
- `Read settings`;
- `Read service_catalog`;
- `Read alert_rules`;
- `HTTP Request: Prometheus alerts`;
- `Normalize alerts`;
- `Write alert_inbox`;
- `Write audit_log`.
Endpoint:
GET /api/v1/alerts
Проверка: в `alert_inbox` появились только active alerts, без изменения Prometheus.
Шаг 12. Создайте alert_enrichment
В `alert_enrichment` добавьте колонки:
enrichment_id
alert_id
service_id
dashboard_url
runbook_id
owner
related_alerts
recent_deploys
metric_summary
log_summary
risk_level
created_at
Проверка: enrichment не должен содержать секреты из логов.
Шаг 13. Создайте metric_snapshots
В `metric_snapshots` добавьте колонки:
snapshot_id
alert_id
service_id
metric_name
promql
window_start
window_end
value
baseline_value
change_percent
status
created_at
Минимальные метрики:
- error rate;
- latency p95;
- request rate;
- saturation;
- CPU;
- memory;
- queue length;
- dependency errors.
Проверка: LLM не считает метрики сама. Метрики считаются PromQL или monitoring API.
Шаг 14. Создайте log_samples
В `log_samples` добавьте колонки:
log_sample_id
alert_id
service_id
env_id
query
window_start
window_end
sample_json
masked
created_at
Правила:
- маскируйте токены;
- маскируйте email и телефоны, если они не нужны;
- берите последние уникальные ошибки;
- храните ограниченный sample;
- не выгружайте полные production-логи в LLM.
Проверка: `masked=true` для production.
Шаг 15. Создайте deploy_events
В `deploy_events` добавьте колонки:
deploy_id
service_id
env_id
version
commit_sha
author
started_at
finished_at
status
deploy_url
Откуда брать deploy-события:
- GitHub Actions;
- GitLab CI;
- Argo CD;
- Kubernetes events;
- manual deployment log.
Проверка: агент ищет deploys в окне `deploy_window_minutes`, но не делает вывод “deploy виноват” без evidence.
Шаг 16. Создайте runbook_catalog
В `runbook_catalog` добавьте колонки:
runbook_id
service_id
alert_name
title
symptoms
safe_checks
dangerous_actions
escalation_rules
source_url
owner
status
Пример safe checks:
проверить dashboard API; посмотреть 5xx по endpoint; проверить последний deploy; сравнить p95 latency; открыть логи с request_id
Проверка: у runbook есть безопасные проверки и список действий, которые нельзя выполнять без approval.
Шаг 17. Создайте safe_commands
В `safe_commands` добавьте колонки:
command_id
service_id
env_id
command_type
command_text
description
requires_approval
status
Примеры:
CMD-PROM-API-5XX | SVC-API | ENV-PROD | promql | rate(http_requests_total{service="api",status=~"5.."}[5m]) | проверить error rate | no | active
CMD-K8S-PODS | SVC-API | ENV-PROD | kubectl_read | kubectl get pods -n api | посмотреть состояние pod | yes | restricted
Проверка: даже read-only kubectl в production лучше держать через approval или отдельный безопасный proxy.
Шаг 18. Создайте dangerous_actions
В `dangerous_actions` добавьте колонки:
action_id
service_id
env_id
action_type
description
why_dangerous
required_approval
status
Примеры:
DA-ROLLBACK | SVC-API | ENV-PROD | rollback | откатить release | может усилить инцидент или потерять данные | primary_oncall | active
DA-RESTART | SVC-API | ENV-PROD | restart_service | перезапустить deployment | может вызвать downtime | primary_oncall | active
DA-SILENCE | SVC-API | ENV-PROD | silence_alert | заглушить alert | можно скрыть активную проблему | secondary_oncall | active
Проверка: агент не предлагает опасное действие как выполненное. Только draft + approval.
Шаг 19. Создайте incident_queue
В `incident_queue` добавьте колонки:
incident_id
alert_id
service_id
env_id
severity
title
status
impact
commander
created_at
resolved_at
incident_url
Статусы:
suspected
open
investigating
mitigating
resolved
closed
false_positive
Проверка: агент может предложить incident, но не закрывает его автоматически.
Шаг 20. Настройте prompt для incident triage
Prompt:
Ты DevOps incident assistant. Собери первичный разбор alert.
Правила:
1. Не выполняй production-действия.
2. Не называй root cause без evidence.
3. Разделяй факты, гипотезы и действия.
4. Используй runbook как главный источник действий.
5. Если данных мало, верни needs_more_data.
6. Опасные действия отправляй в approval.
7. Не назначай виновных.
alert:
{{$json.alert}}
metrics:
{{$json.metrics}}
logs:
{{$json.logs}}
deploys:
{{$json.deploys}}
runbook:
{{$json.runbook}}
Верни JSON:
{
"status": "triaged | needs_more_data | needs_human",
"facts": ["..."],
"hypotheses": ["..."],
"safe_checks": ["..."],
"dangerous_actions": ["..."],
"impact": "...",
"recommended_next_step": "...",
"approval_required": true
}
Проверка: root cause не появляется в facts, если нет доказательств.
Шаг 21. Создайте triage_notes
В `triage_notes` добавьте колонки:
triage_id
incident_id
alert_id
status
facts
hypotheses
safe_checks
impact
recommended_next_step
confidence
created_at
Проверка: `facts` и `hypotheses` должны быть разными полями.
Шаг 22. Создайте root_cause_hypotheses
В `root_cause_hypotheses` добавьте колонки:
hypothesis_id
incident_id
hypothesis
evidence
counter_evidence
confidence
status
created_at
Статусы:
open
confirmed
rejected
needs_data
Проверка: гипотеза не становится `confirmed` без evidence.
Шаг 23. Создайте incident_updates
В `incident_updates` добавьте колонки:
update_id
incident_id
audience
message
risk_level
status
reviewer
created_at
published_at
`audience`:
internal
support
customer_status
management
Проверка: внешние customer status updates всегда идут в approval.
Шаг 24. Создайте remediation_tasks
В `remediation_tasks` добавьте колонки:
task_id
incident_id
service_id
action_type
title
description
risk_level
owner
status
created_at
`action_type`:
safe_check
collect_logs
open_dashboard
escalate
rollback_candidate
restart_candidate
config_change_candidate
create_followup_bug
Проверка: `rollback_candidate`, `restart_candidate` и `config_change_candidate` отправляются в approval.
Шаг 25. Создайте approval_queue
В `approval_queue` добавьте колонки:
approval_id
source
source_id
action_type
action_text
risk_level
payload_json
approver
status
requested_at
approved_at
decision_comment
В approval отправляйте:
- restart;
- rollback;
- scale up/down;
- silence alert;
- close incident;
- change alert rule;
- update dashboard;
- run kubectl command;
- change config;
- publish external status update.
Проверка: `approval_queue.status` не может сразу быть `approved`.
Шаг 26. Сделайте Telegram approval
В n8n добавьте Telegram-узел после записи в `approval_queue`.
Сообщение:
DevOps Agent approval
Action: {{$json.action_type}}
Risk: {{$json.risk_level}}
Service: {{$json.service_id}}
Incident: {{$json.incident_id}}
{{$json.action_text}}
Approve: /approve {{$json.approval_id}}
Reject: /reject {{$json.approval_id}}
Escalate: /escalate {{$json.approval_id}}
Проверка: команда `/approve` меняет только одну строку по `approval_id`.
Шаг 27. Создайте execution_queue
В `execution_queue` добавьте колонки:
execution_id
approval_id
action_type
payload_json
status
executor
started_at
finished_at
result_url
error_message
В первой версии используйте `executor=manual`.
Проверка: агент не выполняет команду сам, даже если action approved.
Шаг 28. Подключите Grafana HTTP API
Для Grafana начните с read-only:
- найти dashboard по service_id;
- получить ссылки на панели;
- получить alerting resources;
- добавить dashboard_url в `alert_enrichment`.
Проверка: service account не имеет прав на изменение dashboards.
Шаг 29. Подключите PagerDuty API
Для PagerDuty начните с чтения и комментариев:
- получить incidents;
- получить alerts внутри incident;
- получить service и escalation policy;
- добавить note с triage draft только после approval или в тестовом режиме.
Проверка: агент не меняет incident status без approval.
Шаг 30. Создайте postmortem_drafts
В `postmortem_drafts` добавьте колонки:
postmortem_id
incident_id
summary
timeline
impact
detection
response
root_cause
contributing_factors
what_went_well
what_went_wrong
action_items
status
created_at
Правила:
- не назначать виновных;
- отделять confirmed root cause от hypotheses;
- писать timeline по audit_log и incident_updates;
- action items должны иметь владельцев;
- спорные выводы отправлять на review.
Проверка: postmortem draft не становится финальным без человека.
Шаг 31. Создайте incident_results
В `incident_results` добавьте колонки:
result_id
incident_id
service_id
severity
mtta_minutes
mttr_minutes
customer_impact
root_cause_status
followup_tasks_count
closed_at
Проверка: MTTA и MTTR считаются по timestamps, а не формулируются LLM.
Шаг 32. Создайте weekly_devops_report
В `weekly_devops_report` добавьте колонки:
report_id
period
summary
incidents_count
critical_count
top_noisy_alerts
services_with_risk
missing_runbooks
followup_tasks
next_week_actions
status
created_at
Пример summary:
За неделю было 7 incidents, 1 critical. Главный источник шума - HighLatency на web-frontend, 14 срабатываний без customer impact. Для SVC-API не хватает runbook по dependency timeout. На следующей неделе: уточнить alert threshold, дописать runbook и закрыть 3 follow-up задачи.
Проверка: отчет заканчивается действиями на следующую неделю.
Шаг 33. Настройте audit_log
В `audit_log` добавьте колонки:
audit_id
run_id
actor
action
entity_type
entity_id
before_json
after_json
reason
created_at
Логируйте:
- чтение alert;
- сбор метрик;
- сбор логов;
- поиск runbook;
- triage note;
- создание incident update;
- отправку в approval;
- решение approval;
- postmortem draft;
- weekly report.
Проверка: по `audit_log` можно восстановить, почему агент предложил конкретное действие.
Шаг 34. Настройте error_log
В `error_log` добавьте колонки:
error_id
run_id
node_name
error_type
message
payload_sample
retry_count
status
created_at
Типы ошибок:
prometheus_api_error
grafana_api_error
pagerduty_api_error
logs_api_error
missing_runbook
missing_service_owner
invalid_json
secret_mask_failed
approval_required
Проверка: если не удалось замаскировать секреты в логах, данные не передаются в LLM.
Шаг 35. Протестируйте на одном alert
Добавьте тестовый alert:
ALERT-001 | AR-API-5XX | SVC-API | ENV-STAGE | High5xxRate | critical | firing | 2026-05-23T10:00:00Z | | {"endpoint":"/api/orders"} | {"summary":"5xx rate high"} | https://prometheus/alerts | 2026-05-23
Добавьте runbook `RB-API-5XX`, metric snapshot, 10 строк логов и один deploy event.
Запустите workflow только для `ALERT-001`.
Ожидаемый результат:
- в `alert_enrichment` появился dashboard и runbook;
- в `metric_snapshots` есть error rate и latency;
- в `log_samples` логи замаскированы;
- в `triage_notes` есть facts и hypotheses отдельно;
- в `remediation_tasks` есть безопасные checks;
- опасное действие ушло в `approval_queue`;
- в `audit_log` есть все шаги;
- в `error_log` нет ошибок.
Шаг 36. Проверьте негативные сценарии
Проведите проверки:
- удалите runbook у critical alert;
- убедитесь, что создана ошибка `missing_runbook`;
- добавьте в лог токен;
- убедитесь, что он замаскирован;
- попробуйте restart production;
- убедитесь, что действие ушло в approval;
- передайте пустой ответ Prometheus;
- убедитесь, что агент не делает вывод без метрик;
- создайте external status update;
- убедитесь, что он требует approval;
- передайте невалидный JSON от LLM;
- убедитесь, что workflow остановился и записал `invalid_json`.
Проверка: агент должен ускорять on-call, но не становиться неконтролируемым исполнителем в production.
Что нельзя автоматизировать в первой версии
Не автоматизируйте сразу:
- restart production;
- rollback;
- изменение Kubernetes ресурсов;
- изменение Terraform;
- silence alerts;
- закрытие incidents;
- изменение alert rules;
- изменение dashboards;
- выполнение shell-команд;
- публикацию внешнего status page;
- изменение базы данных;
- назначение виновных в postmortem.
Минимальный хороший MVP: агент читает один alert, собирает метрики, логи, deploys и runbook, делает triage note, предлагает безопасные checks, отправляет опасные действия в approval и готовит postmortem draft после закрытия incident.
Частые вопросы
Может ли DevOps-агент сам чинить production?
В первой версии не должен. Он может собрать контекст, предложить безопасные проверки и подготовить rollback или restart как candidate action, но выполнение должно идти через on-call и approval.
Что важнее подключить первым: метрики или логи?
Для MVP лучше начать с alerts и метрик Prometheus, потому что они дают структуру инцидента. Логи добавляйте сразу после этого, но ограничивайте sample и маскируйте секреты.
Нужен ли runbook для каждого alert?
Для critical и high alerts - да. Без runbook агент будет импровизировать. Для low alerts можно начать с owner, dashboard и базовых безопасных checks.
Можно ли давать агенту kubectl?
Только очень осторожно. В MVP лучше не давать прямой kubectl. Если нужен доступ, используйте read-only proxy, allowlist команд и approval даже для production read operations.
Что считать готовым результатом MVP?
MVP готов, если по одному alert агент собирает контекст, показывает runbook, разделяет facts и hypotheses, создает triage note, не выполняет production-действия, отправляет опасные шаги в approval и оставляет понятный `audit_log`.