Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make SuppressInstrumentation an IDisposable (#988)
* Make SuppressInstrumentation an IDisposable * Simplify SuppressInstrumentation * Rename to SuppressInstrumentationScope * Clean up comment * Implicit operator instead of IsSuppressed property * Make SuppressInstrumentationScope constructor internal * Clean up some names * Update changelog Co-authored-by: Cijo Thomas <cithomas@microsoft.com> Co-authored-by: Reiley Yang <reyang@microsoft.com>
- Loading branch information
1 parent
fd0cc21
commit 099c3c7
Showing
4 changed files
with
122 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// <copyright file="SuppressInstrumentationScope.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; | ||
using OpenTelemetry.Context; | ||
|
||
namespace OpenTelemetry | ||
{ | ||
public sealed class SuppressInstrumentationScope : IDisposable | ||
{ | ||
private static readonly RuntimeContextSlot<bool> Slot = RuntimeContext.RegisterSlot<bool>("otel.suppress_instrumentation"); | ||
|
||
private readonly bool previousValue; | ||
private bool disposed; | ||
|
||
internal SuppressInstrumentationScope(bool value = true) | ||
{ | ||
this.previousValue = Slot.Get(); | ||
Slot.Set(value); | ||
} | ||
|
||
public static implicit operator bool(SuppressInstrumentationScope unused) => Slot.Get(); | ||
|
||
/// <summary> | ||
/// Begins a new scope in which instrumentation is suppressed (disabled). | ||
/// </summary> | ||
/// <param name="value">Value indicating whether to suppress instrumentation.</param> | ||
/// <returns>Object to dispose to end the scope.</returns> | ||
/// <remarks> | ||
/// This is typically used to prevent infinite loops created by | ||
/// collection of internal operations, such as exporting traces over HTTP. | ||
/// <code> | ||
/// public override async Task<ExportResult> ExportAsync( | ||
/// IEnumerable<Activity> batch, | ||
/// CancellationToken cancellationToken) | ||
/// { | ||
/// using (Sdk.SuppressInstrumentation.Begin()) | ||
/// { | ||
/// // Instrumentation is suppressed (i.e., Sdk.SuppressInstrumentation == true) | ||
/// } | ||
/// | ||
/// // Instrumentation is not suppressed (i.e., Sdk.SuppressInstrumentation == false) | ||
/// } | ||
/// </code> | ||
/// </remarks> | ||
public IDisposable Begin(bool value = true) | ||
{ | ||
return new SuppressInstrumentationScope(value); | ||
} | ||
|
||
/// <inheritdoc/> | ||
public void Dispose() | ||
{ | ||
if (!this.disposed) | ||
{ | ||
Slot.Set(this.previousValue); | ||
this.disposed = true; | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
// <copyright file="SuppressInstrumentationTest.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 Xunit; | ||
|
||
namespace OpenTelemetry.Tests | ||
{ | ||
public class SuppressInstrumentationTest | ||
{ | ||
[Fact] | ||
public static void UsingSuppressInstrumentation() | ||
{ | ||
using (var scope = Sdk.SuppressInstrumentation.Begin()) | ||
{ | ||
Assert.True(Sdk.SuppressInstrumentation); | ||
|
||
using (var innerScope = Sdk.SuppressInstrumentation.Begin()) | ||
{ | ||
innerScope.Dispose(); | ||
|
||
Assert.True(Sdk.SuppressInstrumentation); | ||
|
||
scope.Dispose(); | ||
} | ||
|
||
Assert.False(Sdk.SuppressInstrumentation); | ||
} | ||
|
||
Assert.False(Sdk.SuppressInstrumentation); | ||
} | ||
} | ||
} |