diff --git a/src/OpenTelemetry/.publicApi/net452/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net452/PublicAPI.Unshipped.txt index cf1bea241fc..3e2c64e0ee7 100644 --- a/src/OpenTelemetry/.publicApi/net452/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net452/PublicAPI.Unshipped.txt @@ -180,7 +180,7 @@ abstract OpenTelemetry.Metrics.Export.MetricProcessor.Process(OpenTelemetry.Metr abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.BaseExportProcessor.Dispose(bool disposing) -> void override OpenTelemetry.BaseExportProcessor.OnShutdown(int timeoutMilliseconds) -> bool -override OpenTelemetry.BatchExportProcessor.OnEnd(T data) -> void +override OpenTelemetry.BatchExportProcessor.OnExport(T data) -> void override OpenTelemetry.BatchExportProcessor.OnForceFlush(int timeoutMilliseconds) -> bool override OpenTelemetry.BatchExportProcessor.OnShutdown(int timeoutMilliseconds) -> bool override OpenTelemetry.CompositeProcessor.Dispose(bool disposing) -> void @@ -214,14 +214,15 @@ override OpenTelemetry.Metrics.Aggregators.Int64MeasureMinMaxSumCountAggregator. override OpenTelemetry.Metrics.Aggregators.Int64MeasureMinMaxSumCountAggregator.Update(long value) -> void override OpenTelemetry.Metrics.Export.UngroupedBatcher.FinishCollectionCycle(out System.Collections.Generic.IEnumerable metrics) -> void override OpenTelemetry.Metrics.Export.UngroupedBatcher.Process(OpenTelemetry.Metrics.Export.Metric metric) -> void -override OpenTelemetry.SimpleExportProcessor.OnEnd(T data) -> void +override OpenTelemetry.SimpleExportProcessor.OnExport(T data) -> void override OpenTelemetry.Trace.AlwaysOffSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.AlwaysOnSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.ParentBasedSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool override OpenTelemetry.Trace.SamplingResult.GetHashCode() -> int override OpenTelemetry.Trace.TraceIdRatioBasedSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult -override abstract OpenTelemetry.BaseExportProcessor.OnEnd(T data) -> void +abstract OpenTelemetry.BaseExportProcessor.OnExport(T data) -> void +override sealed OpenTelemetry.BaseExportProcessor.OnEnd(T data) -> void override sealed OpenTelemetry.BaseExportProcessor.OnStart(T data) -> void readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExporter static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource diff --git a/src/OpenTelemetry/.publicApi/net46/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net46/PublicAPI.Unshipped.txt index e3c8cedab4f..1e2955cd45a 100644 --- a/src/OpenTelemetry/.publicApi/net46/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net46/PublicAPI.Unshipped.txt @@ -180,7 +180,7 @@ abstract OpenTelemetry.Metrics.Export.MetricProcessor.Process(OpenTelemetry.Metr abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.BaseExportProcessor.Dispose(bool disposing) -> void override OpenTelemetry.BaseExportProcessor.OnShutdown(int timeoutMilliseconds) -> bool -override OpenTelemetry.BatchExportProcessor.OnEnd(T data) -> void +override OpenTelemetry.BatchExportProcessor.OnExport(T data) -> void override OpenTelemetry.BatchExportProcessor.OnForceFlush(int timeoutMilliseconds) -> bool override OpenTelemetry.BatchExportProcessor.OnShutdown(int timeoutMilliseconds) -> bool override OpenTelemetry.CompositeProcessor.Dispose(bool disposing) -> void @@ -214,14 +214,15 @@ override OpenTelemetry.Metrics.Aggregators.Int64MeasureMinMaxSumCountAggregator. override OpenTelemetry.Metrics.Aggregators.Int64MeasureMinMaxSumCountAggregator.Update(long value) -> void override OpenTelemetry.Metrics.Export.UngroupedBatcher.FinishCollectionCycle(out System.Collections.Generic.IEnumerable metrics) -> void override OpenTelemetry.Metrics.Export.UngroupedBatcher.Process(OpenTelemetry.Metrics.Export.Metric metric) -> void -override OpenTelemetry.SimpleExportProcessor.OnEnd(T data) -> void +override OpenTelemetry.SimpleExportProcessor.OnExport(T data) -> void override OpenTelemetry.Trace.AlwaysOffSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.AlwaysOnSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.ParentBasedSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool override OpenTelemetry.Trace.SamplingResult.GetHashCode() -> int override OpenTelemetry.Trace.TraceIdRatioBasedSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult -override abstract OpenTelemetry.BaseExportProcessor.OnEnd(T data) -> void +abstract OpenTelemetry.BaseExportProcessor.OnExport(T data) -> void +override sealed OpenTelemetry.BaseExportProcessor.OnEnd(T data) -> void override sealed OpenTelemetry.BaseExportProcessor.OnStart(T data) -> void readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExporter static OpenTelemetry.ProviderExtensions.GetResource(this OpenTelemetry.BaseProvider baseProvider) -> OpenTelemetry.Resources.Resource diff --git a/src/OpenTelemetry/.publicApi/net461/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net461/PublicAPI.Unshipped.txt index 269cfca43bb..6c2f0a54b5f 100644 --- a/src/OpenTelemetry/.publicApi/net461/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net461/PublicAPI.Unshipped.txt @@ -199,7 +199,7 @@ abstract OpenTelemetry.Metrics.Export.MetricProcessor.Process(OpenTelemetry.Metr abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.BaseExportProcessor.Dispose(bool disposing) -> void override OpenTelemetry.BaseExportProcessor.OnShutdown(int timeoutMilliseconds) -> bool -override OpenTelemetry.BatchExportProcessor.OnEnd(T data) -> void +override OpenTelemetry.BatchExportProcessor.OnExport(T data) -> void override OpenTelemetry.BatchExportProcessor.OnForceFlush(int timeoutMilliseconds) -> bool override OpenTelemetry.BatchExportProcessor.OnShutdown(int timeoutMilliseconds) -> bool override OpenTelemetry.CompositeProcessor.Dispose(bool disposing) -> void @@ -233,14 +233,15 @@ override OpenTelemetry.Metrics.Aggregators.Int64MeasureMinMaxSumCountAggregator. override OpenTelemetry.Metrics.Aggregators.Int64MeasureMinMaxSumCountAggregator.Update(long value) -> void override OpenTelemetry.Metrics.Export.UngroupedBatcher.FinishCollectionCycle(out System.Collections.Generic.IEnumerable metrics) -> void override OpenTelemetry.Metrics.Export.UngroupedBatcher.Process(OpenTelemetry.Metrics.Export.Metric metric) -> void -override OpenTelemetry.SimpleExportProcessor.OnEnd(T data) -> void +override OpenTelemetry.SimpleExportProcessor.OnExport(T data) -> void override OpenTelemetry.Trace.AlwaysOffSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.AlwaysOnSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.ParentBasedSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool override OpenTelemetry.Trace.SamplingResult.GetHashCode() -> int override OpenTelemetry.Trace.TraceIdRatioBasedSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult -override abstract OpenTelemetry.BaseExportProcessor.OnEnd(T data) -> void +abstract OpenTelemetry.BaseExportProcessor.OnExport(T data) -> void +override sealed OpenTelemetry.BaseExportProcessor.OnEnd(T data) -> void override sealed OpenTelemetry.BaseExportProcessor.OnStart(T data) -> void readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExporter static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder builder, System.Action configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 269cfca43bb..6c2f0a54b5f 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -199,7 +199,7 @@ abstract OpenTelemetry.Metrics.Export.MetricProcessor.Process(OpenTelemetry.Metr abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.BaseExportProcessor.Dispose(bool disposing) -> void override OpenTelemetry.BaseExportProcessor.OnShutdown(int timeoutMilliseconds) -> bool -override OpenTelemetry.BatchExportProcessor.OnEnd(T data) -> void +override OpenTelemetry.BatchExportProcessor.OnExport(T data) -> void override OpenTelemetry.BatchExportProcessor.OnForceFlush(int timeoutMilliseconds) -> bool override OpenTelemetry.BatchExportProcessor.OnShutdown(int timeoutMilliseconds) -> bool override OpenTelemetry.CompositeProcessor.Dispose(bool disposing) -> void @@ -233,14 +233,15 @@ override OpenTelemetry.Metrics.Aggregators.Int64MeasureMinMaxSumCountAggregator. override OpenTelemetry.Metrics.Aggregators.Int64MeasureMinMaxSumCountAggregator.Update(long value) -> void override OpenTelemetry.Metrics.Export.UngroupedBatcher.FinishCollectionCycle(out System.Collections.Generic.IEnumerable metrics) -> void override OpenTelemetry.Metrics.Export.UngroupedBatcher.Process(OpenTelemetry.Metrics.Export.Metric metric) -> void -override OpenTelemetry.SimpleExportProcessor.OnEnd(T data) -> void +override OpenTelemetry.SimpleExportProcessor.OnExport(T data) -> void override OpenTelemetry.Trace.AlwaysOffSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.AlwaysOnSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.ParentBasedSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool override OpenTelemetry.Trace.SamplingResult.GetHashCode() -> int override OpenTelemetry.Trace.TraceIdRatioBasedSampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult -override abstract OpenTelemetry.BaseExportProcessor.OnEnd(T data) -> void +abstract OpenTelemetry.BaseExportProcessor.OnExport(T data) -> void +override sealed OpenTelemetry.BaseExportProcessor.OnEnd(T data) -> void override sealed OpenTelemetry.BaseExportProcessor.OnStart(T data) -> void readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExporter static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder builder, System.Action configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder diff --git a/src/OpenTelemetry/BaseExportProcessor.cs b/src/OpenTelemetry/BaseExportProcessor.cs index b7a1335cef5..13f841917c7 100644 --- a/src/OpenTelemetry/BaseExportProcessor.cs +++ b/src/OpenTelemetry/BaseExportProcessor.cs @@ -15,6 +15,7 @@ // using System; +using System.Diagnostics; using OpenTelemetry.Internal; namespace OpenTelemetry @@ -44,7 +45,17 @@ public sealed override void OnStart(T data) } /// - public abstract override void OnEnd(T data); + public sealed override void OnEnd(T data) + { + if (data is Activity activity && activity.ActivityTraceFlags == ActivityTraceFlags.None) + { + return; + } + + this.OnExport(data); + } + + public abstract void OnExport(T data); internal override void SetParentProvider(BaseProvider parentProvider) { diff --git a/src/OpenTelemetry/BatchExportProcessor.cs b/src/OpenTelemetry/BatchExportProcessor.cs index 864475fd610..b6375b9a396 100644 --- a/src/OpenTelemetry/BatchExportProcessor.cs +++ b/src/OpenTelemetry/BatchExportProcessor.cs @@ -108,7 +108,7 @@ public BatchExportProcessor( internal long ProcessedCount => this.circularBuffer.RemovedCount; /// - public override void OnEnd(T data) + public override void OnExport(T data) { if (this.circularBuffer.TryAdd(data, maxSpinCount: 50000)) { diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 724ed6d687f..c29fe9ed54f 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -16,8 +16,8 @@ ([#1515](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1515/)) * Implemented `Shutdown` for `TracerProvider`. ([#1489](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1489)) -* `Resources.CreateServiceResource` has been removed in - favor of the `ResourceBuilder` API. +* `Resources.CreateServiceResource` has been removed in favor of the + `ResourceBuilder` API. ([#1533](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1533)) * `TracerProviderBuilder.SetResource` has been changed to `TracerProviderBuilder.SetResourceBuilder`. @@ -29,9 +29,12 @@ * `telemetry.sdk.name` = `opentelemetry` * `telemetry.sdk.language` = `dotnet` * `telemetry.sdk.version` = [SDK version] -* `Resource` constructor marked as internal, as `ResourceBuilder` is - the recommended API to build resources. +* `Resource` constructor marked as internal, as `ResourceBuilder` is the + recommended API to build resources. ([#1566](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1566)) +* Changed BaseExportProcessor to have it override OnExport instead of OnEnd; + Added check for ActivityTraceFlags to BaseExportProcessor OnEnd + ([#1574](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1574)) ## 0.8.0-beta.1 diff --git a/src/OpenTelemetry/SimpleExportProcessor.cs b/src/OpenTelemetry/SimpleExportProcessor.cs index 47872fb84f8..6c71b5473fa 100644 --- a/src/OpenTelemetry/SimpleExportProcessor.cs +++ b/src/OpenTelemetry/SimpleExportProcessor.cs @@ -38,7 +38,7 @@ public SimpleExportProcessor(BaseExporter exporter) } /// - public override void OnEnd(T data) + public override void OnExport(T data) { lock (this.syncObject) { diff --git a/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj b/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj index e68d8301717..8c77f77b1ae 100644 --- a/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj +++ b/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj @@ -6,8 +6,9 @@ - + + diff --git a/test/OpenTelemetry.Tests/Shared/RecordOnlySampler.cs b/test/OpenTelemetry.Tests/Shared/RecordOnlySampler.cs new file mode 100644 index 00000000000..357e678c6fd --- /dev/null +++ b/test/OpenTelemetry.Tests/Shared/RecordOnlySampler.cs @@ -0,0 +1,28 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using OpenTelemetry.Trace; + +namespace OpenTelemetry.Tests +{ + internal class RecordOnlySampler : TestSampler + { + public override SamplingResult ShouldSample(in SamplingParameters param) + { + return new SamplingResult(SamplingDecision.RecordOnly); + } + } +} diff --git a/test/OpenTelemetry.Tests/Shared/TestExportProcessor.cs b/test/OpenTelemetry.Tests/Shared/TestExportProcessor.cs new file mode 100644 index 00000000000..a56d273a3a3 --- /dev/null +++ b/test/OpenTelemetry.Tests/Shared/TestExportProcessor.cs @@ -0,0 +1,36 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using System.Collections.Generic; + +namespace OpenTelemetry.Tests +{ + internal class TestExportProcessor : BaseExportProcessor + where T : class + { + public List ExportedItems = new List(); + + public TestExportProcessor(BaseExporter exporter) + : base(exporter) + { + } + + public override void OnExport(T data) + { + this.ExportedItems.Add(data); + } + } +} diff --git a/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorTest.cs b/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorTest.cs index d20f163d4f9..73a8833ae03 100644 --- a/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorTest.cs +++ b/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorTest.cs @@ -53,7 +53,10 @@ public void CheckIfBatchIsExportingOnQueueLimit() maxExportBatchSize: 1, scheduledDelayMilliseconds: 100_000); - processor.OnEnd(new Activity("start")); + var activity = new Activity("start"); + activity.ActivityTraceFlags = ActivityTraceFlags.Recorded; + + processor.OnEnd(activity); for (int i = 0; i < 10 && exportedItems.Count == 0; i++) { @@ -90,8 +93,14 @@ public void CheckForceFlushExport(int timeout) maxExportBatchSize: 3, exporterTimeoutMilliseconds: 30000); - processor.OnEnd(new Activity("start1")); - processor.OnEnd(new Activity("start2")); + var activity1 = new Activity("start1"); + activity1.ActivityTraceFlags = ActivityTraceFlags.Recorded; + + var activity2 = new Activity("start2"); + activity2.ActivityTraceFlags = ActivityTraceFlags.Recorded; + + processor.OnEnd(activity1); + processor.OnEnd(activity2); Assert.Equal(0, processor.ProcessedCount); @@ -129,7 +138,10 @@ public void CheckShutdownExport(int timeout) maxExportBatchSize: 3, exporterTimeoutMilliseconds: 30000); - processor.OnEnd(new Activity("start")); + var activity = new Activity("start"); + activity.ActivityTraceFlags = ActivityTraceFlags.Recorded; + + processor.OnEnd(activity); processor.Shutdown(timeout); if (timeout == 0) @@ -144,5 +156,25 @@ public void CheckShutdownExport(int timeout) Assert.Equal(1, processor.ReceivedCount); Assert.Equal(0, processor.DroppedCount); } + + [Fact] + public void CheckExportForRecordingButNotSampledActivity() + { + var exportedItems = new List(); + using var exporter = new InMemoryExporter(exportedItems); + using var processor = new BatchExportProcessor( + exporter, + maxQueueSize: 1, + maxExportBatchSize: 1); + + var activity = new Activity("start"); + activity.ActivityTraceFlags = ActivityTraceFlags.None; + + processor.OnEnd(activity); + processor.Shutdown(); + + Assert.Empty(exportedItems); + Assert.Equal(0, processor.ProcessedCount); + } } } diff --git a/test/OpenTelemetry.Tests/Trace/ExportProcessorTest.cs b/test/OpenTelemetry.Tests/Trace/ExportProcessorTest.cs new file mode 100644 index 00000000000..99bdf94e194 --- /dev/null +++ b/test/OpenTelemetry.Tests/Trace/ExportProcessorTest.cs @@ -0,0 +1,92 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using System.Collections.Generic; +using System.Diagnostics; +using OpenTelemetry.Exporter; +using OpenTelemetry.Trace; +using Xunit; + +namespace OpenTelemetry.Tests.Trace +{ + public class ExportProcessorTest + { + private const string ActivitySourceName = "ActivityExportProcessorTest"; + + [Fact] + public void ExportProcessorIgnoresActivityWhenDropped() + { + var sampler = new AlwaysOffSampler(); + var processor = new TestExportProcessor(new ConsoleExporter(null)); + using var activitySource = new ActivitySource(ActivitySourceName); + using var sdk = Sdk.CreateTracerProviderBuilder() + .AddSource(ActivitySourceName) + .SetSampler(sampler) + .AddProcessor(processor) + .Build(); + + using (var activity = activitySource.StartActivity("Activity")) + { + Assert.False(activity.IsAllDataRequested); + Assert.Equal(ActivityTraceFlags.None, activity.ActivityTraceFlags); + } + + Assert.Empty(processor.ExportedItems); + } + + [Fact] + public void ExportProcessorIgnoresActivityMarkedAsRecordOnly() + { + var sampler = new RecordOnlySampler(); + var processor = new TestExportProcessor(new ConsoleExporter(null)); + using var activitySource = new ActivitySource(ActivitySourceName); + using var sdk = Sdk.CreateTracerProviderBuilder() + .AddSource(ActivitySourceName) + .SetSampler(sampler) + .AddProcessor(processor) + .Build(); + + using (var activity = activitySource.StartActivity("Activity")) + { + Assert.True(activity.IsAllDataRequested); + Assert.Equal(ActivityTraceFlags.None, activity.ActivityTraceFlags); + } + + Assert.Empty(processor.ExportedItems); + } + + [Fact] + public void ExportProcessorExportsActivityMarkedAsRecordAndSample() + { + var sampler = new AlwaysOnSampler(); + var processor = new TestExportProcessor(new ConsoleExporter(null)); + using var activitySource = new ActivitySource(ActivitySourceName); + using var sdk = Sdk.CreateTracerProviderBuilder() + .AddSource(ActivitySourceName) + .SetSampler(sampler) + .AddProcessor(processor) + .Build(); + + using (var activity = activitySource.StartActivity("Activity")) + { + Assert.True(activity.IsAllDataRequested); + Assert.Equal(ActivityTraceFlags.Recorded, activity.ActivityTraceFlags); + } + + Assert.Single(processor.ExportedItems); + } + } +} diff --git a/test/OpenTelemetry.Tests/Trace/SimpleExportActivityProcessorTest.cs b/test/OpenTelemetry.Tests/Trace/SimpleExportActivityProcessorTest.cs index c606a091800..88606bf6b21 100644 --- a/test/OpenTelemetry.Tests/Trace/SimpleExportActivityProcessorTest.cs +++ b/test/OpenTelemetry.Tests/Trace/SimpleExportActivityProcessorTest.cs @@ -38,10 +38,16 @@ public void CheckExportedOnEnd() using var exporter = new InMemoryExporter(exportedItems); using var processor = new SimpleExportProcessor(exporter); - processor.OnEnd(new Activity("start1")); + var activity1 = new Activity("start1"); + activity1.ActivityTraceFlags = ActivityTraceFlags.Recorded; + + processor.OnEnd(activity1); Assert.Single(exportedItems); - processor.OnEnd(new Activity("start2")); + var activity2 = new Activity("start2"); + activity2.ActivityTraceFlags = ActivityTraceFlags.Recorded; + + processor.OnEnd(activity2); Assert.Equal(2, exportedItems.Count); } @@ -55,8 +61,14 @@ public void CheckForceFlushExport(int timeout) using var exporter = new InMemoryExporter(exportedItems); using var processor = new SimpleExportProcessor(exporter); - processor.OnEnd(new Activity("start1")); - processor.OnEnd(new Activity("start2")); + var activity1 = new Activity("start1"); + activity1.ActivityTraceFlags = ActivityTraceFlags.Recorded; + + var activity2 = new Activity("start2"); + activity2.ActivityTraceFlags = ActivityTraceFlags.Recorded; + + processor.OnEnd(activity1); + processor.OnEnd(activity2); // checking before force flush Assert.Equal(2, exportedItems.Count); @@ -76,7 +88,10 @@ public void CheckShutdownExport(int timeout) using var exporter = new InMemoryExporter(exportedItems); using var processor = new SimpleExportProcessor(exporter); - processor.OnEnd(new Activity("start")); + var activity = new Activity("start"); + activity.ActivityTraceFlags = ActivityTraceFlags.Recorded; + + processor.OnEnd(activity); // checking before shutdown Assert.Single(exportedItems); @@ -84,5 +99,19 @@ public void CheckShutdownExport(int timeout) processor.Shutdown(timeout); Assert.Single(exportedItems); } + + [Fact] + public void CheckExportForRecordingButNotSampledActivity() + { + var exportedItems = new List(); + using var exporter = new InMemoryExporter(exportedItems); + using var processor = new SimpleExportProcessor(exporter); + + var activity = new Activity("start"); + activity.ActivityTraceFlags = ActivityTraceFlags.None; + + processor.OnEnd(activity); + Assert.Empty(exportedItems); + } } }