Webhooks pour Ticket API
Définition d'un webhook
Un webhook est un objet JSON de la forme suivante, stocké dans la collection
webhooks
:
{
// ID du webhook (généré automatiquement ou choisi par l'utilisateur).
"_id" : "declare_external_ticket",
// Conditions dans lesquelles le webhook doit être appelé (requis)
"hook": {
// Liste de triggers (requis). L'un de ces triggers doit avoir eu lieu
// pour que le webhook soit appelé.
// Pour l'instant, les triggers à implémenter sont : create, stateinc,
// statedec, statusinc, statusdec, ack, ackremove, cancel, uncancel,
// comment, done, declareticket, assocticket, snooze, unsnooze,
// resolve.
"triggers": ["create"],
// Liste de patterns permettant de filtrer les événements (optionnel,
// uniquement si la liste de triggers ne contient pas resolve, cancel,
// unsnooze, ...). Le format des patterns est le même que pour
// l'event-filter.
"event_patterns": [],
// Liste de patterns permettant de filtrer les entités (optionnel).
"entity_patterns": []
},
// Requête du webhook (requis)
"request": {
// Méthode HTTP à utiliser (requis).
"method": "POST",
// Template permettant de déterminer l'URL (requis)
"url" : "{{ $val := .Alarm.Value.Status.Value }}http://127.0.0.1:5000/{{if ((eq $val 0) or (eq $val 2) or (eq $val 4))}}even{{else}}odd{{end}}",
// Identifiants pour l'authentification HTTP basique (optionnel).
"auth": {
"username": "...",
"password": "..."
},
// Headers, les valeurs sont des templates (optionnel).
"headers": {
// Par exemple :
"Content-type": "application/json"
},
// Template permettant de déterminer le payload (requis).
"payload" : "{{ $comp := .Alarm.Value.Component }}{{ $reso := .Alarm.Value.Resource }}{{ $val := .Alarm.Value.Status.Value }}{\"component\": \"{{$comp}}\",\"resource\": \"{{$reso}}\", \"parity\": {{if ((eq $val 0) or (eq $val 2) or (eq $val 4))}}even{{else}}odd{{end}}, \"value\": {{$val}} }"
},
// Déclaration de ticket (optionnel, uniquement si la liste de triggers ne
// contient pas resolve, cancel, unsnooze, ...)
"declare_ticket": {
// Nom du champs de la réponse contenant le numéro de ticket (suppose
// que la réponse est en json).
"ticket_id" : "id",
// Possibilité d'ajouter des champs supplémentaires au step
"ticket_creation_date" : "timestamp",
"priority" : "priority"
}
}
Plugin webhooks
Ajouter un plugin de postprocessing pour les webhooks dans https://git.canopsis.net/cat/go-engines.
Les certificats et les webhooks doivent être chargés dans les méthodes Init
et Beat
. Si un webhook est invalide (e.g. template invalide), un message est ajouté dans les logs.
Les méthodes AxePostProcessor.ProcessEvent
et AxePostProcessor.ProcessAlarms
doivent parcourir les webhooks, et exécuter ceux qui s'appliquent à l'événement, l'alarme et/ou l'AlarmChange passés en paramètres.
Si le champs declare_ticket
est défini, le numéro de ticket, et d'éventuels champs supplémentaires sont extraits de la réponse, et un step declareticket
est ajouté à l'alarme. Pour les champs supplémentaires, ajouter un champ Data map[string]string
dans le step AlarmTicket
(alarm_value.go
).
Sinon, la requête est lancée dans une goroutine, pour éviter de bloquer l'exécution du moteur.
Note : penser à renommer declare_ticket
en un nom plus explicite.
Exemples de webhooks
{
"_id" : "declare_external_ticket",
"hook" : {
"triggers" : [
"create"
],
"event_patterns" : [
{
"connector" : "zabbix"
}
],
"entity_patterns" : [
{
"infos" : {
"output" : {
"value": {"regex_match": "MemoryDisk.*"}
}
}
}
]
},
"request" : {
"method" : "PUT",
"url" : "{{ $val := .Alarm.Value.Status.Value }}http://127.0.0.1:5000/{{if ((eq $val 0) or (eq $val 2) or (eq $val 4))}}even{{else}}odd{{end}}",
"headers" : {
"Content-type" : "application/json"
},
"payload" : "{{ $comp := .Alarm.Value.Component }}{{ $reso := .Alarm.Value.Resource }}{{ $val := .Alarm.Value.Status.Value }}{\"component\": \"{{$comp}}\",\"resource\": \"{{$reso}}\", \"parity\": {{if ((eq $val 0) or (eq $val 2) or (eq $val 4))}}even{{else}}odd{{end}}, \"value\": {{$val}} }"
},
"declare_ticket" : {
"ticket_id" : "id",
"ticket_creation_date" : "timestamp",
"priority" : "priority"
}
}