64 lines
2.5 KiB
C#
64 lines
2.5 KiB
C#
// Copyright The OpenTelemetry Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
#if NET
|
|
|
|
using IntegrationTests.Helpers;
|
|
using OpenTelemetry.Proto.Collector.Profiles.V1Development;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace IntegrationTests;
|
|
|
|
public class ContinuousProfilerContextTrackingTests : TestHelper
|
|
{
|
|
public ContinuousProfilerContextTrackingTests(ITestOutputHelper output)
|
|
: base("ContinuousProfiler.ContextTracking", output)
|
|
{
|
|
}
|
|
|
|
[Fact]
|
|
[Trait("Category", "EndToEnd")]
|
|
public void TraceContextIsCorrectlyAssociatedWithThreadSamples()
|
|
{
|
|
EnableBytecodeInstrumentation();
|
|
using var collector = new MockProfilesCollector(Output);
|
|
SetExporter(collector);
|
|
SetEnvironmentVariable("OTEL_DOTNET_AUTO_PLUGINS", "TestApplication.ContinuousProfiler.ContextTracking.TestPlugin, TestApplication.ContinuousProfiler.ContextTracking, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
|
|
SetEnvironmentVariable("OTEL_DOTNET_AUTO_TRACES_ADDITIONAL_SOURCES", "TestApplication.ContinuousProfiler.ContextTracking");
|
|
|
|
collector.ExpectCollected(AssertAllProfiles, $"{nameof(AssertAllProfiles)} failed");
|
|
|
|
RunTestApplication();
|
|
|
|
collector.AssertCollected();
|
|
}
|
|
|
|
private bool AssertAllProfiles(ICollection<ExportProfilesServiceRequest> profilesServiceRequests)
|
|
{
|
|
var totalSamplesWithTraceContextCount = 0;
|
|
var managedThreadsWithTraceContext = new HashSet<string>();
|
|
|
|
foreach (var batch in profilesServiceRequests)
|
|
{
|
|
var profile = batch.ResourceProfiles.Single().ScopeProfiles.Single().Profiles.Single();
|
|
|
|
var samplesInBatch = profile.Sample;
|
|
|
|
var samplesWithTraceContext = samplesInBatch.Where(s => s.HasLinkIndex).ToList();
|
|
|
|
Assert.True(samplesWithTraceContext.Count <= 1, "at most one sample in a batch should have trace context associated.");
|
|
|
|
totalSamplesWithTraceContextCount += samplesWithTraceContext.Count;
|
|
if (samplesWithTraceContext.FirstOrDefault() is { } sampleWithTraceContext)
|
|
{
|
|
managedThreadsWithTraceContext.Add(profile.AttributeTable[sampleWithTraceContext.AttributeIndices.Single()].Value.StringValue);
|
|
}
|
|
}
|
|
|
|
Assert.True(managedThreadsWithTraceContext.Count > 1, "at least 2 distinct threads should have trace context associated.");
|
|
Assert.True(totalSamplesWithTraceContextCount >= 3, "there should be sample with trace context in most of the batches.");
|
|
return true;
|
|
}
|
|
}
|
|
#endif
|