رفتن به محتوا
بازگشت به وبلاگ
پایش

Grafana Loki: تجمیع لاگ برای زیرساخت

استقرار Grafana Loki با Promtail برای تجمیع لاگ: پرس‌وجوی مبتنی بر Label، LogQL، هشدار و یکپارچه‌سازی با داشبوردهای Grafana.

آبان ۱۴۰۴
۱۳ دقیقه مطالعه

مقدمه

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 استفاده کنید.