From 489218dc95eabdeba8bfe1d1afbd8ebd22b12618 Mon Sep 17 00:00:00 2001 From: meysamhadeli Date: Tue, 14 Jun 2022 02:55:41 +0430 Subject: [PATCH] add health check --- src/BuildingBlocks/BuildingBlocks.csproj | 8 ++- src/BuildingBlocks/EFCore/DatabaseOptions.cs | 4 +- src/BuildingBlocks/HealthCheck/Extensions.cs | 56 +++++++++++++++++++ .../Booking/src/Booking.Api/Program.cs | 4 +- src/Services/Flight/src/Flight.Api/Program.cs | 14 +++-- .../Flight/src/Flight.Api/appsettings.json | 6 -- .../Identity/src/Identity.Api/Program.cs | 4 +- .../Passenger/src/Passenger.Api/Program.cs | 4 +- 8 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 src/BuildingBlocks/HealthCheck/Extensions.cs diff --git a/src/BuildingBlocks/BuildingBlocks.csproj b/src/BuildingBlocks/BuildingBlocks.csproj index 97bc3c0..6c4d765 100644 --- a/src/BuildingBlocks/BuildingBlocks.csproj +++ b/src/BuildingBlocks/BuildingBlocks.csproj @@ -8,6 +8,10 @@ + + + + @@ -66,8 +70,8 @@ - - + + diff --git a/src/BuildingBlocks/EFCore/DatabaseOptions.cs b/src/BuildingBlocks/EFCore/DatabaseOptions.cs index 9041047..3403154 100644 --- a/src/BuildingBlocks/EFCore/DatabaseOptions.cs +++ b/src/BuildingBlocks/EFCore/DatabaseOptions.cs @@ -1,6 +1,6 @@ namespace BuildingBlocks.EFCore; -public class DatabaseOptions +public class SqlOptions { - public string ConnectionString { get; set; } + public string DefaultConnection { get; set; } } diff --git a/src/BuildingBlocks/HealthCheck/Extensions.cs b/src/BuildingBlocks/HealthCheck/Extensions.cs new file mode 100644 index 0000000..33bfbe6 --- /dev/null +++ b/src/BuildingBlocks/HealthCheck/Extensions.cs @@ -0,0 +1,56 @@ +using BuildingBlocks.EFCore; +using BuildingBlocks.MassTransit; +using BuildingBlocks.Web; +using HealthChecks.UI.Client; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; + +namespace BuildingBlocks.HealthCheck; + +public static class Extensions +{ + public static IServiceCollection AddCustomHealthCheck(this IServiceCollection services) + { + var sqlOptions = services.GetOptions("ConnectionStrings"); + var rabbitMqOptions = services.GetOptions("RabbitMq"); + + services.AddHealthChecks() + .AddSqlServer(sqlOptions.DefaultConnection) + .AddRabbitMQ(rabbitConnectionString: + $"amqp://{rabbitMqOptions.UserName}:{rabbitMqOptions.Password}@{rabbitMqOptions.HostName}"); + + services.AddHealthChecksUI(setup => + { + setup.SetEvaluationTimeInSeconds(60); // time in seconds between check + setup.AddHealthCheckEndpoint("Basic Health Check", "/healthz"); + }).AddInMemoryStorage(); + + return services; + } + + public static WebApplication UseCustomHealthCheck(this WebApplication app) + { + app.UseHealthChecks("/healthz", + new HealthCheckOptions + { + Predicate = _ => true, + ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse, + ResultStatusCodes = + { + [HealthStatus.Healthy] = StatusCodes.Status200OK, + [HealthStatus.Degraded] = StatusCodes.Status500InternalServerError, + [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable + } + }) + .UseHealthChecksUI(options => + { + options.ApiPath = "/healthcheck"; + options.UIPath = "/healthcheck-ui"; + }); + + return app; + } +} diff --git a/src/Services/Booking/src/Booking.Api/Program.cs b/src/Services/Booking/src/Booking.Api/Program.cs index 3e413fc..5b5c283 100644 --- a/src/Services/Booking/src/Booking.Api/Program.cs +++ b/src/Services/Booking/src/Booking.Api/Program.cs @@ -5,6 +5,7 @@ using Booking.Extensions; using BuildingBlocks.Domain; using BuildingBlocks.EFCore; using BuildingBlocks.EventStoreDB; +using BuildingBlocks.HealthCheck; using BuildingBlocks.IdsGenerator; using BuildingBlocks.Jwt; using BuildingBlocks.Logging; @@ -46,7 +47,7 @@ builder.Services.AddHttpContextAccessor(); builder.Services.AddTransient(); builder.Services.AddTransient(); - +builder.Services.AddCustomHealthCheck(); builder.Services.AddCustomMassTransit(typeof(BookingRoot).Assembly, env); builder.Services.AddCustomOpenTelemetry(); builder.Services.AddTransient(); @@ -76,6 +77,7 @@ app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.UseProblemDetails(); +app.UseCustomHealthCheck(); app.UseEndpoints(endpoints => { diff --git a/src/Services/Flight/src/Flight.Api/Program.cs b/src/Services/Flight/src/Flight.Api/Program.cs index 3e7bbd2..8c2cfeb 100644 --- a/src/Services/Flight/src/Flight.Api/Program.cs +++ b/src/Services/Flight/src/Flight.Api/Program.cs @@ -3,6 +3,7 @@ using BuildingBlocks.Caching; using BuildingBlocks.Domain; using BuildingBlocks.EFCore; using BuildingBlocks.Exception; +using BuildingBlocks.HealthCheck; using BuildingBlocks.IdsGenerator; using BuildingBlocks.Jwt; using BuildingBlocks.Logging; @@ -17,7 +18,9 @@ using Flight.Data; using Flight.Data.Seed; using Flight.Extensions; using FluentValidation; +using HealthChecks.UI.Client; using Hellang.Middleware.ProblemDetails; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Prometheus; using Serilog; @@ -48,6 +51,7 @@ builder.Services.AddTransient(); builder.Services.AddCustomMassTransit(typeof(FlightRoot).Assembly, env); builder.Services.AddCustomOpenTelemetry(); builder.Services.AddRouting(options => options.LowercaseUrls = true); +builder.Services.AddCustomHealthCheck(); builder.Services.AddGrpc(options => { @@ -58,10 +62,7 @@ builder.Services.AddMagicOnion(); SnowFlakIdGenerator.Configure(1); -builder.Services.AddCachingRequest(new List -{ - typeof(FlightRoot).Assembly -}); +builder.Services.AddCachingRequest(new List {typeof(FlightRoot).Assembly}); builder.Services.AddEasyCaching(options => { options.UseInMemory(configuration, "mem"); }); @@ -80,6 +81,7 @@ app.UseHttpMetrics(); app.UseMigrations(); app.UseProblemDetails(); app.UseHttpsRedirection(); +app.UseCustomHealthCheck(); app.UseAuthentication(); app.UseAuthorization(); @@ -93,4 +95,6 @@ app.UseEndpoints(endpoints => app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name)); app.Run(); -public partial class Program {} +public partial class Program +{ +} diff --git a/src/Services/Flight/src/Flight.Api/appsettings.json b/src/Services/Flight/src/Flight.Api/appsettings.json index 879971c..47f91d8 100644 --- a/src/Services/Flight/src/Flight.Api/appsettings.json +++ b/src/Services/Flight/src/Flight.Api/appsettings.json @@ -20,11 +20,5 @@ "UserName": "guest", "Password": "guest" }, - "Kestrel": { - "EndpointDefaults": { - "Protocols": "Http2", - "Url": "https://localhost:5003" - } - }, "AllowedHosts": "*" } diff --git a/src/Services/Identity/src/Identity.Api/Program.cs b/src/Services/Identity/src/Identity.Api/Program.cs index 6fe8095..6011e81 100644 --- a/src/Services/Identity/src/Identity.Api/Program.cs +++ b/src/Services/Identity/src/Identity.Api/Program.cs @@ -1,5 +1,6 @@ using BuildingBlocks.Domain; using BuildingBlocks.EFCore; +using BuildingBlocks.HealthCheck; using BuildingBlocks.Logging; using BuildingBlocks.Mapster; using BuildingBlocks.MassTransit; @@ -42,7 +43,7 @@ builder.Services.AddValidatorsFromAssembly(typeof(IdentityRoot).Assembly); builder.Services.AddCustomProblemDetails(); builder.Services.AddCustomMapster(typeof(IdentityRoot).Assembly); builder.Services.AddScoped(); - +builder.Services.AddCustomHealthCheck(); builder.Services.AddTransient(); builder.Services.AddTransient(); @@ -69,6 +70,7 @@ app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.UseIdentityServer(); +app.UseCustomHealthCheck(); app.UseEndpoints(endpoints => { diff --git a/src/Services/Passenger/src/Passenger.Api/Program.cs b/src/Services/Passenger/src/Passenger.Api/Program.cs index 2d1428c..5046442 100644 --- a/src/Services/Passenger/src/Passenger.Api/Program.cs +++ b/src/Services/Passenger/src/Passenger.Api/Program.cs @@ -1,6 +1,7 @@ using BuildingBlocks.Domain; using BuildingBlocks.EFCore; using BuildingBlocks.Exception; +using BuildingBlocks.HealthCheck; using BuildingBlocks.IdsGenerator; using BuildingBlocks.Jwt; using BuildingBlocks.Logging; @@ -39,7 +40,7 @@ builder.Services.AddCustomProblemDetails(); builder.Services.AddCustomMapster(typeof(PassengerRoot).Assembly); builder.Services.AddHttpContextAccessor(); builder.Services.AddTransient(); - +builder.Services.AddCustomHealthCheck(); builder.Services.AddCustomMassTransit(typeof(PassengerRoot).Assembly, env); builder.Services.AddCustomOpenTelemetry(); builder.Services.AddGrpc(options => @@ -67,6 +68,7 @@ app.UseProblemDetails(); app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); +app.UseCustomHealthCheck(); app.UseEndpoints(endpoints => {