System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry) · Leçon

Propagation du contexte et bagages

Approfondissez la propagation du contexte, un concept clé d’OpenTelemetry pour relier les opérations distribuées. Découvrez comment les bagages peuvent transporter des données arbitraires entre les services.

Leçon 3 sur 411 étapes

Propagation du contexte et bagages est une leçon System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry) gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry), et ta progression se synchronise sur le web et l'application CoddyKit. Le cours System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry) comprend 4 leçons au total.

Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.

Linking Distributed Operations

In modern applications, a single user request often travels through many different services. Imagine an online store: your click goes to a frontend, then an order service, a payment service, and a shipping service.

How do we track this journey? If each service logs independently, it's like trying to follow a single thread in a tangled ball of yarn!

What is Context Propagation?

Context propagation is the magic that links these distributed operations together. It ensures that all parts of a request, no matter which service they touch, share a common understanding of that request.

Think of it like a relay race: the 'baton' (the context) is passed from one runner (service) to the next, linking all their efforts to a single goal.

The Trace Context Explained

The core of context propagation is the Trace Context. This usually contains two vital pieces of information:

  • Trace ID: A unique identifier for the entire request journey across all services.
  • Span ID: A unique identifier for the current operation within a service.

These IDs are crucial for OpenTelemetry to build a complete picture of your request's flow.

How Context Travels

Context doesn't just magically appear! OpenTelemetry uses 'propagators' to inject and extract this context.

Common ways context is propagated:

  • HTTP Headers: Standard headers like traceparent and tracestate.
  • gRPC Metadata: Similar to HTTP headers, but for gRPC calls.
  • Message Queue Properties: When sending messages between services.

These mechanisms ensure the Trace ID and Span ID follow the request.

Injecting Context Demo

When a service makes an outgoing call to another service, the current trace context needs to be 'injected' into the request. This example simulates adding trace context to headers.

import io.opentelemetry.api.trace.Span; 
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapSetter;
import java.util.HashMap;
import java.util.Map;

public class ContextInjector {

  public static void main(String[] args) {
    // Simulate an active span context
    SpanContext simulatedSpanContext =
        SpanContext.create(
            "0123456789abcdef0123456789abcdef", // Trace ID
            "fedcba9876543210", // Span ID
            io.opentelemetry.api.trace.TraceFlags.getDefault(),
            io.opentelemetry.api.trace.TraceState.getDefault());
    Span span = Span.wrap(simulatedSpanContext);
    Context context = Context.current().with(span);

    Map<String, String> headers = new HashMap<>();
    TextMapSetter<Map<String, String>> setter = Map::put;

    // OpenTelemetry usually handles this implicitly
    // Here, we simulate injecting context into headers
    // using a simplified representation.
    headers.put("traceparent", "00-" + simulatedSpanContext.getTraceId() + "-" + simulatedSpanContext.getSpanId() + "-01");
    
    System.out.println("Injected Headers:");
    headers.forEach((key, value) -> System.out.println(key + ": " + value));
  }
}

Extracting Context Demo

When a service receives an incoming request, it needs to 'extract' the trace context from the request. This allows it to continue the trace initiated by the upstream service.

import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapGetter;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import java.util.HashMap;
import java.util.Map;

public class ContextExtractor {

  public static void main(String[] args) {
    Map<String, String> incomingHeaders = new HashMap<>();
    incomingHeaders.put("traceparent", "00-112233445566778899aabbccddeeff00-aabbccddeeff0011-01");

    TextMapGetter<Map<String, String>> getter = new TextMapGetter<Map<String, String>>() {
      @Override
      public Iterable<String> keys(Map<String, String> carrier) {
        return carrier.keySet();
      }

      @Override
      public String get(Map<String, String> carrier, String key) {
        return carrier.get(key);
      }
    };

    // In a real app, OpenTelemetry.getGlobalPropagators() would be used
    TextMapPropagator propagator = OpenTelemetrySdk.builder().build()
        .getPropagators().getTextMapPropagator();

    Context extractedContext = propagator.extract(Context.current(), incomingHeaders, getter);
    SpanContext spanContext = Span.fromContext(extractedContext).getSpanContext();

    System.out.println("Extracted Trace ID: " + spanContext.getTraceId());
    System.out.println("Extracted Span ID: " + spanContext.getSpanId());
  }
}

