Skip to content

Commit 8150c9f

Browse files
committed
Address Bartek's comments
Signed-off-by: Simon Pasquier <spasquie@redhat.com>
1 parent 0293619 commit 8150c9f

File tree

8 files changed

+59
-62
lines changed

8 files changed

+59
-62
lines changed

CHANGELOG.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,10 @@ We use *breaking* word for marking changes that are not backward compatible (rel
1818
### Added
1919
- [#1852](https://github.com/thanos-io/thanos/pull/1852) Add support for `AWS_CONTAINER_CREDENTIALS_FULL_URI` by upgrading to minio-go v6.0.44
2020
- [#1854](https://github.com/thanos-io/thanos/pull/1854) Update Rule UI to support alerts count displaying and filtering.
21-
22-
### Added
23-
2421
- [#1838](https://github.com/thanos-io/thanos/pull/1838) Ruler: Add TLS and authentication support for Alertmanager with the `--alertmanagers.config` and `--alertmanagers.config-file` CLI flags. See [documentation](docs/components/rule.md/#configuration) for further information.
2522

23+
- [#1838](https://github.com/thanos-io/thanos/pull/1838) Ruler: Add a new `--alertmanagers.sd-dns-interval` CLI option to specify the interval between DNS resolutions of Alertmanager hosts.
24+
2625
## [v0.9.0](https://github.com/thanos-io/thanos/releases/tag/v0.9.0) - 2019.12.03
2726

2827
### Added

cmd/thanos/rule.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -296,14 +296,14 @@ func runRule(
296296
return err
297297
}
298298
var (
299-
alertingcfg alert.AlertingConfig
299+
alertingCfg alert.AlertingConfig
300300
alertmgrs []*alert.Alertmanager
301301
)
302302
if len(alertmgrsConfigYAML) > 0 {
303303
if len(alertmgrURLs) != 0 {
304304
return errors.New("--alertmanagers.url and --alertmanagers.config* flags cannot be defined at the same time")
305305
}
306-
alertingcfg, err = alert.LoadAlertingConfig(alertmgrsConfigYAML)
306+
alertingCfg, err = alert.LoadAlertingConfig(alertmgrsConfigYAML)
307307
if err != nil {
308308
return err
309309
}
@@ -314,13 +314,13 @@ func runRule(
314314
if err != nil {
315315
return err
316316
}
317-
alertingcfg.Alertmanagers = append(alertingcfg.Alertmanagers, cfg)
317+
alertingCfg.Alertmanagers = append(alertingCfg.Alertmanagers, cfg)
318318
}
319319
}
320-
if len(alertingcfg.Alertmanagers) == 0 {
320+
if len(alertingCfg.Alertmanagers) == 0 {
321321
level.Warn(logger).Log("msg", "no alertmanager configured")
322322
}
323-
for _, cfg := range alertingcfg.Alertmanagers {
323+
for _, cfg := range alertingCfg.Alertmanagers {
324324
am, err := alert.NewAlertmanager(logger, cfg)
325325
if err != nil {
326326
return err
@@ -421,11 +421,11 @@ func runRule(
421421
}
422422
// Run the alert sender.
423423
{
424-
doers := make([]alert.AlertmanagerDoer, len(alertmgrs))
424+
clients := make([]alert.AlertmanagerClient, len(alertmgrs))
425425
for i := range alertmgrs {
426-
doers[i] = alertmgrs[i]
426+
clients[i] = alertmgrs[i]
427427
}
428-
sdr := alert.NewSender(logger, reg, doers)
428+
sdr := alert.NewSender(logger, reg, clients)
429429
ctx, cancel := context.WithCancel(context.Background())
430430

431431
g.Add(func() error {

docs/components/rule.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,9 @@ Flags:
290290

291291
### Alertmanager
292292

293-
The configuration format supported by the `--alertmanagers.config` and `--alertmanagers.config-file` flags is the following:
293+
The `--alertmanagers.config` and `--alertmanagers.config-file` flags allow specifying multiple Alertmanagers. Those entries are treated as a single HA group. This means that alert send failure is claimed only if the Ruler fails to send to all instances.
294+
295+
The configuration format is the following:
294296

295297
[embedmd]:# (../flags/config_rule_alerting.txt yaml)
296298
```yaml

pkg/alert/alert.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
package alert
33

44
import (
5+
"bytes"
56
"context"
67
"encoding/json"
78
"fmt"
9+
"io"
810
"net/url"
911
"sync"
1012
"sync/atomic"
@@ -238,15 +240,15 @@ func (q *Queue) Push(alerts []*Alert) {
238240
}
239241
}
240242

241-
type AlertmanagerDoer interface {
243+
type AlertmanagerClient interface {
242244
Endpoints() []*url.URL
243-
Do(context.Context, *url.URL, []byte) error
245+
Do(context.Context, *url.URL, io.Reader) error
244246
}
245247

246248
// Sender sends notifications to a dynamic set of alertmanagers.
247249
type Sender struct {
248250
logger log.Logger
249-
alertmanagers []AlertmanagerDoer
251+
alertmanagers []AlertmanagerClient
250252

251253
sent *prometheus.CounterVec
252254
errs *prometheus.CounterVec
@@ -259,7 +261,7 @@ type Sender struct {
259261
func NewSender(
260262
logger log.Logger,
261263
reg prometheus.Registerer,
262-
alertmanagers []AlertmanagerDoer,
264+
alertmanagers []AlertmanagerClient,
263265
) *Sender {
264266
if logger == nil {
265267
logger = log.NewNopLogger()
@@ -294,7 +296,7 @@ func NewSender(
294296
return s
295297
}
296298

297-
// Send an alert batch to all given Alertmanager client.
299+
// Send an alert batch to all given Alertmanager clients.
298300
// TODO(bwplotka): https://github.com/thanos-io/thanos/issues/660.
299301
func (s *Sender) Send(ctx context.Context, alerts []*Alert) {
300302
if len(alerts) == 0 {
@@ -313,17 +315,18 @@ func (s *Sender) Send(ctx context.Context, alerts []*Alert) {
313315
for _, amc := range s.alertmanagers {
314316
for _, u := range amc.Endpoints() {
315317
wg.Add(1)
316-
go func(amc AlertmanagerDoer, u *url.URL) {
318+
go func(amc AlertmanagerClient, u *url.URL) {
317319
defer wg.Done()
318320

319321
level.Debug(s.logger).Log("msg", "sending alerts", "alertmanager", u.Host, "numAlerts", len(alerts))
320322
start := time.Now()
321-
if err := amc.Do(ctx, u, b); err != nil {
323+
if err := amc.Do(ctx, u, bytes.NewReader(b)); err != nil {
322324
level.Warn(s.logger).Log(
323325
"msg", "sending alerts failed",
324326
"alertmanager", u.Host,
325327
"numAlerts", len(alerts),
326-
"err", err)
328+
"err", err,
329+
)
327330
s.errs.WithLabelValues(u.Host).Inc()
328331
return
329332
}

pkg/alert/alert_test.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package alert
22

33
import (
44
"context"
5+
"io"
56
"net/url"
67
"sync"
78
"testing"
@@ -46,18 +47,18 @@ func assertSameHosts(t *testing.T, expected []*url.URL, found []*url.URL) {
4647
}
4748
}
4849

49-
type fakeDoer struct {
50+
type fakeClient struct {
5051
urls []*url.URL
5152
postf func(u *url.URL) error
5253
mtx sync.Mutex
5354
seen []*url.URL
5455
}
5556

56-
func (f *fakeDoer) Endpoints() []*url.URL {
57+
func (f *fakeClient) Endpoints() []*url.URL {
5758
return f.urls
5859
}
5960

60-
func (f *fakeDoer) Do(ctx context.Context, u *url.URL, b []byte) error {
61+
func (f *fakeClient) Do(ctx context.Context, u *url.URL, r io.Reader) error {
6162
f.mtx.Lock()
6263
defer f.mtx.Unlock()
6364
f.seen = append(f.seen, u)
@@ -68,10 +69,10 @@ func (f *fakeDoer) Do(ctx context.Context, u *url.URL, b []byte) error {
6869
}
6970

7071
func TestSenderSendsOk(t *testing.T) {
71-
poster := &fakeDoer{
72+
poster := &fakeClient{
7273
urls: []*url.URL{{Host: "am1:9090"}, {Host: "am2:9090"}},
7374
}
74-
s := NewSender(nil, nil, []AlertmanagerDoer{poster})
75+
s := NewSender(nil, nil, []AlertmanagerClient{poster})
7576

7677
s.Send(context.Background(), []*Alert{{}, {}})
7778

@@ -86,7 +87,7 @@ func TestSenderSendsOk(t *testing.T) {
8687
}
8788

8889
func TestSenderSendsOneFails(t *testing.T) {
89-
poster := &fakeDoer{
90+
poster := &fakeClient{
9091
urls: []*url.URL{{Host: "am1:9090"}, {Host: "am2:9090"}},
9192
postf: func(u *url.URL) error {
9293
if u.Host == "am1:9090" {
@@ -95,7 +96,7 @@ func TestSenderSendsOneFails(t *testing.T) {
9596
return nil
9697
},
9798
}
98-
s := NewSender(nil, nil, []AlertmanagerDoer{poster})
99+
s := NewSender(nil, nil, []AlertmanagerClient{poster})
99100

100101
s.Send(context.Background(), []*Alert{{}, {}})
101102

@@ -110,13 +111,13 @@ func TestSenderSendsOneFails(t *testing.T) {
110111
}
111112

112113
func TestSenderSendsAllFail(t *testing.T) {
113-
poster := &fakeDoer{
114+
poster := &fakeClient{
114115
urls: []*url.URL{{Host: "am1:9090"}, {Host: "am2:9090"}},
115116
postf: func(u *url.URL) error {
116117
return errors.New("no such host")
117118
},
118119
}
119-
s := NewSender(nil, nil, []AlertmanagerDoer{poster})
120+
s := NewSender(nil, nil, []AlertmanagerClient{poster})
120121

121122
s.Send(context.Background(), []*Alert{{}, {}})
122123

pkg/alert/client.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package alert
22

33
import (
4-
"bytes"
54
"context"
5+
"io"
66
"net"
77
"net/http"
88
"net/url"
@@ -157,10 +157,7 @@ func DefaultAlertmanagerConfig() AlertmanagerConfig {
157157
func (c *AlertmanagerConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
158158
*c = DefaultAlertmanagerConfig()
159159
type plain AlertmanagerConfig
160-
if err := unmarshal((*plain)(c)); err != nil {
161-
return err
162-
}
163-
return nil
160+
return unmarshal((*plain)(c))
164161
}
165162

166163
// Alertmanager represents an HTTP client that can send alerts to a cluster of Alertmanager endpoints.
@@ -278,8 +275,8 @@ func (a *Alertmanager) Endpoints() []*url.URL {
278275
}
279276

280277
// Post sends a POST request to the given URL.
281-
func (a *Alertmanager) Do(ctx context.Context, u *url.URL, b []byte) error {
282-
req, err := http.NewRequest("POST", u.String(), bytes.NewReader(b))
278+
func (a *Alertmanager) Do(ctx context.Context, u *url.URL, r io.Reader) error {
279+
req, err := http.NewRequest("POST", u.String(), r)
283280
if err != nil {
284281
return err
285282
}

pkg/alert/client_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ func TestBuildAlertmanagerConfiguration(t *testing.T) {
7575
Scheme: "http",
7676
},
7777
},
78+
{
79+
address: "://user:pass@localhost:9093",
80+
err: true,
81+
},
7882
} {
7983
t.Run(tc.address, func(t *testing.T) {
8084
cfg, err := BuildAlertmanagerConfig(nil, tc.address, time.Duration(0))

test/e2e/rule_test.go

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -82,28 +82,6 @@ func serializeAlertingConfiguration(t *testing.T, cfg ...alert.AlertmanagerConfi
8282
return b
8383
}
8484

85-
func writeAlertmanagerFileSD(t *testing.T, path string, addrs ...string) {
86-
group := targetgroup.Group{Targets: []model.LabelSet{}}
87-
for _, addr := range addrs {
88-
group.Targets = append(group.Targets, model.LabelSet{model.LabelName(model.AddressLabel): model.LabelValue(addr)})
89-
}
90-
91-
b, err := yaml.Marshal([]*targetgroup.Group{&group})
92-
if err != nil {
93-
t.Errorf("failed to serialize file SD configuration: %v", err)
94-
return
95-
}
96-
97-
err = ioutil.WriteFile(path+".tmp", b, 0660)
98-
if err != nil {
99-
t.Errorf("failed to write file SD configuration: %v", err)
100-
return
101-
}
102-
103-
err = os.Rename(path+".tmp", path)
104-
testutil.Ok(t, err)
105-
}
106-
10785
type mockAlertmanager struct {
10886
path string
10987
token string
@@ -232,7 +210,7 @@ func TestRuleAlertmanagerHTTPClient(t *testing.T) {
232210
r := rule(a.New(), a.New(), rulesDir, amCfg, []address{qAddr}, nil)
233211
q := querier(qAddr, a.New(), []address{r.GRPC}, nil)
234212

235-
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute)
213+
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute)
236214
exit, err := e2eSpinup(t, ctx, q, r)
237215
if err != nil {
238216
t.Errorf("spinup failed: %v", err)
@@ -306,7 +284,7 @@ func TestRuleAlertmanagerFileSD(t *testing.T) {
306284
<-exit
307285
}()
308286

309-
// Wait for a couple of evaluations.
287+
// Wait for a couple of evaluations and make sure that Alertmanager didn't receive anything.
310288
testutil.Ok(t, runutil.Retry(5*time.Second, ctx.Done(), func() (err error) {
311289
select {
312290
case <-exit:
@@ -340,8 +318,21 @@ func TestRuleAlertmanagerFileSD(t *testing.T) {
340318
return nil
341319
}))
342320

343-
// Update the Alertmanager file service discovery configuration.
344-
writeAlertmanagerFileSD(t, filepath.Join(amDir, "targets.yaml"), am.HTTP.HostPort())
321+
// Add the Alertmanager address to the file SD directory.
322+
fileSDPath := filepath.Join(amDir, "targets.yaml")
323+
b, err := yaml.Marshal([]*targetgroup.Group{
324+
&targetgroup.Group{
325+
Targets: []model.LabelSet{
326+
model.LabelSet{
327+
model.LabelName(model.AddressLabel): model.LabelValue(am.HTTP.HostPort()),
328+
},
329+
},
330+
},
331+
})
332+
testutil.Ok(t, err)
333+
334+
testutil.Ok(t, ioutil.WriteFile(fileSDPath+".tmp", b, 0660))
335+
testutil.Ok(t, os.Rename(fileSDPath+".tmp", fileSDPath))
345336

346337
// Verify that alerts are received by Alertmanager.
347338
testutil.Ok(t, runutil.Retry(5*time.Second, ctx.Done(), func() (err error) {

0 commit comments

Comments
 (0)