Skip to content

Commit

Permalink
handle null status code (Azure#36547)
Browse files Browse the repository at this point in the history
  • Loading branch information
vishweshbankwar authored May 30, 2023
1 parent 6d2569b commit fd2f9cb
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ private void ReportRequestDurationMetric(Activity activity, string statusCodeAtt
}

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

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

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

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

TagList tags = default;
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.DependencyTargetKey, dependencyTarget));
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.DependencyResultCodeKey, statusCode));
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.DependencyResultCodeKey, statusCode ?? "0"));
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.MetricIdKey, StandardMetricConstants.DependencyDurationMetricIdValue));
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.IsAutoCollectedKey, "True"));
tags.Add(new KeyValuePair<string, object?>(StandardMetricConstants.CloudRoleInstanceKey, StandardMetricResource?.RoleInstance));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ public void ValidateRequestDurationMetric()

standardMetricCustomProcessor._meterProvider?.ForceFlush();

// Standard Metrics + Resource Metrics.
Assert.Single(metricTelemetryItems);

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

standardMetricCustomProcessor._meterProvider?.ForceFlush();

// Standard Metrics + Resource Metrics.
Assert.Single(metricTelemetryItems);

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

[Theory]
[InlineData(ActivityKind.Server)]
[InlineData(ActivityKind.Client)]
public void ValidateNullStatusCode(ActivityKind kind)
{
var activitySource = new ActivitySource(nameof(StandardMetricTests.ValidateNullStatusCode));
var traceTelemetryItems = new List<TelemetryItem>();
var metricTelemetryItems = new List<TelemetryItem>();

var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetSampler(new AlwaysOnSampler())
.AddSource(nameof(StandardMetricTests.ValidateNullStatusCode))
.AddProcessor(standardMetricCustomProcessor)
.AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(traceTelemetryItems))))
.Build();

using (var activity = activitySource.StartActivity("Test", kind))
{
activity?.SetTag(SemanticConventions.AttributeHttpMethod, "Get");
activity?.SetTag(SemanticConventions.AttributeHttpUrl, "https://www.foo.com");
}

tracerProvider?.ForceFlush();

WaitForActivityExport(traceTelemetryItems);

standardMetricCustomProcessor._meterProvider?.ForceFlush();

// Standard Metrics + Resource Metrics.
Assert.Single(metricTelemetryItems);
var metricTelemetry = metricTelemetryItems.Last()!;
Assert.Equal("MetricData", metricTelemetry.Data.BaseType);
var metricData = (MetricsData)metricTelemetry.Data.BaseData;

if (kind == ActivityKind.Client)
{
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.DependencyResultCodeKey, out var resultCode));
Assert.Equal("0", resultCode);
}
else
{
Assert.True(metricData.Properties.TryGetValue(StandardMetricConstants.RequestResultCodeKey, out var resultCode));
Assert.Equal("0", resultCode);
}
}

private void WaitForActivityExport(List<TelemetryItem> traceTelemetryItems)
{
var result = SpinWait.SpinUntil(
Expand Down

0 comments on commit fd2f9cb

Please sign in to comment.