API Observability
Summary (last 7 / 30 / 90 days)
@if (summaryLoading) {
Loading…
}
@if (summaryError) {
{{ summaryError }}
}
@if (summary && !summaryLoading) {
@for (
w of [
['7d', summary['7d']],
['30d', summary['30d']],
['90d', summary['90d']],
];
track w
) {
{{ w[0] }}
Calls{{ $any(w[1]).total_calls | number }}
Data{{ $any(w[1]).total_mb | number: '1.2-2' }} MB
Throttles
0">
{{ $any(w[1]).throttle_events | number }}
Median latency{{ $any(w[1]).median_latency_s | number: '1.3-3' }} s
}
}
API calls over time
@if (volumeLoading) {
Loading…
}
@if (volumeError) {
{{ volumeError }}
}
@if (!volumeLoading && volumePoints.length === 0 && !volumeError) {
No data yet.
}
@if (!volumeLoading && volumePoints.length > 0) {
@for (b of volumeBars(); track b) {
}
}
Calls by endpoint (last {{ days }} days)
@if (methodLoading) {
Loading…
}
@if (methodError) {
{{ methodError }}
}
@if (!methodLoading && methodRows.length > 0) {
Click a row to filter the latency chart to that method.
| Method |
Calls |
Avg latency (s) |
Total data (MB) |
Throttles |
Errors |
@for (r of methodRows; track r; let i = $index) {
| {{ r.method_name }} |
{{ r.calls | number }} |
{{ r.avg_elapsed_s | number: '1.3-3' }} |
{{ r.total_bytes / 1048576 | number: '1.2-2' }} |
0">{{ r.throttle_count }} |
0">{{ r.error_count }} |
}
@for (b of methodBars(); track b) {
{{ b.label }}
{{ b.value | number }}
}
}
Latency trend{{ selectedMethod ? ' — ' + selectedMethod : ' (all methods)' }}
@if (latencyLoading) {
Loading…
}
@if (latencyError) {
{{ latencyError }}
}
@if (!latencyLoading && latencyPoints.length === 0 && !latencyError) {
No data yet.
}
@if (!latencyLoading && latencyPoints.length > 0) {
@for (s of latencySeries(); track s) {
{{ s.label }}
}
@if (selectedMethod) {
}
}
Data volume (MB/day)
@if (dataVolumeLoading) {
Loading…
}
@if (dataVolumeError) {
{{ dataVolumeError }}
}
@if (!dataVolumeLoading && dataVolumePoints.length === 0 && !dataVolumeError) {
No data yet.
}
@if (!dataVolumeLoading && dataVolumePoints.length > 0) {
@for (b of dataVolumeBars(); track b) {
}
}
Throttle events
@if (throttleLoading) {
Loading…
}
@if (throttleError) {
{{ throttleError }}
}
@if (!throttleLoading && throttleEvents.length === 0 && !throttleError) {
No throttle events. You're a good fediverse citizen.
}
@if (!throttleLoading && throttleEvents.length > 0) {
{{ totalThrottleEvents }} throttle event{{ totalThrottleEvents === 1 ? '' : 's' }} in last
{{ days }} days.
| Method |
Total throttles |
@for (t of throttlesByMethod; track t) {
| {{ t.method }} |
{{ t.total }} |
}
| Day |
Method |
Count |
@for (e of throttleEvents; track e) {
| {{ e.day }} |
{{ e.method_name }} |
{{ e.count }} |
}
}
Error rate
@if (errorRateLoading) {
Loading…
}
@if (errorRateError) {
{{ errorRateError }}
}
@if (!errorRateLoading && errorRatePoints.length === 0 && !errorRateError) {
No data yet.
}
@if (!errorRateLoading && errorRatePoints.length > 0) {
| Day |
Total calls |
Errors |
Rate |
@for (p of errorRatePoints; track p) {
| {{ p.day }} |
{{ p.total | number }} |
0">{{ p.errors }} |
0">{{ p.rate * 100 | number: '1.1-1' }}% |
}
}