diff --git a/src/OpenTelemetry/Metrics/MeterProviderSdk.cs b/src/OpenTelemetry/Metrics/MeterProviderSdk.cs index d3e61961e5c..017841d5e47 100644 --- a/src/OpenTelemetry/Metrics/MeterProviderSdk.cs +++ b/src/OpenTelemetry/Metrics/MeterProviderSdk.cs @@ -52,6 +52,11 @@ internal MeterProviderSdk( AggregationTemporality temporality = AggregationTemporality.Cumulative; + if (meterSources.Count() == 0) + { + throw new ArgumentException("No meter was added to the sdk."); + } + foreach (var reader in readers) { if (reader == null) @@ -94,7 +99,7 @@ internal MeterProviderSdk( var regex = GetWildcardRegex(meterSources); shouldListenTo = instrument => regex.IsMatch(instrument.Meter.Name); } - else if (meterSources.Any()) + else { var meterSourcesToSubscribe = new HashSet(StringComparer.OrdinalIgnoreCase); foreach (var meterSource in meterSources) diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs index 1c02b6eb14b..749079623b6 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs @@ -37,7 +37,9 @@ public async Task AddOpenTelemetryMeterProviderInstrumentationCreationAndDisposa { services.AddOpenTelemetryMetrics(builder => { - builder.AddInstrumentation(() => + builder + .AddMeter("SomeCompany.SomeProduct.SomeComponent") + .AddInstrumentation(() => { callbackRun = true; return testInstrumentation; @@ -71,7 +73,7 @@ public void AddOpenTelemetryMeterProvider_HostBuilt_OpenTelemetrySdk_RegisteredA { var builder = new HostBuilder().ConfigureServices(services => { - services.AddOpenTelemetryMetrics(); + services.AddOpenTelemetryMetrics(meterSdk => meterSdk.AddMeter("SomeCompany.SomeProduct.SomeComponent")); }); var host = builder.Build(); @@ -91,8 +93,10 @@ public void AddOpenTelemetryMeterProvider_ServiceProviderArgument_ServicesRegist services.AddSingleton(testInstrumentation); services.AddOpenTelemetryMetrics(builder => { - builder.Configure( - (sp, b) => b.AddInstrumentation(() => sp.GetRequiredService())); + builder + .AddMeter("SomeCompany.SomeProduct.SomeComponent") + .Configure( + (sp, b) => b.AddInstrumentation(() => sp.GetRequiredService())); }); var serviceProvider = services.BuildServiceProvider(); @@ -139,6 +143,7 @@ public void AddOpenTelemetryMeterProvider_NestedConfigureCallbacks() int configureCalls = 0; var services = new ServiceCollection(); services.AddOpenTelemetryMetrics(builder => builder + .AddMeter("SomeCompany.SomeProduct.SomeComponent") .Configure((sp1, builder1) => { configureCalls++; @@ -164,6 +169,7 @@ public void AddOpenTelemetryMeterProvider_ConfigureCallbacksUsingExtensions() services.AddSingleton(); services.AddOpenTelemetryMetrics(builder => builder + .AddMeter("SomeCompany.SomeProduct.SomeComponent") .Configure((sp1, builder1) => { builder1 @@ -214,7 +220,9 @@ private static MeterProviderBuilder AddMyFeature(MeterProviderBuilder meterProvi (meterProviderBuilder.GetServices() ?? throw new NotSupportedException("MyFeature requires a hosting MeterProviderBuilder instance.")) .AddSingleton(); - return meterProviderBuilder.AddReader(); + return meterProviderBuilder + .AddMeter("SomeCompany.SomeProject.SomeComponent") + .AddReader(); } internal class TestInstrumentation : IDisposable diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/MetricTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/MetricTests.cs index c37be430980..9079e89d2d1 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/MetricTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/MetricTests.cs @@ -69,6 +69,7 @@ void ProcessExport(Batch batch) }; this.meterProvider = Sdk.CreateMeterProviderBuilder() .AddAspNetCoreInstrumentation() + .AddMeter("SomeCompany.SomeProject.SomeComponent") .AddReader(metricReader) .Build(); diff --git a/test/OpenTelemetry.Tests/Metrics/MetricAPITest.cs b/test/OpenTelemetry.Tests/Metrics/MetricAPITest.cs index 08d45e032d4..7e64772d206 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricAPITest.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricAPITest.cs @@ -231,7 +231,7 @@ public void MeterSourcesWildcardSupportMatchTest(bool hasView) [Theory] [InlineData(true)] [InlineData(false)] - public void MeterSourcesWildcardSupportNegativeTestNoMeterAdded(bool hasView) + public void SdkCreationShouldThrowWithNoMeterAdded(bool hasView) { var meterNames = new[] { @@ -251,14 +251,8 @@ public void MeterSourcesWildcardSupportNegativeTestNoMeterAdded(bool hasView) meterProviderBuilder.AddView("gauge1", "renamed"); } - using var meterProvider = meterProviderBuilder.Build(); - var measurement = new Measurement(100, new("name", "apple"), new("color", "red")); - - meter1.CreateObservableGauge("myGauge1", () => measurement); - meter2.CreateObservableGauge("myGauge2", () => measurement); - - meterProvider.ForceFlush(MaxTimeToAllowForFlush); - Assert.True(exportedItems.Count == 0); + var ex = Assert.Throws(() => meterProviderBuilder.Build()); + Assert.Equal("No meter was added to the sdk.", ex.Message); } [Theory] diff --git a/test/OpenTelemetry.Tests/Metrics/MetricExporterTests.cs b/test/OpenTelemetry.Tests/Metrics/MetricExporterTests.cs index 6416551ed9b..8b3dbe598b4 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricExporterTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricExporterTests.cs @@ -45,6 +45,7 @@ public void FlushMetricExporterTest(ExportModes mode) var reader = new BaseExportingMetricReader(exporter); using var meterProvider = Sdk.CreateMeterProviderBuilder() .AddReader(reader) + .AddMeter("SomeCompany.someProduct.SomeComponent") .Build(); switch (mode)