Skip to content

Commit 99d4b14

Browse files
author
Timothy Mothra
authored
[AzureMonitorExporter] refactor RequestTelemetryTest (Azure#29910)
* refactor tests * cleanup * remove * cleanup * citation
1 parent 465cca3 commit 99d4b14

File tree

4 files changed

+99
-96
lines changed

4 files changed

+99
-96
lines changed

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Integration.Tests/Azure.Monitor.OpenTelemetry.Exporter.Integration.Tests.csproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,4 @@
4040
<ProjectReference Include="..\Integration.Tests.AspNetCoreWebApp\Azure.Monitor.OpenTelemetry.Exporter.Integration.Tests.AspNetCoreWebApp.csproj" />
4141
</ItemGroup>
4242

43-
<ItemGroup>
44-
<Compile Include="$(AzureCoreSharedSources)\HttpPipelineMessageHandler.cs" LinkBase="Shared" />
45-
</ItemGroup>
46-
4743
</Project>

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Integration.Tests/RequestTelemetryTests.cs

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,25 @@
55
using System.Linq;
66
using System.Threading.Tasks;
77

8+
using Azure.Monitor.OpenTelemetry.Exporter.Integration.Tests.AspNetCoreWebApp;
89
using Azure.Monitor.OpenTelemetry.Exporter.Integration.Tests.TestFramework;
9-
using Azure.Monitor.OpenTelemetry.Exporter.Models;
10+
11+
using Microsoft.AspNetCore.Mvc.Testing;
12+
using Microsoft.AspNetCore.TestHost;
13+
using Microsoft.Extensions.DependencyInjection;
14+
15+
using OpenTelemetry;
16+
using OpenTelemetry.Trace;
1017

1118
using Xunit;
1219
using Xunit.Abstractions;
1320

1421
namespace Azure.Monitor.OpenTelemetry.Exporter.Integration.Tests
1522
{
16-
public class RequestTelemetryTests : IClassFixture<OpenTelemetryWebApplicationFactory<AspNetCoreWebApp.Startup>>
23+
public class RequestTelemetryTests : WebApplicationTestsBase
1724
{
18-
private readonly OpenTelemetryWebApplicationFactory<AspNetCoreWebApp.Startup> factory;
19-
private readonly ITestOutputHelper output;
20-
private readonly TelemetryItemOutputHelper telemetryOutput;
21-
22-
public RequestTelemetryTests(OpenTelemetryWebApplicationFactory<AspNetCoreWebApp.Startup> factory, ITestOutputHelper output)
25+
public RequestTelemetryTests(WebApplicationFactory<Startup> factory, ITestOutputHelper output) : base(factory, output)
2326
{
24-
this.factory = factory;
25-
this.output = output;
26-
this.telemetryOutput = new TelemetryItemOutputHelper(output);
2727
}
2828

2929
/// <summary>
@@ -36,35 +36,35 @@ public async Task VerifyRequestTelemetry()
3636
string testValue = Guid.NewGuid().ToString();
3737

3838
// Arrange
39-
var client = this.factory.CreateClient();
39+
var transmitter = new MockTransmitter();
40+
var activityProcessor = new SimpleActivityExportProcessor(new AzureMonitorTraceExporter(transmitter));
41+
var client = this.factory
42+
.WithWebHostBuilder(builder =>
43+
builder.ConfigureTestServices(services =>
44+
{
45+
services.AddOpenTelemetryTracing((builder) => builder
46+
.AddAspNetCoreInstrumentation()
47+
.AddProcessor(activityProcessor));
48+
}))
49+
.CreateClient();
4050

4151
// Act
4252
var request = new Uri(client.BaseAddress, $"api/home/{testValue}");
4353
var response = await client.GetAsync(request);
4454

4555
// Shutdown
4656
response.EnsureSuccessStatusCode();
47-
this.factory.WaitForActivityExport();
57+
this.WaitForActivityExport(transmitter.TelemetryItems);
4858

4959
// Assert
50-
Assert.True(this.factory.TelemetryItems.Any(), "test project did not capture telemetry");
51-
var telemetryItem = this.factory.TelemetryItems.Single();
52-
telemetryOutput.Write(telemetryItem);
53-
54-
Assert.Equal("Request", telemetryItem.Name);
55-
56-
Assert.Contains("ai.operation.id", telemetryItem.Tags.Keys);
57-
Assert.Contains("ai.user.userAgent", telemetryItem.Tags.Keys);
58-
Assert.Contains("ai.operation.name", telemetryItem.Tags.Keys);
59-
Assert.Contains("ai.location.ip", telemetryItem.Tags.Keys);
60-
Assert.Contains("ai.cloud.role", telemetryItem.Tags.Keys);
61-
Assert.Contains("ai.cloud.roleInstance", telemetryItem.Tags.Keys);
62-
Assert.Contains("ai.internal.sdkVersion", telemetryItem.Tags.Keys);
60+
Assert.True(transmitter.TelemetryItems.Any(), "test project did not capture telemetry");
61+
var telemetryItem = transmitter.TelemetryItems.Single();
62+
this.telemetryOutput.Write(telemetryItem);
6363

64-
Assert.Equal(nameof(RequestData), telemetryItem.Data.BaseType);
65-
var requestData = (RequestData)telemetryItem.Data.BaseData;
66-
Assert.Equal("200", requestData.ResponseCode);
67-
Assert.Equal(request.AbsoluteUri, requestData.Url);
64+
AssertRequestTelemetry(
65+
telemetryItem: telemetryItem,
66+
expectedResponseCode: "200",
67+
expectedUrl: request.AbsoluteUri);
6868
}
6969
}
7070
}

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Integration.Tests/TestFramework/OpenTelemetryWebApplicationFactory.cs

