Files
2026-10-19 16:55:02 +02:00

81 lines
3.5 KiB
YAML

# Alerts für den Healer (config/healer-rules.yaml). Namen müssen zu den Regeln passen.
groups:
- name: knaster-slots
rules:
- alert: SlotEndpointDown
expr: knaster_slot_endpoint_up == 0
for: 2m
labels: {severity: high}
annotations: {summary: "Slot {{ $labels.slot }} antwortet nicht"}
- alert: SlotCanaryFailing
expr: knaster_slot_canary_ok == 0 and knaster_slot_endpoint_up == 1
for: 5m
labels: {severity: warning}
annotations: {summary: "Slot {{ $labels.slot }} antwortet, aber falsch"}
- alert: VllmKvCacheSaturated
expr: max by (slot) (vllm:gpu_cache_usage_perc or vllm:kv_cache_usage_perc) > 0.95
for: 10m
labels: {severity: warning}
annotations: {summary: "KV-Cache von {{ $labels.slot }} dauerhaft voll"}
- name: knaster-gpu
rules:
- alert: GpuXidError
# aus deploy/scripts/gpu-xid-textfile.sh (node_exporter textfile collector)
expr: increase(knaster_gpu_xid_errors_total[10m]) > 0
labels: {severity: high}
annotations: {summary: "NVIDIA-Xid-Fehler auf {{ $labels.instance }} (Xid {{ $labels.xid }})"}
- alert: GpuTemperatureHigh
expr: nvidia_smi_temperature_gpu > 85
for: 5m
labels: {severity: warning}
annotations: {summary: "GPU {{ $labels.slot }} über 85 °C"}
- name: knaster-nodes
rules:
- alert: NodeDown
expr: up{job="node"} == 0
for: 3m
labels: {severity: high}
annotations: {summary: "{{ $labels.instance }} nicht erreichbar"}
- alert: DiskAlmostFull
expr: node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes < 0.10
for: 15m
labels: {severity: warning}
annotations: {summary: "{{ $labels.instance }} {{ $labels.mountpoint }} < 10 % frei"}
# k3s (Task 6.5): nur melden, der Healer greift nicht ein (config/healer-rules.yaml, Aktion notify)
- name: knaster-k3s
rules:
- alert: K3sNodeNotReady
expr: kube_node_status_condition{condition="Ready", status="true"} == 0
for: 5m
labels: {severity: high}
annotations: {summary: "k3s-Knoten {{ $labels.node }} nicht bereit"}
- alert: K3sPodCrashLooping
# max_over_time: zwischen zwei Neustarts steht der Container kurz nicht in CrashLoopBackOff (Test 19.10.)
expr: max by (namespace, pod, container) (max_over_time(kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff"}[5m])) >= 1
for: 10m
labels: {severity: warning}
annotations: {summary: "{{ $labels.namespace }}/{{ $labels.pod }} ({{ $labels.container }}) startet immer wieder neu"}
- alert: K3sDeploymentUnavailable
expr: max by (namespace, deployment) (kube_deployment_spec_replicas) > max by (namespace, deployment) (kube_deployment_status_replicas_available)
for: 15m
labels: {severity: warning}
annotations: {summary: "Deployment {{ $labels.namespace }}/{{ $labels.deployment }} hat zu wenige bereite Pods"}
- alert: K3sContainerMemoryNearLimit
expr: >
max by (namespace, pod, container) (container_memory_working_set_bytes{job="cadvisor"})
/ on (namespace, pod, container)
max by (namespace, pod, container) (kube_pod_container_resource_limits{resource="memory"}) > 0.9
for: 10m
labels: {severity: warning}
annotations: {summary: "{{ $labels.namespace }}/{{ $labels.pod }} ({{ $labels.container }}) über 90 % des Speicherlimits"}