ActivitySource
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);
}
}
}