From 3729a3035384470f6951dcb04d06fd15861e72ee Mon Sep 17 00:00:00 2001 From: Mike Minutillo Date: Wed, 14 Jul 2021 13:51:56 +0800 Subject: [PATCH 1/2] Add test to expose issue --- ...eControl.Monitoring.AcceptanceTests.csproj | 1 + .../TestSupport/ContextLoggerExtensions.cs | 80 +++++++++++++++++++ .../ServiceControlComponentRunner.cs | 2 + .../When_sending_legacy_metric_report.cs | 43 ++++++++++ 4 files changed, 126 insertions(+) create mode 100644 src/ServiceControl.Monitoring.AcceptanceTests/TestSupport/ContextLoggerExtensions.cs create mode 100644 src/ServiceControl.Monitoring.AcceptanceTests/Tests/When_sending_legacy_metric_report.cs diff --git a/src/ServiceControl.Monitoring.AcceptanceTests/ServiceControl.Monitoring.AcceptanceTests.csproj b/src/ServiceControl.Monitoring.AcceptanceTests/ServiceControl.Monitoring.AcceptanceTests.csproj index d2f2781649..c8729675f8 100644 --- a/src/ServiceControl.Monitoring.AcceptanceTests/ServiceControl.Monitoring.AcceptanceTests.csproj +++ b/src/ServiceControl.Monitoring.AcceptanceTests/ServiceControl.Monitoring.AcceptanceTests.csproj @@ -2,6 +2,7 @@ net472 + 8 diff --git a/src/ServiceControl.Monitoring.AcceptanceTests/TestSupport/ContextLoggerExtensions.cs b/src/ServiceControl.Monitoring.AcceptanceTests/TestSupport/ContextLoggerExtensions.cs new file mode 100644 index 0000000000..42190df75c --- /dev/null +++ b/src/ServiceControl.Monitoring.AcceptanceTests/TestSupport/ContextLoggerExtensions.cs @@ -0,0 +1,80 @@ +namespace ServiceControl.Monitoring.AcceptanceTests.TestSupport +{ + using System; + using System.Collections.Concurrent; + using Microsoft.Extensions.DependencyInjection; + using Microsoft.Extensions.DependencyInjection.Extensions; + using Microsoft.Extensions.Logging; + using NServiceBus.AcceptanceTesting; + + static class ContextLoggerExtensions + { + public static ILoggingBuilder AddScenarioContextLogging(this ILoggingBuilder builder) + { + builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton()); + return builder; + } + + class ContextLoggerProvider : ILoggerProvider + { + ConcurrentDictionary loggers = new ConcurrentDictionary(); + ScenarioContext context; + + public ContextLoggerProvider(ScenarioContext context) + { + this.context = context; + } + + public void Dispose() => loggers.Clear(); + + public ILogger CreateLogger(string categoryName) => + loggers.GetOrAdd(categoryName, name => new ContextLogger(name, context)); + } + + class ContextLogger : ILogger + { + string categoryName; + ScenarioContext context; + + public ContextLogger(string categoryName, ScenarioContext context) + { + this.categoryName = categoryName; + this.context = context; + } + + public void Log(LogLevel logLevel, EventId eventId, TState state, + Exception exception, Func formatter) => + context.Logs.Enqueue(new ScenarioContext.LogItem + { + LoggerName = categoryName, + Message = formatter(state, exception), + Level = ConvertLogLevel(logLevel) + }); + + NServiceBus.Logging.LogLevel ConvertLogLevel(LogLevel level) + => level switch + { + LogLevel.Critical => NServiceBus.Logging.LogLevel.Fatal, + LogLevel.Trace => NServiceBus.Logging.LogLevel.Debug, + LogLevel.Debug => NServiceBus.Logging.LogLevel.Debug, + LogLevel.Information => NServiceBus.Logging.LogLevel.Info, + LogLevel.Warning => NServiceBus.Logging.LogLevel.Warn, + LogLevel.Error => NServiceBus.Logging.LogLevel.Error, + LogLevel.None => NServiceBus.Logging.LogLevel.Debug, + _ => throw new ArgumentOutOfRangeException(nameof(level), level, null) + }; + + public bool IsEnabled(LogLevel logLevel) => + ConvertLogLevel(logLevel) <= context.LogLevel; + + public IDisposable BeginScope(TState state) => NullScope.Instance; + + class NullScope : IDisposable + { + public void Dispose() { } + + public static NullScope Instance { get; } = new NullScope(); + } + } + } +} \ No newline at end of file diff --git a/src/ServiceControl.Monitoring.AcceptanceTests/TestSupport/ServiceControlComponentRunner.cs b/src/ServiceControl.Monitoring.AcceptanceTests/TestSupport/ServiceControlComponentRunner.cs index f534641db0..cc6b6859b0 100644 --- a/src/ServiceControl.Monitoring.AcceptanceTests/TestSupport/ServiceControlComponentRunner.cs +++ b/src/ServiceControl.Monitoring.AcceptanceTests/TestSupport/ServiceControlComponentRunner.cs @@ -153,6 +153,8 @@ async Task InitializeServiceControl(ScenarioContext context) ctx.Stop().GetAwaiter().GetResult(); }, settings, configuration); + bootstrapper.HostBuilder.ConfigureLogging(logging => logging.AddScenarioContextLogging()); + host = bootstrapper.HostBuilder.Build(); await host.StartAsync(); } diff --git a/src/ServiceControl.Monitoring.AcceptanceTests/Tests/When_sending_legacy_metric_report.cs b/src/ServiceControl.Monitoring.AcceptanceTests/Tests/When_sending_legacy_metric_report.cs new file mode 100644 index 0000000000..f7ba42e0ae --- /dev/null +++ b/src/ServiceControl.Monitoring.AcceptanceTests/Tests/When_sending_legacy_metric_report.cs @@ -0,0 +1,43 @@ +namespace ServiceControl.Monitoring.AcceptanceTests.Tests +{ + using System.Linq; + using System.Threading.Tasks; + using Infrastructure; + using NServiceBus; + using NServiceBus.AcceptanceTesting; + using NServiceBus.Metrics; + using NUnit.Framework; + using TestSupport.EndpointTemplates; + + class When_sending_legacy_metric_report : AcceptanceTest + { + [Test] + public async Task Should_report_legacy_queue_length_reporting() + { + await Define() + .WithEndpoint(b => + b.When(session => + { + var sendOptions = new SendOptions(); + sendOptions.SetDestination(Settings.DEFAULT_ENDPOINT_NAME); + sendOptions.SetHeader(MetricHeaders.MetricInstanceId, "MetricInstanceId"); + return session.Send(new MetricReport(), sendOptions); + })) + .Done(ctx => ctx.Logs.Any(x => x.Message == "Legacy queue length report received from MetricInstanceId instance of SendingLegacyMetricReport.EndpointSendingLegacyMetricReport")) + .Run(); + } + + class EndpointSendingLegacyMetricReport : EndpointConfigurationBuilder + { + public EndpointSendingLegacyMetricReport() + { + EndpointSetup(); + } + } + + class SomeContext : ScenarioContext + { + + } + } +} \ No newline at end of file From 2cab747ab5b47b4baa85d81f0ab082268e0072b1 Mon Sep 17 00:00:00 2001 From: Mike Minutillo Date: Wed, 14 Jul 2021 13:52:26 +0800 Subject: [PATCH 2/2] Add missing dependency --- src/ServiceControl.Monitoring/Bootstrapper.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ServiceControl.Monitoring/Bootstrapper.cs b/src/ServiceControl.Monitoring/Bootstrapper.cs index 401bf6eb53..2c6b52a6fc 100644 --- a/src/ServiceControl.Monitoring/Bootstrapper.cs +++ b/src/ServiceControl.Monitoring/Bootstrapper.cs @@ -56,6 +56,7 @@ void CreateHost() services.AddSingleton(); services.AddSingleton(); services.AddSingleton(sp => buildQueueLengthProvider(sp.GetRequiredService())); + services.AddSingleton(); }) .UseNServiceBus(builder => {