Skip to content

Commit

Permalink
SuppressInstrumentation from ActivityListener and DiagnosticSourceLis…
Browse files Browse the repository at this point in the history
…tener (#1079)

* Add SuppressInstrumentation check in the ActivityListener

* Add SuppressInstrumentation check in the DiagnosticSourceListner

* Fix things post merge

* Put AlwaysOn/AlwaysOff sampler check back in the constructor
  • Loading branch information
alanwest authored Aug 20, 2020
1 parent 44b55d4 commit 68c16da
Show file tree
Hide file tree
Showing 5 changed files with 142 additions and 3 deletions.
5 changes: 5 additions & 0 deletions src/OpenTelemetry/Instrumentation/DiagnosticSourceListener.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ public void OnError(Exception error)

public void OnNext(KeyValuePair<string, object> value)
{
if (Sdk.SuppressInstrumentation)
{
return;
}

if (!this.handler.SupportsNullActivity && Activity.Current == null)
{
InstrumentationEventSource.Log.NullActivity(value.Key);
Expand Down
9 changes: 6 additions & 3 deletions src/OpenTelemetry/Trace/TracerProviderSdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,18 +92,21 @@ internal TracerProviderSdk(

if (sampler is AlwaysOnSampler)
{
listener.GetRequestedDataUsingContext = (ref ActivityCreationOptions<ActivityContext> options) => ActivityDataRequest.AllDataAndRecorded;
listener.GetRequestedDataUsingContext = (ref ActivityCreationOptions<ActivityContext> options) =>
!Sdk.SuppressInstrumentation ? ActivityDataRequest.AllDataAndRecorded : ActivityDataRequest.None;
}
else if (sampler is AlwaysOffSampler)
{
/*TODO: Change options.Parent.SpanId to options.Parent.TraceId
once AutoGenerateRootContextTraceId is removed.*/
listener.GetRequestedDataUsingContext = (ref ActivityCreationOptions<ActivityContext> options) => PropagateOrIgnoreData(options.Parent.SpanId);
listener.GetRequestedDataUsingContext = (ref ActivityCreationOptions<ActivityContext> options) =>
!Sdk.SuppressInstrumentation ? PropagateOrIgnoreData(options.Parent.SpanId) : ActivityDataRequest.None;
}
else
{
// This delegate informs ActivitySource about sampling decision when the parent context is an ActivityContext.
listener.GetRequestedDataUsingContext = (ref ActivityCreationOptions<ActivityContext> options) => ComputeActivityDataRequest(options, sampler);
listener.GetRequestedDataUsingContext = (ref ActivityCreationOptions<ActivityContext> options) =>
!Sdk.SuppressInstrumentation ? ComputeActivityDataRequest(options, sampler) : ActivityDataRequest.None;
}

if (sources.Any())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// <copyright file="DiagnosticSourceListenerTest.cs" company="OpenTelemetry Authors">
// 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.
// </copyright>

using System.Diagnostics;
using Xunit;

namespace OpenTelemetry.Instrumentation.Tests
{
public class DiagnosticSourceListenerTest
{
private const string TestSourceName = "TestSourceName";
private DiagnosticSource diagnosticSource;
private TestListenerHandler testListenerHandler;
private DiagnosticSourceSubscriber testDiagnosticSourceSubscriber;

public DiagnosticSourceListenerTest()
{
this.diagnosticSource = new DiagnosticListener(TestSourceName);
this.testListenerHandler = new TestListenerHandler(TestSourceName);
this.testDiagnosticSourceSubscriber = new DiagnosticSourceSubscriber(this.testListenerHandler, null);
this.testDiagnosticSourceSubscriber.Subscribe();
}

[Theory]
[InlineData(true)]
[InlineData(false)]
public void ListenerHandlerIsNotInvokedWhenSuppressInstrumentationTrue(bool suppressInstrumentation)
{
using var scope = SuppressInstrumentationScope.Begin(suppressInstrumentation);

var activity = new Activity("Main");
this.diagnosticSource.StartActivity(activity, null);
this.diagnosticSource.StopActivity(activity, null);

if (suppressInstrumentation)
{
Assert.Equal(0, this.testListenerHandler.OnStartInvokedCount);
Assert.Equal(0, this.testListenerHandler.OnStopInvokedCount);
}
else
{
Assert.Equal(1, this.testListenerHandler.OnStartInvokedCount);
Assert.Equal(1, this.testListenerHandler.OnStopInvokedCount);
}
}
}
}
53 changes: 53 additions & 0 deletions test/OpenTelemetry.Tests/Instrumentation/TestListenerHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// <copyright file="TestListenerHandler.cs" company="OpenTelemetry Authors">
// 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.
// </copyright>

using System.Diagnostics;

namespace OpenTelemetry.Instrumentation.Tests
{
public class TestListenerHandler : ListenerHandler
{
public int OnStartInvokedCount = 0;
public int OnStopInvokedCount = 0;
public int OnExceptionInvokedCount = 0;
public int OnCustomInvokedCount = 0;

public TestListenerHandler(string sourceName)
: base(sourceName)
{
}

public override void OnStartActivity(Activity activity, object payload)
{
this.OnStartInvokedCount++;
}

public override void OnStopActivity(Activity activity, object payload)
{
this.OnStopInvokedCount++;
}

public override void OnException(Activity activity, object payload)
{
this.OnExceptionInvokedCount++;
}

public override void OnCustom(string name, Activity activity, object payload)
{
this.OnCustomInvokedCount++;
}
}
}
18 changes: 18 additions & 0 deletions test/OpenTelemetry.Tests/Trace/TracerProvideSdkTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,24 @@ public void TracerSdkSetsActivityDataRequestBasedOnSamplingDecision()
}
}

[Fact]
public void TracerSdkSetsActivityDataRequestToNoneWhenSuppressInstrumentationIsTrue()
{
using var scope = SuppressInstrumentationScope.Begin();

var testSampler = new TestSampler();
using var activitySource = new ActivitySource(ActivitySourceName);
using var sdk = Sdk.CreateTracerProviderBuilder()
.AddSource(ActivitySourceName)
.SetSampler(testSampler)
.Build();

using (var activity = activitySource.StartActivity("root"))
{
Assert.Null(activity);
}
}

[Fact]
public void ProcessorDoesNotReceiveNotRecordDecisionSpan()
{
Expand Down

0 comments on commit 68c16da

Please sign in to comment.