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:
parent
44b55d476e
commit
68c16da46f
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue