Publié le : 28/10/2024 à 09:00 Vues : 565

Un guide de référence complet sur tous les composants disponibles dans Grafana Alloy, organisé par catégorie (Loki, Prometheus, OpenTelemetry, etc.) pour vous aider à construire vos pipelines d'observabilité.

1. Introduction aux Composants Alloy

Les composants sont les briques de base de tout pipeline Grafana Alloy. Chaque bloc de configuration dans un fichier `.river` définit un composant. Ces composants sont interconnectés pour former un graphe de traitement de données (DAG), où la sortie (export) d'un composant sert d'entrée (argument) à un autre.

2. Composants `loki`

Composants dédiés à la collecte, au traitement et à l'envoi de logs vers Grafana Loki.

loki.source.file

Lit les nouvelles lignes (tail) de fichiers locaux. C'est l'équivalent de Promtail.

Exemple de configuration :

loki.source.file "default" {
  targets    = local.file_match.logs.targets
  forward_to = [loki.write.local.receiver]
}

loki.source.journal

Lit les logs directement depuis le journal systemd (journald) sur les systèmes Linux.

Exemple de configuration :

loki.source.journal "default" {
  forward_to = [loki.write.local.receiver]
}

loki.source.docker

Lit les logs directement depuis le daemon Docker.

Exemple de configuration :

loki.source.docker "default" {
  host       = "unix:///var/run/docker.sock"
  targets    = discovery.docker.local.targets
  forward_to = [loki.write.local.receiver]
}

loki.source.kubernetes

Lit les logs des pods d'un cluster Kubernetes.

Exemple de configuration :

loki.source.kubernetes "default" {
  targets    = discovery.kubernetes.pods.targets
  forward_to = [loki.write.local.receiver]
}

loki.source.syslog

Agit comme un serveur Syslog pour recevoir des logs envoyés sur le réseau.

Exemple de configuration :

loki.source.syslog "default" {
  listener {
    address  = "0.0.0.0:514"
    protocol = "tcp"
  }
  forward_to = [loki.write.local.receiver]
}

loki.source.windowsevent

Collecte les événements du journal d'événements Windows.

Exemple de configuration :

loki.source.windowsevent "default" {
  eventlog_name = "Application"
  forward_to    = [loki.write.local.receiver]
}

loki.source.kafka

Consomme des messages depuis un ou plusieurs topics Kafka.

Exemple de configuration :

loki.source.kafka "default" {
  brokers    = ["kafka:9092"]
  topics     = ["logs"]
  forward_to = [loki.write.local.receiver]
}

loki.source.gcplog

Récupère les logs depuis Google Cloud Logging.

Exemple de configuration :

loki.source.gcplog "default" {
  project_id   = "my-project"
  subscription = "my-sub"
  forward_to   = [loki.write.local.receiver]
}

loki.source.podlogs

Collecte les logs des pods Kubernetes en utilisant l'API native kubelet podLogs (alternative moderne à `loki.source.kubernetes`).

Exemple de configuration :

loki.source.podlogs "default" {
  targets    = discovery.kubernetes.pods.targets
  forward_to = [loki.write.local.receiver]
}

loki.source.api

Reçoit des logs directement via une API HTTP basique.

Exemple de configuration :

loki.source.api "default" {
  http {
    listen_address = "0.0.0.0:9999"
  }
  forward_to = [loki.write.local.receiver]
}

loki.source.cloudflare

Agit comme un serveur HTTP pour recevoir les logs envoyés par Cloudflare Logpush.

Exemple de configuration :

loki.source.cloudflare "default" {
  listen_address = "0.0.0.0:8080"
  forward_to     = [loki.write.local.receiver]
}

loki.source.awsfirehose

Reçoit les logs poussés par AWS Kinesis Data Firehose.

Exemple de configuration :

loki.source.awsfirehose "default" {
  http {
    listen_address = "0.0.0.0:8080"
  }
  forward_to = [loki.write.local.receiver]
}

loki.source.azure_event_hubs

Consomme des logs depuis un Azure Event Hub.

Exemple de configuration :

loki.source.azure_event_hubs "default" {
  fully_qualified_namespace = "my-namespace.servicebus.windows.net"
  event_hub                 = "my-hub"
  forward_to                = [loki.write.local.receiver]
}

