.. _event-push: **************************************************************************************************** Eventi "Push" **************************************************************************************************** .. contents:: Contenuti ======================================================================== Introduzione ======================================================================== Il flusso di monitoraggio e' diviso in tre fasi: * **RECEIVE**: Raccolta dati dalla rete ( esecuzione di datagroup da parte di agenti) * **PROCESS**: Ricezione ed elaborazione dei dati dal server centrale di sanet * **NOTIFY**: Notifica di allarmi Attraverso gli *eventi/allarmi Push* e' possibile inserirsi in questo flusso utilizzando dati prodotti da applicazioni esterne. E' possibile effettuare due tipi di operazioni *push*, che si differenzioano in base al punto di *ingresso* nel sistema: * Push di eventi * Push di allarmi In questo schema viene riassunto il flusso di: * monitoraggio di datagroup normali * monitoraggio di trap snmp attraverso datagroup passsivi * push di eventi ed elaborazione don datagroup passivi * push di allarmi in entables .. image:: ../_static/web/images/receive-process-notify-flow.png :width: 640px ======================================================================== Push di eventi ======================================================================== Un evento e' un insieme di dati in forma *chiave*/*valore* che vengono loggati e processati da datagroup passivi. Quando viene fatto push di un evento, Sanet compie le seguenti operazioni: 1) L'evento viene storicizzato nel log di sanet come evento CUSTOM. 2) Sanet cerca di capire se l'evento e' associabile ad un elemento di monitoraggio. 3) L'evento viene processato da un datagroup passivo. Le condition di questo datagroup possono produrre o meno allarmi. Selezione dell'elemento di monitoraggio ------------------------------------------------------------ In fase di push e' possibile *forzare* due valori: * indirizzo ip sorgente * elemento di monitoraggio associato all'evento. Se viene specificato solo l'indirizzo IP sorgente, sanet cerca di identificare il nodo di di monitoraggio associato, con un meccanismo identico a quello per gestire le Trap SNMP. Elaborazione con datagroup passivi: passive match string ------------------------------------------------------------ Per poter elaborare un evento con un datagroup passivo e' necessario associare all'evento una stringa di *passive match*. Questa stringa viene confrontata con l'attributo *passive match* di tutti i datagroup associati all'elemento di monitoraggio che sanet ha associato all'evento. .. important:: l'attributo *passive match* di un datagroup puo' specificare, usando una sintassi particoalre, una *regular expression*. Si veda il paragrafo :ref:`datagroup-passive-match`. Dati dell'evento elaborati dal datagroup passivo ------------------------------------------------ Tutte le tuple *chiave*/*valore* associate ad un evento vengono convertite in simboli accessibile nelle *espressioni* di *datasource* e *condition*. Esempio: :: EVENTO SIMBOLI ACCESSIBILI NELLE EXPR { data : "1/1/2015", -> $data = "1/1/2015" variabile1 : 666 -> $variabile1 = 666 } Comando push_event ------------------------------------------------ Per effetuare il push di un evento bisogna usare il comando: :: sanet-manage push_event [optioni] Esempio: :: python manage.py push_event -L 10 --element localhost '{ "val": 10 }' Dati dell'evento ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A riga di comando ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ L'allarme deve essere un *dizionario* di attributi *chiave*/*valore* codificato in formato JSON valido. Esempio: Dato il seguente allarme: :: { "campo1": "hello", "campo2": "world", "campo3": 1234 } Il comando e': :: sanet-manage push_event --element localhost '{ "campo1" : "hello", "campo2" : "world", "campo3" : 1234 }' Da standard input ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: sanet-manage push_event --element localhost --stdin { "campo1" : "hello", "campo2" : "world", "campo3" : 1234 } Ctrl+d Da environment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Per specificare un attributo dell'allarme da environemnt bisogna definire una variabile d'ambiente con il seguente nome: :: EVENT_PUSH_{nome}={valore} :: export EVENT_PUSH_campo1=ciao sanet-manage push_alarm --env --element localhost L'allarme inviato ad entables sara': :: { "campo1" : "ciao" } Esempi ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Configurazione nodo e datagroup passivo: :: datagroup-template dgpassive source site description "" passive-match passivo minperiod 0 title "Datagroup per eventi passivi" condition check expr "$var == 1" max-tries 1 msg-downbody "Evento passivo down" msg-downsubj "[DOWN] Evento passivo" msg-upbody "Evento passivo up" msg-upsubj "[UP] Evento passivo" title "Controllo passivo" exit exit node localhost datagroup dgpassive exit exit Configurazione entables: :: entables -t notify -A DEFAULT -j SMTP --smtp_rcpt_to '${mail_to}' --smtp_message '${mail_body} - ${rawalarm}' --smtp_subject '${mail_subject}' Push dell'evento: :: python manage.py push_event -L 10 '{ "var": 0 }' --sourceip 127.0.0.1 --passive passivo .. _event-push-wildcards: Mostrare i dati *pushed* nei messaggi degli allarmi ------------------------------------------------------ Quando viene generato un allarme da un evento pushed, e' possibile inserire i dati *pushed* all'interno del corpo dei messsaggi UP e DOWN usando le wildcard dinamici (Vedi anche :ref:`monitoring-alarms-wildcard-dinamici`). La sintassi e' la seguente: :: {{ pushed_data.[. ...] }} Esempio: Se questi sono i dati dell'evento *pushed*: :: { "campo1" : "ciao", "campo2" : [ 1, 2, 3 ], "campo3" : { "key1": 666, "key2": 777, } } Questi sono alcuni esempi delle wildcard che e' possibile usare: :: {{ pushed_data.campo1 }} --> ciao {{ pushed_data.campo2.1 }} --> 2 {{ pushed_data.campo3.key2 }} --> 777 ======================================================================== Push di allarmi in entables ======================================================================== Un allarme e' un insieme di tuple *chiave*/*valore*. Questi dati possono essere utilizzati in entables per fare *match*, espandere stringhe e template nei *target*, ecc. Un allarme viene processato da *entables* cosi' come viene inserito nel sistema. **IMPORTANTE**: Sanet non salva nel log degli eventi questa operazione. **IMPORTANTE**: I dati dell'allarme non vengono pre-processati in nessun modo. L'allarme viene processato da entables cosi' come viene fornito. Comando push_alarm ------------------------------------------------------------------------ Per fare push di un allarme in entables bisogna usare il comando: :: sanet-manage push_alarm [opzioni] [ dati allarme in formato JSON ] Esempio: :: sanet-manage push_alarm '{ "dato" : 10 }' Dati dell'allarme a riga di comando ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ L'allarme deve essere un *dizionario* di attributi *chiave*/*valore* codificato in formato JSON valido. Esempio: Dato il seguente allarme: :: { "campo1": "hello", "campo2": "world", "campo3": 1234 } Il comando e': :: sanet-manage push_alarm '{ "campo1" : "hello", "campo2" : "world", "campo3" : 1234 }' Dati dell'allarme da standard input ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: sanet-manage push_alarm --stdin { "campo1" : "hello", "campo2" : "world", "campo3" : 1234 } Ctrl+d Dati dell'allarme da environemnt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Per specificare un attributo dell'allarme da environemnt bisogna definire una variabile d'ambiente con il seguente nome: :: EVENT_PUSH_{nome}={valore} :: export EVENT_PUSH_campo1=ciao sanet-manage push_alarm --env L'allarme inviato ad entables sara': :: { "campo1" : "ciao" } Campi obbligatori/automatici ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ogni allarme deve avere due attributi obbligatori. *IMPORTANTE*: in assenza di questi due attributi, Sanet calcola automaticamente un valore da asseganre ad entrambi. +---------------------+--------------------------------------------------------------------+--------------------------------------------------------------------+ | Attributo | Descrizione | Default | +=====================+====================================================================+====================================================================+ | tenantid | UUID del tenant a cui associare l'allarme. (vedi opzione --tenant) | UUID del tentant primario | +---------------------+--------------------------------------------------------------------+--------------------------------------------------------------------+ | uuid | UUID univoco dell'alarme | Calcolato nuovo | +---------------------+--------------------------------------------------------------------+--------------------------------------------------------------------+ Esempio 1 ~~~~~~~~~ Configurazione di entables: :: ./bin/entables -t notify -A DEFAULT -j SMTP --smtp_rcpt_to 'root' --smtp_message '${rawalarm}' --smtp_subject 'Evento custom' Push dell'allarme: :: sanet-manage push_alarm '{ "val":10 }' Esempio 2 ~~~~~~~~~ Invio semplice di allarmi via SMTP: :: entables -t notify -F DEFAULT entables -t notify -A DEFAULT -j SMTP --smtp_rcpt_to '${mail_to}' --smtp_message '${mail_body}' --smtp_xheaders '${mail_xheaders}' --smtp_subject '${mail_subject}' Push di un evento custom. Il campo "mail" conviene i parametri che entables riconosce ed espande con i tag *buitin*: :: sanet-manage push_alarm -L 10 '{ "mail": { "to":"root", "subject": "evento custom", "body": "corpo" } }' Oppure: :: sanet-manage push_alarm -L 10 --stdin '{ "mail": { "to":"root", "subject": "evento custom", "body": "corpo" } }' Ctrl+d Distinguere gli allarmi pushed in entables ------------------------------------------------------------------------ E' possibile distinguere gli allarmi generati da sanet da quelli *pushed* attraverso i match disponibili di Entables. Per dettagli si rimanda alla documentazione di Entables: match :ref:`entables-matches-attributes`. Esempio: :: entables -t notify -F DEFAULT entables -t notify -A DEFAULT -m attr --attr_alarmtype "normal" -j SYSLOG --syslog_msg "normale" entables -t notify -A DEFAULT -m attr --attr_alarmtype "pushed" -j SYSLOG --syslog_msg "pushed"