Skip to content

Metrics and logs

GET /v1/sys/metrics returns Prometheus text exposition format 0.0.4. Every metric carries HELP and TYPE. Counters belong to one worker each and are summed at scrape time, so any worker can answer a scrape.

MetricTypeMeaning
kallisto_access_log_dropped_totalcounterAccess log lines discarded because the queue was full. Present at zero.
kallisto_requests_total{outcome}counterRequests answered, by outcome class.
kallisto_sealedgauge1 when no file has loaded and every read answers 503.
kallisto_file_versiongaugeContent version being served, 0 when sealed.
kallisto_secretsgaugeSecrets in the file being served.
kallisto_tokensgaugeTokens in the file being served.
kallisto_authorization_enforcedgauge0 when the file carries no token table.
kallisto_refresh_failures_totalcounterPolls that did not yield a servable file.
LabelStatus
ok2xx
denied403
not_found404
rate_limited429
sealed503
erroranything else
  • kallisto_refresh_failures_total counts rejected files, failed authentication, rollback refusals and unreachable sources, on every failed poll. It reads 1 after a first boot, because a fresh machine has no fallback copy to warm from.
  • With log.enabled: false, nothing is enqueued, so kallisto_access_log_dropped_total stays at zero.

See monitor Kallisto for the alerts built on these.

One line per request on stdout. stdout carries nothing else.

ts=<millis> seq=<n> worker=<n> method=<M> action=<A> path=<id> token=<id> status=<code> authz=on|off
FieldMeaning
tsUnix time in milliseconds when the request was logged.
seqSequence number. Lines from several workers can reach the writer out of order.
workerThe worker that served the request.
methodHTTP method.
actionOne of data, metadata, list, sys, or -. Never taken from the URI.
path16 hex characters of a keyed HMAC-SHA256 of the path.
tokenThe same for the presented token, or - for none.
statusHTTP status code.
authzon when the file enforces authorization.

Lines are fixed at 192 bytes and allocate nothing.

Paths and tokens are keyed hashes because a deployment has a few dozen guessable paths, and a bare digest over that set is reversed by computing the same digests. When the file has a token_key, the log key is derived from it under its own label, so identifiers stay stable across restarts and an operator holding the file can match a line to a path. With no token table, the process generates a random key at startup and identifiers correlate only within one process lifetime. The server says which case applies on stderr.

stderr carries operational messages: the startup banner, each refresh outcome, hardening that could not be applied. It follows the same rules as the access log. No secret value appears, and paths appear only as identifiers.

The access log records after serving and drops lines under load. It is unsuitable as evidence of who read what. A test in the Kallisto repository keeps anything in the code from being named an audit log.