Table des matières

, , , ,

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

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:

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

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:

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