Aller au contenu
Outils medium

Configuration de Prometheus

12 min de lecture

Ce guide vous accompagne pour configurer Prometheus de manière efficace. Vous apprendrez à définir vos targets, utiliser le service discovery et configurer les règles d’alerte.

Le fichier prometheus.yml est le cœur de la configuration. Il se divise en plusieurs sections.

prometheus.yml
# Paramètres globaux
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: production
region: eu-west-1
# Fichiers de règles d'alerte
rule_files:
- "rules/*.yml"
# Configuration Alertmanager
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
# Configuration du scraping
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']

La section global définit les paramètres par défaut pour tous les jobs.

global:
scrape_interval: 15s # Intervalle de scraping par défaut
scrape_timeout: 10s # Timeout par requête de scraping
evaluation_interval: 15s # Intervalle d'évaluation des règles
external_labels: # Labels ajoutés à toutes les métriques
cluster: production
env: prod
ParamètreDescriptionValeur recommandée
scrape_intervalFréquence de collecte15s à 60s
scrape_timeoutTimeout HTTP< scrape_interval
evaluation_intervalÉvaluation des alertes= scrape_interval
external_labelsLabels globauxcluster, env, region

C’est ici que vous définissez quoi scraper. Chaque job représente un groupe de targets similaires.

La méthode la plus simple : lister les targets manuellement.

scrape_configs:
- job_name: 'node-exporter'
static_configs:
- targets:
- 'server1:9100'
- 'server2:9100'
- 'server3:9100'
labels:
datacenter: paris

Les labels ajoutés ici seront présents sur toutes les métriques collectées.

Chaque job peut surcharger les paramètres globaux :

scrape_configs:
- job_name: 'slow-endpoints'
scrape_interval: 60s # Surcharge le global
scrape_timeout: 30s
metrics_path: /metrics # Chemin par défaut
scheme: https # http ou https
basic_auth:
username: prometheus
password_file: /etc/prometheus/password
static_configs:
- targets: ['api.example.com:443']
ParamètreDescriptionDéfaut
scrape_intervalIntervalle spécifique au jobglobal
metrics_pathChemin de l’endpoint/metrics
schemeProtocole HTTP(S)http
basic_authAuthentification HTTP Basic-
bearer_token_fileToken pour auth Bearer-
tls_configConfiguration TLS-

Le service discovery permet à Prometheus de découvrir automatiquement les targets dans des environnements dynamiques.

Le plus courant en production. Prometheus découvre les pods, services et nodes.

scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
# Garder uniquement les pods avec l'annotation prometheus.io/scrape
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
# Utiliser le port de l'annotation
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: (.+)
replacement: $1

Rôles disponibles pour Kubernetes :

RoleDécouvre
nodeLes nodes du cluster
podLes pods (toutes annotations)
serviceLes services Kubernetes
endpointsLes endpoints de services
endpointsliceEndpointSlices (K8s 1.21+)
ingressLes ingress

Pour les environnements non-Kubernetes utilisant Consul.

scrape_configs:
- job_name: 'consul-services'
consul_sd_configs:
- server: 'consul.example.com:8500'
services: [] # Tous les services
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*,prometheus,.*
action: keep

Utile pour le provisionning dynamique sans service discovery.

scrape_configs:
- job_name: 'file-based'
file_sd_configs:
- files:
- '/etc/prometheus/targets/*.json'
refresh_interval: 5m
/etc/prometheus/targets/nodes.json
[
{
"targets": ["server1:9100", "server2:9100"],
"labels": {
"env": "production",
"team": "infra"
}
}
]

L’avantage : vous pouvez générer ces fichiers avec Ansible, Terraform ou un script.

Le relabeling est une fonctionnalité puissante qui permet de transformer les labels avant le stockage.

  • relabel_configs : appliqué avant le scraping (modifie les targets)
  • metric_relabel_configs : appliqué après le scraping (modifie les métriques)
ActionDescription
replaceRemplace un label par une valeur
keepGarde uniquement les targets matchant
dropSupprime les targets matchant
labelmapRenomme des labels par regex
labeldropSupprime des labels par regex
labelkeepGarde uniquement certains labels

