{{tag>sysadmin log loki grafana todo}}
====== Visualiser les logs sous Grafana grâce à Loki ======
Plus simple et moins consommateur de ressource que la pile ELK
Apporte une visibilité des logs directement sous Grafana et permet ainsi d'obtenir un outil complet de gestion d'incidents: A partir du déclenchement d'alerte, l'opérateur peut consulter les métriques des services, accéder aux logs, visualiser les transactions (voir tracing avec Jaeger) et ainsi identifier rapidement l'origine des défaillances.
===== Architecture générale =====
* **Promtail** est un agent (ou client) qui s’exécute localement. Il est chargé de scruter les fichiers de logs et de les intégrer dans Loki en mode push.
* **Loki** est la base de donnée: Il stocke les logs.
* **Grafana** se connecte à Loki et propose une visualisation des logs.
===== Installation de Loki =====
==== Test de l'image ====
L'image docker est disponible sur le Hub à l'URL https://hub.docker.com/r/grafana/loki
Télécharger l' image docker:
docker image pull grafana/loki:2.3.0
Création d'un conteneur de test
docker run -d --name=loki-test -p 127.0.0.1:3100:3100 grafana/loki:2.3.0
Vérifier le bon fonctionnement de l'instance via les logs et via les points d'entrée exposés:
* GET /ready
* GET /metrics
* GET /config
* GET /loki/api/v1/status/buildinfo
docker container logs loki-test --follow
$ mkdir -p loki/conf
$ wget https://raw.githubusercontent.com/grafana/loki/v2.3.0/cmd/loki/loki-local-config.yaml -O loki/conf/loki-config.yaml
Création d'un réseau dédié pour Loki, seule l'application Grafana sera connectée à Loki par l'intermédiaire de ce réseau.
$ docker network create loki-net
Le docker-compose
version: "3.3"
networks:
loki-net:
external: true
loki:
image: grafana/loki:2.3.0
restart: unless-stopped
ports:
- "127.0.0.1:3100:3100/tcp"
command: -config.file=/mnt/loki-config.yaml
networks:
loki-net:
volumes:
- $PWD/loki/conf/loki-config.yaml:/mnt/loki-config.yaml:ro
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik-net"
- "traefik.http.routers.loki_http.entryPoints=HTTP"
- "traefik.http.routers.loki_http.rule=Host(`loki.phobos-net.fr`)"
- "traefik.http.routers.loki_http.middlewares=auth"
- "traefik.http.services.loki.loadbalancer.server.port=3100"
Vérifier le fonctionnement de l'instance:
http://loki.phobos-net.fr/ready
# afficher la configuration
http://loki.phobos-net.fr/config
# afficher les labels disponibles
http://loki.phobos-net.fr/loki/api/v1/labels
# pour afficher les valeurs associées au label __name__
http://loki.phobos-net.fr/loki/api/v1/label/__name__/values
Envoyer manuellement une ligne de log via cURL:
docker pull curlimages/curl:latest
# timetamp en nanosecondes utilisé par la requête
TSNS=$(date +%s)000000000
docker container run --rm --interactive --name curl_push --network loki-net curlimages/curl:latest curl -v -H "Content-Type: application/json" -XPOST -s "http://loki:3100/loki/api/v1/push" --data-raw '{"streams": [{ "stream": { "job": "dockerlogs", "container_name": "curl_push" }, "values": [ [ "'$TSNS'", "Hello Loki again" ] ] }]}'
===== Driver docker =====
Le pilote Loki pour Docker disponible sous la forme d'un plugin Docker permet à Loki de lire et d'intégrer directement les logs générés par les conteneurs Docker. Le plugin peut être configuré utiliser une instance privée de Loki ou les services cloud. Si l'on souhaite superviser les conteneurs uniquement, on peut se limiter à l'installation du plugin et ne pas utiliser Promtail.
==== Installer le pilote ====
Pour installer le driver Loki pour Docker:
$ docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
* La documentation officielle du pilote Loki pour Docker est disponible à l'URL https://grafana.com/docs/loki/latest/clients/docker-driver/
* Les détails concernant la configuration sont disponibles à l'URL https://grafana.com/docs/loki/latest/clients/docker-driver/configuration/
Ici on fait le choix d'utiliser une configuration qui définie explicitement sur le conteneur le mode de journalisation utilisée:
==== Configurer le pilote de journalisation ====
Le daemon Docker a un pilote de journalisation (logging driver) par défaut. Il est utilisé par tous les conteneurs sauf s'ils le redéfinissent explicitement. Pour configurer la journalisation vers Loki deux possibilités:
* On peut redéfinir le pilote de journalisation du conteneur. Cela permet de sélectionner les conteneurs qui envoient les logs vers Loki.
* On peut reconfigurer globalement le daemon Docker pour que le pilote de journalisation par défaut soit Loki. Dans ce cas tout conteneur ne redéfinissant pas explicitement sont pilote de journalisation transmettra les logs à Loki.
docker container run --detach --name test_loki \
--network loki-net \
--log-driver loki --log-opt loki-url="http://loki:3100/loki/api/v1/push" \
--log-opt loki-batch-size=1 \
--log-opt loki-external-labels="job=dockerlogs,environment=prod" \
busybox:latest echo "Hello Loki from lokitest container"
===== Activer le tracing via Jaeger =====
Syntaxe avec Helm:
helm upgrade --install loki loki/loki --set "loki.tracing.jaegerAgentHost=YOUR_JAEGER_AGENT_HOST"
===== Références =====
* https://grafana.com/docs/loki/latest/installation/docker/
* https://grafana.com/docs/loki/latest/clients/docker-driver/
* https://mightywomble.medium.com/using-grafana-to-visualise-syslog-files-with-loki-9a8869081fb5
* https://grafana.com/grafana/dashboards/12433
* https://blog.ruanbekker.com/blog/2020/08/13/getting-started-on-logging-with-loki-using-docker/
* https://grafana.com/docs/loki/latest/getting-started/troubleshooting/#enable-tracing-for-loki