<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="8.0.1" />

LegacyPropagator

using System.Collections.Generic; using System.Collections.ObjectModel; using System.Net; namespace System.Diagnostics { internal sealed class LegacyPropagator : DistributedContextPropagator { internal static DistributedContextPropagator Instance { get; } = new LegacyPropagator(); public override IReadOnlyCollection<string> Fields { get; } = new ReadOnlyCollection<string>(new string[5] { "traceparent", "Request-Id", "tracestate", "baggage", "Correlation-Context" }); public override void Inject(Activity activity, object carrier, PropagatorSetterCallback setter) { if (activity != null && setter != null) { string id = activity.Id; if (id != null) { if (activity.IdFormat == ActivityIdFormat.W3C) { setter(carrier, "traceparent", id); if (!string.IsNullOrEmpty(activity.TraceStateString)) setter(carrier, "tracestate", activity.TraceStateString); } else setter(carrier, "Request-Id", id); DistributedContextPropagator.InjectBaggage(carrier, activity.Baggage, setter); } } } public override void ExtractTraceIdAndState(object carrier, PropagatorGetterCallback getter, out string traceId, out string traceState) { if (getter == null) { traceId = null; traceState = null; } else { getter(carrier, "traceparent", out traceId, out IEnumerable<string> fieldValues); if (traceId == null) getter(carrier, "Request-Id", out traceId, out fieldValues); getter(carrier, "tracestate", out traceState, out fieldValues); } } public override IEnumerable<KeyValuePair<string, string>> ExtractBaggage(object carrier, PropagatorGetterCallback getter) { if (getter == null) return null; getter(carrier, "baggage", out string fieldValue, out IEnumerable<string> fieldValues); IEnumerable<KeyValuePair<string, string>> baggage = null; if (fieldValue == null || !TryExtractBaggage(fieldValue, out baggage)) { getter(carrier, "Correlation-Context", out fieldValue, out fieldValues); if (fieldValue != null) TryExtractBaggage(fieldValue, out baggage); } return baggage; } internal static bool TryExtractBaggage(string baggageString, out IEnumerable<KeyValuePair<string, string>> baggage) { baggage = null; List<KeyValuePair<string, string>> list = null; if (string.IsNullOrEmpty(baggageString)) return true; int i = 0; while (true) { if (i < baggageString.Length && (baggageString[i] == ' ' || baggageString[i] == '\t')) i++; else { if (i >= baggageString.Length) break; int num = i; for (; i < baggageString.Length && baggageString[i] != ' ' && baggageString[i] != '\t' && baggageString[i] != '='; i++) { } if (i >= baggageString.Length) break; int num2 = i; if (baggageString[i] != '=') { for (; i < baggageString.Length && (baggageString[i] == ' ' || baggageString[i] == '\t'); i++) { } if (i >= baggageString.Length || baggageString[i] != '=') break; } for (i++; i < baggageString.Length && (baggageString[i] == ' ' || baggageString[i] == '\t'); i++) { } if (i >= baggageString.Length) break; int num3 = i; for (; i < baggageString.Length && baggageString[i] != ' ' && baggageString[i] != '\t' && baggageString[i] != ',' && baggageString[i] != ';'; i++) { } if (num < num2 && num3 < i) { if (list == null) list = new List<KeyValuePair<string, string>>(); list.Insert(0, new KeyValuePair<string, string>(WebUtility.UrlDecode(baggageString.Substring(num, num2 - num)).Trim(DistributedContextPropagator.s_trimmingSpaceCharacters), WebUtility.UrlDecode(baggageString.Substring(num3, i - num3)).Trim(DistributedContextPropagator.s_trimmingSpaceCharacters))); } for (; i < baggageString.Length && baggageString[i] != ','; i++) { } i++; if (i >= baggageString.Length) break; } } baggage = list; return list != null; } } }