Skip to content

Commit f8df41d

Browse files
committed
Migrate basic ServiceControl settings from app.config to appsettings.json
1 parent d254800 commit f8df41d

15 files changed

Lines changed: 205 additions & 27 deletions

src/Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<PackageVersion Include="HdrHistogram" Version="2.5.0" />
2020
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.17" />
2121
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.17" />
22+
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
2223
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
2324
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="8.0.2" />
2425
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#nullable enable
2+
3+
namespace ServiceControl.Configuration;
4+
5+
using System.Collections.Generic;
6+
using Microsoft.Extensions.Configuration;
7+
8+
public class AppConfigConfigurationProvider : ConfigurationProvider
9+
{
10+
public AppConfigConfigurationProvider(Dictionary<string, string[]> mappings)
11+
{
12+
foreach (var (msConfigurationExtensionKey, appConfigKeys) in mappings)
13+
{
14+
foreach (var appConfigKey in appConfigKeys)
15+
{
16+
var appConfigValue = System.Configuration.ConfigurationManager.AppSettings[appConfigKey];
17+
18+
if (appConfigValue is not null)
19+
{
20+
Data[msConfigurationExtensionKey] = appConfigValue;
21+
}
22+
}
23+
}
24+
}
25+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#nullable enable
2+
3+
namespace ServiceControl.Configuration;
4+
5+
using Microsoft.Extensions.Configuration;
6+
using System;
7+
using System.Collections.Generic;
8+
using System.Linq;
9+
10+
public class AppConfigConfigurationSource : IConfigurationSource
11+
{
12+
public IConfigurationProvider Build(IConfigurationBuilder builder)
13+
{
14+
var propertiesWithAttribute = from a in AppDomain.CurrentDomain.GetAssemblies()
15+
from t in a.GetTypes()
16+
from p in t.GetProperties()
17+
let attributes = p.GetCustomAttributes(typeof(AppConfigSettingAttribute), true)
18+
where attributes != null && attributes.Length > 0
19+
select new { Type = p, Attribute = attributes.Cast<AppConfigSettingAttribute>().Single() };
20+
21+
var mappings = new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase);
22+
23+
foreach (var property in propertiesWithAttribute)
24+
{
25+
var section = property.Type.DeclaringType!.Name.Replace("Options", "");
26+
var name = property.Type.Name;
27+
mappings[$"{section}:{name}"] = property.Attribute.Keys;
28+
}
29+
30+
return new AppConfigConfigurationProvider(mappings);
31+
}
32+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#nullable enable
2+
3+
namespace ServiceControl.Configuration;
4+
5+
using System;
6+
7+
[AttributeUsage(AttributeTargets.All)]
8+
public class AppConfigSettingAttribute(params string[] keys) : Attribute
9+
{
10+
public string[] Keys { get; } = keys;
11+
}

src/ServiceControl.Configuration/ServiceControl.Configuration.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10+
<PackageReference Include="Microsoft.Extensions.Configuration" />
1011
<PackageReference Include="System.Configuration.ConfigurationManager" />
1112
</ItemGroup>
1213

src/ServiceControl.UnitTests/API/APIApprovals.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@
1313
using Microsoft.AspNetCore.Mvc.Routing;
1414
using Microsoft.AspNetCore.Routing;
1515
using Microsoft.Extensions.Logging.Abstractions;
16+
using Microsoft.Extensions.Options;
1617
using NServiceBus.CustomChecks;
1718
using NUnit.Framework;
1819
using Particular.Approvals;
1920
using Particular.ServiceControl.Licensing;
2021
using ServiceBus.Management.Infrastructure.Settings;
2122
using ServiceControl.Infrastructure.Api;
23+
using ServiceControl.Infrastructure.Settings;
2224
using ServiceControl.Infrastructure.WebApi;
2325
using ServiceControl.Monitoring.HeartbeatMonitoring;
2426

@@ -31,9 +33,11 @@ public async Task RootPathValue()
3133
var httpContext = new DefaultHttpContext { Request = { Scheme = "http", Host = new HostString("localhost") } };
3234
var actionContext = new ActionContext { HttpContext = httpContext, RouteData = new RouteData(), ActionDescriptor = new ControllerActionDescriptor() };
3335
var controllerContext = new ControllerContext(actionContext);
36+
3437
var configurationApi = new ConfigurationApi(
3538
new ActiveLicense(null, NullLogger<ActiveLicense>.Instance) { IsValid = true },
3639
new Settings(),
40+
Options.Create(new ServiceControlOptions()),
3741
null,
3842
new MassTransitConnectorHeartbeatStatus());
3943

src/ServiceControl/HostApplicationBuilderExtensions.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ namespace Particular.ServiceControl
1010
using global::ServiceControl.Infrastructure.BackgroundTasks;
1111
using global::ServiceControl.Infrastructure.DomainEvents;
1212
using global::ServiceControl.Infrastructure.Metrics;
13+
using global::ServiceControl.Infrastructure.Settings;
1314
using global::ServiceControl.Infrastructure.SignalR;
1415
using global::ServiceControl.Infrastructure.WebApi;
1516
using global::ServiceControl.Notifications.Email;
1617
using global::ServiceControl.Persistence;
1718
using global::ServiceControl.Transports;
1819
using Licensing;
1920
using Microsoft.AspNetCore.HttpLogging;
21+
using Microsoft.Extensions.Configuration;
2022
using Microsoft.Extensions.DependencyInjection;
2123
using Microsoft.Extensions.Hosting;
2224
using Microsoft.Extensions.Hosting.WindowsServices;
@@ -76,7 +78,8 @@ public static void AddServiceControl(this IHostApplicationBuilder hostBuilder, S
7678
services.AddPersistence(settings);
7779
services.AddMetrics(settings.PrintMetrics);
7880

79-
NServiceBusFactory.Configure(settings, transportCustomization, transportSettings, configuration);
81+
var scOptions = hostBuilder.Configuration.GetSection("ServiceControl").Get<ServiceControlOptions>();
82+
NServiceBusFactory.Configure(scOptions, transportCustomization, transportSettings, configuration);
8083
hostBuilder.UseNServiceBus(configuration);
8184

8285
if (!settings.DisableExternalIntegrationsPublishing)

src/ServiceControl/Hosting/Commands/RunCommand.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
using System.Threading.Tasks;
44
using Infrastructure.WebApi;
55
using Microsoft.AspNetCore.Builder;
6+
using Microsoft.Extensions.Configuration;
7+
using Microsoft.Extensions.DependencyInjection;
68
using NServiceBus;
79
using Particular.ServiceControl;
810
using Particular.ServiceControl.Hosting;
911
using ServiceBus.Management.Infrastructure.Settings;
1012
using ServiceControl;
13+
using ServiceControl.Configuration;
14+
using ServiceControl.Infrastructure.Settings;
1115

1216
class RunCommand : AbstractCommand
1317
{
@@ -20,6 +24,10 @@ public override async Task Execute(HostArguments args, Settings settings)
2024
settings.RunCleanupBundle = true;
2125

2226
var hostBuilder = WebApplication.CreateBuilder();
27+
28+
hostBuilder.Configuration.Add<AppConfigConfigurationSource>(source => { });
29+
hostBuilder.Services.Configure<ServiceControlOptions>(hostBuilder.Configuration.GetSection("ServiceControl"));
30+
2331
hostBuilder.AddServiceControl(settings, endpointConfiguration);
2432
hostBuilder.AddServiceControlApi();
2533

src/ServiceControl/Infrastructure/Api/ConfigurationApi.cs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,23 @@
88
using System.Threading;
99
using System.Threading.Tasks;
1010
using Configuration;
11+
using Microsoft.Extensions.Options;
1112
using Monitoring.HeartbeatMonitoring;
1213
using Particular.ServiceControl.Licensing;
1314
using ServiceBus.Management.Infrastructure.Settings;
1415
using ServiceControl.Api;
1516
using ServiceControl.Api.Contracts;
17+
using ServiceControl.Infrastructure.Settings;
1618

17-
class ConfigurationApi(ActiveLicense license,
19+
class ConfigurationApi(
20+
ActiveLicense license,
1821
Settings settings,
19-
IHttpClientFactory httpClientFactory, MassTransitConnectorHeartbeatStatus connectorHeartbeatStatus) : IConfigurationApi
22+
IOptions<ServiceControlOptions> scOptions,
23+
IHttpClientFactory httpClientFactory,
24+
MassTransitConnectorHeartbeatStatus connectorHeartbeatStatus) : IConfigurationApi
2025
{
26+
readonly ServiceControlOptions scOptions = scOptions.Value;
27+
2128
public Task<RootUrls> GetUrls(string baseUrl, CancellationToken cancellationToken)
2229
{
2330
var model = new RootUrls
@@ -56,33 +63,33 @@ public Task<object> GetConfig(CancellationToken cancellationToken)
5663
{
5764
Host = new
5865
{
59-
settings.InstanceName,
66+
scOptions.InstanceName,
6067
Logging = new
6168
{
62-
settings.LoggingSettings.LogPath,
63-
LoggingLevel = settings.LoggingSettings.LogLevel
69+
scOptions.LogPath,
70+
LoggingLevel = scOptions.LogLevel
6471
}
6572
},
6673
DataRetention = new
6774
{
68-
settings.AuditRetentionPeriod,
69-
settings.ErrorRetentionPeriod
75+
scOptions.AuditRetentionPeriod,
76+
scOptions.ErrorRetentionPeriod
7077
},
7178
PerformanceTunning = new
7279
{
73-
settings.ExternalIntegrationsDispatchingBatchSize
80+
scOptions.ExternalIntegrationsDispatchingBatchSize
7481
},
7582
PersistenceSettings = settings.PersisterSpecificSettings,
7683
Transport = new
7784
{
78-
settings.TransportType,
79-
settings.ErrorLogQueue,
80-
settings.ErrorQueue,
81-
settings.ForwardErrorMessages
85+
scOptions.TransportType,
86+
scOptions.ErrorLogQueue,
87+
scOptions.ErrorQueue,
88+
scOptions.ForwardErrorMessages
8289
},
8390
Plugins = new
8491
{
85-
settings.HeartbeatGracePeriod
92+
scOptions.HeartbeatGracePeriod
8693
},
8794
MassTransitConnector = connectorHeartbeatStatus.LastHeartbeat
8895
};

src/ServiceControl/Infrastructure/NServiceBusFactory.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace ServiceBus.Management.Infrastructure
99
using ServiceControl.Configuration;
1010
using ServiceControl.ExternalIntegrations;
1111
using ServiceControl.Infrastructure;
12+
using ServiceControl.Infrastructure.Settings;
1213
using ServiceControl.Infrastructure.Subscriptions;
1314
using ServiceControl.Monitoring.HeartbeatMonitoring;
1415
using ServiceControl.Notifications.Email;
@@ -18,8 +19,11 @@ namespace ServiceBus.Management.Infrastructure
1819

1920
static class NServiceBusFactory
2021
{
21-
public static void Configure(Settings.Settings settings, ITransportCustomization transportCustomization,
22-
TransportSettings transportSettings, EndpointConfiguration configuration)
22+
public static void Configure(
23+
ServiceControlOptions scOptions,
24+
ITransportCustomization transportCustomization,
25+
TransportSettings transportSettings,
26+
EndpointConfiguration configuration)
2327
{
2428
if (configuration == null)
2529
{
@@ -28,14 +32,12 @@ public static void Configure(Settings.Settings settings, ITransportCustomization
2832
assemblyScanner.ExcludeAssemblies("ServiceControl.Plugin");
2933
}
3034

31-
configuration.GetSettings().Set("ServiceControl.Settings", settings);
32-
3335
transportCustomization.CustomizePrimaryEndpoint(configuration, transportSettings);
3436

35-
configuration.GetSettings().Set(settings.LoggingSettings);
36-
configuration.SetDiagnosticsPath(settings.LoggingSettings.LogPath);
37+
configuration.GetSettings().Set(scOptions);
38+
configuration.SetDiagnosticsPath(scOptions.LogPath);
3739

38-
if (settings.DisableExternalIntegrationsPublishing)
40+
if (scOptions.DisableExternalIntegrationsPublishing)
3941
{
4042
configuration.DisableFeature<ExternalIntegrationsFeature>();
4143
}

0 commit comments

Comments
 (0)