Skip to content

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

@ChuckJonas

Description

@ChuckJonas

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)
  1. 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.

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.

// 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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions