+
+
+
Service Health
+
+ Aggregierte Upstream-Metriken. Zeitangaben werden lokal angezeigt.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {customRangeError ? (
+
+ {customRangeError}
+
+ ) : null}
+
+ Buckets: {formatBucket(dashboard.range.bucketSeconds)}
+
+
+
+
+
+ }
+ title="Requests"
+ value={number.format(dashboard.totals.total)}
+ />
+ }
+ title="2xx erfolgreich"
+ value={number.format(dashboard.totals.successful)}
+ />
+ }
+ title="Unsuccessful"
+ value={number.format(dashboard.totals.unsuccessful)}
+ />
+ }
+ title="Fehlerrate (reine Caller-Abbrüche separat)"
+ value={`${dashboard.totals.failureRate.toFixed(1)}%`}
+ />
+ }
+ title="p95 Dauer"
+ value={formatLatency(dashboard.latency.duration.p95Ms, number)}
+ />
+
+
+
+
+
+
+
+ date.format(new Date(value))}
+ />
+
+ } />
+
+
+
+
+
+
+
+
+
+
+
+ date.format(new Date(value))}
+ />
+
+ } />
+
+
+
+
+
+
+
+
+ ({
+ ...row,
+ label:
+ row.statusCode === null
+ ? row.outcome
+ : String(row.statusCode),
+ }))}
+ >
+
+
+
+ } />
+
+
+
+
+
+
+
+
+ ({
+ label: row.provider,
+ count: row.count,
+ unsuccessful: row.unsuccessful,
+ suffix: `Ø ${Math.round(row.avgDurationMs)} ms`,
+ }))}
+ title="Provider"
+ />
+ ({
+ label: row.endpoint,
+ count: row.count,
+ unsuccessful: row.unsuccessful,
+ }))}
+ title="Endpoints"
+ />
+ ({
+ label: row.model,
+ count: row.count,
+ unsuccessful: row.unsuccessful,
+ }))}
+ title="Modelle"
+ />
+
+ );
+}
+
+function Metric({
+ title,
+ value,
+ icon,
+}: {
+ title: string;
+ value: string | number;
+ icon: React.ReactNode;
+}) {
+ return (
+