Générer des alertes depuis Loki
Avoir des logs c'est bien, les exploiter c'est mieux. Pour cela, nous pouvons générer des alertes et les remonter dans AlertManager, tout comme Prometheus.
Les différentes configuration sont valables pour le chart Helm officiel grafana/loki
Pour cela, la première étape est de link son Loki (plus particulièrement le ruler de Loki) avec son instance de Prometheus :
Helm : Ruler Configuration
loki:
rulerConfig:
evaluation_interval: 15s
enable_sharding: true
alertmanager_url: https://alertmanager.domain.tld/
enable_alertmanager_v2: true
storage:
type: local
local:
directory: /var/loki/rules
wal:
dir: "/var/loki/wal-dir"
remote_write:
enabled: true
client:
url: http://prometheus-server.dyn-tools.svc.cluster.local/api/v1/write
Dans ce bloc de configuration, nous définissons en réalité plusieurs paramètres non directement liés à AlertManager:
evaluation_interval
à 15s qui nous permet de réévaluer les records toutes les 15 secondes et de les envoyer à notre Prometheusenable_sharding
car nous disposons de plusieurs instances du ruleralertmanager_url
qui nous indique où envoyer les alertesenable_alertmanager_v2
car nous utilisons un AlertManager récent :)storage
et subéquent car nous utilisons des règles locales.- Dans un monde optimal, nous aurions du utiliser un backed remote type S3
wal.dir
le chart Helm a un bug qui nous force à override la valeurremote_write
et subséquent pour envoyer nos records à Prometheus (ou VictoriaMetrics...)
Nous avons maintenant besoin de créer les règles Loki et différents éléments liés à Kubernetes dans un fichier loki-rules.yaml
:
Helm: loki-rules.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: loki-alerting-rules
labels:
release: monitoring-metrics
data:
rules.yaml: |
groups:
- name: BusinessAlarms
rules:
- record: overview:nodebidder:aerospike_error:sum_rate
expr: sum(rate({host=~"node-bidder-.*"} |~ "AEROSPIKE_ERROR"[1m])) by (pop)
- alert: AnalyzePipeLastHour
expr: (count_over_time({job="monitoring_business"} |= "last_hour_vs_last_6_hours,last_hour_vs_last_12_hours" | json result_code,task | result_code!=0 [1m])) > 0
for: 2m
labels:
severity: critical
destination: monitoring-backend
annotations:
summary: "`Analyze Pipe Last Hour` @ `{{ $labels.pop }}` has issues"
description: "`Analyze Pipe Last Hour` @ `{{ $labels.pop }}` has issues, please check Logs if you want more hints"
url_grafana: "https://grafana.domain.tld/d/8WbuKiBVz/monitoring-tasks-logs?orgId=1&var-tasks={{ $labels.task }}"
Vous pouvez le voir, tel que Prometheus, Loki peut gérer les records et les alertes
Comme d'habitude sur K8S, nous appliquons notre manifest
Pour appliquer les updates de rules, nous devons faire un rolling restart du statefulset loki-backend
Enfin, nous montons les différents volumes