Carrying Extra Data: Baggage

Beyond just trace and span IDs, sometimes you need to carry arbitrary key-value data across services that's relevant to the business logic, but not directly for tracing.

This is where Baggage comes in! It's a collection of key-value pairs that travel alongside the trace context.

Baggage vs. Trace Context

It's important to understand the difference:

  • Trace Context: Essential for linking spans and building the trace graph. It's structural.
  • Baggage: Carries application-specific data. Examples include a user_id, tenant_id, or an A/B test variant. It's informational.

Baggage is propagated using the same mechanisms as trace context (e.g., HTTP headers), often in a header like baggage.

Using Baggage Demo

Here's how you can add an item to Baggage in one part of your application and retrieve it in another, potentially downstream, service. This data travels with the request.

import io.opentelemetry.api.baggage.Baggage;
import io.opentelemetry.context.Context;

public class BaggageUsage {

  public static void main(String[] args) {
    // --- Service A: Add to Baggage ---
    System.out.println("--- Service A ---");
    Context contextWithBaggage = Baggage.current()
        .toBuilder()
        .put("user.id", "12345")
        .put("ab.test.group", "variantA")
        .build()
        .make   Current(); // Make this baggage active in current context

    System.out.println("Added user.id: " + Baggage.current().getEntryValue("user.id"));
    System.out.println("Added ab.test.group: " + Baggage.current().getEntryValue("ab.test.group"));
    
    // Simulate passing context (and thus baggage) to Service B
    // In a real app, this would be via HTTP headers, etc.
    callServiceB(contextWithBaggage);
  }

  public static void callServiceB(Context parentContext) {
    // --- Service B: Retrieve from Baggage ---
    System.out.println("\n--- Service B ---");
    // Activate the context from Service A
    try (io.opentelemetry.context.Scope scope = parentContext.makeCurrent()) {
      Baggage currentBaggage = Baggage.current();
      System.out.println("Retrieved user.id: " + currentBaggage.getEntryValue("user.id"));
      System.out.println("Retrieved ab.test.group: " + currentBaggage.getEntryValue("ab.test.group"));
    }
  }
}

Context Propagation Check

You're debugging a distributed system. A user reports an issue, and you have their user_id. You want to see all logs and traces related to this user across multiple services.

Context & Baggage Summary

You've learned how context propagation is fundamental to distributed tracing, using Trace IDs and Span IDs to link operations across services.

You also explored Baggage, a powerful mechanism to carry custom, application-specific data (like a user_id or A/B test group) alongside your trace context, enriching your observability data.

These concepts are vital for building a complete and actionable view of your distributed applications!

Gratuit pour commencer

Apprends System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry) avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
12
Leçons
48

Questions Fréquemment Posées

La leçon « Propagation du contexte et bagages » est-elle gratuite ?

Oui — le texte complet de « Propagation du contexte et bagages » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry), passe à CoddyKit PRO. Le cours System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry) comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Propagation du contexte et bagages » ?

Approfondissez la propagation du contexte, un concept clé d’OpenTelemetry pour relier les opérations distribuées. Découvrez comment les bagages peuvent transporter des données arbitraires entre les s… Tu pratiques System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry) avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry) ?

Aucune expérience préalable n'est requise. System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry) sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Propagation du contexte et bagages » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry) ?

Oui. Chaque leçon System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry) inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Techniques d’instrumentation automatique
  2. Bonnes pratiques de l’instrumentation manuelle
  3. Propagation du contexte et bagages
  4. Attributs, événements et état des spans
← Retour à System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)