Skip to content

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"
    }
}
Edited by Alexandre Moevi