Skip to content

Commit f49dcf6

Browse files
committed
wip
1 parent 96f3b32 commit f49dcf6

File tree

12 files changed

+145
-58
lines changed

12 files changed

+145
-58
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Microsoft.Extensions.Configuration;
4+
using ConfigurationManager = System.Configuration.ConfigurationManager;
5+
6+
public class LegacyAppSettingsConfigurationProvider : ConfigurationProvider
7+
{
8+
public override void Load()
9+
{
10+
var data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
11+
12+
foreach (var key in ConfigurationManager.AppSettings.AllKeys)
13+
{
14+
if (key is null)
15+
{
16+
continue;
17+
}
18+
19+
var normalizedKey = key.Replace('/', ':');
20+
data[normalizedKey] = ConfigurationManager.AppSettings[key];
21+
}
22+
23+
Data = data;
24+
}
25+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using Microsoft.Extensions.Configuration;
2+
3+
public class LegacyAppSettingsConfigurationSource : IConfigurationSource
4+
{
5+
public IConfigurationProvider Build(IConfigurationBuilder builder) =>
6+
new LegacyAppSettingsConfigurationProvider();
7+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Microsoft.Extensions.Configuration;
2+
3+
public static class LegacyAppSettingsExtensions
4+
{
5+
public static IConfigurationBuilder AddLegacyAppSettings(this IConfigurationBuilder builder)
6+
{
7+
builder.Add(new LegacyAppSettingsConfigurationSource());
8+
return builder;
9+
}
10+
}

src/ServiceControl.Configuration/ServiceControl.Configuration.csproj

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,13 @@
1010
<PackageReference Include="System.Configuration.ConfigurationManager" />
1111
</ItemGroup>
1212

13+
<ItemGroup>
14+
<Reference Include="Microsoft.Extensions.Configuration">
15+
<HintPath>..\..\..\..\.nuget\packages\microsoft.extensions.configuration\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.dll</HintPath>
16+
</Reference>
17+
<Reference Include="Microsoft.Extensions.Configuration.Abstractions">
18+
<HintPath>..\..\..\..\.nuget\packages\microsoft.extensions.configuration.abstractions\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
19+
</Reference>
20+
</ItemGroup>
21+
1322
</Project>

src/ServiceControl.Configuration/SettingsReader.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
namespace ServiceControl.Configuration;
22

3+
using System;
34
using System.Diagnostics.CodeAnalysis;
45
using System.Runtime.InteropServices;
56

7+
[Obsolete("Use the new ConfigurationBinder instead.", false)]
68
public static class SettingsReader
79
{
10+
[Obsolete("Use the new ConfigurationBinder instead.", false)]
811
public static T Read<T>(SettingsRootNamespace settingsNamespace, string name, T defaultValue = default)
912
=> TryRead<T>(settingsNamespace, name, out var value) ? value : defaultValue;
1013

14+
[Obsolete("Use the new ConfigurationBinder instead.", false)]
1115
public static bool TryRead<T>(SettingsRootNamespace settingsNamespace, string name, [NotNullWhen(true)] out T value)
1216
{
1317
if (EnvironmentVariableSettingsReader.TryRead<T>(settingsNamespace, name, out var envValue))

src/ServiceControl.Infrastructure/LoggingSettings.cs

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,46 @@ namespace ServiceControl.Infrastructure;
33
using System;
44
using System.Collections.Generic;
55
using System.IO;
6-
using System.Linq;
76
using Microsoft.Extensions.Logging;
8-
using ServiceControl.Configuration;
97

108
public class LoggingSettings
119
{
12-
public LoggingSettings(SettingsRootNamespace rootNamespace, LogLevel defaultLevel = LogLevel.Information, string logPath = null)
10+
public LoggingSettings(
11+
LoggingOptions options,
12+
LogLevel defaultLevel = LogLevel.Information,
13+
string logPath = null
14+
)
1315
{
14-
var loggingProviders = (SettingsReader.Read<string>(rootNamespace, loggingProvidersKey) ?? "").Split(",");
1516
var activeLoggers = Loggers.None;
16-
if (loggingProviders.Contains("NLog"))
17+
if (options.LoggingProviders.Contains("NLog"))
1718
{
1819
activeLoggers |= Loggers.NLog;
1920
}
20-
if (loggingProviders.Contains("Seq"))
21+
if (options.LoggingProviders.Contains("Seq"))
2122
{
2223
activeLoggers |= Loggers.Seq;
23-
var seqAddress = SettingsReader.Read<string>(rootNamespace, seqAddressKey);
24-
if (!string.IsNullOrWhiteSpace(seqAddress))
24+
if (!string.IsNullOrWhiteSpace(options.SeqAddress))
2525
{
26-
LoggerUtil.SeqAddress = seqAddress;
26+
LoggerUtil.SeqAddress = options.SeqAddress;
2727
}
2828
}
29-
if (loggingProviders.Contains("Otlp"))
29+
if (options.LoggingProviders.Contains("Otlp"))
3030
{
3131
activeLoggers |= Loggers.Otlp;
3232
}
3333
//this defaults to NLog because historically that was the default, and we don't want to break existing installs that don't have the config key to define loggingProviders
3434
LoggerUtil.ActiveLoggers = activeLoggers == Loggers.None ? Loggers.NLog : activeLoggers;
3535

36-
LogLevel = InitializeLogLevel(rootNamespace, defaultLevel);
37-
LogPath = SettingsReader.Read(rootNamespace, logPathKey, Environment.ExpandEnvironmentVariables(logPath ?? DefaultLogLocation()));
36+
LogLevel = InitializeLogLevel(options.LogLevel, defaultLevel);
37+
LogPath = Environment.ExpandEnvironmentVariables(options.LogPath ?? DefaultLogLocation());
3838
}
3939

4040
public LogLevel LogLevel { get; }
4141

4242
public string LogPath { get; }
4343

44-
static LogLevel InitializeLogLevel(SettingsRootNamespace rootNamespace, LogLevel defaultLevel)
44+
static LogLevel InitializeLogLevel(string levelText, LogLevel defaultLevel)
4545
{
46-
var levelText = SettingsReader.Read<string>(rootNamespace, logLevelKey);
47-
4846
if (string.IsNullOrWhiteSpace(levelText))
4947
{
5048
return defaultLevel;
@@ -79,13 +77,16 @@ static LogLevel ParseLogLevel(string value, LogLevel defaultLevel)
7977
return parsedLevel;
8078
}
8179

82-
LoggerUtil.CreateStaticLogger<LoggingSettings>().LogWarning("Failed to parse {LogLevelKey} setting. Defaulting to {DefaultLevel}", logLevelKey, defaultLevel);
80+
LoggerUtil.CreateStaticLogger<LoggingSettings>().LogWarning("Failed to parse {LogLevelKey} setting. Defaulting to {DefaultLevel}", nameof(LoggingOptions.LogLevel), defaultLevel);
8381

8482
return defaultLevel;
8583
}
84+
}
8685

87-
const string logLevelKey = "LogLevel";
88-
const string logPathKey = "LogPath";
89-
const string loggingProvidersKey = "LoggingProviders";
90-
const string seqAddressKey = "SeqAddress";
86+
public record LoggingOptions
87+
{
88+
public string LogLevel { get; set; }
89+
public string LogPath { get; set; }
90+
public string LoggingProviders { get; set; }
91+
public string SeqAddress {get; set;}
9192
}

src/ServiceControl.Monitoring.AcceptanceTests/PerformanceTests.cs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Infrastructure;
1111
using Infrastructure.Api;
1212
using Messaging;
13+
using Microsoft.Extensions.Logging.Abstractions;
1314
using NUnit.Framework;
1415
using QueueLength;
1516
using Timings;
@@ -26,17 +27,18 @@ class PerformanceTests : AcceptanceTest
2627
retriesStore = new RetriesStore();
2728
queueLengthStore = new QueueLengthStore();
2829

29-
var settings = new Settings(transportType: "Unknown") { EndpointUptimeGracePeriod = TimeSpan.FromMinutes(5) };
30+
var settings = new Settings
31+
{
32+
TransportType = "Unknown",
33+
EndpointUptimeGracePeriod = TimeSpan.FromMinutes(5)
34+
};
3035
activityTracker = new EndpointInstanceActivityTracker(settings, TimeProvider.System);
3136

3237
messageTypeRegistry = new MessageTypeRegistry();
3338

3439
var breakdownProviders = new IProvideBreakdown[]
3540
{
36-
criticalTimeStore,
37-
processingTimeStore,
38-
retriesStore,
39-
queueLengthStore
41+
criticalTimeStore, processingTimeStore, retriesStore, queueLengthStore
4042
};
4143

4244
var endpointMetricsApi = new EndpointMetricsApi(breakdownProviders, endpointRegistry, activityTracker,
@@ -64,9 +66,7 @@ public async Task GetMonitoredEndpointsQueryTest(int numberOfEndpoints, int numb
6466
var reporters =
6567
new[]
6668
{
67-
BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => criticalTimeStore.Store(e, i, EndpointMessageType.Unknown(i.EndpointName))),
68-
BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => processingTimeStore.Store(e, i, EndpointMessageType.Unknown(i.EndpointName))),
69-
BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => retriesStore.Store(e, i, EndpointMessageType.Unknown(i.EndpointName)))
69+
BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => criticalTimeStore.Store(e, i, EndpointMessageType.Unknown(i.EndpointName))), BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => processingTimeStore.Store(e, i, EndpointMessageType.Unknown(i.EndpointName))), BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => retriesStore.Store(e, i, EndpointMessageType.Unknown(i.EndpointName)))
7070
}.SelectMany(i => i).ToArray();
7171

