- record: is_summer_time expr: | (vector(1) and (month() > 3 and month() < 10)) or (vector(1) and (month() == 3 and (day_of_month() - day_of_week()) >= 25) and absent((day_of_month() >= 25) and (day_of_week() == 0))) or (vector(1) and (month() == 10 and (day_of_month() - day_of_week()) < 25) and absent((day_of_month() >= 25) and (day_of_week() == 0))) or (vector(1) and ((month() == 10 and hour() < 1) or (month() == 3 and hour() > 0)) and ((day_of_month() >= 25) and (day_of_week() == 0))) or vector(0)
Prometheus Tips: Time based alerts
Suggerimenti per l’invio degli alert in funzione dell’ora del giorno
Prometheus e Alertmanager sono indubbiamente una potente e diffusa combinazione di strumenti per il monitoraggio. Nonostante questo ci sono alcune funzionalità che ancora mancano, come la possibilità di inviare gli alert solo in alcune fasce orarie. O meglio, non è che non si può fare ma ci vuole un po’ di pazienza, se hai incontrato questo problema questo articolo fa per te.
La problematica
Vorrei che alcuni alert con bassa priorità non fossero invati durante la notte.
Prometheus ha alcune function legate al tempo che si possono utilizzare, come per esempio la time(), che ritorna il tempo in UTC.
Visto però che almeno in Europa esiste l’ora legale, tutte le soluzioni che si basano solo l’UTC soffrono del problema dell’ora solare, cioè lo spostamento avanti dell’orario di un’ora durante l’estate; tutte queste soluzioni hanno bisogno di aggiustamenti durante l’anno in funzione del fatto che l’ora solare sia attiva o meno.
Per esempio in Italia abbiamo il timezone Europe/Rome che può corrispondere ad un UTC +1 o +2.
Fortunamente utilizzando le potenzialità del PromQL si può sopperire a questa problematica.
La soluzione
Prima di tutto (nel file dove sono definite le rules - alert_rules.yml?) possiamo registrare una metrica che indichi se l’ora solare è attiva o meno, per esempio così:
Questa espressione verificherà le varie condizioni sui mesi e giorni dell’anno e restituirà 1 se se siamo nel periodo dell’orario solare, 0 altrimenti.
A questo punto possiamo convertire il nostro orario UTC in Europe/Rome, registrandolo in un’altra rule.
- record: europe_rome_time expr: time() + 3600 + 3600 * is_summer_time
Ricordo che l’orario Europe/Rome corrisponde a UTC + 1 ora (3600 secondi) + un’altra ora se siamo in estate.
Adesso possiamo creare la nostra metrica europe_rome_hour che contiene l’orario del giorno.
- record: europe_rome_hour expr: hour(europe_rome_time)
(esiste una funzione Prometheus hour() che restituisce l’ora del giorno in UTC e quindi non fa al caso nostro.
Con questa nuova metrica europe_home_hour siamo già a buon punto, manca solo l’ultimo passo!
Applicare l’ora del giorno localizzata nei nostri alert
A questo punto vediamo un possibile utilizzo di europe_rome_hour nell’espressione di un’alert.
- alert: SystemLoadHigh expr: system_load_average_1m >= 2 AND ON() europe_rome_hour > 7 for: 5m labels: severity: warning
Non è proprio immediato come uno potrebbe aspettarsi, vero?
La spiegazione di come combinare le alert conditions la puoi trovare qui Combining alert conditions.
Conclusioni
Filtrare gli alert in funzioni di condizioni legate all’orario del giorno non è per niente banale in Prometheus + Alertmanager. Una piccola guida come questa può far risparmiare molto tempo a chi approccia al problema per la prima volta, speriamo ti sia stata di aiuto e che possa essere facilmente adattata alle tue esigenze.
La problematica del Time of day based alert routing/notification è tratta in una issue ufficiale #876 dell’alertmanager.
Questo documento è un ri-adattamento dell’articolo di Tom Fawcett su Medium Time of day based notifications with Prometheus and Alertmanager. Ringraziamo Tom per averci fatto risparmiare un po’ di tempo la prima volta che abbiamo affrontato questa problematica.
Per maggiori approfondimenti:
[Prometheus] https://prometheus.io/
[Alert_Manager] https://prometheus.io/docs/alerting/latest/alertmanager/
[Prometheus_Operators] https://prometheus.io/docs/prometheus/latest/querying/operators/
[Combining_Alert_Conditions] https://www.robustperception.io/combining-alert-conditions
[Time_of_day_based_alert_routing_notification_876] https://github.com/prometheus/alertmanager/issues/876
[Time_of_day_based_notifications_with_Prometheus_and_Alertmanager] https://medium.com/@tom.fawcett/time-of-day-based-notifications-with-prometheus-and-alertmanager-1bf7a23b7695