loki.process

Applique une série d'étapes de traitement (stages) pour parser, transformer ou filtrer les logs (ex: parser du JSON, extraire des labels avec une regex).

Exemple de configuration :

loki.process "default" {
  forward_to = [loki.write.local.receiver]
  stage.json {
    expressions = { "level" = "level" }
  }
}

loki.relabel

Modifie les labels d'un flux de logs avant de l'envoyer à Loki.

Exemple de configuration :

loki.relabel "default" {
  forward_to = [loki.write.local.receiver]
  rule {
    action        = "keep"
    source_labels = ["app"]
    regex         = "myapp"
  }
}

loki.write

Envoie les logs traités vers une instance Grafana Loki.

Exemple de configuration :

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

3. Composants `prometheus`

Composants pour le scraping, le traitement et l'envoi de métriques au format Prometheus.

prometheus.scrape

Scrape (collecte) les métriques d'un ou plusieurs endpoints HTTP au format Prometheus.

Exemple de configuration :

// Scrape une cible statique toutes les 15 secondes
prometheus.scrape "default" {
  targets = [{"__address__" = "localhost:9090"}]
  forward_to = [prometheus.remote_write.mimir.receiver]
  scrape_interval = "15s"
}

prometheus.relabel

Ré-étiquette (relabel) les métriques avant leur ingestion.

Exemple de configuration :

prometheus.relabel "default" {
  forward_to = [prometheus.remote_write.local.receiver]
  rule {
    action        = "drop"
    source_labels = ["__name__"]
    regex         = "up"
  }
}

prometheus.remote_write

Envoie les métriques collectées vers un backend compatible Prometheus Remote Write (comme Mimir, Thanos ou VictoriaMetrics).

Exemple de configuration :

prometheus.remote_write "local" {
  endpoint {
    url = "http://mimir:9009/api/v1/push"
  }
}

prometheus.receive_http

Agit comme un endpoint qui accepte les requêtes `remote_write` d'autres agents Prometheus.

Exemple de configuration :

prometheus.receive_http "default" {
  forward_to = [prometheus.remote_write.local.receiver]
}

prometheus.rule

Évalue des règles d'enregistrement (recording rules) ou d'alerting Prometheus.

Exemple de configuration :

prometheus.rule "default" {
  rule_path  = "/etc/alloy/rules"
  forward_to = [prometheus.alertmanager.local.receiver]
}

prometheus.alertmanager

Gère le cycle de vie des alertes (groupage, inhibition, routage) générées par `prometheus.rule`.

Exemple de configuration :

prometheus.alertmanager "local" {
  endpoints = ["http://alertmanager:9093"]
}

prometheus.exporter.unix

Collecte les métriques d'un système Linux ou Unix (équivalent de `node_exporter`).

Exemple de configuration avec le module textfile :

// Active l'exportateur unix avec des collecteurs spécifiques
prometheus.exporter.unix "default" {
  enable_collectors = ["cpu", "meminfo", "textfile"]
  // Configure le dossier pour le module textfile
  textfile {
    directory = "/var/lib/node_exporter/textfile_collector"
  }
}

prometheus.exporter.windows

Collecte les métriques d'un système Windows (équivalent de `windows_exporter`).

Exemple de configuration :

prometheus.exporter.windows "default" {
  enable_collectors = ["cpu", "cs", "logical_disk"]
}

prometheus.exporter.blackbox

Sonde des endpoints (HTTP, TCP, ICMP) pour des tests de disponibilité.

Exemple de configuration :

prometheus.exporter.blackbox "default" {
  config_file = "/etc/blackbox.yml"
  targets = [{
    name    = "example.com",
    address = "https://example.com"
  }]
}

prometheus.exporter.consul

Expose les métriques de santé d'un cluster Consul.

Exemple de configuration :

prometheus.exporter.consul "default" {
  server = "http://localhost:8500"
}

prometheus.exporter.postgres

Collecte les métriques d'une base de données PostgreSQL.

Exemple de configuration :

prometheus.exporter.postgres "default" {
  data_source_names = ["postgresql://user:pass@localhost:5432/db?sslmode=disable"]
}

