Webhooks and Custom Scripts¶
Moira has two special kinds of senders: webhooks and scripts.
Script runs an executable on the same machine that runs notifier instances. Webhook makes POST requests to a specified URL. Scripts and webhooks are a flexible way to add integrations with services that are not supported in Moira natively.
You may want to add several different scripts for users to choose from. Next section describes how to implement this.
Scripts¶
You can specify executable path and arguments in the notifier configuration file (see Configuration for details).
Add a separate section for each script:
- sender_type: script
contact_type: jira
exec: /usr/bin/post_to_jira --project=${contact_value}
- sender_type: script
contact_type: irc
exec: /opt/myscripts/irc_adapter ${contact_value} ${trigger_id}
Then, in web UI configuration:
{
"contacts": [
{
"type": "jira",
"label": "Create JIRA issue",
"placeholder": "Project name"
},
{
"type": "irc",
"label": "Post to IRC channel",
"placeholder": "Channel name"
}
],
...
}
Templated Parameters¶
You may have noted that we use templated parameters like
${contact_value}
in configuration examples. You can use these
parameters in script as well as webhook contacts. Notifier will
replace them with actual values extracted from event.
Parameter |
Value |
---|---|
${contact_id} |
Contact ID |
${contact_value} |
Contact value, as specified by user via web UI |
${contact_type} |
Contact type, as specified in web UI config file |
${trigger_id} |
Trigger ID |
Webhooks¶
On each event, Moira will make a POST request to the URL specified in notifier configuration file with the following JSON payload if the request body in the config is empty.
Attribute |
Type |
Description |
---|---|---|
trigger |
Trigger |
Trigger data |
events |
Event Array |
List of events |
contact |
Contact |
Contact data |
plot |
String |
Base64 string containing trigger plot |
throttled |
Bool |
True if notifications are throttled |
Fields Description¶
Trigger¶
Attribute |
Type |
Description |
---|---|---|
id |
String |
Trigger ID |
name |
String |
Trigger name |
description |
String |
Trigger description |
tags |
String Array |
List of trigger tags |
Event¶
Attribute |
Type |
Description |
---|---|---|
metric |
String |
Metric name |
value |
Float64 |
Metric value |
timestamp |
Int64 |
Event timestamp |
trigger_event |
Bool |
Event type |
state |
String |
Current metric state |
old_state |
String |
Previous metric state |
Contact¶
Attribute |
Type |
Description |
---|---|---|
type |
String |
Contact type |
value |
String |
Contact value |
id |
String |
Contact ID |
user |
String |
Contact Author |
HTTP Headers¶
Name |
Value |
---|---|
User-Agent |
Moira |
Content-Type |
application/json |
… |
… |
… - You can set additional headers in the webhook config (see Configuration for details).
Example of a request without explicitly specifying the request body in the config¶
{
"trigger": {
"id": "triggerID",
"name": "triggerName",
"description": "triggerDescription",
"tags": [
"triggerTag1",
"triggerTag2"
]
},
"events": [
{
"metric": "metricName1",
"value": 0,
"timestamp": 499165200,
"trigger_event": false,
"state": "OK",
"old_state": "ERROR"
},
{
"metric": "triggerName",
"value": 0,
"timestamp": 1445412480,
"trigger_event": true,
"state": "OK",
"old_state": "ERROR"
},
{
"metric": "metricName2",
"value": 0,
"timestamp": -446145720,
"trigger_event": false,
"state": "OK",
"old_state": "ERROR"
}
],
"contact": {
"type": "webhookContactName",
"value": "https://localhost/webhooks/moira",
"id": "9728adae-1487-4e5b-80f6-8496f59b223e",
"user": "author"
},
"plot": "",
"throttled": false
}
You can also explicitly specify the request body using go-templates. Available fields: .Contact.Value and .Contact.Type
Example of a configuration with an explicit request body¶
- sender_type: webhook
contact_type: test_webhook
url: http://localhost:8080/webhook
body: { "name": "test-name", "value": {{ .Contact.Value | quote }} }
headers:
test-header: test-value
Example of a request with explicitly specifying the request body in the config¶
{
"name": "test-name",
"value": "test-contact-value"
}