feat: map canonical ZB health tiers; replace bypassing /health/live

This commit is contained in:
Joseph Doherty
2026-06-01 13:44:13 -04:00
parent 136614be94
commit 62ba5e9487
2 changed files with 18 additions and 16 deletions
@@ -2,6 +2,7 @@ using System.Security.Cryptography.X509Certificates;
using Microsoft.AspNetCore.Hosting.StaticWebAssets; using Microsoft.AspNetCore.Hosting.StaticWebAssets;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Configuration; using Microsoft.Extensions.Logging.Configuration;
using ZB.MOM.WW.Health;
using ZB.MOM.WW.MxGateway.Contracts; using ZB.MOM.WW.MxGateway.Contracts;
using ZB.MOM.WW.MxGateway.Server.Alarms; using ZB.MOM.WW.MxGateway.Server.Alarms;
using ZB.MOM.WW.MxGateway.Server.Configuration; using ZB.MOM.WW.MxGateway.Server.Configuration;
@@ -63,7 +64,11 @@ public static class GatewayApplication
builder.Services.AddGatewayConfiguration(); builder.Services.AddGatewayConfiguration();
builder.Services.AddSqliteAuthStore(); builder.Services.AddSqliteAuthStore();
builder.Services.AddGatewayGrpcAuthorization(); builder.Services.AddGatewayGrpcAuthorization();
builder.Services.AddHealthChecks(); builder.Services.AddHealthChecks()
.AddTypeActivatedCheck<AuthStoreHealthCheck>(
"auth-store",
failureStatus: null,
tags: new[] { ZbHealthTags.Ready });
builder.Services.AddSingleton<GatewayMetrics>(); builder.Services.AddSingleton<GatewayMetrics>();
builder.Services.AddSingleton<MxAccessGrpcMapper>(); builder.Services.AddSingleton<MxAccessGrpcMapper>();
builder.Services.AddSingleton<MxAccessGrpcRequestValidator>(); builder.Services.AddSingleton<MxAccessGrpcRequestValidator>();
@@ -169,13 +174,7 @@ public static class GatewayApplication
{ {
endpoints.MapStaticAssets(ResolveStaticAssetsManifestPath()); endpoints.MapStaticAssets(ResolveStaticAssetsManifestPath());
endpoints.MapGet( endpoints.MapZbHealth();
"/health/live",
() => Results.Ok(new GatewayHealthReply(
Status: "Healthy",
DefaultBackend: GatewayContractInfo.DefaultBackendName,
WorkerProtocolVersion: GatewayContractInfo.WorkerProtocolVersion)))
.WithName("LiveHealth");
endpoints.MapGrpcService<MxAccessGatewayService>(); endpoints.MapGrpcService<MxAccessGatewayService>();
endpoints.MapGrpcService<GalaxyRepositoryGrpcService>(); endpoints.MapGrpcService<GalaxyRepositoryGrpcService>();
@@ -11,19 +11,22 @@ namespace ZB.MOM.WW.MxGateway.Tests.Gateway;
public sealed class GatewayApplicationTests public sealed class GatewayApplicationTests
{ {
/// <summary>Verifies that Build maps the live health check endpoint.</summary> /// <summary>Verifies that Build maps the canonical three health tiers.</summary>
[Fact] [Fact]
public async Task Build_MapsLiveHealthEndpoint() public async Task Build_MapsCanonicalHealthEndpoints()
{ {
await using WebApplication app = GatewayApplication.Build([]); await using WebApplication app = GatewayApplication.Build([]);
RouteEndpoint endpoint = Assert.Single( var paths = ((IEndpointRouteBuilder)app).DataSources
((IEndpointRouteBuilder)app).DataSources .SelectMany(dataSource => dataSource.Endpoints)
.SelectMany(dataSource => dataSource.Endpoints) .OfType<RouteEndpoint>()
.OfType<RouteEndpoint>(), .Select(e => e.RoutePattern.RawText)
candidate => candidate.RoutePattern.RawText == "/health/live"); .ToHashSet();
Assert.Equal("LiveHealth", endpoint.Metadata.GetMetadata<IEndpointNameMetadata>()?.EndpointName); Assert.Contains("/health/ready", paths);
Assert.Contains("/health/active", paths);
Assert.Contains("/healthz", paths);
Assert.DoesNotContain("/health/live", paths);
} }
/// <summary>Verifies that Build registers the gateway metrics service.</summary> /// <summary>Verifies that Build registers the gateway metrics service.</summary>