Aller au contenu
Outils medium

Exporters Prometheus

14 min de lecture

Les exporters sont des adaptateurs : ils transforment une source (système, base de données, réseau…) en un endpoint /metrics que Prometheus scrappe. Ce guide vous aide à choisir le bon outil et à comprendre comment ça s’emboîte.

Flux d'un exporter : la source envoie les métriques à l'exporter qui les expose pour Prometheus

[SOURCE] → (exporter / instrumentation) → /metrics ──scrape──▶ Prometheus
  • Source : OS, DB, service réseau, application…
  • Exporter : pont qui rend la source “scrapable”
  • Prometheus : collecte, stocke, interroge, alerte
SituationSolutionPourquoi
J’ai le code de l’appInstrumentation (client libs, OTel)Métriques métier précises, moins d’approximation
Produit tiers, pas de codeExporter dédiéMySQL, PostgreSQL, Redis, Nginx
Système d’exploitationAgent (Node/Windows Exporter)CPU, RAM, disque, réseau
Vérifier la disponibilité externeBlackbox ExporterProbes HTTP, DNS, TCP, ICMP

C’est LA distinction à comprendre avant de configurer quoi que ce soit.

Un exporter = une machine/service. L’exporter tourne sur ou près de la cible.

ExempleUsage
Node ExporterMétriques système Linux
Windows ExporterMétriques système Windows

Configuration Prometheus (simple) :

scrape_configs:
- job_name: node
static_configs:
- targets: ['server1:9100', 'server2:9100']

Chaque target est directement l’exporter.

L’exporter se connecte à un service (MySQL, PostgreSQL, Redis…) via TCP + credentials, puis expose /metrics.

ExempleUsage
mysqld_exporterMySQL/MariaDB
postgres_exporterPostgreSQL
redis_exporterRedis
mongodb_exporterMongoDB

Points d’attention :

  • Droits minimum (read-only quand possible)
  • Latence de collecte → ajuster scrape_timeout
  • Cardinalité des labels

Un seul exporter peut monitorer N cibles via un paramètre target=.... C’est le pattern multi-target exporter.

ExempleUsage
Blackbox ExporterProbes HTTP, DNS, TCP, ICMP
SNMP ExporterÉquipements réseau SNMP

Pourquoi c’est différent ?

  • L’exporter ne connaît pas les cibles à l’avance
  • Prometheus passe la cible en paramètre via relabeling
  • Un seul exporter peut sonder des centaines d’URLs
IntentionOutilFamilleCe que ça mesure
Santé machine LinuxNode ExporterACPU, RAM, disque, réseau
Santé Windowswindows_exporterAPerformance counters
Disponibilité HTTP/DNS/TCP/ICMPBlackbox ExporterCProbes externes, SSL expiry
Santé MySQL/MariaDBmysqld_exporterBConnexions, requêtes, réplication
Santé PostgreSQLpostgres_exporterBConnexions, locks, bloat
Santé Redisredis_exporterBMémoire, keys, ops/sec
Métriques conteneurscAdvisor / kubeletSourceCPU, RAM, I/O par conteneur

Liste complète des exporters officiels

Le plus important : collecte les métriques système Linux.

  1. Télécharger

    Fenêtre de terminal
    cd /tmp
    VERSION="1.9.0"
    wget https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/node_exporter-${VERSION}.linux-amd64.tar.gz
  2. Installer

    Fenêtre de terminal
    tar xvfz node_exporter-${VERSION}.linux-amd64.tar.gz
    sudo cp node_exporter-${VERSION}.linux-amd64/node_exporter /usr/local/bin/
    sudo useradd --no-create-home --shell /usr/sbin/nologin node_exporter
  3. Créer le service

    /etc/systemd/system/node_exporter.service
    [Unit]
    Description=Node Exporter
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=node_exporter
    Group=node_exporter
    Type=simple
    ExecStart=/usr/local/bin/node_exporter
    Restart=always
    # Hardening
    NoNewPrivileges=true
    ProtectSystem=strict
    ProtectHome=true
    [Install]
    WantedBy=multi-user.target
  4. Démarrer

    Fenêtre de terminal
    sudo systemctl daemon-reload
    sudo systemctl enable node_exporter
    sudo systemctl start node_exporter
