206 lines
7.8 KiB
YAML
206 lines
7.8 KiB
YAML
# =====================================================================
|
|
# 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
|