Skip to content

Commit 2040f10

Browse files
Merge pull request #2460 from RocketSurgeonsGuild/fix-blazor
fix-blazor
2 parents 50125dc + 4af4315 commit 2040f10

16 files changed

+52
-244
lines changed

Directory.Packages.props

+2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
<PackageVersion Include="FluentAssertions.Analyzers" Version="0.34.1" />
2828
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
2929
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="9.0.0" />
30+
<PackageVersion Include="OpenTelemetry.AutoInstrumentation" Version="1.9.0" />
31+
<PackageVersion Include="OpenTelemetry.Instrumentation.Process" Version="1.10.0-beta.1" />
3032
<PackageVersion Include="PartiallyApplied" Version="1.3.0" />
3133
<PackageVersion Include="Serilog.Enrichers.AssemblyName" Version="2.0.0" />
3234
<PackageVersion Include="Serilog.Enrichers.Demystifier" Version="1.0.3" />

sample/Sample.Minimal/CustomHostedService.cs

-11
This file was deleted.

sample/Sample.Minimal/CustomHostedServiceOptions.cs

-15
This file was deleted.

sample/Sample.Minimal/Program.cs

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
var builder = WebApplication.CreateBuilder(args);
99

1010
builder.Services.AddControllers().AddControllersAsServices();
11-
builder.Services.AddHostedService<CustomHostedService>();
1211

1312
var app = await builder.ConfigureRocketSurgery();
1413
app.UseExceptionHandler();

sample/Sample.Restful/Program.cs

-25
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
using FluentValidation;
2-
31
using Microsoft.Extensions.Diagnostics.HealthChecks;
4-
using Microsoft.Extensions.Options;
52

63
using Rocket.Surgery.Hosting;
74
using Rocket.Surgery.LaunchPad.AspNetCore;
@@ -11,7 +8,6 @@
118
var builder = WebApplication.CreateBuilder(args);
129

1310
builder.Services.AddControllers().AddControllersAsServices();
14-
builder.Services.AddHostedService<CustomHostedService>();
1511

1612
var app = await builder.ConfigureRocketSurgery();
1713
app.UseExceptionHandler();
@@ -53,24 +49,3 @@
5349
app.Run();
5450

5551
public partial class Program;
56-
57-
internal class CustomHostedServiceOptions
58-
{
59-
public string? A { get; set; }
60-
61-
[UsedImplicitly]
62-
private sealed class Validator : AbstractValidator<CustomHostedServiceOptions>
63-
{
64-
public Validator() => RuleFor(z => z.A).NotNull();
65-
}
66-
}
67-
68-
internal class CustomHostedService(IOptions<CustomHostedServiceOptions> options) : BackgroundService
69-
{
70-
protected override Task ExecuteAsync(CancellationToken stoppingToken)
71-
{
72-
// ReSharper disable once UnusedVariable
73-
var v = options.Value.A;
74-
return Task.CompletedTask;
75-
}
76-
}

src/Foundation/Conventions/FluentValidationConvention.cs

+2-27
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
using System.Globalization;
2-
31
using FluentValidation;
42

53
using MediatR;
64

75
using Microsoft.Extensions.Configuration;
86
using Microsoft.Extensions.DependencyInjection;
97
using Microsoft.Extensions.DependencyInjection.Extensions;
10-
using Microsoft.Extensions.Diagnostics.HealthChecks;
118
using Microsoft.Extensions.Options;
129

1310
using Rocket.Surgery.Conventions;
@@ -56,31 +53,9 @@ public void Register(IConventionContext context, IConfiguration configuration, I
5653
.WithTransientLifetime()
5754
);
5855

