Skip to content

Commit a300569

Browse files
torosentCopilot
andcommitted
Align tracing with .NET SDK schema and conventions
- Tracer name: 'Microsoft.DurableTask' (matching .NET ActivitySource) - Span kinds: Server for worker execution (matching .NET) - Span naming: 'orchestration:<name>' and 'activity:<name>' (not instanceId) - Add 'durabletask.type' attribute on all spans (matching .NET Schema.cs) - Use shared constants for attribute keys and type values - Extract orchestration name from ExecutionStartedEvent for span names Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 823d17f commit a300569

File tree

4 files changed

+51
-23
lines changed

4 files changed

+51
-23
lines changed

client/src/main/java/com/microsoft/durabletask/DurableTaskGrpcWorker.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -176,21 +176,27 @@ public void startAndBlock() {
176176
// TODO: Run this on a worker pool thread: https://www.baeldung.com/thread-pool-java-and-guava
177177
// TODO: Error handling
178178
if (!versioningFailed) {
179-
// Extract trace context from ExecutionStartedEvent in the history
180-
TraceContext orchTraceCtx = Stream.concat(
179+
// Extract ExecutionStartedEvent for trace context and orchestration name
180+
ExecutionStartedEvent startedEvent = Stream.concat(
181181
orchestratorRequest.getPastEventsList().stream(),
182182
orchestratorRequest.getNewEventsList().stream())
183183
.filter(event -> event.getEventTypeCase() == HistoryEvent.EventTypeCase.EXECUTIONSTARTED)
184-
.filter(event -> event.getExecutionStarted().hasParentTraceContext())
185-
.map(event -> event.getExecutionStarted().getParentTraceContext())
184+
.map(HistoryEvent::getExecutionStarted)
186185
.findFirst()
187186
.orElse(null);
187+
188+
TraceContext orchTraceCtx = (startedEvent != null && startedEvent.hasParentTraceContext())
189+
? startedEvent.getParentTraceContext() : null;
190+
String orchName = startedEvent != null ? startedEvent.getName() : "";
191+
188192
Map<String, String> orchSpanAttrs = new HashMap<>();
189-
orchSpanAttrs.put("durabletask.task.instance_id", orchestratorRequest.getInstanceId());
193+
orchSpanAttrs.put(TracingHelper.ATTR_TYPE, TracingHelper.TYPE_ORCHESTRATION);
194+
orchSpanAttrs.put(TracingHelper.ATTR_TASK_NAME, orchName);
195+
orchSpanAttrs.put(TracingHelper.ATTR_INSTANCE_ID, orchestratorRequest.getInstanceId());
190196
Span orchestrationSpan = TracingHelper.startSpan(
191-
"orchestration:" + orchestratorRequest.getInstanceId(),
197+
TracingHelper.TYPE_ORCHESTRATION + ":" + orchName,
192198
orchTraceCtx,
193-
SpanKind.INTERNAL,
199+
SpanKind.SERVER,
194200
orchSpanAttrs);
195201
Scope orchestrationScope = orchestrationSpan.makeCurrent();
196202

@@ -254,13 +260,14 @@ public void startAndBlock() {
254260
TraceContext activityTraceCtx = activityRequest.hasParentTraceContext()
255261
? activityRequest.getParentTraceContext() : null;
256262
Map<String, String> spanAttributes = new HashMap<>();
257-
spanAttributes.put("durabletask.task.instance_id", activityInstanceId);
258-
spanAttributes.put("durabletask.task.name", activityRequest.getName());
259-
spanAttributes.put("durabletask.task.task_id", String.valueOf(activityRequest.getTaskId()));
263+
spanAttributes.put(TracingHelper.ATTR_TYPE, TracingHelper.TYPE_ACTIVITY);
264+
spanAttributes.put(TracingHelper.ATTR_TASK_NAME, activityRequest.getName());
265+
spanAttributes.put(TracingHelper.ATTR_INSTANCE_ID, activityInstanceId);
266+
spanAttributes.put(TracingHelper.ATTR_TASK_ID, String.valueOf(activityRequest.getTaskId()));
260267
Span activitySpan = TracingHelper.startSpan(
261-
"activity:" + activityRequest.getName(),
268+
TracingHelper.TYPE_ACTIVITY + ":" + activityRequest.getName(),
262269
activityTraceCtx,
263-
SpanKind.INTERNAL,
270+
SpanKind.SERVER,
264271
spanAttributes);
265272
Scope activityScope = activitySpan.makeCurrent();
266273

client/src/main/java/com/microsoft/durabletask/OrchestrationRunner.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,21 +151,27 @@ public TaskOrchestration create() {
151151
logger,
152152
versioningOptions);
153153

154-
// Extract trace context from ExecutionStartedEvent in the history
155-
OrchestratorService.TraceContext orchTraceCtx = java.util.stream.Stream.concat(
154+
// Extract ExecutionStartedEvent for trace context and orchestration name
155+
OrchestratorService.ExecutionStartedEvent startedEvent = java.util.stream.Stream.concat(
156156
orchestratorRequest.getPastEventsList().stream(),
157157
orchestratorRequest.getNewEventsList().stream())
158158
.filter(event -> event.getEventTypeCase() == OrchestratorService.HistoryEvent.EventTypeCase.EXECUTIONSTARTED)
159-
.filter(event -> event.getExecutionStarted().hasParentTraceContext())
160-
.map(event -> event.getExecutionStarted().getParentTraceContext())
159+
.map(OrchestratorService.HistoryEvent::getExecutionStarted)
161160
.findFirst()
162161
.orElse(null);
162+
163+
OrchestratorService.TraceContext orchTraceCtx = (startedEvent != null && startedEvent.hasParentTraceContext())
164+
? startedEvent.getParentTraceContext() : null;
165+
String orchName = startedEvent != null ? startedEvent.getName() : "";
166+
163167
Map<String, String> orchSpanAttrs = new HashMap<>();
164-
orchSpanAttrs.put("durabletask.task.instance_id", orchestratorRequest.getInstanceId());
168+
orchSpanAttrs.put(TracingHelper.ATTR_TYPE, TracingHelper.TYPE_ORCHESTRATION);
169+
orchSpanAttrs.put(TracingHelper.ATTR_TASK_NAME, orchName);
170+
orchSpanAttrs.put(TracingHelper.ATTR_INSTANCE_ID, orchestratorRequest.getInstanceId());
165171
Span orchestrationSpan = TracingHelper.startSpan(
166-
"orchestration:" + orchestratorRequest.getInstanceId(),
172+
TracingHelper.TYPE_ORCHESTRATION + ":" + orchName,
167173
orchTraceCtx,
168-
SpanKind.INTERNAL,
174+
SpanKind.SERVER,
169175
orchSpanAttrs);
170176
Scope orchestrationScope = orchestrationSpan.makeCurrent();
171177

client/src/main/java/com/microsoft/durabletask/TracingHelper.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,18 @@
3232
*/
3333
final class TracingHelper {
3434

35-
private static final String TRACER_NAME = "durabletask";
35+
private static final String TRACER_NAME = "Microsoft.DurableTask";
36+
37+
// Span type constants matching .NET SDK schema
38+
static final String TYPE_ORCHESTRATION = "orchestration";
39+
static final String TYPE_ACTIVITY = "activity";
40+
static final String TYPE_CREATE_ORCHESTRATION = "create_orchestration";
41+
42+
// Attribute keys matching .NET SDK schema
43+
static final String ATTR_TYPE = "durabletask.type";
44+
static final String ATTR_TASK_NAME = "durabletask.task.name";
45+
static final String ATTR_INSTANCE_ID = "durabletask.task.instance_id";
46+
static final String ATTR_TASK_ID = "durabletask.task.task_id";
3647

3748
private TracingHelper() {
3849
// Static utility class

client/src/test/java/com/microsoft/durabletask/TracingHelperTest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,21 +126,25 @@ void extractTraceContext_withTraceState_preservesState() {
126126
@Test
127127
void startSpan_createsSpanWithAttributes() {
128128
Map<String, String> attrs = new HashMap<>();
129-
attrs.put("durabletask.task.name", "test-activity");
130-
attrs.put("durabletask.task.instance_id", "abc123");
129+
attrs.put(TracingHelper.ATTR_TYPE, TracingHelper.TYPE_ACTIVITY);
130+
attrs.put(TracingHelper.ATTR_TASK_NAME, "test-activity");
131+
attrs.put(TracingHelper.ATTR_INSTANCE_ID, "abc123");
131132

132-
Span span = TracingHelper.startSpan("activity:test-activity", null, SpanKind.INTERNAL, attrs);
133+
Span span = TracingHelper.startSpan("activity:test-activity", null, SpanKind.SERVER, attrs);
133134
assertNotNull(span);
134135
span.end();
135136

136137
List<SpanData> spans = spanExporter.getFinishedSpanItems();
137138
assertEquals(1, spans.size());
138139
SpanData spanData = spans.get(0);
139140
assertEquals("activity:test-activity", spanData.getName());
141+
assertEquals(io.opentelemetry.api.trace.SpanKind.SERVER, spanData.getKind());
140142
assertEquals("test-activity", spanData.getAttributes().get(
141143
io.opentelemetry.api.common.AttributeKey.stringKey("durabletask.task.name")));
142144
assertEquals("abc123", spanData.getAttributes().get(
143145
io.opentelemetry.api.common.AttributeKey.stringKey("durabletask.task.instance_id")));
146+
assertEquals("activity", spanData.getAttributes().get(
147+
io.opentelemetry.api.common.AttributeKey.stringKey("durabletask.type")));
144148
}
145149

146150
@Test

0 commit comments

Comments
 (0)