/
HostApplicationBuilderExtensions.cs
125 lines (105 loc) · 5.19 KB
/
HostApplicationBuilderExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
namespace ServiceControl.Audit;
using System;
using System.Diagnostics;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using Auditing;
using Infrastructure;
using Infrastructure.Metrics;
using Infrastructure.Settings;
using Microsoft.AspNetCore.HttpLogging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Monitoring;
using NLog.Extensions.Logging;
using NServiceBus;
using NServiceBus.Configuration.AdvancedExtensibility;
using NServiceBus.Logging;
using NServiceBus.Transport;
using Persistence;
using Transports;
static class HostApplicationBuilderExtensions
{
public static void AddServiceControlAudit(this IHostApplicationBuilder builder,
Func<ICriticalErrorContext, CancellationToken, Task> onCriticalError,
Settings settings,
EndpointConfiguration configuration,
LoggingSettings loggingSettings)
{
var persistenceConfiguration =
PersistenceConfigurationFactory.LoadPersistenceConfiguration(settings.PersistenceType);
var persistenceSettings = persistenceConfiguration.BuildPersistenceSettings(settings);
RecordStartup(settings, loggingSettings, configuration, persistenceConfiguration);
if (!string.IsNullOrWhiteSpace(settings.LicenseFileText))
{
configuration.License(settings.LicenseFileText);
}
var transportSettings = MapSettings(settings);
var transportCustomization = settings.LoadTransportCustomization();
builder.Logging.ClearProviders();
builder.Logging.AddNLog();
builder.Logging.SetMinimumLevel(loggingSettings.ToHostLogLevel());
var services = builder.Services;
services.Configure<HostOptions>(options => options.ShutdownTimeout = TimeSpan.FromSeconds(30));
services.AddSingleton(transportSettings);
services.AddSingleton(transportCustomization);
services.AddSingleton(loggingSettings);
services.AddSingleton(settings);
services.AddSingleton<EndpointInstanceMonitoring>();
services.AddSingleton<AuditIngestor>();
services.AddSingleton<ImportFailedAudits>();
services.AddSingleton<AuditIngestionCustomCheck.State>(); // required by the ingestion custom check which is auto-loaded
services.AddHttpLogging(options =>
{
options.LoggingFields = HttpLoggingFields.RequestPath | HttpLoggingFields.RequestMethod | HttpLoggingFields.ResponseStatusCode | HttpLoggingFields.Duration;
});
// Core registers the message dispatcher to be resolved from the transport seam. The dispatcher
// is only available though after the NServiceBus hosted service has started. Any hosted service
// or component injected into a hosted service can only depend on this lazy instead of the dispatcher
// directly and to make things more complex of course the order of registration still matters ;)
services.AddSingleton(provider => new Lazy<IMessageDispatcher>(provider.GetRequiredService<IMessageDispatcher>));
services.AddMetrics(settings.PrintMetrics);
services.AddPersistence(persistenceSettings, persistenceConfiguration);
NServiceBusFactory.Configure(settings, transportCustomization, transportSettings, loggingSettings, onCriticalError, configuration);
builder.UseNServiceBus(configuration);
// Configure after the NServiceBus hosted service to ensure NServiceBus is already started
if (settings.IngestAuditMessages)
{
services.AddHostedService<AuditIngestion>();
}
builder.Services.AddWindowsService();
}
static TransportSettings MapSettings(Settings settings)
{
var transportSettings = new TransportSettings
{
EndpointName = settings.ServiceName,
ConnectionString = settings.TransportConnectionString,
MaxConcurrency = settings.MaximumConcurrencyLevel
};
return transportSettings;
}
static void RecordStartup(Settings settings, LoggingSettings loggingSettings, EndpointConfiguration endpointConfiguration, IPersistenceConfiguration persistenceConfiguration)
{
var version = FileVersionInfo.GetVersionInfo(typeof(HostApplicationBuilderExtensions).Assembly.Location).ProductVersion;
var startupMessage = $@"
-------------------------------------------------------------
ServiceControl Audit Version: {version}
Audit Retention Period: {settings.AuditRetentionPeriod}
Forwarding Audit Messages: {settings.ForwardAuditMessages}
ServiceControl Logging Level: {loggingSettings.LoggingLevel}
Transport Customization: {settings.TransportType},
Persistence Customization: {settings.PersistenceType},
Persistence: {persistenceConfiguration.Name}
-------------------------------------------------------------";
var logger = LogManager.GetLogger(typeof(HostApplicationBuilderExtensions));
logger.Info(startupMessage);
endpointConfiguration.GetSettings().AddStartupDiagnosticsSection("Startup", new
{
Settings = settings,
LoggingSettings = loggingSettings
});
}
}