Мониторинг — Loki
Loki е системата за log aggregation на Dictaro. Събира логове от Docker контейнери на двата хоста (licensing server и DGX Spark) чрез Promtail агенти.
Архитектура
Loki конфигурация
Файл: licensing-go/monitoring/loki-config.yml
| Параметър | Стойност | Описание |
|---|---|---|
auth_enabled | false | Без multi-tenancy автентикация |
http_listen_port | 3100 | HTTP API порт |
path_prefix | /loki | Prefix за storage paths |
storage | filesystem | Локален filesystem storage |
chunks_directory | /loki/chunks | Директория за log chunk-ове |
rules_directory | /loki/rules | Директория за alerting rules |
replication_factor | 1 | Single instance (без clustering) |
kvstore | inmemory | In-memory hash ring |
schema | v13 с tsdb store | Най-новата schema версия |
index_period | 24h | Индекс период |
retention_period | 720h (30 дни) | Логовете се пазят 30 дни |
Storage layout
Promtail конфигурации
Dictaro използва два Promtail агента — по един на всеки хост.
Локален Promtail (licensing server)
Файл: licensing-go/monitoring/promtail-config.yml
| Параметър | Стойност |
|---|---|
http_listen_port | 9080 |
positions_file | /tmp/positions.yaml |
| Client URL | http://loki:3100/loki/api/v1/push |
| Discovery | Docker SD чрез Unix socket |
| Host label | licensing-server |
Relabeling:
__meta_docker_container_name→container(премахва водещ/)- Static label
host: licensing-server __meta_docker_container_log_stream→stream(stdout/stderr)
Отдалечен Promtail (DGX Spark)
Файл: server/promtail-config.yml
| Параметър | Стойност |
|---|---|
http_listen_port | 9080 |
positions_file | /tmp/positions.yaml |
| Client URL | https://loki.dictaro.ai/loki/api/v1/push |
| External labels | host: gx10-804f |
| Discovery | Docker SD чрез Unix socket |
Relabeling:
__meta_docker_container_name→container- Static label
host: gx10-804f __meta_docker_container_log_stream→stream
Ключова разлика: Отдалеченият Promtail push-ва логове чрез HTTPS към loki.dictaro.ai (Cloudflare Tunnel), а не директно към Loki.
Label модел
| Label | Стойности | Описание |
|---|---|---|
host | licensing-server, gx10-804f | Хост, от който идва логът |
container | Име на Docker контейнера | Конкретен контейнер |
stream | stdout, stderr | Log stream тип |
LogQL заявки в Grafana
Основни заявки
# Всички логове от ASR сървъра
{host="gx10-804f", container="asr"}
# Error логове от всички контейнери на licensing server
{host="licensing-server"} |= "error"
# Stderr от конкретен контейнер
{container="api", stream="stderr"}
# Логове с JSON parsing и филтриране
{container="api"} | json | level="error"
Aggregate заявки
# Log volume по хост за последния час
sum by (host) (count_over_time({job="docker"}[1h]))
# Error rate по контейнер
sum by (container) (count_over_time({stream="stderr"}[5m]))
# Top контейнери по обем логове
topk(5, sum by (container) (bytes_over_time({}[1h])))
Cloudflare Tunnel за Loki
Docker Compose дефинира tunnel-loki услуга, която expose-ва Loki на loki.dictaro.ai:
tunnel-loki:
image: cloudflare/cloudflared:latest
command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN_LOKI}
depends_on:
- loki
Retention и поддръжка
- Retention: 30 дни (
720h), конфигурирано вlimits_config.retention_period - Storage: Filesystem-based (Docker volume
loki-data) - Backup: Не е конфигуриран автоматичен backup — при нужда може да се копира volume-ът
- Scaling: Single instance, достатъчен за текущия обем логове