This project demonstrate an advanced use case where interceptors are used to propagate some contextual data from client to workflow, to child workflow, and to activities.
In this demo, that contextual data is inject custom log attributes on log entries produced from workflow and activities.
In particular, this sample demonstrate:
- Using attributes,
temporal server start-devto start Temporal Server.npm installto install dependencies.npm run start.watchto start the Worker.- In another shell,
npm run workflowto run the Workflow.
Sample worker output
2023-09-05T18:19:39.646Z [worker] info: Creating worker {
options: {
namespace: 'default',
identity: '1234@MyComputer',
useVersioning: false,
buildId: undefined,
shutdownGraceTime: 0,
maxConcurrentLocalActivityExecutions: 100,
enableNonLocalActivities: true,
maxConcurrentWorkflowTaskPolls: 10,
maxConcurrentActivityTaskPolls: 10,
stickyQueueScheduleToStartTimeout: '10s',
maxHeartbeatThrottleInterval: '60s',
defaultHeartbeatThrottleInterval: '30s',
isolateExecutionTimeout: '5s',
workflowThreadPoolSize: 2,
maxCachedWorkflows: 914,
showStackTraceSources: false,
debugMode: false,
workflowsPath: '/Users/user/samples-typescript/custom-logger/src/workflows/index.ts',
activities: { greet: [AsyncFunction: greet] },
taskQueue: 'custom-logger',
maxConcurrentWorkflowTaskExecutions: 40,
maxConcurrentActivityTaskExecutions: 100,
shutdownGraceTimeMs: 0,
shutdownForceTimeMs: undefined,
stickyQueueScheduleToStartTimeoutMs: 10000,
isolateExecutionTimeoutMs: 5000,
maxHeartbeatThrottleIntervalMs: 60000,
defaultHeartbeatThrottleIntervalMs: 30000,
loadedDataConverter: {
payloadConverter: DefaultPayloadConverter {
converterByEncoding: Map(3) {
'binary/null' => [UndefinedPayloadConverter],
'binary/plain' => [BinaryPayloadConverter],
'json/plain' => [JsonPayloadConverter]
},
converters: [
[UndefinedPayloadConverter],
[BinaryPayloadConverter],
[JsonPayloadConverter]
]
},
failureConverter: DefaultFailureConverter {
options: { encodeCommonAttributes: false }
},
payloadCodecs: []
}
}
}
2023-09-05T18:19:40.084Z [worker] info: asset workflow-bundle-95e3c04c487ab5112957.js 755 KiB [emitted] [immutable] (name: main)
2023-09-05T18:19:40.084Z [worker] info: runtime modules 937 bytes 4 modules
2023-09-05T18:19:40.084Z [worker] info: modules by path ./node_modules/@temporalio/ 182 KiB
2023-09-05T18:19:40.084Z [worker] info: modules by path ./node_modules/@temporalio/common/lib/ 77.9 KiB 21 modules
2023-09-05T18:19:40.084Z [worker] info: modules by path ./node_modules/@temporalio/workflow/ 102 KiB
2023-09-05T18:19:40.084Z [worker] info: ./node_modules/@temporalio/workflow/lib/worker-interface.js 11 KiB [built] [code generated]
2023-09-05T18:19:40.084Z [worker] info: + 13 modules
2023-09-05T18:19:40.084Z [worker] info: ./node_modules/@temporalio/worker/lib/workflow-log-interceptor.js 2.42 KiB [built] [code generated]
2023-09-05T18:19:40.084Z [worker] info: modules by path ./src/workflows/ 878 bytes
2023-09-05T18:19:40.084Z [worker] info: ./src/workflows/index-autogenerated-entrypoint.cjs 597 bytes [built] [code generated]
2023-09-05T18:19:40.084Z [worker] info: ./src/workflows/index.ts 281 bytes [built] [code generated]
2023-09-05T18:19:40.084Z [worker] info: __temporal_custom_payload_converter (ignored) 15 bytes [built] [code generated]
2023-09-05T18:19:40.084Z [worker] info: __temporal_custom_failure_converter (ignored) 15 bytes [built] [code generated]
2023-09-05T18:19:40.084Z [worker] info: ./node_modules/long/umd/index.js 43.1 KiB [built] [code generated]
2023-09-05T18:19:40.084Z [worker] info: ./node_modules/ms/dist/index.cjs 3.41 KiB [built] [code generated]
2023-09-05T18:19:40.084Z [worker] info: webpack 5.88.2 compiled successfully in 264 ms
2023-09-05T18:19:40.085Z [worker] info: Workflow bundle created { size: '0.74MB' }
2023-09-05T18:19:40.165Z [worker] info: Initializing worker
2023-09-05T18:19:40.166Z [worker] info: Worker state changed { state: 'RUNNING' }
2023-09-05T18:19:51.963Z [worker] debug: New WFT
2023-09-05T18:19:51.963Z [worker] debug: Applying new workflow task from server
2023-09-05T18:19:51.963Z [worker] debug: Driven WF start
2023-09-05T18:19:51.963Z [worker] debug: Sending activation to lang
2023-09-05T18:19:51.987Z [workflow] debug: Workflow started {
namespace: 'default',
taskQueue: 'custom-logger',
workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp',
runId: 'fa0b415b-ef89-434d-839c-ec031d31668e',
workflowType: 'logSampleWorkflow'
}
2023-09-05T18:19:51.987Z [worker] debug: wf bridge iteration fetch
2023-09-05T18:19:51.987Z [worker] debug: handling command
2023-09-05T18:19:51.987Z [worker] debug: prepared commands
2023-09-05T18:19:51.987Z [worker] debug: Sending responses to server
2023-09-05T18:19:51.989Z [worker] debug: Server returned 1 fewer activities for eager execution than we requested
2023-09-05T18:19:51.989Z [worker] debug: Marking WFT completed
2023-09-05T18:19:51.994Z [workflow] debug: Activity started {
isLocal: false,
attempt: 1,
namespace: 'default',
taskToken: 'CiRjZGNlMGM2Mi1mYzdjLTQyODctOGM2MC1kNWYwOWIzNDhjMWESHndvcmtmbG93LTJZcmlPbG1nSzJ2TVQtcmhSRlFRcBokZmEwYjQxNWItZWY4OS00MzRkLTgzOWMtZWMwMzFkMzE2NjhlIAUoATIBMUIFZ3JlZXRKCAgBEPKUQxgB',
workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp',
workflowRunId: 'fa0b415b-ef89-434d-839c-ec031d31668e',
workflowType: 'logSampleWorkflow',
activityId: '1',
activityType: 'greet',
taskQueue: 'custom-logger'
}
2023-09-05T18:19:51.994Z [activity] info: Log from activity {
isLocal: false,
attempt: 1,
namespace: 'default',
taskToken: 'CiRjZGNlMGM2Mi1mYzdjLTQyODctOGM2MC1kNWYwOWIzNDhjMWESHndvcmtmbG93LTJZcmlPbG1nSzJ2TVQtcmhSRlFRcBokZmEwYjQxNWItZWY4OS00MzRkLTgzOWMtZWMwMzFkMzE2NjhlIAUoATIBMUIFZ3JlZXRKCAgBEPKUQxgB',
workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp',
workflowRunId: 'fa0b415b-ef89-434d-839c-ec031d31668e',
workflowType: 'logSampleWorkflow',
activityId: '1',
activityType: 'greet',
taskQueue: 'custom-logger',
name: 'Temporal'
}
2023-09-05T18:19:51.994Z [activity] debug: Activity completed {
isLocal: false,
attempt: 1,
namespace: 'default',
taskToken: 'CiRjZGNlMGM2Mi1mYzdjLTQyODctOGM2MC1kNWYwOWIzNDhjMWESHndvcmtmbG93LTJZcmlPbG1nSzJ2TVQtcmhSRlFRcBokZmEwYjQxNWItZWY4OS00MzRkLTgzOWMtZWMwMzFkMzE2NjhlIAUoATIBMUIFZ3JlZXRKCAgBEPKUQxgB',
workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp',
workflowRunId: 'fa0b415b-ef89-434d-839c-ec031d31668e',
workflowType: 'logSampleWorkflow',
activityId: '1',
activityType: 'greet',
taskQueue: 'custom-logger',
durationMs: 0
}
2023-09-05T18:19:51.999Z [workerd] debug: New WFT
2023-09-05T18:19:51.999Z [workerd] debug: Applying new workflow task from server
2023-09-05T18:19:51.999Z [workerd] debug: Sending activation to lang
2023-09-05T18:19:52.001Z [workflow] info: Greeted {
namespace: 'default',
taskQueue: 'custom-logger',
workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp',
runId: 'fa0b415b-ef89-434d-839c-ec031d31668e',
workflowType: 'logSampleWorkflow',
greeting: 'Hello, Temporal!'
}
2023-09-05T18:19:52.001Z [workflow] debug: Workflow completed {
namespace: 'default',
taskQueue: 'custom-logger',
workflowId: 'workflow-2YriOlmgK2vMT-rhRFQQp',
runId: 'fa0b415b-ef89-434d-839c-ec031d31668e',
workflowType: 'logSampleWorkflow'
}
2023-09-05T18:19:52.001Z [worker] debug: wf bridge iteration fetch
2023-09-05T18:19:52.001Z [worker] debug: handling command
2023-09-05T18:19:52.001Z [worker] debug: prepared commands
2023-09-05T18:19:52.001Z [worker] debug: Sending responses to server
2023-09-05T18:19:52.004Z [worker] debug: Marking WFT completed