Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/dotnet-format.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,4 @@ jobs:
dotnet-version: 10.0.101

- name: dotnet format
run: dotnet format .\OpenTelemetry.AutoInstrumentation.sln --no-restore --verify-no-changes
run: dotnet format .\OpenTelemetry.AutoInstrumentation.sln --verify-no-changes
8 changes: 4 additions & 4 deletions test/IntegrationTests/AspNetTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public async Task SubmitsTraces(AppPoolMode appPoolMode, Gac useGac)
// accessible to the Windows docker container where the test application is executed by binding
// the endpoint to all network interfaces. In order to do that it is necessary to open the port
// on the firewall.
using var collector = new MockSpansCollector(Output, host: "*");
using var collector = await MockSpansCollector.InitializeAsync(Output, host: "*");
using var fwPort = FirewallHelper.OpenWinPort(collector.Port, Output);
collector.Expect("OpenTelemetry.Instrumentation.AspNet"); // Expect Mvc span
collector.Expect("OpenTelemetry.Instrumentation.AspNet"); // Expect WebApi span
Expand Down Expand Up @@ -93,7 +93,7 @@ public async Task SubmitTracesCapturesHttpHeaders(AppPoolMode appPoolMode, Gac u
// accessible to the Windows docker container where the test application is executed by binding
// the endpoint to all network interfaces. In order to do that it is necessary to open the port
// on the firewall.
using var collector = new MockSpansCollector(Output, host: "*");
using var collector = await MockSpansCollector.InitializeAsync(Output, host: "*");
using var fwPort = FirewallHelper.OpenWinPort(collector.Port, Output);
collector.Expect("OpenTelemetry.Instrumentation.AspNet", span => // Expect Mvc span
{
Expand Down Expand Up @@ -161,7 +161,7 @@ public async Task TracesResource()
// accessible to the Windows docker container where the test application is executed by binding
// the endpoint to all network interfaces. In order to do that it is necessary to open the port
// on the firewall.
using var collector = new MockSpansCollector(Output, host: "*");
using var collector = await MockSpansCollector.InitializeAsync(Output, host: "*");
using var fwPort = FirewallHelper.OpenWinPort(collector.Port, Output);
collector.ResourceExpector.Expect("service.name", ServiceName); // this is set via env var in Dockerfile and Wep.config, but env var has precedence
collector.ResourceExpector.Expect("deployment.environment.name", "test"); // this is set via Wep.config
Expand Down Expand Up @@ -193,7 +193,7 @@ public async Task SubmitMetrics()
// accessible to the Windows docker container where the test application is executed by binding
// the endpoint to all network interfaces. In order to do that it is necessary to open the port
// on the firewall.
using var collector = new MockMetricsCollector(Output, host: "*");
using var collector = await MockMetricsCollector.InitializeAsync(Output, host: "*");
using var fwPort = FirewallHelper.OpenWinPort(collector.Port, Output);
collector.Expect("OpenTelemetry.Instrumentation.AspNet");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ public AssemblyRedirectionOnNetFrameworkTests(ITestOutputHelper output)
}

[Fact]
public void SubmitsTraces()
public async Task SubmitsTraces()
{
using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);

const string TestApplicationActivitySource = "AssemblyRedirection.NetFramework.ActivitySource";
Expand Down
4 changes: 2 additions & 2 deletions test/IntegrationTests/AzureTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ public AzureTests(ITestOutputHelper output, AzureFixture azure)
[Trait("Category", "EndToEnd")]
[Trait("Containers", "Linux")]
[MemberData(nameof(LibraryVersion.Azure), MemberType = typeof(LibraryVersion))]
public void SubmitsTraces(string packageVersion)
public async Task SubmitsTraces(string packageVersion)
{
using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);

collector.Expect("Azure.Core.Http");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ public ContinuousProfilerContextTrackingTests(ITestOutputHelper output)

[Fact]
[Trait("Category", "EndToEnd")]
public void TraceContextIsCorrectlyAssociatedWithThreadSamples()
public async Task TraceContextIsCorrectlyAssociatedWithThreadSamples()
{
EnableBytecodeInstrumentation();
using var collector = new MockProfilesCollector(Output);
using var collector = await MockProfilesCollector.InitializeAsync(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");
Expand Down
12 changes: 6 additions & 6 deletions test/IntegrationTests/ContinuousProfilerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ public ContinuousProfilerTests(ITestOutputHelper output)
#if NET // allocator tests are only supported on .NET
[Fact]
[Trait("Category", "EndToEnd")]
public void ExportAllocationSamples()
public async Task ExportAllocationSamples()
{
EnableBytecodeInstrumentation();
using var collector = new MockProfilesCollector(Output);
using var collector = await MockProfilesCollector.InitializeAsync(Output);
SetExporter(collector);
SetEnvironmentVariable("OTEL_DOTNET_AUTO_PLUGINS", "TestApplication.ContinuousProfiler.AllocationPlugin, TestApplication.ContinuousProfiler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
SetEnvironmentVariable("OTEL_DOTNET_AUTO_TRACES_ADDITIONAL_SOURCES", "TestApplication.ContinuousProfiler");
Expand All @@ -37,10 +37,10 @@ public void ExportAllocationSamples()
#if NETFRAMEWORK
[Fact]
[Trait("Category", "EndToEnd")]
public void ExportAllocationSamples_NetFramework_NoSamplesCollected()
public async Task ExportAllocationSamples_NetFramework_NoSamplesCollected()
{
EnableBytecodeInstrumentation();
using var collector = new MockProfilesCollector(Output);
using var collector = await MockProfilesCollector.InitializeAsync(Output);
SetExporter(collector);
SetEnvironmentVariable("OTEL_DOTNET_AUTO_PLUGINS", "TestApplication.ContinuousProfiler.AllocationPlugin, TestApplication.ContinuousProfiler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
SetEnvironmentVariable("OTEL_DOTNET_AUTO_TRACES_ADDITIONAL_SOURCES", "TestApplication.ContinuousProfiler");
Expand All @@ -52,10 +52,10 @@ public void ExportAllocationSamples_NetFramework_NoSamplesCollected()

[Fact]
[Trait("Category", "EndToEnd")]
public void ExportThreadSamples()
public async Task ExportThreadSamples()
{
EnableBytecodeInstrumentation();
using var collector = new MockProfilesCollector(Output);
using var collector = await MockProfilesCollector.InitializeAsync(Output);
SetExporter(collector);
SetEnvironmentVariable("OTEL_DOTNET_AUTO_PLUGINS", "TestApplication.ContinuousProfiler.ThreadPlugin, TestApplication.ContinuousProfiler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
SetEnvironmentVariable("OTEL_DOTNET_AUTO_TRACES_ADDITIONAL_SOURCES", "TestApplication.ContinuousProfiler");
Expand Down
8 changes: 4 additions & 4 deletions test/IntegrationTests/CustomSdkTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ public CustomSdkTests(ITestOutputHelper output, RedisFixture redis)
[Fact]
[Trait("Category", "EndToEnd")]
[Trait("Containers", "Linux")]
public void SubmitsTraces()
public async Task SubmitsTraces()
{
using var testServer = TestHttpServer.CreateDefaultTestServer(Output);
using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);

// ensure spans are exported by custom sdk with custom resource
Expand Down Expand Up @@ -54,10 +54,10 @@ public void SubmitsTraces()
[Fact]
[Trait("Category", "EndToEnd")]
[Trait("Containers", "Linux")]
public void SubmitsMetrics()
public async Task SubmitsMetrics()
{
using var testServer = TestHttpServer.CreateDefaultTestServer(Output);
using var collector = new MockMetricsCollector(Output);
using var collector = await MockMetricsCollector.InitializeAsync(Output);
SetExporter(collector);

// ensure metrics are exported by custom sdk with custom resource
Expand Down
4 changes: 2 additions & 2 deletions test/IntegrationTests/DomainNeutralTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ public DomainNeutralTests(ITestOutputHelper output)

[Fact]
[Trait("Category", "EndToEnd")]
public void SubmitsTraces()
public async Task SubmitsTraces()
{
Assert.True(EnvironmentTools.IsWindowsAdministrator(), "This test requires Windows Administrator privileges.");

using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);
collector.Expect("ByteCode.Plugin.StrongNamedValidation");

Expand Down
10 changes: 5 additions & 5 deletions test/IntegrationTests/DotNetCliTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void Dispose()
}

[Fact]
public void WorkFlow()
public async Task WorkFlow()
{
using var testServer = TestHttpServer.CreateDefaultTestServer(Output);
// Ensure no MS telemetry spans.
Expand All @@ -54,12 +54,12 @@ public void WorkFlow()
RunDotNetCli("build");

var targetAppDllPath = Path.Combine(".", "bin", "Debug", tfm, TargetAppName + ".dll");
RunAppWithDotNetCliAndAssertHttpSpans(targetAppDllPath);
await RunAppWithDotNetCliAndAssertHttpSpans(targetAppDllPath);

// Not necessary, but, testing a common command.
RunDotNetCli("clean");

RunAppWithDotNetCliAndAssertHttpSpans("run -c Release");
await RunAppWithDotNetCliAndAssertHttpSpans("run -c Release");
}

private static void ChangeDefaultProgramToHttpClient(int testServerPort)
Expand Down Expand Up @@ -105,9 +105,9 @@ private void RunDotNetCli(string arguments)
Assert.Equal(0, process.ExitCode);
}

private void RunAppWithDotNetCliAndAssertHttpSpans(string arguments)
private async Task RunAppWithDotNetCliAndAssertHttpSpans(string arguments)
{
using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);

collector.Expect("System.Net.Http");
Expand Down
4 changes: 2 additions & 2 deletions test/IntegrationTests/ElasticsearchTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ public ElasticsearchTests(ITestOutputHelper output)
[Theory]
[Trait("Category", "EndToEnd")]
[MemberData(nameof(LibraryVersion.Elasticsearch), MemberType = typeof(LibraryVersion))]
public void SubmitsTraces(string packageVersion)
public async Task SubmitsTraces(string packageVersion)
{
using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);

if (string.IsNullOrEmpty(packageVersion) || new Version(packageVersion).CompareTo(new Version(8, 10, 0)) >= 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ public EntityFrameworkCorePomeloMySqlTests(ITestOutputHelper output, MySqlFixtur
[Trait("Category", "EndToEnd")]
[Trait("Containers", "Linux")]
[MemberData(nameof(LibraryVersion.EntityFrameworkCorePomeloMySql), MemberType = typeof(LibraryVersion))]
public void SubmitsTraces(string packageVersion)
public async Task SubmitsTraces(string packageVersion)
{
using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);
collector.Expect("OpenTelemetry.Instrumentation.EntityFrameworkCore");

Expand Down
4 changes: 2 additions & 2 deletions test/IntegrationTests/EntityFrameworkCoreTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ public EntityFrameworkCoreTests(ITestOutputHelper output)
[Theory]
[Trait("Category", "EndToEnd")]
[MemberData(nameof(LibraryVersion.EntityFrameworkCore), MemberType = typeof(LibraryVersion))]
public void SubmitTraces(string packageVersion)
public async Task SubmitTraces(string packageVersion)
{
using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);

collector.Expect("OpenTelemetry.Instrumentation.EntityFrameworkCore");
Expand Down
2 changes: 1 addition & 1 deletion test/IntegrationTests/GraphQLTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public static TheoryData<string, bool> GetData()
public async Task SubmitsTraces(string packageVersion, bool setDocument)
{
var requests = new List<RequestInfo>();
using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);

// SUCCESS: query using GET
Expand Down
8 changes: 4 additions & 4 deletions test/IntegrationTests/GrpcNetClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ public GrpcNetClientTests(ITestOutputHelper output)
[Theory]
[Trait("Category", "EndToEnd")]
[MemberData(nameof(LibraryVersion.GrpcNetClient), MemberType = typeof(LibraryVersion))]
public void SubmitsTraces(string packageVersion)
public async Task SubmitsTraces(string packageVersion)
{
using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);
collector.Expect("OpenTelemetry.Instrumentation.GrpcNetClient");

Expand All @@ -34,9 +34,9 @@ public void SubmitsTraces(string packageVersion)
[Theory]
[Trait("Category", "EndToEnd")]
[MemberData(nameof(LibraryVersion.GrpcNetClient), MemberType = typeof(LibraryVersion))]
public void SubmitTracesCapturesGrpcMetadata(string packageVersion)
public async Task SubmitTracesCapturesGrpcMetadata(string packageVersion)
{
using var collector = new MockSpansCollector(Output);
using var collector = await MockSpansCollector.InitializeAsync(Output);
SetExporter(collector);

collector.Expect("OpenTelemetry.Instrumentation.GrpcNetClient", span =>
Expand Down
59 changes: 59 additions & 0 deletions test/IntegrationTests/Helpers/MockCollectorHealthZ.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#if NET
using System.Net;
using Microsoft.AspNetCore.Http;
using Xunit.Abstractions;

namespace IntegrationTests.Helpers;

internal static class MockCollectorHealthZ
{
private static readonly HttpClient HttpClient = new()
{
Timeout = TimeSpan.FromSeconds(1)
};

public static PathHandler CreateHealthZHandler()
{
return new PathHandler(HandleHealthZRequests, "/healthz");
}

public static async Task WarmupHealthZEndpoint(ITestOutputHelper output, string host, int port)
{
var finalHost = host == "*" ? "localhost" : host;

var healthZUrl = new Uri($"http://{finalHost}:{port}/healthz");
const int maxAttempts = 10;
for (var i = 1; i <= maxAttempts; ++i)
{
try
{
var response = await HttpClient.GetAsync(healthZUrl).ConfigureAwait(false);
if (response.StatusCode == HttpStatusCode.OK)
{
return;
}
}
#pragma warning disable CA1031 // Do not catch general exception types. Catching all exceptions to retry.
catch (Exception e)
#pragma warning restore CA1031 // Do not catch general exception types. Catching all exceptions to retry.
{
output.WriteLine($"Exception while calling {healthZUrl}: {e.Message}. Attempt: {i}");
}

if (i == maxAttempts)
{
throw new InvalidOperationException($"Failed to warm up healthz endpoint at {healthZUrl} after {maxAttempts} attempts.");
}
}
}

private static async Task HandleHealthZRequests(HttpContext context)
{
context.Response.StatusCode = 200;
await context.Response.WriteAsync("OK").ConfigureAwait(false);
}
}
#endif
19 changes: 17 additions & 2 deletions test/IntegrationTests/Helpers/MockLogsCollector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ internal sealed class MockLogsCollector : IDisposable

private CollectedExpectation? _collectedExpectation;

public MockLogsCollector(ITestOutputHelper output, string host = "localhost")
private MockLogsCollector(ITestOutputHelper output, string host)
{
_output = output;

#if NETFRAMEWORK
_listener = new(output, HandleHttpRequests, host, "/v1/logs/");
#else
_listener = new(output, nameof(MockLogsCollector), new PathHandler(HandleHttpRequests, "/v1/logs"));
_listener = new(output, nameof(MockLogsCollector), new PathHandler(HandleHttpRequests, "/v1/logs"), MockCollectorHealthZ.CreateHealthZHandler());
#endif
}

Expand All @@ -42,6 +42,21 @@ public MockLogsCollector(ITestOutputHelper output, string host = "localhost")

public OtlpResourceExpector ResourceExpector { get; } = new();

#if NET
public static async Task<MockLogsCollector> InitializeAsync(ITestOutputHelper output, string host = "localhost")
#else
public static Task<MockLogsCollector> InitializeAsync(ITestOutputHelper output, string host = "localhost")
#endif
{
var collector = new MockLogsCollector(output, host);
#if NET
await MockCollectorHealthZ.WarmupHealthZEndpoint(output, host, collector.Port);
return collector;
#else
return Task.FromResult(collector);
#endif
}

public void Dispose()
{
WriteOutput($"Shutting down. Total logs requests received: '{_logs.Count}'");
Expand Down
19 changes: 17 additions & 2 deletions test/IntegrationTests/Helpers/MockMetricsCollector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ internal sealed class MockMetricsCollector : IDisposable
private readonly BlockingCollection<List<Collected>> _metricsSnapshots = new(10); // bounded to avoid memory leak; contains protobuf type
private Func<ICollection<Collected>, bool>? _additionalEntriesExpectation;

public MockMetricsCollector(ITestOutputHelper output, string host = "localhost")
private MockMetricsCollector(ITestOutputHelper output, string host)
{
_output = output;
#if NETFRAMEWORK
_listener = new(output, HandleHttpRequests, host, "/v1/metrics/");
#else
_listener = new(output, nameof(MockMetricsCollector), new PathHandler(HandleHttpRequests, "/v1/metrics"));
_listener = new(output, nameof(MockMetricsCollector), new PathHandler(HandleHttpRequests, "/v1/metrics"), MockCollectorHealthZ.CreateHealthZHandler());
#endif
}

Expand All @@ -42,6 +42,21 @@ public MockMetricsCollector(ITestOutputHelper output, string host = "localhost")

public OtlpResourceExpector ResourceExpector { get; } = new();

#if NET
public static async Task<MockMetricsCollector> InitializeAsync(ITestOutputHelper output, string host = "localhost")
#else
public static Task<MockMetricsCollector> InitializeAsync(ITestOutputHelper output, string host = "localhost")
#endif
{
var collector = new MockMetricsCollector(output, host);
#if NET
await MockCollectorHealthZ.WarmupHealthZEndpoint(output, host, collector.Port);
return collector;
#else
return Task.FromResult(collector);
#endif
}

public void Dispose()
{
WriteOutput("Shutting down.");
Expand Down
Loading
Loading