mirror of
https://github.com/TwiN/gatus.git
synced 2026-02-04 13:31:46 +00:00
fix(alerting): Limit minimum-reminder-interval to >5m (#1290)
This commit is contained in:
22
README.md
22
README.md
@@ -711,17 +711,17 @@ individual endpoints with configurable descriptions and thresholds.
|
|||||||
|
|
||||||
Alerts are configured at the endpoint level like so:
|
Alerts are configured at the endpoint level like so:
|
||||||
|
|
||||||
| Parameter | Description | Default |
|
| Parameter | Description | Default |
|
||||||
|:-------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------|:--------------|
|
|:-------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------|
|
||||||
| `alerts` | List of all alerts for a given endpoint. | `[]` |
|
| `alerts` | List of all alerts for a given endpoint. | `[]` |
|
||||||
| `alerts[].type` | Type of alert. <br />See table below for all valid types. | Required `""` |
|
| `alerts[].type` | Type of alert. <br />See table below for all valid types. | Required `""` |
|
||||||
| `alerts[].enabled` | Whether to enable the alert. | `true` |
|
| `alerts[].enabled` | Whether to enable the alert. | `true` |
|
||||||
| `alerts[].failure-threshold` | Number of failures in a row needed before triggering the alert. | `3` |
|
| `alerts[].failure-threshold` | Number of failures in a row needed before triggering the alert. | `3` |
|
||||||
| `alerts[].success-threshold` | Number of successes in a row before an ongoing incident is marked as resolved. | `2` |
|
| `alerts[].success-threshold` | Number of successes in a row before an ongoing incident is marked as resolved. | `2` |
|
||||||
| `alerts[].minimum-reminder-interval` | Minimum time interval between alert reminders. E.g. `"30m"`, `"1h45m30s"` or `"24h"`. If empty or `0`, reminders are disabled. | `0` |
|
| `alerts[].minimum-reminder-interval` | Minimum time interval between alert reminders. E.g. `"30m"`, `"1h45m30s"` or `"24h"`. If empty or `0`, reminders are disabled. Cannot be lower than `5m`. | `0` |
|
||||||
| `alerts[].send-on-resolved` | Whether to send a notification once a triggered alert is marked as resolved. | `false` |
|
| `alerts[].send-on-resolved` | Whether to send a notification once a triggered alert is marked as resolved. | `false` |
|
||||||
| `alerts[].description` | Description of the alert. Will be included in the alert sent. | `""` |
|
| `alerts[].description` | Description of the alert. Will be included in the alert sent. | `""` |
|
||||||
| `alerts[].provider-override` | Alerting provider configuration override for the given alert type | `{}` |
|
| `alerts[].provider-override` | Alerting provider configuration override for the given alert type | `{}` |
|
||||||
|
|
||||||
Here's an example of what an alert configuration might look like at the endpoint level:
|
Here's an example of what an alert configuration might look like at the endpoint level:
|
||||||
```yaml
|
```yaml
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ import (
|
|||||||
var (
|
var (
|
||||||
// ErrAlertWithInvalidDescription is the error with which Gatus will panic if an alert has an invalid character
|
// ErrAlertWithInvalidDescription is the error with which Gatus will panic if an alert has an invalid character
|
||||||
ErrAlertWithInvalidDescription = errors.New("alert description must not have \" or \\")
|
ErrAlertWithInvalidDescription = errors.New("alert description must not have \" or \\")
|
||||||
|
|
||||||
|
ErrAlertWithInvalidMinimumReminderInterval = errors.New("minimum-reminder-interval must be either omitted or be at least 5m")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Alert is endpoint.Endpoint's alert configuration
|
// Alert is endpoint.Endpoint's alert configuration
|
||||||
@@ -78,6 +80,9 @@ func (alert *Alert) ValidateAndSetDefaults() error {
|
|||||||
if alert.SuccessThreshold <= 0 {
|
if alert.SuccessThreshold <= 0 {
|
||||||
alert.SuccessThreshold = 2
|
alert.SuccessThreshold = 2
|
||||||
}
|
}
|
||||||
|
if alert.MinimumReminderInterval != 0 && alert.MinimumReminderInterval < 5*time.Minute {
|
||||||
|
return ErrAlertWithInvalidMinimumReminderInterval
|
||||||
|
}
|
||||||
if strings.ContainsAny(alert.GetDescription(), "\"\\") {
|
if strings.ContainsAny(alert.GetDescription(), "\"\\") {
|
||||||
return ErrAlertWithInvalidDescription
|
return ErrAlertWithInvalidDescription
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package alert
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAlert_ValidateAndSetDefaults(t *testing.T) {
|
func TestAlert_ValidateAndSetDefaults(t *testing.T) {
|
||||||
@@ -36,6 +37,61 @@ func TestAlert_ValidateAndSetDefaults(t *testing.T) {
|
|||||||
expectedFailureThreshold: 10,
|
expectedFailureThreshold: 10,
|
||||||
expectedSuccessThreshold: 5,
|
expectedSuccessThreshold: 5,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "valid-minimum-reminder-interval-0",
|
||||||
|
alert: Alert{
|
||||||
|
MinimumReminderInterval: 0,
|
||||||
|
FailureThreshold: 10,
|
||||||
|
SuccessThreshold: 5,
|
||||||
|
},
|
||||||
|
expectedError: nil,
|
||||||
|
expectedFailureThreshold: 10,
|
||||||
|
expectedSuccessThreshold: 5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "valid-minimum-reminder-interval-5m",
|
||||||
|
alert: Alert{
|
||||||
|
MinimumReminderInterval: 5 * time.Minute,
|
||||||
|
FailureThreshold: 10,
|
||||||
|
SuccessThreshold: 5,
|
||||||
|
},
|
||||||
|
expectedError: nil,
|
||||||
|
expectedFailureThreshold: 10,
|
||||||
|
expectedSuccessThreshold: 5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "valid-minimum-reminder-interval-10m",
|
||||||
|
alert: Alert{
|
||||||
|
MinimumReminderInterval: 10 * time.Minute,
|
||||||
|
FailureThreshold: 10,
|
||||||
|
SuccessThreshold: 5,
|
||||||
|
},
|
||||||
|
expectedError: nil,
|
||||||
|
expectedFailureThreshold: 10,
|
||||||
|
expectedSuccessThreshold: 5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid-minimum-reminder-interval-1m",
|
||||||
|
alert: Alert{
|
||||||
|
MinimumReminderInterval: 1 * time.Minute,
|
||||||
|
FailureThreshold: 10,
|
||||||
|
SuccessThreshold: 5,
|
||||||
|
},
|
||||||
|
expectedError: ErrAlertWithInvalidMinimumReminderInterval,
|
||||||
|
expectedFailureThreshold: 10,
|
||||||
|
expectedSuccessThreshold: 5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid-minimum-reminder-interval-1s",
|
||||||
|
alert: Alert{
|
||||||
|
MinimumReminderInterval: 1 * time.Second,
|
||||||
|
FailureThreshold: 10,
|
||||||
|
SuccessThreshold: 5,
|
||||||
|
},
|
||||||
|
expectedError: ErrAlertWithInvalidMinimumReminderInterval,
|
||||||
|
expectedFailureThreshold: 10,
|
||||||
|
expectedSuccessThreshold: 5,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
t.Run(scenario.name, func(t *testing.T) {
|
t.Run(scenario.name, func(t *testing.T) {
|
||||||
|
|||||||
@@ -648,7 +648,7 @@ func TestHandleAlertingWithMinimumReminderInterval(t *testing.T) {
|
|||||||
SuccessThreshold: 3,
|
SuccessThreshold: 3,
|
||||||
SendOnResolved: &enabled,
|
SendOnResolved: &enabled,
|
||||||
Triggered: false,
|
Triggered: false,
|
||||||
MinimumReminderInterval: 1 * time.Second,
|
MinimumReminderInterval: 5 * time.Minute,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user