11import * as otel from '@opentelemetry/api' ;
2- import type { Next , WorkflowSignalInput , WorkflowStartInput , WorkflowClientInterceptor } from '@temporalio/client' ;
3- import { instrument , headersWithContext , RUN_ID_ATTR_KEY } from '../instrumentation' ;
2+ import type {
3+ Next ,
4+ WorkflowSignalInput ,
5+ WorkflowSignalWithStartInput ,
6+ WorkflowStartInput ,
7+ WorkflowStartOutput ,
8+ WorkflowStartUpdateInput ,
9+ WorkflowStartUpdateOutput ,
10+ WorkflowStartUpdateWithStartInput ,
11+ WorkflowStartUpdateWithStartOutput ,
12+ WorkflowQueryInput ,
13+ WorkflowTerminateInput ,
14+ WorkflowCancelInput ,
15+ WorkflowDescribeInput ,
16+ WorkflowClientInterceptor ,
17+ TerminateWorkflowExecutionResponse ,
18+ RequestCancelWorkflowExecutionResponse ,
19+ DescribeWorkflowExecutionResponse ,
20+ } from '@temporalio/client' ;
21+ import {
22+ instrument ,
23+ headersWithContext ,
24+ RUN_ID_ATTR_KEY ,
25+ WORKFLOW_ID_ATTR_KEY ,
26+ TERMINATE_REASON_ATTR_KEY ,
27+ } from '../instrumentation' ;
428import { SpanName , SPAN_DELIMITER } from '../workflow' ;
529
630export interface InterceptorOptions {
@@ -12,7 +36,7 @@ export interface InterceptorOptions {
1236 *
1337 * Wraps the operation in an opentelemetry Span and passes it to the Workflow via headers.
1438 */
15- export class OpenTelemetryWorkflowClientInterceptor implements WorkflowClientInterceptor {
39+ export class OpenTelemetryWorkflowClientInterceptor implements Required < WorkflowClientInterceptor > {
1640 protected readonly tracer : otel . Tracer ;
1741
1842 constructor ( options ?: InterceptorOptions ) {
@@ -42,4 +66,138 @@ export class OpenTelemetryWorkflowClientInterceptor implements WorkflowClientInt
4266 } ,
4367 } ) ;
4468 }
69+
70+ async startWithDetails (
71+ input : WorkflowStartInput ,
72+ next : Next < WorkflowClientInterceptor , 'startWithDetails' >
73+ ) : Promise < WorkflowStartOutput > {
74+ return await instrument ( {
75+ tracer : this . tracer ,
76+ spanName : `${ SpanName . WORKFLOW_START } ${ SPAN_DELIMITER } ${ input . workflowType } ` ,
77+ fn : async ( span ) => {
78+ const headers = headersWithContext ( input . headers ) ;
79+ const output = await next ( { ...input , headers } ) ;
80+ span . setAttribute ( RUN_ID_ATTR_KEY , output . runId ) ;
81+ return output ;
82+ } ,
83+ } ) ;
84+ }
85+
86+ async startUpdate (
87+ input : WorkflowStartUpdateInput ,
88+ next : Next < WorkflowClientInterceptor , 'startUpdate' >
89+ ) : Promise < WorkflowStartUpdateOutput > {
90+ return await instrument ( {
91+ tracer : this . tracer ,
92+ spanName : `${ SpanName . WORKFLOW_UPDATE } ${ SPAN_DELIMITER } ${ input . updateName } ` ,
93+ fn : async ( span ) => {
94+ const headers = headersWithContext ( input . headers ) ;
95+ const output = await next ( { ...input , headers } ) ;
96+ span . setAttribute ( RUN_ID_ATTR_KEY , output . workflowRunId ) ;
97+ return output ;
98+ } ,
99+ } ) ;
100+ }
101+
102+ async startUpdateWithStart (
103+ input : WorkflowStartUpdateWithStartInput ,
104+ next : Next < WorkflowClientInterceptor , 'startUpdateWithStart' >
105+ ) : Promise < WorkflowStartUpdateWithStartOutput > {
106+ return await instrument ( {
107+ tracer : this . tracer ,
108+ spanName : `${ SpanName . WORKFLOW_UPDATE_WITH_START } ${ SPAN_DELIMITER } ${ input . workflowType } ${ SPAN_DELIMITER } ${ input . updateName } ` ,
109+ fn : async ( span ) => {
110+ const workflowStartHeaders = headersWithContext ( input . workflowStartHeaders ) ;
111+ const updateHeaders = headersWithContext ( input . updateHeaders ) ;
112+ const output = await next ( { ...input , workflowStartHeaders, updateHeaders } ) ;
113+ span . setAttribute ( RUN_ID_ATTR_KEY , output . workflowExecution . runId ?? '' ) ;
114+ return output ;
115+ } ,
116+ } ) ;
117+ }
118+
119+ async signalWithStart (
120+ input : WorkflowSignalWithStartInput ,
121+ next : Next < WorkflowClientInterceptor , 'signalWithStart' >
122+ ) : Promise < string > {
123+ return await instrument ( {
124+ tracer : this . tracer ,
125+ spanName : `${ SpanName . WORKFLOW_SIGNAL_WITH_START } ${ SPAN_DELIMITER } ${ input . workflowType } ${ SPAN_DELIMITER } ${ input . signalName } ` ,
126+ fn : async ( span ) => {
127+ const headers = headersWithContext ( input . headers ) ;
128+ const runId = await next ( { ...input , headers } ) ;
129+ span . setAttribute ( RUN_ID_ATTR_KEY , runId ) ;
130+ return runId ;
131+ } ,
132+ } ) ;
133+ }
134+
135+ async query ( input : WorkflowQueryInput , next : Next < WorkflowClientInterceptor , 'query' > ) : Promise < unknown > {
136+ return await instrument ( {
137+ tracer : this . tracer ,
138+ spanName : `${ SpanName . WORKFLOW_QUERY } ${ SPAN_DELIMITER } ${ input . queryType } ` ,
139+ fn : async ( span ) => {
140+ const headers = headersWithContext ( input . headers ) ;
141+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowExecution . workflowId ) ;
142+ if ( input . workflowExecution . runId ) {
143+ span . setAttribute ( RUN_ID_ATTR_KEY , input . workflowExecution . runId ) ;
144+ }
145+ return await next ( { ...input , headers } ) ;
146+ } ,
147+ } ) ;
148+ }
149+
150+ async terminate (
151+ input : WorkflowTerminateInput ,
152+ next : Next < WorkflowClientInterceptor , 'terminate' >
153+ ) : Promise < TerminateWorkflowExecutionResponse > {
154+ return await instrument ( {
155+ tracer : this . tracer ,
156+ spanName : SpanName . WORKFLOW_TERMINATE ,
157+ fn : async ( span ) => {
158+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowExecution . workflowId ) ;
159+ if ( input . workflowExecution . runId ) {
160+ span . setAttribute ( RUN_ID_ATTR_KEY , input . workflowExecution . runId ) ;
161+ }
162+ if ( input . reason ) {
163+ span . setAttribute ( TERMINATE_REASON_ATTR_KEY , input . reason ) ;
164+ }
165+ return await next ( input ) ;
166+ } ,
167+ } ) ;
168+ }
169+
170+ async cancel (
171+ input : WorkflowCancelInput ,
172+ next : Next < WorkflowClientInterceptor , 'cancel' >
173+ ) : Promise < RequestCancelWorkflowExecutionResponse > {
174+ return await instrument ( {
175+ tracer : this . tracer ,
176+ spanName : SpanName . WORKFLOW_CANCEL ,
177+ fn : async ( span ) => {
178+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowExecution . workflowId ) ;
179+ if ( input . workflowExecution . runId ) {
180+ span . setAttribute ( RUN_ID_ATTR_KEY , input . workflowExecution . runId ) ;
181+ }
182+ return await next ( input ) ;
183+ } ,
184+ } ) ;
185+ }
186+
187+ async describe (
188+ input : WorkflowDescribeInput ,
189+ next : Next < WorkflowClientInterceptor , 'describe' >
190+ ) : Promise < DescribeWorkflowExecutionResponse > {
191+ return await instrument ( {
192+ tracer : this . tracer ,
193+ spanName : SpanName . WORKFLOW_DESCRIBE ,
194+ fn : async ( span ) => {
195+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowExecution . workflowId ) ;
196+ if ( input . workflowExecution . runId ) {
197+ span . setAttribute ( RUN_ID_ATTR_KEY , input . workflowExecution . runId ) ;
198+ }
199+ return await next ( input ) ;
200+ } ,
201+ } ) ;
202+ }
45203}
0 commit comments