package server import ( "fmt" "io" "github.com/mostlygeek/llama-swap/internal/router/scheduler" "github.com/mostlygeek/llama-swap/internal/shared" ) // writeSchedulerMetrics emits the request queue in Prometheus text format. // // The reorder counters are the ones that matter for tuning: they say how often // aging or swap affinity actually changed which request went next. Without // them, choosing agingDivisor and swapAffinityBonus is guesswork. func writeSchedulerMetrics(w io.Writer, stats scheduler.QueueStats) { fmt.Fprintf(w, "# HELP llamaswap_scheduler_queue_depth Requests waiting in the scheduler queue, by priority band\n") fmt.Fprintf(w, "# TYPE llamaswap_scheduler_queue_depth gauge\n") for _, band := range shared.PriorityBands { fmt.Fprintf(w, "llamaswap_scheduler_queue_depth{band=%q} %d\n", band, stats.Bands[band].Depth) } fmt.Fprintf(w, "# HELP llamaswap_scheduler_queue_oldest_wait_seconds How long the longest-waiting queued request has waited, by priority band\n") fmt.Fprintf(w, "# TYPE llamaswap_scheduler_queue_oldest_wait_seconds gauge\n") for _, band := range shared.PriorityBands { fmt.Fprintf(w, "llamaswap_scheduler_queue_oldest_wait_seconds{band=%q} %g\n", band, stats.Bands[band].OldestWait.Seconds()) } fmt.Fprintf(w, "# HELP llamaswap_scheduler_dispatched_total Requests dispatched by the scheduler, by priority band\n") fmt.Fprintf(w, "# TYPE llamaswap_scheduler_dispatched_total counter\n") for _, band := range shared.PriorityBands { fmt.Fprintf(w, "llamaswap_scheduler_dispatched_total{band=%q} %d\n", band, stats.Bands[band].Dispatched) } fmt.Fprintf(w, "# HELP llamaswap_scheduler_reorders_total Dispatches where a scoring term changed which request was picked\n") fmt.Fprintf(w, "# TYPE llamaswap_scheduler_reorders_total counter\n") fmt.Fprintf(w, "llamaswap_scheduler_reorders_total{cause=\"aging\"} %d\n", stats.AgingReorders) fmt.Fprintf(w, "llamaswap_scheduler_reorders_total{cause=\"swap_affinity\"} %d\n", stats.AffinityReorders) }