Skip to content

Commit ccd55f6

Browse files
authored
Use source generators for logging and regular expressions (#1652)
* Use logger source generator, cleanup log messages * Use regex source generator, optimize flags * Update to latest Sonar analyzer to match analysis in Sonar Cloud * Update to latest R# version * Revert switch to extension method syntax
1 parent fbe5079 commit ccd55f6

78 files changed

Lines changed: 1245 additions & 451 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.config/dotnet-tools.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"isRoot": true,
44
"tools": {
55
"jetbrains.resharper.globaltools": {
6-
"version": "2025.3.0.3",
6+
"version": "2025.3.3",
77
"commands": [
88
"jb"
99
],

src/Bootstrap/src/AutoConfiguration/BootstrapScanner.cs

Lines changed: 89 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
namespace Steeltoe.Bootstrap.AutoConfiguration;
4040

41-
internal sealed class BootstrapScanner
41+
internal sealed partial class BootstrapScanner
4242
{
4343
private readonly HostBuilderWrapper _wrapper;
4444
private readonly AssemblyLoader _loader;
@@ -93,21 +93,21 @@ private void WireConfigServer()
9393
{
9494
_wrapper.AddConfigServer(_loggerFactory);
9595

96-
_logger.LogInformation("Configured Config Server configuration provider");
96+
LogConfigServerConfigured();
9797
}
9898

9999
private void WireCloudFoundryConfiguration()
100100
{
101101
_wrapper.AddCloudFoundryConfiguration(_loggerFactory);
102102

103-
_logger.LogInformation("Configured Cloud Foundry configuration provider");
103+
LogCloudFoundryConfigured();
104104
}
105105

106106
private void WireRandomValueProvider()
107107
{
108108
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.AddRandomValueSource(_loggerFactory));
109109

110-
_logger.LogInformation("Configured random value configuration provider");
110+
LogRandomValueConfigured();
111111
}
112112

113113
private void WireSpringBootProvider()
@@ -117,21 +117,21 @@ private void WireSpringBootProvider()
117117
string[] args = Environment.GetCommandLineArgs().Skip(1).ToArray();
118118
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.AddSpringBootFromCommandLine(args, _loggerFactory));
119119

120-
_logger.LogInformation("Configured Spring Boot configuration provider");
120+
LogSpringBootConfigured();
121121
}
122122

123123
private void WireDecryptionProvider()
124124
{
125125
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.AddDecryption(_loggerFactory));
126126

127-
_logger.LogInformation("Configured decryption configuration provider");
127+
LogDecryptionConfigured();
128128
}
129129

130130
private void WirePlaceholderResolver()
131131
{
132132
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.AddPlaceholderResolver(_loggerFactory));
133133

134-
_logger.LogInformation("Configured placeholder configuration provider");
134+
LogPlaceholderConfigured();
135135
}
136136

137137
private void WireConnectors()
@@ -150,52 +150,52 @@ private void WireCosmosDbConnector()
150150
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.ConfigureCosmosDb());
151151
_wrapper.ConfigureServices((host, services) => services.AddCosmosDb(host.Configuration));
152152

153-
_logger.LogInformation("Configured CosmosDB connector");
153+
LogCosmosDbConfigured();
154154
}
155155

156156
private void WireMongoDbConnector()
157157
{
158158
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.ConfigureMongoDb());
159159
_wrapper.ConfigureServices((host, services) => services.AddMongoDb(host.Configuration));
160160

161-
_logger.LogInformation("Configured MongoDB connector");
161+
LogMongoDbConfigured();
162162
}
163163

164164
private void WireMySqlConnector()
165165
{
166166
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.ConfigureMySql());
167167
_wrapper.ConfigureServices((host, services) => services.AddMySql(host.Configuration));
168168

169-
_logger.LogInformation("Configured MySQL connector");
169+
LogMySqlConfigured();
170170
}
171171

172172
private void WirePostgreSqlConnector()
173173
{
174174
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.ConfigurePostgreSql());
175175
_wrapper.ConfigureServices((host, services) => services.AddPostgreSql(host.Configuration));
176176

177-
_logger.LogInformation("Configured PostgreSQL connector");
177+
LogPostgreSqlConfigured();
178178
}
179179

180180
private void WireRabbitMQConnector()
181181
{
182182
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.ConfigureRabbitMQ());
183183
_wrapper.ConfigureServices((host, services) => services.AddRabbitMQ(host.Configuration));
184184

185-
_logger.LogInformation("Configured RabbitMQ connector");
185+
LogRabbitMQConfigured();
186186
}
187187

