diff --git a/packages/core-bridge/Cargo.lock b/packages/core-bridge/Cargo.lock index a3f0f9339..c3e0f6f6f 100644 --- a/packages/core-bridge/Cargo.lock +++ b/packages/core-bridge/Cargo.lock @@ -1375,23 +1375,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "opentelemetry" -version = "0.29.1" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e87237e2775f74896f9ad219d26a2081751187eb7c9f5c58dde20a23b95d16c" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 2.0.14", - "tracing", -] - -[[package]] -name = "opentelemetry" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf416e4cb72756655126f7dd7bb0af49c674f4c1b9903e80c009e0c37e552e6" +checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" dependencies = [ "futures-core", "futures-sink", @@ -1403,25 +1389,25 @@ dependencies = [ [[package]] name = "opentelemetry-http" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f6639e842a97dbea8886e3439710ae463120091e2e064518ba8e716e6ac36d" +checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" dependencies = [ "async-trait", "bytes", "http", - "opentelemetry 0.30.0", + "opentelemetry", "reqwest", ] [[package]] name = "opentelemetry-otlp" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbee664a43e07615731afc539ca60c6d9f1a9425e25ca09c57bc36c87c55852b" +checksum = "7a2366db2dca4d2ad033cad11e6ee42844fd727007af5ad04a1730f4cb8163bf" dependencies = [ "http", - "opentelemetry 0.30.0", + "opentelemetry", "opentelemetry-http", "opentelemetry-proto", "opentelemetry_sdk", @@ -1435,29 +1421,29 @@ dependencies = [ [[package]] name = "opentelemetry-proto" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e046fd7660710fe5a05e8748e70d9058dc15c94ba914e7c4faa7c728f0e8ddc" +checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" dependencies = [ - "opentelemetry 0.30.0", + "opentelemetry", "opentelemetry_sdk", "prost", "tonic", + "tonic-prost", ] [[package]] name = "opentelemetry_sdk" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4b" +checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" dependencies = [ "futures-channel", "futures-executor", "futures-util", - "opentelemetry 0.30.0", + "opentelemetry", "percent-encoding", "rand 0.9.2", - "serde_json", "thiserror 2.0.14", "tokio", "tokio-stream", @@ -1654,9 +1640,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.5" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" dependencies = [ "bytes", "prost-derive", @@ -1664,9 +1650,9 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.13.5" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" dependencies = [ "heck", "itertools", @@ -1677,6 +1663,8 @@ dependencies = [ "prettyplease", "prost", "prost-types", + "pulldown-cmark", + "pulldown-cmark-to-cmark", "regex", "syn", "tempfile", @@ -1684,9 +1672,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.5" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" dependencies = [ "anyhow", "itertools", @@ -1697,18 +1685,18 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.13.5" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" dependencies = [ "prost", ] [[package]] name = "prost-wkt" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497e1e938f0c09ef9cabe1d49437b4016e03e8f82fbbe5d1c62a9b61b9decae1" +checksum = "655944d0ce015e71b3ec21279437e6a09e58433e50c7b0677901f3d5235e74f5" dependencies = [ "chrono", "inventory", @@ -1721,9 +1709,9 @@ dependencies = [ [[package]] name = "prost-wkt-build" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b8bf115b70a7aa5af1fd5d6e9418492e9ccb6e4785e858c938e28d132a884b" +checksum = "f869f1443fee474b785e935d92e1007f57443e485f51668ed41943fc01a321a2" dependencies = [ "heck", "prost", @@ -1734,9 +1722,9 @@ dependencies = [ [[package]] name = "prost-wkt-types" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8cdde6df0a98311c839392ca2f2f0bcecd545f86a62b4e3c6a49c336e970fe5" +checksum = "eeeffd6b9becd4600dd461399f3f71aeda2ff0848802a9ed526cf12e8f42902a" dependencies = [ "chrono", "prost", @@ -1770,6 +1758,26 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "pulldown-cmark" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" +dependencies = [ + "bitflags", + "memchr", + "unicase", +] + +[[package]] +name = "pulldown-cmark-to-cmark" +version = "21.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5b6a0769a491a08b31ea5c62494a8f144ee0987d86d670a8af4df1e1b7cde75" +dependencies = [ + "pulldown-cmark", +] + [[package]] name = "quanta" version = "0.12.6" @@ -2459,7 +2467,7 @@ dependencies = [ "itertools", "lru", "mockall", - "opentelemetry 0.30.0", + "opentelemetry", "opentelemetry-otlp", "opentelemetry_sdk", "parking_lot", @@ -2500,7 +2508,7 @@ dependencies = [ "async-trait", "derive_builder", "derive_more", - "opentelemetry 0.30.0", + "opentelemetry", "prost", "serde_json", "temporal-sdk-core-protos", @@ -2509,6 +2517,7 @@ dependencies = [ "tracing", "tracing-core", "url", + "uuid", ] [[package]] @@ -2519,16 +2528,15 @@ dependencies = [ "base64", "derive_more", "prost", - "prost-build", "prost-wkt", - "prost-wkt-build", "prost-wkt-types", "rand 0.9.2", "serde", "serde_json", "thiserror 2.0.14", "tonic", - "tonic-build", + "tonic-prost", + "tonic-prost-build", "uuid", ] @@ -2541,7 +2549,7 @@ dependencies = [ "bridge-macros", "futures", "neon", - "opentelemetry 0.29.1", + "opentelemetry", "os_pipe", "parking_lot", "prost", @@ -2705,9 +2713,9 @@ dependencies = [ [[package]] name = "tonic" -version = "0.13.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9" +checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" dependencies = [ "async-trait", "axum", @@ -2722,9 +2730,9 @@ dependencies = [ "hyper-util", "percent-encoding", "pin-project", - "prost", "rustls-native-certs", - "socket2 0.5.10", + "socket2 0.6.0", + "sync_wrapper", "tokio", "tokio-rustls", "tokio-stream", @@ -2736,9 +2744,32 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.13.1" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c40aaccc9f9eccf2cd82ebc111adc13030d23e887244bc9cfa5d1d636049de3" +dependencies = [ + "prettyplease", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tonic-prost" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac6f67be712d12f0b41328db3137e0d0757645d8904b4cb7d51cd9c2279e847" +checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" +dependencies = [ + "bytes", + "prost", + "tonic", +] + +[[package]] +name = "tonic-prost-build" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a16cba4043dc3ff43fcb3f96b4c5c154c64cbd18ca8dce2ab2c6a451d058a2" dependencies = [ "prettyplease", "proc-macro2", @@ -2746,6 +2777,8 @@ dependencies = [ "prost-types", "quote", "syn", + "tempfile", + "tonic-build", ] [[package]] @@ -2882,6 +2915,12 @@ dependencies = [ "syn", ] +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-ident" version = "1.0.18" @@ -2925,9 +2964,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.18.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ "getrandom 0.3.3", "js-sys", diff --git a/packages/core-bridge/Cargo.toml b/packages/core-bridge/Cargo.toml index 1831c7b59..ecc4e78e0 100644 --- a/packages/core-bridge/Cargo.toml +++ b/packages/core-bridge/Cargo.toml @@ -25,28 +25,28 @@ async-trait = "0.1.83" bridge-macros = { path = "bridge-macros" } futures = { version = "0.3", features = ["executor"] } neon = { version = "1.0.0", default-features = false, features = [ - "napi-6", - "futures", + "napi-6", + "futures", ] } -opentelemetry = "0.29" +opentelemetry = "0.31" os_pipe = "1.2.1" parking_lot = "0.12" -prost = "0.13" -prost-types = "0.13" +prost = "0.14" +prost-types = "0.14" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" temporal-sdk-core = { version = "*", path = "./sdk-core/core", features = [ - "ephemeral-server", + "ephemeral-server", ] } temporal-client = { version = "*", path = "./sdk-core/client" } thiserror = "2" tokio = "1.13" tokio-stream = "0.1" -tonic = "0.13" +tonic = "0.14" tracing = "0.1" tracing-subscriber = { version = "0.3", default-features = false, features = [ - "parking_lot", - "env-filter", - "registry", - "ansi", + "parking_lot", + "env-filter", + "registry", + "ansi", ] } diff --git a/packages/core-bridge/sdk-core b/packages/core-bridge/sdk-core index de674173c..b09b27b1f 160000 --- a/packages/core-bridge/sdk-core +++ b/packages/core-bridge/sdk-core @@ -1 +1 @@ -Subproject commit de674173c664d42f85d0dee1ff3b2ac47e36d545 +Subproject commit b09b27b1f5e8e8742144ca0beeb8995e658b5842 diff --git a/packages/core-bridge/src/runtime.rs b/packages/core-bridge/src/runtime.rs index 42ad067ef..95b9dfa41 100644 --- a/packages/core-bridge/src/runtime.rs +++ b/packages/core-bridge/src/runtime.rs @@ -6,7 +6,7 @@ use neon::prelude::*; use tracing::{Instrument, warn}; use temporal_sdk_core::{ - CoreRuntime, TokioRuntimeBuilder, + CoreRuntime, RuntimeOptionsBuilder, TokioRuntimeBuilder, api::telemetry::{ CoreLog, OtelCollectorOptions as CoreOtelCollectorOptions, PrometheusExporterOptions as CorePrometheusExporterOptions, metrics::CoreMeter, @@ -62,8 +62,14 @@ pub fn runtime_new( let (telemetry_options, metrics_options, logging_options) = bridge_options.try_into()?; // Create core runtime which starts tokio multi-thread runtime - let mut core_runtime = CoreRuntime::new(telemetry_options, TokioRuntimeBuilder::default()) - .context("Failed to initialize Core Runtime")?; + let mut core_runtime = CoreRuntime::new( + RuntimeOptionsBuilder::default() + .telemetry_options(telemetry_options) + .build() + .expect("RuntimeOptionsBuilder cannot fail"), + TokioRuntimeBuilder::default(), + ) + .context("Failed to initialize Core Runtime")?; enter_sync!(core_runtime); diff --git a/packages/interceptors-opentelemetry/src/instrumentation.ts b/packages/interceptors-opentelemetry/src/instrumentation.ts index 433c0d1ed..a09ea88f5 100644 --- a/packages/interceptors-opentelemetry/src/instrumentation.ts +++ b/packages/interceptors-opentelemetry/src/instrumentation.ts @@ -15,7 +15,7 @@ const payloadConverter = defaultPayloadConverter; /** * If found, return an otel Context deserialized from the provided headers */ -export async function extractContextFromHeaders(headers: Headers): Promise { +export function extractContextFromHeaders(headers: Headers): otel.Context | undefined { const encodedSpanContext = headers[TRACE_HEADER]; if (encodedSpanContext === undefined) { return undefined; @@ -27,7 +27,7 @@ export async function extractContextFromHeaders(headers: Headers): Promise { +export function headersWithContext(headers: Headers): Headers { const carrier = {}; otel.propagation.inject(otel.context.active(), carrier, otel.defaultTextMapSetter); return { ...headers, [TRACE_HEADER]: payloadConverter.toPayload(carrier) }; diff --git a/packages/interceptors-opentelemetry/src/worker/index.ts b/packages/interceptors-opentelemetry/src/worker/index.ts index acf365331..db5f63c44 100644 --- a/packages/interceptors-opentelemetry/src/worker/index.ts +++ b/packages/interceptors-opentelemetry/src/worker/index.ts @@ -34,7 +34,7 @@ export class OpenTelemetryActivityInboundInterceptor implements ActivityInboundC } async execute(input: ActivityExecuteInput, next: Next): Promise { - const context = await extractContextFromHeaders(input.headers); + const context = await Promise.resolve(extractContextFromHeaders(input.headers)); const spanName = `${SpanName.ACTIVITY_EXECUTE}${SPAN_DELIMITER}${this.ctx.info.activityType}`; return await instrument({ tracer: this.tracer, spanName, fn: () => next(input), context }); } diff --git a/packages/interceptors-opentelemetry/src/workflow/index.ts b/packages/interceptors-opentelemetry/src/workflow/index.ts index e413ffc51..3d9dd42f6 100644 --- a/packages/interceptors-opentelemetry/src/workflow/index.ts +++ b/packages/interceptors-opentelemetry/src/workflow/index.ts @@ -24,6 +24,8 @@ import { instrument, extractContextFromHeaders, headersWithContext } from '../in import { ContextManager } from './context-manager'; import { SpanName, SPAN_DELIMITER } from './definitions'; import { SpanExporter } from './span-exporter'; +import { getActivator } from '@temporalio/workflow/lib/global-attributes'; +import { SdkFlags } from '@temporalio/workflow/lib/flags'; export * from './definitions'; @@ -51,12 +53,15 @@ function getTracer(): otel.Tracer { */ export class OpenTelemetryInboundInterceptor implements WorkflowInboundCallsInterceptor { protected readonly tracer = getTracer(); + protected readonly maybeInjectYield = true; public async execute( input: WorkflowExecuteInput, next: Next ): Promise { - const context = await extractContextFromHeaders(input.headers); + const shouldInjectYield = getActivator().hasFlag(SdkFlags.OpenTelemetryInterceptorInsertYield); + const context = extractContextFromHeaders(input.headers); + if (shouldInjectYield) await Promise.resolve(); return await instrument({ tracer: this.tracer, spanName: `${SpanName.WORKFLOW_EXECUTE}${SPAN_DELIMITER}${workflowInfo().workflowType}`, @@ -70,7 +75,9 @@ export class OpenTelemetryInboundInterceptor implements WorkflowInboundCallsInte input: SignalInput, next: Next ): Promise { - const context = await extractContextFromHeaders(input.headers); + const shouldInjectYield = getActivator().hasFlag(SdkFlags.OpenTelemetryHandleSignalInterceptorInsertYield); + const context = extractContextFromHeaders(input.headers); + if (shouldInjectYield) await Promise.resolve(); return await instrument({ tracer: this.tracer, spanName: `${SpanName.WORKFLOW_SIGNAL}${SPAN_DELIMITER}${input.signalName}`, @@ -92,11 +99,13 @@ export class OpenTelemetryOutboundInterceptor implements WorkflowOutboundCallsIn input: ActivityInput, next: Next ): Promise { + const shouldInjectYield = getActivator().hasFlag(SdkFlags.OpenTelemetryInterceptorInsertYield); return await instrument({ tracer: this.tracer, spanName: `${SpanName.ACTIVITY_START}${SPAN_DELIMITER}${input.activityType}`, fn: async () => { - const headers = await headersWithContext(input.headers); + const headers = headersWithContext(input.headers); + if (shouldInjectYield) await Promise.resolve(); return next({ ...input, headers, @@ -109,11 +118,13 @@ export class OpenTelemetryOutboundInterceptor implements WorkflowOutboundCallsIn input: LocalActivityInput, next: Next ): Promise { + const shouldInjectYield = getActivator().hasFlag(SdkFlags.OpenTelemetryScheduleLocalActivityInterceptorInsertYield); return await instrument({ tracer: this.tracer, spanName: `${SpanName.ACTIVITY_START}${SPAN_DELIMITER}${input.activityType}`, fn: async () => { - const headers = await headersWithContext(input.headers); + const headers = headersWithContext(input.headers); + if (shouldInjectYield) await Promise.resolve(); return next({ ...input, headers, @@ -126,11 +137,13 @@ export class OpenTelemetryOutboundInterceptor implements WorkflowOutboundCallsIn input: StartChildWorkflowExecutionInput, next: Next ): Promise<[Promise, Promise]> { + const shouldInjectYield = getActivator().hasFlag(SdkFlags.OpenTelemetryInterceptorInsertYield); return await instrument({ tracer: this.tracer, spanName: `${SpanName.CHILD_WORKFLOW_START}${SPAN_DELIMITER}${input.workflowType}`, fn: async () => { - const headers = await headersWithContext(input.headers); + const headers = headersWithContext(input.headers); + if (shouldInjectYield) await Promise.resolve(); return next({ ...input, headers, @@ -143,11 +156,13 @@ export class OpenTelemetryOutboundInterceptor implements WorkflowOutboundCallsIn input: ContinueAsNewInput, next: Next ): Promise { + const shouldInjectYield = getActivator().hasFlag(SdkFlags.OpenTelemetryInterceptorInsertYield); return await instrument({ tracer: this.tracer, spanName: `${SpanName.CONTINUE_AS_NEW}${SPAN_DELIMITER}${input.options.workflowType}`, fn: async () => { - const headers = await headersWithContext(input.headers); + const headers = headersWithContext(input.headers); + if (shouldInjectYield) await Promise.resolve(); return next({ ...input, headers, @@ -161,11 +176,13 @@ export class OpenTelemetryOutboundInterceptor implements WorkflowOutboundCallsIn input: SignalWorkflowInput, next: Next ): Promise { + const shouldInjectYield = getActivator().hasFlag(SdkFlags.OpenTelemetryInterceptorInsertYield); return await instrument({ tracer: this.tracer, spanName: `${SpanName.WORKFLOW_SIGNAL}${SPAN_DELIMITER}${input.signalName}`, fn: async () => { - const headers = await headersWithContext(input.headers); + const headers = headersWithContext(input.headers); + if (shouldInjectYield) await Promise.resolve(); return next({ ...input, headers, diff --git a/packages/test/history_files/otel_1_11_3.json b/packages/test/history_files/otel_1_11_3.json new file mode 100644 index 000000000..1fa2880ec --- /dev/null +++ b/packages/test/history_files/otel_1_11_3.json @@ -0,0 +1,209 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2025-10-17T12:56:44.200769Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "taskId": "1049716", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "signalStartOtel" + }, + "taskQueue": { + "name": "test-otel-inbound", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": {}, + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "10b7e171-0ee7-4775-ad6d-f5df09aa4160", + "identity": "82936@mac.lan", + "firstExecutionRunId": "10b7e171-0ee7-4775-ad6d-f5df09aa4160", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": { + "fields": {} + }, + "workflowId": "f61035b7-9fa3-4120-ac03-98763ccd469a" + } + }, + { + "eventId": "2", + "eventTime": "2025-10-17T12:56:44.200815Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1049717", + "workflowExecutionSignaledEventAttributes": { + "signalName": "startSignal", + "input": {}, + "identity": "82936@mac.lan", + "header": { + "fields": {} + } + } + }, + { + "eventId": "3", + "eventTime": "2025-10-17T12:56:44.200819Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1049718", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "test-otel-inbound", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "4", + "eventTime": "2025-10-17T12:56:44.201794Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1049722", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "3", + "identity": "82936@mac.lan", + "requestId": "488319d7-d425-44eb-b5ce-362f8462be1f", + "historySizeBytes": "327", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+6b92c11c4f907379345c3513a5f749c90d752cfd0a3bf888bf0be04350bb0d2e" + } + } + }, + { + "eventId": "5", + "eventTime": "2025-10-17T12:56:44.229959Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1049726", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "3", + "startedEventId": "4", + "identity": "82936@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+6b92c11c4f907379345c3513a5f749c90d752cfd0a3bf888bf0be04350bb0d2e" + }, + "sdkMetadata": { + "coreUsedFlags": [1, 3, 2], + "langUsedFlags": [2], + "sdkName": "temporal-typescript", + "sdkVersion": "1.11.3" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "6", + "eventTime": "2025-10-17T12:56:44.229985Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1049727", + "markerRecordedEventAttributes": { + "details": { + "data": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzZXEiOjEsImF0dGVtcHQiOjEsImFjdGl2aXR5X2lkIjoiMSIsImFjdGl2aXR5X3R5cGUiOiJhIiwiY29tcGxldGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzA1ODA0LCJuYW5vcyI6MjAyMzY4NjY3fSwiYmFja29mZiI6bnVsbCwib3JpZ2luYWxfc2NoZWR1bGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzA1ODA0LCJuYW5vcyI6MjI0MTE2MDAwfX0=" + } + ] + }, + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImEi" + } + ] + } + }, + "markerName": "core_local_activity", + "workflowTaskCompletedEventId": "5" + } + }, + { + "eventId": "7", + "eventTime": "2025-10-17T12:56:44.229986Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1049728", + "markerRecordedEventAttributes": { + "details": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImIi" + } + ] + }, + "data": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzZXEiOjIsImF0dGVtcHQiOjEsImFjdGl2aXR5X2lkIjoiMiIsImFjdGl2aXR5X3R5cGUiOiJiIiwiY29tcGxldGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzA1ODA0LCJuYW5vcyI6MjAyNjc1OTE3fSwiYmFja29mZiI6bnVsbCwib3JpZ2luYWxfc2NoZWR1bGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzA1ODA0LCJuYW5vcyI6MjI3MzQ4MDAwfX0=" + } + ] + } + }, + "markerName": "core_local_activity", + "workflowTaskCompletedEventId": "5" + } + }, + { + "eventId": "8", + "eventTime": "2025-10-17T12:56:44.230034Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1049729", + "markerRecordedEventAttributes": { + "details": { + "data": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzZXEiOjMsImF0dGVtcHQiOjEsImFjdGl2aXR5X2lkIjoiMyIsImFjdGl2aXR5X3R5cGUiOiJjIiwiY29tcGxldGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzA1ODA0LCJuYW5vcyI6MjAyNzI0ODM0fSwiYmFja29mZiI6bnVsbCwib3JpZ2luYWxfc2NoZWR1bGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzA1ODA0LCJuYW5vcyI6MjI3MzU2MDAwfX0=" + } + ] + }, + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImMi" + } + ] + } + }, + "markerName": "core_local_activity", + "workflowTaskCompletedEventId": "5" + } + }, + { + "eventId": "9", + "eventTime": "2025-10-17T12:56:44.230036Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "taskId": "1049730", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFiYyI=" + } + ] + }, + "workflowTaskCompletedEventId": "5" + } + } + ] +} diff --git a/packages/test/history_files/otel_1_13_1.json b/packages/test/history_files/otel_1_13_1.json new file mode 100644 index 000000000..11e4f0d96 --- /dev/null +++ b/packages/test/history_files/otel_1_13_1.json @@ -0,0 +1,209 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2025-10-17T15:54:19.338328Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "taskId": "1049155", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "signalStartOtel" + }, + "taskQueue": { + "name": "test-otel-inbound-curr", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": {}, + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "e4d113d2-d2ab-4220-8ccf-26d89f8f48b2", + "identity": "1661@mac.lan", + "firstExecutionRunId": "e4d113d2-d2ab-4220-8ccf-26d89f8f48b2", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": { + "fields": {} + }, + "workflowId": "c62cec51-d338-4d7b-a973-7663de797b3f" + } + }, + { + "eventId": "2", + "eventTime": "2025-10-17T15:54:19.338361Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1049156", + "workflowExecutionSignaledEventAttributes": { + "signalName": "startSignal", + "input": {}, + "identity": "1661@mac.lan", + "header": { + "fields": {} + } + } + }, + { + "eventId": "3", + "eventTime": "2025-10-17T15:54:19.338363Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1049157", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "test-otel-inbound-curr", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "4", + "eventTime": "2025-10-17T15:54:19.339448Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1049161", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "3", + "identity": "1661@mac.lan", + "requestId": "eed21ba4-1b61-48a5-a3a2-37e633ef2e35", + "historySizeBytes": "338", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+5c835f0ea50dafc7b77a54f34f9a8ec6e81e5e2f7a7cff91c2c52e956e689243" + } + } + }, + { + "eventId": "5", + "eventTime": "2025-10-17T15:54:19.375411Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1049165", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "3", + "startedEventId": "4", + "identity": "1661@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+5c835f0ea50dafc7b77a54f34f9a8ec6e81e5e2f7a7cff91c2c52e956e689243" + }, + "sdkMetadata": { + "coreUsedFlags": [2, 3, 1], + "langUsedFlags": [2], + "sdkName": "temporal-typescript", + "sdkVersion": "1.13.1" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "6", + "eventTime": "2025-10-17T15:54:19.375433Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1049166", + "markerRecordedEventAttributes": { + "details": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImEi" + } + ] + }, + "data": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzZXEiOjEsImF0dGVtcHQiOjEsImFjdGl2aXR5X2lkIjoiMSIsImFjdGl2aXR5X3R5cGUiOiJhIiwiY29tcGxldGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzE2NDU5LCJuYW5vcyI6MzQwMzQ0MTY2fSwiYmFja29mZiI6bnVsbCwib3JpZ2luYWxfc2NoZWR1bGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzE2NDU5LCJuYW5vcyI6MzY1OTMwMDAwfX0=" + } + ] + } + }, + "markerName": "core_local_activity", + "workflowTaskCompletedEventId": "5" + } + }, + { + "eventId": "7", + "eventTime": "2025-10-17T15:54:19.375435Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1049167", + "markerRecordedEventAttributes": { + "details": { + "data": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzZXEiOjIsImF0dGVtcHQiOjEsImFjdGl2aXR5X2lkIjoiMiIsImFjdGl2aXR5X3R5cGUiOiJjIiwiY29tcGxldGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzE2NDU5LCJuYW5vcyI6MzQwODY5MTY2fSwiYmFja29mZiI6bnVsbCwib3JpZ2luYWxfc2NoZWR1bGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzE2NDU5LCJuYW5vcyI6MzcxNTI1MDAwfX0=" + } + ] + }, + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImMi" + } + ] + } + }, + "markerName": "core_local_activity", + "workflowTaskCompletedEventId": "5" + } + }, + { + "eventId": "8", + "eventTime": "2025-10-17T15:54:19.375440Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1049168", + "markerRecordedEventAttributes": { + "details": { + "data": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzZXEiOjMsImF0dGVtcHQiOjEsImFjdGl2aXR5X2lkIjoiMyIsImFjdGl2aXR5X3R5cGUiOiJiIiwiY29tcGxldGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzE2NDU5LCJuYW5vcyI6MzQxMjEzODc0fSwiYmFja29mZiI6bnVsbCwib3JpZ2luYWxfc2NoZWR1bGVfdGltZSI6eyJzZWNvbmRzIjoxNzYwNzE2NDU5LCJuYW5vcyI6MzcxNTM4MDAwfX0=" + } + ] + }, + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImIi" + } + ] + } + }, + "markerName": "core_local_activity", + "workflowTaskCompletedEventId": "5" + } + }, + { + "eventId": "9", + "eventTime": "2025-10-17T15:54:19.375444Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "taskId": "1049169", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImFjIg==" + } + ] + }, + "workflowTaskCompletedEventId": "5" + } + } + ] +} diff --git a/packages/test/history_files/otel_smorgasbord_1_13_1.json b/packages/test/history_files/otel_smorgasbord_1_13_1.json new file mode 100644 index 000000000..638a82144 --- /dev/null +++ b/packages/test/history_files/otel_smorgasbord_1_13_1.json @@ -0,0 +1,778 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2025-10-22T18:14:10.813307Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "taskId": "1069560", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "smorgasbord" + }, + "taskQueue": { + "name": "test-otel-inbound", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + }, + "workflowRunTimeout": "0s", + "workflowTaskTimeout": "10s", + "continuedExecutionRunId": "7889adaa-84a1-4f17-bece-3acb327d213f", + "initiator": "CONTINUE_AS_NEW_INITIATOR_WORKFLOW", + "originalExecutionRunId": "f91d0bf6-d243-4f15-aadd-baf2257189a1", + "firstExecutionRunId": "019a0d20-dc65-7dd3-9f0f-87cc5adf1312", + "attempt": 1, + "prevAutoResetPoints": { + "points": [ + { + "runId": "019a0d20-dc65-7dd3-9f0f-87cc5adf1312", + "firstWorkflowTaskCompletedId": "4", + "createTime": "2025-10-22T18:14:08.779133Z", + "expireTime": "2025-10-23T18:14:08.779326Z", + "resettable": true, + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + } + ] + }, + "header": { + "fields": { + "_tracer-data": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ0cmFjZXBhcmVudCI6IjAwLTlmNWM0NDc1YjNiZGZhY2U3OWQyYTk5MzM4ZmI4ZDVkLTg5M2JjMDA4ZjI0YjFhODMtMDEifQ==" + } + } + }, + "workflowId": "e8641ce1-c4f3-46e6-b947-3bc7850702c1" + } + }, + { + "eventId": "2", + "eventTime": "2025-10-22T18:14:10.814557Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1069561", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "test-otel-inbound", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2025-10-22T18:14:10.817743Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1069568", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "48709@mac.lan", + "requestId": "6069cf07-5a58-464b-a24e-3f0bcda8c3f8", + "historySizeBytes": "606", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + } + } + }, + { + "eventId": "4", + "eventTime": "2025-10-22T18:14:10.831532Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1069572", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "startedEventId": "3", + "identity": "48709@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + }, + "sdkMetadata": { + "coreUsedFlags": [1, 2, 3], + "sdkName": "temporal-typescript", + "sdkVersion": "1.13.1" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2025-10-22T18:14:10.831553Z", + "eventType": "EVENT_TYPE_TIMER_STARTED", + "taskId": "1069573", + "timerStartedEventAttributes": { + "timerId": "1", + "startToFireTimeout": "1s", + "workflowTaskCompletedEventId": "4" + } + }, + { + "eventId": "6", + "eventTime": "2025-10-22T18:14:10.831566Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "taskId": "1069574", + "activityTaskScheduledEventAttributes": { + "activityId": "1", + "activityType": { + "name": "fakeProgress" + }, + "taskQueue": { + "name": "test-otel-inbound", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": { + "fields": { + "_tracer-data": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ0cmFjZXBhcmVudCI6IjAwLTlmNWM0NDc1YjNiZGZhY2U3OWQyYTk5MzM4ZmI4ZDVkLTRjYzczZTZiOTI0YjE1YjctMDEifQ==" + } + } + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MTAw" + }, + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MTA=" + } + ] + }, + "scheduleToCloseTimeout": "0s", + "scheduleToStartTimeout": "0s", + "startToCloseTimeout": "60s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "4", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s" + }, + "useWorkflowBuildId": true + } + }, + { + "eventId": "7", + "eventTime": "2025-10-22T18:14:10.831582Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "taskId": "1069575", + "activityTaskScheduledEventAttributes": { + "activityId": "2", + "activityType": { + "name": "queryOwnWf" + }, + "taskQueue": { + "name": "test-otel-inbound", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": { + "fields": { + "_tracer-data": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ0cmFjZXBhcmVudCI6IjAwLTlmNWM0NDc1YjNiZGZhY2U3OWQyYTk5MzM4ZmI4ZDVkLTUzZGQzMzM4OTZkODg1ZDctMDEifQ==" + } + } + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ0eXBlIjoicXVlcnkiLCJuYW1lIjoic3RlcCJ9" + } + ] + }, + "scheduleToCloseTimeout": "0s", + "scheduleToStartTimeout": "0s", + "startToCloseTimeout": "60s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "4", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s" + }, + "useWorkflowBuildId": true + } + }, + { + "eventId": "8", + "eventTime": "2025-10-22T18:14:10.831775Z", + "eventType": "EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED", + "taskId": "1069576", + "startChildWorkflowExecutionInitiatedEventAttributes": { + "namespace": "default", + "workflowId": "4951fb36-36e1-414c-a359-ae6f70541afe", + "workflowType": { + "name": "signalTarget" + }, + "taskQueue": { + "name": "test-otel-inbound", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "workflowRunTimeout": "0s", + "workflowTaskTimeout": "10s", + "parentClosePolicy": "PARENT_CLOSE_POLICY_TERMINATE", + "workflowTaskCompletedEventId": "4", + "workflowIdReusePolicy": "WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE", + "header": { + "fields": { + "_tracer-data": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ0cmFjZXBhcmVudCI6IjAwLTlmNWM0NDc1YjNiZGZhY2U3OWQyYTk5MzM4ZmI4ZDVkLTRjNTRmMWMyZjA0Mjc0NTYtMDEifQ==" + } + } + }, + "memo": { + "fields": {} + }, + "searchAttributes": { + "indexedFields": {} + }, + "namespaceId": "0199f28c-0083-787b-b9c2-dd3b11a4db99", + "inheritBuildId": true + } + }, + { + "eventId": "9", + "eventTime": "2025-10-22T18:14:10.831787Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1069577", + "markerRecordedEventAttributes": { + "details": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImxvY2FsLWFjdGl2aXR5Ig==" + } + ] + }, + "data": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzZXEiOjMsImF0dGVtcHQiOjEsImFjdGl2aXR5X2lkIjoiMyIsImFjdGl2aXR5X3R5cGUiOiJlY2hvIiwiY29tcGxldGVfdGltZSI6eyJzZWNvbmRzIjoxNzYxMTU2ODUwLCJuYW5vcyI6ODE4NDA3MDAwfSwiYmFja29mZiI6bnVsbCwib3JpZ2luYWxfc2NoZWR1bGVfdGltZSI6eyJzZWNvbmRzIjoxNzYxMTU2ODUwLCJuYW5vcyI6ODI4OTM5MDAwfX0=" + } + ] + } + }, + "markerName": "core_local_activity", + "workflowTaskCompletedEventId": "4" + } + }, + { + "eventId": "10", + "eventTime": "2025-10-22T18:14:10.832850Z", + "eventType": "EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED", + "taskId": "1069588", + "childWorkflowExecutionStartedEventAttributes": { + "namespace": "default", + "initiatedEventId": "8", + "workflowExecution": { + "workflowId": "4951fb36-36e1-414c-a359-ae6f70541afe", + "runId": "019a0d20-e490-775a-aff9-bd0aacd4efe6" + }, + "workflowType": { + "name": "signalTarget" + }, + "header": { + "fields": { + "_tracer-data": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ0cmFjZXBhcmVudCI6IjAwLTlmNWM0NDc1YjNiZGZhY2U3OWQyYTk5MzM4ZmI4ZDVkLTRjNTRmMWMyZjA0Mjc0NTYtMDEifQ==" + } + } + }, + "namespaceId": "0199f28c-0083-787b-b9c2-dd3b11a4db99" + } + }, + { + "eventId": "11", + "eventTime": "2025-10-22T18:14:10.832854Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1069589", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "48709@mac.lan-1604b4aae7c542a1a28339cf59186b88", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "test-otel-inbound" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "12", + "eventTime": "2025-10-22T18:14:10.834340Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1069600", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "11", + "identity": "48709@mac.lan", + "requestId": "1e071438-8f56-41ac-8440-aa459a8febb3", + "historySizeBytes": "2604", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + } + } + }, + { + "eventId": "13", + "eventTime": "2025-10-22T18:14:10.842034Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1069611", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "11", + "startedEventId": "12", + "identity": "48709@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "14", + "eventTime": "2025-10-22T18:14:10.842051Z", + "eventType": "EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED", + "taskId": "1069612", + "signalExternalWorkflowExecutionInitiatedEventAttributes": { + "workflowTaskCompletedEventId": "13", + "namespace": "default", + "workflowExecution": { + "workflowId": "4951fb36-36e1-414c-a359-ae6f70541afe" + }, + "signalName": "unblock", + "childWorkflowOnly": true, + "header": { + "fields": { + "_tracer-data": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ0cmFjZXBhcmVudCI6IjAwLTlmNWM0NDc1YjNiZGZhY2U3OWQyYTk5MzM4ZmI4ZDVkLTM4ZDFmZGNkY2RjZTRlMTMtMDEifQ==" + } + } + }, + "namespaceId": "0199f28c-0083-787b-b9c2-dd3b11a4db99" + } + }, + { + "eventId": "15", + "eventTime": "2025-10-22T18:14:10.836153Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1069613", + "workflowExecutionSignaledEventAttributes": { + "signalName": "activityStarted", + "input": {}, + "identity": "48709@mac.lan", + "header": { + "fields": {} + } + } + }, + { + "eventId": "16", + "eventTime": "2025-10-22T18:14:10.842061Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1069614", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "48709@mac.lan-1604b4aae7c542a1a28339cf59186b88", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "test-otel-inbound" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "17", + "eventTime": "2025-10-22T18:14:10.842062Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1069615", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "16", + "identity": "48709@mac.lan", + "requestId": "request-from-RespondWorkflowTaskCompleted", + "historySizeBytes": "2784", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + } + } + }, + { + "eventId": "18", + "eventTime": "2025-10-22T18:14:10.847849Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1069628", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "16", + "startedEventId": "17", + "identity": "48709@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + }, + "sdkMetadata": { + "langUsedFlags": [2] + }, + "meteringMetadata": {} + } + }, + { + "eventId": "19", + "eventTime": "2025-10-22T18:14:10.843672Z", + "eventType": "EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1069629", + "externalWorkflowExecutionSignaledEventAttributes": { + "initiatedEventId": "14", + "namespace": "default", + "workflowExecution": { + "workflowId": "4951fb36-36e1-414c-a359-ae6f70541afe" + }, + "namespaceId": "0199f28c-0083-787b-b9c2-dd3b11a4db99" + } + }, + { + "eventId": "20", + "eventTime": "2025-10-22T18:14:10.847862Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1069630", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "48709@mac.lan-1604b4aae7c542a1a28339cf59186b88", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "test-otel-inbound" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "21", + "eventTime": "2025-10-22T18:14:10.847864Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1069631", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "20", + "identity": "48709@mac.lan", + "requestId": "request-from-RespondWorkflowTaskCompleted", + "historySizeBytes": "3527", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + } + } + }, + { + "eventId": "22", + "eventTime": "2025-10-22T18:14:10.849933Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1069641", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "20", + "startedEventId": "21", + "identity": "48709@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "23", + "eventTime": "2025-10-22T18:14:10.833414Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "taskId": "1069642", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "7", + "identity": "48709@mac.lan", + "requestId": "5973a710-0f21-43df-90af-74ddda6793f1", + "attempt": 1, + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + } + } + }, + { + "eventId": "24", + "eventTime": "2025-10-22T18:14:10.848619Z", + "eventType": "EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_COMPLETED", + "taskId": "1069643", + "childWorkflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L251bGw=" + } + } + ] + }, + "namespace": "default", + "workflowExecution": { + "workflowId": "4951fb36-36e1-414c-a359-ae6f70541afe", + "runId": "019a0d20-e490-775a-aff9-bd0aacd4efe6" + }, + "workflowType": { + "name": "signalTarget" + }, + "initiatedEventId": "8", + "startedEventId": "10", + "namespaceId": "0199f28c-0083-787b-b9c2-dd3b11a4db99" + } + }, + { + "eventId": "25", + "eventTime": "2025-10-22T18:14:10.849242Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "taskId": "1069644", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "Mg==" + } + ] + }, + "scheduledEventId": "7", + "startedEventId": "23", + "identity": "48709@mac.lan" + } + }, + { + "eventId": "26", + "eventTime": "2025-10-22T18:14:10.849944Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1069645", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "48709@mac.lan-1604b4aae7c542a1a28339cf59186b88", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "test-otel-inbound" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "27", + "eventTime": "2025-10-22T18:14:10.849945Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1069646", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "26", + "identity": "48709@mac.lan", + "requestId": "request-from-RespondWorkflowTaskCompleted", + "historySizeBytes": "4078", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + } + } + }, + { + "eventId": "28", + "eventTime": "2025-10-22T18:14:10.851747Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1069649", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "26", + "startedEventId": "27", + "identity": "48709@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "29", + "eventTime": "2025-10-22T18:14:11.834282Z", + "eventType": "EVENT_TYPE_TIMER_FIRED", + "taskId": "1069651", + "timerFiredEventAttributes": { + "timerId": "1", + "startedEventId": "5" + } + }, + { + "eventId": "30", + "eventTime": "2025-10-22T18:14:11.834303Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1069652", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "48709@mac.lan-1604b4aae7c542a1a28339cf59186b88", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "test-otel-inbound" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "31", + "eventTime": "2025-10-22T18:14:11.837493Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1069656", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "30", + "identity": "48709@mac.lan", + "requestId": "83eb577e-9e07-434e-8640-d28524a8ad9c", + "historySizeBytes": "5249", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + } + } + }, + { + "eventId": "32", + "eventTime": "2025-10-22T18:14:11.844592Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1069660", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "30", + "startedEventId": "31", + "identity": "48709@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "33", + "eventTime": "2025-10-22T18:14:10.834134Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "taskId": "1069662", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "6", + "identity": "48709@mac.lan", + "requestId": "d5573cc8-43bc-451d-b249-9a79d4dfe1b7", + "attempt": 1, + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + } + } + }, + { + "eventId": "34", + "eventTime": "2025-10-22T18:14:11.850643Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "taskId": "1069663", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L251bGw=" + } + } + ] + }, + "scheduledEventId": "6", + "startedEventId": "33", + "identity": "48709@mac.lan" + } + }, + { + "eventId": "35", + "eventTime": "2025-10-22T18:14:11.850649Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1069664", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "48709@mac.lan-1604b4aae7c542a1a28339cf59186b88", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "test-otel-inbound" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "36", + "eventTime": "2025-10-22T18:14:11.851942Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1069668", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "35", + "identity": "48709@mac.lan", + "requestId": "74369727-caa0-4d75-9190-a24c73fab4c2", + "historySizeBytes": "5931", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + } + } + }, + { + "eventId": "37", + "eventTime": "2025-10-22T18:14:11.856831Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1069672", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "35", + "startedEventId": "36", + "identity": "48709@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+e5b3f6ec66e66a6c36c43315e9aa153389332256e179082b86435093007015ed" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "38", + "eventTime": "2025-10-22T18:14:11.856856Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "taskId": "1069673", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L251bGw=" + } + } + ] + }, + "workflowTaskCompletedEventId": "37" + } + } + ] +} diff --git a/packages/test/history_files/signal_workflow_1_13_1.json b/packages/test/history_files/signal_workflow_1_13_1.json new file mode 100644 index 000000000..5cb466d4e --- /dev/null +++ b/packages/test/history_files/signal_workflow_1_13_1.json @@ -0,0 +1,459 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2025-10-22T21:01:27.376670Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "taskId": "1048587", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "topSecretGreeting" + }, + "taskQueue": { + "name": "test-otel-inbound", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "IlRlbXBvcmFsIg==" + } + ] + }, + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "019a0dba-09d0-7a35-ba8f-b2843b67584b", + "identity": "69998@mac.lan", + "firstExecutionRunId": "019a0dba-09d0-7a35-ba8f-b2843b67584b", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": { + "fields": {} + }, + "workflowId": "bfe00f6e-5861-4b54-b4da-21433123ba75" + } + }, + { + "eventId": "2", + "eventTime": "2025-10-22T21:01:27.376737Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1048588", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "test-otel-inbound", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2025-10-22T21:01:27.378833Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1048593", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "69998@mac.lan", + "requestId": "c234f432-3d91-4391-a647-d2cb1313ebab", + "historySizeBytes": "311", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+1cad42a4a1f0261c43927dc90a2d7e8ee078ad455d5a2876a91cffc71a6c1aa5" + } + } + }, + { + "eventId": "4", + "eventTime": "2025-10-22T21:01:27.407936Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1048597", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "startedEventId": "3", + "identity": "69998@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+1cad42a4a1f0261c43927dc90a2d7e8ee078ad455d5a2876a91cffc71a6c1aa5" + }, + "sdkMetadata": { + "coreUsedFlags": [1, 2, 3], + "sdkName": "temporal-typescript", + "sdkVersion": "1.13.1" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2025-10-22T21:01:27.408157Z", + "eventType": "EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED", + "taskId": "1048598", + "startChildWorkflowExecutionInitiatedEventAttributes": { + "namespace": "default", + "workflowId": "1663347e-aa08-4ee5-b426-c23f71678ddd", + "workflowType": { + "name": "topSecretGreetingChild" + }, + "taskQueue": { + "name": "test-otel-inbound", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "IlRlbXBvcmFsIg==" + } + ] + }, + "workflowRunTimeout": "0s", + "workflowTaskTimeout": "10s", + "parentClosePolicy": "PARENT_CLOSE_POLICY_TERMINATE", + "workflowTaskCompletedEventId": "4", + "workflowIdReusePolicy": "WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE", + "header": { + "fields": { + "_tracer-data": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ0cmFjZXBhcmVudCI6IjAwLTA4NjhlNzEyM2YxODZhOGM1MjVhNDFiYzNjZTg5YmI2LTJmODU3NjczZjA3YWFkMjEtMDEifQ==" + } + } + }, + "memo": { + "fields": {} + }, + "searchAttributes": { + "indexedFields": {} + }, + "namespaceId": "019a0db9-e40b-714c-a297-7071f9a97da5", + "inheritBuildId": true + } + }, + { + "eventId": "6", + "eventTime": "2025-10-22T21:01:27.409970Z", + "eventType": "EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED", + "taskId": "1048606", + "childWorkflowExecutionStartedEventAttributes": { + "namespace": "default", + "initiatedEventId": "5", + "workflowExecution": { + "workflowId": "1663347e-aa08-4ee5-b426-c23f71678ddd", + "runId": "019a0dba-09f1-7290-b42c-21b73590c34c" + }, + "workflowType": { + "name": "topSecretGreetingChild" + }, + "header": { + "fields": { + "_tracer-data": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ0cmFjZXBhcmVudCI6IjAwLTA4NjhlNzEyM2YxODZhOGM1MjVhNDFiYzNjZTg5YmI2LTJmODU3NjczZjA3YWFkMjEtMDEifQ==" + } + } + }, + "namespaceId": "019a0db9-e40b-714c-a297-7071f9a97da5" + } + }, + { + "eventId": "7", + "eventTime": "2025-10-22T21:01:27.409973Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1048607", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "69998@mac.lan-2ddaef81986a47848e1757b47ae2ca8d", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "test-otel-inbound" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "8", + "eventTime": "2025-10-22T21:01:27.410484Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1048615", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "7", + "identity": "69998@mac.lan", + "requestId": "5b04c436-286f-4e6a-9f4e-0fb06a7c939c", + "historySizeBytes": "1418", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+1cad42a4a1f0261c43927dc90a2d7e8ee078ad455d5a2876a91cffc71a6c1aa5" + } + } + }, + { + "eventId": "9", + "eventTime": "2025-10-22T21:01:27.418593Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1048626", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "7", + "startedEventId": "8", + "identity": "69998@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+1cad42a4a1f0261c43927dc90a2d7e8ee078ad455d5a2876a91cffc71a6c1aa5" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "10", + "eventTime": "2025-10-22T21:01:27.418615Z", + "eventType": "EVENT_TYPE_TIMER_STARTED", + "taskId": "1048627", + "timerStartedEventAttributes": { + "timerId": "1", + "startToFireTimeout": "0.001s", + "workflowTaskCompletedEventId": "9" + } + }, + { + "eventId": "11", + "eventTime": "2025-10-22T21:01:27.418643Z", + "eventType": "EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED", + "taskId": "1048628", + "signalExternalWorkflowExecutionInitiatedEventAttributes": { + "workflowTaskCompletedEventId": "9", + "namespace": "default", + "workflowExecution": { + "workflowId": "1663347e-aa08-4ee5-b426-c23f71678ddd" + }, + "signalName": "approve", + "childWorkflowOnly": true, + "header": { + "fields": { + "_tracer-data": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ0cmFjZXBhcmVudCI6IjAwLTA4NjhlNzEyM2YxODZhOGM1MjVhNDFiYzNjZTg5YmI2LTZjMDAyMDQ2YTRiMDZjNzktMDEifQ==" + } + } + }, + "namespaceId": "019a0db9-e40b-714c-a297-7071f9a97da5" + } + }, + { + "eventId": "12", + "eventTime": "2025-10-22T21:01:27.420266Z", + "eventType": "EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1048637", + "externalWorkflowExecutionSignaledEventAttributes": { + "initiatedEventId": "11", + "namespace": "default", + "workflowExecution": { + "workflowId": "1663347e-aa08-4ee5-b426-c23f71678ddd" + }, + "namespaceId": "019a0db9-e40b-714c-a297-7071f9a97da5" + } + }, + { + "eventId": "13", + "eventTime": "2025-10-22T21:01:27.420268Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1048638", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "69998@mac.lan-2ddaef81986a47848e1757b47ae2ca8d", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "test-otel-inbound" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "14", + "eventTime": "2025-10-22T21:01:27.420682Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1048645", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "13", + "identity": "69998@mac.lan", + "requestId": "0c1f58c3-ef05-4166-9d81-61b92a0d29c9", + "historySizeBytes": "2247", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+1cad42a4a1f0261c43927dc90a2d7e8ee078ad455d5a2876a91cffc71a6c1aa5" + } + } + }, + { + "eventId": "15", + "eventTime": "2025-10-22T21:01:27.425241Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1048650", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "13", + "startedEventId": "14", + "identity": "69998@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+1cad42a4a1f0261c43927dc90a2d7e8ee078ad455d5a2876a91cffc71a6c1aa5" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "16", + "eventTime": "2025-10-22T21:01:27.425828Z", + "eventType": "EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_COMPLETED", + "taskId": "1048658", + "childWorkflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "IkhlbGxvIFRlbXBvcmFsIg==" + } + ] + }, + "namespace": "default", + "workflowExecution": { + "workflowId": "1663347e-aa08-4ee5-b426-c23f71678ddd", + "runId": "019a0dba-09f1-7290-b42c-21b73590c34c" + }, + "workflowType": { + "name": "topSecretGreetingChild" + }, + "initiatedEventId": "5", + "startedEventId": "6", + "namespaceId": "019a0db9-e40b-714c-a297-7071f9a97da5" + } + }, + { + "eventId": "17", + "eventTime": "2025-10-22T21:01:27.425831Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1048659", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "69998@mac.lan-2ddaef81986a47848e1757b47ae2ca8d", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "test-otel-inbound" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "18", + "eventTime": "2025-10-22T21:01:27.426657Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1048663", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "17", + "identity": "69998@mac.lan", + "requestId": "3c12f20e-7a18-4970-ac5f-fe5df677b9cb", + "historySizeBytes": "2904", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+1cad42a4a1f0261c43927dc90a2d7e8ee078ad455d5a2876a91cffc71a6c1aa5" + } + } + }, + { + "eventId": "19", + "eventTime": "2025-10-22T21:01:27.429513Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1048667", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "17", + "startedEventId": "18", + "identity": "69998@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+1cad42a4a1f0261c43927dc90a2d7e8ee078ad455d5a2876a91cffc71a6c1aa5" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "20", + "eventTime": "2025-10-22T21:01:28.413510Z", + "eventType": "EVENT_TYPE_TIMER_FIRED", + "taskId": "1048669", + "timerFiredEventAttributes": { + "timerId": "1", + "startedEventId": "10" + } + }, + { + "eventId": "21", + "eventTime": "2025-10-22T21:01:28.413530Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1048670", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "69998@mac.lan-2ddaef81986a47848e1757b47ae2ca8d", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "test-otel-inbound" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "22", + "eventTime": "2025-10-22T21:01:28.417428Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1048674", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "21", + "identity": "69998@mac.lan", + "requestId": "9d9b15b7-ad92-4436-a25e-a30e4fa68682", + "historySizeBytes": "3363", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+1cad42a4a1f0261c43927dc90a2d7e8ee078ad455d5a2876a91cffc71a6c1aa5" + } + } + }, + { + "eventId": "23", + "eventTime": "2025-10-22T21:01:28.427848Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1048678", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "21", + "startedEventId": "22", + "identity": "69998@mac.lan", + "workerVersion": { + "buildId": "@temporalio/worker@1.13.1+1cad42a4a1f0261c43927dc90a2d7e8ee078ad455d5a2876a91cffc71a6c1aa5" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "24", + "eventTime": "2025-10-22T21:01:28.427896Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "taskId": "1048679", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "IkhlbGxvIFRlbXBvcmFsIg==" + } + ] + }, + "workflowTaskCompletedEventId": "23" + } + } + ] +} diff --git a/packages/test/src/test-flags.ts b/packages/test/src/test-flags.ts new file mode 100644 index 000000000..8c86398e7 --- /dev/null +++ b/packages/test/src/test-flags.ts @@ -0,0 +1,89 @@ +import test from 'ava'; +import { SdkFlags, type SdkFlag } from '@temporalio/workflow/lib/flags'; +import type { WorkflowInfo } from '@temporalio/workflow'; + +type Conditions = SdkFlag['alternativeConditions']; +function composeConditions(conditions: Conditions): NonNullable[number] { + return (ctx) => { + for (const cond of conditions ?? []) { + if (cond(ctx)) { + return true; + } + } + return false; + }; +} + +test('OpenTelemetryHandleSignalInterceptorInsertYield enabled by version', (t) => { + const cases = [ + { version: undefined, expected: false }, + { version: '1.0.0', expected: false }, + { version: '1.11.3', expected: false }, + { version: '1.11.5', expected: true }, + { version: '1.11.6', expected: true }, + { version: '1.12.0', expected: true }, + { version: '1.13.1', expected: true }, + { version: '1.13.2', expected: false }, + { version: '1.14.0', expected: false }, + ]; + for (const { version, expected } of cases) { + const actual = composeConditions(SdkFlags.OpenTelemetryHandleSignalInterceptorInsertYield.alternativeConditions)({ + info: {} as WorkflowInfo, + sdkVersion: version, + }); + t.is( + actual, + expected, + `Expected OpenTelemetryHandleSignalInterceptorInsertYield on ${version} to evaluate as ${expected}` + ); + } +}); + +test('OpenTelemetryInterceptorInsertYield enabled by version', (t) => { + const cases = [ + // If there isn't any SDK version available we enable this flag as these yields were present since the initial version of the OTEL interceptors + { version: undefined, expected: true }, + { version: '0.1.0', expected: true }, + { version: '1.0.0', expected: true }, + { version: '1.9.0-rc.0', expected: true }, + { version: '1.11.3', expected: true }, + { version: '1.13.1', expected: true }, + { version: '1.13.2', expected: false }, + { version: '1.14.0', expected: false }, + { version: '2.0.0', expected: false }, + ]; + for (const { version, expected } of cases) { + const actual = composeConditions(SdkFlags.OpenTelemetryInterceptorInsertYield.alternativeConditions)({ + info: {} as WorkflowInfo, + sdkVersion: version, + }); + t.is(actual, expected, `Expected OpenTelemetryInterceptorInsertYield on ${version} to evaluate as ${expected}`); + } +}); + +test('OpenTelemetryScheduleLocalActivityInterceptorInsertYield enabled by version', (t) => { + const cases = [ + { version: undefined, expected: false }, + { version: '1.0.0', expected: false }, + { version: '1.11.3', expected: false }, + { version: '1.11.5', expected: false }, + { version: '1.11.6', expected: true }, + { version: '1.12.0', expected: true }, + { version: '1.13.1', expected: true }, + { version: '1.13.2', expected: false }, + { version: '1.14.0', expected: false }, + ]; + for (const { version, expected } of cases) { + const actual = composeConditions( + SdkFlags.OpenTelemetryScheduleLocalActivityInterceptorInsertYield.alternativeConditions + )({ + info: {} as WorkflowInfo, + sdkVersion: version, + }); + t.is( + actual, + expected, + `Expected OpenTelemetryScheduleLocalActivityInterceptorInsertYield on ${version} to evaluate as ${expected}` + ); + } +}); diff --git a/packages/test/src/test-otel.ts b/packages/test/src/test-otel.ts index a45a8951a..93dcb2e9d 100644 --- a/packages/test/src/test-otel.ts +++ b/packages/test/src/test-otel.ts @@ -24,8 +24,9 @@ import { import { OpenTelemetrySinks, SpanName, SPAN_DELIMITER } from '@temporalio/interceptors-opentelemetry/lib/workflow'; import { DefaultLogger, InjectedSinks, Runtime } from '@temporalio/worker'; import * as activities from './activities'; -import { RUN_INTEGRATION_TESTS, TestWorkflowEnvironment, Worker } from './helpers'; +import { loadHistory, RUN_INTEGRATION_TESTS, TestWorkflowEnvironment, Worker } from './helpers'; import * as workflows from './workflows'; +import { createTestWorkflowBundle } from './helpers-integration'; async function withFakeGrpcServer( fn: (port: number) => Promise, @@ -510,3 +511,96 @@ if (RUN_INTEGRATION_TESTS) { t.is(spans[2].status.code, SpanStatusCode.OK); }); } + +test('Can replay otel history from 1.11.3', async (t) => { + const hist = await loadHistory('otel_1_11_3.json'); + await t.notThrowsAsync(async () => { + await Worker.runReplayHistory( + { + workflowBundle: await createTestWorkflowBundle({ + workflowsPath: require.resolve('./workflows/signal-start-otel'), + workflowInterceptorModules: [require.resolve('./workflows/signal-start-otel')], + }), + interceptors: { + workflowModules: [require.resolve('./workflows/otel-interceptors')], + activity: [ + (ctx) => ({ + inbound: new OpenTelemetryActivityInboundInterceptor(ctx), + }), + ], + }, + }, + hist + ); + }); +}); + +test('Can replay otel history from 1.13.1', async (t) => { + const hist = await loadHistory('otel_1_13_1.json'); + await t.notThrowsAsync(async () => { + await Worker.runReplayHistory( + { + workflowBundle: await createTestWorkflowBundle({ + workflowsPath: require.resolve('./workflows/signal-start-otel'), + workflowInterceptorModules: [require.resolve('./workflows/signal-start-otel')], + }), + interceptors: { + workflowModules: [require.resolve('./workflows/signal-start-otel')], + activity: [ + (ctx) => ({ + inbound: new OpenTelemetryActivityInboundInterceptor(ctx), + }), + ], + }, + }, + hist + ); + }); +}); + +test('Can replay smorgasbord from 1.13.1', async (t) => { + // This test will trigger NDE if yield points for `scheduleActivity` and `startChildWorkflowExecution` are not inserted + const hist = await loadHistory('otel_smorgasbord_1_13_1.json'); + await t.notThrowsAsync(async () => { + await Worker.runReplayHistory( + { + workflowBundle: await createTestWorkflowBundle({ + workflowsPath: require.resolve('./workflows'), + workflowInterceptorModules: [require.resolve('./workflows/otel-interceptors')], + }), + interceptors: { + workflowModules: [require.resolve('./workflows/otel-interceptors')], + activity: [ + (ctx) => ({ + inbound: new OpenTelemetryActivityInboundInterceptor(ctx), + }), + ], + }, + }, + hist + ); + }); +}); + +test('Can replay signal workflow from 1.13.1', async (t) => { + const hist = await loadHistory('signal_workflow_1_13_1.json'); + await t.notThrowsAsync(async () => { + await Worker.runReplayHistory( + { + workflowBundle: await createTestWorkflowBundle({ + workflowsPath: require.resolve('./workflows/signal-workflow'), + workflowInterceptorModules: [require.resolve('./workflows/otel-interceptors')], + }), + interceptors: { + workflowModules: [require.resolve('./workflows/otel-interceptors')], + activity: [ + (ctx) => ({ + inbound: new OpenTelemetryActivityInboundInterceptor(ctx), + }), + ], + }, + }, + hist + ); + }); +}); diff --git a/packages/test/src/workflows/index.ts b/packages/test/src/workflows/index.ts index d86048b26..0d8ef95ac 100644 --- a/packages/test/src/workflows/index.ts +++ b/packages/test/src/workflows/index.ts @@ -65,11 +65,13 @@ export * from './shared-cancellation-scopes'; export * from './noncancellable-awaited-in-root-scope'; export * from './noncancellable-in-noncancellable'; export * from './signal-handlers-clear'; +export * from './signal-start-otel'; export * from './signal-target'; export * from './signals-are-always-processed'; export * from './signals-ordering'; export * from './signal-update-ordering'; export * from './signals-timers-activities-order'; +export * from './signal-workflow'; export * from './sinks'; export * from './sleep'; export * from './smorgasbord'; diff --git a/packages/test/src/workflows/signal-start-otel.ts b/packages/test/src/workflows/signal-start-otel.ts new file mode 100644 index 000000000..734e213cf --- /dev/null +++ b/packages/test/src/workflows/signal-start-otel.ts @@ -0,0 +1,29 @@ +import * as workflow from '@temporalio/workflow'; +import { + OpenTelemetryInboundInterceptor, + OpenTelemetryOutboundInterceptor, + OpenTelemetryInternalsInterceptor, +} from '@temporalio/interceptors-opentelemetry/lib/workflow'; + +export const startSignal = workflow.defineSignal('startSignal'); + +const { a, b, c } = workflow.proxyLocalActivities({ + scheduleToCloseTimeout: '1m', +}); + +export async function signalStartOtel(): Promise { + const order = []; + order.push(await a()); + workflow.setHandler(startSignal, async () => { + order.push(await b()); + }); + order.push(await c()); + + return order.join(''); +} + +export const interceptors = (): workflow.WorkflowInterceptors => ({ + inbound: [new OpenTelemetryInboundInterceptor()], + outbound: [new OpenTelemetryOutboundInterceptor()], + internals: [new OpenTelemetryInternalsInterceptor()], +}); diff --git a/packages/test/src/workflows/signal-workflow.ts b/packages/test/src/workflows/signal-workflow.ts new file mode 100644 index 000000000..702fa8c56 --- /dev/null +++ b/packages/test/src/workflows/signal-workflow.ts @@ -0,0 +1,21 @@ +import { defineSignal, startChild, setHandler, sleep, condition } from '@temporalio/workflow'; + +const approveTopSecret = defineSignal('approve'); + +// A workflow that simply calls an activity +export async function topSecretGreeting(name: string): Promise { + const handle = await startChild(topSecretGreetingChild, { + args: [name], + }); + await Promise.all([handle.signal(approveTopSecret), sleep('1ms')]); + return await handle.result(); +} + +export async function topSecretGreetingChild(name: string): Promise { + let approved = false; + setHandler(approveTopSecret, () => { + approved = true; + }); + await condition(() => approved); + return `Hello ${name}`; +} diff --git a/packages/worker/src/workflow/vm-shared.ts b/packages/worker/src/workflow/vm-shared.ts index 6db33fbf6..5506d8a0d 100644 --- a/packages/worker/src/workflow/vm-shared.ts +++ b/packages/worker/src/workflow/vm-shared.ts @@ -357,6 +357,7 @@ export abstract class BaseVMWorkflow implements Workflow { }, })); this.activator.addKnownFlags(activation.availableInternalFlags ?? []); + if (activation.lastSdkVersion) this.activator.sdkVersion = activation.lastSdkVersion; // Initialization of the workflow must happen before anything else. Yet, keep the init job in // place in the list as we'll use it as a marker to know when to start the workflow function. diff --git a/packages/workflow/src/flags.ts b/packages/workflow/src/flags.ts index 1ed209b13..6499bc23b 100644 --- a/packages/workflow/src/flags.ts +++ b/packages/workflow/src/flags.ts @@ -44,6 +44,44 @@ export const SdkFlags = { * to implicitely have this flag on. */ ProcessWorkflowActivationJobsAsSingleBatch: defineFlag(2, true, [buildIdSdkVersionMatches(/1\.11\.[01]/)]), + /** + * In 1.11.3 and previous versions, the interceptor for `handleSignal` provided + * by @temporalio/interceptors-opentelemetry did not have a yield point in it. + * A yield point was accidentally added in later versions. This added yield point + * can cause NDE if there was a signal handler and the workflow was started with a signal. + * + * This yield point was removed in 1.13.2, but in order to prevent workflows from the + * affected versions resulting in NDE, we have to inject the yield point on replay. + * This flag should be enabled for SDK versions newer than 1.11.3 or older than 1.13.2. + * + * @since Introduced in 1.13.2. + */ + OpenTelemetryHandleSignalInterceptorInsertYield: defineFlag(3, false, [ + isBetween({ major: 1, minor: 11, patch: 3 }, { major: 1, minor: 13, patch: 2 }), + ]), + /** + * The interceptors provided by @temporalio/interceptors-opentelemetry initially had unnecessary yield points. + * If replaying a workflow created from these versions a yield point is injected to prevent any NDE. + * + * If the history does not include the SDK version, default to enabled since the yields were present since the OTEL + * package was created. + * + * @since Introduced in 1.13.2 + */ + OpenTelemetryInterceptorInsertYield: defineFlag(3, false, [isBefore({ major: 1, minor: 13, patch: 2 }, true)]), + /** + * In 1.11.6, the `scheduleLocalActivity` interceptor was added to + * `@temporalio/interceptors-opentelemetry` which added a yield point to the + * outbound interceptor. This yield point was removed in 1.13.2. + * + * If replaying a workflow from 1.11.6 up to 1.13.1, we insert a yield point + * in the interceptor to match the behavior. + * + * @since Introduced in 1.13.2 + */ + OpenTelemetryScheduleLocalActivityInterceptorInsertYield: defineFlag(4, false, [ + isBetween({ major: 1, minor: 11, patch: 5 }, { major: 1, minor: 13, patch: 2 }), + ]), } as const; function defineFlag(id: number, def: boolean, alternativeConditions?: AltConditionFn[]): SdkFlag { @@ -68,9 +106,79 @@ export function assertValidFlag(id: number): void { * condition no longer holds. This is so to avoid incorrect behaviors in case where a Workflow * Execution has gone through a newer SDK version then again through an older one. */ -type AltConditionFn = (ctx: { info: WorkflowInfo }) => boolean; +type AltConditionFn = (ctx: { info: WorkflowInfo; sdkVersion?: string }) => boolean; function buildIdSdkVersionMatches(version: RegExp): AltConditionFn { const regex = new RegExp(`^@temporalio/worker@(${version.source})[+]`); return ({ info }) => info.currentBuildId != null && regex.test(info.currentBuildId); // eslint-disable-line deprecation/deprecation } + +type SemVer = { + major: number; + minor: number; + patch: number; +}; + +/** + * Creates an `AltConditionFn` that checks if the SDK version is before the provided version. + * An optional default can be provided in case the SDK version is not available. + */ +function isBefore(compare: SemVer, missingDefault?: boolean): AltConditionFn { + return isCompared(compare, 1, missingDefault); +} + +/** + * Creates an `AltConditionFn` that checks if the SDK version is after the provided version. + * An optional default can be provided in case the SDK version is not available. + */ +function isAfter(compare: SemVer, missingDefault?: boolean): AltConditionFn { + return isCompared(compare, -1, missingDefault); +} + +/** + * Creates an `AltConditionFn` that checks if the SDK version is between the provided versions. + * The range check is exclusive. + * An optional default can be provided in case the SDK version is not available. + */ +function isBetween(lowEnd: SemVer, highEnd: SemVer, missingDefault?: boolean): AltConditionFn { + return (ctx) => isAfter(lowEnd, missingDefault)(ctx) && isBefore(highEnd, missingDefault)(ctx); +} + +function isCompared(compare: SemVer, comparison: -1 | 0 | 1, missingDefault: boolean = false): AltConditionFn { + return ({ sdkVersion }) => { + if (!sdkVersion) return missingDefault; + const version = parseSemver(sdkVersion); + if (!version) return missingDefault; + return compareSemver(compare, version) === comparison; + }; +} + +function parseSemver(version: string): SemVer | undefined { + const matches = version.match(/(\d+)\.(\d+)\.(\d+)/); + if (!matches) return undefined; + const [full, major, minor, patch] = matches.map((digits) => { + try { + return Number.parseInt(digits); + } catch { + return undefined; + } + }); + if (major === undefined || minor === undefined || patch === undefined) + throw new Error(`full: ${full}, parts: ${major}.${minor}.${patch}`); + if (major === undefined || minor === undefined || patch === undefined) return undefined; + return { + major, + minor, + patch, + }; +} + +function compareSemver(a: SemVer, b: SemVer): -1 | 0 | 1 { + if (a.major < b.major) return -1; + if (a.major > b.major) return 1; + if (a.minor < b.minor) return -1; + if (a.minor > b.minor) return 1; + if (a.patch < b.patch) return -1; + if (a.patch > b.patch) return 1; + return 0; +} diff --git a/packages/workflow/src/internals.ts b/packages/workflow/src/internals.ts index 25a6eb737..033656b4f 100644 --- a/packages/workflow/src/internals.ts +++ b/packages/workflow/src/internals.ts @@ -434,6 +434,8 @@ export class Activator implements ActivationHandler { private readonly knownFlags = new Set(); + sdkVersion?: string; + /** * Buffered sink calls per activation */ @@ -1123,7 +1125,7 @@ export class Activator implements ActivationHandler { // through an older one. if (this.info.unsafe.isReplaying && flag.alternativeConditions) { for (const cond of flag.alternativeConditions) { - if (cond({ info: this.info })) return true; + if (cond({ info: this.info, sdkVersion: this.sdkVersion })) return true; } }