Publié le : 25/05/2024 à 10:00

Découvrez comment configurer Grafana Alloy pour superviser le serveur sur lequel il s'exécute, avec un focus sur les méthodes de configuration (UI vs Code) et leurs impacts.

1. Introduction

Superviser l'hôte local

Le besoin

Pourquoi collecter en local ?

Bien que Grafana Alloy excelle dans le routage de télémétrie distante, sa première utilité est souvent de superviser la machine sur laquelle il est installé. Alloy embarque nativement des intégrations (similaires à node_exporter ou promtail) pour collecter l'utilisation CPU/RAM, l'espace disque, et lire les fichiers de logs systèmes (comme /var/log/syslog) ou ses propres logs de fonctionnement.

2. L'approche par l'interface Web (UI)

Simple mais fortement déconseillée en production

Le piège de la facilité

Add Connection -> Linux

Dans Grafana (et particulièrement Grafana Cloud), vous disposez d'un menu Connections > Add new connection qui propose de configurer un serveur Linux en quelques clics. L'interface génère alors une longue commande Bash à copier-coller sur votre serveur, qui installe Alloy et télécharge une configuration River générée automatiquement.

Pourquoi l'éviter ?

Les limites de l'assistant

Bien que cette méthode soit idéale pour un test rapide (PoC), elle présente des risques majeurs en entreprise :

  • Absence de versionning (GitOps) : La configuration échappe à votre contrôle de version (Git). Si quelqu'un modifie la configuration depuis l'UI, vous créez une dérive (configuration drift).
  • Opacité : Le script installe et configure des composants implicitement. En cas d'erreur de parsing ou de droits, le dépannage est complexe.
  • Incompatibilité avec l'automatisation : En production, le déploiement doit être industrialisé via Ansible, Terraform, ou Helm, ce que l'assistant graphique rend obsolète.

3. L'approche "Configuration as Code" (River)

La méthode recommandée

Collecter les métriques système (CPU, RAM...)

Utilisation de prometheus.exporter.unix

Alloy intègre un équivalent de node_exporter. Pour collecter les métriques locales et les envoyer vers Mimir ou Prometheus, ajoutez ce bloc :

// 1. Activation de l'exportateur système
prometheus.exporter.unix "local_system" {
  enable_collectors = ["cpu", "meminfo", "diskstats", "netdev"]
}

// 2. Scraping des métriques exposées en local
prometheus.scrape "scrape_system" {
  targets    = prometheus.exporter.unix.local_system.targets
  forward_to = [prometheus.remote_write.mimir.receiver]
  scrape_interval = "15s"
}

// 3. Point de destination
prometheus.remote_write "mimir" {
  endpoint {
    url = "http://mon-mimir:9009/api/v1/push"
  }
}

Collecter les logs du système

Fichiers locaux vers Loki

Pour collecter les logs classiques d'un système Linux (auth.log, syslog) :

local.file_match "system_logs" {
  path_targets = [
    {"__path__" = "/var/log/syslog"},
    {"__path__" = "/var/log/auth.log"}
  ]
}

loki.source.file "read_logs" {
  targets    = local.file_match.system_logs.targets
  forward_to = [loki.write.loki_endpoint.receiver]
}

loki.write "loki_endpoint" {
  endpoint {
    url = "http://mon-loki:3100/loki/api/v1/push"
  }
}

Note : Assurez-vous que l'utilisateur système alloy a les droits de lecture sur /var/log (ex: via le groupe adm).

Auto-supervision : Les logs d'Alloy

Surveiller le collecteur lui-même

Si Alloy est lancé en tant que service systemd, la méthode la plus robuste pour récupérer ses propres logs et détecter s'il a des problèmes est de lire journald :

loki.source.journal "alloy_journal" {
  format_as_json = true
  max_age = "12h"
  forward_to = [loki.write.loki_endpoint.receiver]
  relabel_rules = discovery.relabel.journal_filter.rules
}

discovery.relabel "journal_filter" {
  // Ne garder que les logs du service systemd "alloy"
  rule {
    source_labels = ["__journal__systemd_unit"]
    regex         = "alloy\\.service"
    action        = "keep"
  }
  // Renommer le label pour Loki
  rule {
    source_labels = ["__journal__systemd_unit"]
    target_label  = "unit"
  }
}

4. Conclusion

Les bénéfices du code

La maîtrise totale

Ce qu'il faut retenir

En écrivant vous-même vos fichiers .river plutôt qu'en utilisant l'interface génératrice de Grafana, vous comprenez exactement quel composant fait quoi. Cela vous permet :

  • D'isoler facilement un problème si la consommation CPU d'Alloy explose.
  • De versionner votre configuration sur Git.
  • De la déployer dynamiquement avec des outils comme Ansible en remplaçant les endpoints (Mimir/Loki) par des variables propres à chaque environnement.

Lien copié dans le presse-papiers !