@temporalio/interceptors-opentelemetry 1.13.2 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -87,7 +87,46 @@ class OpenTelemetryInboundInterceptor {
87
87
  await Promise.resolve();
88
88
  return await (0, instrumentation_1.instrument)({
89
89
  tracer: this.tracer,
90
- spanName: `${definitions_1.SpanName.WORKFLOW_SIGNAL}${definitions_1.SPAN_DELIMITER}${input.signalName}`,
90
+ spanName: `${definitions_1.SpanName.WORKFLOW_HANDLE_SIGNAL}${definitions_1.SPAN_DELIMITER}${input.signalName}`,
91
+ fn: () => next(input),
92
+ context,
93
+ });
94
+ }
95
+ async handleUpdate(input, next) {
96
+ if (!(0, workflow_module_loader_1.hasSdkFlag)('OpenTelemetryInterceptorsInstrumentsAllMethods'))
97
+ return next(input);
98
+ const context = (0, instrumentation_1.extractContextFromHeaders)(input.headers);
99
+ return await (0, instrumentation_1.instrument)({
100
+ tracer: this.tracer,
101
+ spanName: `${definitions_1.SpanName.WORKFLOW_HANDLE_UPDATE}${definitions_1.SPAN_DELIMITER}${input.name}`,
102
+ fn: (span) => {
103
+ span.setAttribute(instrumentation_1.UPDATE_ID_ATTR_KEY, input.updateId);
104
+ return next(input);
105
+ },
106
+ context,
107
+ });
108
+ }
109
+ validateUpdate(input, next) {
110
+ if (!(0, workflow_module_loader_1.hasSdkFlag)('OpenTelemetryInterceptorsInstrumentsAllMethods'))
111
+ return next(input);
112
+ const context = (0, instrumentation_1.extractContextFromHeaders)(input.headers);
113
+ (0, instrumentation_1.instrumentSync)({
114
+ tracer: this.tracer,
115
+ spanName: `${definitions_1.SpanName.WORKFLOW_VALIDATE_UPDATE}${definitions_1.SPAN_DELIMITER}${input.name}`,
116
+ fn: (span) => {
117
+ span.setAttribute(instrumentation_1.UPDATE_ID_ATTR_KEY, input.updateId);
118
+ return next(input);
119
+ },
120
+ context,
121
+ });
122
+ }
123
+ async handleQuery(input, next) {
124
+ if (!(0, workflow_module_loader_1.hasSdkFlag)('OpenTelemetryInterceptorsInstrumentsAllMethods'))
125
+ return next(input);
126
+ const context = (0, instrumentation_1.extractContextFromHeaders)(input.headers);
127
+ return await (0, instrumentation_1.instrument)({
128
+ tracer: this.tracer,
129
+ spanName: `${definitions_1.SpanName.WORKFLOW_HANDLE_QUERY}${definitions_1.SPAN_DELIMITER}${input.queryName}`,
91
130
  fn: () => next(input),
92
131
  context,
93
132
  });
@@ -139,6 +178,20 @@ class OpenTelemetryOutboundInterceptor {
139
178
  },
140
179
  });
141
180
  }
