SuppressInstrumentation from ActivityListener and DiagnosticSourceListener (#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
This commit is contained in:
Alan West 2020-08-19 21:05:29 -07:00 committed by GitHub
parent 44b55d476e
commit 68c16da46f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 142 additions and 3 deletions

View File

@ -39,6 +39,11 @@ namespace OpenTelemetry.Instrumentation
public void OnNext(KeyValuePair<string, object> value)
{
if (Sdk.SuppressInstrumentation)
{
return;
}
if (!this.handler.SupportsNullActivity && Activity.Current == null)
{
InstrumentationEventSource.Log.NullActivity(value.Key);

View File

@ -92,18 +92,21 @@ namespace OpenTelemetry.Trace
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())

View File

@ -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);
}
}
}
}

View File

@ -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++;
}
}
}

View File

@ -147,6 +147,24 @@ namespace OpenTelemetry.Trace.Tests
}
}
[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()
{