Renommer un label :

relabel_configs:
- source_labels: [__meta_kubernetes_pod_node_name]
target_label: node

Filtrer les targets :

relabel_configs:
- source_labels: [__meta_kubernetes_namespace]
action: keep
regex: production|staging

Extraire d’un label :

relabel_configs:
- source_labels: [__address__]
regex: '(.+):.*'
replacement: '$1'
target_label: instance

Supprimer des métriques inutiles :

metric_relabel_configs:
- source_labels: [__name__]
regex: 'go_.*' # Supprime les métriques Go runtime
action: drop

Les règles définissent les conditions qui déclenchent des alertes.

Référencez vos fichiers de règles dans prometheus.yml :

rule_files:
- "rules/infrastructure.yml"
- "rules/applications.yml"
rules/infrastructure.yml
groups:
- name: node-alerts
interval: 30s # Surcharge evaluation_interval
rules:
- alert: HighCPU
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
team: infra
annotations:
summary: "High CPU on {{ $labels.instance }}"
description: "CPU usage is {{ $value | printf \"%.1f\" }}%"
runbook_url: "https://wiki.example.com/runbooks/high-cpu"
ChampDescription
alertNom de l’alerte
exprExpression PromQL (doit retourner > 0 pour alerter)
forDurée pendant laquelle la condition doit être vraie
labelsLabels ajoutés à l’alerte (pour le routage)
annotationsInformations contextuelles (templates supportés)
groups:
- name: infrastructure
rules:
- alert: InstanceDown
expr: up == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} down"
- alert: HighMemory
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
for: 5m
labels:
severity: warning
annotations:
summary: "High memory on {{ $labels.instance }}"
- alert: DiskFull
expr: (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "Disk {{ $labels.mountpoint }} full on {{ $labels.instance }}"

Avant de déployer, validez la syntaxe :

Fenêtre de terminal
promtool check rules rules/*.yml

Les recording rules pré-calculent des expressions coûteuses et les stockent comme nouvelles métriques.

groups:
- name: recording-rules
rules:
- record: job:http_requests:rate5m
expr: sum(rate(http_requests_total[5m])) by (job)
- record: instance:cpu_usage:percent
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

Avantages :

  • Dashboard plus rapide (pas de calcul à chaque refresh)
  • Expressions plus simples dans les alertes
  • Réduit la charge sur Prometheus
/etc/prometheus/
├── prometheus.yml # Config principale
├── rules/
│ ├── infrastructure.yml # Alertes infra
│ ├── applications.yml # Alertes applicatives
│ └── recording.yml # Recording rules
└── targets/
├── nodes.json # Targets file-based
└── services.json

Utilisez des labels cohérents dans tout l’écosystème :

LabelUsageExemples
envEnvironnementproduction, staging, dev
teamÉquipe responsablebackend, infra, data
serviceNom du serviceapi-gateway, auth-service
datacenterLocalisationparis, dublin

La cardinalité est le nombre de séries temporelles uniques. C’est le principal facteur de consommation mémoire.

Fenêtre de terminal
# Vérifier prometheus.yml
promtool check config /etc/prometheus/prometheus.yml
# Vérifier les règles
promtool check rules /etc/prometheus/rules/*.yml
# Tester une requête PromQL
promtool query instant http://localhost:9090 'up'
SymptômeCause probableSolution
Target toujours “DOWN”Réseau / firewallcurl http://target:port/metrics
Pas de métriques après reloadSyntaxe YAMLpromtool check config
Trop de sériesCardinalité élevéemetric_relabel_configs avec drop
Alertes ne se déclenchent pasExpression jamais vraieTester dans l’UI
  • scrape_configs : définit les targets à scraper
  • Service Discovery : automatise la découverte (Kubernetes, Consul, files)
  • Relabeling : transforme les labels (avant ou après scraping)
  • Recording rules : pré-calcule les expressions coûteuses
  • promtool : valide toujours la config avant reload

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.