188188
private void WireRedisConnector()
189189
{
190190
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.ConfigureRedis());
191191
_wrapper.ConfigureServices((host, services) => services.AddRedis(host.Configuration));
192192

193-
_logger.LogInformation("Configured StackExchange Redis connector");
193+
LogRedisConfigured();
194194

195195
// Intentionally ignoring excluded assemblies here.
196196
if (MicrosoftRedisPackageResolver.Default.IsAvailable())
197197
{
198-
_logger.LogInformation("Configured Redis distributed cache connector");
198+
LogRedisDistributedCacheConfigured();
199199
}
200200
}
201201

@@ -204,63 +204,63 @@ private void WireSqlServerConnector()
204204
_wrapper.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.ConfigureSqlServer());
205205
_wrapper.ConfigureServices((host, services) => services.AddSqlServer(host.Configuration));
206206

207-
_logger.LogInformation("Configured SQL Server connector");
207+
LogSqlServerConfigured();
208208
}
209209

210210
private void WireDynamicSerilog()
211211
{
212212
_wrapper.ConfigureLogging(loggingBuilder => loggingBuilder.AddDynamicSerilog());
213213

214-
_logger.LogInformation("Configured dynamic console logger for Serilog");
214+
LogDynamicSerilogConfigured();
215215
}
216216

217217
private void WireDynamicConsole()
218218
{
219219
_wrapper.ConfigureLogging(loggingBuilder => loggingBuilder.AddDynamicConsole());
220220

221-
_logger.LogInformation("Configured dynamic console logger");
221+
LogDynamicConsoleConfigured();
222222
}
223223

224224
private void WireDiscoveryConfiguration()
225225
{
226226
_wrapper.ConfigureServices(services => services.AddConfigurationDiscoveryClient());
227227

228-
_logger.LogInformation("Configured configuration discovery client");
228+
LogConfigurationDiscoveryConfigured();
229229
}
230230

231231
private void WireDiscoveryConsul()
232232
{
233233
_wrapper.ConfigureServices(services => services.AddConsulDiscoveryClient());
234234

235-
_logger.LogInformation("Configured Consul discovery client");
235+
LogConsulDiscoveryConfigured();
236236
}
237237

238238
private void WireDiscoveryEureka()
239239
{
240240
_wrapper.ConfigureServices(services => services.AddEurekaDiscoveryClient());
241241

242-
_logger.LogInformation("Configured Eureka discovery client");
242+
LogEurekaDiscoveryConfigured();
243243
}
244244

245245
private void WireAllActuators()
246246
{
247247
_wrapper.ConfigureServices(services => services.AddAllActuators());
248248

249-
_logger.LogInformation("Configured actuators");
249+
LogActuatorsConfigured();
250250
}
251251

252252
private void WirePrometheus()
253253
{
254254
_wrapper.ConfigureServices(services => services.AddPrometheusActuator());
255255

256-
_logger.LogInformation("Configured Prometheus");
256+
LogPrometheusConfigured();
257257
}
258258

259259
private void WireDistributedTracingLogProcessor()
260260
{
261261
_wrapper.ConfigureServices(services => services.AddTracingLogProcessor());
262262

263-
_logger.LogInformation("Configured distributed tracing log processor");
263+
LogDistributedTracingConfigured();
264264
}
265265

266266
private bool WireIfLoaded(Action wireAction, string assemblyName)
@@ -281,4 +281,70 @@ private void WireIfAnyLoaded(Action wireAction, params PackageResolver[] package
281281
wireAction();
282282
}
283283
}
284+
285+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured Config Server configuration provider.")]
286+
private partial void LogConfigServerConfigured();
287+
288+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured Cloud Foundry configuration provider.")]
289+
private partial void LogCloudFoundryConfigured();
290+
291+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured random value configuration provider.")]
292+
private partial void LogRandomValueConfigured();
293+
294+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured Spring Boot configuration provider.")]
295+
private partial void LogSpringBootConfigured();
296+
297+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured decryption configuration provider.")]
298+
private partial void LogDecryptionConfigured();
299+
300+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured placeholder configuration provider.")]
301+
private partial void LogPlaceholderConfigured();
302+
303+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured CosmosDB connector.")]
304+
private partial void LogCosmosDbConfigured();
305+
306+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured MongoDB connector.")]
307+
private partial void LogMongoDbConfigured();
308+
309+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured MySQL connector.")]
310+
private partial void LogMySqlConfigured();
311+
312+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured PostgreSQL connector.")]
313+
private partial void LogPostgreSqlConfigured();
314+
315+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured RabbitMQ connector.")]
316+
private partial void LogRabbitMQConfigured();
317+
318+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured StackExchange Redis connector.")]
319+
private partial void LogRedisConfigured();
320+
321+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured Redis distributed cache connector.")]
322+
private partial void LogRedisDistributedCacheConfigured();
323+
324+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured SQL Server connector.")]
325+
private partial void LogSqlServerConfigured();
326+
327+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured dynamic console logger for Serilog.")]
328+
private partial void LogDynamicSerilogConfigured();
329+
330+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured dynamic console logger.")]
331+
private partial void LogDynamicConsoleConfigured();
332+
333+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured configuration discovery client.")]
334+
private partial void LogConfigurationDiscoveryConfigured();
335+
336+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured Consul discovery client.")]
337+
private partial void LogConsulDiscoveryConfigured();
338+
339+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured Eureka discovery client.")]
340+
private partial void LogEurekaDiscoveryConfigured();
341+
342+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured actuators.")]
343+
private partial void LogActuatorsConfigured();
344+
345+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured Prometheus.")]
346+
private partial void LogPrometheusConfigured();
347+
348+
[LoggerMessage(Level = LogLevel.Information, Message = "Configured distributed tracing log processor.")]
349+
private partial void LogDistributedTracingConfigured();
284350
}

