Skip to content

Commit c120e65

Browse files
Add separate meterprovider for standard metrics (#36369)
* Add separate meterprovider for standard metrics * assert cloud role name value * remove unnecessary using
1 parent 8a0a766 commit c120e65

File tree

4 files changed

+27
-23
lines changed

4 files changed

+27
-23
lines changed

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
using System;
55
using Azure.Core;
6-
using Azure.Monitor.OpenTelemetry.Exporter.Internals;
76
using Microsoft.Extensions.DependencyInjection;
87
using Microsoft.Extensions.Options;
98
using OpenTelemetry.Metrics;
@@ -47,8 +46,6 @@ public static MeterProviderBuilder AddAzureMonitorMetricExporter(
4746
builder.ConfigureServices(services => services.Configure(finalOptionsName, configure));
4847
}
4948

50-
builder.AddMeter(StandardMetricConstants.StandardMetricMeterName);
51-
5249
return builder.AddReader(sp =>
5350
{
5451
var exporterOptions = sp.GetRequiredService<IOptionsMonitor<AzureMonitorExporterOptions>>().Get(finalOptionsName);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public static TracerProviderBuilder AddAzureMonitorTraceExporter(
7272

7373
return new CompositeProcessor<Activity>(new BaseProcessor<Activity>[]
7474
{
75-
new StandardMetricsExtractionProcessor(),
75+
new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(exporterOptions)),
7676
new BatchActivityExportProcessor(new AzureMonitorTraceExporter(exporterOptions))
7777
});
7878
});

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/StandardMetricsExtractionProcessor.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77
using System.Diagnostics.Metrics;
88
using Azure.Monitor.OpenTelemetry.Exporter.Models;
99
using OpenTelemetry;
10+
using OpenTelemetry.Metrics;
1011

1112
namespace Azure.Monitor.OpenTelemetry.Exporter.Internals
1213
{
1314
internal class StandardMetricsExtractionProcessor : BaseProcessor<Activity>
1415
{
1516
private bool _disposed;
1617
private AzureMonitorResource? _resource;
18+
internal readonly MeterProvider? _meterProvider;
1719
private readonly Meter _meter;
1820
private readonly Histogram<double> _requestDuration;
1921
private readonly Histogram<double> _dependencyDuration;
@@ -26,8 +28,13 @@ internal class StandardMetricsExtractionProcessor : BaseProcessor<Activity>
2628

2729
internal AzureMonitorResource? StandardMetricResource => _resource ??= ParentProvider?.GetResource().CreateAzureMonitorResource();
2830

29-
internal StandardMetricsExtractionProcessor()
31+
internal StandardMetricsExtractionProcessor(AzureMonitorMetricExporter metricExporter)
3032
{
33+
_meterProvider = Sdk.CreateMeterProviderBuilder()
34+
.AddMeter(StandardMetricConstants.StandardMetricMeterName)
35+
.AddReader(new PeriodicExportingMetricReader(metricExporter)
36+
{ TemporalityPreference = MetricReaderTemporalityPreference.Delta })
37+
.Build();
3138
_meter = new Meter(StandardMetricConstants.StandardMetricMeterName);
3239
_requestDuration = _meter.CreateHistogram<double>(StandardMetricConstants.RequestDurationInstrumentName);
3340
_dependencyDuration = _meter.CreateHistogram<double>(StandardMetricConstants.DependencyDurationInstrumentName);
@@ -111,6 +118,7 @@ protected override void Dispose(bool disposing)
111118
{
112119
try
113120
{
121+
_meterProvider?.Dispose();
114122
_meter?.Dispose();
115123
}
116124
catch (Exception)

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

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Diagnostics;
77
using System.Linq;
88
using System.Threading;
9+
using OpenTelemetry.Resources;
910
using Azure.Monitor.OpenTelemetry.Exporter.Internals;
1011
using Azure.Monitor.OpenTelemetry.Exporter.Models;
1112
using Azure.Monitor.OpenTelemetry.Exporter.Tests.CommonTestFramework;
@@ -25,21 +26,19 @@ public void ValidateRequestDurationMetric()
2526
var traceTelemetryItems = new List<TelemetryItem>();
2627
var metricTelemetryItems = new List<TelemetryItem>();
2728

28-
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor();
29+
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
30+
31+
var traceServiceName = new KeyValuePair<string, object>("service.name", "trace.service");
32+
var resourceAttributes = new KeyValuePair<string, object>[] { traceServiceName };
2933

3034
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
3135
.SetSampler(new AlwaysOnSampler())
36+
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes))
3237
.AddSource(nameof(StandardMetricTests.ValidateRequestDurationMetric))
3338
.AddProcessor(standardMetricCustomProcessor)
3439
.AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(traceTelemetryItems))))
3540
.Build();
3641

