Действуй как platform-инженер data-команды. Спроектируй observability. Стек: {{stack}}. Consumers: {{consumers}}.
Зачем formal observability
Без неё цикл инцидента: "BI показывает ноль за вчера" → инженер открывает 5 dashboard'ов → лезет в логи → находит, что step X упал. 4 часа MTTR. С observability — алерт прилетел в момент падения, lineage показал blast radius. 15 минут MTTR.
Четыре измерения
1. Latency per stage
Сколько занимает каждая стадия. Раздели:
- Extract latency: время выгрузки из источника
- Load latency: запись в raw
- Transform latency: staging → intermediate → mart
- Total end-to-end: source event → доступно в mart
Метрики: p50, p95, p99 за окно. Bottleneck = стадия с самым высоким p95.
2. Throughput
Сколько данных прошло:
- Rows processed per stage per run
- Bytes processed
- Cost (compute $ per run для cloud warehouse)
Резкое падение throughput (но pipeline зелёный) = upstream сломался, источник вернул 0 rows.
3. Freshness lag
Главная метрика для consumer'ов. NOW() - max(loaded_at) для каждого критичного mart'а. Сравнивай с SLO.
SELECT
table_name,
EXTRACT(EPOCH FROM (NOW() - MAX(loaded_at)))/60 AS lag_minutes,
CASE WHEN ... THEN 'BREACH' ELSE 'OK' END AS slo_status
FROM marts.freshness_view;
4. Failure rate
- Failures per pipeline per day
- Retries (много retries без падения = signal, что что-то нестабильно)
- MTTR (mean time to recovery)
- MTBF (mean time between failures)
Тренд важнее абсолютных значений. Рост retries за неделю = долг копится, скоро упадёт.
Lineage — кто откуда зависит
Без lineage невозможно понять blast radius. Сломался stg_orders → какие mart'ы протухли → какие dashboard'ы / ML-модели / алерты?
Инструменты:
- OpenLineage — открытый стандарт для emit'а событий: jobs, runs, datasets, версии схем
- Marquez — референсный backend для OpenLineage, граф lineage + UI
- Datahub / Atlan / OpenMetadata — full platform: lineage + catalog + governance
- dbt docs — column-level lineage внутри dbt-проекта, ограниченный source/target
Что emit'ить:
- Job started/completed (input datasets, output dataset, run_id, duration)
- Schema снапшоты на каждом запуске (детектировать drift)
- Custom facets: row count, freshness, тесты pass/fail
Lineage без column-level — половинчатый. Хочешь знать "колонка X в mart'е сломалась — где источник?". OpenLineage поддерживает column-level через facets.
SLO для свежести
Не "пытаемся обновлять каждый час", а формальный SLO:
| Mart | SLO | Окно | Error budget | | fct_orders | 99% < 60 min lag | 30d | 7.2h breach allowed | | fct_revenue_daily | 99% < 24h lag | 30d | 7.2h breach allowed | | dim_customer | 95% < 4h lag | 30d | 36h breach allowed |
Error budget показывает: "если уже сожгли 80% за неделю — стоп фичи, чиним стабильность".
Alerting без шума
Принципы:
- Алерт = action required. Если на алерт нечего сделать — не алертить
- Severity: page (будит ночью), ticket (smoothe in business hours), info (только дашборд)
- Group: 10 связанных fail = один алерт, не 10
- Rate limit: один алерт на конкретный signal в час
- Контекст в алерте: lineage link, last green run, runbook URL — чтобы не искать
Алерт: fct_orders freshness breach
Lag: 87 min (SLO 60 min)
Upstream: stg_orders (last loaded 90 min ago — likely cause)
Affected: 12 dashboards, ML model 'churn_v3'
Runbook: ...
On-call: @data-oncall
Что положить в дашборд
Один view, который отвечает на "пайплайны здоровы?":
- Heatmap freshness (mart × hour) — красное = breach
- Top-10 slowest jobs (p95 latency, тренд w/w)
- Failure rate за 7d, разбивка по jobs
- Error budget consumption per SLO
- Lineage map для топ-10 критичных mart'ов
Вывод
## Метрики, которые emit'им
| Стадия | Метрика | Тип | Source |
## SLO contracts
| Asset | SLO | Window | Owner | Consumers |
## Lineage strategy
- Tool: OpenLineage + Marquez / Datahub / ...
- Column-level: yes/no
- Что emit'им: jobs, datasets, schema, custom facets
## Alerting matrix
| Signal | Severity | Channel | Runbook | Suppression |
## Дашборды
1. Freshness heatmap
2. Latency p95 trends
3. Failure rate + retries
4. Error budget burn
Anti-patterns
- ❌ Только success/failure без latency — pipeline зелёный, но идёт в 5 раз медленнее, ловишь только когда SLO breach'нут
- ❌ Lineage в виде Confluence-страницы — устаревает за неделю, никто не доверяет
- ❌ Алерт на каждый retry — alert fatigue, реальные инциденты пропустят
- ❌ SLO без error budget — нет формального триггера "стоп фичи, чиним надёжность"
- ❌ Метрики только в логах, не в metric store — невозможно построить тренд за квартал
Мониторинг и алёрты
Что мерить, какие алёрты ставить, как не превратить on-call в ад.
Телеметрия для агентов
Что логировать (tool calls, latency, ошибки, cost), куда складывать, как смотреть и как не утечь данные.
Анализ trace агента
Разобрать trace агентской сессии: timeline tool calls, latency per step, поиск loops, redundant calls, missed tools, hallucinated args. Формат отчёта.