Skip to content

Commit df9b2ec

Browse files
adding tests (#49043)
1 parent ecc9cd5 commit df9b2ec

File tree

1 file changed

+254
-0
lines changed
  • sdk/monitor/Azure.Monitor.OpenTelemetry.AspNetCore/tests/Azure.Monitor.OpenTelemetry.AspNetCore.Tests

1 file changed

+254
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,254 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.Reflection;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Azure.Monitor.OpenTelemetry.Exporter;
9+
using Microsoft.Extensions.DependencyInjection;
10+
using Microsoft.Extensions.Hosting;
11+
using OpenTelemetry.Trace;
12+
using Xunit;
13+
14+
namespace Azure.Monitor.OpenTelemetry.AspNetCore.Tests
15+
{
16+
/// <summary>
17+
/// These tests evaluate the initialization of AzureMonitor Distro and Exporter.
18+
/// </summary>
19+
public class InitializationTests
20+
{
21+
private const string TestConnectionString = $"InstrumentationKey=unitTest";
22+
private const string TestConnectionString2 = $"InstrumentationKey=unitTest-2";
23+
24+
[Fact]
25+
public async Task VerifyCannotCallUseAzureMonitorTwice()
26+
{
27+
var serviceCollection = new ServiceCollection();
28+
29+
serviceCollection.AddOpenTelemetry()
30+
.UseAzureMonitor()
31+
.UseAzureMonitor();
32+
33+
var serviceProvider = serviceCollection.BuildServiceProvider();
34+
35+
await Assert.ThrowsAsync<NotSupportedException>(async () => await StartHostedServicesAsync(serviceProvider));
36+
}
37+
38+
[Fact]
39+
public async Task VerifyCannotCallUseAzureMonitorExporterTwice()
40+
{
41+
var serviceCollection = new ServiceCollection();
42+
43+
serviceCollection.AddOpenTelemetry()
44+
.UseAzureMonitorExporter()
45+
.UseAzureMonitorExporter();
46+
47+
var serviceProvider = serviceCollection.BuildServiceProvider();
48+
49+
await Assert.ThrowsAsync<NotSupportedException>(async () => await StartHostedServicesAsync(serviceProvider));
50+
}
51+
52+
[Fact]
53+
public async Task VerifyCannotCallUseAzureMonitorExporterAndUseAzureMonitor()
54+
{
55+
var serviceCollection = new ServiceCollection();
56+
var openTelemetryBuilder = serviceCollection.AddOpenTelemetry();
57+
58+
openTelemetryBuilder.UseAzureMonitor();
59+
openTelemetryBuilder.UseAzureMonitorExporter();
60+
61+
using var serviceProvider = serviceCollection.BuildServiceProvider();
62+
63+
await Assert.ThrowsAsync<NotSupportedException>(async () => await StartHostedServicesAsync(serviceProvider));
64+
}
65+
66+
[Fact]
67+
public async Task VerifyCanCallAddAzureMonitorTraceExporterTwice()
68+
{
69+
var serviceCollection = new ServiceCollection();
70+
serviceCollection.AddOpenTelemetry()
71+
.WithTracing(builder => builder
72+
.AddAzureMonitorTraceExporter(x => x.ConnectionString = TestConnectionString)
73+
.AddAzureMonitorTraceExporter(x => x.ConnectionString = TestConnectionString2));
74+
75+
using var serviceProvider = serviceCollection.BuildServiceProvider();
76+
await StartHostedServicesAsync(serviceProvider);
77+
}
78+
79+
[Fact]
80+
public async Task VerifyCannotAddMonitorTraceExporterAndUseAzureMonitor()
81+
{
82+
var serviceCollection = new ServiceCollection();
83+
serviceCollection.AddOpenTelemetry()
84+
.WithTracing(builder => builder
85+
.AddAzureMonitorTraceExporter(x => x.ConnectionString = TestConnectionString))
86+
.UseAzureMonitor(x => x.ConnectionString = TestConnectionString2);
87+
88+
using var serviceProvider = serviceCollection.BuildServiceProvider();
89+
await Assert.ThrowsAsync<NotSupportedException>(async () => await StartHostedServicesAsync(serviceProvider));
90+
}
91+
92+
[Fact]
93+
public async Task VerifyCannotAddMonitorTraceExporterAndUseAzureMonitorExporter()
94+
{
95+
var serviceCollection = new ServiceCollection();
96+
serviceCollection.AddOpenTelemetry()
97+
.WithTracing(builder => builder
98+
.AddAzureMonitorTraceExporter(x => x.ConnectionString = TestConnectionString))
99+
.UseAzureMonitorExporter(x => x.ConnectionString = TestConnectionString2);
100+
101+
using var serviceProvider = serviceCollection.BuildServiceProvider();
102+
await Assert.ThrowsAsync<NotSupportedException>(async () => await StartHostedServicesAsync(serviceProvider));
103+
}
104+
105+
[Theory]
106+
[InlineData(true)]
107+
[InlineData(false)]
108+
public async Task VerifyUseAzureMonitor(bool enableLiveMetrics)
109+
{
110+
var serviceCollection = new ServiceCollection();
111+
serviceCollection.AddOpenTelemetry()
112+
.UseAzureMonitor(options => {
113+
options.ConnectionString = TestConnectionString;
114+
options.EnableLiveMetrics = enableLiveMetrics;
115+
});
116+
117+
using var serviceProvider = serviceCollection.BuildServiceProvider();
118+
await StartHostedServicesAsync(serviceProvider);
119+
120+
var tracerProvider = serviceProvider.GetRequiredService<TracerProvider>();
121+
EvaluateTraceProvider.Evaluate(
122+
tracerProvider: tracerProvider,
123+
expectedAzureMonitorTraceExporter: true,
124+
expectedLiveMetricsProcessor: enableLiveMetrics,
125+
expectedProfilingSessionTraceProcessor: true,
126+
expectedStandardMetricsExtractionProcessor: true);
127+
}
128+
129+
[Theory]
130+
[InlineData(true)]
131+
[InlineData(false)]
132+
public async Task VerifyUseAzureMonitorExporter(bool enableLiveMetrics)
133+
{
134+
var serviceCollection = new ServiceCollection();
135+
serviceCollection.AddOpenTelemetry()
136+
.UseAzureMonitorExporter(options => {
137+
options.ConnectionString = TestConnectionString;
138+
options.EnableLiveMetrics = enableLiveMetrics;
139+
});
140+
141+
using var serviceProvider = serviceCollection.BuildServiceProvider();
142+
await StartHostedServicesAsync(serviceProvider);
143+
144+
var tracerProvider = serviceProvider.GetRequiredService<TracerProvider>();
145+
EvaluateTraceProvider.Evaluate(
146+
tracerProvider: tracerProvider,
147+
expectedAzureMonitorTraceExporter: true,
148+
expectedLiveMetricsProcessor: enableLiveMetrics,
149+
expectedProfilingSessionTraceProcessor: false,
150+
expectedStandardMetricsExtractionProcessor: true);
151+
}
152+
153+
private static async Task StartHostedServicesAsync(ServiceProvider serviceProvider)
154+
{
155+
var hostedServices = serviceProvider.GetServices<IHostedService>();
156+
foreach (var hostedService in hostedServices)
157+
{
158+
await hostedService.StartAsync(CancellationToken.None);
159+
}
160+
}
161+
162+
private class EvaluateTraceProvider()
163+
{
164+
private class Variables
165+
{
166+
public bool foundProfilingSessionTraceProcessor;
167+
public bool foundAzureMonitorTraceExporter;
168+
public bool foundLiveMetricsProcessor;
169+
public bool foundStandardMetricsExtractionProcessor;
170+
}
171+
172+
public static void Evaluate(TracerProvider tracerProvider, bool expectedAzureMonitorTraceExporter, bool expectedLiveMetricsProcessor, bool expectedProfilingSessionTraceProcessor, bool expectedStandardMetricsExtractionProcessor)
173+
{
174+
Assert.NotNull(tracerProvider);
175+
176+
// Get TracerProviderSdk
177+
var tracerProviderSdkType = tracerProvider.GetType();
178+
var processorProperty = tracerProviderSdkType.GetProperty("Processor", BindingFlags.NonPublic | BindingFlags.Instance);
179+
Assert.NotNull(processorProperty);
180+
181+
var processor = processorProperty.GetValue(tracerProvider);
182+
Assert.NotNull(processor);
183+
184+
var variables = new Variables();
185+
186+
// Start walking the CompositeProcessor
187+
WalkCompositeProcessor(processor, variables);
188+
189+
// Final assertions
190+
Assert.Equal(expectedLiveMetricsProcessor, variables.foundLiveMetricsProcessor);
191+
Assert.Equal(expectedStandardMetricsExtractionProcessor, variables.foundStandardMetricsExtractionProcessor);
192+
Assert.Equal(expectedAzureMonitorTraceExporter, variables.foundAzureMonitorTraceExporter);
193+
Assert.Equal(expectedProfilingSessionTraceProcessor, variables.foundProfilingSessionTraceProcessor);
194+
}
195+
196+
private static void WalkCompositeProcessor(object compositeProcessor, Variables variables)
197+
{
198+
var compositeProcessorType = compositeProcessor.GetType();
199+
200+
var headField = compositeProcessorType.GetField("Head", BindingFlags.NonPublic | BindingFlags.Instance);
201+
Assert.NotNull(headField);
202+
203+
var currentNode = headField.GetValue(compositeProcessor);
204+
Assert.NotNull(currentNode);
205+
206+
var nodeType = currentNode.GetType();
207+
var valueField = nodeType.GetField("Value", BindingFlags.Public | BindingFlags.Instance);
208+
var nextProperty = nodeType.GetProperty("Next", BindingFlags.Public | BindingFlags.Instance);
209+
210+
while (currentNode != null)
211+
{
212+
var processorValue = valueField!.GetValue(currentNode);
213+
if (processorValue != null)
214+
{
215+
var processorType = processorValue.GetType();
216+
217+
if (processorType.Name.Contains(nameof(Internals.Profiling.ProfilingSessionTraceProcessor)))
218+
{
219+
variables.foundProfilingSessionTraceProcessor = true;
220+
}
221+
else if (processorType.Name.Contains(nameof(LiveMetrics.LiveMetricsActivityProcessor)))
222+
{
223+
variables.foundLiveMetricsProcessor = true;
224+
}
225+
else if (processorType.Name.Contains(nameof(Exporter.Internals.StandardMetricsExtractionProcessor)))
226+
{
227+
variables.foundStandardMetricsExtractionProcessor = true;
228+
}
229+
else if (processorType.Name.Contains("BatchActivityExportProcessor"))
230+
{
231+
var exporterField = processorType.GetField("exporter", BindingFlags.NonPublic | BindingFlags.Instance);
232+
Assert.NotNull(exporterField);
233+
234+
var exporter = exporterField.GetValue(processorValue);
235+
Assert.NotNull(exporter);
236+
237+
if (exporter is AzureMonitorTraceExporter)
238+
{
239+
variables.foundAzureMonitorTraceExporter = true;
240+
}
241+
}
242+
else if (processorType.Name.Contains("CompositeProcessor"))
243+
{
244+
// Recursive step: walk inner CompositeProcessor
245+
WalkCompositeProcessor(processorValue, variables);
246+
}
247+
}
248+
249+
currentNode = nextProperty!.GetValue(currentNode);
250+
}
251+
}
252+
}
253+
}
254+
}

0 commit comments

Comments
 (0)