Introduction
Grafana Mimir est une base de données de séries temporelles open-source, conçue pour stocker et interroger des métriques à long terme de manière hautement scalable, tout en restant 100% compatible avec Prometheus. Contrairement à Prometheus qui est limité en rétention (typiquement 2-15 jours), Mimir gère des pétaoctets de données sur des clusters distribués, avec sharding horizontal et réplication.
Pourquoi l'utiliser en 2026 ? Avec l'explosion des métriques cloud-native (Kubernetes, microservices), Mimir résout le goulot d'étranglement du stockage : imaginez Prometheus comme un vélo (rapide mais limité), Mimir comme un camion (capable de transporter des volumes massifs). Ce tutoriel beginner vous déploie une stack locale complète : Mimir en mode monolithique (pour simplicité), Prometheus pour ingestion, Node Exporter pour données réelles, et Grafana pour visualisation. À la fin, vous queryez des métriques avec 7 jours de rétention, scalables à l'infini. Temps estimé : 15 min. (128 mots)
Prérequis
- Docker version 27+ et Docker Compose v2.29+ installés (vérifiez avec
docker --versionetdocker compose version). - 4 Go RAM libres et 10 Go disque (pour données de test).
- Connaissances basiques de Prometheus (concepts scrape/remote_write) et YAML.
- Port 3000 (Grafana), 8080 (Mimir), 9090 (Prometheus), 9100 (Node Exporter) libres.
- Terminal Unix-like (WSL sur Windows recommandé).
Étape 1 : Créer la structure de dossiers
Créez un dossier projet pour organiser les fichiers. Ouvrez un terminal et exécutez :
``bash`
mkdir mimir-local && cd mimir-local
mkdir -p mimir grafana/provisioning/datasources prometheus
Cette arborescence sépare les configs : mimir/mimir.yaml pour Mimir, prometheus/prometheus.yml pour l'ingestion, grafana/provisioning/datasources/mimir.yml` pour Grafana auto-config. Cela évite les conflits de volumes Docker et facilite les backups.
Configurer Mimir (mode monolithique)
server:
http_listen_port: 8080
log_level: info
multitenancy_enabled: false
blocks_storage:
backend: filesystem
filesystem:
dir: /data/blocks
tsdb:
dir: /data/tsdb
limits:
ingestion_rate_mb: 4
ingestion_burst_size_mb: 6
retention_period: 168h # 7 jours pour tests
api:
enable_admin_endpoints: true
ruler_storage:
backend: local
local:
directory: /data/ruler
alertmanager_storage:
backend: filesystem
filesystem:
dir: /data/alertmanagerCette config lance Mimir en mode monolithique (tout-en-un) avec stockage filesystem pour simplicité beginner. Les blocks sont conservés dans /data/blocks (compatible remote_write Prometheus), rétention 7 jours. Activez les endpoints admin pour /ready et métrics. Piège : Sans multitenancy=false, l'auth multi-tenant bloque les tests locaux.
Étape 2 : Vérifier la config Mimir
Placez ce fichier dans mimir/mimir.yaml. Mimir utilise un backend 'filesystem' pour les blocks (séries alignées TSDB), idéal pour dev. Analogie : Les 'blocks' sont comme des ZIP de métriques compactées, uploadées périodiquement par Prometheus. Cela permet une scalabilité future vers S3/MinIO sans changer de code.
Configurer Prometheus pour remote_write
global:
scrape_interval: 15s
remote_write:
- url: http://mimir:8080/api/v1/push
scrape_configs:
- job_name: mimir
honor_labels: true
static_configs:
- targets: ['mimir:8080']
- job_name: node
honor_labels: true
static_configs:
- targets: ['node_exporter:9100']
rule_files: []
Prometheus scrape Mimir (ses propres métriques) et Node Exporter (CPU/RAM host), puis push vers Mimir via /api/v1/push. 'honor_labels: true' préserve les labels Prometheus. Piège : Sans remote_write, les données restent locales à Prometheus (volatiles). Vérifiez avec curl http://localhost:9090/api/v1/status/config après démarrage.
Étape 3 : Provisionner Grafana automatiquement
Grafana se configure seule au boot via provisioning. Cela évite les clics manuels : datasource 'Mimir' pointe sur http://mimir:8080/prometheus (endpoint compatible Prometheus). Login : admin/admin.
Datasource Grafana pour Mimir
apiVersion: 1
providers:
- name: 'mimir-local'
orgId: 1
folder: ''
type: file
disableDeletion: false
updateIntervalSeconds: 60
allowUiUpdates: true
datasources:
- name: Mimir
type: prometheus
access: proxy
orgId: 1
url: http://mimir:8080/prometheus
basicAuth: false
isDefault: true
version: 1
editable: true
Ce YAML provisionne un datasource Prometheus pointant l'API Mimir. 'access: proxy' permet les queries depuis Grafana UI sans CORS issues. Piège : URL interne 'mimir:8080' (Docker network) ; exposez 8080 pour accès externe. Testez query up dans Grafana Explore.
Docker Compose : Stack complète
version: '3.8'
services:
mimir:
image: grafana/mimir:2.14.1
command:
- '-config.file=/etc/mimir/mimir.yaml'
ports:
- '8080:8080'
volumes:
- ./mimir/mimir.yaml:/etc/mimir/mimir.yaml
- mimir-data:/data
networks:
- mimir
healthcheck:
test: ['CMD', 'wget', '--no-verbose', '--tries=1', '--spider', 'http://localhost:8080/ready']
interval: 10s
timeout: 5s
retries: 3
prometheus:
image: prom/prometheus:v2.53.1
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- '9090:9090'
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle'
networks:
- mimir
depends_on:
mimir:
condition: service_healthy
grafana:
image: grafana/grafana:11.3.0
ports:
- '3000:3000'
volumes:
- grafana-data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_USERS_ALLOW_SIGN_UP=false
networks:
- mimir
depends_on:
- prometheus
node_exporter:
image: prom/node-exporter:v1.8.2
ports:
- '9100:9100'
networks:
- mimir
volumes:
mimir-data:
grafana-data:
networks:
mimir:
driver: bridge
Ce Compose orchestre la stack : Mimir healthycheck sur /ready, Prometheus dépend de Mimir, Grafana provisionnée. Volumes persistants pour données (ne pas perdre blocks). Piège : Versions pinned pour stabilité ; mettez à jour image tags ensemble. depends_on assure l'ordre de boot.
Étape 4 : Lancer et vérifier la stack
Exécutez docker compose up -d (démon). Vérifiez logs : docker compose logs mimir. Accédez :
- Grafana : http://localhost:3000 → Explore → Mimir → Query
rate(node_cpu_seconds_total[5m]). - Mimir ready :
curl http://localhost:8080/ready(retourne 'ready'). - Prometheus : http://localhost:9090/targets (UP). Données arrivent en 1-2 min.
Vérifier avec curl (Mimir metrics)
#!/bin/bash
# Vérifier Mimir prêt
echo "Mimir ready:"
curl -s http://localhost:8080/ready | jq
# Query exemple : up jobs
curl -G -s http://localhost:8080/prometheus/api/v1/query \
-d 'query=up' \
--data-urlencode 'time=now' | jq '.data.result'
# Compter séries stockées (admin endpoint)
curl -s http://localhost:8080/admin/tsdb/series-count | jqCe script bash teste l'API Mimir : /ready confirme le boot, /prometheus/api/v1/query simule Grafana Explore, /admin/tsdb compte séries (ex: 100+ après 5 min). Installez jq pour pretty-print. Piège : Sans -G --data-urlencode, les params query échouent.
Bonnes pratiques
- Persistance : Toujours volume /data pour blocks ;
docker compose downsans--volumesgarde les données. - Sécurité : En prod, activez multitenancy + auth (OAuth/JWT) ; limitez ports exposés.
- Monitoring : Ajoutez Loki/Promtail pour logs ; scalez via Helm sur K8s.
- Rétention : Testez
blocks_storage.tsdb.retentionà 90d+ ; monitorez 'mimir_tsdb_blocks_compactions_failed_total'. - Backup : Rsync /data/blocks vers S3 ; utilisez mimirtool pour snapshots.
Erreurs courantes à éviter
- Mimir not ready : Logs montrent 'tsdb dir locked' → supprimez volumes orphelins (
docker volume prune). - No data in Grafana : Vérifiez remote_write queue (
prometheus_remote_storage_samples_pending) ; attendez 2min post-boot. - CORS/Proxy errors : Dans Grafana, 'access: proxy' + exposez 8080 ; testez curl depuis container (
docker exec). - OOS après restart : Filesystem n'est pas distribué ; migrez vers S3/MinIO pour prod.
Pour aller plus loin
- Documentation officielle : Grafana Mimir Docs.
- Helm Chart production : github.com/grafana/helm-charts.
- Intégrez Tempo pour traces : Ajoutez service Tempo dans Compose.
- Formations expertes : Découvrez nos formations Observabilité Learni pour Kubernetes + Mimir distribué.