コンテキスト伝播とBaggage
分散処理を関連付けるOpenTelemetryの重要概念、コンテキスト伝播を詳しく学びます。Baggageを使ってサービス間で任意のデータを運ぶ方法も確認します。
「コンテキスト伝播とBaggage」はCoddyKit上の無料System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)レッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSystem Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)コースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
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
traceparentandtracestate. - 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!
よくある質問
「コンテキスト伝播とBaggage」レッスンは無料ですか?
はい。「コンテキスト伝播とBaggage」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)コースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)コースには全4レッスンが含まれています。
「コンテキスト伝播とBaggage」で何を学びますか?
分散処理を関連付けるOpenTelemetryの重要概念、コンテキスト伝播を詳しく学びます。Baggageを使ってサービス間で任意のデータを運ぶ方法も確認します。 ブラウザで直接実行するハンズオンコードでSystem Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)を演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
System Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)を始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSystem Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「コンテキスト伝播とBaggage」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSystem Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)レッスンでコードを書いて実行できますか?
はい。すべてのSystem Observability: Logging, Metrics & Tracing (ELK + OpenTelemetry)レッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 自動計装の手法
- 手動計装のベストプラクティス
- コンテキスト伝播とBaggage
- スパンの属性・イベント・ステータス