diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorTraceExporter.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorTraceExporter.cs index 2a945180b4f9..77b20b26ccc8 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorTraceExporter.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorTraceExporter.cs @@ -15,15 +15,17 @@ internal sealed class AzureMonitorTraceExporter : BaseExporter { private readonly ITransmitter _transmitter; private readonly string _instrumentationKey; + private readonly float _sampleRate; // This value is recorded on TelemetryItem.SampleRate. private AzureMonitorResource? _resource; private bool _disposed; - public AzureMonitorTraceExporter(AzureMonitorExporterOptions options) : this(TransmitterFactory.Instance.Get(options)) + public AzureMonitorTraceExporter(AzureMonitorExporterOptions options) : this(options, TransmitterFactory.Instance.Get(options)) { } - internal AzureMonitorTraceExporter(ITransmitter transmitter) + internal AzureMonitorTraceExporter(AzureMonitorExporterOptions options, ITransmitter transmitter) { + _sampleRate = (float)Math.Round(options.SamplingRatio * 100); _transmitter = transmitter; _instrumentationKey = transmitter.InstrumentationKey; } @@ -40,7 +42,7 @@ public override ExportResult Export(in Batch batch) try { - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, TraceResource, _instrumentationKey); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, TraceResource, _instrumentationKey, _sampleRate); if (telemetryItems.Count > 0) { exportResult = _transmitter.TrackAsync(telemetryItems, TelemetryItemOrigin.AzureMonitorTraceExporter, false, CancellationToken.None).EnsureCompleted(); diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Customizations/Models/TelemetryItem.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Customizations/Models/TelemetryItem.cs index e8576a0afc11..9dfe95a3d4bc 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Customizations/Models/TelemetryItem.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Customizations/Models/TelemetryItem.cs @@ -13,7 +13,7 @@ namespace Azure.Monitor.OpenTelemetry.Exporter.Models { internal partial class TelemetryItem { - public TelemetryItem(Activity activity, ref ActivityTagsProcessor activityTagsProcessor, AzureMonitorResource? resource, string instrumentationKey) : + public TelemetryItem(Activity activity, ref ActivityTagsProcessor activityTagsProcessor, AzureMonitorResource? resource, string instrumentationKey, float sampleRate) : this(activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency", FormatUtcTimestamp(activity.StartTimeUtc)) { if (activity.ParentSpanId != default) @@ -60,7 +60,8 @@ public TelemetryItem(Activity activity, ref ActivityTagsProcessor activityTagsPr SetAuthenticatedUserId(ref activityTagsProcessor); SetResourceSdkVersionAndIkey(resource, instrumentationKey); - if (AzMonList.GetTagValue(ref activityTagsProcessor.MappedTags, "sampleRate") is float sampleRate) + + if (sampleRate != 100f) { SampleRate = sampleRate; } @@ -82,7 +83,11 @@ public TelemetryItem(string name, TelemetryItem telemetryItem, ActivitySpanId ac Tags[ContextTagKeys.AiCloudRoleInstance.ToString()] = telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()]; Tags[ContextTagKeys.AiInternalSdkVersion.ToString()] = SdkVersionUtils.s_sdkVersion; InstrumentationKey = telemetryItem.InstrumentationKey; - SampleRate = telemetryItem.SampleRate; + + if (telemetryItem.SampleRate != 100f) + { + SampleRate = telemetryItem.SampleRate; + } } public TelemetryItem (LogRecord logRecord, AzureMonitorResource? resource, string instrumentationKey) : diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/ActivityTagsProcessor.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/ActivityTagsProcessor.cs index c5b03fe4b952..807782ae4620 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/ActivityTagsProcessor.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/ActivityTagsProcessor.cs @@ -51,7 +51,6 @@ internal struct ActivityTagsProcessor SemanticConventions.AttributeNetHostName, SemanticConventions.AttributeComponent, "otel.status_code", - "sampleRate", SemanticConventions.AttributeRpcService, // required - RPC diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/ApplicationInsightsSampler.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/ApplicationInsightsSampler.cs index 29dfe6d5519c..971ff0e3eca6 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/ApplicationInsightsSampler.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/ApplicationInsightsSampler.cs @@ -14,7 +14,7 @@ namespace Azure.Monitor.OpenTelemetry.Exporter.Internals; internal sealed class ApplicationInsightsSampler : Sampler { private static readonly SamplingResult RecordOnlySamplingResult = new(SamplingDecision.RecordOnly); - private readonly SamplingResult recordAndSampleSamplingResult; + private static readonly SamplingResult RecordAndSampleSamplingResult = new(SamplingDecision.RecordAndSample); private readonly float samplingRatio; /// @@ -34,13 +34,6 @@ public ApplicationInsightsSampler(float samplingRatio) this.samplingRatio = samplingRatio; Description = "ApplicationInsightsSampler{" + samplingRatio + "}"; - var sampleRate = (float)Math.Round(samplingRatio * 100); - recordAndSampleSamplingResult = new SamplingResult( - SamplingDecision.RecordAndSample, - new Dictionary - { - { "sampleRate", sampleRate }, - }); } /// @@ -51,21 +44,21 @@ public ApplicationInsightsSampler(float samplingRatio) /// Returns whether or not we should sample telemetry in the form of a class. public override SamplingResult ShouldSample(in SamplingParameters samplingParameters) { - if (samplingRatio == 0) + if (samplingRatio == 1) { - return RecordOnlySamplingResult; + return RecordAndSampleSamplingResult; } - if (samplingRatio == 1) + if (samplingRatio == 0) { - return recordAndSampleSamplingResult; + return RecordOnlySamplingResult; } double sampleScore = DJB2SampleScore(samplingParameters.TraceId.ToHexString().ToUpperInvariant()); if (sampleScore < samplingRatio) { - return recordAndSampleSamplingResult; + return RecordAndSampleSamplingResult; } else { diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/TraceHelper.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/TraceHelper.cs index fa1ff6124378..63e92667a6cc 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/TraceHelper.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/TraceHelper.cs @@ -19,7 +19,7 @@ internal static class TraceHelper private const int Version = 2; private const int MaxlinksAllowed = 100; - internal static List OtelToAzureMonitorTrace(Batch batchActivity, AzureMonitorResource? azureMonitorResource, string instrumentationKey) + internal static List OtelToAzureMonitorTrace(Batch batchActivity, AzureMonitorResource? azureMonitorResource, string instrumentationKey, float sampleRate) { List telemetryItems = new List(); TelemetryItem telemetryItem; @@ -34,7 +34,7 @@ internal static List OtelToAzureMonitorTrace(Batch batc try { var activityTagsProcessor = EnumerateActivityTags(activity); - telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, azureMonitorResource, instrumentationKey); + telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, azureMonitorResource, instrumentationKey, sampleRate); // Check for Exceptions events if (activity.Events.Any()) diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/CommonTestFramework/AzureMonitorExporterTestExtensions.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/CommonTestFramework/AzureMonitorExporterTestExtensions.cs index 753933f338aa..5a4ad054970e 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/CommonTestFramework/AzureMonitorExporterTestExtensions.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/CommonTestFramework/AzureMonitorExporterTestExtensions.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Azure.Monitor.OpenTelemetry.Exporter.Internals; using Azure.Monitor.OpenTelemetry.Exporter.Models; using OpenTelemetry; using OpenTelemetry.Logs; @@ -69,7 +70,7 @@ internal static MeterProviderBuilder AddAzureMonitorMetricExporterForTest(this M /// /// Extension methods to simplify registering of with for unit tests. /// - internal static TracerProviderBuilder AddAzureMonitorTraceExporterForTest(this TracerProviderBuilder builder, out List telemetryItems) + internal static TracerProviderBuilder AddAzureMonitorTraceExporterForTest(this TracerProviderBuilder builder, out List telemetryItems, Action? configure = null) { if (builder == null) { @@ -78,7 +79,12 @@ internal static TracerProviderBuilder AddAzureMonitorTraceExporterForTest(this T telemetryItems = new List(); - return builder.AddProcessor(new SimpleActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(telemetryItems)))); + var options = new AzureMonitorExporterOptions(); + configure?.Invoke(options); + + builder.SetSampler(new ApplicationInsightsSampler(options.SamplingRatio)); + + return builder.AddProcessor(new SimpleActivityExportProcessor(new AzureMonitorTraceExporter(options, new MockTransmitter(telemetryItems)))); } } } diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/OfflineStorageTests.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/OfflineStorageTests.cs index 0fce6c0b87c0..4b9e21cc8293 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/OfflineStorageTests.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/OfflineStorageTests.cs @@ -298,7 +298,7 @@ private static Activity CreateActivity(string activityName) private static TelemetryItem CreateTelemetryItem(Activity activity) { var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - return new TelemetryItem(activity, ref activityTagsProcessor, null, string.Empty); + return new TelemetryItem(activity, ref activityTagsProcessor, null, string.Empty, 1.0f); } private class MockFileProvider : PersistentBlobProvider diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/SampleRateTests.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/SampleRateTests.cs index bc6378856740..9205d62eeb96 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/SampleRateTests.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/SampleRateTests.cs @@ -35,65 +35,40 @@ static SampleRateTests() [Theory] [InlineData(50.0F)] - [InlineData("somestring")] - [InlineData(null)] - [InlineData("")] - public void ValidateSampleRateForEventException(object SampleRate) + public void ValidateSampleRateForEventException(float sampleRate) { using ActivitySource activitySource = new ActivitySource(ActivitySourceName); - // Valid SampleRate. using var activity = activitySource.StartActivity( ActivityName, ActivityKind.Client, parentContext: default, - startTime: DateTime.UtcNow, - tags: new Dictionary() { ["sampleRate"] = SampleRate }); + startTime: DateTime.UtcNow); Assert.NotNull(activity); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, null, "00000000-0000-0000-0000-000000000000"); + var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, null, "00000000-0000-0000-0000-000000000000", sampleRate); var expTelemetryItem = new TelemetryItem("Exception", telemetryItem, default, default, default); - - if (SampleRate is float) - { - Assert.Equal(SampleRate, expTelemetryItem.SampleRate); - } - else - { - Assert.Null(expTelemetryItem.SampleRate); - } + Assert.Equal(sampleRate, expTelemetryItem.SampleRate); } [Theory] [InlineData(50.0F)] - [InlineData("somestring")] - [InlineData(null)] - [InlineData("")] - public void ValidateSampleRateInTelemetry(object SampleRate) + public void ValidateSampleRateInTelemetry(float sampleRate) { using ActivitySource activitySource = new ActivitySource(ActivitySourceName); - // Valid SampleRate. using var activity = activitySource.StartActivity( ActivityName, ActivityKind.Client, parentContext: default, - startTime: DateTime.UtcNow, - tags: new Dictionary() { ["sampleRate"] = SampleRate }); + startTime: DateTime.UtcNow); Assert.NotNull(activity); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, null, "00000000-0000-0000-0000-000000000000"); + var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, null, "00000000-0000-0000-0000-000000000000", sampleRate); - if (SampleRate is float) - { - Assert.Equal(SampleRate, telemetryItem.SampleRate); - } - else - { - Assert.Null(telemetryItem.SampleRate); - } + Assert.Equal(sampleRate, telemetryItem.SampleRate); } [Fact] @@ -102,8 +77,7 @@ public void SampleRateE2ETest() using var activitySource = new ActivitySource(ActivitySourceName); using var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddSource(ActivitySourceName) - .SetSampler(new ApplicationInsightsSampler(samplingRatio: 1.0F)) - .AddAzureMonitorTraceExporterForTest(out List telemetryItems) + .AddAzureMonitorTraceExporterForTest(out List telemetryItems, options => options.SamplingRatio = 1.0F) .Build(); using (var activity = activitySource.StartActivity("SayHello")) @@ -113,7 +87,7 @@ public void SampleRateE2ETest() tracerProvider?.ForceFlush(); Assert.NotEmpty(telemetryItems); - Assert.Equal(100F, telemetryItems.Last()!.SampleRate); + Assert.Null(telemetryItems.Last()!.SampleRate); } [Fact] @@ -122,8 +96,7 @@ public void NoTelemetryCreatedOnZeroSampleRate() using var activitySource = new ActivitySource(ActivitySourceName); using var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddSource(ActivitySourceName) - .SetSampler(new ApplicationInsightsSampler(samplingRatio: 0.0F)) - .AddAzureMonitorTraceExporterForTest(out List telemetryItems) + .AddAzureMonitorTraceExporterForTest(out List telemetryItems, options => options.SamplingRatio = 0.0F) .Build(); using (var activity = activitySource.StartActivity("SayHello")) diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/StandardMetricTests.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/StandardMetricTests.cs index 273c1507e068..9d4a76d77d98 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/StandardMetricTests.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/StandardMetricTests.cs @@ -36,7 +36,7 @@ public void ValidateRequestDurationMetric() .SetResourceBuilder(ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes)) .AddSource(nameof(StandardMetricTests.ValidateRequestDurationMetric)) .AddProcessor(standardMetricCustomProcessor) - .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(traceTelemetryItems)))) + .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new AzureMonitorExporterOptions(), new MockTransmitter(traceTelemetryItems)))) .Build(); using (var activity = activitySource.StartActivity("Test", ActivityKind.Server)) @@ -85,7 +85,7 @@ public void ValidateRequestDurationMetricNew() .SetResourceBuilder(ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes)) .AddSource(nameof(StandardMetricTests.ValidateRequestDurationMetric)) .AddProcessor(standardMetricCustomProcessor) - .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(traceTelemetryItems)))) + .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new AzureMonitorExporterOptions(), new MockTransmitter(traceTelemetryItems)))) .Build(); using (var activity = activitySource.StartActivity("Test", ActivityKind.Server)) @@ -134,7 +134,7 @@ public void ValidateDependencyDurationMetric() .SetResourceBuilder(ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes)) .AddSource(nameof(StandardMetricTests.ValidateDependencyDurationMetric)) .AddProcessor(standardMetricCustomProcessor) - .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(traceTelemetryItems)))) + .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new AzureMonitorExporterOptions(), new MockTransmitter(traceTelemetryItems)))) .Build(); using (var activity = activitySource.StartActivity("Test", ActivityKind.Client)) @@ -189,7 +189,7 @@ public void ValidateDependencyDurationMetricNew() .SetResourceBuilder(ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes)) .AddSource(nameof(StandardMetricTests.ValidateDependencyDurationMetric)) .AddProcessor(standardMetricCustomProcessor) - .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(traceTelemetryItems)))) + .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new AzureMonitorExporterOptions(), new MockTransmitter(traceTelemetryItems)))) .Build(); using (var activity = activitySource.StartActivity("Test", ActivityKind.Client)) @@ -242,7 +242,7 @@ public void ValidateNullStatusCode(ActivityKind kind) .SetSampler(new AlwaysOnSampler()) .AddSource(nameof(StandardMetricTests.ValidateNullStatusCode)) .AddProcessor(standardMetricCustomProcessor) - .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(traceTelemetryItems)))) + .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new AzureMonitorExporterOptions(), new MockTransmitter(traceTelemetryItems)))) .Build(); using (var activity = activitySource.StartActivity("Test", kind)) @@ -290,7 +290,7 @@ public void ValidateNullStatusCodeNew(ActivityKind kind) .SetSampler(new AlwaysOnSampler()) .AddSource(nameof(StandardMetricTests.ValidateNullStatusCode)) .AddProcessor(standardMetricCustomProcessor) - .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new MockTransmitter(traceTelemetryItems)))) + .AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(new AzureMonitorExporterOptions(), new MockTransmitter(traceTelemetryItems)))) .Build(); using (var activity = activitySource.StartActivity("Test", kind)) diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TelemetryItemTests.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TelemetryItemTests.cs index b50b22d24682..8daebf2c7478 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TelemetryItemTests.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TelemetryItemTests.cs @@ -48,7 +48,7 @@ public void ValidateTelemetryItem_DefaultActivity_DefaultResource() var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); var traceResource = resource.CreateAzureMonitorResource(); - var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, traceResource, "00000000-0000-0000-0000-000000000000"); + var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, traceResource, "00000000-0000-0000-0000-000000000000", 1.0f); Assert.Equal("RemoteDependency", telemetryItem.Name); Assert.Equal(TelemetryItem.FormatUtcTimestamp(activity.StartTimeUtc), telemetryItem.Time); @@ -75,7 +75,7 @@ public void ValidateTelemetryItem_Activity_WithResource() var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); var traceResource = resource.CreateAzureMonitorResource(); - var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, traceResource, "00000000-0000-0000-0000-000000000000"); + var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, traceResource, "00000000-0000-0000-0000-000000000000", 1.0f); Assert.Equal("RemoteDependency", telemetryItem.Name); Assert.Equal(TelemetryItem.FormatUtcTimestamp(activity.StartTimeUtc), telemetryItem.Time); @@ -101,7 +101,7 @@ public void ValidateTelemetryItem_Activity_WithParentSpanId() var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); var traceResource = resource.CreateAzureMonitorResource(); - var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, traceResource, "00000000-0000-0000-0000-000000000000"); + var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, traceResource, "00000000-0000-0000-0000-000000000000", 1.0f); Assert.Equal("RemoteDependency", telemetryItem.Name); Assert.Equal(TelemetryItem.FormatUtcTimestamp(activity.StartTimeUtc), telemetryItem.Time); @@ -143,7 +143,7 @@ public void HttpMethodAndHttpRouteIsUsedForHttpRequestOperationName(string? rout } var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey", 1.0f); var telemetryItem = telemetryItems.FirstOrDefault(); Assert.Equal(expectedOperationName, telemetryItem?.Tags[ContextTagKeys.AiOperationName.ToString()]); @@ -166,7 +166,7 @@ public void HttpMethodAndHttpUrlPathIsUsedForHttpRequestOperationName() activity.SetTag(SemanticConventions.AttributeHttpUrl, "https://www.foo.bar/path?id=1"); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey", 1.0f); var telemetryItem = telemetryItems.FirstOrDefault(); Assert.Equal("GET /path", telemetryItem?.Tags[ContextTagKeys.AiOperationName.ToString()]); @@ -187,7 +187,7 @@ public void ActivityNameIsUsedByDefaultForRequestOperationName() activity.SetTag(SemanticConventions.AttributeHttpRequestMethod, "GET"); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey", 1.0f); var telemetryItem = telemetryItems.FirstOrDefault(); Assert.Equal("displayname", telemetryItem?.Tags[ContextTagKeys.AiOperationName.ToString()]); @@ -208,7 +208,7 @@ public void AiLocationIpIsSetAsHttpClientIpForHttpServerSpans() activity.SetTag(SemanticConventions.AttributeHttpRequestMethod, "GET"); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey", 1.0f); var telemetryItem = telemetryItems.FirstOrDefault(); Assert.Equal("127.0.0.1", telemetryItem?.Tags[ContextTagKeys.AiLocationIp.ToString()]); @@ -229,7 +229,7 @@ public void AiUserAgentIsSetAsHttpUserAgent() activity.SetTag(SemanticConventions.AttributeHttpUserAgent, userAgent); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey", 1.0f); var telemetryItem = telemetryItems.FirstOrDefault(); Assert.Equal(userAgent, telemetryItem?.Tags["ai.user.userAgent"]); @@ -250,7 +250,7 @@ public void AiUserAgentIsSetAsUserAgentOriginal() activity.SetTag(SemanticConventions.AttributeUserAgentOriginal, userAgent); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, null, string.Empty); + var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, null, string.Empty, 1.0f); Assert.Equal(userAgent, telemetryItem.Tags["ai.user.userAgent"]); } @@ -268,7 +268,7 @@ public void AiLocationIpIsNotSetByDefault() Assert.NotNull(activity); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey", 1.0f); var telemetryItem = telemetryItems.FirstOrDefault(); Assert.False(telemetryItem?.Tags.TryGetValue(ContextTagKeys.AiLocationIp.ToString(),out _)); @@ -286,7 +286,7 @@ public void AiUserAgentIsNotTransmittedByDefault() Assert.NotNull(activity); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, null, string.Empty); + var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, null, string.Empty, 1.0f); Assert.False(telemetryItem.Tags.TryGetValue("ai.user.userAgent", out var userAgent)); } @@ -306,7 +306,7 @@ public void RoleInstanceIsSetToHostNameByDefault() var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); var traceResource = resource.CreateAzureMonitorResource(); - var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, traceResource, "00000000-0000-0000-0000-000000000000"); + var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, traceResource, "00000000-0000-0000-0000-000000000000", 1.0f); Assert.Equal(Dns.GetHostName(), telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()]); } @@ -326,7 +326,7 @@ public void RoleInstanceIsNotOverwrittenIfSetViaServiceInstanceId() var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); var traceResource = resource.CreateAzureMonitorResource(); - var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, traceResource, "00000000-0000-0000-0000-000000000000"); + var telemetryItem = new TelemetryItem(activity, ref activityTagsProcessor, traceResource, "00000000-0000-0000-0000-000000000000", 1.0f); Assert.Equal("serviceinstance", telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()]); } @@ -348,7 +348,7 @@ public void RequestNameMatchesOperationName() activity.SetTag(SemanticConventions.AttributeHttpRoute, "/api/test"); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey", 1.0f); var telemetryItem = telemetryItems.FirstOrDefault(); var requestData = telemetryItem?.Data.BaseData as RequestData; @@ -374,7 +374,7 @@ public void RequestNameMatchesOperationNameV2() activity.SetTag(SemanticConventions.AttributeHttpRoute, "/api/test"); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey", 1.0f); var telemetryItem = telemetryItems.FirstOrDefault(); var requestData = telemetryItem?.Data.BaseData as RequestData; @@ -399,7 +399,7 @@ public void RequestNameMatchesOperationNameForConsumerSpans() activity.SetTag(SemanticConventions.AttributeMessagingSystem, "Eventhub"); var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(new Batch(new Activity[] { activity }, 1), null, "instrumentationKey", 1.0f); var telemetryItem = telemetryItems.FirstOrDefault(); var requestData = telemetryItem?.Data.BaseData as RequestData; diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TraceHelperTests.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TraceHelperTests.cs index 5354ce6688b9..b327957579c1 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TraceHelperTests.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TraceHelperTests.cs @@ -244,7 +244,7 @@ public void ActivityWithExceptionEventCreatesExceptionTelemetry() Batch batch = new Batch(activityList, 1); var traceResource = new AzureMonitorResource(); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, traceResource, "00000000-0000-0000-0000-000000000000"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, traceResource, "00000000-0000-0000-0000-000000000000", 1.0f); Assert.Equal(2, telemetryItems.Count()); Assert.Equal("Exception", telemetryItems[0].Name); @@ -281,7 +281,7 @@ public void ActivityWithEventCreatesTraceTelemetry() Batch batch = new Batch(activityList, 1); var traceResource = new AzureMonitorResource(); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, traceResource, "00000000-0000-0000-0000-000000000000"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, traceResource, "00000000-0000-0000-0000-000000000000", 1.0f); Assert.Equal(2, telemetryItems.Count()); Assert.Equal("Message", telemetryItems[0].Name); @@ -314,7 +314,7 @@ public void ActivityWithExceptionEventDoesNotCreateExceptionTelemetryWhenExcepti Batch batch = new Batch(activityList, 1); var traceResource = new AzureMonitorResource(); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, traceResource, "00000000 - 0000 - 0000 - 0000 - 000000000000"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, traceResource, "00000000 - 0000 - 0000 - 0000 - 000000000000", 1.0f); Assert.Single(telemetryItems); Assert.Equal("Request", (IEnumerable)telemetryItems[0].Name); @@ -347,7 +347,7 @@ public void ActivityWithExceptionEventDoesNotCreateExceptionTelemetryWhenTypeNam Batch batch = new Batch(activityList, 1); var traceResource = new AzureMonitorResource(); - var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, traceResource, "00000000 - 0000 - 0000 - 0000 - 000000000000"); + var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, traceResource, "00000000 - 0000 - 0000 - 0000 - 000000000000", 1.0f); Assert.Single(telemetryItems); Assert.Equal("Request", telemetryItems[0].Name);