7272
var histogram = CreateTimeHistogram();
@@ -123,9 +123,7 @@ public async Task GetMonitoredSingleEndpointQueryTest(int numberOfInstances, int
123123
var reporters =
124124
new[]
125125
{
126-
BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => criticalTimeStore.Store(e, i, getter())),
127-
BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => processingTimeStore.Store(e, i, getter())),
128-
BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => retriesStore.Store(e, i, getter()))
126+
BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => criticalTimeStore.Store(e, i, getter())), BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => processingTimeStore.Store(e, i, getter())), BuildReporters(sendReportEvery, numberOfEntriesInReport, instances, source, (e, i) => retriesStore.Store(e, i, getter()))
129127
}.SelectMany(i => i).ToArray();
130128

131129
var histogram = CreateTimeHistogram();

src/ServiceControl.Monitoring.AcceptanceTests/TestSupport/ServiceControlComponentRunner.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ class ServiceControlComponentRunner(
3535
async Task InitializeServiceControl(ScenarioContext context)
3636
{
3737
LoggerUtil.ActiveLoggers = Loggers.Test;
38-
settings = new Settings(transportType: transportToUse.TypeName)
38+
settings = new Settings
3939
{
40+
TransportType = transportToUse.TypeName,
4041
ConnectionString = transportToUse.ConnectionString,
4142
HttpHostName = "localhost",
4243
OnMessage = (id, headers, body, @continue) =>

src/ServiceControl.Monitoring/HostApplicationBuilderExtensions.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,16 @@ namespace ServiceControl.Monitoring;
2626

2727
public static class HostApplicationBuilderExtensions
2828
{
29-
public static void AddServiceControlMonitoring(this IHostApplicationBuilder hostBuilder,
30-
Func<ICriticalErrorContext, CancellationToken, Task> onCriticalError, Settings settings,
31-
EndpointConfiguration endpointConfiguration)
29+
public static void AddServiceControlMonitoring(
30+
this IHostApplicationBuilder hostBuilder,
31+
Func<ICriticalErrorContext, CancellationToken, Task> onCriticalError,
32+
Settings settings,
33+
EndpointConfiguration endpointConfiguration
34+
)
3235
{
36+
var section = hostBuilder.Configuration.GetSection(Settings.SectionName);
37+
//hostBuilder.Services.ConfigureOptions<MonitoringOptionsSetup>();
38+
3339
hostBuilder.Services.AddLogging();
3440
hostBuilder.Logging.ConfigureLogging(settings.LoggingSettings.LogLevel);
3541

src/ServiceControl.Monitoring/Hosting/Commands/RunCommand.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
namespace ServiceControl.Monitoring
22
{
33
using System.Threading.Tasks;
4+
using Configuration;
45
using Infrastructure;
56
using Infrastructure.WebApi;
67
using Microsoft.AspNetCore.Builder;
8+
using Microsoft.Extensions.Configuration;
9+
using Microsoft.Extensions.DependencyInjection;
710
using NServiceBus;
811

912
class RunCommand : AbstractCommand
@@ -13,6 +16,8 @@ public override async Task Execute(HostArguments args, Settings settings)
1316
var endpointConfiguration = new EndpointConfiguration(settings.InstanceName);
1417

1518
var hostBuilder = WebApplication.CreateBuilder();
19+
hostBuilder.Configuration.AddLegacyAppSettings();
20+
1621
hostBuilder.AddServiceControlMonitoring((_, __) => Task.CompletedTask, settings, endpointConfiguration);
1722
hostBuilder.AddServiceControlMonitoringApi();
1823

0 commit comments

Comments
 (0)