Grafana et visualisation des données
(Section : Technologie et infrastructure)
Résumé succinct
Grafana est la vitrine de toute observabilité : métriques, logs, tracés, indicateurs commerciaux et alertes au même endroit. Pour iGaming, il s'agit du suivi p95/p99, de la conversion des paiements, du Time-to-Wallet, de la disponibilité des fournisseurs de jeux, de la géo-distribution des incidents et de la comparaison des sorties (stable vs canary). Succès : modèles (variables), panneaux compréhensibles, annotations de sortie, SLO-dashboards et discipline des droits d'accès.
1) Architecture de connexion
Datasours : Prometheus (métriques), Loki/ELK (logs), Tempo/Jaeger (tracks), ClickHouse/BigQuery/PG (données d'entreprise), OTLP via Gateway.
Liens clés : à partir de la métrique → exemplar → trace → logs liés par 'trace _ id'.
Dossiers et RBAC : dossiers distincts 'SRE', 'Payments', 'Risk', 'Games', 'BizOps' ; роли `Viewer/Editor/Admin` и granular permissions.
2) Conception de dashboards : principes
1. Réponse à la question en 1-2 clics : de la carte SLO aux détails.
2. RED/USE pour chaque service + cartes de domaine (TTW, conversion des dépôts).
3. Grille stable : 24 colonnes, grands KPI en haut, détails en bas.
4. Couleurs et seuils : minimum, seulement par SLA/SLO.
5. Annotations de sortie : Git SHA, version, type de sortie (canary/blue-green).
3) Variables et templates (templating)
Les variables transforment un dashboard en beaucoup.
Exemple (Prometheus query-variable) :- Name: `service`
- Query: `label_values(up, service)`
- Multi-select + include all - pratique pour les agrégats.
- `region` → `env` → `service` → `instance`.
- Utilisez 'regex '/' sort' pour UX et 'refresh : On dashboard load'.
4) Panneaux et types de visualisation
Time series: p50/p95/p99, error-rate, throughput.
Stat/Gauge : objectifs KPI (disponibilité, TTW p95).
Bar gauge/Table : top N itinéraires/PSP/fournisseurs de jeux.
Geomap : cartes thermiques des incidents/latences par pays/RR.
Canvas : flux schématiques (Player → API → PSP → Bank).
Node graphique : dépendances des services, coloration par erreur.
- Labels to fields, Outer join (métriques et tableaux d'entreprise), Reduce (min/max/avg), Add field from calculation (conversion).
5) Exemples de demandes et de panneaux
5. 1 p95 latency (PromQL)
promql histogram_quantile(0. 95,
sum by (le, route) (rate(http_request_duration_seconds_bucket{service="$service",region="$region"}[5m]))
)
5. 2 Succès des demandes (SLO proxy)
promql sum(rate(http_requests_total{service="$service",status=~"2.. 3.."}[5m]))
/
sum(rate(http_requests_total{service="$service"}[5m]))
5. 3 Conversion des paiements (agrégat BouQL)
promql sum(rate(payments_success_total{psp=~"$psp",currency=~"$currency"}[15m]))
/
sum(rate(payments_attempt_total{psp=~"$psp",currency=~"$currency"}[15m]))
5. 4 Sauts rapides sur piste (exemples)
Dans le panneau Time Series, activez Exemplars → cliquez sur un point → Tempo s'ouvre avec trace _ id.
5. 5 Logs par trace_id (Loki)
logql
{service="$service"} = "$traceID"
6) Annotations et événements
Release annotations : auto-ajout de l'événement à la sortie (version, auteur, poids canarien).
Incident/Freeze : marques de début/fin de l'incident et fenêtres de gel des versions.
Événements d'affaires : grandes campagnes/tournois - marquer sur les graphiques.
7) Alerte en Grafana
Alert rules centralement (sur la base Prometheus/Loki/Cloud).
Contact points: PagerDuty/Slack/Email; Notifications politiques (routage par dossier/balises).
Multi-window burn-rate : un budget rapide et lent.
Silences : dans les fenêtres de planification et en double.
promql histogram_quantile(0. 95,
sum by (le, service) (rate(http_request_duration_seconds_bucket{service="$service"}[5m]))
) > 0. 25
8) Provijining en tant que code (IaC)
Stockez les sources/dashboards/alertes dans Git.
datasource. yaml
yaml apiVersion: 1 datasources:
- name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true
- name: Loki type: loki url: http://loki:3100
- name: Tempo type: tempo url: http://tempo:3100
dashboard. yaml
yaml apiVersion: 1 providers:
- name: sres folder: SRE type: file disableDeletion: false options:
path: /var/lib/grafana/dashboards/sre
grafana. ini (fragment)
ini
[auth]
disable_login_form = false
[users]
viewers_can_edit = false
[alerting]
enabled = true
[unified_alerting. screenshots]
capture = true
9) Sécurité et accès
SSO (OIDC/SAML), les groupes → le rôle du dossier →.
Droits sur datasources : uniquement les dossiers nécessaires, read-only pour Viewer.
Hygiène PII : ne pas tirer les champs avec PII dans le panneau ; pour les logs - filtrer/masquer.
Secrets : seulement via Vault/secure JSON fields, sans « plaine texte » dans les dashboards.
10) Performance et coût
Règles d'enregistrement dans Prometheus pour les expressions lourdes.
Downsampling/Retraite dans les backends de stockage de longue durée.
Cache de dashboards et intervalles honnêtes (pas "1s'partout).
Limitation de la cardinalité des variables (ne pas substituer 'user _ id '/' session _ id').
Redistribution : instances individuelles/fauteurs pour les équipes bruyantes.
11) Dashboards spécialisés pour iGaming
Payments : tentatives/succès/TTW p95, erreur PSP/route, carte géographique des écarts.
Games/Providers : latency et error rate par studio/jeux, conversion de lancement.
Risk/Fraud : taux d'action, surtensions des appareils/IP, corrélations (tableau + barre gage).
RG/Conformité : sessions> seuil, croissance des steaks, alertes sur les anomalies.
Release Compare : Stable vs Canaries par p95/error/business métriques.
Infra/USE : Utilisation/Saturation/Errors par clusters et files d'attente.
12) Exemple de dashboard JSON (fragment)
json
{
"title": "Payments SLO",
"tags": ["slo","payments"],
"time": {"from":"now-6h","to":"now"},
"panels": [
{
"type":"stat",
"title":"Availability",
"targets":[{"expr":"sum(rate(http_requests_total{service=\"payments-api\",status=~\"2.. 3..\"}[5m]))/sum(rate(http_requests_total{service=\"payments-api\"}[5m]))"}],
"thresholds":{"mode":"absolute","steps":[{"color":"red","value":0},{"color":"green","value":0. 999}]}
},
{
"type":"timeseries",
"title":"p95 latency",
"exemplars": {"color":"rgba(31,120,193,0. 6)"},
"targets":[{"expr":"histogram_quantile(0. 95,sum by (le) (rate(http_request_duration_seconds_bucket{service=\"payments-api\"}[5m])))"}]
}
]
}
13) Runbooks et améliorations UX
Chaque alerte est une URL Runbook (instruction d'action).
Liens vers les dashboards associés (Payments ↔ Infra ↔ PSP).
Drilldown : clics par étiquette → filtres (région/psp/route).
Variables defaults : "bou = prod'," region = eu "- accélère le départ.
14) Chèque de mise en œuvre
1. Configurez datasources : Prometheus/Loki/Tempo/SQL.
2. Entrez les dossiers et RBAC ; audit des droits.
3. Créez des variables de modèle (region/bou/service).
4. Construisez des SLO-dashboards (availability, p95, error-rate, budget des erreurs).
5. Ajoutez des annotations de version et une comparaison stable/canary.
6. Activez exemplars et accédez aux pistes/logs en cliquant.
7. Configurez les alerts (multi-window burn-rate) et le routing.
8. Provisionnez tout comme le code, stockez-le dans Git, faites la rhubarbe.
9. Optimisez les performances : règles d'enregistrement, intervalles, cache.
10. Entrez les cartes d'affaires (TTW, conversion de paiement, GGR).
15) Anti-modèles
Le « zoo » des dashboards incohérents sans variables ni normes.
Les panneaux avec le BouQL lourd sans règles d'enregistrement → lent UI.
Excès de couleurs/légendes/axe-Y avec différentes échelles.
Connexion PII dans les panneaux ouverts pour Viewer.
L'absence d'annotations de sortie - on ne sait pas d'où viennent les sauts.
Un dashboard au lieu d'une structure folder.
Résultats
Grafana est l'interface où la technique rencontre le produit : les métriques, les logs et les pistes se connectent aux tableaux d'affaires. Les modèles, les panneaux corrects, les annotations et les alertes transforment les données en solutions : diagnostic rapide, sorties prévisibles et coûts d'observation gérables.