From 166280943c8c08b94104af7a0cd5675861b963eb Mon Sep 17 00:00:00 2001 From: Gelu Mihes Date: Thu, 7 May 2026 19:37:06 +0300 Subject: [PATCH] Health endpoint --- .../Controllers/HealthController.cs | 64 +++++++++++++++++++ cv-matcher-api/Program.cs | 1 - rag-api/Controllers/HealthController.cs | 64 +++++++++++++++++++ rag-api/Program.cs | 1 - startup-helpers/StartupExtensions.cs | 11 ---- 5 files changed, 128 insertions(+), 13 deletions(-) create mode 100644 cv-matcher-api/Controllers/HealthController.cs create mode 100644 rag-api/Controllers/HealthController.cs diff --git a/cv-matcher-api/Controllers/HealthController.cs b/cv-matcher-api/Controllers/HealthController.cs new file mode 100644 index 0000000..cb8cd2a --- /dev/null +++ b/cv-matcher-api/Controllers/HealthController.cs @@ -0,0 +1,64 @@ +using Microsoft.AspNetCore.Mvc; + +namespace Api.Controllers +{ + /// + /// Controller that exposes simple health and readiness endpoints for the API. + /// Routes are prefixed with "api/health". + /// + [ApiController] + [Route("api/[controller]")] + public sealed class HealthController : ControllerBase + { + /// + /// Liveness probe. + /// Indicates whether the process is running. Used by orchestration systems to confirm the process is alive. + /// + /// + /// 200 OK with JSON payload: { "status": "alive" } when the process is running. + /// + // GET api/health/live + [HttpGet("live")] + public IActionResult Live() => Ok(new { status = "alive" }); + + /// + /// Basic health check endpoint. + /// Returns overall status and the current server time in UTC. + /// + /// + /// 200 OK with JSON payload: { "status": "ok", "time": <UTC time> }. + /// + // GET api/health + [HttpGet] + public IActionResult Health() => Ok(new { status = "ok", time = DateTimeOffset.UtcNow }); + + /// + /// Echo endpoint. + /// Returns the received JSON payload unchanged. Useful for testing request/response plumbing. + /// + /// Arbitrary JSON from the request body. The endpoint returns the same object. + /// 200 OK with the same JSON payload provided in the request body. + // POST api/health/echo + [HttpPost("echo")] + public IActionResult Echo(object payload) => Ok(payload); + + /// + /// Readiness probe. + /// Indicates whether the service is ready to accept traffic. Typically checks downstream dependencies. + /// + /// + /// 200 OK with JSON { "status": "ready" } when ready; + /// 503 Service Unavailable with JSON { "status": "not_ready" } when not ready. + /// + // GET api/health/ready + [HttpGet("ready")] + public IActionResult Ready() + { + var ready = true; + + return ready + ? Ok(new { status = "ready" }) + : StatusCode(503, new { status = "not_ready" }); + } + } +} \ No newline at end of file diff --git a/cv-matcher-api/Program.cs b/cv-matcher-api/Program.cs index f640e1a..ce602b9 100644 --- a/cv-matcher-api/Program.cs +++ b/cv-matcher-api/Program.cs @@ -83,7 +83,6 @@ try app.UseSwaggerInDevelopment(ServiceName, ServiceName); app.MapControllers(); - app.MapHealthEndpoint(ServiceName, appVersion); Log.Information("Running EF Core migrations if any"); using (var scope = app.Services.CreateScope()) diff --git a/rag-api/Controllers/HealthController.cs b/rag-api/Controllers/HealthController.cs new file mode 100644 index 0000000..cb8cd2a --- /dev/null +++ b/rag-api/Controllers/HealthController.cs @@ -0,0 +1,64 @@ +using Microsoft.AspNetCore.Mvc; + +namespace Api.Controllers +{ + /// + /// Controller that exposes simple health and readiness endpoints for the API. + /// Routes are prefixed with "api/health". + /// + [ApiController] + [Route("api/[controller]")] + public sealed class HealthController : ControllerBase + { + /// + /// Liveness probe. + /// Indicates whether the process is running. Used by orchestration systems to confirm the process is alive. + /// + /// + /// 200 OK with JSON payload: { "status": "alive" } when the process is running. + /// + // GET api/health/live + [HttpGet("live")] + public IActionResult Live() => Ok(new { status = "alive" }); + + /// + /// Basic health check endpoint. + /// Returns overall status and the current server time in UTC. + /// + /// + /// 200 OK with JSON payload: { "status": "ok", "time": <UTC time> }. + /// + // GET api/health + [HttpGet] + public IActionResult Health() => Ok(new { status = "ok", time = DateTimeOffset.UtcNow }); + + /// + /// Echo endpoint. + /// Returns the received JSON payload unchanged. Useful for testing request/response plumbing. + /// + /// Arbitrary JSON from the request body. The endpoint returns the same object. + /// 200 OK with the same JSON payload provided in the request body. + // POST api/health/echo + [HttpPost("echo")] + public IActionResult Echo(object payload) => Ok(payload); + + /// + /// Readiness probe. + /// Indicates whether the service is ready to accept traffic. Typically checks downstream dependencies. + /// + /// + /// 200 OK with JSON { "status": "ready" } when ready; + /// 503 Service Unavailable with JSON { "status": "not_ready" } when not ready. + /// + // GET api/health/ready + [HttpGet("ready")] + public IActionResult Ready() + { + var ready = true; + + return ready + ? Ok(new { status = "ready" }) + : StatusCode(503, new { status = "not_ready" }); + } + } +} \ No newline at end of file diff --git a/rag-api/Program.cs b/rag-api/Program.cs index 1c2acd7..daadebf 100644 --- a/rag-api/Program.cs +++ b/rag-api/Program.cs @@ -71,7 +71,6 @@ try app.UseSwaggerInDevelopment(ServiceName, ServiceName); app.MapControllers(); - app.MapHealthEndpoint(ServiceName, appVersion); Log.Information("Running EF Core migrations if any"); using (var scope = app.Services.CreateScope()) diff --git a/startup-helpers/StartupExtensions.cs b/startup-helpers/StartupExtensions.cs index 7bda41c..65b6c80 100644 --- a/startup-helpers/StartupExtensions.cs +++ b/startup-helpers/StartupExtensions.cs @@ -215,15 +215,4 @@ public static class StartupExtensions options.RoutePrefix = "swagger"; }); } - - public static void MapHealthEndpoint(this WebApplication app, string serviceName, string appVersion) - { - app.MapGet("/health", () => Results.Ok(new - { - status = "ok", - service = serviceName, - version = appVersion, - timeUtc = DateTimeOffset.UtcNow - })); - } }