59-
if (_options.RegisterValidationOptionsAsHealthChecks == true
60-
|| ( !_options.RegisterValidationOptionsAsHealthChecks.HasValue
61-
&& Convert.ToBoolean(
62-
context.Properties["RegisterValidationOptionsAsHealthChecks"],
63-
CultureInfo.InvariantCulture
64-
) )
65-
|| Environment.CommandLine.Contains(
66-
"microsoft.extensions.apidescription.server",
67-
StringComparison.OrdinalIgnoreCase
68-
))
69-
{
70-
// need to do validations using ValidateOnStart
71-
services.Decorate<HealthCheckService, CustomHealthCheckService>();
72-
services.AddSingleton<ValidationHealthCheckResults>();
73-
services.AddSingleton(typeof(IValidateOptions<>), typeof(HealthCheckFluentValidationOptions<>));
74-
}
75-
else
76-
{
77-
services.AddSingleton(typeof(IValidateOptions<>), typeof(FluentValidationOptions<>));
78-
}
79-
56+
services.AddSingleton(typeof(IValidateOptions<>), typeof(FluentValidationOptions<>));
8057
services.TryAddEnumerable(ServiceDescriptor.Describe(typeof(IPipelineBehavior<,>), typeof(ValidationPipelineBehavior<,>), _options.MediatorLifetime));
81-
services.TryAddEnumerable(
82-
ServiceDescriptor.Describe(typeof(IStreamPipelineBehavior<,>), typeof(ValidationStreamPipelineBehavior<,>), _options.MediatorLifetime)
83-
);
58+
services.TryAddEnumerable(ServiceDescriptor.Describe(typeof(IStreamPipelineBehavior<,>), typeof(ValidationStreamPipelineBehavior<,>), _options.MediatorLifetime));
8459
}
8560

8661
private readonly FoundationOptions _options = options ?? new FoundationOptions();

src/Foundation/Conventions/InstrumentationConvention.cs

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using Microsoft.Extensions.Configuration;
2+
23
using OpenTelemetry;
34
using OpenTelemetry.Metrics;
45
using OpenTelemetry.Trace;
6+
57
using Rocket.Surgery.Conventions;
68
using Rocket.Surgery.LaunchPad.Telemetry;
79

@@ -21,6 +23,11 @@ public class InstrumentationConvention : IOpenTelemetryConvention
2123
public void Register(IConventionContext context, IConfiguration configuration, IOpenTelemetryBuilder builder)
2224
{
2325
builder.WithTracing(b => b.AddHttpClientInstrumentation(x => x.RecordException = true));
24-
builder.WithMetrics(b => b.AddRuntimeInstrumentation().AddHttpClientInstrumentation());
26+
builder.WithMetrics(
27+
b => b
28+
.AddHttpClientInstrumentation()
29+
.AddRuntimeInstrumentation()
30+
.AddProcessInstrumentation()
31+
);
2532
}
2633
}

src/Foundation/FoundationOptions.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.Extensions.DependencyInjection;
1+
using Microsoft.Extensions.DependencyInjection;
2+
23
using NodaTime.TimeZones;
34

45
namespace Rocket.Surgery.LaunchPad.Foundation;
@@ -28,4 +29,4 @@ public class FoundationOptions
2829
/// Validation options are registered as health checks instead of throwing and stopping application startup
2930
/// </summary>
3031
public bool? RegisterValidationOptionsAsHealthChecks { get; set; }
31-
}
32+
}

src/Foundation/Rocket.Surgery.LaunchPad.Foundation.csproj

+14-6
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@
2424
<PackageReference Include="NodaTime.Serialization.SystemTextJson" />
2525
<PackageReference Include="Rocket.Surgery.Conventions" />
2626
<PackageReference Include="Rocket.Surgery.DependencyInjection.Extensions" />
27-
<PackageReference Include="Scrutor" />
28-
<PackageReference Include="Serilog.Enrichers.Demystifier" />
29-
<PackageReference Include="Serilog.Sinks.ApplicationInsights" />
30-
<PackageReference Include="Serilog.Sinks.OpenTelemetry" />
3127
<PackageReference Include="System.Collections.Immutable" />
3228
<PackageReference Include="System.Interactive" />
3329
<PackageReference Include="System.Interactive.Async" />
@@ -36,11 +32,23 @@
3632
<PackageReference Include="System.Text.Json" />
3733
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
3834
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
35+
<PackageReference Include="OpenTelemetry.Instrumentation.Process" />
3936
</ItemGroup>
4037
<ItemGroup>
4138
<ProjectReference Include="..\Serilog\Rocket.Surgery.LaunchPad.Serilog.csproj" />
4239
<ProjectReference Include="..\Telemetry\Rocket.Surgery.LaunchPad.Telemetry.csproj" />
43-
<ProjectReference Include="..\Analyzers\Rocket.Surgery.LaunchPad.Analyzers.csproj" IncludeAssets="analyzers" ExcludeAssets="compile;runtime;native" PrivateAssets="contentfiles;build;buildMultitargeting;buildTransitive" OutputItemType="Analyzer" />
44-
<PackageReference Include="Polyfill" IncludeAssets="runtime;build;buildMultitargeting;buildTransitive;native;contentfiles;analyzers" PrivateAssets="All" Condition="'$(TargetFramework)' == 'netstandard2.1'" />
40+
<ProjectReference
41+
Include="..\Analyzers\Rocket.Surgery.LaunchPad.Analyzers.csproj"
42+
IncludeAssets="analyzers"
43+
ExcludeAssets="compile;runtime;native"
44+
PrivateAssets="contentfiles;build;buildMultitargeting;buildTransitive"
45+
OutputItemType="Analyzer"
46+
/>
47+
<PackageReference
48+
Include="Polyfill"
49+
IncludeAssets="runtime;build;buildMultitargeting;buildTransitive;native;contentfiles;analyzers"
50+
PrivateAssets="All"
51+
Condition="'$(TargetFramework)' == 'netstandard2.1'"
52+
/>
4553
</ItemGroup>
4654
</Project>

