GH GambleHub

Distributed Tracing

(Section : Technologie et infrastructure)

Résumé succinct

Les traces distribuées donnent la réponse à la question où et pourquoi le temps est perdu sur le chemin de la requête à travers la passerelle, l'API, la file d'attente, les bases de données, les fournisseurs externes (PSP/studios de jeux). OpenTelemetry (OTel) est une norme ouverte SDK/agents/protocole qui combine les trajets, les métriques et les logs. Dans iGaming, c'est un outil de base pour garder p95/p99, localiser rapidement les problèmes de paiement et identifier les « goulots d'étranglement » avant les tournois de pointe.

1) Concepts OTel

Trace est le chemin complet de l'opération (dépôt, pari, retrait).
Span - zone de travail (handler HTTP, requête SQL, appel de file d'attente/fournisseur).
Attributes est une clé-valeur avec des détails ('net. peer. name`, `db. system`, `psp. route`).
Events - événements instantanés (rétraction, temporisation, échec de cache).
Liens - lien avec d'autres pistes (important pour async/queue).
Ressource - métadonnées de processus : 'service. name`, `service. version`, `deployment. environment`, `cloud. region`.

2) Promotion du contexte

Utilisez le W3C Trace Context :

traceparent: 00-<trace_id>-<span_id>-01 tracestate:...

En option - baggage pour les clés de sécurité (par exemple, 'tenant', 'route'), ne mettez pas PII là-bas.

Où percer le contexte : la passerelle API → les RPC internes → le producteur dans la file d'attente du consumer → → HTTP externes (PSP/fournisseurs).

3) Conventions sémantiques (minimum obligatoire)

HTTP/RPC: `http. method`, `http. route`, `http. status_code`.
DB/cache : 'db. system` (`mysql`/`postgresql`/`redis`), `db. statement '(masqué),' db. operation`.
Files d'attente : 'messaging. system` (`kafka`/`rabbitmq`), `messaging. destination`, `messaging. operation` (`send`/`process`).
Paiements : 'psp. route`, `psp. provider`, `payment. id '(pseudonyme),' amount ',' currency '.
iGaming domaine : 'game. provider`, `game. session_id` (hash), `player. id_hash`.

Une taxonomie unifiée → la comparabilité des dashboards et la recherche rapide des causes.

4) Sampling : comment ne pas se noyer dans les données

Head-based (à l'entrée de la demande)

Simple, bon marché ; convient au flux total.
Moins - vous pouvez perdre des pistes « intéressantes » lentes/erronées.

Tail-based (в Collector)

La décision est prise une fois les spans terminés : nous ne conservons que les erreurs/segments lents/importants (VIP/paiements).
Idéal pour la charge de travail : réduit considérablement le coût avec une grande information.

Hybride recommandé :
  • Tête : 5-10 % pour le revêtement de fond.
  • Tail : 100 % d'erreurs + p95 + pistes de paiement lentes +/sorties canaries.

5) Topologies OpenTelemetry Collector

Agent-sidkar (sur chaque nœud/sous-site) : acceptation locale, tampon minimum, exportation vers l'agrégateur.
Gateway (cluster) : tail-sampling, routage, enrichissement, exportation vers Tempo/Jaeger/Zipkin/OTLP.

Exemple : tail-sampling (fragment YAML)

yaml processors:
tailsampling:
decision_wait: 5s policies:
- name: errors type: status_code status_code:
status_codes: [ ERROR ]
- name: slow_p95 type: latency latency:
threshold_ms: 250
- name: payments type: string_attribute string_attribute:
key: service. name values: [ "payments-api", "payments-worker" ]

6) Corrélation avec les métriques et les logs

Ajoutez 'trace _ id '/' span _ id' à chaque entrée de logs.
Stockez les métriques de latence comme des histogrammes et incluez les exemples - une référence à la représentation 'trace _ id' pour le « saut » de la boîte p95 dans une trace spécifique.
Annotations de sortie (Git SHA, version chart) - comme events/labels.

7) Instrumentalisation (langages et auto-agents)

Go (manuel + auto)

go tp:= sdktrace. NewTracerProvider(
sdktrace. WithBatcher(exporter),
sdktrace. WithResource(resource. NewWithAttributes(
semconv. SchemaURL,
semconv. ServiceName("payments-api"),
)),
)
otel. SetTracerProvider(tp)

ctx, span:= tracer. Start(ctx, "Deposit")
defer span. End()
span. SetAttributes(
attribute. String("psp. route","pspX"),
attribute. String("currency","EUR"),
)

Java

Auto-agent '-javaagent : opentelemetry-javaagent. jar ', config via bou (' OTEL _ SERVICE _ NAME ',' OTEL _ EXPORTATEUR _ OTLP _ ENDPOINT ').
Manuellement : Annotations/outil d'emplacement d'oignon (pools JDBC, cache).

Node. js / Python

Outil automatique avec SDK + plugins (Express/FastAPI/celery).
Pour les files d'attente, les enveloppes du producteur/consumer pour mettre 'messaging.' et les liens.

8) Files d'attente et async : les bons dormeurs

Producteur ('send') : span à envoyer à la file d'attente.
Consumer ('process') : nouveau span de traitement du message de link à span du producteur (garder le lien de causalité sans le 'trace _ id'commun).
Attributs : 'messaging. kafka. partition`, `messaging. rabbitmq. routing_key`, `messaging. message_id`.
Pour les retraits, event 'retry', compteur de tentatives.

