mirror of
https://github.com/prometheus/alertmanager
synced 2024-12-11 08:55:56 +00:00
70b5e00ffc
* Allow limiting maximum number of alerts in webhook The webhook notifier is the only notifier that does not allow templating on the Alertmanager side. Users who encounter occasional alert storms (10ks of alerts going off at once for the same group) have reported webhook receiver systems not being able to cope with the load caused by the resulting large webhook notifier messages (the alerting rules also contained large annotations that can't be stripped away due to lack of templating). Reducing group size also wasn't an option, but this change proposes to allow truncating the list of alerts sent in the webhook body to a provided maximum length. This assumes that e.g. if a group receives 20k alerts, you really are fine only receiving 10k because you wouldn't be able to check them all anyway. Signed-off-by: Julius Volz <julius.volz@gmail.com> * Change max_alerts to uint32 Signed-off-by: Julius Volz <julius.volz@gmail.com> * Add truncatedAlerts field to webhook message Signed-off-by: Julius Volz <julius.volz@gmail.com> * Fix JSON struct tag Signed-off-by: Julius Volz <julius.volz@gmail.com>
67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
// Copyright 2019 Prometheus Team
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package webhook
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"testing"
|
|
|
|
"github.com/go-kit/kit/log"
|
|
commoncfg "github.com/prometheus/common/config"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/prometheus/alertmanager/config"
|
|
"github.com/prometheus/alertmanager/notify/test"
|
|
"github.com/prometheus/alertmanager/types"
|
|
)
|
|
|
|
func TestWebhookRetry(t *testing.T) {
|
|
u, err := url.Parse("http://example.com")
|
|
if err != nil {
|
|
require.NoError(t, err)
|
|
}
|
|
notifier, err := New(
|
|
&config.WebhookConfig{
|
|
URL: &config.URL{URL: u},
|
|
HTTPConfig: &commoncfg.HTTPClientConfig{},
|
|
},
|
|
test.CreateTmpl(t),
|
|
log.NewNopLogger(),
|
|
)
|
|
if err != nil {
|
|
require.NoError(t, err)
|
|
}
|
|
for statusCode, expected := range test.RetryTests(test.DefaultRetryCodes()) {
|
|
actual, _ := notifier.retrier.Check(statusCode, nil)
|
|
require.Equal(t, expected, actual, fmt.Sprintf("error on status %d", statusCode))
|
|
}
|
|
}
|
|
|
|
func TestWebhookTruncateAlerts(t *testing.T) {
|
|
alerts := make([]*types.Alert, 10)
|
|
|
|
truncatedAlerts, numTruncated := truncateAlerts(0, alerts)
|
|
require.Len(t, truncatedAlerts, 10)
|
|
require.EqualValues(t, numTruncated, 0)
|
|
|
|
truncatedAlerts, numTruncated = truncateAlerts(4, alerts)
|
|
require.Len(t, truncatedAlerts, 4)
|
|
require.EqualValues(t, numTruncated, 6)
|
|
|
|
truncatedAlerts, numTruncated = truncateAlerts(100, alerts)
|
|
require.Len(t, truncatedAlerts, 10)
|
|
require.EqualValues(t, numTruncated, 0)
|
|
}
|