Azure / Azure/azure-functions-nodejs-worker

Initialize Trace Context for Service Bus Trigger using message "Diagnostic-Id"

Open
#632 2 comments 0 reactions 0 assignees View on GitHub
area:nodejs-functions investigate
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_
aebe-test__e2kf-servicebus-ngpphloem-dev01_aebe-test__-_Microsoft_Azure

_Request Logged Against Initial TraceContext_

e2kf-appinsights-ngp-dev01_-_Microsoft_Azure

_Traces from AppInsights Correlation Context_
e2kf-appinsights-ngp-dev01_-_Microsoft_Azure

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.