From 3724cd3cdb829d393edb99d1cdcda6e1d80977df Mon Sep 17 00:00:00 2001 From: Story Crater Bot <19826264+Riotpiaole@users.noreply.github.com> Date: Sun, 16 Aug 2026 06:54:56 -0700 Subject: [PATCH] feat(monitoring): add LLM Frontend Grafana dashboard Resources (CPU/mem/restarts) + Loki logs across llm-serving, agent-pod, and api (Kong) namespaces, mirroring the svc-*.yaml dashboard pattern. No request-rate/latency/token panels yet -- no ServiceMonitor exists for Kong or the KServe predictors, so there's no metric to query. --- .../monitoring/dashboards/llm-frontend.yaml | 18 ++++++++++++++++++ k8s/infra/monitoring/kustomization.yaml | 1 + 2 files changed, 19 insertions(+) create mode 100644 k8s/infra/monitoring/dashboards/llm-frontend.yaml diff --git a/k8s/infra/monitoring/dashboards/llm-frontend.yaml b/k8s/infra/monitoring/dashboards/llm-frontend.yaml new file mode 100644 index 0000000..41f9a28 --- /dev/null +++ b/k8s/infra/monitoring/dashboards/llm-frontend.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: llm-frontend-dashboard + namespace: logging + labels: + grafana_dashboard: "1" + annotations: + grafana_folder: "LLM" + # No ServiceMonitor/PodMonitor exists yet for Kong or the KServe + # predictors (ornith/reasoning/qwen/embeddings/reranker/verifier), so + # there is no request-rate/latency/token metric to show. This dashboard + # is resources + logs only, sourced from cAdvisor/kube-state-metrics + # (cluster-wide, no extra scrape config needed) and Loki. Add RED-metric + # panels once a metrics exporter exists for those services. +data: + llm-frontend.json: | + {"title":"LLM Frontend","uid":"llm-frontend","schemaVersion":39,"timezone":"browser","time":{"from":"now-6h","to":"now"},"refresh":"30s","panels":[{"id":1,"title":"Row: Availability","type":"row","collapsed":true,"gridPos":{"h":1,"w":24,"x":0,"y":0},"panels":[{"id":2,"title":"llm-serving pods ready","type":"stat","gridPos":{"h":4,"w":8,"x":0,"y":1},"datasource":{"type":"prometheus","uid":"prometheus"},"targets":[{"expr":"sum(kube_pod_status_ready{namespace=\"llm-serving\",condition=\"true\"})"}]},{"id":3,"title":"agent-pod ready","type":"stat","gridPos":{"h":4,"w":8,"x":8,"y":1},"datasource":{"type":"prometheus","uid":"prometheus"},"targets":[{"expr":"sum(kube_pod_status_ready{namespace=\"agent-pod\",condition=\"true\"})"}]},{"id":4,"title":"kong (api) pods ready","type":"stat","gridPos":{"h":4,"w":8,"x":16,"y":1},"datasource":{"type":"prometheus","uid":"prometheus"},"targets":[{"expr":"sum(kube_pod_status_ready{namespace=\"api\",condition=\"true\"})"}]}]},{"id":10,"title":"Row: Resources","type":"row","collapsed":true,"gridPos":{"h":1,"w":24,"x":0,"y":1},"panels":[{"id":11,"title":"CPU by pod","type":"timeseries","gridPos":{"h":8,"w":12,"x":0,"y":2},"datasource":{"type":"prometheus","uid":"prometheus"},"targets":[{"expr":"sum(rate(container_cpu_usage_seconds_total{namespace=~\"llm-serving|agent-pod|api\"}[5m])) by (namespace, pod)","legendFormat":"{{namespace}}/{{pod}}"}]},{"id":12,"title":"Memory by pod","type":"timeseries","gridPos":{"h":8,"w":12,"x":12,"y":2},"fieldConfig":{"defaults":{"unit":"bytes"}},"datasource":{"type":"prometheus","uid":"prometheus"},"targets":[{"expr":"sum(container_memory_working_set_bytes{namespace=~\"llm-serving|agent-pod|api\"}) by (namespace, pod)","legendFormat":"{{namespace}}/{{pod}}"}]},{"id":13,"title":"GPU-node predictor restarts","type":"timeseries","gridPos":{"h":8,"w":24,"x":0,"y":10},"datasource":{"type":"prometheus","uid":"prometheus"},"targets":[{"expr":"sum(rate(kube_pod_container_status_restarts_total{namespace=\"llm-serving\"}[15m])) by (pod)","legendFormat":"{{pod}}"}]}]},{"id":20,"title":"Row: Logs","type":"row","collapsed":true,"gridPos":{"h":1,"w":24,"x":0,"y":2},"panels":[{"id":21,"title":"llm-serving logs","type":"logs","gridPos":{"h":10,"w":24,"x":0,"y":3},"datasource":{"type":"loki","uid":"loki"},"targets":[{"expr":"{namespace=\"llm-serving\"}"}]},{"id":22,"title":"agent-pod logs (pi runs)","type":"logs","gridPos":{"h":10,"w":24,"x":0,"y":13},"datasource":{"type":"loki","uid":"loki"},"targets":[{"expr":"{namespace=\"agent-pod\"}"}]},{"id":23,"title":"api (kong) logs","type":"logs","gridPos":{"h":10,"w":24,"x":0,"y":23},"datasource":{"type":"loki","uid":"loki"},"targets":[{"expr":"{namespace=\"api\"}"}]}]}]} diff --git a/k8s/infra/monitoring/kustomization.yaml b/k8s/infra/monitoring/kustomization.yaml index eb14f2c..b328de0 100644 --- a/k8s/infra/monitoring/kustomization.yaml +++ b/k8s/infra/monitoring/kustomization.yaml @@ -19,6 +19,7 @@ resources: - dashboards/control-plane-logs.yaml - dashboards/hardware-overview.yaml - dashboards/kube-controller-health.yaml + - dashboards/llm-frontend.yaml - dashboards/service-availability.yaml - dashboards/service-golden-signals.yaml - dashboards/service-internals.yaml