prometheus.exporter.mysql

Collecte les métriques d'une base de données MySQL ou MariaDB.

Exemple de configuration :

prometheus.exporter.mysql "default" {
  data_source_name = "user:pass@(localhost:3306)/"
}

prometheus.exporter.self

Expose les métriques de santé et de performance internes de Grafana Alloy lui-même.

Exemple de configuration :

// Active l'exportateur interne d'Alloy
prometheus.exporter.self "default" {}

// Scrape les métriques générées par l'exportateur interne
prometheus.scrape "scrape_alloy" {
  targets    = prometheus.exporter.self.default.targets
  forward_to = [prometheus.remote_write.mimir.receiver]
}

prometheus.exporter.redis

Collecte les métriques d'une instance Redis.

Exemple de configuration :

prometheus.exporter.redis "default" {
  redis_addr = "redis:6379"
}

prometheus.exporter.elasticsearch

Collecte les métriques d'un cluster Elasticsearch.

Exemple de configuration :

prometheus.exporter.elasticsearch "default" {
  address = "http://elasticsearch:9200"
}

prometheus.exporter.mongodb

Collecte les métriques d'un serveur MongoDB.

Exemple de configuration :

prometheus.exporter.mongodb "default" {
  mongodb_uri = "mongodb://user:pass@mongodb:27017"
}

prometheus.exporter.kafka

Collecte les métriques d'un cluster Apache Kafka.

Exemple de configuration :

prometheus.exporter.kafka "default" {
  kafka_uris = ["kafka:9092"]
}

prometheus.exporter.memcached

Collecte les métriques d'un serveur Memcached.

Exemple de configuration :

prometheus.exporter.memcached "default" {
  address = "memcached:11211"
}

prometheus.exporter.snmp

Collecte des métriques depuis des équipements réseau en utilisant le protocole SNMP.

Exemple de configuration :

prometheus.exporter.snmp "default" {
  targets = [{
    name    = "router",
    address = "192.168.1.1",
    module  = "if_mib"
  }]
}

prometheus.exporter.cadvisor

Expose des métriques sur les conteneurs en cours d'exécution (utilisation CPU, mémoire, cgroups).

Exemple de configuration :

prometheus.exporter.cadvisor "default" {
  docker_host = "unix:///var/run/docker.sock"
}

prometheus.exporter.github

Collecte les métriques de dépôts et d'actions GitHub.

Exemple de configuration :

prometheus.exporter.github "default" {
  api_token = sys.env("GITHUB_TOKEN")
  repositories = ["grafana/alloy"]
}

4. Composants `prometheus.operator`

Composants permettant d'interagir nativement avec les Custom Resources (CRDs) du Prometheus Operator dans Kubernetes.

prometheus.operator.podmonitors

Découvre et scrape automatiquement les cibles définies via la Custom Resource (CRD) PodMonitor de Kubernetes.

Exemple de configuration :

prometheus.operator.podmonitors "default" {
  forward_to = [prometheus.remote_write.mimir.receiver]
}

prometheus.operator.servicemonitors

Découvre et scrape les cibles définies via la Custom Resource ServiceMonitor.

Exemple de configuration :

prometheus.operator.servicemonitors "default" {
  forward_to = [prometheus.remote_write.mimir.receiver]
}

prometheus.operator.probes

Découvre et exécute les vérifications Blackbox définies via la Custom Resource Probe.

Exemple de configuration :

prometheus.operator.probes "default" {
  forward_to = [prometheus.remote_write.mimir.receiver]
}

5. Composants `otelcol` (OpenTelemetry)

Composants issus de l'OpenTelemetry Collector, permettant une interopérabilité totale avec l'écosystème OTLP.

otelcol.receiver.otlp

Accepte des métriques, logs et traces via le protocole natif OpenTelemetry (gRPC ou HTTP).

Exemple de configuration :

otelcol.receiver.otlp "default" {
  grpc { endpoint = "0.0.0.0:4317" }
  http { endpoint = "0.0.0.0:4318" }
  output {
    metrics = [otelcol.processor.batch.default.input]
  }
}

otelcol.receiver.jaeger

Accepte des traces au format Jaeger.

