48 lines
1.6 KiB
C#
48 lines
1.6 KiB
C#
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace StellaOps.Provcache.Api;
|
|
|
|
public static partial class ProvcacheEndpointExtensions
|
|
{
|
|
/// <summary>
|
|
/// GET /v1/provcache/metrics
|
|
/// </summary>
|
|
private static async Task<IResult> GetMetricsAsync(
|
|
IProvcacheService provcacheService,
|
|
ILogger<ProvcacheApiEndpoints> 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");
|
|
}
|
|
}
|
|
}
|