Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/OpenTelemetry.Api/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

## Unreleased

* Improved wildcard support to cover `?` (which matches exactly one character).
Comment thread
reyang marked this conversation as resolved.
Outdated
([#2875](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2875))

## 1.2.0-rc2

Released 2022-Feb-02
Expand Down
11 changes: 2 additions & 9 deletions src/OpenTelemetry/Metrics/MeterProviderSdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
using System.Diagnostics;
using System.Diagnostics.Metrics;
using System.Linq;
using System.Text.RegularExpressions;
using OpenTelemetry.Internal;
using OpenTelemetry.Resources;

Expand Down Expand Up @@ -82,9 +81,9 @@ internal MeterProviderSdk(

// Setup Listener
Func<Instrument, bool> shouldListenTo = instrument => false;
if (meterSources.Any(s => s.Contains('*')))
if (meterSources.Any(s => s.Contains('*') || s.Contains('?')))
{
var regex = GetWildcardRegex(meterSources);
var regex = this.GetWildcardRegex(meterSources);
shouldListenTo = instrument => regex.IsMatch(instrument.Meter.Name);
}
else if (meterSources.Any())
Expand Down Expand Up @@ -235,12 +234,6 @@ internal MeterProviderSdk(
}

this.listener.Start();

static Regex GetWildcardRegex(IEnumerable<string> collection)
{
var pattern = '^' + string.Join("|", from name in collection select "(?:" + Regex.Escape(name).Replace("\\*", ".*") + ')') + '$';
return new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
}
}

internal Resource Resource { get; }
Expand Down
16 changes: 16 additions & 0 deletions src/OpenTelemetry/ProviderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
// </copyright>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
Expand Down Expand Up @@ -69,5 +72,18 @@ internal static Action GetObservableInstrumentCollectCallback(this BaseProvider

return null;
}

internal static Regex GetWildcardRegex(this BaseProvider baseProvider, IEnumerable<string> wildcards = default)
Comment thread
reyang marked this conversation as resolved.
Outdated
{
if (wildcards == null)
{
return null;
}

var pattern = string.Join(
"|",
from w in wildcards select "(?:" + Regex.Escape(w).Replace("\\*", ".*").Replace("\\?", ".") + ')');
return new Regex('^' + pattern + '$', RegexOptions.Compiled | RegexOptions.IgnoreCase);
}
}
}
17 changes: 5 additions & 12 deletions src/OpenTelemetry/Trace/TracerProviderSdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;
using OpenTelemetry.Internal;
using OpenTelemetry.Resources;

Expand Down Expand Up @@ -50,13 +49,13 @@ internal TracerProviderSdk(
this.supportLegacyActivity = legacyActivityOperationNames.Count > 0;

bool legacyActivityWildcardMode = false;
Regex legacyActivityWildcardModeRegex = null;
var legacyActivityWildcardModeRegex = this.GetWildcardRegex();
foreach (var legacyName in legacyActivityOperationNames)
{
if (legacyName.Contains('*'))
if (legacyName.Contains('*') || legacyName.Contains('?'))
{
legacyActivityWildcardMode = true;
legacyActivityWildcardModeRegex = GetWildcardRegex(legacyActivityOperationNames);
legacyActivityWildcardModeRegex = this.GetWildcardRegex(legacyActivityOperationNames);
break;
}
}
Expand Down Expand Up @@ -222,7 +221,7 @@ internal TracerProviderSdk(
// Validation of source name is already done in builder.
foreach (var name in sources)
{
if (name.Contains('*'))
if (name.Contains('*') || name.Contains('?'))
{
wildcardMode = true;
break;
Expand All @@ -231,7 +230,7 @@ internal TracerProviderSdk(

if (wildcardMode)
{
var regex = GetWildcardRegex(sources);
var regex = this.GetWildcardRegex(sources);

// Function which takes ActivitySource and returns true/false to indicate if it should be subscribed to
// or not.
Expand Down Expand Up @@ -264,12 +263,6 @@ internal TracerProviderSdk(

ActivitySource.AddActivityListener(listener);
this.listener = listener;

Regex GetWildcardRegex(IEnumerable<string> collection)
{
var pattern = '^' + string.Join("|", from name in collection select "(?:" + Regex.Escape(name).Replace("\\*", ".*") + ')') + '$';
return new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
}
}

internal Resource Resource { get; }
Expand Down
2 changes: 1 addition & 1 deletion test/OpenTelemetry.Tests/Metrics/MetricAPITest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ public void MeterSourcesWildcardSupportMatchTest(bool hasView)

var exportedItems = new List<Metric>();
var meterProviderBuilder = Sdk.CreateMeterProviderBuilder()
.AddMeter("AbcCompany.XyzProduct.*")
.AddMeter("AbcCompany.XyzProduct.Component?")
Comment thread
alanwest marked this conversation as resolved.
.AddMeter("DefCompany.*.ComponentC")
.AddMeter("GhiCompany.qweProduct.ComponentN") // Mixing of non-wildcard meter name and wildcard meter name.
.AddInMemoryExporter(exportedItems);
Expand Down
80 changes: 80 additions & 0 deletions test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,86 @@ public TracerProviderSdkTest()
Activity.DefaultIdFormat = ActivityIdFormat.W3C;
}

[Fact]
public void TracerProviderSdkAddSource()
{
using var source1 = new ActivitySource($"{Utils.GetCurrentMethodName()}.1");
using var source2 = new ActivitySource($"{Utils.GetCurrentMethodName()}.2");

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource(source1.Name)
.Build();

using (var activity = source1.StartActivity("test"))
{
Assert.NotNull(activity);
}

using (var activity = source2.StartActivity("test"))
{
Assert.Null(activity);
}
}

[Fact]
public void TracerProviderSdkAddSourceWithWildcards()
{
using var source1 = new ActivitySource($"{Utils.GetCurrentMethodName()}.A");
using var source2 = new ActivitySource($"{Utils.GetCurrentMethodName()}.Ab");
using var source3 = new ActivitySource($"{Utils.GetCurrentMethodName()}.Abc");
using var source4 = new ActivitySource($"{Utils.GetCurrentMethodName()}.B");

using (var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource($"{Utils.GetCurrentMethodName()}.*")
.Build())
{
using (var activity = source1.StartActivity("test"))
{
Assert.NotNull(activity);
}

using (var activity = source2.StartActivity("test"))
{
Assert.NotNull(activity);
}

using (var activity = source3.StartActivity("test"))
{
Assert.NotNull(activity);
}

using (var activity = source4.StartActivity("test"))
{
Assert.NotNull(activity);
}
}

using (var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource($"{Utils.GetCurrentMethodName()}.?")
.Build())
{
using (var activity = source1.StartActivity("test"))
{
Assert.NotNull(activity);
}

using (var activity = source2.StartActivity("test"))
{
Assert.Null(activity);
}

using (var activity = source3.StartActivity("test"))
{
Assert.Null(activity);
}

using (var activity = source4.StartActivity("test"))
{
Assert.NotNull(activity);
}
}
}

[Fact]
public void TracerProviderSdkInvokesSamplingWithCorrectParameters()
{
Expand Down