Telemetry and metrics
Everything goes through one structured log on stdout, in the format
IGNIS_LOG_FORMAT picks (pretty on a terminal, JSON otherwise);
IGNIS_LOG_LEVEL sets the level.
- The request lifecycle is the
ignis.request.*events (admitted/ttft/done), with the request id doubling as the OTel trace id (ADR 0012). A cancelled request ends withcancelledinstead ofdone: itscauseistimeout(past its deadline,--server-request-timeoutor--server-stream-timeout, whatever it was answered),consumer(its client hung up, its queued response was cancelled, or a loop-guard rewind replaced it) orshutdown(a model switch stopped it), beside how long it ran, whether it had a lane and the tokens it generated. - The scheduler counters are the DEBUG event
ignis.scheduler.interval, emitted wheneverwaiting,runningorkv_evictionschange (ADR 0025):
2026-09-13T10:00:00.000Z DEBUG ignis.scheduler.interval - scheduler counters changed {tick=123, waiting=2, running=3, kv_evictions=1}- The VRAM layout decided at load is the
ignis.runtime.vram_planevent.
A request id names one request for the life of the process: a switch, a reload and the load after an idle unload go on counting from the same number.
Writing a line never waits on the disk or the pipe behind stdout. A call site
hands its event to a queue, and a background thread is the only thing that ever
performs the real write: INFO, WARN and ERROR go through a bounded priority
channel that blocks briefly rather than drop, so an ERROR never silently
vanishes, while DEBUG and TRACE go through a bounded ring buffer that drops its
oldest entry on overflow rather than ever blocking. At shutdown the flush waits,
up to a fixed budget, only on the priority channel, since a pending DEBUG or
TRACE line is what that channel already permits losing. An attribute whose key
contains a sensitive whole word (password, secret, token,
authorization, bearer, cookie, credential) or word pair (api_key,
private_key) is logged as [REDACTED] by construction, not by call-site
discretion; a key that counts tokens, such as token_capacity, is not one.
With metrics on (the default; --server-metrics false turns them off), the Prometheus exposition covers the request lifecycle and
rejections, KV pool pages and evictions, the KV-RAM arena, retained slots and
what reuse held or gave up, the VRAM plan, decoded tokens, forced thinking
closes, and decision counters with the answer-mass histogram (ADR 0017).
The Playground’s Monitor tab scrapes the same exposition. It scrapes every 2-5 s while the tab is visible and stops while the tab is hidden (so a tab left open does not keep a scale-to-zero deployment awake), scraping again when the tab shows.
