GH GambleHub

Collecte de métriques : Prometheus, Grafana

Collecte de métriques : Prometheus, Grafana

1) Objectif et cadre

La tâche du contour des métriques est d'assembler et de stocker de manière fiable les séries chronologiques, de donner rapidement le BouQL pour RCA, les alertes SLO et les dashboards compréhensibles. Paire de base : Prometheus (scrape → store → query) et Grafana (visualisation, alertes, annotations de sortie). Pour le stockage long et la demande globale - Thanos/Cortex/Mimir.

2) Modèle de données et sémantique

Série = nom de la métrique + jeu d'étiquettes (clé = valeur).
Types : counter, gauge, histogramme, résumé (dans la vente - plus souvent histogramme).

Sémantique :
  • RED (API) : 'rate', 'errors', 'duration' (histogrammes).
  • USE (ресурсы): Utilization, Saturation, Errors (CPU/RAM/Disk/Net).
  • Nom : 'namespace _ subsystem _ metric _ unit' (par exemple, 'http _ server _ requests _ total', 'db _ connexions _ current').

Anti-cardinalité : minimisez les différentes valeurs de label (pas de user_id request_id dans label).

3) Exposition et service discovery

Exportateurs : node_exporter, kube-state-metrics, cAdvisor, OBD/files d'attente (postgres_exporter, redis_exporter, kafka_exporter).
Services propres : bibliothèques clientes (Go/Java/Node/Python) → '/metrics'.
Service Discovery: Kubernetes, EC2/ASG, Consul, static files.

Basic 'prometheus. yml '(fragment) :
yaml global:
scrape_interval: 15s evaluation_interval: 15s scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs: [{ role: node }]
relabel_configs:
- action: labelmap regex: __meta_kubernetes_node_label_(.+)
- job_name: 'apps'
kubernetes_sd_configs: [{ role: pod }]
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep regex: "true"
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
target_label: __metrics_path__
regex: (.+)
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
target_label: __address__
regex: (.+)
replacement: $1
Annotations pod's :
yaml prometheus. io/scrape: "true"
prometheus. io/path: /metrics prometheus. io/port: "8080"

4) Histogrammes et latitude

Utilisez des baquets explicites sous votre SLO :
  • Web/API : '[10ms, 25,50,100,200,400,800,1600]'
  • Paiements/décaissements : ajoutez la queue à 5-10s.
PromQL p95:
promql histogram_quantile(0. 95,
sum by (le) (rate(http_request_duration_seconds_bucket[5m]))
)
Avec Exemplars (si inclus) :
promql histogram_quantile(0. 95,
sum by (le, route) (rate(traces_spanmetrics_duration_bucket{route="/withdraw"}[5m]))
)

5) Règles d'enregistrement (règles d'enregistrement)

Réduire les demandes lourdes, standardiser SLI.

yaml groups:
- name: api_sli interval: 30s rules:
- record: job:http:success_ratio:rate5m expr: sum(rate(http_requests_total{status!~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
- record: job:http:duration_p95:5m expr: histogram_quantile(0. 95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))

6) SLO et alertes (multi-window burn)

SLO 99. 9 % des demandes réussies/30d.

yaml groups:
- name: slo_burn rules:
- alert: ErrorBudgetBurnHighShort expr: (1 - job:http:success_ratio:rate5m) > (1 - 0. 999) 14 for: 5m labels: { severity: critical }
annotations: { summary: "Fast burn >14x for 5m" }

- alert: ErrorBudgetBurnHighLong expr: (1 - job:http:success_ratio:rate5m) > (1 - 0. 999) 6 for: 1h labels: { severity: critical }
annotations: { summary: "Long burn >6x for 1h" }
Alertmanager (simplifié) :
yaml route:
receiver: pager group_by: ["service"]
receivers:
- name: pager slack_configs:
- channel: "#oncall"
send_resolved: true

7) Label-hygiène et économie

Les noms du label's sont stables et normalisés : 'service', 'bou', 'région', 'route', 'code', 'version'.
Limitez la cardinalité : les métriques avec 'route' doivent utiliser le modèle 'http. route '(pas l'URL complète).
Sampling de la logique - dans les trails ; Il n'y a pas de user_id dans les métriques.
Propriétés de sortie ('service. version ') sont utiles pour comparer l'ancienne/nouvelle version.

8) Mise à l'échelle et HA

Prometheus - verticalement et en chardonnant par scrape-target :
  • Deux Prometheus (A/B) grattent les mêmes cibles (les alertes HA → sont dupliquées).
  • Thanos : Sidecar à chaque Prometheus, Store + Query pour les demandes globales et le stockage à long terme (S3/GCS).
  • Alternative : Cortex/Mimir (écriture à distance, multitenance, mise à l'échelle horizontale).
Écriture à distance (exemple) :
yaml remote_write:
- url: https://mimir. example. com/api/v1/push basic_auth: { username: tenantA, password: $MIMIR_TOKEN }
Retenshn du TSDB local :
yaml
--storage. tsdb. retention. time=15d
--storage. tsdb. max-block-duration=2h

9) Grafana : dashboards, alertes, annotations

Dashboards standard :

1. Platform Overview (SLO/RED, error-budget).

2. API by Route (RPS/5xx/p95, comparaison 'version').

3. K8s Cluster/Nodes (control-plane, saturation).

