Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions contrib/temporal-opentracing/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ This module provides a set of Interceptors that adds support for OpenTracing Spa

You want to register two interceptors - one on the Temporal client side, another on the worker side:

1. Client configuration:
1. Workflow Client configuration:
```java
WorkflowClientOptions.newBuilder()
//...
Expand All @@ -21,6 +21,16 @@ You want to register two interceptors - one on the Temporal client side, another
.build();
```

3. Standalone Activity Client configuration:
```java
ActivityClientOptions activityClientOptions =
ActivityClientOptions.newBuilder()
//...
.setInterceptors(Collections.singletonList(new OpenTracingActivityClientInterceptor()))
.build();
ActivityClient activityClient = ActivityClient.newInstance(service, activityClientOptions);
```

## [OpenTelemetry](https://opentelemetry.io/)

OpenTracing has been merged into OpenTelemetry and nowadays OpenTelemetry should be a preferred solution.
Expand All @@ -38,4 +48,3 @@ to hook their OpenTelemetry setup and make it available for OpenTracing API:
GlobalTracer.registerIfAbsent(tracer);
```


Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package io.temporal.opentracing;

import io.temporal.common.interceptors.ActivityClientCallsInterceptor;
import io.temporal.common.interceptors.ActivityClientInterceptorBase;
import io.temporal.opentracing.internal.ContextAccessor;
import io.temporal.opentracing.internal.OpenTracingActivityClientCallsInterceptor;
import io.temporal.opentracing.internal.SpanFactory;

public class OpenTracingActivityClientInterceptor extends ActivityClientInterceptorBase {
private final OpenTracingOptions options;
private final SpanFactory spanFactory;
private final ContextAccessor contextAccessor;

public OpenTracingActivityClientInterceptor() {
this(OpenTracingOptions.getDefaultInstance());
}

public OpenTracingActivityClientInterceptor(OpenTracingOptions options) {
this.options = options;
this.spanFactory = new SpanFactory(options);
this.contextAccessor = new ContextAccessor(options);
}

@Override
public ActivityClientCallsInterceptor activityClientCallsInterceptor(
ActivityClientCallsInterceptor next) {
return new OpenTracingActivityClientCallsInterceptor(
next, options, spanFactory, contextAccessor);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,23 @@ public class SpanCreationContext {
private final String runId;
private final String parentWorkflowId;
private final String parentRunId;
private final String activityId;

private SpanCreationContext(
SpanOperationType spanOperationType,
String actionName,
String workflowId,
String runId,
String parentWorkflowId,
String parentRunId) {
String parentRunId,
String activityId) {
this.spanOperationType = spanOperationType;
this.actionName = actionName;
this.workflowId = workflowId;
this.runId = runId;
this.parentWorkflowId = parentWorkflowId;
this.parentRunId = parentRunId;
this.activityId = activityId;
}

public SpanOperationType getSpanOperationType() {
Expand Down Expand Up @@ -59,6 +62,10 @@ public String getParentRunId() {
return parentRunId;
}

public @Nullable String getActivityId() {
return activityId;
}

public static Builder newBuilder() {
return new Builder();
}
Expand All @@ -70,6 +77,7 @@ public static final class Builder {
private String runId;
private String parentWorkflowId;
private String parentRunId;
private String activityId;

private Builder() {}

Expand Down Expand Up @@ -103,9 +111,20 @@ public Builder setParentRunId(String parentRunId) {
return this;
}

public Builder setActivityId(String activityId) {
this.activityId = activityId;
return this;
}

public SpanCreationContext build() {
return new SpanCreationContext(
spanOperationType, actionName, workflowId, runId, parentWorkflowId, parentRunId);
spanOperationType,
actionName,
workflowId,
runId,
parentWorkflowId,
parentRunId,
activityId);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
public class StandardTagNames {
public static final String WORKFLOW_ID = "workflowId";
public static final String RUN_ID = "runId";
public static final String ACTIVITY_ID = "activityId";
public static final String PARENT_WORKFLOW_ID = "parentWorkflowId";
public static final String PARENT_RUN_ID = "parentRunId";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,6 @@ protected Map<String, String> getSpanTags(SpanCreationContext context) {
StandardTagNames.WORKFLOW_ID, context.getWorkflowId(),
StandardTagNames.PARENT_RUN_ID, context.getParentRunId());
case RUN_WORKFLOW:
case START_ACTIVITY:
case RUN_ACTIVITY:
case SIGNAL_EXTERNAL_WORKFLOW:
case SIGNAL_WORKFLOW:
case UPDATE_WORKFLOW:
Expand All @@ -80,6 +78,19 @@ protected Map<String, String> getSpanTags(SpanCreationContext context) {
return ImmutableMap.of(
StandardTagNames.WORKFLOW_ID, context.getWorkflowId(),
StandardTagNames.RUN_ID, context.getRunId());
case START_ACTIVITY:
case RUN_ACTIVITY:
ImmutableMap.Builder<String, String> tags = ImmutableMap.builder();
if (context.getActivityId() != null) {
tags.put(StandardTagNames.ACTIVITY_ID, context.getActivityId());
}
if (context.getWorkflowId() != null) {
tags.put(StandardTagNames.WORKFLOW_ID, context.getWorkflowId());
}
if (context.getRunId() != null) {
tags.put(StandardTagNames.RUN_ID, context.getRunId());
}
return tags.build();
case START_NEXUS_OPERATION:
return ImmutableMap.of(
StandardTagNames.WORKFLOW_ID, context.getWorkflowId(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package io.temporal.opentracing.internal;

import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.temporal.common.interceptors.ActivityClientCallsInterceptor;
import io.temporal.common.interceptors.ActivityClientCallsInterceptorBase;
import io.temporal.opentracing.OpenTracingOptions;

public class OpenTracingActivityClientCallsInterceptor extends ActivityClientCallsInterceptorBase {
private final SpanFactory spanFactory;
private final Tracer tracer;
private final ContextAccessor contextAccessor;

public OpenTracingActivityClientCallsInterceptor(
ActivityClientCallsInterceptor next,
OpenTracingOptions options,
SpanFactory spanFactory,
ContextAccessor contextAccessor) {
super(next);
this.spanFactory = spanFactory;
this.tracer = options.getTracer();
this.contextAccessor = contextAccessor;
}

@Override
public StartActivityOutput startActivity(StartActivityInput input) {
Span activityStartSpan =
contextAccessor.writeSpanContextToHeader(
() ->
spanFactory
.createActivityStartSpan(
tracer, input.getActivityType(), null, null, input.getOptions().getId())
.start(),
input.getHeader(),
tracer);
try (Scope ignored = tracer.scopeManager().activate(activityStartSpan)) {
return super.startActivity(input);
} finally {
activityStartSpan.finish();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public ActivityOutput execute(ActivityInput input) {
activityInfo.getActivityType(),
activityInfo.getWorkflowId(),
activityInfo.getWorkflowRunId(),
activityInfo.getActivityId(),
rootSpanContext)
.start();
try (Scope scope = tracer.scopeManager().activate(activityRunSpan)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ public Object newChildThread(Runnable runnable, boolean detached, String name) {
private Tracer.SpanBuilder createActivityStartSpanBuilder(String activityName) {
WorkflowInfo workflowInfo = Workflow.getInfo();
return spanFactory.createActivityStartSpan(
tracer, activityName, workflowInfo.getWorkflowId(), workflowInfo.getRunId());
tracer, activityName, workflowInfo.getWorkflowId(), workflowInfo.getRunId(), null);
}

private <R> Tracer.SpanBuilder createChildWorkflowStartSpanBuilder(ChildWorkflowInput<R> input) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,29 +139,36 @@ public Tracer.SpanBuilder createWorkflowRunSpan(
}

public Tracer.SpanBuilder createActivityStartSpan(
Tracer tracer, String activityType, String workflowId, String runId) {
Tracer tracer,
String activityType,
@Nullable String workflowId,
@Nullable String runId,
@Nullable String activityId) {
SpanCreationContext context =
SpanCreationContext.newBuilder()
.setSpanOperationType(SpanOperationType.START_ACTIVITY)
.setActionName(activityType)
.setWorkflowId(workflowId)
.setRunId(runId)
.setActivityId(activityId)
.build();
return createSpan(context, tracer, null, References.CHILD_OF);
}

public Tracer.SpanBuilder createActivityRunSpan(
Tracer tracer,
String activityType,
String workflowId,
String runId,
@Nullable String workflowId,
@Nullable String runId,
@Nullable String activityId,
SpanContext activityStartSpanContext) {
SpanCreationContext context =
SpanCreationContext.newBuilder()
.setSpanOperationType(SpanOperationType.RUN_ACTIVITY)
.setActionName(activityType)
.setWorkflowId(workflowId)
.setRunId(runId)
.setActivityId(activityId)
.build();
return createSpan(context, tracer, activityStartSpanContext, References.FOLLOWS_FROM);
}
Expand Down
Loading