Lines changed: 0 additions & 63 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.Collections.Concurrent;
6+
using System.Linq;
7+
using System.Threading;
8+
9+
using Azure.Monitor.OpenTelemetry.Exporter.Models;
10+
11+
using Microsoft.AspNetCore.Mvc.Testing;
12+
13+
using Xunit;
14+
using Xunit.Abstractions;
15+
16+
namespace Azure.Monitor.OpenTelemetry.Exporter.Integration.Tests.TestFramework
17+
{
18+
public abstract class WebApplicationTestsBase : IClassFixture<WebApplicationFactory<AspNetCoreWebApp.Startup>>
19+
{
20+
protected readonly WebApplicationFactory<AspNetCoreWebApp.Startup> factory;
21+
protected readonly ITestOutputHelper output;
22+
internal readonly TelemetryItemOutputHelper telemetryOutput;
23+
24+
public WebApplicationTestsBase(WebApplicationFactory<AspNetCoreWebApp.Startup> factory, ITestOutputHelper output)
25+
{
26+
this.factory = factory;
27+
this.output = output;
28+
this.telemetryOutput = new TelemetryItemOutputHelper(output);
29+
}
30+
31+
/// <summary>
32+
/// Wait for End callback to execute because it is executed after response was returned.
33+
/// </summary>
34+
/// <remarks>
35+
/// Copied from <see href="https://github.com/open-telemetry/opentelemetry-dotnet/blob/f471a9f197d797015123fe95d3e12b6abf8e1f5f/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs#L558-L570"/>.
36+
/// </remarks>
37+
internal void WaitForActivityExport(ConcurrentBag<TelemetryItem> telemetryItems)
38+
{
39+
var result = SpinWait.SpinUntil(
40+
condition: () =>
41+
{
42+
Thread.Sleep(10);
43+
return telemetryItems.Any();
44+
},
45+
timeout: TimeSpan.FromSeconds(10));
46+
47+
Assert.True(result, $"{nameof(WaitForActivityExport)} failed.");
48+
}
49+
50+
internal void AssertRequestTelemetry(TelemetryItem telemetryItem, string expectedResponseCode, string expectedUrl)
51+
{
52+
Assert.Equal("Request", telemetryItem.Name);
53+
54+
// Tags
55+
Assert.Contains("ai.operation.id", telemetryItem.Tags.Keys);
56+
Assert.Contains("ai.user.userAgent", telemetryItem.Tags.Keys);
57+
Assert.Contains("ai.operation.name", telemetryItem.Tags.Keys);
58+
Assert.Contains("ai.location.ip", telemetryItem.Tags.Keys);
59+
Assert.Contains("ai.cloud.role", telemetryItem.Tags.Keys);
60+
Assert.Contains("ai.cloud.roleInstance", telemetryItem.Tags.Keys);
61+
Assert.Contains("ai.internal.sdkVersion", telemetryItem.Tags.Keys);
62+
63+
// BaseData
64+
Assert.Equal("RequestData", telemetryItem.Data.BaseType);
65+
var requestData = (RequestData)telemetryItem.Data.BaseData;
66+
Assert.Equal(expectedResponseCode, requestData.ResponseCode);
67+
Assert.Equal(expectedUrl, requestData.Url);
68+
}
69+
}
70+
}

0 commit comments

Comments
 (0)