Skip to content

Commit 2874e59

Browse files
fix(otel): remove yield from execute interceptor
1 parent 17c0bf7 commit 2874e59

File tree

3 files changed

+44
-12
lines changed

3 files changed

+44
-12
lines changed

packages/interceptors-opentelemetry/src/workflow/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,13 @@ export class OpenTelemetryInboundInterceptor implements WorkflowInboundCallsInte
5959
input: WorkflowExecuteInput,
6060
next: Next<WorkflowInboundCallsInterceptor, 'execute'>
6161
): Promise<unknown> {
62-
const context = await Promise.resolve(extractContextFromHeaders(input.headers));
62+
const shouldInjectYield = getActivator().hasFlag(SdkFlags.OpenTelemetryInterceptorInsertYield);
63+
const context = extractContextFromHeaders(input.headers);
6364
return await instrument({
6465
tracer: this.tracer,
6566
spanName: `${SpanName.WORKFLOW_EXECUTE}${SPAN_DELIMITER}${workflowInfo().workflowType}`,
6667
fn: () => next(input),
67-
context,
68+
context: shouldInjectYield ? await Promise.resolve(context) : context,
6869
acceptableErrors: (err) => err instanceof ContinueAsNew,
6970
});
7071
}

packages/test/src/test-flags.ts

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
11
import test from 'ava';
2-
import { SdkFlags } from '@temporalio/workflow/lib/flags';
2+
import { SdkFlags, type SdkFlag } from '@temporalio/workflow/lib/flags';
33
import type { WorkflowInfo } from '@temporalio/workflow';
44

5+
type Conditions = SdkFlag['alternativeConditions'];
6+
function composeConditions(conditions: Conditions): NonNullable<Conditions>[number] {
7+
return (ctx) => {
8+
for (const cond of conditions ?? []) {
9+
if (cond(ctx)) {
10+
return true;
11+
}
12+
}
13+
return false;
14+
};
15+
}
16+
517
test('OpenTelemetryHandleSignalInterceptorInsertYield enabled by version', (t) => {
618
const cases = [
719
{ version: '1.0.0', expected: false },
@@ -14,15 +26,7 @@ test('OpenTelemetryHandleSignalInterceptorInsertYield enabled by version', (t) =
1426
{ version: '1.14.0', expected: false },
1527
];
1628
for (const { version, expected } of cases) {
17-
const alternativeCondition = (ctx: { info: WorkflowInfo; sdkVersion: string | undefined }) => {
18-
for (const cond of SdkFlags.OpenTelemetryHandleSignalInterceptorInsertYield.alternativeConditions!) {
19-
if (cond(ctx)) {
20-
return true;
21-
}
22-
}
23-
return false;
24-
};
25-
const actual = alternativeCondition({
29+
const actual = composeConditions(SdkFlags.OpenTelemetryHandleSignalInterceptorInsertYield.alternativeConditions)({
2630
info: {} as WorkflowInfo,
2731
sdkVersion: version,
2832
});
@@ -33,3 +37,23 @@ test('OpenTelemetryHandleSignalInterceptorInsertYield enabled by version', (t) =
3337
);
3438
}
3539
});
40+
41+
test('OpenTelemetryInterceptorInsertYield enabled by version', (t) => {
42+
const cases = [
43+
{ version: '0.1.0', expected: true },
44+
{ version: '1.0.0', expected: true },
45+
{ version: '1.9.0-rc.0', expected: true },
46+
{ version: '1.11.3', expected: true },
47+
{ version: '1.13.1', expected: true },
48+
{ version: '1.13.2', expected: false },
49+
{ version: '1.14.0', expected: false },
50+
{ version: '2.0.0', expected: false },
51+
];
52+
for (const { version, expected } of cases) {
53+
const actual = composeConditions(SdkFlags.OpenTelemetryInterceptorInsertYield.alternativeConditions)({
54+
info: {} as WorkflowInfo,
55+
sdkVersion: version,
56+
});
57+
t.is(actual, expected, `Expected OpenTelemetryInterceptorInsertYield on ${version} to evaluate as ${expected}`);
58+
}
59+
});

packages/workflow/src/flags.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ export const SdkFlags = {
5959
OpenTelemetryHandleSignalInterceptorInsertYield: defineFlag(3, false, [
6060
isBetween({ major: 1, minor: 11, patch: 3 }, { major: 1, minor: 13, patch: 2 }),
6161
]),
62+
/**
63+
* The interceptors provided by @temporalio/interceptors-opentelemetry initially had unnecessary yield points.
64+
* If replaying a workflow created from these versions a yield point is injected to prevent any NDE.
65+
*
66+
* @since Introduced in 1.13.2
67+
*/
68+
OpenTelemetryInterceptorInsertYield: defineFlag(3, false, [isBefore({ major: 1, minor: 13, patch: 2 })]),
6269
} as const;
6370

6471
function defineFlag(id: number, def: boolean, alternativeConditions?: AltConditionFn[]): SdkFlag {

0 commit comments

Comments
 (0)