181
+ async startNexusOperation(input, next) {
182
+ if (!(0, workflow_module_loader_1.hasSdkFlag)('OpenTelemetryInterceptorsInstrumentsAllMethods'))
183
+ return next(input);
184
+ return await (0, instrumentation_1.instrument)({
185
+ tracer: this.tracer,
186
+ spanName: `${definitions_1.SpanName.NEXUS_OPERATION_START}${definitions_1.SPAN_DELIMITER}${input.service}${definitions_1.SPAN_DELIMITER}${input.operation}`,
187
+ fn: async (span) => {
188
+ span.setAttribute(instrumentation_1.NEXUS_SERVICE_ATTR_KEY, input.service);
189
+ span.setAttribute(instrumentation_1.NEXUS_OPERATION_ATTR_KEY, input.operation);
190
+ span.setAttribute(instrumentation_1.NEXUS_ENDPOINT_ATTR_KEY, input.endpoint);
191
+ return await next(input);
192
+ },
193
+ });
194
+ }
142
195
  async startChildWorkflowExecution(input, next) {
143
196
  return await (0, instrumentation_1.instrument)({
144
197
  tracer: this.tracer,
@@ -201,6 +254,21 @@ class OpenTelemetryOutboundInterceptor {
201
254
  return next(input);
202
255
  }
203
256
  }
257
+ getMetricTags(input, next) {
258
+ const span = otel.trace.getSpan(otel.context.active());
259
+ const spanContext = span?.spanContext();
260
+ if (spanContext && otel.isSpanContextValid(spanContext)) {
261
+ return next({
262
+ trace_id: spanContext.traceId,
263
+ span_id: spanContext.spanId,
264
+ trace_flags: `0${spanContext.traceFlags.toString(16)}`,
265
+ ...input,
266
+ });
267
+ }
268
+ else {
269
+ return next(input);
270
+ }
271
+ }
204
272
  }
205
273
  exports.OpenTelemetryOutboundInterceptor = OpenTelemetryOutboundInterceptor;
206
274
  class OpenTelemetryInternalsInterceptor {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAiC;AACjC,uDAAuD;AACvD,qBAAmB,CAAC,uDAAuD;AAC3E,yDAA2C;AAC3C,uEAAyD;AAgBzD,wDAA+F;AAC/F,uDAAmD;AACnD,+CAAyD;AACzD,mDAA+C;AAC/C,qEAAqG;AAErG,gDAA8B;AAE9B,IAAI,MAAM,GAA4B,SAAS,CAAC;AAChD,IAAI,cAAc,GAA+B,SAAS,CAAC;AAE3D,SAAS,SAAS;IAChB,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,cAAc,GAAG,IAAI,gCAAc,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACnD,QAAQ,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,mBAAmB,CAAC,IAAI,4BAAY,EAAE,CAAC,CAAC,CAAC;QAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QACtC,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAa,+BAA+B;IACvB,MAAM,GAAG,SAAS,EAAE,CAAC;IAExC;QACE,IAAA,mDAA0B,GAAE,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,OAAO,CAClB,KAA2B,EAC3B,IAAsD;QAEtD,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,IAAA,0CAAiB,GAAE,CAAC;QAE5D,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;YAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAEtF,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,gBAAgB,GAAG,4BAAc,GAAG,YAAY,EAAE,CAAC,YAAY,EAAE;YACvF,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACrB,OAAO;YACP,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,YAAY,aAAa;SACxD,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,KAAkB,EAClB,IAA2D;QAE3D,mDAAmD;QACnD,IAAI,CAAC,IAAA,mCAAU,EAAC,+CAA+C,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAErF,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;YAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAEtF,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,eAAe,GAAG,4BAAc,GAAG,KAAK,CAAC,UAAU,EAAE;YAC3E,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACrB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;CACF;AA1CD,0EA0CC;AAED;;;;;;GAMG;AACH,MAAa,gCAAgC;IACxB,MAAM,GAAG,SAAS,EAAE,CAAC;IAExC;QACE,IAAA,mDAA0B,GAAE,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,KAAoB,EACpB,IAAgE;QAEhE,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,cAAc,GAAG,4BAAc,GAAG,KAAK,CAAC,YAAY,EAAE;YAC5E,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtF,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAChC,KAAyB,EACzB,IAAqE;QAErE,oDAAoD;QACpD,IAAI,CAAC,IAAA,mCAAU,EAAC,gDAAgD,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtF,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,cAAc,GAAG,4BAAc,GAAG,KAAK,CAAC,YAAY,EAAE;YAC5E,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtF,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,2BAA2B,CACtC,KAAuC,EACvC,IAA2E;QAE3E,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,oBAAoB,GAAG,4BAAc,GAAG,KAAK,CAAC,YAAY,EAAE;YAClF,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtF,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,KAAyB,EACzB,IAA6D;QAE7D,MAAM,EAAE,aAAa,EAAE,GAAG,IAAA,0CAAiB,GAAE,CAAC;QAC9C,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,eAAe,GAAG,4BAAc,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE;YACrF,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtF,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;YACD,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,YAAY,aAAa;SACxD,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,cAAc,CACzB,KAA0B,EAC1B,IAA8D;QAE9D,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,eAAe,GAAG,4BAAc,GAAG,KAAK,CAAC,UAAU,EAAE;YAC3E,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtF,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,gBAAgB,CACrB,KAA4B,EAC5B,IAAgE;QAEhE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC;QACxC,IAAI,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;gBACV,QAAQ,EAAE,WAAW,CAAC,OAAO;gBAC7B,OAAO,EAAE,WAAW,CAAC,MAAM;gBAC3B,WAAW,EAAE,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;gBACtD,GAAG,KAAK;aACT,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AA5HD,4EA4HC;AAED,MAAa,iCAAiC;IAC5C,KAAK,CAAC,OAAO,CAAC,KAAmB,EAAE,IAAmD;QACpF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,cAAc,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;CACF;AAPD,8EAOC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAiC;AACjC,uDAAuD;AACvD,qBAAmB,CAAC,uDAAuD;AAC3E,yDAA2C;AAC3C,uEAAyD;AAqBzD,wDAS4B;AAC5B,uDAAmD;AACnD,+CAAyD;AACzD,mDAA+C;AAC/C,qEAAqG;AAErG,gDAA8B;AAE9B,IAAI,MAAM,GAA4B,SAAS,CAAC;AAChD,IAAI,cAAc,GAA+B,SAAS,CAAC;AAE3D,SAAS,SAAS;IAChB,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,cAAc,GAAG,IAAI,gCAAc,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACnD,QAAQ,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,mBAAmB,CAAC,IAAI,4BAAY,EAAE,CAAC,CAAC,CAAC;QAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QACtC,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAa,+BAA+B;IACvB,MAAM,GAAG,SAAS,EAAE,CAAC;IAExC;QACE,IAAA,mDAA0B,GAAE,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,OAAO,CAClB,KAA2B,EAC3B,IAAsD;QAEtD,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,IAAA,0CAAiB,GAAE,CAAC;QAE5D,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;YAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAEtF,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,gBAAgB,GAAG,4BAAc,GAAG,YAAY,EAAE,CAAC,YAAY,EAAE;YACvF,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACrB,OAAO;YACP,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,YAAY,aAAa;SACxD,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,KAAkB,EAClB,IAA2D;QAE3D,mDAAmD;QACnD,IAAI,CAAC,IAAA,mCAAU,EAAC,+CAA+C,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAErF,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;YAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAEtF,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,sBAAsB,GAAG,4BAAc,GAAG,KAAK,CAAC,UAAU,EAAE;YAClF,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACrB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,KAAkB,EAClB,IAA2D;QAE3D,IAAI,CAAC,IAAA,mCAAU,EAAC,gDAAgD,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtF,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEzD,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,sBAAsB,GAAG,4BAAc,GAAG,KAAK,CAAC,IAAI,EAAE;YAC5E,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;gBACX,IAAI,CAAC,YAAY,CAAC,oCAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACtD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,KAAkB,EAAE,IAA6D;QACrG,IAAI,CAAC,IAAA,mCAAU,EAAC,gDAAgD,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtF,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAA,gCAAc,EAAC;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,wBAAwB,GAAG,4BAAc,GAAG,KAAK,CAAC,IAAI,EAAE;YAC9E,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;gBACX,IAAI,CAAC,YAAY,CAAC,oCAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACtD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,KAAiB,EACjB,IAA0D;QAE1D,IAAI,CAAC,IAAA,mCAAU,EAAC,gDAAgD,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtF,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEzD,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,qBAAqB,GAAG,4BAAc,GAAG,KAAK,CAAC,SAAS,EAAE;YAChF,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACrB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;CACF;AA5FD,0EA4FC;AAED;;;;;;GAMG;AACH,MAAa,gCAAgC;IACxB,MAAM,GAAG,SAAS,EAAE,CAAC;IAExC;QACE,IAAA,mDAA0B,GAAE,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,KAAoB,EACpB,IAAgE;QAEhE,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,cAAc,GAAG,4BAAc,GAAG,KAAK,CAAC,YAAY,EAAE;YAC5E,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtF,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAChC,KAAyB,EACzB,IAAqE;QAErE,oDAAoD;QACpD,IAAI,CAAC,IAAA,mCAAU,EAAC,gDAAgD,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtF,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,cAAc,GAAG,4BAAc,GAAG,KAAK,CAAC,YAAY,EAAE;YAC5E,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtF,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC9B,KAA+B,EAC/B,IAAmE;QAEnE,IAAI,CAAC,IAAA,mCAAU,EAAC,gDAAgD,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtF,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,qBAAqB,GAAG,4BAAc,GAAG,KAAK,CAAC,OAAO,GAAG,4BAAc,GAAG,KAAK,CAAC,SAAS,EAAE;YACjH,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACjB,IAAI,CAAC,YAAY,CAAC,wCAAsB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACzD,IAAI,CAAC,YAAY,CAAC,0CAAwB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC7D,IAAI,CAAC,YAAY,CAAC,yCAAuB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC3D,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,2BAA2B,CACtC,KAAuC,EACvC,IAA2E;QAE3E,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,oBAAoB,GAAG,4BAAc,GAAG,KAAK,CAAC,YAAY,EAAE;YAClF,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtF,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,KAAyB,EACzB,IAA6D;QAE7D,MAAM,EAAE,aAAa,EAAE,GAAG,IAAA,0CAAiB,GAAE,CAAC;QAC9C,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,eAAe,GAAG,4BAAc,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE;YACrF,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtF,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;YACD,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,YAAY,aAAa;SACxD,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,cAAc,CACzB,KAA0B,EAC1B,IAA8D;QAE9D,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,eAAe,GAAG,4BAAc,GAAG,KAAK,CAAC,UAAU,EAAE;YAC3E,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,mCAAU,EAAC,2CAA2C,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtF,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,gBAAgB,CACrB,KAA4B,EAC5B,IAAgE;QAEhE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC;QACxC,IAAI,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;gBACV,QAAQ,EAAE,WAAW,CAAC,OAAO;gBAC7B,OAAO,EAAE,WAAW,CAAC,MAAM;gBAC3B,WAAW,EAAE,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;gBACtD,GAAG,KAAK;aACT,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAEM,aAAa,CAClB,KAAyB,EACzB,IAA6D;QAE7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC;QACxC,IAAI,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;gBACV,QAAQ,EAAE,WAAW,CAAC,OAAO;gBAC7B,OAAO,EAAE,WAAW,CAAC,MAAM;gBAC3B,WAAW,EAAE,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;gBACtD,GAAG,KAAK;aACT,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AAhKD,4EAgKC;AAED,MAAa,iCAAiC;IAC5C,KAAK,CAAC,OAAO,CAAC,KAAmB,EAAE,IAAmD;QACpF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,cAAc,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;CACF;AAPD,8EAOC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@temporalio/interceptors-opentelemetry",
3
- "version": "1.13.2",
3
+ "version": "1.14.0",
4
4
  "description": "Temporal.io SDK interceptors bundle for tracing with opentelemetry",
5
5
  "main": "lib/index.js",
6
6
  "types": "./lib/index.d.ts",
@@ -14,21 +14,21 @@
14
14
  "author": "Temporal Technologies Inc. <sdk@temporal.io>",
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
- "@opentelemetry/api": "^1.7.0",
18
- "@opentelemetry/core": "^1.19.0",
19
- "@opentelemetry/resources": "^1.19.0",
20
- "@opentelemetry/sdk-trace-base": "^1.19.0"
17
+ "@opentelemetry/api": "^1.9.0",
18
+ "@opentelemetry/core": "^1.25.1",
19
+ "@opentelemetry/resources": "^1.25.1",
20
+ "@opentelemetry/sdk-trace-base": "^1.25.1"
21
21
  },
22
22
  "devDependencies": {
23
- "@temporalio/activity": "1.13.2",
24
- "@temporalio/client": "1.13.2",
25
- "@temporalio/common": "1.13.2",
26
- "@temporalio/worker": "1.13.2",
27
- "@temporalio/workflow": "1.13.2"
23
+ "@temporalio/activity": "1.14.0",
24
+ "@temporalio/client": "1.14.0",
25
+ "@temporalio/common": "1.14.0",
26
+ "@temporalio/worker": "1.14.0",
27
+ "@temporalio/workflow": "1.14.0"
28
28
  },
29
29
  "peerDependencies": {
30
- "@temporalio/common": "1.13.2",
31
- "@temporalio/workflow": "1.13.2"
30
+ "@temporalio/common": "1.14.0",
31
+ "@temporalio/workflow": "1.14.0"
32
32
  },
33
33
  "peerDependenciesMeta": {
34
34
  "@temporalio/workflow": {
@@ -54,5 +54,5 @@
54
54
  "src",
55
55
  "lib"
56
56
  ],
57
- "gitHead": "cccc54c72f85377ac520b5d6cdd9a9a847027c27"
57
+ "gitHead": "eb428ac36568b48be67fdba662c38631867b932d"
58
58
  }
@@ -1,6 +1,31 @@
1
1
  import * 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';
4
29
  import { SpanName, SPAN_DELIMITER } from '../workflow';
5
30
 
6
31
  export interface InterceptorOptions {
@@ -24,7 +49,8 @@ export class OpenTelemetryWorkflowClientInterceptor implements WorkflowClientInt
24
49
  tracer: this.tracer,
25
50
  spanName: `${SpanName.WORKFLOW_START}${SPAN_DELIMITER}${input.workflowType}`,
26
51
  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);
28
54
  const runId = await next({ ...input, headers });
29
55
  span.setAttribute(RUN_ID_ATTR_KEY, runId);
30
56
  return runId;
@@ -36,10 +62,157 @@ export class OpenTelemetryWorkflowClientInterceptor implements WorkflowClientInt
36
62
  return await instrument({
37
63
  tracer: this.tracer,
38
64
  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);
41
68
  await next({ ...input, headers });
42
69
  },
43
70
  });
