From f304a7133e727c53565436bfa8c55861a13b51f4 Mon Sep 17 00:00:00 2001 From: rock Date: Sun, 13 Sep 2026 21:50:00 +0900 Subject: [PATCH] feat(O12): Prometheus alerting rules for all SLOs - 11 alert rules across 5 groups - Availability: service down, DB down, embedding down - Latency: ingest p95 > 5s, query p95 > 2s, embedding p95 > 10s - Errors: ingest/query error rate > 10%, embedding failures - Storage: pool exhausted, write errors - Quality: relevance precision < 30% - PrometheusRule CRD for kube-prometheus-stack --- k8s/infra/prometheus-alerts.yaml | 130 +++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 k8s/infra/prometheus-alerts.yaml diff --git a/k8s/infra/prometheus-alerts.yaml b/k8s/infra/prometheus-alerts.yaml new file mode 100644 index 0000000..862695a --- /dev/null +++ b/k8s/infra/prometheus-alerts.yaml @@ -0,0 +1,130 @@ +# Prometheus alerting rules for Poimen Memory (O12) +# Deploy: kubectl apply -f k8s/infra/prometheus-alerts.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: poimen-memory-alerts + namespace: poimen + labels: + app: poimen-memory + prometheus: k8s + role: alert-rules +spec: + groups: + - name: poimen-memory.availability + rules: + - alert: MemoryServiceDown + expr: up{job="poimen-memory"} == 0 + for: 2m + labels: + severity: critical + annotations: + summary: "Poimen memory service is down" + description: "Memory service has been unreachable for > 2 minutes" + + - alert: MemoryDBDown + expr: memory_dependency_db_up == 0 + for: 1m + labels: + severity: critical + annotations: + summary: "Memory service cannot reach database" + description: "DB dependency health check failing for > 1 minute" + + - alert: MemoryEmbeddingDown + expr: memory_dependency_embedding_up == 0 + for: 5m + labels: + severity: warning + annotations: + summary: "Embedding service unreachable" + description: "Embedding dependency health check failing for > 5 minutes" + + - name: poimen-memory.latency + rules: + - alert: MemoryIngestLatencyHigh + expr: histogram_quantile(0.95, rate(memory_ingest_duration_seconds_bucket[5m])) > 5 + for: 5m + labels: + severity: warning + annotations: + summary: "Ingest p95 latency > 5s" + description: "95th percentile ingest latency is {{ $value }}s" + + - alert: MemoryQueryLatencyHigh + expr: histogram_quantile(0.95, rate(memory_query_duration_seconds_bucket[5m])) > 2 + for: 5m + labels: + severity: warning + annotations: + summary: "Query p95 latency > 2s" + description: "95th percentile query latency is {{ $value }}s" + + - alert: MemoryEmbeddingLatencyHigh + expr: histogram_quantile(0.95, rate(memory_query_embedding_duration_seconds_bucket[5m])) > 10 + for: 5m + labels: + severity: warning + annotations: + summary: "Embedding p95 latency > 10s" + description: "95th percentile embedding call latency is {{ $value }}s" + + - name: poimen-memory.errors + rules: + - alert: MemoryIngestErrorRateHigh + expr: rate(memory_ingest_errors_total[5m]) / rate(memory_ingest_requests_total[5m]) > 0.1 + for: 5m + labels: + severity: warning + annotations: + summary: "Ingest error rate > 10%" + description: "{{ $value | humanizePercentage }} of ingest requests are failing" + + - alert: MemoryQueryErrorRateHigh + expr: rate(memory_query_errors_total[5m]) / rate(memory_query_requests_total[5m]) > 0.1 + for: 5m + labels: + severity: warning + annotations: + summary: "Query error rate > 10%" + description: "{{ $value | humanizePercentage }} of query requests are failing" + + - alert: MemoryEmbeddingFailureRate + expr: rate(memory_query_embedding_failures_total[5m]) > 0.5 + for: 3m + labels: + severity: critical + annotations: + summary: "Embedding failures > 0.5/s" + description: "Embedding service failing at {{ $value }}/s — queries cannot embed" + + - name: poimen-memory.storage + rules: + - alert: MemoryDBPoolExhausted + expr: memory_db_pool_idle == 0 + for: 5m + labels: + severity: warning + annotations: + summary: "DB connection pool exhausted" + description: "No idle DB connections for > 5 minutes" + + - alert: MemoryWriteErrorsHigh + expr: rate(memory_write_errors_total[5m]) > 1 + for: 5m + labels: + severity: warning + annotations: + summary: "Write errors > 1/s" + description: "Database write errors at {{ $value }}/s" + + - name: poimen-memory.quality + rules: + - alert: MemoryRelevanceLow + expr: memory_relevance_precision < 0.3 + for: 15m + labels: + severity: warning + annotations: + summary: "Retrieval relevance precision < 30%" + description: "Relevance precision is {{ $value | humanizePercentage }}"