import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import type { KpiMetrics } from "@/lib/types/alerts"; import { KPI_THRESHOLDS } from "@/lib/types/alerts"; import { cn } from "@/lib/utils"; interface KpiDashboardProps { kpis: KpiMetrics | null; isLoading?: boolean; } export function KpiDashboard({ kpis, isLoading = false }: KpiDashboardProps) { if (isLoading) { return (
Alert Coverage Ratio False Positive Rate Uptime Ratio Verdict
); } if (!kpis) { return ( No KPI data available ); } const alertCoverageRatio = kpis.errorCoverageRatio; const falsePositiveRate = kpis.invalidAlertRatio; const MONTHS_MS = 30 * 24 * 60 * 60 * 1000 * 3; // 3 months const uptimeRatio = ((MONTHS_MS - kpis.overallDowntimeMs) / MONTHS_MS) * 100; const coveragePassed = alertCoverageRatio >= KPI_THRESHOLDS.alertCoverageRatio; const fpPassed = falsePositiveRate <= KPI_THRESHOLDS.falsePositiveRate; const uptimePassed = uptimeRatio >= KPI_THRESHOLDS.uptimeRatio; const isEffective = coveragePassed && fpPassed && uptimePassed; const coverageColor = coveragePassed ? "text-green-500" : "text-destructive"; const fpColor = fpPassed ? "text-green-500" : "text-destructive"; const uptimeColor = uptimePassed ? "text-green-500" : "text-destructive"; return (
Alert Coverage Ratio ≥{KPI_THRESHOLDS.alertCoverageRatio}%
{alertCoverageRatio.toFixed(1)}%

{kpis.coveredIncidents} of {kpis.totalIncidents} incidents

False Positive Rate ≤{KPI_THRESHOLDS.falsePositiveRate}%
{falsePositiveRate.toFixed(1)}%

{kpis.invalidAlerts} of {kpis.totalFiringAlerts} alerts

Uptime Ratio ≥{KPI_THRESHOLDS.uptimeRatio}%
{uptimeRatio.toFixed(2)}%

Downtime: {kpis.overallDowntimeFormatted}

Verdict
{isEffective ? "EFFECTIVE" : "NOT EFFECTIVE"}

{[coveragePassed, fpPassed, uptimePassed].filter(Boolean).length}/3 KPIs passed

); }