opentelemetry-dotnet-instru.../test/test-applications/integrations/TestApplication.SelectiveSa.../Program.cs

85 lines
2.5 KiB
C#

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
using System.Diagnostics;
using System.Reflection;
namespace TestApplication.SelectiveSampler;
internal static class Program
{
private static readonly ActivitySource ActivitySource = new("TestApplication.SelectiveSampler", "1.0.0");
private static Action? _startSamplingDelegate;
private static Action? _stopSamplingDelegate;
private static AsyncLocal<Activity?>? _supportingActivityAsyncLocal;
public static async Task Main(string[] args)
{
Init();
Thread.CurrentThread.Name = "Main";
using (ActivitySource.StartActivity())
{
await SimpleAsyncCase();
}
}
// TODO: requires profiler to be attached.
private static void Init()
{
var nativeMethodsType = Type.GetType("OpenTelemetry.AutoInstrumentation.NativeMethods, OpenTelemetry.AutoInstrumentation");
if (nativeMethodsType == null)
{
throw new Exception("OpenTelemetry.AutoInstrumentation.NativeMethods could not be found.");
}
var startMethod = nativeMethodsType.GetMethod("SelectiveSamplingStart", BindingFlags.Static | BindingFlags.Public, null, [], null);
var stopMethod = nativeMethodsType!.GetMethod("SelectiveSamplingStop", BindingFlags.Static | BindingFlags.Public, null, [], null);
_startSamplingDelegate = (Action)Delegate.CreateDelegate(typeof(Action), startMethod!);
_stopSamplingDelegate = (Action)Delegate.CreateDelegate(typeof(Action), stopMethod!);
_supportingActivityAsyncLocal = new AsyncLocal<Activity?>(ActivityChanged);
Activity.CurrentChanged += ActivityCurrentChanged;
}
private static void ActivityChanged(AsyncLocalValueChangedArgs<Activity?> sender)
{
var currentActivity = sender.CurrentValue;
if (currentActivity != null)
{
_startSamplingDelegate?.Invoke();
}
else
{
_stopSamplingDelegate?.Invoke();
}
}
private static void ActivityCurrentChanged(object? sender, ActivityChangedEventArgs e)
{
if (_supportingActivityAsyncLocal != null)
{
_supportingActivityAsyncLocal.Value = e.Current;
}
}
private static async Task SimpleAsyncCase()
{
WaitShortSync();
await Task.Yield();
WaitLongSync();
}
private static void WaitShortSync()
{
Thread.Sleep(200);
}
private static void WaitLongSync()
{
Thread.Sleep(300);
}
}