Перейти к содержанию

Руководство по мониторингу Quality Validator

Это руководство охватывает мониторинг, алертинг и observability для Quality Validator.

Быстрый старт

  1. Импорт дашборда Grafana

    # Через Grafana API
    curl -X POST -H "Content-Type: application/json" \
      -d @grafana-dashboard.json \
      http://grafana:3000/api/dashboards/db
    

  2. Загрузка правил алертинга

    # Скопировать в директорию правил Prometheus/VictoriaMetrics
    cp alerting-rules.yml /etc/prometheus/rules/
    
    # Перезагрузить конфигурацию
    curl -X POST http://prometheus:9090/-/reload
    

  3. Проверка метрик

    # Проверить, собираются ли метрики
    quality_validation_total
    

Справочник метрик

Счётчики (Counters)

Метрика Лейблы Описание
quality_validation_total contract_namespace, contract_name Всего валидированных записей
quality_validation_failed contract_namespace, contract_name Записей, не прошедших валидацию
quality_dlq_records_total contract_namespace, contract_name Записей, отправленных в DLQ
quality_rule_failures contract_namespace, contract_name, rule_name, severity Ошибки по правилам

Гистограммы (Histograms)

Метрика Лейблы Бакеты Описание
quality_validation_duration_seconds contract_namespace, contract_name 1мс до 10с Латентность валидации записи
quality_batch_size contract_namespace, contract_name 1 до 10000 Записей в пакете

Gauge метрики

Метрика Лейблы Описание
quality_pass_rate contract_namespace, contract_name Текущий процент успеха (0-1)
quality_contract_version contract_namespace, contract_name, version Активная версия контракта

Основные дашборды

Обзорный дашборд

Главный дашборд показывает: - Gauge процента успеха: Текущий процент успешных валидаций с цветовой кодировкой - Пропускная способность: Записей/секунду во времени - Скорость DLQ: Рост Dead Letter Queue - Персентили латентности: p50, p95, p99 времени валидации

Панель ошибок по правилам

Показывает разбивку ошибок по: - Названию правила - Severity (error/warning) - Трендам во времени

Мониторинг DLQ

Отслеживает: - Скорость записей в DLQ в минуту - Кумулятивный рост DLQ - Разбивку DLQ по контрактам

Алертинг

Уровни severity алертов

Severity Время реакции Уведомление
critical Немедленно PagerDuty + Slack
warning 1 час Только Slack
info Следующий рабочий день Email дайджест

Определения алертов

HighValidationFailureRate

  • Условие: Процент ошибок > 5% за 5 минут
  • Severity: Warning
  • Действие: Исследовать источник данных, проверить недавние изменения

CriticalValidationFailureRate

  • Условие: Процент ошибок > 20% за 5 минут
  • Severity: Critical
  • Действие: Немедленное расследование, рассмотреть приостановку ingestion

ValidationLatencyHigh

  • Условие: p99 латентность > 100мс за 5 минут
  • Severity: Warning
  • Действие: Проверить утилизацию ресурсов, сложность правил

DLQBacklogGrowing

  • Условие: Скорость DLQ > 100 записей/минуту
  • Severity: Warning
  • Действие: Проверить записи DLQ, планировать переобработку

NoValidationsReceived

  • Условие: Нет валидаций 15 минут
  • Severity: Warning
  • Действие: Проверить Kafka consumer, здоровье исходного топика

Каналы уведомлений

Mattermost/Slack

Конфигурация в Alertmanager:

receivers:
  - name: 'data-quality-slack'
    slack_configs:
      - channel: '#data-quality-alerts'
        send_resolved: true
        title: '{{ .Status | toUpper }}: {{ .CommonAnnotations.summary }}'
        text: '{{ .CommonAnnotations.description }}'

Telegram

