Skip to content

Instantly share code, notes, and snippets.

@lmolkova
Last active December 16, 2021 19:01
Show Gist options
  • Save lmolkova/359dc3a3081645c74cd4a02121e371bf to your computer and use it in GitHub Desktop.
Save lmolkova/359dc3a3081645c74cd4a02121e371bf to your computer and use it in GitHub Desktop.
Azure SDK ExtractContext exmaples
public static class MessagingExtensions
{
// potential addition to event hubs SDK. service bus is similar
// The only concern is availability of ActivityContext prior to .NET 5
// there is a potential to update DiagnosticSource, but it's problematic because of
// version conflict: binding redirects on .NET Fx and version conflicts with Functions load contexts
public static ActivityContext ExtractTraceContext(this EventData @event)
{
if (@event.Properties.TryGetValue("Diagnostic-Id", out var tp) && tp is string traceparent)
{
ActivityContext.TryParse(traceparent, null, out var context);
return context;
}
return default(ActivityContext);
}
// event grid
public static ActivityContext ExtractTraceContext(this CloudEvent @event)
{
if (@event.ExtensionAttributes.TryGetValue("traceparent", out var tp) && tp is string traceparent)
{
string tracestateStr = null;
if (@event.ExtensionAttributes.TryGetValue("tracestate", out var ts) && ts is string tracestate)
{
tracestateStr = tracestate;
}
ActivityContext.TryParse(traceparent, tracestateStr, out var context);
return context;
}
return default(ActivityContext);
}
// another approach for old DiagnositcSource (prior to .NET 5)
public static ValueTuple<string, string> ExtractTraceContext2(this CloudEvent @event)
{
if (@event.ExtensionAttributes.TryGetValue("traceparent", out var tp) && tp is string traceparent)
{
string tracestateStr = null;
if (@event.ExtensionAttributes.TryGetValue("tracestate", out var ts) && ts is string tracestate)
{
tracestateStr = tracestate;
}
return (traceparent, tracestateStr);
}
return (null, null);
}
}
// usage, assumes DiagnosticSource 5+ usage
var cloudEvent = new CloudEvent("source", "type", new object());
// example 1
using (var sendActivity = source.StartActivity("Process CloudEvent", ActivityKind.Consumer, cloudEvent.ExtractTraceContext()))
{
await publisherClient.SendEventAsync(cloudEvent);
}
// example 2
var (traceparent, tracestate) = cloudEvent.ExtractTraceContext2();
ActivityContext.TryParse(traceparent, tracestate, out var activityContext);
using (var sendActivity = source.StartActivity("Process CloudEvent", ActivityKind.Consumer, activityContext))
{
await publisherClient.SendEventAsync(cloudEvent);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment