Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Интеграция Loki с Grafana: логи рядом с метриками
loki_grafana_integration

Интеграция Loki с Grafana: логи рядом с метриками

Настройка Loki как источника данных в Grafana, совместный анализ

Интеграция Loki с Grafana: логи рядом с метриками

«Метрики без логов — как карта без компаса»

#Зачем интегрировать Loki с Grafana

Grafana поддерживает несколько источников данных одновременно. Вы можете:

  • Смотреть метрики из Prometheus
  • Рядом видеть логи из Loki
  • Переключаться между ними в одном интерфейсе

Преимущества:

  • Контекст: видите метрики и логи на одном дашборде
  • Корреляция: связываете скачок метрики с конкретными логами
  • Экономия времени: не нужно переключаться между системами

#Настройка Loki как источника данных

#Шаг 1: Добавьте Loki в Grafana

  1. Откройте Grafana (http://localhost:3000)
  2. Нажмите ⚙️ Settings → Data sources
  3. Нажмите Add data source
  4. Выберите Loki
  5. Введите URL: http://loki:3100 (имя сервиса Docker Compose)
  6. Нажмите Save & test

Если всё правильно, увидите: «Data source is working».

#Шаг 2: Проверка подключения

  1. Нажмите 🧭 Explore (левая панель)
  2. Вверху выберите источник Loki
  3. Введите запрос: {}
  4. Нажмите Run

Должны увидеть список доступных потоков (streams).


#Совместный анализ метрик и логов

#Split view в Explore

Grafana позволяет разделить экран:

  1. Откройте Explore
  2. Нажмите Split (иконка рядом с источником данных)
  3. Слева выберите Prometheus, справа Loki
  4. Введите запросы:
    • Слева: rate(http_requests_total[5m])
    • Справа: {app="api"} |= "error"

Результат: видите корреляцию между запросами и ошибками в логах.

#Синхронизация времени

При использовании split view время синхронизировано:

  • Зум на графике слева → зум применяется справа
  • Перемещение по времени → оба источника показывают один период

#Дашборды с метриками и логами

#Добавление панели с логами

  1. Откройте или создайте дашборд
  2. Нажмите Add panel
  3. Выберите источник Loki
  4. Введите LogQL запрос:
    {container="api-app"} |= "ERROR"
  5. Выберите визуализацию Logs
  6. Настройте панель (заголовок, описание)
  7. Сохраните дашборд

#Пример дашборда приложения

┌─────────────────────────────────────────────────────────────┐
│  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"                               │   │
│  │ [список лог-линий]                                   │   │
│  └──────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

#Переход от метрик к логам (и обратно)

#From metrics to logs

  1. На дашборде видите скачок error rate на графике Prometheus
  2. Выделите мышкой период скачка на графике
  3. Перейдите в панель с логами Loki
  4. Логи автоматически отфильтруются по выбранному периоду
  5. Найдите причину ошибок в логах

#From logs to metrics

  1. В логах видите повторяющуюся ошибку
  2. Кликните на значение лейбла (например, container="api-app")
  3. Grafana отфильтрует другие панели по этому лейблу
  4. Посмотрите метрики этого контейнера

#Переменные для связки источников

Создайте переменную, которая работает для обоих источников:

#Создание переменной

  1. ⚙️ Dashboard settings → Variables → New
  2. Настройте:
    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.

#Создание алерта

  1. Откройте панель с логами
  2. Нажмите Alert → Create alert rule
  3. Настройте условие:
# Запрос: количество ошибок за 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]) > 20

#Визуализация логов

#Типы визуализаций для Loki

Logs (по умолчанию):

  • Список лог-линий с подсветкой синтаксиса
  • Возможность развёртывания деталей
  • Фильтрация по клику

Table:

  • Таблица с колонками (время, содержимое, лейблы)
  • Удобно для сравнения логов

Time series:

  • График количества логов во времени
  • Полезно для rate() запросов

#Настройки визуализации Logs

  • Show time: показывать временные метки
  • Show labels: показывать лейблы
  • Show common labels: скрывать общие лейблы (экономит место)
  • Wrap lines: переносить длинные строки
  • Enable log context: кнопка «Show context» для просмотра соседних строк

#Log Context

Log Context показывает соседние лог-линии вокруг выбранной.

Как использовать:

  1. Наведите на лог-линию
  2. Нажмите кнопку Show context (или двойной клик)
  3. Увидите логи до и после выбранной строки

Зачем:

  • Понять последовательность событий
  • Увидеть, что привело к ошибке
  • Найти последствия ошибки

#Полевые примеры использования

#Пример 1: Отладка инцидента

Сценарий: Пользователи жалуются на ошибки при оплате.

Действия:

  1. Откройте дашборд payment-сервиса
  2. Видите скачок error rate на графике Prometheus (14:32)
  3. Выделите период 14:30-14:35 на графике
  4. Перейдите к панели с логами
  5. Фильтр: {service="payment"} |= "ERROR"
  6. Видите в логах: «Database connection timeout»
  7. Вывод: проблема с базой данных, не с кодом оплаты

#Пример 2: Поиск узкого места

Сценарий: API отвечает медленно.

Действия:

  1. Посмотрите на latency percentile (Prometheus): p95 = 2 секунды
  2. Откройте логи: {service="api"} |~ "duration.*\d{4,}ms"
  3. Найдите медленные запросы
  4. Посмотрите log context для этих запросов
  5. Видите: «Waiting for external API response: 1800ms»
  6. Вывод: внешний API тормозит, кэшируйте или добавьте timeout

#Пример 3: Корреляция деплоя и ошибок

Сценарий: После деплоя вырос error rate.

Действия:

  1. Добавьте аннотацию деплоя на дашборд (время, версия)
  2. Сравните график ошибок с аннотациями
  3. Видите корреляцию: деплой v2.3 → скачок ошибок
  4. Откройте логи после деплоя: {app="api"} |= "ERROR" |~ "v2\.3"
  5. Найдите новые ошибки
  6. Вывод: откатите v2.3, исправляйте баг

#Best practices интеграции

#1. Используйте одинаковые лейблы

Для Prometheus и Loki используйте схожие лейблы:

  • app, env, instance, container

Это упрощает создание переменных и фильтрацию.

#2. Создавайте единые дашборды

Не разделяйте метрики и логи на разные дашборды. Разместите:

  • Сверху: KPI и метрики (Prometheus)
  • Снизу: логи (Loki)

#3. Настройте переходы

Используйте переменные для связки источников. Одна переменная container должна фильтровать и Prometheus, и Loki.

#4. Добавляйте аннотации деплоев

Аннотации на графике помогают связать изменения в метриках с деплоями:

# Запрос для аннотаций changes(deployment_timestamp[1m]) > 0

#5. Не дублируйте данные

Не нужно хранить одни и те же данные и в Prometheus, и в Loki:

  • В Prometheus: метрики (числа)
  • В Loki: логи (текст)

#Отладка проблем

#Проблема: Loki не показывает логи

Причины:

  • Неправильный URL источника данных
  • Promtail не отправляет логи
  • Неправильные лейблы в запросе

Решение:

# Проверьте доступность Loki curl http://localhost:3100/ready # Проверьте статус Promtail docker logs promtail # Попробуйте запрос без фильтров {}

#Проблема: медленно загружается дашборд

Причины:

  • Большой временной диапазон
  • Запрос без фильтрации по лейблам
  • Слишком много лог-линий

Решение:

  • Уменьшите диапазон времени
  • Добавьте фильтры по лейблам: {app="api"} вместо {}
  • Используйте |= для фильтрации по содержимому

#Проблема: алерты не срабатывают

Причины:

  • Неправильное условие алерта
  • Недостаточное окно времени

Решение:

  • Проверьте запрос в Explore — должен возвращать данные
  • Убедитесь, что условие IS ABOVE корректно
  • Проверьте notification channel

Далее: Node Exporter: мониторинг сервера