using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; namespace StellaOps.Provcache.Api; public static partial class ProvcacheEndpointExtensions { /// /// GET /v1/provcache/metrics /// private static async Task GetMetricsAsync( IProvcacheService provcacheService, ILogger logger, CancellationToken cancellationToken) { logger.LogDebug("GET /v1/provcache/metrics"); try { var metrics = await provcacheService.GetMetricsAsync(cancellationToken); var hitRate = metrics.TotalRequests > 0 ? (double)metrics.TotalHits / metrics.TotalRequests : 0; return Results.Ok(new ProvcacheMetricsResponse { TotalRequests = metrics.TotalRequests, TotalHits = metrics.TotalHits, TotalMisses = metrics.TotalMisses, TotalInvalidations = metrics.TotalInvalidations, HitRate = hitRate, CurrentEntryCount = metrics.CurrentEntryCount, AvgLatencyMs = metrics.AvgLatencyMs, P99LatencyMs = metrics.P99LatencyMs, ValkeyCacheHealthy = metrics.ValkeyCacheHealthy, PostgresRepositoryHealthy = metrics.PostgresRepositoryHealthy, CollectedAt = metrics.CollectedAt }); } catch (Exception ex) { logger.LogError(ex, "Error getting cache metrics"); return InternalError("Metrics retrieval failed"); } } }