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+ UPDATE_ID_ATTR_KEY ,
27+ TERMINATE_REASON_ATTR_KEY ,
28+ } from '../instrumentation' ;
429import { SpanName , SPAN_DELIMITER } from '../workflow' ;
530
631export interface InterceptorOptions {
@@ -24,7 +49,8 @@ export class OpenTelemetryWorkflowClientInterceptor implements WorkflowClientInt
2449 tracer : this . tracer ,
2550 spanName : `${ SpanName . WORKFLOW_START } ${ SPAN_DELIMITER } ${ input . workflowType } ` ,
2651 fn : async ( span ) => {
27- const headers = await headersWithContext ( input . headers ) ;
52+ const headers = headersWithContext ( input . headers ) ;
53+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . options . workflowId ) ;
2854 const runId = await next ( { ...input , headers } ) ;
2955 span . setAttribute ( RUN_ID_ATTR_KEY , runId ) ;
3056 return runId ;
@@ -36,10 +62,157 @@ export class OpenTelemetryWorkflowClientInterceptor implements WorkflowClientInt
3662 return await instrument ( {
3763 tracer : this . tracer ,
3864 spanName : `${ SpanName . WORKFLOW_SIGNAL } ${ SPAN_DELIMITER } ${ input . signalName } ` ,
39- fn : async ( ) => {
40- const headers = await headersWithContext ( input . headers ) ;
65+ fn : async ( span ) => {
66+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowExecution . workflowId ) ;
67+ const headers = headersWithContext ( input . headers ) ;
4168 await next ( { ...input , headers } ) ;
4269 } ,
4370 } ) ;
4471 }
72+
73+ async startWithDetails (
74+ input : WorkflowStartInput ,
75+ next : Next < WorkflowClientInterceptor , 'startWithDetails' >
76+ ) : Promise < WorkflowStartOutput > {
77+ return await instrument ( {
78+ tracer : this . tracer ,
79+ spanName : `${ SpanName . WORKFLOW_START } ${ SPAN_DELIMITER } ${ input . workflowType } ` ,
80+ fn : async ( span ) => {
81+ const headers = headersWithContext ( input . headers ) ;
82+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . options . workflowId ) ;
83+ const output = await next ( { ...input , headers } ) ;
84+ span . setAttribute ( RUN_ID_ATTR_KEY , output . runId ) ;
85+ return output ;
86+ } ,
87+ } ) ;
88+ }
89+
90+ async startUpdate (
91+ input : WorkflowStartUpdateInput ,
92+ next : Next < WorkflowClientInterceptor , 'startUpdate' >
93+ ) : Promise < WorkflowStartUpdateOutput > {
94+ return await instrument ( {
95+ tracer : this . tracer ,
96+ spanName : `${ SpanName . WORKFLOW_START_UPDATE } ${ SPAN_DELIMITER } ${ input . updateName } ` ,
97+ fn : async ( span ) => {
98+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowExecution . workflowId ) ;
99+ if ( input . options . updateId ) {
100+ span . setAttribute ( UPDATE_ID_ATTR_KEY , input . options . updateId ) ;
101+ }
102+ const headers = headersWithContext ( input . headers ) ;
103+ const output = await next ( { ...input , headers } ) ;
104+ span . setAttribute ( RUN_ID_ATTR_KEY , output . workflowRunId ) ;
105+ return output ;
106+ } ,
107+ } ) ;
108+ }
109+
110+ async startUpdateWithStart (
111+ input : WorkflowStartUpdateWithStartInput ,
112+ next : Next < WorkflowClientInterceptor , 'startUpdateWithStart' >
113+ ) : Promise < WorkflowStartUpdateWithStartOutput > {
114+ return await instrument ( {
115+ tracer : this . tracer ,
116+ spanName : `${ SpanName . WORKFLOW_UPDATE_WITH_START } ${ SPAN_DELIMITER } ${ input . updateName } ` ,
117+ fn : async ( span ) => {
118+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowStartOptions . workflowId ) ;
119+ if ( input . updateOptions . updateId ) {
120+ span . setAttribute ( UPDATE_ID_ATTR_KEY , input . updateOptions . updateId ) ;
121+ }
122+ const workflowStartHeaders = headersWithContext ( input . workflowStartHeaders ) ;
123+ const updateHeaders = headersWithContext ( input . updateHeaders ) ;
124+ const output = await next ( { ...input , workflowStartHeaders, updateHeaders } ) ;
125+ if ( output . workflowExecution . runId ) {
126+ span . setAttribute ( RUN_ID_ATTR_KEY , output . workflowExecution . runId ) ;
127+ }
128+ return output ;
129+ } ,
130+ } ) ;
131+ }
132+
133+ async signalWithStart (
134+ input : WorkflowSignalWithStartInput ,
135+ next : Next < WorkflowClientInterceptor , 'signalWithStart' >
136+ ) : Promise < string > {
137+ return await instrument ( {
138+ tracer : this . tracer ,
139+ spanName : `${ SpanName . WORKFLOW_SIGNAL_WITH_START } ${ SPAN_DELIMITER } ${ input . workflowType } ` ,
140+ fn : async ( span ) => {
141+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . options . workflowId ) ;
142+ const headers = headersWithContext ( input . headers ) ;
143+ const runId = await next ( { ...input , headers } ) ;
144+ span . setAttribute ( RUN_ID_ATTR_KEY , runId ) ;
145+ return runId ;
146+ } ,
147+ } ) ;
148+ }
149+
150+ async query ( input : WorkflowQueryInput , next : Next < WorkflowClientInterceptor , 'query' > ) : Promise < unknown > {
151+ return await instrument ( {
152+ tracer : this . tracer ,
153+ spanName : `${ SpanName . WORKFLOW_QUERY } ${ SPAN_DELIMITER } ${ input . queryType } ` ,
154+ fn : async ( span ) => {
155+ const headers = headersWithContext ( input . headers ) ;
156+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowExecution . workflowId ) ;
157+ if ( input . workflowExecution . runId ) {
158+ span . setAttribute ( RUN_ID_ATTR_KEY , input . workflowExecution . runId ) ;
159+ }
160+ return await next ( { ...input , headers } ) ;
161+ } ,
162+ } ) ;
163+ }
164+
165+ async terminate (
166+ input : WorkflowTerminateInput ,
167+ next : Next < WorkflowClientInterceptor , 'terminate' >
168+ ) : Promise < TerminateWorkflowExecutionResponse > {
169+ return await instrument ( {
170+ tracer : this . tracer ,
171+ spanName : SpanName . WORKFLOW_TERMINATE ,
172+ fn : async ( span ) => {
173+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowExecution . workflowId ) ;
174+ if ( input . workflowExecution . runId ) {
175+ span . setAttribute ( RUN_ID_ATTR_KEY , input . workflowExecution . runId ) ;
176+ }
177+ if ( input . reason ) {
178+ span . setAttribute ( TERMINATE_REASON_ATTR_KEY , input . reason ) ;
179+ }
180+ return await next ( input ) ;
181+ } ,
182+ } ) ;
183+ }
184+
185+ async cancel (
186+ input : WorkflowCancelInput ,
187+ next : Next < WorkflowClientInterceptor , 'cancel' >
188+ ) : Promise < RequestCancelWorkflowExecutionResponse > {
189+ return await instrument ( {
190+ tracer : this . tracer ,
191+ spanName : SpanName . WORKFLOW_CANCEL ,
192+ fn : async ( span ) => {
193+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowExecution . workflowId ) ;
194+ if ( input . workflowExecution . runId ) {
195+ span . setAttribute ( RUN_ID_ATTR_KEY , input . workflowExecution . runId ) ;
196+ }
197+ return await next ( input ) ;
198+ } ,
199+ } ) ;
200+ }
201+
202+ async describe (
203+ input : WorkflowDescribeInput ,
204+ next : Next < WorkflowClientInterceptor , 'describe' >
205+ ) : Promise < DescribeWorkflowExecutionResponse > {
206+ return await instrument ( {
207+ tracer : this . tracer ,
208+ spanName : SpanName . WORKFLOW_DESCRIBE ,
209+ fn : async ( span ) => {
210+ span . setAttribute ( WORKFLOW_ID_ATTR_KEY , input . workflowExecution . workflowId ) ;
211+ if ( input . workflowExecution . runId ) {
212+ span . setAttribute ( RUN_ID_ATTR_KEY , input . workflowExecution . runId ) ;
213+ }
214+ return await next ( input ) ;
215+ } ,
216+ } ) ;
217+ }
45218}
0 commit comments