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

ActivitySource

public sealed class ActivitySource : IDisposable
Provides APIs to create and start Activity objects and to register ActivityListener objects to listen to the Activity events.
using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Threading; namespace System.Diagnostics { [System.Runtime.CompilerServices.NullableContext(2)] [System.Runtime.CompilerServices.Nullable(0)] public sealed class ActivitySource : IDisposable { internal delegate void Function<T, TParent> (T item, ref ActivityCreationOptions<TParent> data, ref ActivitySamplingResult samplingResult, ref ActivityCreationOptions<ActivityContext> dataWithContext); private static readonly SynchronizedList<ActivitySource> s_activeSources = new SynchronizedList<ActivitySource>(); private static readonly SynchronizedList<ActivityListener> s_allListeners = new SynchronizedList<ActivityListener>(); private SynchronizedList<ActivityListener> _listeners; [System.Runtime.CompilerServices.Nullable(1)] public string Name { [System.Runtime.CompilerServices.NullableContext(1)] get; } public string Version { get; } [System.Runtime.CompilerServices.NullableContext(1)] public ActivitySource(string name, [System.Runtime.CompilerServices.Nullable(2)] string version = "") { if (name == null) throw new ArgumentNullException("name"); Name = name; Version = version; s_activeSources.Add(this); if (s_allListeners.Count > 0) s_allListeners.EnumWithAction(delegate(ActivityListener listener, object source) { Func<ActivitySource, bool> shouldListenTo = listener.ShouldListenTo; if (shouldListenTo != null) { ActivitySource activitySource = (ActivitySource)source; if (shouldListenTo(activitySource)) activitySource.AddListener(listener); } }, this); GC.KeepAlive(DiagnosticSourceEventSource.Log); } public bool HasListeners() { SynchronizedList<ActivityListener> listeners = _listeners; if (listeners != null) return listeners.Count > 0; return false; } [System.Runtime.CompilerServices.NullableContext(1)] [return: System.Runtime.CompilerServices.Nullable(2)] public Activity CreateActivity(string name, ActivityKind kind) { return CreateActivity(name, kind, default(ActivityContext), null, null, null, default(DateTimeOffset), false, ActivityIdFormat.Unknown); } public Activity CreateActivity([System.Runtime.CompilerServices.Nullable(1)] string name, ActivityKind kind, ActivityContext parentContext, [System.Runtime.CompilerServices.Nullable(new byte[] { 2, 0, 1, 2 })] IEnumerable<KeyValuePair<string, object>> tags = null, IEnumerable<ActivityLink> links = null, ActivityIdFormat idFormat = ActivityIdFormat.Unknown) { return CreateActivity(name, kind, parentContext, null, tags, links, default(DateTimeOffset), false, idFormat); } public Activity CreateActivity([System.Runtime.CompilerServices.Nullable(1)] string name, ActivityKind kind, string parentId, [System.Runtime.CompilerServices.Nullable(new byte[] { 2, 0, 1, 2 })] IEnumerable<KeyValuePair<string, object>> tags = null, IEnumerable<ActivityLink> links = null, ActivityIdFormat idFormat = ActivityIdFormat.Unknown) { return CreateActivity(name, kind, default(ActivityContext), parentId, tags, links, default(DateTimeOffset), false, idFormat); } [System.Runtime.CompilerServices.NullableContext(1)] [return: System.Runtime.CompilerServices.Nullable(2)] public Activity StartActivity([CallerMemberName] string name = "", ActivityKind kind = ActivityKind.Internal) { return CreateActivity(name, kind, default(ActivityContext), null, null, null, default(DateTimeOffset), true, ActivityIdFormat.Unknown); } public Activity StartActivity([System.Runtime.CompilerServices.Nullable(1)] string name, ActivityKind kind, ActivityContext parentContext, [System.Runtime.CompilerServices.Nullable(new byte[] { 2, 0, 1, 2 })] IEnumerable<KeyValuePair<string, object>> tags = null, IEnumerable<ActivityLink> links = null, DateTimeOffset startTime = default(DateTimeOffset)) { return CreateActivity(name, kind, parentContext, null, tags, links, startTime, true, ActivityIdFormat.Unknown); } public Activity StartActivity([System.Runtime.CompilerServices.Nullable(1)] string name, ActivityKind kind, string parentId, [System.Runtime.CompilerServices.Nullable(new byte[] { 2, 0, 1, 2 })] IEnumerable<KeyValuePair<string, object>> tags = null, IEnumerable<ActivityLink> links = null, DateTimeOffset startTime = default(DateTimeOffset)) { return CreateActivity(name, kind, default(ActivityContext), parentId, tags, links, startTime, true, ActivityIdFormat.Unknown); } public Activity StartActivity(ActivityKind kind, ActivityContext parentContext = default(ActivityContext), [System.Runtime.CompilerServices.Nullable(new byte[] { 2, 0, 1, 2 })] IEnumerable<KeyValuePair<string, object>> tags = null, IEnumerable<ActivityLink> links = null, DateTimeOffset startTime = default(DateTimeOffset), [System.Runtime.CompilerServices.Nullable(1)] [CallerMemberName] string name = "") { return CreateActivity(name, kind, parentContext, null, tags, links, startTime, true, ActivityIdFormat.Unknown); } private Activity CreateActivity(string name, ActivityKind kind, ActivityContext context, string parentId, IEnumerable<KeyValuePair<string, object>> tags, IEnumerable<ActivityLink> links, DateTimeOffset startTime, bool startIt = true, ActivityIdFormat idFormat = ActivityIdFormat.Unknown) { SynchronizedList<ActivityListener> listeners = _listeners; if (listeners == null || listeners.Count == 0) return null; Activity result2 = null; ActivitySamplingResult samplingResult = ActivitySamplingResult.None; ActivityTagsCollection activityTagsCollection; string traceState; if (parentId != null) { ActivityCreationOptions<string> data2 = default(ActivityCreationOptions<string>); ActivityCreationOptions<ActivityContext> dataWithContext2 = default(ActivityCreationOptions<ActivityContext>); data2 = new ActivityCreationOptions<string>(this, name, parentId, kind, tags, links, idFormat); if (data2.IdFormat == ActivityIdFormat.W3C) dataWithContext2 = new ActivityCreationOptions<ActivityContext>(this, name, data2.GetContext(), kind, tags, links, ActivityIdFormat.W3C); listeners.EnumWithFunc(delegate(ActivityListener listener, ref ActivityCreationOptions<string> data, ref ActivitySamplingResult result, ref ActivityCreationOptions<ActivityContext> dataWithContext) { SampleActivity<string> sampleUsingParentId = listener.SampleUsingParentId; if (sampleUsingParentId != null) { ActivitySamplingResult activitySamplingResult2 = sampleUsingParentId(ref data); dataWithContext.SetTraceState(data.TraceState); if (activitySamplingResult2 > result) result = activitySamplingResult2; } else if (data.IdFormat == ActivityIdFormat.W3C) { SampleActivity<ActivityContext> sample2 = listener.Sample; if (sample2 != null) { ActivitySamplingResult activitySamplingResult3 = sample2(ref dataWithContext); data.SetTraceState(dataWithContext.TraceState); if (activitySamplingResult3 > result) result = activitySamplingResult3; } } }, ref data2, ref samplingResult, ref dataWithContext2); if (context == default(ActivityContext)) { if (data2.GetContext() != default(ActivityContext)) { context = data2.GetContext(); parentId = null; } else if (dataWithContext2.GetContext() != default(ActivityContext)) { context = dataWithContext2.GetContext(); parentId = null; } } activityTagsCollection = data2.GetSamplingTags(); ActivityTagsCollection samplingTags = dataWithContext2.GetSamplingTags(); if (samplingTags != null) { if (activityTagsCollection == null) activityTagsCollection = samplingTags; else { foreach (KeyValuePair<string, object> item in samplingTags) { activityTagsCollection.Add(item); } } } idFormat = data2.IdFormat; traceState = data2.TraceState; } else { bool flag = context == default(ActivityContext) && Activity.Current != null; ActivityCreationOptions<ActivityContext> data3 = new ActivityCreationOptions<ActivityContext>(this, name, flag ? Activity.Current.Context : context, kind, tags, links, idFormat); listeners.EnumWithFunc(delegate(ActivityListener listener, ref ActivityCreationOptions<ActivityContext> data, ref ActivitySamplingResult result, ref ActivityCreationOptions<ActivityContext> unused) { SampleActivity<ActivityContext> sample = listener.Sample; if (sample != null) { ActivitySamplingResult activitySamplingResult = sample(ref data); if (activitySamplingResult > result) result = activitySamplingResult; } }, ref data3, ref samplingResult, ref data3); if (!flag) context = data3.GetContext(); activityTagsCollection = data3.GetSamplingTags(); idFormat = data3.IdFormat; traceState = data3.TraceState; } if (samplingResult != 0) result2 = Activity.Create(this, name, kind, parentId, context, tags, links, startTime, activityTagsCollection, samplingResult, startIt, idFormat, traceState); return result2; } public void Dispose() { _listeners = null; s_activeSources.Remove(this); } [System.Runtime.CompilerServices.NullableContext(1)] public static void AddActivityListener(ActivityListener listener) { if (listener == null) throw new ArgumentNullException("listener"); if (s_allListeners.AddIfNotExist(listener)) s_activeSources.EnumWithAction(delegate(ActivitySource source, object obj) { Func<ActivitySource, bool> shouldListenTo = ((ActivityListener)obj).ShouldListenTo; if (shouldListenTo != null && shouldListenTo(source)) source.AddListener((ActivityListener)obj); }, listener); } internal void AddListener(ActivityListener listener) { if (_listeners == null) Interlocked.CompareExchange(ref _listeners, new SynchronizedList<ActivityListener>(), null); _listeners.AddIfNotExist(listener); } internal static void DetachListener(ActivityListener listener) { s_allListeners.Remove(listener); s_activeSources.EnumWithAction(delegate(ActivitySource source, object obj) { source._listeners?.Remove((ActivityListener)obj); }, listener); } internal void NotifyActivityStart(Activity activity) { SynchronizedList<ActivityListener> listeners = _listeners; if (listeners != null && listeners.Count > 0) listeners.EnumWithAction(delegate(ActivityListener listener, object obj) { listener.ActivityStarted?.Invoke((Activity)obj); }, activity); } internal void NotifyActivityStop(Activity activity) { SynchronizedList<ActivityListener> listeners = _listeners; if (listeners != null && listeners.Count > 0) listeners.EnumWithAction(delegate(ActivityListener listener, object obj) { listener.ActivityStopped?.Invoke((Activity)obj); }, activity); } } }