Statistiques en temps réel
avec Matomo

Je dois admettre que j’aime savoir combien de personnes utilisent mes sites. Cependant, je ne supporte pas les trackers, et je n’imagine pas utiliser Google Analytics qui récupèrera pour son compte bien plus de données que ce qui m’intéresse.

J’apprécie particulièrement Matomo (anciemment Piwik), qui est libre, offre une interface de qualité, et un grand nombre d’options.

Par défaut, Matomo utilise un tracker javascript. Mais il propose également un script pour importer les logs du serveur, ce qui rend possible le fait d’avoir un suivi sans tracker, impossible à bloquer et plutôt fiable, avec une charge minimale pour le serveur.

La plupart du temps, ce type de scripts sont lancés une fois par jour, mais il est possible de les faire fonctionner en temps réel, sans outil compliqué comme rsyslog ou syslog-ng. Je vais ici expliquer comment le mettre en place avec des logs Nginx.

Configuration de Nginx

Tout d’abord, nous allons utiliser des logs plus lisibles et faciles à parser avec un format de type json. Dans /etc/nginx.conf, on déclare un nouveau format pour Matomo :

# /etc/nginx.conf

log_format matomo '{'
  '"ip": "$remote_addr",'
  '"host": "$host",'
  '"path": "$request_uri",'
  '"status": "$status",'
  '"referrer": "$http_referer",'
  '"user_agent": "$http_user_agent",'
  '"length": $bytes_sent,'
  '"generation_time_milli": $request_time,'
  '"date": "$time_iso8601"}';

Enfin, dans la directive server { }, on indique l’endroit où les logs du site seront stockées, et son format :

access_log /var/log/nginx/access.log matomo;

Enfin, on redémarre nginx, et on peut vérifier si les logs démarrent bien dans le bon format.

Importation des logs dans Matomo

Matomo est livré avec un petit script Python, très efficace, pour lire les logs et les importer : log-analytics/import_logs.py.

On peut utiliser logtail, qui permet, à chaque utilisation, de ne lire que ce qui n’a pas déjà été récupéré, afin d’éviter tout double compte.

On passe alors son résultat au script Python :

/usr/sbin/logtail /var/log/nginx/access.log \
     | /usr/bin/python \
          path/to/matomo/misc/log-analytics/import_logs.py
          --url=https://<your-matomo-url> \
          --enable-http-errors \
          --enable-http-redirects \
          --log-format-name=nginx_json -

Pour être reconnnu, l’hôte (le nom de domaine du site) doit être correctement renseigné dans les paramètres de Matomo. Si vous avez plusieurs sites, cela permet de les distribuer automatiquement.

Le code peut être lancé avec un timer systemd une tâche cron, par exemple chaque minute. Cela permet d’avoir l’affichage en temps réel dans Matomo.

Cependant, pour mettre à jour les graphiques et stocker les données de long terme, celles-ci doivent être archivées. Cela est fait par défaut en navigant sur Matomo depuis le navigateur, mais il est aussi possible de le désactiver pour le lancer manuellement. La commande pour archiver les données devient alors :

php path/to/matomo/console core:archive \
    --url=<your-matomo-url> \
    --force-all-websites \
    --force-date-last-n=2