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 {{ $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) {
{{ b.label | slice: 5 }}
}
}

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.

@for (r of methodRows; track r; let i = $index) { }
Method Calls Avg latency (s) Total data (MB) Throttles Errors
{{ r.method_name }} {{ r.calls | number }} {{ r.avg_elapsed_s | number: '1.3-3' }} {{ r.total_bytes / 1048576 | number: '1.2-2' }} {{ r.throttle_count }} {{ 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) { }
@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) {
{{ b.label | slice: 5 }}
}
}

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.

@for (t of throttlesByMethod; track t) { }
Method Total throttles
{{ t.method }} {{ t.total }}
@for (e of throttleEvents; track e) { }
Day Method Count
{{ 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) {
@for (s of errorRateSeries(); track s) { }
@for (p of errorRatePoints; track p) { }
Day Total calls Errors Rate
{{ p.day }} {{ p.total | number }} {{ p.errors }} {{ p.rate * 100 | number: '1.1-1' }}%
}