Skip to content

Metrics ​

GET /metrics on the admin address (default http://127.0.0.1:9090/metrics) returns every metric in Prometheus text format. It needs no token because the admin address only listens on localhost. For how to scrape and alert, see Monitoring.

Counters (names ending in _total) only ever go up and reset when Quikcast restarts. Use rate() or increase() on them. Gauges go up and down. There are no per-mount or per-listener labels, so the number of series stays small and fixed no matter how busy the server gets. The only labelled metrics use a fixed set of reason values (see disconnect reasons).

Server ​

MetricTypeMeaning
uptime_secondsgaugeSeconds since the process started.
readygauge1 while the server accepts new work, 0 while draining or shutting down.
config_generationgaugeStarts at 1 and increases with every successful reload.
config_reload_attempts_totalcounterReloads attempted.
config_reload_successes_totalcounterReloads that were applied.
config_reload_failures_totalcounterReloads that were rejected. The old config stayed active.
errors_totalcounterError responses sent to clients.
admission_rejections_totalcounterConnections refused because a connection or handshake limit was full.
drain_rejections_totalcounterNew work refused because the server is draining.
logging_dropped_totalcounterLog lines dropped because the log reader could not keep up.

Sources (encoders) ​

MetricTypeMeaning
active_sourcesgaugeSources connected right now.
active_mountsgaugeMounts that currently have a source. Same value as active_sources.
source_connections_totalcounterSources admitted since start.
source_auth_denials_totalcounterSource connections refused for a wrong password.
source_conflicts_totalcounterSource connections refused because the mount already has a source (or a relay).
source_access_denied_ip_totalcounterSource connections refused by source_access IP rules.
source_auth_duration_secondshistogramTime spent checking source credentials.
source_disconnects_totalcounterSources that ended, by reason.
bytes_ingested_totalcounterAudio bytes accepted from sources and relays.
retained_audio_allocation_bytesgaugeMemory currently reserved for retained audio.
metadata_updates_totalcounterSong title updates accepted.

Listeners ​

MetricTypeMeaning
active_listenersgaugeListeners connected right now.
listeners_connected_totalcounterListeners admitted since start.
listeners_disconnected_totalcounterListeners that ended, by reason.
slow_consumers_totalcounterListeners dropped for falling too far behind.
bytes_served_totalcounterAudio bytes sent to continuous-stream listeners, including embedded titles.
audio_bytes_served_totalcounterOf those, the audio itself.
icy_metadata_bytes_served_totalcounterOf those, embedded song-title blocks.
fallback_listener_admissions_totalcounterListeners served by a fallback mount instead of the one they asked for.

Access control ​

MetricTypeMeaning
listener_access_denied_ip_totalcounterListeners refused by an IP rule.
listener_access_denied_geo_totalcounterListeners refused by a country rule.
listener_access_denied_user_agent_totalcounterListeners refused by a User-Agent rule.
listener_signed_auth_denied_totalcounterListeners refused for a bad or expired signed link.
hls_signed_auth_denied_totalcounterThe same, for HLS requests.

Relays ​

MetricTypeMeaning
relay_attempts_totalcounterConnection attempts to upstreams.
relay_connections_totalcounterSuccessful connections to an upstream.
relay_failures_totalcounterFailed attempts.
relay_upstream_failures_totalcounterFailures caused by the upstream (as opposed to local problems).
relay_failovers_totalcounterSwitches to the next upstream.
relay_cycles_exhausted_totalcounterTimes every upstream failed and the relay had to back off.
relay_reconnects_totalcounterReconnects after an earlier connection.
relay_response_body_bytes_totalcounterBytes read from upstreams.
relay_audio_bytes_totalcounterAudio bytes demultiplexed from upstreams.
relay_metadata_rejections_totalcounterInvalid song titles from upstreams that were ignored.

HLS ​

MetricTypeMeaning
hls_requests_totalcounterPublic HLS requests.
hls_get_responses_totalcounterGET responses served.
hls_head_responses_totalcounterHEAD responses served.
hls_partial_responses_totalcounter206 Partial Content responses (byte ranges).
hls_not_modified_responses_totalcounter304 Not Modified responses.
hls_range_rejections_totalcounterByte-range requests refused as unsatisfiable.
hls_rejections_totalcounterHLS requests and uploads that were rejected.
hls_bytes_served_totalcounterBody bytes of HLS responses.
hls_ingest_bytes_totalcounterBytes of accepted segment and initialization uploads.
hls_segments_accepted_totalcounterMedia segments accepted.
hls_initializations_accepted_totalcounterfMP4 initialization objects accepted.
hls_publications_totalcounterPlaylist publications.
hls_active_uploadsgaugeUploads in progress.
hls_stored_objectsgaugeSegments and initialization objects held in memory.
hls_stored_bytesgaugeBytes held in memory.
hls_allocation_reserved_bytesgaugeMemory reserved against allocation_budget.

Disconnect reasons ​

listeners_disconnected_total and source_disconnects_total carry one reason label with a fixed set of values. All values always appear, even at zero.

ReasonMeaning
client_disconnectedThe listener closed the connection.
source_disconnectedThe encoder disconnected. Listeners ended with it.
slow_consumerThe listener fell behind the retained audio.
write_stallThe listener's connection stopped accepting data.
shutdownThe server was shutting down.
source_timeoutThe encoder sent nothing for source_timeout_ms.
malformed_inputThe source sent audio Quikcast could not parse.
internal_faultAn internal error. Please report it.
administrative_disconnectAn operator disconnected it through the API or console.

What is not measured ​

Listener numbers over time are not metrics. Use the /api/history endpoint for the last 24 hours, or graph active_listeners in your own Prometheus for longer.

Documentation for Quikcast.