Runbook : LokiIngestionSlow¶
Alerte : LokiIngestionSlow (PrometheusRule, severity warning)
Symptôme :
Le taux d'ingestion logs layer est < 80 % du target, ou la taille de file d'attente dépasse 5 000 entries depuis plus de 10 min. Risque : perte de logs (buffer log shipper saturé).
Severity : 🟡 warning — notif Slack #akko-observability
Diagnostic¶
1. Métriques d'ingestion¶
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl port-forward -n akko svc/akko-loki 3100:3100 &
curl -sS http://localhost:3100/metrics | grep -E "loki_ingester|loki_distributor"
Métriques clés :
- loki_ingester_chunks_stored_total (doit croître)
- loki_distributor_bytes_received_total
- loki_ingester_chunks_flushed_reasons_total
2. Vérifier les limites¶
kubectl get configmap -n akko akko-loki -o yaml | grep -A20 'limits_config:'
# Les quotas pertinents :
# ingestion_rate_mb
# ingestion_burst_size_mb
# max_streams_per_user
# max_line_size
3. Logs logs layer pour les events rate limit¶
4. État log shipper (producteur)¶
kubectl get pod -n akko -l app.kubernetes.io/name=promtail
kubectl logs -n akko -l app.kubernetes.io/name=promtail --tail=100 | grep -iE "error|drop|fail"
Causes fréquentes + correctif¶
| Cause | Symptôme (logs) | Correctif |
|---|---|---|
| Rate limit logs layer dépassé | per-stream rate limit exceeded |
Bump ingestion_rate_mb + ingestion_burst_size_mb dans loki values.yaml |
| Trop de streams uniques | per-user too many streams |
Réduire la cardinality des labels (voir ci-dessous) |
| Stockage object storage saturé | upload to S3 failed, no space left |
Libérer le bucket object storage loki OU rétention plus agressive |
| CPU throttling ingester | context deadline exceeded |
Bump resources.limits.cpu logs layer |
| Compactor en retard | too many small chunks |
Vérifier que le compactor tourne + ses logs |
| Mauvaise indexation | Latence requêtes élevée | Vérifier la version et la période du schema_config |
Réduire la cardinality (correctif #1 pour « too many streams »)¶
Labels à bannir de la pipeline log shipper (trop variables) :
- pod_name (change à chaque restart)
- container_id
- trace_id
- request_id
- user_id sans bucket
À préférer :
- namespace, app, component (cardinality limitée)
- level (info/warn/error — 5 valeurs max)
Correctif pérenne (R02)¶
Bump des limites logs layer¶
# monitoring/loki/values.yaml ou helm/akko/charts/akko-monitoring/.../values-loki.yaml
loki:
limits_config:
ingestion_rate_mb: 20 # était 10
ingestion_burst_size_mb: 40 # était 20
max_streams_per_user: 25000 # était 10000
retention_period: 720h # 30 jours
Puis commit + push + helm upgrade. Jamais kubectl edit configmap.
Purger les vieux logs¶
# Travail du compactor logs layer. S'il n'arrive pas à compacter, forcer :
kubectl exec -n akko deploy/akko-loki-compactor -- \
loki -config.file=/etc/loki/config.yaml -target=compactor.delete-request-cancel-period=1h
Prévention¶
- Dashboard Dashboards « logs layer Ingestion » avec panels :
- Bytes/s par tenant
- Streams par tenant
- Rate limit hits
- CPU/Mémoire de l'ingester
- PrometheusRule précoce : warning à 70 % de la limite
- Revue mensuelle des labels log shipper → détecter les nouvelles explosions de cardinality
Lessons learned¶
- L10 — Rétention logs layer 30 j en prod par défaut. logs layer n'est pas un data warehouse : les logs > 90 jours doivent aller en cold storage (object storage direct).
Liens utiles¶
- Bonnes pratiques labels logs layer
- Dashboard Dashboards / Service de supervision
- Source des limites :
monitoring/loki/values.yaml