Skip to content

Commit a59b57f

Browse files
committed
Propagating headers to log on AM
Signed-off-by: Alan Protasio <[email protected]>
1 parent 752c354 commit a59b57f

File tree

4 files changed

+28
-3
lines changed

4 files changed

+28
-3
lines changed

pkg/alertmanager/distributor.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io"
77
"math/rand"
88
"net/http"
9+
"net/textproto"
910
"path"
1011
"strings"
1112
"sync"
@@ -39,10 +40,12 @@ type Distributor struct {
3940
alertmanagerClientsPool ClientsPool
4041

4142
logger log.Logger
43+
44+
targetHeaders []string
4245
}
4346

4447
// NewDistributor constructs a new Distributor
45-
func NewDistributor(cfg ClientConfig, maxRecvMsgSize int64, alertmanagersRing *ring.Ring, alertmanagerClientsPool ClientsPool, logger log.Logger, reg prometheus.Registerer) (d *Distributor, err error) {
48+
func NewDistributor(cfg ClientConfig, maxRecvMsgSize int64, alertmanagersRing *ring.Ring, alertmanagerClientsPool ClientsPool, targetHeaders []string, logger log.Logger, reg prometheus.Registerer) (d *Distributor, err error) {
4649
if alertmanagerClientsPool == nil {
4750
alertmanagerClientsPool = newAlertmanagerClientsPool(client.NewRingServiceDiscovery(alertmanagersRing), cfg, logger, reg)
4851
}
@@ -53,6 +56,7 @@ func NewDistributor(cfg ClientConfig, maxRecvMsgSize int64, alertmanagersRing *r
5356
maxRecvMsgSize: maxRecvMsgSize,
5457
alertmanagerRing: alertmanagersRing,
5558
alertmanagerClientsPool: alertmanagerClientsPool,
59+
targetHeaders: targetHeaders,
5660
}
5761

5862
d.Service = services.NewBasicService(nil, d.running, nil)
@@ -170,6 +174,7 @@ func (d *Distributor) doQuorum(userID string, w http.ResponseWriter, r *http.Req
170174
var responses []*httpgrpc.HTTPResponse
171175
var responsesMtx sync.Mutex
172176
grpcHeaders := httpToHttpgrpcHeaders(r.Header)
177+
173178
err = ring.DoBatch(r.Context(), RingOp, d.alertmanagerRing, []uint32{shardByUser(userID)}, func(am ring.InstanceDesc, _ []int) error {
174179
// Use a background context to make sure all alertmanagers get the request even if we return early.
175180
localCtx := opentracing.ContextWithSpan(user.InjectOrgID(context.Background(), userID), opentracing.SpanFromContext(r.Context()))
@@ -305,6 +310,23 @@ func (d *Distributor) doRequest(ctx context.Context, am ring.InstanceDesc, req *
305310
return nil, errors.Wrapf(err, "failed to get alertmanager client from pool (alertmanager address: %s)", am.Addr)
306311
}
307312

313+
headers := make(map[string]string, 0)
314+
for _, h := range req.Headers {
315+
headers[h.Key] = h.Values[0]
316+
}
317+
318+
headerMap := make(map[string]string, 0)
319+
// Remove non-existent header.
320+
for _, header := range d.targetHeaders {
321+
if v, ok := headers[textproto.CanonicalMIMEHeaderKey(header)]; ok {
322+
headerMap[header] = v
323+
}
324+
}
325+
326+
if len(headerMap) > 0 {
327+
ctx = util_log.ContextWithHeaderMap(ctx, headerMap)
328+
}
329+
308330
return amClient.HandleRequest(ctx, req)
309331
}
310332

pkg/alertmanager/distributor_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ func prepare(t *testing.T, numAM, numHappyAM, replicationFactor int, responseBod
365365
cfg := &MultitenantAlertmanagerConfig{}
366366
flagext.DefaultValues(cfg)
367367

368-
d, err := NewDistributor(cfg.AlertmanagerClient, cfg.MaxRecvMsgSize, amRing, newMockAlertmanagerClientFactory(amByAddr), util_log.Logger, prometheus.NewRegistry())
368+
d, err := NewDistributor(cfg.AlertmanagerClient, cfg.MaxRecvMsgSize, amRing, newMockAlertmanagerClientFactory(amByAddr), []string{}, util_log.Logger, prometheus.NewRegistry())
369369
require.NoError(t, err)
370370
require.NoError(t, services.StartAndAwaitRunning(context.Background(), d))
371371

pkg/alertmanager/multitenant.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ type MultitenantAlertmanagerConfig struct {
9090

9191
EnabledTenants flagext.StringSliceCSV `yaml:"enabled_tenants"`
9292
DisabledTenants flagext.StringSliceCSV `yaml:"disabled_tenants"`
93+
94+
TargetHeaders []string `yaml:"-"` // Propagated by config.
9395
}
9496

9597
type ClusterConfig struct {
@@ -424,7 +426,7 @@ func createMultitenantAlertmanager(cfg *MultitenantAlertmanagerConfig, fallbackC
424426
am.grpcServer = server.NewServer(&handlerForGRPCServer{am: am})
425427

426428
am.alertmanagerClientsPool = newAlertmanagerClientsPool(client.NewRingServiceDiscovery(am.ring), cfg.AlertmanagerClient, logger, am.registry)
427-
am.distributor, err = NewDistributor(cfg.AlertmanagerClient, cfg.MaxRecvMsgSize, am.ring, am.alertmanagerClientsPool, log.With(logger, "component", "AlertmanagerDistributor"), am.registry)
429+
am.distributor, err = NewDistributor(cfg.AlertmanagerClient, cfg.MaxRecvMsgSize, am.ring, am.alertmanagerClientsPool, cfg.TargetHeaders, log.With(logger, "component", "AlertmanagerDistributor"), am.registry)
428430
if err != nil {
429431
return nil, errors.Wrap(err, "create distributor")
430432
}

pkg/cortex/modules.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,7 @@ func (t *Cortex) initConfig() (serv services.Service, err error) {
638638

639639
func (t *Cortex) initAlertManager() (serv services.Service, err error) {
640640
t.Cfg.Alertmanager.ShardingRing.ListenPort = t.Cfg.Server.GRPCListenPort
641+
t.Cfg.Alertmanager.TargetHeaders = t.Cfg.API.HTTPRequestHeadersToLog
641642

642643
// Initialise the store.
643644
store, err := alertstore.NewAlertStore(context.Background(), t.Cfg.AlertmanagerStorage, t.Overrides, util_log.Logger, prometheus.DefaultRegisterer)

0 commit comments

Comments
 (0)