Last active
December 16, 2021 19:01
-
-
Save lmolkova/359dc3a3081645c74cd4a02121e371bf to your computer and use it in GitHub Desktop.
Azure SDK ExtractContext exmaples
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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