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ì:

- 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)

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.


Pubblicato il
    Be Smart Be Open

    Business Software Solutions

    Latest articles

    Released in production our flutter based app 'Wasteful'

    11 March 2022

    Contact us

    Email: besmart@besmartbeopen.it
    Pec: besmartbeopen@pec.it
    P.IVA e C.F.: 02137570509
    Top
    Noi ed alcuni partner utilizziamo cookie o tecnologie simili come specificato nella cookie policy Per maggiori informazioni consulta la nostra Cookie Policy Cookie Policy