diff --git a/src/OpenTelemetry.Exporter.ZPages/Properties/AssemblyInfo.cs b/src/OpenTelemetry.Exporter.ZPages/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..e027f928b31 --- /dev/null +++ b/src/OpenTelemetry.Exporter.ZPages/Properties/AssemblyInfo.cs @@ -0,0 +1,22 @@ +// +// 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. +// +using System.Runtime.CompilerServices; + +#if SIGNED +[assembly: InternalsVisibleTo("OpenTelemetry.Exporter.ZPages.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010051c1562a090fb0c9f391012a32198b5e5d9a60e9b80fa2d7b434c9e5ccb7259bd606e66f9660676afc6692b8cdc6793d190904551d2103b7b22fa636dcbb8208839785ba402ea08fc00c8f1500ccef28bbf599aa64ffb1e1d5dc1bf3420a3777badfe697856e9d52070a50c3ea5821c80bef17ca3acffa28f89dd413f096f898")] +#else +[assembly: InternalsVisibleTo("OpenTelemetry.Exporter.ZPages.Tests")] +#endif diff --git a/src/OpenTelemetry.Exporter.ZPages/OpenTelemetryBuilderExtensions.cs b/src/OpenTelemetry.Exporter.ZPages/TracerProviderBuilderExtensions.cs similarity index 93% rename from src/OpenTelemetry.Exporter.ZPages/OpenTelemetryBuilderExtensions.cs rename to src/OpenTelemetry.Exporter.ZPages/TracerProviderBuilderExtensions.cs index 6b693e71141..2062b6bf14d 100644 --- a/src/OpenTelemetry.Exporter.ZPages/OpenTelemetryBuilderExtensions.cs +++ b/src/OpenTelemetry.Exporter.ZPages/TracerProviderBuilderExtensions.cs @@ -1,4 +1,4 @@ -// +// // Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,7 +23,7 @@ namespace OpenTelemetry.Trace /// /// Extension methods to simplify registering of Zipkin exporter. /// - public static class OpenTelemetryBuilderExtensions + public static class TracerProviderBuilderExtensions { /// /// Registers a Zipkin exporter that will receive instances. diff --git a/src/OpenTelemetry.Instrumentation.AspNet/AspNetInstrumentation.cs b/src/OpenTelemetry.Instrumentation.AspNet/AspNetInstrumentation.cs index 7c720bcb6ba..4a7f61d8214 100644 --- a/src/OpenTelemetry.Instrumentation.AspNet/AspNetInstrumentation.cs +++ b/src/OpenTelemetry.Instrumentation.AspNet/AspNetInstrumentation.cs @@ -28,15 +28,6 @@ internal class AspNetInstrumentation : IDisposable private readonly DiagnosticSourceSubscriber diagnosticSourceSubscriber; - /// - /// Initializes a new instance of the class. - /// - /// ActivitySource adapter instance. - public AspNetInstrumentation(ActivitySourceAdapter activitySource) - : this(activitySource, new AspNetInstrumentationOptions()) - { - } - /// /// Initializes a new instance of the class. /// diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/AspNetCoreInstrumentation.cs b/src/OpenTelemetry.Instrumentation.AspNetCore/AspNetCoreInstrumentation.cs index abbb3d0d6be..74ff8e54a9d 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/AspNetCoreInstrumentation.cs +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/AspNetCoreInstrumentation.cs @@ -26,15 +26,6 @@ internal class AspNetCoreInstrumentation : IDisposable { private readonly DiagnosticSourceSubscriber diagnosticSourceSubscriber; - /// - /// Initializes a new instance of the class. - /// - /// ActivitySource adapter instance. - public AspNetCoreInstrumentation(ActivitySourceAdapter activitySource) - : this(activitySource, new AspNetCoreInstrumentationOptions()) - { - } - /// /// Initializes a new instance of the class. /// diff --git a/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md index 2410d0bec7a..628018a3d07 100644 --- a/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.SqlClient/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +* Renamed from `AddSqlClientDependencyInstrumentation` to `AddSqlClientInstrumentation` + ## 0.3.0-beta Released 2020-07-23 diff --git a/src/OpenTelemetry.Instrumentation.SqlClient/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry.Instrumentation.SqlClient/TracerProviderBuilderExtensions.cs index d10046d37b2..75cda6ea349 100644 --- a/src/OpenTelemetry.Instrumentation.SqlClient/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.Instrumentation.SqlClient/TracerProviderBuilderExtensions.cs @@ -31,7 +31,7 @@ public static class TracerProviderBuilderExtensions /// being configured. /// SqlClient configuration options. /// The instance of to chain the calls. - public static TracerProviderBuilder AddSqlClientDependencyInstrumentation( + public static TracerProviderBuilder AddSqlClientInstrumentation( this TracerProviderBuilder builder, Action configureSqlClientInstrumentationOptions = null) { diff --git a/test/OpenTelemetry.Exporter.Jaeger.Tests/JaegerExporterTests.cs b/test/OpenTelemetry.Exporter.Jaeger.Tests/JaegerExporterTests.cs index e59a7f6048a..eb6d04a821a 100644 --- a/test/OpenTelemetry.Exporter.Jaeger.Tests/JaegerExporterTests.cs +++ b/test/OpenTelemetry.Exporter.Jaeger.Tests/JaegerExporterTests.cs @@ -14,6 +14,7 @@ // limitations under the License. // +using System; using System.Collections.Generic; using System.Diagnostics; using OpenTelemetry.Exporter.Jaeger.Implementation; @@ -25,6 +26,13 @@ namespace OpenTelemetry.Exporter.Jaeger.Tests { public class JaegerExporterTests { + [Fact] + public void JaegerExporter_BadArgs() + { + TracerProviderBuilder builder = null; + Assert.Throws(() => builder.UseJaegerExporter()); + } + [Fact] public void UseJaegerExporterWithCustomActivityProcessor() { diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/ActivityExtensionsTest.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterTest.cs similarity index 97% rename from test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/ActivityExtensionsTest.cs rename to test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterTest.cs index e7430ddc8cb..94fd4d23fb4 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/ActivityExtensionsTest.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterTest.cs @@ -1,4 +1,4 @@ -// +// // Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -31,9 +31,9 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests { - public class ActivityExtensionsTest + public class OtlpExporterTest { - static ActivityExtensionsTest() + static OtlpExporterTest() { Activity.DefaultIdFormat = ActivityIdFormat.W3C; Activity.ForceDefaultIdFormat = true; @@ -48,6 +48,13 @@ static ActivityExtensionsTest() ActivitySource.AddActivityListener(listener); } + [Fact] + public void OtlpExporter_BadArgs() + { + TracerProviderBuilder builder = null; + Assert.Throws(() => builder.UseOtlpExporter()); + } + [Fact] public void ToOtlpResourceSpansTest() { diff --git a/test/OpenTelemetry.Exporter.ZPages.Tests/ZPagesExporterTests.cs b/test/OpenTelemetry.Exporter.ZPages.Tests/ZPagesExporterTests.cs index d4191bf1af3..1eabc86b454 100644 --- a/test/OpenTelemetry.Exporter.ZPages.Tests/ZPagesExporterTests.cs +++ b/test/OpenTelemetry.Exporter.ZPages.Tests/ZPagesExporterTests.cs @@ -21,6 +21,7 @@ using System.Threading; using System.Threading.Tasks; using OpenTelemetry; +using OpenTelemetry.Exporter.ZPages.Implementation; using OpenTelemetry.Resources; using OpenTelemetry.Trace; @@ -45,6 +46,13 @@ static ZPagesExporterTests() ActivitySource.AddActivityListener(listener); } + [Fact] + public void ZPagesExporter_BadArgs() + { + TracerProviderBuilder builder = null; + Assert.Throws(() => builder.UseZPagesExporter()); + } + [Fact] public async Task ZPagesExporter_Integration() { @@ -93,6 +101,77 @@ public void ZPagesExporter_CustomActivityProcessor() Assert.True(endCalled); } + [Fact] + public void ZPagesExporter_CheckingCustomOptions() + { + ZPagesExporterOptions options = new ZPagesExporterOptions + { + RetentionTime = 100_000, + Url = "http://localhost:7284/rpcz/", + }; + + ZPagesExporter exporter = new ZPagesExporter(options); + + Assert.Equal(options.Url, exporter.Options.Url); + Assert.Equal(options.RetentionTime, exporter.Options.RetentionTime); + } + + [Fact] + public void ZPagesExporter_ZPagesProcessor() + { + const string ActivitySourceName = "zpages.test"; + Guid requestId = Guid.NewGuid(); + ZPagesExporterOptions options = new ZPagesExporterOptions + { + RetentionTime = 100_000, + Url = "http://localhost:7284/rpcz/", + }; + ZPagesExporter exporter = new ZPagesExporter(options); + var zpagesProcessor = new ZPagesProcessor(exporter); + + var openTelemetrySdk = Sdk.CreateTracerProvider(b => b + .AddActivitySource(ActivitySourceName) + .UseZPagesExporter( + processorConfigure: p => p.AddProcessor((next) => zpagesProcessor))); + + var source = new ActivitySource(ActivitySourceName); + var activity0 = source.StartActivity("Test Zipkin Activity"); + + // checking size of dictionaries from ZPagesActivityTracker + Assert.Equal(1, ZPagesActivityTracker.ProcessingList.First().Value); + Assert.Equal(1, ZPagesActivityTracker.TotalCount.First().Value); + Assert.Single(ZPagesActivityTracker.TotalEndedCount); + Assert.Single(ZPagesActivityTracker.TotalErrorCount); + Assert.Single(ZPagesActivityTracker.TotalLatency); + + var activity1 = source.StartActivity("Test Zipkin Activity"); + + // checking size of dictionaries from ZPagesActivityTracker + Assert.Equal(2, ZPagesActivityTracker.ProcessingList.First().Value); + Assert.Equal(2, ZPagesActivityTracker.TotalCount.First().Value); + Assert.Single(ZPagesActivityTracker.TotalEndedCount); + Assert.Single(ZPagesActivityTracker.TotalErrorCount); + Assert.Single(ZPagesActivityTracker.TotalLatency); + + var activity2 = source.StartActivity("Test Zipkin Activity 2"); + + // checking size of dictionaries from ZPagesActivityTracker + Assert.Equal(2, ZPagesActivityTracker.ProcessingList.Count); + Assert.Equal(2, ZPagesActivityTracker.TotalCount.Count); + Assert.Equal(2, ZPagesActivityTracker.TotalEndedCount.Count); + Assert.Equal(2, ZPagesActivityTracker.TotalErrorCount.Count); + Assert.Equal(2, ZPagesActivityTracker.TotalLatency.Count); + + activity0?.Stop(); + activity1?.Stop(); + activity2?.Stop(); + + // checking if activities were processed + Assert.Equal(0, ZPagesActivityTracker.ProcessingList.First().Value); + Assert.Equal(0, ZPagesActivityTracker.ProcessingList.Last().Value); + Assert.Empty(ZPagesActivityTracker.ZQueue); + } + internal static Activity CreateTestActivity( bool setAttributes = true, Dictionary additionalAttributes = null, diff --git a/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs b/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs index 2b9a714569a..9d1b03b89bd 100644 --- a/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs +++ b/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs @@ -84,6 +84,13 @@ public void Dispose() this.testServer.Dispose(); } + [Fact] + public void ZipkinExporter_BadArgs() + { + TracerProviderBuilder builder = null; + Assert.Throws(() => builder.UseZipkinExporter()); + } + [Theory] [InlineData(true)] [InlineData(false)] diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs index 56f8e87fda8..7f42ab750c1 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs @@ -89,7 +89,7 @@ public void AddOpenTelemetry_ServiceProviderArgument_ServicesRegistered() services.AddSingleton(testInstrumentation); services.AddOpenTelemetry((provider, builder) => { - builder.AddInstrumentation((activitySource) => provider.GetRequiredService()); + builder.AddInstrumentation((activitySource) => provider.GetRequiredService()); }); var serviceProvider = services.BuildServiceProvider(); @@ -104,6 +104,18 @@ public void AddOpenTelemetry_ServiceProviderArgument_ServicesRegistered() Assert.True(testInstrumentation.Disposed); } + [Fact] + public void AddOpenTelemetry_BadArgs() + { + ServiceCollection services = null; + Assert.Throws(() => services.AddOpenTelemetry()); + Assert.Throws(() => + services.AddOpenTelemetry((provider, builder) => + { + builder.AddInstrumentation((activitySource) => provider.GetRequiredService()); + })); + } + internal class TestInstrumentation : IDisposable { public bool Disposed { get; private set; } diff --git a/test/OpenTelemetry.Instrumentation.GrpcClient.Tests/GrpcClientTests.cs b/test/OpenTelemetry.Instrumentation.GrpcClient.Tests/GrpcClientTests.cs index c3e7068c9e9..10732bccff0 100644 --- a/test/OpenTelemetry.Instrumentation.GrpcClient.Tests/GrpcClientTests.cs +++ b/test/OpenTelemetry.Instrumentation.GrpcClient.Tests/GrpcClientTests.cs @@ -125,5 +125,12 @@ public void GrpcAndHttpClientInstrumentationIsInvoked() Assert.Equal($"HTTP POST", httpSpan.DisplayName); Assert.Equal(grpcSpan.SpanId, httpSpan.ParentSpanId); } + + [Fact] + public void Grpc_BadArgs() + { + TracerProviderBuilder builder = null; + Assert.Throws(() => builder.AddGrpcClientInstrumentation()); + } } } diff --git a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientInstrumentationOptionsTests.cs b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientInstrumentationOptionsTests.cs index daf708e2f57..3e79ffe0b6c 100644 --- a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientInstrumentationOptionsTests.cs +++ b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientInstrumentationOptionsTests.cs @@ -14,12 +14,31 @@ // limitations under the License. // +using System.Diagnostics; +using System.Linq; +using Moq; +using OpenTelemetry.Trace; using Xunit; namespace OpenTelemetry.Instrumentation.SqlClient.Tests { public class SqlClientInstrumentationOptionsTests { + static SqlClientInstrumentationOptionsTests() + { + Activity.DefaultIdFormat = ActivityIdFormat.W3C; + Activity.ForceDefaultIdFormat = true; + + var listener = new ActivityListener + { + ShouldListenTo = _ => true, + GetRequestedDataUsingParentId = (ref ActivityCreationOptions options) => ActivityDataRequest.AllData, + GetRequestedDataUsingContext = (ref ActivityCreationOptions options) => ActivityDataRequest.AllData, + }; + + ActivitySource.AddActivityListener(listener); + } + [Theory] [InlineData("localhost", "localhost", null, null, null)] [InlineData("127.0.0.1", null, "127.0.0.1", null, null)] @@ -42,5 +61,41 @@ public void ParseDataSourceTests( Assert.Equal(expectedInstanceName, sqlConnectionDetails.InstanceName); Assert.Equal(expectedPort, sqlConnectionDetails.Port); } + + [Theory] + [InlineData(true, "localhost", "localhost", null, null, null)] + [InlineData(true, "127.0.0.1,1433", null, "127.0.0.1", null, null)] + [InlineData(true, "127.0.0.1,1434", null, "127.0.0.1", null, "1434")] + [InlineData(true, "127.0.0.1\\instanceName, 1818", null, "127.0.0.1", "instanceName", "1818")] + [InlineData(false, "localhost", "localhost", null, null, null)] + public void SqlClientInstrumentationOptions_EnableConnectionLevelAttributes( + bool enableConnectionLevelAttributes, + string dataSource, + string expectedServerHostName, + string expectedServerIpAddress, + string expectedInstanceName, + string expectedPort) + { + var source = new ActivitySource("sql-client-instrumentation"); + var activity = source.StartActivity("Test Sql Activity"); + var options = new SqlClientInstrumentationOptions + { + EnableConnectionLevelAttributes = enableConnectionLevelAttributes, + }; + options.AddConnectionLevelDetailsToActivity(dataSource, activity); + + if (!enableConnectionLevelAttributes) + { + Assert.Equal(expectedServerHostName, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributePeerService).Value); + } + else + { + Assert.Equal(expectedServerHostName, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeNetPeerName).Value); + } + + Assert.Equal(expectedServerIpAddress, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeNetPeerIp).Value); + Assert.Equal(expectedInstanceName, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeDbMsSqlInstanceName).Value); + Assert.Equal(expectedPort, activity.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeNetPeerPort).Value); + } } } diff --git a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTests.cs b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTests.cs index e45eabb0987..5b37637f968 100644 --- a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTests.cs +++ b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlClientTests.cs @@ -59,6 +59,13 @@ public void Dispose() this.fakeSqlClientDiagnosticSource.Dispose(); } + [Fact] + public void SqlClient_BadArgs() + { + TracerProviderBuilder builder = null; + Assert.Throws(() => builder.AddSqlClientInstrumentation()); + } + [Trait("CategoryName", "SqlIntegrationTests")] [SkipUnlessEnvVarFoundTheory(SqlConnectionStringEnvVarName)] [InlineData(CommandType.Text, "select 1/1", false)] @@ -79,7 +86,7 @@ public void SuccessfulCommandTest( using var shutdownSignal = Sdk.CreateTracerProvider(b => { b.AddProcessorPipeline(c => c.AddProcessor(ap => activityProcessor.Object)); - b.AddSqlClientDependencyInstrumentation(options => + b.AddSqlClientInstrumentation(options => { options.SetStoredProcedureCommandName = captureStoredProcedureCommandName; options.SetTextCommandContent = captureTextCommandContent; @@ -132,7 +139,7 @@ public void SqlClientCallsAreCollectedSuccessfully( var spanProcessor = new Mock(); using (Sdk.CreateTracerProvider( - (builder) => builder.AddSqlClientDependencyInstrumentation( + (builder) => builder.AddSqlClientInstrumentation( (opt) => { opt.SetTextCommandContent = captureTextCommandContent; @@ -182,7 +189,7 @@ public void SqlClientErrorsAreCollectedSuccessfully(string beforeCommand, string var spanProcessor = new Mock(); using (Sdk.CreateTracerProvider( - (builder) => builder.AddSqlClientDependencyInstrumentation() + (builder) => builder.AddSqlClientInstrumentation() .AddProcessorPipeline(p => p.AddProcessor(n => spanProcessor.Object)))) { var operationId = Guid.NewGuid(); diff --git a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs index 3633a171184..1ee8662f510 100644 --- a/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs +++ b/test/OpenTelemetry.Instrumentation.SqlClient.Tests/SqlEventSourceTests.netfx.cs @@ -55,7 +55,7 @@ public async Task SuccessfulCommandTest(CommandType commandType, string commandT using var shutdownSignal = Sdk.CreateTracerProvider(b => { b.AddProcessorPipeline(c => c.AddProcessor(ap => activityProcessor.Object)); - b.AddSqlClientDependencyInstrumentation(options => + b.AddSqlClientInstrumentation(options => { options.SetStoredProcedureCommandName = captureText; }); @@ -108,7 +108,7 @@ public void EventSourceFakeTests( using var shutdownSignal = Sdk.CreateTracerProvider(b => { b.AddProcessorPipeline(c => c.AddProcessor(ap => activityProcessor.Object)); - b.AddSqlClientDependencyInstrumentation(options => + b.AddSqlClientInstrumentation(options => { options.SetStoredProcedureCommandName = captureText; options.EnableConnectionLevelAttributes = enableConnectionLevelAttributes; @@ -148,7 +148,7 @@ public void EventSourceFakeUnknownEventWithNullPayloadTest() using var shutdownSignal = Sdk.CreateTracerProvider(b => { b.AddProcessorPipeline(c => c.AddProcessor(ap => activityProcessor.Object)); - b.AddSqlClientDependencyInstrumentation(); + b.AddSqlClientInstrumentation(); }); fakeSqlEventSource.WriteUnknownEventWithNullPayload(); @@ -165,7 +165,7 @@ public void EventSourceFakeInvalidPayloadTest() using var shutdownSignal = Sdk.CreateTracerProvider(b => { b.AddProcessorPipeline(c => c.AddProcessor(ap => activityProcessor.Object)); - b.AddSqlClientDependencyInstrumentation(); + b.AddSqlClientInstrumentation(); }); fakeSqlEventSource.WriteBeginExecuteEvent("arg1"); diff --git a/test/OpenTelemetry.Instrumentation.StackExchangeRedis.Tests/StackExchangeRedisCallsInstrumentationTests.cs b/test/OpenTelemetry.Instrumentation.StackExchangeRedis.Tests/StackExchangeRedisCallsInstrumentationTests.cs index 33309ef346a..00d1b0e8bb6 100644 --- a/test/OpenTelemetry.Instrumentation.StackExchangeRedis.Tests/StackExchangeRedisCallsInstrumentationTests.cs +++ b/test/OpenTelemetry.Instrumentation.StackExchangeRedis.Tests/StackExchangeRedisCallsInstrumentationTests.cs @@ -102,6 +102,21 @@ public async void ProfilerSessionUsesTheSameDefault() Assert.Equal(second, third); } + [Fact] + public void StackExchangeRedis_BadArgs() + { + TracerProviderBuilder builder = null; + Assert.Throws(() => builder.AddRedisInstrumentation(null)); + + var activityProcessor = new Mock(); + Assert.Throws(() => + Sdk.CreateTracerProvider(b => + { + b.AddProcessorPipeline(c => c.AddProcessor(ap => activityProcessor.Object)); + b.AddRedisInstrumentation(null); + })); + } + private static void VerifyActivityData(Activity activity, bool isSet, EndPoint endPoint) { if (isSet)