# Alert rules surfaced in Grafana's alerting UI (no Alertmanager needed at # this scale — Grafana can route them later via email/Telegram). groups: - name: erp-availability rules: - alert: ErpApiDown expr: up{job="erp-api"} == 0 for: 2m labels: severity: critical annotations: summary: "ERP API is not scraping (down or /metrics failing)" - alert: ErpApiHighErrorRate expr: | sum(rate(http_requests_total{job="erp-api", status=~"5.."}[5m])) / clamp_min(sum(rate(http_requests_total{job="erp-api"}[5m])), 0.001) > 0.05 for: 5m labels: severity: warning annotations: summary: "ERP API 5xx rate above 5% for 5 minutes" - alert: ErpApiSlowRequests expr: | histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket{job="erp-api"}[5m])) by (le)) > 2 for: 10m labels: severity: warning annotations: summary: "ERP API p95 latency above 2s for 10 minutes" - name: host rules: - alert: HostDiskAlmostFull expr: (node_filesystem_avail_bytes{mountpoint="/", fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{mountpoint="/", fstype!~"tmpfs|overlay"}) < 0.1 for: 15m labels: severity: critical annotations: summary: "Root filesystem below 10% free (deploy builds will fail)" - alert: HostMemoryPressure expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.1 for: 10m labels: severity: warning annotations: summary: "Host RAM below 10% available (check monitoring stack limits)" - alert: PostgresTooManyConnections expr: sum(pg_stat_activity_count) > 80 for: 10m labels: severity: warning annotations: summary: "PostgreSQL connection count above 80"