src/Foundation/Validation/CustomHealthCheckService.cs

-18
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using FluentValidation;
2+
23
using Microsoft.Extensions.Options;
4+
35
using Rocket.Surgery.LaunchPad.Foundation.Extensions;
46

57
namespace Rocket.Surgery.LaunchPad.Foundation.Validation;
@@ -8,24 +10,20 @@ namespace Rocket.Surgery.LaunchPad.Foundation.Validation;
810
/// This class enables fluent validators to be used for options validations!
911
/// </summary>
1012
/// <typeparam name="T"></typeparam>
11-
internal class FluentValidationOptions<T>(
12-
ValidationHealthCheckResults? healthCheckResults = null,
13-
IValidator<T>? validator = null
14-
)
13+
internal class FluentValidationOptions<T>(IValidator<T>? validator = null)
1514
: IValidateOptions<T>
1615
where T : class
1716
{
1817
public virtual ValidateOptionsResult Validate(string? name, T options)
1918
{
20-
if (validator == null) return ValidateOptionsResult.Skip;
19+
if (validator is null) return ValidateOptionsResult.Skip;
2120

2221
var result = validator.Validate(options);
23-
healthCheckResults?.AddResult(typeof(T).GetNestedTypeName(), name ?? Options.DefaultName, result);
24-
if (result.IsValid) return ValidateOptionsResult.Success;
25-
26-
return ValidateOptionsResult.Fail(
27-
new[] { $"Failure while validating {typeof(T).GetNestedTypeName()}{( name == Options.DefaultName ? "" : $" (Name: {name})" )}." }
28-
.Concat(result.Errors.Select(z => z.ToString()))
29-
);
22+
return result.IsValid
23+
? ValidateOptionsResult.Success
24+
: ValidateOptionsResult.Fail(
25+
new[] { $"Failure while validating {typeof(T).GetNestedTypeName()}{( name == Options.DefaultName ? "" : $" (Name: {name})" )}." }
26+
.Concat(result.Errors.Select(z => z.ToString()))
27+
);
3028
}
3129
}

src/Foundation/Validation/HealthCheckFluentValidationOptions.cs

-30
This file was deleted.

src/Foundation/Validation/ValidationHealthCheckResults.cs

-59
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
using Microsoft.Extensions.Configuration;
2-
using Microsoft.Extensions.Options;
1+
using Microsoft.Extensions.Configuration;
2+
33
using Rocket.Surgery.Conventions;
44
using Rocket.Surgery.LaunchPad.Serilog;
5+
56
using Serilog;
67

7-
namespace Rocket.Surgery.LaunchPad.Foundation.Conventions;
8+
namespace Rocket.Surgery.LaunchPad.Hosting.Conventions;
89

910
/// <summary>
10-
/// Defines serilog telemetry configuration
11+
/// Defines serilog telemetry configuration
1112
/// </summary>
1213
[PublicAPI]
1314
[ExportConvention]
1415
[ConventionCategory(ConventionCategory.Core)]
1516
public partial class SerilogTelemetryConvention : ISerilogConvention
1617
{
1718
/// <inheritdoc />
18-
public void Register(IConventionContext context, IConfiguration configuration, IServiceProvider services, LoggerConfiguration loggerConfiguration)
19-
{
19+
[RequiresUnreferencedCode("Serilog")]
20+
public void Register(IConventionContext context, IConfiguration configuration, IServiceProvider services, LoggerConfiguration loggerConfiguration) =>
2021
loggerConfiguration.WriteTo.OpenTelemetry(_ => { }, configuration.GetValue<string>);
21-
}
2222
}

0 commit comments

Comments
 (0)