This commit is contained in:
alessandro barucci
2026-08-09 17:03:02 +02:00
parent 5997a56cb3
commit 1a2cca2cd2
11 changed files with 1334 additions and 4 deletions

View File

@@ -0,0 +1,205 @@
# =====================================================================
# PrometheusRule: alert infrastrutturali + CNPG
# Applica con: kubectl apply -f 03-alert-rules.yaml
# =====================================================================
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: infra-alerts
namespace: monitoring
labels:
release: kube-prometheus-stack
spec:
groups:
- name: node-health
rules:
- alert: NodeDown
expr: up{job="node-exporter"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Nodo {{ $labels.instance }} irraggiungibile"
description: "node-exporter non risponde da 5 minuti su {{ $labels.instance }}."
- alert: NodeHighCPU
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 10m
labels:
severity: warning
annotations:
summary: "CPU alta su {{ $labels.instance }}"
description: "Uso CPU sopra 85% da 10 minuti."
- alert: NodeHighMemory
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
for: 10m
labels:
severity: warning
annotations:
summary: "Memoria alta su {{ $labels.instance }}"
description: "Uso memoria sopra 90% da 10 minuti."
- alert: NodeDiskSpaceLow
expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100 < 15
for: 10m
labels:
severity: warning
annotations:
summary: "Spazio disco basso su {{ $labels.instance }} ({{ $labels.mountpoint }})"
description: "Meno del 15% di spazio libero da 10 minuti."
- alert: NodeDiskSpaceCritical
expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100 < 5
for: 5m
labels:
severity: critical
annotations:
summary: "Spazio disco CRITICO su {{ $labels.instance }} ({{ $labels.mountpoint }})"
description: "Meno del 5% di spazio libero da 5 minuti."
- name: kubernetes-health
rules:
- alert: KubePodCrashLooping
expr: increase(kube_pod_container_status_restarts_total[15m]) > 3
for: 5m
labels:
severity: warning
annotations:
summary: "Pod {{ $labels.namespace }}/{{ $labels.pod }} in crash loop"
description: "Più di 3 restart negli ultimi 15 minuti."
- alert: KubePodNotReady
expr: sum by (namespace, pod) (kube_pod_status_phase{phase=~"Pending|Unknown"}) > 0
for: 15m
labels:
severity: warning
annotations:
summary: "Pod {{ $labels.namespace }}/{{ $labels.pod }} non Ready da 15 minuti"
- alert: KubeDeploymentReplicasMismatch
expr: kube_deployment_spec_replicas != kube_deployment_status_replicas_available
for: 15m
labels:
severity: warning
annotations:
summary: "Deployment {{ $labels.namespace }}/{{ $labels.deployment }} con repliche non allineate"
- alert: KubePersistentVolumeFillingUp
expr: (kubelet_volume_stats_available_bytes / kubelet_volume_stats_capacity_bytes) * 100 < 10
for: 10m
labels:
severity: warning
annotations:
summary: "PVC {{ $labels.namespace }}/{{ $labels.persistentvolumeclaim }} quasi pieno"
description: "Meno del 10% di spazio libero sul volume."
- alert: EtcdInsufficientMembers
expr: sum(up{job="kube-etcd"} == 1) < ((count(up{job="kube-etcd"}) + 1) / 2)
for: 5m
labels:
severity: critical
annotations:
summary: "Quorum etcd a rischio"
description: "Meno della maggioranza dei membri etcd è raggiungibile."
- name: tls-certificates
rules:
# Richiede blackbox_exporter con probe HTTPS configurato sui tuoi
# endpoint esterni; vedi nota nel file README.
- alert: TLSCertExpiringSoon
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 15
for: 1h
labels:
severity: warning
annotations:
summary: "Certificato TLS per {{ $labels.instance }} in scadenza"
description: "Meno di 15 giorni alla scadenza del certificato."
- alert: TLSCertExpired
expr: probe_ssl_earliest_cert_expiry - time() < 0
for: 5m
labels:
severity: critical
annotations:
summary: "Certificato TLS per {{ $labels.instance }} SCADUTO"
---
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: cnpg-alerts
namespace: monitoring
labels:
release: kube-prometheus-stack
spec:
groups:
- name: cnpg-health
rules:
- alert: CNPGClusterNotHealthy
expr: cnpg_collector_up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Cluster CNPG {{ $labels.namespace }}/{{ $labels.pod }} non raggiungibile"
description: "L'exporter CNPG non risponde da 5 minuti."
- alert: CNPGInstanceInUnexpectedRecovery
expr: cnpg_pg_replication_in_recovery == 1 and on(pod) cnpg_pg_replication_is_wal_receiver_up == 0
for: 5m
labels:
severity: warning
annotations:
summary: "Istanza {{ $labels.pod }} in recovery inatteso"
description: "Verifica se il ruolo primary/standby è quello atteso."
- alert: CNPGReplicationLagHigh
expr: cnpg_pg_replication_lag > 300
for: 5m
labels:
severity: warning
annotations:
summary: "Replication lag alto su {{ $labels.pod }}"
description: "Lag di replica superiore a 300 secondi."
- alert: CNPGWALArchivingFailing
expr: increase(cnpg_pg_stat_archiver_failed_count[15m]) > 0
for: 5m
labels:
severity: critical
annotations:
summary: "Archiviazione WAL fallita su {{ $labels.pod }}"
description: "Almeno un fallimento di archiviazione WAL negli ultimi 15 minuti — rischio per i backup e il point-in-time recovery."
- alert: CNPGBackupFailed
expr: cnpg_collector_last_failed_backup_timestamp > cnpg_collector_last_available_backup_timestamp
for: 5m
labels:
severity: critical
annotations:
summary: "Ultimo backup fallito per {{ $labels.namespace }}/{{ $labels.pod }}"
- alert: CNPGNoRecentBackup
expr: (time() - cnpg_collector_last_available_backup_timestamp) > 86400
for: 10m
labels:
severity: warning
annotations:
summary: "Nessun backup riuscito nelle ultime 24h per {{ $labels.namespace }}/{{ $labels.pod }}"
- alert: CNPGConnectionsNearLimit
expr: (cnpg_backends_total / cnpg_pg_settings_setting{name="max_connections"}) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "Connessioni Postgres vicine al limite su {{ $labels.pod }}"
description: "Oltre l'85% di max_connections in uso."
# Nota: i nomi esatti delle metriche cnpg_* possono variare leggermente
# tra versioni dell'operatore CNPG. Verifica sempre su
# http://localhost:9090/graph con `{__name__=~"cnpg_.+"}` dopo il
# port-forward a Prometheus, e allinea le espressioni se necessario:
# kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090