Exemple de configuration :

otelcol.receiver.jaeger "default" {
  protocols {
    grpc { endpoint = "0.0.0.0:14250" }
  }
  output {
    traces = [otelcol.processor.batch.default.input]
  }
}

otelcol.receiver.zipkin

Accepte des traces au format Zipkin.

Exemple de configuration :

otelcol.receiver.zipkin "default" {
  endpoint = "0.0.0.0:9411"
  output {
    traces = [otelcol.processor.batch.default.input]
  }
}

otelcol.receiver.kafka

Consomme des données de télémétrie depuis un topic Kafka.

Exemple de configuration :

otelcol.receiver.kafka "default" {
  brokers          = ["kafka:9092"]
  protocol_version = "2.0.0"
  output {
    logs = [otelcol.processor.batch.default.input]
  }
}

otelcol.receiver.filelog

Lit des logs depuis des fichiers locaux (similaire à `loki.source.file` mais au format OTLP).

Exemple de configuration :

otelcol.receiver.filelog "default" {
  include = ["/var/log/*.log"]
  output {
    logs = [otelcol.processor.batch.default.input]
  }
}

otelcol.receiver.prometheus

Accepte des requêtes `remote_write` au format Prometheus.

Exemple de configuration :

otelcol.receiver.prometheus "default" {
  output {
    metrics = [otelcol.processor.batch.default.input]
  }
}

otelcol.processor.attributes

Ajoute, modifie ou supprime des attributs sur les données de télémétrie.

Exemple de configuration :

otelcol.processor.attributes "default" {
  action {
    action = "insert"
    key    = "env"
    value  = "prod"
  }
  output {
    traces = [otelcol.exporter.otlp.default.input]
  }
}

otelcol.processor.batch

Regroupe les données en lots (batches) avant de les envoyer, pour optimiser le débit réseau.

Exemple de configuration :

otelcol.processor.batch "default" {
  timeout         = "1s"
  send_batch_size = 1000
  output {
    metrics = [otelcol.exporter.otlp.default.input]
  }
}

otelcol.processor.memory_limiter

Empêche Alloy de consommer trop de mémoire en cas de surcharge.

Exemple de configuration :

otelcol.processor.memory_limiter "default" {
  check_interval = "1s"
  limit_mib      = 1000
  output {
    metrics = [otelcol.processor.batch.default.input]
  }
}

otelcol.processor.tail_sampling

Échantillonne les traces en se basant sur des politiques (ex: ne garder que les traces en erreur).

Exemple de configuration :

otelcol.processor.tail_sampling "default" {
  policy {
    name = "errors"
    type = "status_code"
    status_code { status_codes = ["ERROR"] }
  }
  output {
    traces = [otelcol.exporter.otlp.default.input]
  }
}

otelcol.processor.transform

Applique des transformations puissantes aux données de télémétrie en utilisant le langage OTTL (OpenTelemetry Transform Language).

Exemple de configuration :

otelcol.processor.transform "default" {
  error_mode = "ignore"
  trace_statements = [
    "set(resource.attributes[\"env\"], \"prod\")"
  ]
  output {
    traces = [otelcol.exporter.otlp.default.input]
  }
}

otelcol.processor.resourcedetection

Détecte automatiquement les informations sur l'environnement d'exécution (Cloud provider, OS, Kubernetes) et les ajoute comme attributs.

Exemple de configuration :

otelcol.processor.resourcedetection "default" {
  detectors = ["env", "system"]
  output {
    traces = [otelcol.exporter.otlp.default.input]
  }
}

otelcol.processor.probabilistic_sampler

Échantillonne les traces avec une probabilité fixe, utile pour réduire le volume de données à grande échelle.

Exemple de configuration :

otelcol.processor.probabilistic_sampler "default" {
  sampling_percentage = 10
  output {
    traces = [otelcol.exporter.otlp.default.input]
  }
}

otelcol.exporter.otlp

Envoie des données de télémétrie à un backend compatible OTLP over gRPC (Port par défaut : 4317).

Exemple de configuration :

otelcol.exporter.otlp "default" {
  client {
    endpoint = "tempo:4317"
  }
}

otelcol.exporter.otlphttp