44
71
  }
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
+ }
45
218
  }
@@ -14,6 +14,20 @@ import {
14
14
  export const TRACE_HEADER = '_tracer-data';
15
15
  /** As in workflow run id */
16
16
  export const RUN_ID_ATTR_KEY = 'run_id';
17
+ /** As in workflow id */
18
+ export const WORKFLOW_ID_ATTR_KEY = 'temporalWorkflowId';
19
+ /** As in activity id */
20
+ export const ACTIVITY_ID_ATTR_KEY = 'temporalActivityId';
21
+ /** As in update id */
22
+ export const UPDATE_ID_ATTR_KEY = 'temporalUpdateId';
23
+ /** As in termination reason */
24
+ export const TERMINATE_REASON_ATTR_KEY = 'temporalTerminateReason';
25
+ /** As in Nexus service */
26
+ export const NEXUS_SERVICE_ATTR_KEY = 'temporalNexusService';
27
+ /** As in Nexus operation */
28
+ export const NEXUS_OPERATION_ATTR_KEY = 'temporalNexusOperation';
29
+ /** As in Nexus endpoint */
30
+ export const NEXUS_ENDPOINT_ATTR_KEY = 'temporalNexusEndpoint';
17
31
 
18
32
  const payloadConverter = defaultPayloadConverter;
19
33
 
@@ -48,20 +62,41 @@ async function wrapWithSpan<T>(
48
62
  span.setStatus({ code: otel.SpanStatusCode.OK });
49
63
  return ret;
50
64
  } catch (err: any) {
51
- const isBenignErr = err instanceof ApplicationFailure && err.category === ApplicationFailureCategory.BENIGN;
52
- if (acceptableErrors === undefined || !acceptableErrors(err)) {
53
- const statusCode = isBenignErr ? otel.SpanStatusCode.UNSET : otel.SpanStatusCode.ERROR;
54
- span.setStatus({ code: statusCode, message: (err as Error).message ?? String(err) });
55
- span.recordException(err);
56
- } else {
57
- span.setStatus({ code: otel.SpanStatusCode.OK });
58
- }
65
+ maybeAddErrorToSpan(err, span, acceptableErrors);
59
66
  throw err;
60
67
  } finally {
61
68
  span.end();
62
69
  }
63
70
  }
