From 1beeb5f439ea77370ebaf49d65150f3d46026704 Mon Sep 17 00:00:00 2001 From: Arnab Nandy Date: Sat, 8 Aug 2026 20:40:28 +0530 Subject: [PATCH] Add OpenTelemetry baggage propagation Signed-off-by: Arnab Nandy --- .../src/proto/FunctionRpc.proto | 3 +++ .../worker/binding/ExecutionTraceContext.java | 9 +++++++-- .../worker/broker/JavaFunctionBroker.java | 3 ++- .../worker/broker/ParameterResolverTest.java | 3 ++- .../worker/test/ExecutionTraceContextTest.java | 15 +++++++++++---- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/main/azure-functions-language-worker-protobuf/src/proto/FunctionRpc.proto b/src/main/azure-functions-language-worker-protobuf/src/proto/FunctionRpc.proto index 5fb7f218..7403ac72 100644 --- a/src/main/azure-functions-language-worker-protobuf/src/proto/FunctionRpc.proto +++ b/src/main/azure-functions-language-worker-protobuf/src/proto/FunctionRpc.proto @@ -392,6 +392,9 @@ message RpcTraceContext { // This corresponds to Activity.Current?.Tags map attributes = 3; + + // This is populated from OpenTelemetry.Baggage.Current + map baggage = 4; } // Host sends retry context for a function invocation diff --git a/src/main/java/com/microsoft/azure/functions/worker/binding/ExecutionTraceContext.java b/src/main/java/com/microsoft/azure/functions/worker/binding/ExecutionTraceContext.java index 9673807e..86bea143 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/binding/ExecutionTraceContext.java +++ b/src/main/java/com/microsoft/azure/functions/worker/binding/ExecutionTraceContext.java @@ -5,8 +5,10 @@ import com.microsoft.azure.functions.TraceContext; final public class ExecutionTraceContext implements TraceContext { - public ExecutionTraceContext(String traceParent, String traceState, Map attributes) { + public ExecutionTraceContext(String traceParent, String traceState, Map attributes, + Map baggage) { this.Attributes = attributes; + this.Baggage = baggage; this.Traceparent = traceParent; this.Tracestate = traceState; } @@ -20,7 +22,10 @@ public ExecutionTraceContext(String traceParent, String traceState, Map getAttributes() { return this.Attributes; } + public Map getBaggage() { return this.Baggage; } + private final String Traceparent; private final String Tracestate; private final Map Attributes; -} \ No newline at end of file + private final Map Baggage; +} diff --git a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java index 730a4ce8..87c47710 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java +++ b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java @@ -213,7 +213,8 @@ private ExecutionContextDataSource buildExecutionContext(String id, InvocationR dataStore.addTriggerMetadataSource(getTriggerMetadataMap(request)); dataStore.addParameterSources(request.getInputDataList()); ExecutionTraceContext traceContext = new ExecutionTraceContext(request.getTraceContext().getTraceParent(), - request.getTraceContext().getTraceState(), request.getTraceContext().getAttributesMap()); + request.getTraceContext().getTraceState(), request.getTraceContext().getAttributesMap(), + request.getTraceContext().getBaggageMap()); ExecutionRetryContext retryContext = new ExecutionRetryContext(request.getRetryContext().getRetryCount(), request.getRetryContext().getMaxRetryCount(), request.getRetryContext().getException()); ExecutionContextDataSource executionContextDataSource = new ExecutionContextDataSource( diff --git a/src/test/java/com/microsoft/azure/functions/worker/broker/ParameterResolverTest.java b/src/test/java/com/microsoft/azure/functions/worker/broker/ParameterResolverTest.java index 443427ec..5c03453c 100644 --- a/src/test/java/com/microsoft/azure/functions/worker/broker/ParameterResolverTest.java +++ b/src/test/java/com/microsoft/azure/functions/worker/broker/ParameterResolverTest.java @@ -35,7 +35,8 @@ public class ParameterResolverTest { @BeforeEach public void setup() { String invocationId = "testInvocationId"; - ExecutionTraceContext traceContext = new ExecutionTraceContext("traceParent", "traceState", new HashMap<>()); + ExecutionTraceContext traceContext = new ExecutionTraceContext("traceParent", "traceState", new HashMap<>(), + new HashMap<>()); ExecutionRetryContext retryContext = new ExecutionRetryContext(1, 2, RpcException.newBuilder().build()); String functionName = "ParameterResolverTest"; BindingDataStore dataStore = new BindingDataStore(); diff --git a/src/test/java/com/microsoft/azure/functions/worker/test/ExecutionTraceContextTest.java b/src/test/java/com/microsoft/azure/functions/worker/test/ExecutionTraceContextTest.java index 197a1a47..f8218b33 100644 --- a/src/test/java/com/microsoft/azure/functions/worker/test/ExecutionTraceContextTest.java +++ b/src/test/java/com/microsoft/azure/functions/worker/test/ExecutionTraceContextTest.java @@ -15,15 +15,19 @@ public void TraceContext_test_getAndset_nonEmpty() { String traceParent = "randomTraceParent"; String traceState = "randomTraceState"; HashMap attributes = new HashMap(); + HashMap baggage = new HashMap(); attributes.put("key1", "value1"); attributes.put("key2", "value2"); + baggage.put("baggageKey1", "baggageValue1"); + baggage.put("baggageKey2", "baggageValue2"); - TraceContext testTraceContext = new ExecutionTraceContext(traceParent, traceState, attributes); + ExecutionTraceContext testTraceContext = new ExecutionTraceContext(traceParent, traceState, attributes, baggage); assertEquals(traceParent, testTraceContext.getTraceparent()); assertEquals(traceState, testTraceContext.getTracestate()); assertEquals(traceState, testTraceContext.getTracestate()); assertEquals(attributes, testTraceContext.getAttributes()); + assertEquals(baggage, testTraceContext.getBaggage()); } @Test @@ -31,19 +35,22 @@ public void TraceContext_test_getAndset_Empty() { String traceParent = ""; String traceState = ""; HashMap attributes = new HashMap(); - TraceContext testTraceContext = new ExecutionTraceContext(traceParent, traceState, attributes); + HashMap baggage = new HashMap(); + ExecutionTraceContext testTraceContext = new ExecutionTraceContext(traceParent, traceState, attributes, baggage); assertEquals(traceParent, testTraceContext.getTraceparent()); assertEquals(traceState, testTraceContext.getTracestate()); assertEquals(traceState, testTraceContext.getTracestate()); assertEquals(attributes, testTraceContext.getAttributes()); + assertEquals(baggage, testTraceContext.getBaggage()); } @Test public void TraceContext_test_getAndset_Null() { - TraceContext testTraceContext = new ExecutionTraceContext(null, null, null); + ExecutionTraceContext testTraceContext = new ExecutionTraceContext(null, null, null, null); assertEquals(null, testTraceContext.getTraceparent()); assertEquals(null, testTraceContext.getTracestate()); assertEquals(null, testTraceContext.getTracestate()); assertEquals(null, testTraceContext.getAttributes()); + assertEquals(null, testTraceContext.getBaggage()); } -} \ No newline at end of file +}