一键导入
monitoring-ops
Expert knowledge for cluster observability. Use when configuring Prometheus/Grafana, Alertmanager, Uptime Kuma, or the Homepage dashboard.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Expert knowledge for cluster observability. Use when configuring Prometheus/Grafana, Alertmanager, Uptime Kuma, or the Homepage dashboard.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | monitoring-ops |
| description | Expert knowledge for cluster observability. Use when configuring Prometheus/Grafana, Alertmanager, Uptime Kuma, or the Homepage dashboard. |
| allowed-tools | Bash, Read, Grep, Glob, Edit, Write |
kube-prometheus-stack (Prometheus, Grafana, Alertmanager)monitoring namespace.alertmanager/discord-alerts-webhook-url).https://status.lab.mtgibbs.devConfigMap/autokuma-monitors. v2.0.0, matched to Uptime Kuma v2 (louislam/uptime-kuma:2). The plain AutoKuma image tag targets Kuma v2; uptime-kuma-v1-* tags exist for v1. AutoKuma 0.7.0 predated Kuma-v2 and was silently broken.sled DB + AutoKuma's /data tracking DB (v1.0.0+ tracks managed entities in a DB, not Kuma labels).uptime-kuma item), incl. discord-webhook-url.discord.json (file stem = autokuma id discord): {"type":"notification","active":true,"config":{"type":"discord","discordWebhookUrl":"${DISCORD_WEBHOOK_URL}",...}}. AutoKuma does NOT honor isDefault — every monitor must opt in explicitly with "notification_name_list": ["discord"].__notification_ filename prefix — it makes AutoKuma 2.0.0 silently skip the file. Use a plain name.ON_DELETE=keep, not delete. With delete, the v2 migration + notification attach triggered a destructive delete-then-recreate flap every sync. keep halts it (trade: a ConfigMap-removed monitor won't auto-prune). Don't flip back without understanding the flap.envsubsts ${DISCORD_WEBHOOK_URL}) at startup — edits don't apply until restart. Bump the mtgibbs.dev/monitors-revision pod-template annotation to force it. (TODO: direct ConfigMap mount + AUTOKUMA__ENV__ webhook templating → file-watcher auto-reload, no roll.)"body": "{}") — Kuma JSON-validates it before sending, else the monitor false-fails.AUTOKUMA__MIGRATE=true to adopt them, then remove it. A from-scratch rebuild doesn't need it.https://home.lab.mtgibbs.devConfigMap.HOMEPAGE_VAR_*).The Beelink (192.168.1.70) is NOT in K3s — it's a Docker Compose host (beelink-ansible). Cluster Prometheus scrapes it over the LAN via additionalScrapeConfigs in the monitoring HelmRelease.
helmrelease.yaml): beelink-node (:9100, node-exporter + GPU textfile), beelink-cadvisor (:8081, per-container), beelink-litellm (:9101, custom usage exporter). All labelled instance=beelink.dashboard-beelink.yaml ("Beelink AI Load") — VRAM/GPU/host/per-container + 3 LiteLLM usage panels.prometheusrule-beelink.yaml — 10 rules (VRAM, GPU thermals, mem, CPU, model-disk, backup freshness). GPU/VRAM series are custom: beelink_gpu_* from gpu-metrics.sh.Docker 29 on the Beelink uses the containerd snapshotter image store (Storage Driver: overlayfs / io.containerd.snapshotter.v1). cAdvisor < v0.55 can't map containers under it (looks for the legacy /var/lib/docker/image/overlay2/layerdb/mounts/<id>/mount-id, fails with "failed to identify the read-write layer ID") → the :8081 target stays green but emits zero per-container series. Fix: cAdvisor v0.55.1+ with cgroup: host (fixed 2026-05-22). Dashboard container panels use name!="" (not name=~".+", which evaluated flaky).
LiteLLM's native Prometheus /metrics is paywalled (401 on OSS builds). We run our own: beelink-ansible/files/litellm-exporter.py (stdlib only, bind-mounted onto python:alpine) polls the OSS /spend/keys + /spend/logs and exposes litellm_requests_total, litellm_tokens_total, litellm_request_duration_ms_sum, litellm_key_spend_usd (per key_alias). Auth = read-only proxy_admin_viewer key at op://pi-cluster/litellm-spend-exporter/password (can GET /spend/*, 403 on mutations — the backup_ro analogue). Dollar-spend reads ~0 (local Ollama models are unpriced) — tokens + latency are the real signals; use rate(). Counters are in-memory (reset on restart; first poll baselines so no restart spike).
# Get admin password
kubectl get secret grafana-admin -n monitoring -o jsonpath="{.data.admin-password}" | base64 -d
kubectl -n monitoring port-forward svc/prometheus-kube-prometheus-alertmanager 9093:9093
# Access at http://localhost:9093
If monitors are duplicated:
autokuma-pvc is bound.strategy: Recreate is set on the deployment.Operating the local coding agent — qwen3-coder via opencode, Claude-orchestrated, spec-driven. Use when running/troubleshooting `oc`, the ralph-qwen loop, or the laptop↔Beelink-qwen creds.
Expert knowledge for cluster backup and restore operations. Use when configuring backups, triggering manual jobs, or restoring data.
Expert knowledge for media applications (Jellyfin, Immich, Jellyseerr). Use when managing media storage, NFS mounts, or application-specific configurations.
Expert knowledge for Pi-hole and Unbound DNS operations. Use when configuring DNS, troubleshooting resolution issues, modifying adlists, or understanding the DNS data flow.
Expert knowledge for Tailscale VPN operations. Use when configuring remote access, exit nodes, ACL policies, or troubleshooting VPN connectivity.
Expert knowledge for the Family Board kiosk dashboard (board.lab.mtgibbs.dev) — a framework-light PWA that renders the n8n intake feed. Use when designing or changing the board UI, adding fixtures, or wiring the feed proxy. The deployable workspace is clusters/pi-k3s/family-board/.