Add support for Twilio alerts (#7)
This commit is contained in:
parent
f893c0ee7f
commit
db7c516819
37
README.md
37
README.md
@ -23,6 +23,7 @@ core applications: https://status.twinnation.org/
|
|||||||
- [FAQ](#faq)
|
- [FAQ](#faq)
|
||||||
- [Sending a GraphQL request](#sending-a-graphql-request)
|
- [Sending a GraphQL request](#sending-a-graphql-request)
|
||||||
- [Configuring Slack alerts](#configuring-slack-alerts)
|
- [Configuring Slack alerts](#configuring-slack-alerts)
|
||||||
|
- [Configuring Twilio alerts](#configuring-twilio-alerts)
|
||||||
- [Configuring custom alert](#configuring-custom-alerts)
|
- [Configuring custom alert](#configuring-custom-alerts)
|
||||||
|
|
||||||
|
|
||||||
@ -83,12 +84,17 @@ Note that you can also add environment variables in the your configuration file
|
|||||||
| `services[].graphql` | Whether to wrap the body in a query param (`{"query":"$body"}`) | `false` |
|
| `services[].graphql` | Whether to wrap the body in a query param (`{"query":"$body"}`) | `false` |
|
||||||
| `services[].body` | Request body | `""` |
|
| `services[].body` | Request body | `""` |
|
||||||
| `services[].headers` | Request headers | `{}` |
|
| `services[].headers` | Request headers | `{}` |
|
||||||
| `services[].alerts[].type` | Type of alert. Valid types: `slack`, `custom` | Required `""` |
|
| `services[].alerts[].type` | Type of alert. Valid types: `slack`, `twilio`, `custom` | Required `""` |
|
||||||
| `services[].alerts[].enabled` | Whether to enable the alert | `false` |
|
| `services[].alerts[].enabled` | Whether to enable the alert | `false` |
|
||||||
| `services[].alerts[].threshold` | Number of failures in a row needed before triggering the alert | `3` |
|
| `services[].alerts[].threshold` | Number of failures in a row needed before triggering the alert | `3` |
|
||||||
| `services[].alerts[].description` | Description of the alert. Will be included in the alert sent | `""` |
|
| `services[].alerts[].description` | Description of the alert. Will be included in the alert sent | `""` |
|
||||||
| `alerting` | Configuration for alerting | `{}` |
|
| `alerting` | Configuration for alerting | `{}` |
|
||||||
| `alerting.slack` | Webhook to use for alerts of type `slack` | `""` |
|
| `alerting.slack` | Webhook to use for alerts of type `slack` | `""` |
|
||||||
|
| `alerting.twilio` | Settings for alerts of type `twilio` | `""` |
|
||||||
|
| `alerting.twilio.sid` | Twilio account SID | Required `""` |
|
||||||
|
| `alerting.twilio.token` | Twilio auth token | Required `""` |
|
||||||
|
| `alerting.twilio.from` | Number to send Twilio alerts from | Required `""` |
|
||||||
|
| `alerting.twilio.to` | Number to send twilio alerts to | Required `""` |
|
||||||
| `alerting.custom` | Configuration for custom actions on failure or alerts | `""` |
|
| `alerting.custom` | Configuration for custom actions on failure or alerts | `""` |
|
||||||
| `alerting.custom.url` | Custom alerting request url | `""` |
|
| `alerting.custom.url` | Custom alerting request url | `""` |
|
||||||
| `alerting.custom.body` | Custom alerting request body. | `""` |
|
| `alerting.custom.body` | Custom alerting request body. | `""` |
|
||||||
@ -198,6 +204,33 @@ services:
|
|||||||
- "[RESPONSE_TIME] < 300"
|
- "[RESPONSE_TIME] < 300"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Configuring Twilio alerts
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
alerting:
|
||||||
|
twilio:
|
||||||
|
sid: ****
|
||||||
|
token: ****
|
||||||
|
from: +1-234-567-8901
|
||||||
|
to: +1-234-567-8901
|
||||||
|
services:
|
||||||
|
- name: twinnation
|
||||||
|
interval: 30s
|
||||||
|
url: "https://twinnation.org/health"
|
||||||
|
alerts:
|
||||||
|
- type: twilio
|
||||||
|
enabled: true
|
||||||
|
description: "healthcheck failed 3 times in a row"
|
||||||
|
- type: twilio
|
||||||
|
enabled: true
|
||||||
|
threshold: 5
|
||||||
|
description: "healthcheck failed 5 times in a row"
|
||||||
|
conditions:
|
||||||
|
- "[STATUS] == 200"
|
||||||
|
- "[BODY].status == UP"
|
||||||
|
- "[RESPONSE_TIME] < 300"
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### Configuring custom alerts
|
### Configuring custom alerts
|
||||||
|
|
||||||
@ -235,4 +268,4 @@ services:
|
|||||||
- "[STATUS] == 200"
|
- "[STATUS] == 200"
|
||||||
- "[BODY].status == UP"
|
- "[BODY].status == UP"
|
||||||
- "[RESPONSE_TIME] < 300"
|
- "[RESPONSE_TIME] < 300"
|
||||||
```
|
```
|
||||||
|
@ -19,5 +19,6 @@ type AlertType string
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
SlackAlert AlertType = "slack"
|
SlackAlert AlertType = "slack"
|
||||||
|
TwilioAlert AlertType = "twilio"
|
||||||
CustomAlert AlertType = "custom"
|
CustomAlert AlertType = "custom"
|
||||||
)
|
)
|
||||||
|
@ -10,9 +10,17 @@ import (
|
|||||||
|
|
||||||
type AlertingConfig struct {
|
type AlertingConfig struct {
|
||||||
Slack string `yaml:"slack"`
|
Slack string `yaml:"slack"`
|
||||||
|
Twilio *TwilioAlertProvider `yaml:"twilio"`
|
||||||
Custom *CustomAlertProvider `yaml:"custom"`
|
Custom *CustomAlertProvider `yaml:"custom"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TwilioAlertProvider struct {
|
||||||
|
SID string `yaml:"sid"`
|
||||||
|
Token string `yaml:"token"`
|
||||||
|
From string `yaml:"from"`
|
||||||
|
To string `yaml:"to"`
|
||||||
|
}
|
||||||
|
|
||||||
type CustomAlertProvider struct {
|
type CustomAlertProvider struct {
|
||||||
Url string `yaml:"url"`
|
Url string `yaml:"url"`
|
||||||
Method string `yaml:"method,omitempty"`
|
Method string `yaml:"method,omitempty"`
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
package watchdog
|
package watchdog
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/TwinProduction/gatus/config"
|
"github.com/TwinProduction/gatus/config"
|
||||||
"github.com/TwinProduction/gatus/core"
|
"github.com/TwinProduction/gatus/core"
|
||||||
"github.com/TwinProduction/gatus/metric"
|
"github.com/TwinProduction/gatus/metric"
|
||||||
"log"
|
"log"
|
||||||
|
"net/url"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -71,6 +73,28 @@ func monitor(service *core.Service) {
|
|||||||
} else {
|
} else {
|
||||||
log.Printf("[watchdog][monitor] Not sending Slack alert despite being triggered, because there is no Slack webhook configured")
|
log.Printf("[watchdog][monitor] Not sending Slack alert despite being triggered, because there is no Slack webhook configured")
|
||||||
}
|
}
|
||||||
|
} else if alertTriggered.Type == core.TwilioAlert {
|
||||||
|
if len(cfg.Alerting.Twilio.Token) > 0 &&
|
||||||
|
len(cfg.Alerting.Twilio.SID) > 0 &&
|
||||||
|
len(cfg.Alerting.Twilio.From) > 0 &&
|
||||||
|
len(cfg.Alerting.Twilio.To) > 0 {
|
||||||
|
log.Printf("[watchdog][monitor] Sending Twilio alert because alert with description=%s has been triggered", alertTriggered.Description)
|
||||||
|
alertProvider = &core.CustomAlertProvider{
|
||||||
|
Url: fmt.Sprintf("https://api.twilio.com/2010-04-01/Accounts/%s/Messages.json", cfg.Alerting.Twilio.SID),
|
||||||
|
Method: "POST",
|
||||||
|
Body: url.Values{
|
||||||
|
"To": {cfg.Alerting.Twilio.To},
|
||||||
|
"From": {cfg.Alerting.Twilio.From},
|
||||||
|
"Body": {fmt.Sprintf("%s - %s", service.Name, alertTriggered.Description)},
|
||||||
|
}.Encode(),
|
||||||
|
Headers: map[string]string{
|
||||||
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
|
"Authorization": fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", cfg.Alerting.Twilio.SID, cfg.Alerting.Twilio.Token)))),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Printf("[watchdog][monitor] Not sending Twilio alert despite being triggered, because twilio config settings missing")
|
||||||
|
}
|
||||||
} else if alertTriggered.Type == core.CustomAlert {
|
} else if alertTriggered.Type == core.CustomAlert {
|
||||||
if cfg.Alerting.Custom != nil && len(cfg.Alerting.Custom.Url) > 0 {
|
if cfg.Alerting.Custom != nil && len(cfg.Alerting.Custom.Url) > 0 {
|
||||||
log.Printf("[watchdog][monitor] Sending custom alert because alert with description=%s has been triggered", alertTriggered.Description)
|
log.Printf("[watchdog][monitor] Sending custom alert because alert with description=%s has been triggered", alertTriggered.Description)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user