37-
using var meterProvider = Sdk.CreateMeterProviderBuilder()
38-
.AddMeter(StandardMetricConstants.StandardMetricMeterName)
39-
.AddReader(new PeriodicExportingMetricReader(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)))
40-
{ TemporalityPreference = MetricReaderTemporalityPreference.Delta })
41-
.Build();
42-
4342
using (var activity = activitySource.StartActivity("Test", ActivityKind.Server))
4443
{
4544
activity?.SetTag(SemanticConventions.AttributeHttpStatusCode, 200);
@@ -49,7 +48,7 @@ public void ValidateRequestDurationMetric()
4948

5049
WaitForActivityExport(traceTelemetryItems);
5150

52-
meterProvider?.ForceFlush();
51+
standardMetricCustomProcessor._meterProvider?.ForceFlush();
5352

5453
// Standard Metrics + Resource Metrics.
5554
Assert.Single(metricTelemetryItems);
@@ -64,7 +63,8 @@ public void ValidateRequestDurationMetric()
6463
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.IsAutoCollectedKey, out var isAutoCollectedFlag));
6564
Assert.Equal("True", isAutoCollectedFlag);
6665
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.CloudRoleInstanceKey, out _));
67-
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.CloudRoleNameKey, out _));
66+
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.CloudRoleNameKey, out var cloudRoleName));
67+
Assert.Equal("trace.service", cloudRoleName);
6868
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.MetricIdKey, out var metricId));
6969
Assert.Equal(StandardMetricConstants.RequestDurationMetricIdValue, metricId);
7070
}
@@ -76,21 +76,19 @@ public void ValidateDependencyDurationMetric()
7676
var traceTelemetryItems = new List<TelemetryItem>();
7777
var metricTelemetryItems = new List<TelemetryItem>();
7878

79-
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor();
79+
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
80+
81+
var traceServiceName = new KeyValuePair<string, object>("service.name", "trace.service");
82+
var resourceAttributes = new KeyValuePair<string, object>[] { traceServiceName };
8083

8184
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
8285
.SetSampler(new AlwaysOnSampler())
86+
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes))
8387
.AddSource(nameof(StandardMetricTests.ValidateDependencyDurationMetric))
8488
.AddProcessor(standardMetricCustomProcessor)
8589
.AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(traceTelemetryItems))))
8690
.Build();
8791

88-
using var meterProvider = Sdk.CreateMeterProviderBuilder()
89-
.AddMeter(StandardMetricConstants.StandardMetricMeterName)
90-
.AddReader(new PeriodicExportingMetricReader(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)))
91-
{ TemporalityPreference = MetricReaderTemporalityPreference.Delta })
92-
.Build();
93-
9492
using (var activity = activitySource.StartActivity("Test", ActivityKind.Client))
9593
{
9694
activity?.SetTag(SemanticConventions.AttributeHttpStatusCode, 200);
@@ -102,7 +100,7 @@ public void ValidateDependencyDurationMetric()
102100

103101
WaitForActivityExport(traceTelemetryItems);
104102

105-
meterProvider?.ForceFlush();
103+
standardMetricCustomProcessor._meterProvider?.ForceFlush();
106104

107105
// Standard Metrics + Resource Metrics.
108106
Assert.Single(metricTelemetryItems);
@@ -117,7 +115,8 @@ public void ValidateDependencyDurationMetric()
117115
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.IsAutoCollectedKey, out var isAutoCollectedFlag));
118116
Assert.Equal("True", isAutoCollectedFlag);
119117
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.CloudRoleInstanceKey, out _));
120-
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.CloudRoleNameKey, out _));
118+
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.CloudRoleNameKey, out var cloudRoleName));
119+
Assert.Equal("trace.service", cloudRoleName);
121120
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.MetricIdKey, out var metricId));
122121
Assert.Equal(StandardMetricConstants.DependencyDurationMetricIdValue, metricId);
123122
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.DependencyTypeKey, out var dependencyType));

0 commit comments

Comments
 (0)