Azure / Azure/azure-functions-nodejs-worker
Initialize Trace Context for Service Bus Trigger using message "Diagnostic-Id"
- Dominant language
- TypeScript
- Stars
- 110
- Forks
- 51
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 2
Description
#### Investigative information
Please provide the following:
Test was run locally, but if needed can setup a "on cloud" reproduction.
#### Repro steps
1. Create a Service Bus Triggered function (Topic -> Subscription)
- Connected with AppInsights
- Add some traces via `context.log`
- throw an error so as the processed messages gets moved to the DLQ (makes it easier to debug)
2. Fire a service bus event for subscription
#### Expected behavior
When a Service Bus triggered function is executed, I would expert the `context.traceContext` to be initialized using the [Service Bus message `Diagnostic-Id`](https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-end-to-end-tracing?tabs=net-standard-sdk-2).
#### Actual behavior
The function seems to just initialize a brand new `traceContext` (not correlated to anything).
#### Known workarounds
Using the AppInsights `wrapWithCorrelationContext`, a traceContext can be initialized with the `Diagnostic-Id` being manually overridden as the `traceParent`.
```ts
// Default export wrapped with Application Insights FaaS context propagation
export default async function contextPropagatingHttpTrigger(context, message) {
// overwrite with the proper traceparent from the message.
const sbTraceParent = context.bindingData.applicationProperties['diagnostic-Id'];
if (sbTraceParent) {
context.traceContext.traceparent = sbTraceParent;
}
const correlationContext = appInsights.startOperation(context, req) as CorrelationContext;
// Wrap the Function runtime with correlationContext
return appInsights.wrapWithCorrelationContext(async () => {
try {
appInsights.defaultClient.trackTrace({
message: 'Correct Trace Context',
});
//wrong operation_Id
context.log('Incorrect Trace Context');
return await trigger(context, message);
} catch (e) {
context.log.error(e);
throw e;
} finally {
// Track Request on completion
appInsights.defaultClient.flush();
}
}, correlationContext)();
}
```
However, doing so only partially works.
1. The "out of the box" request/response logging will still be done using the initial `traceContext`
2. Any calls to `context.log` will still use the initial trace context.
_Message In Service Bus_

_Request Logged Against Initial TraceContext_

_Traces from AppInsights Correlation Context_

Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.