64
71
 
72
+ function wrapWithSpanSync<T>(
73
+ span: otel.Span,
74
+ fn: (span: otel.Span) => T,
75
+ acceptableErrors?: (err: unknown) => boolean
76
+ ): T {
77
+ try {
78
+ const ret = fn(span);
79
+ span.setStatus({ code: otel.SpanStatusCode.OK });
80
+ return ret;
81
+ } catch (err: any) {
82
+ maybeAddErrorToSpan(err, span, acceptableErrors);
83
+ throw err;
84
+ } finally {
85
+ span.end();
86
+ }
87
+ }
88
+
89
+ function maybeAddErrorToSpan(err: any, span: otel.Span, acceptableErrors?: (err: unknown) => boolean): void {
90
+ const isBenignErr = err instanceof ApplicationFailure && err.category === ApplicationFailureCategory.BENIGN;
91
+ if (acceptableErrors === undefined || !acceptableErrors(err)) {
92
+ const statusCode = isBenignErr ? otel.SpanStatusCode.UNSET : otel.SpanStatusCode.ERROR;
93
+ span.setStatus({ code: statusCode, message: (err as Error).message ?? String(err) });
94
+ span.recordException(err);
95
+ } else {
96
+ span.setStatus({ code: otel.SpanStatusCode.OK });
97
+ }
98
+ }
99
+
65
100
  export interface InstrumentOptions<T> {
66
101
  tracer: otel.Tracer;
67
102
  spanName: string;
@@ -70,6 +105,8 @@ export interface InstrumentOptions<T> {
70
105
  acceptableErrors?: (err: unknown) => boolean;
71
106
  }
72
107
 
108
+ export type InstrumentOptionsSync<T> = Omit<InstrumentOptions<T>, 'fn'> & { fn: (span: otel.Span) => T };
109
+
73
110
  /**
74
111
  * Wraps `fn` in a span which ends when function returns or throws
75
112
  */
@@ -87,3 +124,12 @@ export async function instrument<T>({
87
124
  }
88
125
  return await tracer.startActiveSpan(spanName, async (span) => await wrapWithSpan(span, fn, acceptableErrors));
89
126
  }
127
+
128
+ export function instrumentSync<T>({ tracer, spanName, fn, context, acceptableErrors }: InstrumentOptionsSync<T>): T {
129
+ if (context) {
130
+ return otel.context.with(context, () => {
131
+ return tracer.startActiveSpan(spanName, (span) => wrapWithSpanSync(span, fn, acceptableErrors));
132
+ });
133
+ }
134
+ return tracer.startActiveSpan(spanName, (span) => wrapWithSpanSync(span, fn, acceptableErrors));
135
+ }
@@ -8,9 +8,16 @@ import type {
8
8
  ActivityOutboundCallsInterceptor,
9
9
  InjectedSink,
10
10
  GetLogAttributesInput,
11
+ GetMetricTagsInput,
11
12
  ActivityExecuteInput,
12
13
  } from '@temporalio/worker';
13
- import { instrument, extractContextFromHeaders } from '../instrumentation';
14
+ import {
15
+ instrument,
16
+ extractContextFromHeaders,
17
+ WORKFLOW_ID_ATTR_KEY,
18
+ RUN_ID_ATTR_KEY,
19
+ ACTIVITY_ID_ATTR_KEY,
20
+ } from '../instrumentation';
14
21
  import { type OpenTelemetryWorkflowExporter, type SerializableSpan, SpanName, SPAN_DELIMITER } from '../workflow';
15
22
 
16
23
  export interface InterceptorOptions {
@@ -36,14 +43,24 @@ export class OpenTelemetryActivityInboundInterceptor implements ActivityInboundC
36
43
  async execute(input: ActivityExecuteInput, next: Next<ActivityInboundCallsInterceptor, 'execute'>): Promise<unknown> {
37
44
  const context = extractContextFromHeaders(input.headers);
38
45
  const spanName = `${SpanName.ACTIVITY_EXECUTE}${SPAN_DELIMITER}${this.ctx.info.activityType}`;
39
- return await instrument({ tracer: this.tracer, spanName, fn: () => next(input), context });
46
+ return await instrument({
47
+ tracer: this.tracer,
48
+ spanName,
49
+ fn: (span) => {
50
+ span.setAttribute(WORKFLOW_ID_ATTR_KEY, this.ctx.info.workflowExecution.workflowId);
51
+ span.setAttribute(RUN_ID_ATTR_KEY, this.ctx.info.workflowExecution.runId);
52
+ span.setAttribute(ACTIVITY_ID_ATTR_KEY, this.ctx.info.activityId);
53
+ return next(input);
54
+ },
55
+ context,
56
+ });
40
57
  }
41
58
  }
42
59
 
43
60
  /**
44
- * Intercepts calls to emit logs from an Activity.
61
+ * Intercepts calls to emit logs and metrics from an Activity.
45
62
  *
46
- * Attach OpenTelemetry context tracing attributes to emitted log messages, if appropriate.
63
+ * Attach OpenTelemetry context tracing attributes to emitted log messages and metrics, if appropriate.
47
64
  */
48
65
  export class OpenTelemetryActivityOutboundInterceptor implements ActivityOutboundCallsInterceptor {
49
66
  constructor(protected readonly ctx: ActivityContext) {}
@@ -65,6 +82,24 @@ export class OpenTelemetryActivityOutboundInterceptor implements ActivityOutboun
65
82
  return next(input);
66
83
  }
67
84
  }