prometheus.yml
scrape_configs:
- job_name: 'node'
static_configs:
- targets:
- 'server1:9100'
- 'server2:9100'
MétriqueDescription
node_cpu_seconds_totalTemps CPU par mode (idle, user, system)
node_memory_MemAvailable_bytesMémoire disponible
node_filesystem_avail_bytesEspace disque disponible
node_network_receive_bytes_totalBytes reçus par interface
node_load1, node_load5, node_load15Load average
# CPU utilisé (%)
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Mémoire utilisée (%)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# Disque utilisé (%)
(1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100

Surveille la disponibilité depuis l’extérieur : HTTP, DNS, TCP, ICMP. C’est du synthetic monitoring (probes), pas de la télémétrie interne.

Blackbox ne “tourne pas sur” les cibles. Un seul Blackbox Exporter peut sonder des centaines d’URLs. La magie : Prometheus passe la cible en paramètre.

Prometheus scrappe:
GET /probe?target=https://example.com&module=http_2xx
Blackbox répond:
probe_success 1
probe_duration_seconds 0.234
Fenêtre de terminal
docker run -d \
--name blackbox_exporter \
-p 9115:9115 \
-v $(pwd)/blackbox.yml:/config/blackbox.yml:ro \
prom/blackbox-exporter:v0.25.0 \
--config.file=/config/blackbox.yml
blackbox.yml
modules:
http_2xx:
prober: http
timeout: 5s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
valid_status_codes: [200, 201, 204]
follow_redirects: true
tcp_connect:
prober: tcp
timeout: 5s
icmp:
prober: icmp
timeout: 5s
dns_resolve:
prober: dns
dns:
query_name: "example.com"
query_type: "A"

Le relabeling transforme une liste d’URLs en paramètres pour Blackbox :

prometheus.yml
scrape_configs:
- job_name: 'blackbox-http'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://example.com
- https://api.example.com/health
- https://docs.example.com
relabel_configs:
# 1. L'URL devient le paramètre ?target=
- source_labels: [__address__]
target_label: __param_target
# 2. L'URL est aussi copiée dans le label "instance"
- source_labels: [__param_target]
target_label: instance
# 3. L'adresse réelle de scrape devient Blackbox Exporter
- target_label: __address__
replacement: blackbox-exporter:9115

Ce qui se passe :

  1. Prometheus voit https://example.com dans targets
  2. Relabeling transforme en GET blackbox-exporter:9115/probe?target=https://example.com
  3. Le label instance garde l’URL d’origine pour identifier les métriques
MétriqueDescription
probe_success1 si probe réussie, 0 sinon
probe_duration_secondsDurée totale de la probe
probe_http_status_codeCode HTTP retourné
probe_ssl_earliest_cert_expiryDate d’expiration du certificat SSL
rules/blackbox.yml
groups:
- name: blackbox
rules:
- alert: EndpointDown
expr: probe_success == 0
for: 2m
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} is down"
- alert: SSLCertExpiringSoon
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
for: 1h
labels:
severity: warning
annotations:
summary: "SSL cert for {{ $labels.instance }} expires in < 30 days"
  1. Créer l’utilisateur MySQL (droits minimum)

    CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'password';
    GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
    FLUSH PRIVILEGES;
  2. Lancer l’exporter

    Fenêtre de terminal
    export DATA_SOURCE_NAME='exporter:password@(localhost:3306)/'
    ./mysqld_exporter

    Ou via Docker :

    Fenêtre de terminal
    docker run -d \
    --name mysqld_exporter \
    -p 9104:9104 \
    -e DATA_SOURCE_NAME='exporter:password@(mysql:3306)/' \
    prom/mysqld-exporter
  3. Configuration Prometheus

    - job_name: 'mysql'
    static_configs:
    - targets: ['localhost:9104']

Métriques clés :

MétriqueDescription
mysql_upMySQL accessible (1/0)
mysql_global_status_threads_connectedConnexions actives
mysql_global_status_slow_queriesRequêtes lentes
mysql_global_status_questionsRequêtes exécutées
Fenêtre de terminal
export DATA_SOURCE_NAME='postgresql://exporter:password@localhost:5432/postgres?sslmode=disable'
./postgres_exporter

Métriques clés :

MétriqueDescription
pg_upPostgreSQL accessible
pg_stat_activity_countConnexions par état
pg_stat_database_deadlocksDeadlocks
pg_stat_database_tup_fetchedLignes lues
Fenêtre de terminal
docker run -d \
--name redis_exporter \
-p 9121:9121 \
oliver006/redis_exporter:v1.58.0 \
--redis.addr=redis://localhost:6379

Pour des métriques d’un système tiers non couvert, créez un exporter.

my_exporter.py
from prometheus_client import start_http_server, Gauge
import requests
import time
# Définir les métriques
ORDERS_PENDING = Gauge('orders_pending_total', 'Pending orders count')
ORDERS_VALUE = Gauge('orders_pending_value_euros', 'Value of pending orders')
def collect_metrics():
"""Collecte depuis une API externe."""
response = requests.get('https://api.internal/orders/stats')
data = response.json()
ORDERS_PENDING.set(data['pending_count'])
ORDERS_VALUE.set(data['pending_value'])
if __name__ == '__main__':
start_http_server(8000)
print("Exporter running on :8000/metrics")
while True:
collect_metrics()
time.sleep(15)
TypeUsageExemple
CounterValeur croissante uniquementRequêtes, erreurs
GaugeMonte et descendMémoire, connexions
HistogramDistribution avec bucketsLatence
SummaryQuantiles côté clientLatence (moins recommandé)
namespace_name_unit_suffix
  • myapp_http_requests_total
  • myapp_request_duration_seconds
  • requestCount ❌ (pas de namespace, pas d’unité)
PiègeImpactSolution
/metrics exposé sans authFuite d’infosFirewall, TLS, basic auth
Trop de labelsExplosion cardinalitéLabels faible cardinalité uniquement
Scrape interval trop courtSurcharge exporter15s-60s selon criticité
Scrape timeout trop courtTargets “DOWN”Ajuster scrape_timeout
SymptômeCause probableSolution
Exporter non accessibleFirewall/réseaucurl http://exporter:port/metrics
Métriques videsPas de permissionsVérifier droits DB/système
Scrape timeoutExporter lentAugmenter scrape_timeout
Target “DOWN”DNS/réseauVérifier résolution + ping

Commandes de debug :

Fenêtre de terminal
# Vérifier l'endpoint
curl -s http://localhost:9100/metrics | head -20
# Vérifier dans Prometheus
# Status → Targets
# Pour Blackbox, tester la probe manuellement
curl "http://localhost:9115/probe?target=https://example.com&module=http_2xx"
  • 3 familles : single-target (Node), service (MySQL), multi-target (Blackbox)
  • Instrumentation > Exporter si vous avez le code
  • Blackbox = synthetic monitoring (disponibilité externe)
  • Relabeling : essentiel pour le pattern multi-target
  • Sécurité : ne jamais exposer /metrics sans protection réseau

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.