Envoie des données de télémétrie à un backend compatible OTLP over HTTP (Port par défaut : 4318).

Exemple de configuration :

otelcol.exporter.otlphttp "default" {
  client {
    endpoint = "http://mimir:8080/otlp"
  }
}

otelcol.exporter.loki

Convertit et envoie des logs OTLP vers Grafana Loki.

Exemple de configuration :

otelcol.exporter.loki "default" {
  forward_to = [loki.write.local.receiver]
}

otelcol.exporter.prometheus

Expose des métriques OTLP sur un endpoint scrapable par Prometheus.

Exemple de configuration :

otelcol.exporter.prometheus "default" {
  forward_to = [prometheus.remote_write.local.receiver]
}

otelcol.auth.basic

Gère l'authentification `Basic Auth` (utilisateur/mot de passe).

Exemple de configuration :

otelcol.auth.basic "default" {
  username = "admin"
  password = "password"
}

otelcol.auth.bearer

Gère l'authentification par jeton (Bearer Token).

Exemple de configuration :

otelcol.auth.bearer "default" {
  token = "my-secret-token"
}

otelcol.auth.oauth2

Gère l'authentification via le protocole OAuth2.

Exemple de configuration :

otelcol.auth.oauth2 "default" {
  client_id     = "my-client"
  client_secret = "secret"
  token_url     = "https://example.com/oauth2/token"
}

6. Composants `discovery`

Composants pour la découverte dynamique de cibles à superviser dans des environnements changeants.

discovery.kubernetes

Découvre automatiquement les pods, services, endpoints et ingresses dans un cluster Kubernetes.

Exemple de configuration :

discovery.kubernetes "pods" {
  role = "pod"
}

discovery.docker

Découvre les conteneurs Docker qui tournent sur la machine locale.

Exemple de configuration :

discovery.docker "local" {
  host = "unix:///var/run/docker.sock"
}

discovery.ec2

Découvre les instances EC2 dans un compte AWS.

Exemple de configuration :

discovery.ec2 "default" {
  region = "eu-west-1"
}

discovery.gce

Découvre les instances de VM dans Google Cloud Engine.

Exemple de configuration :

discovery.gce "default" {
  project = "my-gcp-project"
  zone    = "europe-west1-b"
}

discovery.azure

Découvre les machines virtuelles dans Microsoft Azure.

Exemple de configuration :

discovery.azure "default" {
  subscription_id = "my-sub-id"
}

discovery.consul

Découvre les services enregistrés dans un cluster HashiCorp Consul.

Exemple de configuration :

discovery.consul "default" {
  server = "localhost:8500"
}

discovery.dns

Découvre des cibles via des enregistrements DNS (A, AAAA, SRV).

Exemple de configuration :

discovery.dns "default" {
  names = ["example.com"]
  type  = "A"
}

discovery.file

Lit une liste de cibles depuis un fichier JSON ou YAML.

Exemple de configuration :

discovery.file "default" {
  files = ["/etc/alloy/targets.json"]
}

discovery.http

Découvre des cibles en interrogeant un endpoint HTTP.

Exemple de configuration :

discovery.http "default" {
  url = "http://example.com/targets"
}

discovery.process

Découvre des processus en cours d'exécution sur la machine locale.

Exemple de configuration :

discovery.process "default" {
  discover_all = true
}

discovery.relabel

Applique des règles de ré-étiquetage sur les cibles découvertes.

Exemple de configuration :

discovery.relabel "default" {
  targets = discovery.kubernetes.pods.targets
  rule {
    action        = "keep"
    source_labels = ["__meta_kubernetes_pod_label_app"]
    regex         = "myapp"
  }
}

discovery.digitalocean

Découvre les instances (Droplets) dans DigitalOcean.

Exemple de configuration :

discovery.digitalocean "default" {
  bearer_token = sys.env("DO_TOKEN")
}

discovery.linode

Découvre les instances dans Linode.

Exemple de configuration :

discovery.linode "default" {
  bearer_token = sys.env("LINODE_TOKEN")
}

discovery.scaleway

Découvre les ressources dans Scaleway (ex: instances, baremetal).

Exemple de configuration :