9) OBD/cache et N + 1

Activez la traction des pilotes OBD et regroupez les requêtes du même type dans Batchi.
Pour Redis/cache, les attributs 'cache. hit`/`cache. miss`.
Faites des demandes « lourdes » dans des couchages séparés - vous pouvez voir où est p99.

10) Fournisseurs externes : PSP/studios de jeux

Enveloppez les clients HTTP : 'psp. provider`, `psp. route`, `timeout_ms`, `attempt`.
Loger les codes/types d'erreur, mais pas PII (numéro de carte, jetons).
Comparer les studios/itinéraires par 'duration', 'error-rate'.

11) Frontende et RUM

OTel Web SDK: `page_view`, `resource_load`, `xhr`.
Faites glisser 'traceparent' dans le backend pour mettre le chemin d'accès de l'utilisateur sur l'interface utilisateur → l'API → la base de données.
Segmentation par géo/fournisseurs de réseau - labels optionnels.

12) Sécurité et PII

Masquer les champs ('db. statement 'avec édition), hachez' player _ id '.
Zones de données : 'pii = true', 'region = EU/TR/LATAM'.
Contrôle de l'accès aux remorques de paiement (rôle basé).
WORM/Rétention : durée de conservation pour les traces sensibles, suppression par stratégie.

13) Productivité et coût

Tail-sampling par politique : « erreurs + lenteurs + paiements + sorties canaries ».
Downsampling histogrammes métriques, déduplication agressive des logs.
Limitation de la cardinalité : ne pas inscrire 'user _ id' comme label métrique.
Tampons/batchs en Collector, compression OTLP.

14) Dashboards et analyse

Service map : dépendances des services, coloration par erreur/latence.
Release compare : stable vs révisions canaries (p95, error-rate, payments bou).
Top slow traces : sur la route '/deposit ', coupe PSP/région.
Queue lag : pistes avec un profond retard de consommation.

15) Exemples de configurations Collector

Pipelines (métriques/tracés/logs, fragments)

yaml receivers:
otlp: { protocols: { http: {}, grpc: {} } }

processors:
batch:
memory_limiter:
limit_mib: 1024 spike_limit_mib: 256 attributes/payments:
actions:
- key: "psp. provider"
action: insert value: "pspX"

exporters:
otlp/traces: { endpoint: tempo:4317, tls: { insecure: true } }
otlp/metrics:{ endpoint: prometheus-otlp:4317, tls: { insecure: true } }
otlp/logs:  { endpoint: loki-otlp:4317, tls: { insecure: true } }

service:
pipelines:
traces:
receivers: [ otlp ]
processors: [ memory_limiter, batch, tailsampling ]
exporters: [ otlp/traces ]
metrics:
receivers: [ otlp ]
processors: [ batch ]
exporters: [ otlp/metrics ]
logs:
receivers: [ otlp ]
processors: [ batch ]
exporters: [ otlp/logs ]

16) Runbooks (scénarios types)

A) Croissance de p99 dans 'payments-api'

1. Ouvrir « Top slow traces » → échouer dans les spans OBD/PSP.
2. Si le problème PSP est de traduire l'itinéraire, activez les retraits/délais.
3. Vérifiez la file d'attente 'withdrawals' (lag), augmentez les consumers.

B) Erreurs 5xx après la sortie

1. Filtre par service. version`.
2. Comparer stable/canarien ; trouver des épices dans 'psp. route`.
3. Geler la promotion, faire tomber (voir « Stratégies de libération « / » Rolbacky »).

C) Suspicion sur N + 1

1. Tracs avec un grand nombre de spans DB courts.
2. Activer l'agrégation/joyaux, ajouter un cache.

17) Chèque de mise en œuvre

1. Activez le SDK OTel et les attributs de ressources uniques ('service. name`, `env`, `region`).
2. Promotion du W3C Trace Context à travers toutes les couches et files d'attente.
3. Ensemble minimal d'attributs sémantiques (HTTP/DB/queue/PSP).
4. Tail-sampling : erreurs, p95 +, paiements, canard.
5. Logs avec 'trace _ id '/' span _ id', métriques avec exemplars.
6. Dashboards : service map, release compare, payments flow.
7. Politiques PII : masquage, zones, rôles, rétentions.
8. Tests/charge : vérification de la corrélation et du traçage complet avant les pics.
9. Auto-génération de liens runbook en alerts.
10. Rapport sur le coût de la télémétrie et de la cardinalité.

18) Anti-modèles

Les traces « à l'entrée seulement » sans OBD/files d'attente ne sont → utiles.
L'absence de propagande dans async → « déchire » les chaînes de causalité.
Sampling aléatoire 1 % sans logique tail → ne pas attraper lent/faux.
Les logs sans 'trace _ id'ne → pas de corrélation de bout en bout.
Les IPI bruts dans les attributs/loges → les risques de complication.
La cardinalité « au plafond » (user/session en tant que labels métriques) → l'explosion du coût.

Résultats

OpenTelemetry transforme l'observabilité d'un ensemble d'outils disparates en un langage de performance de bout en bout. Avec une bonne promotion du contexte, une sémantique soignée, un tail-sampling et un lien de « métriques de piste ↔ ↔ logs », l'équipe iGaming contrôle p95/p99, isole rapidement les goulots d'étranglement (OBD, files d'attente, PSP) et publie avec confiance des versions même dans les pics de trafic.

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.