1. Introduction à Grafana Alloy
Le collecteur unifié pour l'observabilité
Qu'est-ce que Grafana Alloy ?
Le successeur de Grafana Agent
Grafana Alloy est un collecteur de télémétrie open source conçu par Grafana Labs. Il agit comme un pipeline centralisé (vendor-neutral) pour collecter, transformer et acheminer vos métriques, logs, traces et profils. Remplaçant de Grafana Agent, il intègre nativement la prise en charge complète de l'écosystème OpenTelemetry (OTel) et Prometheus.
Architecture et Composants
Comment les données circulent
Alloy est construit autour d'une architecture modulaire basée sur des composants qui se passent des données :
- Receivers / Discovery : pour découvrir les cibles (ex: pods Kubernetes) ou recevoir de la télémétrie (ex: prometheus.scrape, otelcol.receiver.otlp).
- Processors : pour filtrer, masquer des données sensibles ou regrouper des événements en batchs (ex: otelcol.processor.batch).
- Exporters : pour transférer les données vers les bases de données cibles (ex: Mimir, Loki, Tempo ou n'importe quel endpoint OTLP tiers).
2. Installation
Déployer Grafana Alloy sur votre infrastructure
Installation sur Linux (Debian/Ubuntu)
Via le gestionnaire de paquets APT
L'installation sur une distribution Debian/Ubuntu est très standard :
sudo apt-get install -y apt-transport-https software-properties-common wget
sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install alloy
Installation sur Kubernetes
Utilisation de la charte Helm officielle
Alloy est conçu pour briller dans un environnement cloud-native :
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install alloy grafana/alloy -n monitoring --create-namespace
3. Configuration (Langage River)
Syntaxe de configuration déclarative
Principes de base
Blocs et attributs
Alloy abandonne le format YAML au profit du langage River (similaire au HCL de Terraform). Il permet de chaîner les sorties d'un composant aux entrées d'un autre composant de manière explicite.
// 1. Découverte des cibles
prometheus.scrape "my_scraper" {
targets = [{"__address__" = "localhost:9090"}]
forward_to = [prometheus.remote_write.my_mimir.receiver]
}
// 2. Envoi des données (destination)
prometheus.remote_write "my_mimir" {
endpoint {
url = "http://mimir:9009/api/v1/push"
}
}
4. Pipelines de Télémétrie
Exemples concrets de configuration
Pipeline de Logs (vers Loki)
Collecter des fichiers de logs locaux
Cet exemple scrute un dossier pour y lire les logs et les transférer vers Grafana Loki.
local.file_match "app_logs" {
path_targets = [{"__path__" = "/var/log/myapp/*.log"}]
}
loki.source.file "log_scraper" {
targets = local.file_match.app_logs.targets
forward_to = [loki.write.grafana_loki.receiver]
}
loki.write "grafana_loki" {
endpoint {
url = "http://loki:3100/loki/api/v1/push"
}
}
Pipeline de Traces (OpenTelemetry)
Recevoir en OTLP et envoyer vers Tempo
Alloy peut jouer le rôle de collecteur OTel complet :
otelcol.receiver.otlp "default" {
grpc { endpoint = "0.0.0.0:4317" }
http { endpoint = "0.0.0.0:4318" }
output {
traces = [otelcol.processor.batch.default.input]
}
}
otelcol.processor.batch "default" {
output {
traces = [otelcol.exporter.otlp.tempo.input]
}
}
otelcol.exporter.otlp "tempo" {
client {
endpoint = "tempo:4317"
tls {
insecure = true
}
}
}
Pipeline de Métriques (Prometheus)
Scraper des cibles et envoyer vers Mimir
Alloy remplace efficacement Prometheus pour le scraping de métriques locales ou distantes :
prometheus.scrape "local_metrics" {
targets = [{"__address__" = "localhost:9090"}]
forward_to = [prometheus.remote_write.mimir.receiver]
scrape_interval = "15s"
}
prometheus.remote_write "mimir" {
endpoint {
url = "http://mimir:9009/api/v1/push"
}
}
Transformation de Logs (Masquage)
Modifier et anonymiser les logs à la volée
Utilisez le composant loki.process pour extraire des labels, enrichir ou masquer des données sensibles (ex: mots de passe) avant expédition :
loki.process "mask_secrets" {
forward_to = [loki.write.grafana_loki.receiver]
stage.replace {
expression = "password=[^ ]+"
replace = "password=***"
}
}
5. Problèmes Récurrents
Dépannage et résolution d'erreurs fréquentes
Erreurs de permissions sur les Logs
Impossible de lire /var/log
Symptôme : Alloy ne remonte aucun log local et ses propres logs indiquent une erreur permission denied.
Solution : Assurez-vous que l'utilisateur système alloy fait partie du groupe adm ou modifiez les ACL avec setfacl -m u:alloy:r /var/log/syslog.
Erreurs de Syntaxe River
Échec au redémarrage
Symptôme : Le service Alloy refuse de démarrer après une modification du fichier de configuration.
Solution : Utilisez toujours la commande CLI pour valider et formater avant de redémarrer le service :
alloy fmt /etc/alloy/config.river
6. Bonnes Pratiques
Optimisation et sécurité en production
Découpage des configurations
Modularisation
Au lieu de maintenir un fichier config.river géant, utilisez des modules ou un chargement par dossier (flag --run sur un répertoire). Cela simplifie la gestion GitOps et limite l'impact d'une erreur locale.
Monitorer le moniteur
Auto-surveillance
Alloy doit être surveillé. Configurez-le pour s'auto-scraper (via son point de terminaison interne) afin de suivre la consommation CPU/RAM et identifier les risques de dropping dans les composants OTel.
Sécurisation des secrets
Ne hardcodez aucun token
Utilisez des variables d'environnement (ex: sys.env("GRAFANA_API_KEY")) ou des intégrations natives avec des gestionnaires de secrets (HashiCorp Vault, AWS Secrets Manager) pour injecter vos jetons d'authentification en mémoire plutôt que de les inscrire en clair dans la configuration.