85
+
86
+ public getMetricTags(
87
+ input: GetMetricTagsInput,
88
+ next: Next<ActivityOutboundCallsInterceptor, 'getMetricTags'>
89
+ ): GetMetricTagsInput {
90
+ const span = otel.trace.getSpan(otel.context.active());
91
+ const spanContext = span?.spanContext();
92
+ if (spanContext && otel.isSpanContextValid(spanContext)) {
93
+ return next({
94
+ trace_id: spanContext.traceId,
95
+ span_id: spanContext.spanId,
96
+ trace_flags: `0${spanContext.traceFlags.toString(16)}`,
97
+ ...input,
98
+ });
99
+ } else {
100
+ return next(input);
101
+ }
102
+ }
68
103
  }
69
104
 
70
105
  /**
@@ -54,6 +54,56 @@ export enum SpanName {
54
54
  */
55
55
  WORKFLOW_SIGNAL_WITH_START = 'SignalWithStartWorkflow',
56
56
 
57
+ /**
58
+ * Workflow is queried
59
+ */
60
+ WORKFLOW_QUERY = 'QueryWorkflow',
61
+
62
+ /**
63
+ * Workflow update is started by client
64
+ */
65
+ WORKFLOW_START_UPDATE = 'StartWorkflowUpdate',
66
+
67
+ /**
68
+ * Workflow is started with an update
69
+ */
70
+ WORKFLOW_UPDATE_WITH_START = 'UpdateWithStartWorkflow',
71
+
72
+ /**
73
+ * Workflow handles an incoming signal
74
+ */
75
+ WORKFLOW_HANDLE_SIGNAL = 'HandleSignal',
76
+
77
+ /**
78
+ * Workflow handles an incoming query
79
+ */
80
+ WORKFLOW_HANDLE_QUERY = 'HandleQuery',
81
+
82
+ /**
83
+ * Workflow handles an incoming update
84
+ */
85
+ WORKFLOW_HANDLE_UPDATE = 'HandleUpdate',
86
+
87
+ /**
88
+ * Workflow validates an incoming update
89
+ */
90
+ WORKFLOW_VALIDATE_UPDATE = 'ValidateUpdate',
91
+
92
+ /**
93
+ * Workflow is terminated
94
+ */
95
+ WORKFLOW_TERMINATE = 'TerminateWorkflow',
96
+
97
+ /**
98
+ * Workflow is cancelled
99
+ */
100
+ WORKFLOW_CANCEL = 'CancelWorkflow',
101
+
102
+ /**
103
+ * Workflow is described
104
+ */
105
+ WORKFLOW_DESCRIBE = 'DescribeWorkflow',
106
+
57
107
  /**
58
108
  * Workflow run is executing
59
109
  */
@@ -74,6 +124,10 @@ export enum SpanName {
74
124
  * Workflow is continuing as new
75
125
  */
76
126
  CONTINUE_AS_NEW = 'ContinueAsNew',
127
+ /**
128
+ * Nexus operation is started
129
+ */
130
+ NEXUS_OPERATION_START = 'StartNexusOperation',
77
131
  }
78
132
 
79
133
  export const SPAN_DELIMITER = ':';