src/Common/src/Certificates/ConfigureCertificateOptions.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@
1010

1111
namespace Steeltoe.Common.Certificates;
1212

13-
internal sealed class ConfigureCertificateOptions : IConfigureNamedOptions<CertificateOptions>
13+
internal sealed partial class ConfigureCertificateOptions : IConfigureNamedOptions<CertificateOptions>
1414
{
15-
private static readonly Regex CertificateRegex = new("-+BEGIN CERTIFICATE-+.+?-+END CERTIFICATE-+", RegexOptions.Compiled | RegexOptions.Singleline,
16-
TimeSpan.FromSeconds(1));
15+
private const int RegexMatchTimeoutInMilliseconds = 1_000;
1716

1817
private readonly IConfiguration _configuration;
1918

@@ -24,6 +23,10 @@ public ConfigureCertificateOptions(IConfiguration configuration)
2423
_configuration = configuration;
2524
}
2625

26+
[GeneratedRegex("-+BEGIN CERTIFICATE-+.+?-+END CERTIFICATE-+", RegexOptions.Singleline | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture,
27+
RegexMatchTimeoutInMilliseconds)]
28+
private static partial Regex CertificateRegex();
29+
2730
public void Configure(CertificateOptions options)
2831
{
2932
Configure(Options.DefaultName, options);
@@ -47,7 +50,7 @@ public void Configure(string? name, CertificateOptions options)
4750
? X509Certificate2.CreateFromPemFile(certificateFilePath, privateKeyFilePath)
4851
: new X509Certificate2(certificateFilePath);
4952

50-
X509Certificate2[] certificateChain = CertificateRegex.Matches(File.ReadAllText(certificateFilePath))
53+
X509Certificate2[] certificateChain = CertificateRegex().Matches(File.ReadAllText(certificateFilePath))
5154
.Select(x => new X509Certificate2(Encoding.ASCII.GetBytes(x.Value))).ToArray();
5255
#pragma warning restore SYSLIB0057 // Type or member is obsolete
5356

src/Common/src/Common/Configuration/ConfigurationKeyConverter.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@
88

99
namespace Steeltoe.Common.Configuration;
1010

11-
internal static class ConfigurationKeyConverter
11+
internal static partial class ConfigurationKeyConverter
1212
{
1313
private const string DotDelimiterString = ".";
1414
private const char DotDelimiterChar = '.';
1515
private const char UnderscoreDelimiterChar = '_';
1616
private const char EscapeChar = '\\';
1717
private const string EscapeString = "\\";
18+
private const int RegexMatchTimeoutInMilliseconds = 1_000;
1819

19-
private static readonly Regex ArrayRegex = new(@"\[(?<digits>\d+)\]", RegexOptions.Compiled | RegexOptions.Singleline, TimeSpan.FromSeconds(1));
20+
[GeneratedRegex(@"\[(?<digits>\d+)\]", RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture, RegexMatchTimeoutInMilliseconds)]
21+
private static partial Regex ArrayRegex();
2022

2123
public static string AsDotNetConfigurationKey(string key)
2224
{
@@ -82,6 +84,6 @@ static string UnEscapeString(string src)
8284

8385
private static string ConvertArrayKey(string key)
8486
{
85-
return ArrayRegex.Replace(key, ":${digits}");
87+
return ArrayRegex().Replace(key, ":${digits}");
8688
}
8789
}

0 commit comments

Comments
 (0)