discovery.scaleway "default" {
  project_id = "my-project-id"
  access_key = sys.env("SCW_ACCESS_KEY")
  secret_key = sys.env("SCW_SECRET_KEY")
}

discovery.nomad

Découvre les services et applications fonctionnant dans un cluster HashiCorp Nomad.

Exemple de configuration :

discovery.nomad "default" {
  server = "http://nomad.service.consul:4646"
}

7. Composants `pyroscope`

Composants pour la collecte et l'envoi de profils de performance en continu vers Grafana Pyroscope.

pyroscope.scrape

Collecte des profils de performance depuis des endpoints compatibles pprof (le format standard de Go).

Exemple de configuration :

pyroscope.scrape "default" {
  targets    = [{"__address__" = "localhost:8080"}]
  forward_to = [pyroscope.write.local.receiver]
}

pyroscope.write

Envoie les profils collectés vers une instance Grafana Pyroscope.

Exemple de configuration :

pyroscope.write "local" {
  endpoint {
    url = "http://pyroscope:4040"
  }
}

pyroscope.ebpf

Collecte des profils de performance (CPU) d'applications Linux en utilisant eBPF, sans nécessiter d'instrumentation dans le code.

Exemple de configuration :

pyroscope.ebpf "default" {
  forward_to = [pyroscope.write.local.receiver]
  targets    = discovery.process.local.targets
}

8. Composants `beyla` et `faro`

Composants pour l'auto-instrumentation et la collecte de télémétrie front-end.

beyla.ebpf

Utilise eBPF pour auto-instrumenter des applications (Go, C++, Rust...) sans modifier leur code, afin de générer des traces et des métriques (RED : Rate, Errors, Duration).

Exemple de configuration :

beyla.ebpf "default" {
  open_port = 8080
  output {
    traces = [otelcol.exporter.otlp.default.input]
  }
}

faro.receiver

Agit comme un point de collecte pour les signaux envoyés par le SDK Grafana Faro (Real User Monitoring pour le front-end).

Exemple de configuration :

faro.receiver "default" {
  server {
    listen_address = "0.0.0.0:12347"
  }
  output {
    logs = [loki.write.local.receiver]
  }
}

9. Composants Utilitaires

Composants génériques pour la manipulation de fichiers, de chaînes de caractères et la communication HTTP.

local.file_match

Découvre des fichiers sur le système de fichiers local en se basant sur un pattern. Utile pour alimenter `loki.source.file`.

Exemple de configuration :

local.file_match "logs" {
  path_targets = [{"__path__" = "/var/log/*.log"}]
}

local.file

Lit le contenu d'un fichier sur le disque et l'expose comme une chaîne de caractères.

Exemple de configuration :

local.file "secret" {
  filename  = "/etc/secret.txt"
  is_secret = true
}

remote.http

Récupère le contenu d'une ressource distante via HTTP.

Exemple de configuration :

remote.http "config" {
  url            = "http://example.com/config.json"
  poll_frequency = "5m"
}

remote.vault

Récupère et renouvelle dynamiquement des secrets depuis HashiCorp Vault.

Exemple de configuration :

remote.vault "db_credentials" {
  server = "http://vault:8200"
  path   = "secret/data/db"
  auth {
    token = sys.env("VAULT_TOKEN")
  }
}

remote.kubernetes.secret

Lit et met à jour dynamiquement des secrets depuis l'API Kubernetes.

Exemple de configuration :

remote.kubernetes.secret "api_keys" {
  name      = "my-secret"
  namespace = "default"
}

remote.kubernetes.configmap

Lit et met à jour dynamiquement le contenu de ConfigMaps Kubernetes.

Exemple de configuration :

remote.kubernetes.configmap "app_config" {
  name      = "my-configmap"
  namespace = "default"
}

remote.s3

Télécharge périodiquement le contenu d'un objet (ex: fichier de configuration) depuis un bucket S3.

Exemple de configuration :

remote.s3 "targets" {
  endpoint = "s3.eu-west-1.amazonaws.com"
  bucket   = "my-configs"
  path     = "targets.json"
  key      = sys.env("AWS_ACCESS_KEY")
  secret   = sys.env("AWS_SECRET_KEY")
}
Lien copié dans le presse-papiers !