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
Что получится в итоге?¶
- Prometheus будет вычислять:
- Текущее состояние SLO (например,
99.2% доступности). - Остаток Error Budget (например,
15% осталось).
- Текущее состояние SLO (например,
- Alertmanager сработает при:
- Быстром расходовании бюджета (например,
burn rate > 10).
- Быстром расходовании бюджета (например,
- 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