receivers:
  - name: 'data-quality-telegram'
    telegram_configs:
      - bot_token: 'YOUR_BOT_TOKEN'
        chat_id: YOUR_CHAT_ID
        message: |
          {{ .Status | toUpper }}
          {{ .CommonAnnotations.summary }}
          {{ .CommonAnnotations.description }}

PagerDuty

receivers:
  - name: 'data-quality-pagerduty'
    pagerduty_configs:
      - service_key: 'YOUR_SERVICE_KEY'
        severity: '{{ .CommonLabels.severity }}'

Рецепты PromQL

Процент успеха во времени

sum(rate(quality_validation_total[5m]) - rate(quality_validation_failed[5m]))
  by (contract_name)
/
sum(rate(quality_validation_total[5m])) by (contract_name)

Топ ошибающихся правил

topk(10,
  sum(increase(quality_rule_failures{severity="error"}[1h])) by (rule_name)
)

Персентили латентности

histogram_quantile(0.99,
  sum(rate(quality_validation_duration_seconds_bucket[5m])) by (le, contract_name)
)

Тренд скорости DLQ

sum(rate(quality_dlq_records_total[5m])) by (contract_name) * 60

Дрейф версии контракта

count(quality_contract_version) by (contract_namespace, contract_name)

Диагностика проблем

Метрики не отображаются

  1. Проверить, запущен ли валидатор:

    curl http://validator:8000/metrics
    

  2. Проверить конфигурацию scrape в Prometheus:

    scrape_configs:
      - job_name: 'quality-validator'
        static_configs:
          - targets: ['validator:8000']
    

  3. Проверить ошибки scrape:

    up{job="quality-validator"}
    

Расследование высокой латентности

  1. Проверить размеры пакетов:

    histogram_quantile(0.99,
      sum(rate(quality_batch_size_bucket[5m])) by (le)
    )
    

  2. Определить медленные правила:

    # Если доступен тайминг на уровне правил
    topk(5, sum(rate(quality_rule_duration_seconds_sum[5m])) by (rule_name))
    

  3. Проверить утилизацию ресурсов:

    rate(process_cpu_seconds_total{job="quality-validator"}[5m])
    process_resident_memory_bytes{job="quality-validator"}
    

Расследование DLQ

  1. Получить разбивку ошибок:

    sum(increase(quality_rule_failures{severity="error"}[1h])) by (rule_name)
    

  2. Сравнить с общим количеством:

    sum(increase(quality_validation_total[1h]))
    sum(increase(quality_dlq_records_total[1h]))
    

  3. Проверить конкретный контракт:

    sum(rate(quality_dlq_records_total{contract_name="orders"}[5m])) * 60
    

Определения SLI/SLO

Процент успешных валидаций

  • SLI: quality:validation_pass_rate:5m
  • SLO: >= 95% за 30 дней
  • Error Budget: 5% валидаций могут быть неуспешными

Латентность валидации

  • SLI: quality:validation_p99_latency:5m
  • SLO: p99 < 100мс
  • Error Budget: 1% валидаций могут превышать 100мс

Доступность

  • SLI: Uptime валидатора
  • SLO: 99.9% доступности
  • Error Budget: 43.8 минут/месяц простоя

Планирование ёмкости

Оценка пропускной способности

# Текущая пропускная способность
sum(rate(quality_validation_total[1h]))

# Пиковая пропускная способность (за 7 дней)
max_over_time(sum(rate(quality_validation_total[5m]))[7d:5m])

Требования к ресурсам

Пропускная способность CPU Память Инстансы
1K записей/с 0.5 ядра 512MB 1
10K записей/с 2 ядра 2GB 2-3
100K записей/с 8 ядер 8GB 5-10

Интеграция с каталогом данных

Метрики можно экспортировать в каталог данных для lineage:

from kruma_validator.metrics import get_metrics

metrics = get_metrics()

# Экспорт в каталог
catalog_client.update_quality_metrics(
    contract="sales/orders",
    pass_rate=0.98,
    dlq_count=150,
    last_validation=datetime.now(),
)