Skip to content

Commit 37309d3

Browse files
Azure Monitor Exporter - Exporter refactor (Azure#27524)
* Refactor * condition change * Integration test changes * Move ikey read to ctor
1 parent ebc250a commit 37309d3

File tree

10 files changed

+53
-75
lines changed

10 files changed

+53
-75
lines changed

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorLogExporter.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,17 @@ namespace Azure.Monitor.OpenTelemetry.Exporter
1414
internal class AzureMonitorLogExporter : BaseExporter<LogRecord>
1515
{
1616
private readonly ITransmitter _transmitter;
17-
private readonly AzureMonitorExporterOptions _options;
1817
private readonly string _instrumentationKey;
1918
private readonly ResourceParser _resourceParser;
2019

21-
public AzureMonitorLogExporter(AzureMonitorExporterOptions options) : this(options, new AzureMonitorTransmitter(options))
20+
public AzureMonitorLogExporter(AzureMonitorExporterOptions options) : this(new AzureMonitorTransmitter(options))
2221
{
2322
}
2423

25-
internal AzureMonitorLogExporter(AzureMonitorExporterOptions options, ITransmitter transmitter)
24+
internal AzureMonitorLogExporter(ITransmitter transmitter)
2625
{
27-
_options = options ?? throw new ArgumentNullException(nameof(options));
28-
ConnectionString.ConnectionStringParser.GetValues(_options.ConnectionString, out _instrumentationKey, out _);
2926
_transmitter = transmitter;
27+
_instrumentationKey = transmitter.InstrumentationKey;
3028
_resourceParser = new ResourceParser();
3129
}
3230

@@ -38,8 +36,12 @@ public override ExportResult Export(in Batch<LogRecord> batch)
3836

3937
try
4038
{
41-
var resource = ParentProvider.GetResource();
42-
_resourceParser.UpdateRoleNameAndInstance(resource);
39+
if (_resourceParser.RoleName is null && _resourceParser.RoleInstance is null)
40+
{
41+
var resource = ParentProvider.GetResource();
42+
_resourceParser.UpdateRoleNameAndInstance(resource);
43+
}
44+
4345
var telemetryItems = LogsHelper.OtelToAzureMonitorLogs(batch, _resourceParser.RoleName, _resourceParser.RoleInstance, _instrumentationKey);
4446

4547
// TODO: Handle return value, it can be converted as metrics.

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorMetricExporter.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,17 @@ namespace Azure.Monitor.OpenTelemetry.Exporter
1515
internal class AzureMonitorMetricExporter : BaseExporter<Metric>
1616
{
1717
private readonly ITransmitter _transmitter;
18-
private readonly AzureMonitorExporterOptions _options;
1918
private readonly string _instrumentationKey;
2019
private readonly ResourceParser _resourceParser;
2120

22-
public AzureMonitorMetricExporter(AzureMonitorExporterOptions options) : this(options, new AzureMonitorTransmitter(options))
21+
public AzureMonitorMetricExporter(AzureMonitorExporterOptions options) : this(new AzureMonitorTransmitter(options))
2322
{
2423
}
2524

26-
internal AzureMonitorMetricExporter(AzureMonitorExporterOptions options, ITransmitter transmitter)
25+
internal AzureMonitorMetricExporter(ITransmitter transmitter)
2726
{
28-
_options = options ?? throw new ArgumentNullException(nameof(options));
29-
ConnectionString.ConnectionStringParser.GetValues(_options.ConnectionString, out _instrumentationKey, out _);
3027
_transmitter = transmitter;
28+
_instrumentationKey = transmitter.InstrumentationKey;
3129
_resourceParser = new ResourceParser();
3230
}
3331

@@ -39,8 +37,12 @@ public override ExportResult Export(in Batch<Metric> batch)
3937

4038
try
4139
{
42-
var resource = ParentProvider.GetResource();
43-
_resourceParser.UpdateRoleNameAndInstance(resource);
40+
if (_resourceParser.RoleName is null && _resourceParser.RoleInstance is null)
41+
{
42+
var resource = ParentProvider.GetResource();
43+
_resourceParser.UpdateRoleNameAndInstance(resource);
44+
}
45+
4446
var telemetryItems = MetricHelper.OtelToAzureMonitorMetrics(batch, _resourceParser.RoleName, _resourceParser.RoleInstance, _instrumentationKey);
4547

4648
// TODO: Handle return value, it can be converted as metrics.

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorTraceExporter.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,20 @@ namespace Azure.Monitor.OpenTelemetry.Exporter
1414
public class AzureMonitorTraceExporter : BaseExporter<Activity>
1515
{
1616
private readonly ITransmitter _transmitter;
17-
private readonly AzureMonitorExporterOptions _options;
1817
private readonly string _instrumentationKey;
1918
private readonly ResourceParser _resourceParser;
2019
private readonly StorageTransmissionEvaluator _storageTransmissionEvaluator;
2120
private readonly Stopwatch _stopwatch;
2221
private const int StorageTransmissionEvaluatorSampleSize = 10;
2322

24-
public AzureMonitorTraceExporter(AzureMonitorExporterOptions options) : this(options, new AzureMonitorTransmitter(options))
23+
public AzureMonitorTraceExporter(AzureMonitorExporterOptions options) : this(new AzureMonitorTransmitter(options))
2524
{
2625
}
2726

28-
internal AzureMonitorTraceExporter(AzureMonitorExporterOptions options, ITransmitter transmitter)
27+
internal AzureMonitorTraceExporter(ITransmitter transmitter)
2928
{
30-
_options = options ?? throw new ArgumentNullException(nameof(options));
31-
ConnectionString.ConnectionStringParser.GetValues(_options.ConnectionString, out _instrumentationKey, out _);
3229
_transmitter = transmitter;
30+
_instrumentationKey = transmitter.InstrumentationKey;
3331
_resourceParser = new ResourceParser();
3432

3533
// Todo: Add check if offline storage is enabled by user via options
@@ -52,8 +50,12 @@ public override ExportResult Export(in Batch<Activity> batch)
5250

5351
try
5452
{
55-
var resource = ParentProvider.GetResource();
56-
_resourceParser.UpdateRoleNameAndInstance(resource);
53+
if (_resourceParser.RoleName is null && _resourceParser.RoleInstance is null)
54+
{
55+
var resource = ParentProvider.GetResource();
56+
_resourceParser.UpdateRoleNameAndInstance(resource);
57+
}
58+
5759
var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, _resourceParser.RoleName, _resourceParser.RoleInstance, _instrumentationKey);
5860

5961
// TODO: Handle return value, it can be converted as metrics.

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorTransmitter.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88

99
using Azure.Core;
1010
using Azure.Core.Pipeline;
11-
12-
using Azure.Monitor.OpenTelemetry.Exporter.ConnectionString;
1311
using Azure.Monitor.OpenTelemetry.Exporter.Models;
1412
using OpenTelemetry;
1513
using OpenTelemetry.Contrib.Extensions.PersistentStorage;
@@ -23,9 +21,19 @@ internal class AzureMonitorTransmitter : ITransmitter
2321
{
2422
private readonly ApplicationInsightsRestClient _applicationInsightsRestClient;
2523
internal IPersistentStorage _storage;
24+
private readonly string _instrumentationKey;
2625

2726
public AzureMonitorTransmitter(AzureMonitorExporterOptions options)
2827
{
28+
if (options == null)
29+
{
30+
throw new ArgumentNullException(nameof(options));
31+
}
32+
33+
options.Retry.MaxRetries = 0;
34+
ConnectionString.ConnectionStringParser.GetValues(options.ConnectionString, out _instrumentationKey, out string ingestionEndpoint);
35+
_applicationInsightsRestClient = new ApplicationInsightsRestClient(new ClientDiagnostics(options), HttpPipelineBuilder.Build(options), host: ingestionEndpoint);
36+
2937
try
3038
{
3139
_storage = new FileStorage(options.StorageDirectory);
@@ -38,10 +46,14 @@ public AzureMonitorTransmitter(AzureMonitorExporterOptions options)
3846
// So if someone opts in for storage and we cannot initialize, we can throw.
3947
// Change needed on persistent storage side to throw if not able to create storage directory.
4048
}
41-
ConnectionStringParser.GetValues(options.ConnectionString, out _, out string ingestionEndpoint);
42-
options.Retry.MaxRetries = 0;
49+
}
4350

44-
_applicationInsightsRestClient = new ApplicationInsightsRestClient(new ClientDiagnostics(options), HttpPipelineBuilder.Build(options), host: ingestionEndpoint);
51+
public string InstrumentationKey
52+
{
53+
get
54+
{
55+
return _instrumentationKey;
56+
}
4557
}
4658

4759
public async ValueTask<ExportResult> TrackAsync(IEnumerable<TelemetryItem> telemetryItems, bool async, CancellationToken cancellationToken)
@@ -172,7 +184,7 @@ private ExportResult HandleFailures(HttpMessage httpMessage)
172184
case ResponseStatusCodes.GatewayTimeout:
173185
// Send Messages To Storage
174186
content = HttpPipelineHelper.GetRequestContent(httpMessage.Request.Content);
175-
result =_storage.SaveTelemetry(content, HttpPipelineHelper.MinimumRetryInterval);
187+
result = _storage.SaveTelemetry(content, HttpPipelineHelper.MinimumRetryInterval);
176188
break;
177189
default:
178190
// Log Non-Retriable Status and don't retry or store;

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/ITransmitter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ internal interface ITransmitter
1717
/// </summary>
1818
ValueTask<ExportResult> TrackAsync(IEnumerable<TelemetryItem> telemetryItems, bool async, CancellationToken cancellationToken);
1919
ValueTask TransmitFromStorage(long maxFileToTransmit, bool aysnc, CancellationToken cancellationToken);
20+
string InstrumentationKey { get; }
2021
}
2122
}

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/ResourceParser.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ internal class ResourceParser
1515

1616
internal void UpdateRoleNameAndInstance(Resource resource)
1717
{
18-
if (RoleName != null || RoleInstance != null)
19-
{
20-
return;
21-
}
22-
2318
if (resource == null)
2419
{
2520
return;

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/ResourceParserTests.cs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,6 @@ public void DefaultResource()
3131
Assert.Equal(Dns.GetHostName(), resourceParser.RoleInstance);
3232
}
3333

34-
[Fact]
35-
public void RoleNameAndInstanceIsAssignedOnce()
36-
{
37-
var resource1 = CreateTestResource(serviceName: "my-service1", serviceInstance: "my-instance1");
38-
var resource2 = CreateTestResource(serviceName: "my-service2", serviceInstance: "my-instance2");
39-
40-
var resourceParser = new ResourceParser();
41-
resourceParser.UpdateRoleNameAndInstance(resource1);
42-
resourceParser.UpdateRoleNameAndInstance(resource2);
43-
44-
Assert.Equal("my-service1", resourceParser.RoleName);
45-
Assert.Equal("my-instance1", resourceParser.RoleInstance);
46-
}
47-
4834
[Fact]
4935
public void ServiceNameFromResource()
5036
{

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

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,7 @@ private TelemetryItem RunActivityTest(Action<ActivitySource> testScenario)
9898
using var activitySource = new ActivitySource(ActivitySourceName);
9999

100100
var mockTransmitter = new MockTransmitter();
101-
var processor = new BatchActivityExportProcessor(new AzureMonitorTraceExporter(
102-
options: new AzureMonitorExporterOptions
103-
{
104-
ConnectionString = EmptyConnectionString,
105-
},
106-
transmitter: mockTransmitter));
101+
var processor = new BatchActivityExportProcessor(new AzureMonitorTraceExporter(mockTransmitter));
107102

108103
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
109104
.SetSampler(new AlwaysOnSampler())
@@ -125,12 +120,7 @@ private TelemetryItem RunLoggerTest(Action<ILogger<TelemetryItemTests>> testScen
125120
{
126121
// SETUP
127122
var mockTransmitter = new MockTransmitter();
128-
var processor = new BatchLogRecordExportProcessor(new AzureMonitorLogExporter(
129-
options: new AzureMonitorExporterOptions
130-
{
131-
ConnectionString = EmptyConnectionString,
132-
},
133-
transmitter: mockTransmitter));
123+
var processor = new BatchLogRecordExportProcessor(new AzureMonitorLogExporter(mockTransmitter));
134124

135125
var serviceCollection = new ServiceCollection().AddLogging(builder =>
136126
{
@@ -166,18 +156,9 @@ public void VerifyLoggerWithActivity()
166156

167157
var mockTransmitter = new MockTransmitter();
168158

169-
var azureMonitorExporterOptions = new AzureMonitorExporterOptions
170-
{
171-
ConnectionString = EmptyConnectionString,
172-
};
173-
174-
var processor1 = new BatchActivityExportProcessor(new AzureMonitorTraceExporter(
175-
options: azureMonitorExporterOptions,
176-
transmitter: mockTransmitter));
159+
var processor1 = new BatchActivityExportProcessor(new AzureMonitorTraceExporter(mockTransmitter));
177160

178-
var processor2 = new BatchLogRecordExportProcessor(new AzureMonitorLogExporter(
179-
options: azureMonitorExporterOptions,
180-
transmitter: mockTransmitter));
161+
var processor2 = new BatchLogRecordExportProcessor(new AzureMonitorLogExporter(mockTransmitter));
181162

182163
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
183164
.SetSampler(new AlwaysOnSampler())

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ internal class MockTransmitter : ITransmitter
1616
{
1717
public ConcurrentBag<TelemetryItem> TelemetryItems = new ConcurrentBag<TelemetryItem>();
1818

19+
public string InstrumentationKey => "00000000-0000-0000-0000-000000000000";
20+
1921
public ValueTask<ExportResult> TrackAsync(IEnumerable<TelemetryItem> telemetryItems, bool async, CancellationToken cancellationToken)
2022
{
2123
foreach (var telemetryItem in telemetryItems)

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,7 @@ public class OpenTelemetryWebApplicationFactory<TStartup> : WebApplicationFactor
3030

3131
protected override void ConfigureWebHost(IWebHostBuilder builder)
3232
{
33-
this.ActivityProcessor = new BatchActivityExportProcessor(new AzureMonitorTraceExporter(
34-
options: new AzureMonitorExporterOptions
35-
{
36-
ConnectionString = EmptyConnectionString,
37-
},
38-
transmitter: this.Transmitter));
33+
this.ActivityProcessor = new BatchActivityExportProcessor(new AzureMonitorTraceExporter(this.Transmitter));
3934

4035
builder.ConfigureServices(services => services.AddOpenTelemetryTracing((builder) => builder
4136
.AddAspNetCoreInstrumentation()

0 commit comments

Comments
 (0)