4. DB/Cache/Queues (lag/locks/hit ratio/backlog).

5. Per-Release (avant/après, annotation des releases de CI).

Alerting Grafana : Déclencheurs par BouQL, rotation sur appel, mute-times « fenêtre de sortie ».

Annotations : CI ajoute un événement de sortie avec 'commit', 'image. tag ', référence à la pipline.

10) Kubernetes : ce qui est nécessaire pour mesurer

Control-plane: `apiserver_request_total`, etcd leader/fsync, scheduler latency.
Workloads : restarts, 'container _ cpu _ cfs _ throttled _ seconds _ total', OOM, Pending/Evicted, violation PDB.
Réseau : drops, conntrack, bugs 'kube-proxy'.
Quotas/limites : Requests vs Limits, HPA/VPA, saturation de nœuds.

11) OBD/caches/files d'attente : signaux clés

PostgreSQL/MySQL: `connections`, `locks`, `deadlocks_total`, `xact_commit/rollback`, replication lag.
Redis: hit ratio, `evictions`, latency `instantaneous_ops_per_sec`.
Kafka/RabbitMQ: consumer lag, unacked, ISR, disk usage.

Exemples de BouQL :
promql
Queue backlog sum by (topic) (kafka_consumergroup_lag)> 1000

Postgres replication lag max(pg_replication_lag_seconds) > 2

12) Sécurité et multi-ténacité

RBAC à Prometheus/Grafana, datasource-permishen.
Chaîne TLS/mTLS sur ingress/entre les composants.
Isolation des locataires : Prometheus ou tenant-label séparé à Cortex/Mimir ; limites de série et de demande.
Les secrets dans les alertes/notations sont interdits (utilisez l'ID tiket plutôt que PII).

13) Intégration avec les sorties et les retours automatiques

Règles SLO → AnalyseTemplate (Argo Rollouts) ou CI-gate.
Lors du déclenchement des burn-alerts - pause/rollback canary ; Dans le logue/annotation, lien vers la version.
Comparaison de la version stable et canarienne via le label 'version'.

14) Erreurs typiques (anti-modèles)

Cardinalité incontrôlée des étiquettes (user_id, url. full, clés dynamiques).
Mélange de prod et de stage dans un seul cluster sans « bou » label.
Seulement gauge sans RED/USE ; sans histogrammes p95/p99.
Les alertes « fer » sans référence à SLO → le bruit.
L'absence d'enregistrement des règles → les demandes « lourdes » dans les incidents.
Il n'y a pas d'annotations de version → il est difficile de comparer les modifications et les dégradations.

15) Chèque de mise en œuvre (0-45 jours)

0-10 jours

Node/kube-state/cAdvisor exportateurs ; '/metrics'dans les services.
Dashboards de base RED/USE ; les réservoirs standard des histogrammes.
Inclure les annotations de version de CI.

11-25 jours

Règles d'enregistrement pour SLI ; multi-window burn alert.
HA Prometheus (double scrape), sauvegarde des configues GitOps.
Alertmanager : itinéraires/mode silencieux/rotation sur appel.

26-45 jours

Remote-write à Thanos/Cortex/Mimir, stockage à long terme.
Optimisation de la cardinalité, limites des séries, demandes.
Version SLO et intégration auto-rollback.

16) Métriques de maturité

Couverture RED/USE pour les services clés ≥ 95 %.
Temps moyen d'exécution des « lourds » BouQL <2 c (p95) grâce aux règles d'enregistrement.
Rapport alertes utiles/bruyantes> 3:1.
Cardinalité sous contrôle : <10M séries actives par cluster, pas de surtensions.
100 % des versions ont une annotation dans Grafana et une correspondance des métriques avant/après.

17) Extraits utiles

Comparaison de stable vs canary par version

promql histogram_quantile(0. 95,
sum by (le, version) (rate(http_request_duration_seconds_bucket{version=~"stable    canary"}[5m]))
)

Erreurs 5xx par itinéraire

promql topk(5,
sum by (route) (rate(http_requests_total{status=~"5.."}[5m]))
)

CPU saturation conteneur

promql rate(container_cpu_cfs_throttled_seconds_total[5m]) > 0. 1

Association des métriques avec les trajets (Exemplars inclus)

promql sum (rate (http_request_duration_seconds_bucket[5m])) by (le) # clickable to the track

18) Conclusion

Prometheus + Grafana est la norme de facto pour les métriques. La sémantique et la discipline sont gagnantes : RED/USE, label soigné, histogrammes sous SLO, règles d'enregistrement et alertes SLO. Ajoutez le stockage HA et à long terme, les annotations de version et l'intégration avec les retours automatiques - et vous obtiendrez un contour de mesure rapide, évolutif et économique qui vous aidera à prendre des décisions dans la vente.

Contact

Prendre contact

Contactez-nous pour toute question ou demande d’assistance.Nous sommes toujours prêts à vous aider !

Telegram
@Gamble_GC
Commencer l’intégration

L’Email est obligatoire. Telegram ou WhatsApp — optionnels.

Votre nom optionnel
Email optionnel
Objet optionnel
Message optionnel
Telegram optionnel
@
Si vous indiquez Telegram — nous vous répondrons aussi là-bas.
WhatsApp optionnel
Format : +code pays et numéro (ex. +33XXXXXXXXX).

En cliquant sur ce bouton, vous acceptez le traitement de vos données.