Настройка Loki как источника данных в Grafana, совместный анализ
«Метрики без логов — как карта без компаса»
Grafana поддерживает несколько источников данных одновременно. Вы можете:
Преимущества:
http://localhost:3000)http://loki:3100 (имя сервиса Docker Compose)Если всё правильно, увидите: «Data source is working».
{}Должны увидеть список доступных потоков (streams).
Grafana позволяет разделить экран:
rate(http_requests_total[5m]){app="api"} |= "error"Результат: видите корреляцию между запросами и ошибками в логах.
При использовании split view время синхронизировано:
{container="api-app"} |= "ERROR"┌─────────────────────────────────────────────────────────────┐
│ Application Dashboard │
├─────────────────────────────────────────────────────────────┤
│ KPI (Stat panels) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Requests │ │ Errors │ │ Latency │ │ Uptime │ │
│ │ 125/s │ │ 0.5% │ │ 250ms │ │ 99.9% │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Metrics (Time series from Prometheus) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Requests per Second by Endpoint │ │
│ │ [график] │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Error Rate over Time │ │
│ │ [график] │ │
│ └──────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Logs (from Loki) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Recent Error Logs │ │
│ │ {app="api"} |= "ERROR" │ │
│ │ [список лог-линий] │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
container="api-app")Создайте переменную, которая работает для обоих источников:
Name: container
Type: Query
Query (Prometheus): label_values(up, container)
Refresh: On Dashboard Load
Prometheus:
rate(http_requests_total{container="$container"}[5m])Loki:
{container="$container"} |= "error"Результат: выбираете контейнер в выпадающем списке → оба источника фильтруются.
Grafana поддерживает алерты из Loki.
# Запрос: количество ошибок за 5 минут
count_over_time({app="api"} |= "ERROR"[5m])
# Condition: WHEN last() OF query A, 5m, IS ABOVE 10Означает: алерт сработает, если за 5 минут было больше 10 ошибок.
Частые ошибки:
count_over_time({app="api"} |= "ERROR"[5m]) > 10Паника в приложении:
count_over_time({app="api"} |= "PANIC"[1m]) > 0Медленные запросы (если логируете длительность):
count_over_time({app="api"} |~ "duration.*[1-9][0-9]{2,}ms"[5m]) > 20Logs (по умолчанию):
Table:
Time series:
Log Context показывает соседние лог-линии вокруг выбранной.
Как использовать:
Зачем:
Сценарий: Пользователи жалуются на ошибки при оплате.
Действия:
{service="payment"} |= "ERROR"Сценарий: API отвечает медленно.
Действия:
{service="api"} |~ "duration.*\d{4,}ms"Сценарий: После деплоя вырос error rate.
Действия:
{app="api"} |= "ERROR" |~ "v2\.3"Для Prometheus и Loki используйте схожие лейблы:
app, env, instance, containerЭто упрощает создание переменных и фильтрацию.
Не разделяйте метрики и логи на разные дашборды. Разместите:
Используйте переменные для связки источников. Одна переменная container должна фильтровать и Prometheus, и Loki.
Аннотации на графике помогают связать изменения в метриках с деплоями:
# Запрос для аннотаций
changes(deployment_timestamp[1m]) > 0Не нужно хранить одни и те же данные и в Prometheus, и в Loki:
Причины:
Решение:
# Проверьте доступность Loki
curl http://localhost:3100/ready
# Проверьте статус Promtail
docker logs promtail
# Попробуйте запрос без фильтров
{}Причины:
Решение:
{app="api"} вместо {}|= для фильтрации по содержимомуПричины:
Решение:
IS ABOVE корректноТеперь вы умеете связывать метрики и логи. В следующей теме вы изучите Node Exporter — инструмент для мониторинга инфраструктуры (CPU, память, диск, сеть).
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.