SLOTH

Sloth — это инструмент для генерации SLO (Service Level Objectives) на основе декларативного конфига (YAML). Он автоматически создает:

  • Prometheus-запросы для SLI (метрик).
  • Alertmanager-правила на основе Error Budget.
  • Grafana-дашборды для визуализации SLO.

Пример конфига SLO для HTTP-сервиса

version: "prometheus/v1"
service: "my-http-service"
slos:
  - name: "request-availability"
    objective: 99.9  # 99.9% доступности
    description: "Общая доступность HTTP-запросов"
    sli:
      events:
        error_query: sum(rate(http_requests_total{status=~"5.."}[5m]))
        total_query: sum(rate(http_requests_total[5m]))
    alerting:
      name: "HighErrorRate"
      labels:
        severity: "critical"
      annotations:
        summary: "SLO 'request-availability' нарушен ({{ $labels.slo }} > {{ $value }}%)"

Генерация Prometheus-правил

Запустите Sloth для создания:

Правил для Prometheus:

sloth generate -i slo-http.yml -o slo-rules.yml

Выходной файл slo-rules.yml будет содержать:

  • SLI-запросы (например, расчет доступности).
  • Алерты на основе Error Budget (например, "осталось менее 5% бюджета").

Дашборда для Grafana:

sloth generate grafana -i slo-http.yml -o slo-dashboard.json

Интеграция с Prometheus

Добавьте сгенерированные правила в prometheus.yml:

rule_files:
  - slo-rules.yml

Перезагрузите Prometheus:

curl -X POST http://prometheus:9090/-/reload

Что получится в итоге?

  1. Prometheus будет вычислять:
    • Текущее состояние SLO (например, 99.2% доступности).
    • Остаток Error Budget (например, 15% осталось).
  2. Alertmanager сработает при:
    • Быстром расходовании бюджета (например, burn rate > 10).
  3. Grafana покажет:
    • Графики выполнения SLO.
    • Прогноз исчерпания бюджета.

Продвинутые сценарии

SLO для gRPC-сервиса

slos:
  - name: "grpc-success-rate"
    objective: 99.95
    sli:
      events:
        error_query: sum(rate(grpc_server_handled_total{grpc_code!="OK"}[5m]))
        total_query: sum(rate(grpc_server_handled_total[5m]))

Мультиоконные SLO

alerting:
  - name: "short-term"
    window: "1h"  # Краткосрочное нарушение
    burn_rate: 10 # 10x быстрее обычного
  - name: "long-term"
    window: "72h" # Долгосрочное нарушение
    burn_rate: 1

Kubernetes + Helm

Используйте Sloth CRD для автоматического создания SLO:

apiVersion: sloth.slok.dev/v1
kind: PrometheusServiceLevel
metadata:
  name: my-service
spec:
  service: "my-service"
  slos:
    - name: "k8s-pods-availability"
      objective: 99.5
      sli:
        kubernetes:
          pods_availability: {}  # Автоматический запрос для k8s

Где размещать slo-http.yml и связанные файлы

Оптимальная структура директорий зависит от вашего проекта и инфраструктуры - вам виднее :) Я бы сделал так:

Локальная разработка (без Kubernetes)

/project-root/
├── slo/                      # Директория для SLO-конфигов
│   ├── slo-http.yml          # Основной конфиг SLO
│   ├── slo-grpc.yml          # Дополнительные SLO
│   └── ...                  
├── prometheus/               # Конфиги Prometheus (если есть)
│   ├── prometheus.yml        # Главный конфиг
│   └── alerts/               # Папка для правил алертинга
│       └── slo-rules.yml     # Сгенерированные Sloth правила
└── grafana/                  # Дашборды
    └── slo-dashboard.json    # Сгенерированный дашборд

Команды для генерации:

# Создать директории
mkdir -p slo prometheus/alerts grafana

# Генерация правил Prometheus
sloth generate -i slo/slo-http.yml -o prometheus/alerts/slo-rules.yml

# Генерация дашборда Grafana
sloth generate grafana -i slo/slo-http.yml -o grafana/slo-dashboard.json

Для Kubernetes (Helm/GitOps)

Если используете Kubernetes, размещайте конфиги в репозитории инфраструктуры:

/infra/
├── sloth/                    # Sloth-конфиги
│   ├── my-service-http.yaml  # SLO для сервиса
│   └── kustomization.yaml    # Для GitOps (опционально)
└── prometheus/
    └── sloth-rules/          # Сгенерированные PrometheusRules
        └── my-service.yaml  # Применяется через Helm/kubectl

Пример Helm-релиза:

helm upgrade --install sloth sloth/sloth \
  --set-file sloFiles={slo/my-service-http.yaml} \
  --namespace monitoring

Интеграция с CI/CD

Идеально добавить в пайплайн этап генерации SLO:

# .gitlab-ci.yml или github-actions.yml
steps:
  - name: Generate SLO rules
    run: |
      sloth generate -i slo/slo-http.yml -o prometheus/slo-rules.yml
      sloth generate grafana -i slo/slo-http.yml -o grafana/slo-dashboard.json
  - name: Deploy to Prometheus
    run: kubectl apply -f prometheus/slo-rules.yml