Skip to content

Commit fd2f9cb

Browse files
handle null status code (#36547)
1 parent 6d2569b commit fd2f9cb

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private void ReportRequestDurationMetric(Activity activity, string statusCodeAtt
7575
}
7676

7777
TagList tags = default;
78-
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.RequestResultCodeKey, statusCodeAttributeValue));
78+
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.RequestResultCodeKey, statusCodeAttributeValue ?? "0"));
7979
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.MetricIdKey, StandardMetricConstants.RequestDurationMetricIdValue));
8080
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.IsAutoCollectedKey, "True"));
8181
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.CloudRoleInstanceKey, StandardMetricResource?.RoleInstance));
@@ -92,13 +92,13 @@ private void ReportDependencyDurationMetric(Activity activity)
9292

9393
var dependencyTarget = activityTagsProcessor.MappedTags.GetDependencyTarget(activityTagsProcessor.activityType);
9494

95-
var statusCode = AzMonList.GetTagValue(ref activityTagsProcessor.MappedTags, SemanticConventions.AttributeHttpStatusCode);
95+
var statusCode = AzMonList.GetTagValue(ref activityTagsProcessor.MappedTags, SemanticConventions.AttributeHttpStatusCode)?.ToString();
9696

9797
var dependencyType = activityTagsProcessor.MappedTags.GetDependencyType(activityTagsProcessor.activityType);
9898

9999
TagList tags = default;
100100
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.DependencyTargetKey, dependencyTarget));
101-
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.DependencyResultCodeKey, statusCode));
101+
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.DependencyResultCodeKey, statusCode ?? "0"));
102102
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.MetricIdKey, StandardMetricConstants.DependencyDurationMetricIdValue));
103103
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.IsAutoCollectedKey, "True"));
104104
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.CloudRoleInstanceKey, StandardMetricResource?.RoleInstance));

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

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ public void ValidateRequestDurationMetric()
5050

5151
standardMetricCustomProcessor._meterProvider?.ForceFlush();
5252

53-
// Standard Metrics + Resource Metrics.
5453
Assert.Single(metricTelemetryItems);
5554

5655
var metricTelemetry = metricTelemetryItems.Last()!;
@@ -102,7 +101,6 @@ public void ValidateDependencyDurationMetric()
102101

103102
standardMetricCustomProcessor._meterProvider?.ForceFlush();
104103

105-
// Standard Metrics + Resource Metrics.
106104
Assert.Single(metricTelemetryItems);
107105

108106
var metricTelemetry = metricTelemetryItems.Last()!;
@@ -125,6 +123,54 @@ public void ValidateDependencyDurationMetric()
125123
Assert.Equal("www.foo.com", dependencyTarget);
126124
}
127125

126+
[Theory]
127+
[InlineData(ActivityKind.Server)]
128+
[InlineData(ActivityKind.Client)]
129+
public void ValidateNullStatusCode(ActivityKind kind)
130+
{
131+
var activitySource = new ActivitySource(nameof(StandardMetricTests.ValidateNullStatusCode));
132+
var traceTelemetryItems = new List<TelemetryItem>();
133+
var metricTelemetryItems = new List<TelemetryItem>();
134+
135+
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
136+
137+
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
138+
.SetSampler(new AlwaysOnSampler())
139+
.AddSource(nameof(StandardMetricTests.ValidateNullStatusCode))
140+
.AddProcessor(standardMetricCustomProcessor)
141+
.AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(traceTelemetryItems))))
142+
.Build();
143+
144+
using (var activity = activitySource.StartActivity("Test", kind))
145+
{
146+
activity?.SetTag(SemanticConventions.AttributeHttpMethod, "Get");
147+
activity?.SetTag(SemanticConventions.AttributeHttpUrl, "https://www.foo.com");
148+
}
149+
150+
tracerProvider?.ForceFlush();
151+
152+
WaitForActivityExport(traceTelemetryItems);
153+
154+
standardMetricCustomProcessor._meterProvider?.ForceFlush();
155+
156+
// Standard Metrics + Resource Metrics.
157+
Assert.Single(metricTelemetryItems);
158+
var metricTelemetry = metricTelemetryItems.Last()!;
159+
Assert.Equal("MetricData", metricTelemetry.Data.BaseType);
160+
var metricData = (MetricsData)metricTelemetry.Data.BaseData;
161+
162+
if (kind == ActivityKind.Client)
163+
{
164+
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.DependencyResultCodeKey, out var resultCode));
165+
Assert.Equal("0", resultCode);
166+
}
167+
else
168+
{
169+
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.RequestResultCodeKey, out var resultCode));
170+
Assert.Equal("0", resultCode);
171+
}
172+
}
173+
128174
private void WaitForActivityExport(List<TelemetryItem> traceTelemetryItems)
129175
{
130176
var result = SpinWait.SpinUntil(

0 commit comments

Comments
 (0)