Полноценный стек для мониторинга логов на основе Grafana + Loki. Логи отправляются напрямую по HTTP API (без Promtail). В составе есть тестовое Python‑приложение‑симулятор с реалистичными событиями.
- Loki 2.9.0 — хранилище логов
- Grafana 10.1.0 — визуализация и дашборды
- Docker Compose — развёртывание одной командой
- Автопровижининг источника данных Grafana
- Тестовое приложение с
send_log_to_lokiи метками:job,level,activity
- Docker и Docker Compose
- Python 3.8+
- ОС: Windows/macOS/Linux
- Grafana:
http://127.0.0.1:43000 - Loki HTTP API:
http://127.0.0.1:43100
Порты кастомные (43000/43100), чтобы избежать конфликтов на Windows. При необходимости можно изменить их в docker-compose.yml.
grafana-loki-stack/docker-compose.yml— сервисыlokiиgrafanagrafana-loki-stack/loki-config.yaml— конфигурация Lokigrafana-loki-stack/grafana-datasource.yaml— автопровижининг Data Sourcegrafana-loki-stack/app.py— генератор логов и отправка в Lokirequirements.txt— зависимости PythonLICENSE— лицензия MIT
docker compose -f grafana-loki-stack/docker-compose.yml up -dПроверка готовности Loki:
curl http://127.0.0.1:43100/ready # ожидаемо: ready- Перейдите:
http://127.0.0.1:43000 - Логин/пароль:
admin/admin - Источник данных Loki создаётся автоматически (URL
http://loki:3100внутри Docker‑сети). Если настраиваете вручную через UI, можно использовать внешний адресhttp://127.0.0.1:43100.
python -m venv venv
# Windows PowerShell
./venv/Scripts/Activate.ps1
# Linux/macOS
# source venv/bin/activate
pip install -r requirements.txt
python grafana-loki-stack/app.pyПриложение начнёт генерировать события и отправлять их в Loki.
app.py использует HTTP POST на /loki/api/v1/push и формат:
{
"streams": [
{
"stream": { "job": "crypto-app", "level": "INFO", "activity": "system" },
"values": [["<timestamp_ns>", "<message>"]]
}
]
}Метки (labels):
job: постоянное имя приложения (crypto-app)level:INFO|ERROR|DEBUG|WARNING|CRITICALactivity:trading|user-activity|system|validation
grafana-loki-stack/grafana-datasource.yaml (внутри контейнера Grafana):
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
url: http://loki:3100
isDefault: true
jsonData:
maxLines: 1000Запрос LogQL:
{job="crypto-app"}
Визуализация: Logs (или Table).
Переключите редактор на «Code» и вставьте:
sum by (level) (
count_over_time({job="crypto-app"}[$__interval])
)
Визуализация: Pie chart. Рекомендуемые настройки: Legend → Values + Label; Display labels → Name and value.
# Все логи приложения
{job="crypto-app"}
# Только ошибки
{job="crypto-app", level="ERROR"}
# Фильтр по тексту
{job="crypto-app"} |= "Транзакция"
# Кол-во логов по уровням за 5 минут
sum by (level) (count_over_time({job="crypto-app"}[5m]))
- «Data source connected, but no labels received» — запустите
app.pyи повторите Save & test. - Конфликт портов на Windows — измените проброс в
docker-compose.yml(например, на 43000/43100), перезапустите compose. - Проверка Loki:
curl http://127.0.0.1:43100/ready→ должно вернутьready. - Логи контейнеров:
docker compose -f grafana-loki-stack/docker-compose.yml logs -f
- Изменяйте URL Loki в
grafana-loki-stack/app.pyчерез константуLOKI_URL. - Параметры хранения и индексации — в
grafana-loki-stack/loki-config.yaml.
MIT — см. LICENSE.
- Имя: Georgy Belyanin
- Локация: Russia, Moscow
- Email: georgy.belyanin@gmail.com
- Telegram: https://t.me/Ergon73