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.
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:
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" ] ] }]}'
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.
Pour installer le driver Loki pour Docker:
$ docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
Ici on fait le choix d'utiliser une configuration qui définie explicitement sur le conteneur le mode de journalisation utilisée:
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:
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"
Syntaxe avec Helm:
helm upgrade --install loki loki/loki --set "loki.tracing.jaegerAgentHost=YOUR_JAEGER_AGENT_HOST"