مقدمه
Grafana Loki یک سیستم جمعآوری لاگ مقیاسپذیر افقی است که از Prometheus الهام گرفته. برخلاف Elasticsearch که محتوای کامل لاگها را ایندکس میکند، Loki فقط متادیتا (labels) را ایندکس کرده و محتوای لاگ را فشرده ذخیره میکند. این باعث میشود Loki از نظر هزینه بسیار مقرونبهصرفهتر باشد.
معماری Stack PLG
TEXT
[سرورها] → [Promtail] → [Loki] → [Grafana]استقرار با Docker Compose
YAML
version: '3.8'
services:
loki:
image: grafana/loki:2.9.4
ports: ["3100:3100"]
volumes:
- ./loki-config.yaml:/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:2.9.4
volumes:
- /var/log:/var/log:ro
- ./promtail-config.yaml:/etc/promtail/config.yaml
grafana:
image: grafana/grafana:10.2.3
ports: ["3000:3000"]
environment:
- GF_SECURITY_ADMIN_PASSWORD=secure-passwordپیکربندی Promtail
YAML
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: nginx
static_configs:
- targets: [localhost]
labels:
job: nginx
__path__: /var/log/nginx/*.logزبان Query لوکی (LogQL)
LOGQL
# لاگهای خطا از nginx
{job="nginx"} |= "error" != "health"
# تعداد خطا در دقیقه
sum by (status) (rate({job="nginx"}[1m]))
# لاگهای JSON parse شده
{job="api"} | json | level="error" | duration > 200msقوانین هشداردهی
YAML
groups:
- name: application-alerts
rules:
- alert: HighErrorRate
expr: |
sum(rate({job="api", level="error"}[5m]))
/ sum(rate({job="api"}[5m])) > 0.05
for: 2m
labels:
severity: warningرویکرد label-محور Loki هزینه ذخیرهسازی را پایین نگه میدارد. برای دید عملیاتی از داشبورد Grafana و برای تحقیق در حوادث از LogQL استفاده کنید.
