La propagation du contexte de trace transmet les métadonnées de traçage (identifiants de trace, identifiants de span et décisions d'échantillonnage) entre les services d'une application distribuée. Cela permet de corréler tous les spans d'une requête au sein d'une seule trace de bout en bout.
Application Real-Time Monitoring Service (ARMS) prend en charge cinq protocoles de propagation de trace.
| Protocole | Type | Préfixe d'en-tête |
|---|---|---|
| EagleEye | Propriétaire Alibaba Cloud | EagleEye- |
| W3C Trace Context | Standard W3C | traceparent, tracestate |
| Zipkin (B3) | Open source | X-B3- |
| Jaeger | Open source | uber-trace-id |
| SkyWalking | Open source | sw8 |
Protocole EagleEye
EagleEye est un protocole propriétaire d'Alibaba Cloud développé par ARMS et largement utilisé dans les services Alibaba Cloud.
Champs d'en-tête
| En-tête | Description | Exemple |
|---|---|---|
EagleEye-TraceID |
Identifiant de trace (chaîne aléatoire de 32 bits). | -- |
EagleEye-RpcID |
Relation hiérarchique entre les spans. 0 représente le span parent ; 0.1 et 0.2 sont des spans enfants de 0 ; 0.1.1 est un enfant de 0.1. |
0, 0.1, 0.2, 0.1.1 |
EagleEye-SpanID |
Identifiant de span (entier long aléatoire). Compatible avec les champs redondants open source. | -- |
EagleEye-pSpanID |
Identifiant du span parent (entier long aléatoire). Compatible avec les champs redondants open source. | -- |
EagleEye-Sampled |
Indicateur d'échantillonnage. | -- |
EagleEye-pAppName |
Nom de l'application en amont. | -- |
EagleEye-pRpc |
Interface de l'application en amont. | -- |
EagleEye-UserData |
Données de bagage propagées avec la trace. | k1=v1&k2=v2 |
Protocole W3C Trace Context
La spécification W3C Trace Context est une norme neutre vis-à-vis des fournisseurs, définie par le World Wide Web Consortium (W3C).
Champs d'en-tête
| En-tête | Format | Exemple |
|---|---|---|
traceparent |
<version>-<trace-id>-<parent-span-id>-<Sampling identifier> (version sur 2 bits, ID de trace sur 32 bits, ID de span parent sur 16 bits, identifiant d'échantillonnage) |
00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01 |
tracestate |
Données de bagage propagées avec la trace. | k1=v1&k2=v2 |
Protocole Zipkin (B3)
Le format de propagation B3 est utilisé par Zipkin.
Champs d'en-tête
| En-tête | Description | Exemple |
|---|---|---|
X-B3-TraceId |
Identifiant de trace sur 32 bits. | 0af7651916cd43dd8448eb211c80319c |
X-B3-SpanId |
Identifiant de span sur 16 bits. | b7ad6b7169203331 |
X-B3-ParentSpanId |
Identifiant du span parent sur 16 bits. | b7ad6b7169203331 |
X-B3-Sampled |
Indicateur d'échantillonnage. 1 = échantillonné, 0 = non échantillonné. |
1 |
baggage- |
Préfixe des données de bagage. Ajoutez le nom de la clé après le préfixe. | baggage-k1=v1, baggage-k2=v2 |
Protocole Jaeger
Le format de propagation Jaeger est utilisé par Jaeger.
Champs d'en-tête
| En-tête | Format | Exemple |
|---|---|---|
uber-trace-id |
<trace-id>:<span-id>:<parent-span-id>:<flags> |
0af7651916cd43dd8448eb211c80319c:b7ad6b7169203331:b7ad6b7169203331:1 |
uberctx- |
Préfixe des données de bagage. Ajoutez le nom de la clé après le préfixe. | uberctx-k1=v1, uberctx-k2=v2 |
Protocole SkyWalking
Le format de propagation SkyWalking est utilisé par Apache SkyWalking.
En-tête sw8
L'en-tête sw8 se compose de huit champs séparés par des traits d'union. Toutes les valeurs de chaîne doivent être encodées en Base64. La longueur totale de l'en-tête doit être inférieure à 2 000 caractères.
| Champ | Position | Description |
|---|---|---|
| Sample | 1 | 0 = le contexte existe mais peut être ignoré. 1 = échantillonner et envoyer au backend. |
| Trace ID | 2 | Identifiant de trace unique. Chaîne encodée en Base64 composée de trois valeurs longues séparées par des points (.). |
| Parent trace segment ID | 3 | Identifiant de segment globalement unique. Chaîne encodée en Base64. |
| Parent span ID | 4 | 0 ou un entier positif. |
| Parent service | 5 | Chaîne encodée en Base64. Doit dépasser 50 caractères UTF-8. |
| Parent service instance ID | 6 | Chaîne encodée en Base64. Doit dépasser 50 caractères UTF-8. |
| Parent service endpoint | 7 | Endpoint du premier span d'entrée dans le segment de trace parent. Chaîne encodée en Base64. Doit dépasser 50 caractères UTF-8. |
| Destination URL | 8 | URL du service de destination. Le format peut différer de <IP address><Port number>. Chaîne encodée en Base64. |
Exemple :
1-TRACEID-SEGMENTID-3-PARENT_SERVICE-PARENT_INSTANCE-PARENT_ENDPOINT-IPPORT
En-tête sw8-x
L'en-tête sw8-x transporte des champs d'extension, également séparés par des traits d'union. Les champs peuvent être étendus selon les besoins.
Le mode de suivi accepte null, 0 ou 1 :
nullou0(par défaut) : Tous les spans générés dans le contexte actuel ne sont pas analysés. Le contexte est propagé en amont par défaut, sauf modification pendant le suivi.1: Les spans sont analysés.
Fonctionnement
L'agent ARMS sélectionne automatiquement un protocole de propagation de trace en fonction des en-têtes présents dans chaque requête entrante.
Flux de sélection
Prenons l'exemple d'une trace qui traverse les services A, B et C. Lorsque chaque service reçoit une requête, l'agent ARMS applique la logique suivante :
-
Analysez les en-têtes de requête pour détecter les champs spécifiques au protocole. L'analyse suit un ordre de priorité fixe :
Version de l'agent ARMS Ordre de priorité (du plus élevé au plus faible) v4.5.x et ultérieures W3C > EagleEye > SkyWalking > Jaeger > Zipkin v4.x à v4.4.x EagleEye > W3C > SkyWalking > Jaeger > Zipkin Antérieures à v4.x EagleEye > Jaeger > Zipkin > SkyWalking > W3C Si un en-tête correspondant est trouvé, l'agent restaure le contexte de trace à partir de la requête et utilise le même protocole pour propager le contexte vers les services en aval.
Si aucun en-tête correspondant n'est trouvé, l'agent crée un nouveau contexte de trace et le propage en utilisant le protocole de priorité la plus élevée. Par défaut, il s'agit du protocole EagleEye.
Personnaliser la priorité des protocoles
Pour modifier la priorité par défaut des protocoles, accédez à Configuration > Custom Configurations et mettez à jour la section Trace context propagation protocol settings. Pour plus de détails, consultez Paramètres du protocole de propagation du contexte de trace.