diff --git a/go.mod b/go.mod index bec19bb55d..214763066d 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/cespare/xxhash v1.1.0 github.com/cespare/xxhash/v2 v2.1.1 github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf - github.com/cortexproject/cortex v1.10.1-0.20210906152552-028c4b3c9e71 + github.com/cortexproject/cortex v1.10.1-0.20210910135323-8250d8703a8f github.com/davecgh/go-spew v1.1.1 github.com/docker/docker v20.10.7+incompatible github.com/docker/go-plugins-helpers v0.0.0-20181025120712-1e6269c305b8 @@ -33,7 +33,6 @@ require ( github.com/fluent/fluent-bit-go v0.0.0-20190925192703-ea13c021720c github.com/fsouza/fake-gcs-server v1.7.0 github.com/go-kit/kit v0.11.0 - github.com/go-kit/log v0.1.0 github.com/go-logfmt/logfmt v0.5.0 github.com/go-redis/redis/v8 v8.9.0 github.com/gocql/gocql v0.0.0-20200526081602-cd04bd7f22a7 @@ -45,7 +44,7 @@ require ( github.com/google/go-cmp v0.5.6 github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.4.2 - github.com/grafana/dskit v0.0.0-20210827060659-9daca2f00327 + github.com/grafana/dskit v0.0.0-20210910100700-60e6d9b19675 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 diff --git a/go.sum b/go.sum index e45d1ba42c..901f15d527 100644 --- a/go.sum +++ b/go.sum @@ -513,8 +513,8 @@ github.com/cortexproject/cortex v1.6.1-0.20210215155036-dfededd9f331/go.mod h1:8 github.com/cortexproject/cortex v1.7.1-0.20210224085859-66d6fb5b0d42/go.mod h1:u2dxcHInYbe45wxhLoWVdlFJyDhXewsMcxtnbq/QbH4= github.com/cortexproject/cortex v1.7.1-0.20210316085356-3fedc1108a49/go.mod h1:/DBOW8TzYBTE/U+O7Whs7i7E2eeeZl1iRVDtIqxn5kg= github.com/cortexproject/cortex v1.8.1-0.20210422151339-cf1c444e0905/go.mod h1:xxm4/CLvTmDxwE7yXwtClR4dIvkG4S09o5DygPOgc1U= -github.com/cortexproject/cortex v1.10.1-0.20210906152552-028c4b3c9e71 h1:B6ds0Im3SlPgTjl60EcMPEXf7NL3QlHAyPYfOOZ58a4= -github.com/cortexproject/cortex v1.10.1-0.20210906152552-028c4b3c9e71/go.mod h1:Gi5GxqUBbTqZbIl342JkxH0RHoCC9YdDAsVnsgfimq0= +github.com/cortexproject/cortex v1.10.1-0.20210910135323-8250d8703a8f h1:66j/gqVLaI4SR6Kz/v+CNruxEjQBSvsXJ9bvrhxLkJw= +github.com/cortexproject/cortex v1.10.1-0.20210910135323-8250d8703a8f/go.mod h1:a7dlM5nVVAPBpYh2eYu9Tu6OBSR9xl2U8s6NjRBPQzo= github.com/couchbase/go-couchbase v0.0.0-20180501122049-16db1f1fe037/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= github.com/couchbase/gomemcached v0.0.0-20180502221210-0da75df14530/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= @@ -1076,8 +1076,9 @@ github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/grafana/dskit v0.0.0-20210827060659-9daca2f00327 h1:THdW9RnugPdLwW8RmHB/xOcKf267QunSH1mDuaJkhWk= -github.com/grafana/dskit v0.0.0-20210827060659-9daca2f00327/go.mod h1:+T2iuDOzx/BSQJSvli9FUvLM5HnV8aDPmXM8KWuVj3M= +github.com/grafana/dskit v0.0.0-20210908150159-fcf48cb19aa4/go.mod h1:m3eHzwe5IT5eE2MI3Ena2ooU8+Hek8IiVXb9yJ1+0rs= +github.com/grafana/dskit v0.0.0-20210910100700-60e6d9b19675 h1:50UgpAdLj3aP9PWi3U1fDzYWhw+kLfaJN1RHG8/ThpY= +github.com/grafana/dskit v0.0.0-20210910100700-60e6d9b19675/go.mod h1:m3eHzwe5IT5eE2MI3Ena2ooU8+Hek8IiVXb9yJ1+0rs= github.com/grafana/gocql v0.0.0-20200605141915-ba5dc39ece85 h1:xLuzPoOzdfNb/RF/IENCw+oLVdZB4G21VPhkHBgwSHY= github.com/grafana/gocql v0.0.0-20200605141915-ba5dc39ece85/go.mod h1:crI9WX6p0IhrqB+DqIUHulRW853PaNFf7o4UprV//3I= github.com/grafana/tail v0.0.0-20201004203643-7aa4e4a91f03 h1:fGgFrAraMB0BaPfYumu+iulfDXwHm+GFyHA4xEtBqI8= diff --git a/pkg/distributor/distributor_test.go b/pkg/distributor/distributor_test.go index f35526a00c..dab966a316 100644 --- a/pkg/distributor/distributor_test.go +++ b/pkg/distributor/distributor_test.go @@ -273,7 +273,7 @@ func TestDistributor_PushIngestionRateLimiter(t *testing.T) { limits.IngestionBurstSizeMB = testData.ingestionBurstSizeMB // Init a shared KVStore - kvStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger()) + kvStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) t.Cleanup(func() { assert.NoError(t, closer.Close()) }) // Start all expected distributors diff --git a/pkg/ingester/flush_test.go b/pkg/ingester/flush_test.go index 5d40933665..cd389143b5 100644 --- a/pkg/ingester/flush_test.go +++ b/pkg/ingester/flush_test.go @@ -12,7 +12,7 @@ import ( "github.com/cortexproject/cortex/pkg/ring" "github.com/cortexproject/cortex/pkg/tenant" - gokitlog "github.com/go-kit/log" + gokitlog "github.com/go-kit/kit/log" "github.com/grafana/dskit/flagext" "github.com/grafana/dskit/kv" "github.com/grafana/dskit/services" diff --git a/pkg/loki/modules.go b/pkg/loki/modules.go index f0780dccfc..7a3981eb8c 100644 --- a/pkg/loki/modules.go +++ b/pkg/loki/modules.go @@ -605,6 +605,7 @@ func (t *Loki) initRuler() (_ services.Service, err error) { } func (t *Loki) initMemberlistKV() (services.Service, error) { + reg := prometheus.DefaultRegisterer t.Cfg.MemberlistKV.MetricsRegisterer = prometheus.DefaultRegisterer t.Cfg.MemberlistKV.Codecs = []codec.Codec{ ring.GetCodec(), @@ -614,12 +615,12 @@ func (t *Loki) initMemberlistKV() (services.Service, error) { "cortex_", prometheus.WrapRegistererWith( prometheus.Labels{"name": "memberlist"}, - prometheus.DefaultRegisterer, + reg, ), ) dnsProvider := dns.NewProvider(util_log.Logger, dnsProviderReg, dns.GolangResolverType) - t.MemberlistKV = memberlist.NewKVInitService(&t.Cfg.MemberlistKV, util_log.Logger, dnsProvider) + t.MemberlistKV = memberlist.NewKVInitService(&t.Cfg.MemberlistKV, util_log.Logger, dnsProvider, reg) return t.MemberlistKV, nil } diff --git a/vendor/github.com/cortexproject/cortex/pkg/cortex/modules.go b/vendor/github.com/cortexproject/cortex/pkg/cortex/modules.go index 562dec0d89..c83b0d5f36 100644 --- a/vendor/github.com/cortexproject/cortex/pkg/cortex/modules.go +++ b/vendor/github.com/cortexproject/cortex/pkg/cortex/modules.go @@ -777,7 +777,7 @@ func (t *Cortex) initMemberlistKV() (services.Service, error) { ), ) dnsProvider := dns.NewProvider(util_log.Logger, dnsProviderReg, dns.GolangResolverType) - t.MemberlistKV = memberlist.NewKVInitService(&t.Cfg.MemberlistKV, util_log.Logger, dnsProvider) + t.MemberlistKV = memberlist.NewKVInitService(&t.Cfg.MemberlistKV, util_log.Logger, dnsProvider, reg) t.API.RegisterMemberlistKV(t.MemberlistKV) // Update the config. diff --git a/vendor/github.com/cortexproject/cortex/pkg/querier/queryrange/split_by_interval.go b/vendor/github.com/cortexproject/cortex/pkg/querier/queryrange/split_by_interval.go index afb1244565..d3f663b07d 100644 --- a/vendor/github.com/cortexproject/cortex/pkg/querier/queryrange/split_by_interval.go +++ b/vendor/github.com/cortexproject/cortex/pkg/querier/queryrange/split_by_interval.go @@ -6,6 +6,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/prometheus/prometheus/promql/parser" ) type IntervalFn func(r Request) time.Duration @@ -40,7 +41,10 @@ type splitByInterval struct { func (s splitByInterval) Do(ctx context.Context, r Request) (Response, error) { // First we're going to build new requests, one for each day, taking care // to line up the boundaries with step. - reqs := splitQuery(r, s.interval(r)) + reqs, err := splitQuery(r, s.interval(r)) + if err != nil { + return nil, err + } s.splitByCounter.Add(float64(len(reqs))) reqResps, err := DoRequests(ctx, s.next, reqs, s.limits) @@ -60,7 +64,13 @@ func (s splitByInterval) Do(ctx context.Context, r Request) (Response, error) { return response, nil } -func splitQuery(r Request, interval time.Duration) []Request { +func splitQuery(r Request, interval time.Duration) ([]Request, error) { + // Replace @ modifier function to their respective constant values in the query. + // This way subqueries will be evaluated at the same time as the parent query. + query, err := evaluateAtModifierFunction(r.GetQuery(), r.GetStart(), r.GetEnd()) + if err != nil { + return nil, err + } var reqs []Request for start := r.GetStart(); start < r.GetEnd(); start = nextIntervalBoundary(start, r.GetStep(), interval) + r.GetStep() { end := nextIntervalBoundary(start, r.GetStep(), interval) @@ -68,9 +78,32 @@ func splitQuery(r Request, interval time.Duration) []Request { end = r.GetEnd() } - reqs = append(reqs, r.WithStartEnd(start, end)) + reqs = append(reqs, r.WithQuery(query).WithStartEnd(start, end)) } - return reqs + return reqs, nil +} + +// evaluateAtModifierFunction parse the query and evaluates the `start()` and `end()` at modifier functions into actual constant timestamps. +// For example given the start of the query is 10.00, `http_requests_total[1h] @ start()` query will be replaced with `http_requests_total[1h] @ 10.00` +// If the modifier is already a constant, it will be returned as is. +func evaluateAtModifierFunction(query string, start, end int64) (string, error) { + expr, err := parser.ParseExpr(query) + if err != nil { + return "", err + } + parser.Inspect(expr, func(n parser.Node, _ []parser.Node) error { + if selector, ok := n.(*parser.VectorSelector); ok { + switch selector.StartOrEnd { + case parser.START: + selector.Timestamp = &start + case parser.END: + selector.Timestamp = &end + } + selector.StartOrEnd = 0 + } + return nil + }) + return expr.String(), err } // Round up to the step before the next interval boundary. diff --git a/vendor/github.com/cortexproject/cortex/tools/querytee/proxy_endpoint.go b/vendor/github.com/cortexproject/cortex/tools/querytee/proxy_endpoint.go index b9628b4da4..bc416b3276 100644 --- a/vendor/github.com/cortexproject/cortex/tools/querytee/proxy_endpoint.go +++ b/vendor/github.com/cortexproject/cortex/tools/querytee/proxy_endpoint.go @@ -74,7 +74,10 @@ func (p *ProxyEndpoint) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (p *ProxyEndpoint) executeBackendRequests(r *http.Request, resCh chan *backendResponse) { responses := make([]*backendResponse, 0, len(p.backends)) - wg := sync.WaitGroup{} + var ( + wg = sync.WaitGroup{} + mtx = sync.Mutex{} + ) wg.Add(len(p.backends)) for _, b := range p.backends { @@ -105,7 +108,9 @@ func (p *ProxyEndpoint) executeBackendRequests(r *http.Request, resCh chan *back // Keep track of the response if required. if p.comparator != nil { + mtx.Lock() responses = append(responses, res) + mtx.Unlock() } resCh <- res diff --git a/vendor/github.com/grafana/dskit/kv/client.go b/vendor/github.com/grafana/dskit/kv/client.go index e26efc5cd5..3a8f410b8e 100644 --- a/vendor/github.com/grafana/dskit/kv/client.go +++ b/vendor/github.com/grafana/dskit/kv/client.go @@ -129,7 +129,7 @@ func createClient(backend string, prefix string, cfg StoreConfig, codec codec.Co switch backend { case "consul": - client, err = consul.NewClient(cfg.Consul, codec, logger) + client, err = consul.NewClient(cfg.Consul, codec, logger, reg) case "etcd": client, err = etcd.New(cfg.Etcd, codec, logger) @@ -138,7 +138,7 @@ func createClient(backend string, prefix string, cfg StoreConfig, codec codec.Co // If we use the in-memory store, make sure everyone gets the same instance // within the same process. inmemoryStoreInit.Do(func() { - inmemoryStore, _ = consul.NewInMemoryClient(codec, logger) + inmemoryStore, _ = consul.NewInMemoryClient(codec, logger, reg) }) client = inmemoryStore @@ -205,5 +205,5 @@ func buildMultiClient(cfg StoreConfig, codec codec.Codec, reg prometheus.Registe {client: secondary, name: cfg.Multi.Secondary}, } - return NewMultiClient(cfg.Multi, clients, logger), nil + return NewMultiClient(cfg.Multi, clients, logger, reg), nil } diff --git a/vendor/github.com/grafana/dskit/kv/consul/client.go b/vendor/github.com/grafana/dskit/kv/consul/client.go index 8117e37af3..9ce6d91c52 100644 --- a/vendor/github.com/grafana/dskit/kv/consul/client.go +++ b/vendor/github.com/grafana/dskit/kv/consul/client.go @@ -13,6 +13,7 @@ import ( "github.com/go-kit/kit/log/level" consul "github.com/hashicorp/consul/api" "github.com/hashicorp/go-cleanhttp" + "github.com/prometheus/client_golang/prometheus" "github.com/weaveworks/common/instrument" "golang.org/x/time/rate" @@ -61,9 +62,10 @@ type kv interface { // Client is a KV.Client for Consul. type Client struct { kv - codec codec.Codec - cfg Config - logger log.Logger + codec codec.Codec + cfg Config + logger log.Logger + consulMetrics *consulMetrics } // RegisterFlags adds the flags required to config this to the given FlagSet @@ -78,7 +80,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet, prefix string) { } // NewClient returns a new Client. -func NewClient(cfg Config, codec codec.Codec, logger log.Logger) (*Client, error) { +func NewClient(cfg Config, codec codec.Codec, logger log.Logger, registerer prometheus.Registerer) (*Client, error) { client, err := consul.NewClient(&consul.Config{ Address: cfg.Host, Token: cfg.ACLToken, @@ -92,11 +94,14 @@ func NewClient(cfg Config, codec codec.Codec, logger log.Logger) (*Client, error if err != nil { return nil, err } + consulMetrics := newConsulMetrics(registerer) + c := &Client{ - kv: consulMetrics{client.KV()}, - codec: codec, - cfg: cfg, - logger: logger, + kv: consulInstrumentation{client.KV(), consulMetrics}, + codec: codec, + cfg: cfg, + logger: logger, + consulMetrics: consulMetrics, } return c, nil } @@ -108,7 +113,7 @@ func (c *Client) Put(ctx context.Context, key string, value interface{}) error { return err } - return instrument.CollectedRequest(ctx, "Put", consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { + return instrument.CollectedRequest(ctx, "Put", c.consulMetrics.consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { _, err := c.kv.Put(&consul.KVPair{ Key: key, Value: bytes, @@ -120,7 +125,7 @@ func (c *Client) Put(ctx context.Context, key string, value interface{}) error { // CAS atomically modifies a value in a callback. // If value doesn't exist you'll get nil as an argument to your callback. func (c *Client) CAS(ctx context.Context, key string, f func(in interface{}) (out interface{}, retry bool, err error)) error { - return instrument.CollectedRequest(ctx, "CAS loop", consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { + return instrument.CollectedRequest(ctx, "CAS loop", c.consulMetrics.consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { return c.cas(ctx, key, f) }) } diff --git a/vendor/github.com/grafana/dskit/kv/consul/metrics.go b/vendor/github.com/grafana/dskit/kv/consul/metrics.go index 0b29405677..52a1d4e843 100644 --- a/vendor/github.com/grafana/dskit/kv/consul/metrics.go +++ b/vendor/github.com/grafana/dskit/kv/consul/metrics.go @@ -5,27 +5,33 @@ import ( consul "github.com/hashicorp/consul/api" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/weaveworks/common/instrument" ) -var consulRequestDuration = instrument.NewHistogramCollector(prometheus.NewHistogramVec(prometheus.HistogramOpts{ - Name: "consul_request_duration_seconds", - Help: "Time spent on consul requests.", - Buckets: prometheus.DefBuckets, -}, []string{"operation", "status_code"})) - -func init() { - consulRequestDuration.Register() +type consulInstrumentation struct { + kv kv + consulMetrics *consulMetrics } type consulMetrics struct { - kv + consulRequestDuration *instrument.HistogramCollector +} + +func newConsulMetrics(registerer prometheus.Registerer) *consulMetrics { + consulRequestDurationCollector := instrument.NewHistogramCollector(promauto.With(registerer).NewHistogramVec(prometheus.HistogramOpts{ + Name: "consul_request_duration_seconds", + Help: "Time spent on consul requests.", + Buckets: prometheus.DefBuckets, + }, []string{"operation", "status_code"})) + consulMetrics := consulMetrics{consulRequestDurationCollector} + return &consulMetrics } -func (c consulMetrics) CAS(p *consul.KVPair, options *consul.WriteOptions) (bool, *consul.WriteMeta, error) { +func (c consulInstrumentation) CAS(p *consul.KVPair, options *consul.WriteOptions) (bool, *consul.WriteMeta, error) { var ok bool var result *consul.WriteMeta - err := instrument.CollectedRequest(options.Context(), "CAS", consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { + err := instrument.CollectedRequest(options.Context(), "CAS", c.consulMetrics.consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { options = options.WithContext(ctx) var err error ok, result, err = c.kv.CAS(p, options) @@ -34,10 +40,10 @@ func (c consulMetrics) CAS(p *consul.KVPair, options *consul.WriteOptions) (bool return ok, result, err } -func (c consulMetrics) Get(key string, options *consul.QueryOptions) (*consul.KVPair, *consul.QueryMeta, error) { +func (c consulInstrumentation) Get(key string, options *consul.QueryOptions) (*consul.KVPair, *consul.QueryMeta, error) { var kvp *consul.KVPair var meta *consul.QueryMeta - err := instrument.CollectedRequest(options.Context(), "Get", consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { + err := instrument.CollectedRequest(options.Context(), "Get", c.consulMetrics.consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { options = options.WithContext(ctx) var err error kvp, meta, err = c.kv.Get(key, options) @@ -46,10 +52,10 @@ func (c consulMetrics) Get(key string, options *consul.QueryOptions) (*consul.KV return kvp, meta, err } -func (c consulMetrics) List(path string, options *consul.QueryOptions) (consul.KVPairs, *consul.QueryMeta, error) { +func (c consulInstrumentation) List(path string, options *consul.QueryOptions) (consul.KVPairs, *consul.QueryMeta, error) { var kvps consul.KVPairs var meta *consul.QueryMeta - err := instrument.CollectedRequest(options.Context(), "List", consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { + err := instrument.CollectedRequest(options.Context(), "List", c.consulMetrics.consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { options = options.WithContext(ctx) var err error kvps, meta, err = c.kv.List(path, options) @@ -58,9 +64,9 @@ func (c consulMetrics) List(path string, options *consul.QueryOptions) (consul.K return kvps, meta, err } -func (c consulMetrics) Delete(key string, options *consul.WriteOptions) (*consul.WriteMeta, error) { +func (c consulInstrumentation) Delete(key string, options *consul.WriteOptions) (*consul.WriteMeta, error) { var meta *consul.WriteMeta - err := instrument.CollectedRequest(options.Context(), "Delete", consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { + err := instrument.CollectedRequest(options.Context(), "Delete", c.consulMetrics.consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { options = options.WithContext(ctx) var err error meta, err = c.kv.Delete(key, options) @@ -69,9 +75,9 @@ func (c consulMetrics) Delete(key string, options *consul.WriteOptions) (*consul return meta, err } -func (c consulMetrics) Put(p *consul.KVPair, options *consul.WriteOptions) (*consul.WriteMeta, error) { +func (c consulInstrumentation) Put(p *consul.KVPair, options *consul.WriteOptions) (*consul.WriteMeta, error) { var result *consul.WriteMeta - err := instrument.CollectedRequest(options.Context(), "Put", consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { + err := instrument.CollectedRequest(options.Context(), "Put", c.consulMetrics.consulRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { options = options.WithContext(ctx) var err error result, err = c.kv.Put(p, options) diff --git a/vendor/github.com/grafana/dskit/kv/consul/mock.go b/vendor/github.com/grafana/dskit/kv/consul/mock.go index d22381bfe2..a5ed43df93 100644 --- a/vendor/github.com/grafana/dskit/kv/consul/mock.go +++ b/vendor/github.com/grafana/dskit/kv/consul/mock.go @@ -10,6 +10,7 @@ import ( "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" consul "github.com/hashicorp/consul/api" + "github.com/prometheus/client_golang/prometheus" "github.com/grafana/dskit/closer" "github.com/grafana/dskit/kv/codec" @@ -28,12 +29,12 @@ type mockKV struct { } // NewInMemoryClient makes a new mock consul client. -func NewInMemoryClient(codec codec.Codec, logger log.Logger) (*Client, io.Closer) { - return NewInMemoryClientWithConfig(codec, Config{}, logger) +func NewInMemoryClient(codec codec.Codec, logger log.Logger, registerer prometheus.Registerer) (*Client, io.Closer) { + return NewInMemoryClientWithConfig(codec, Config{}, logger, registerer) } // NewInMemoryClientWithConfig makes a new mock consul client with supplied Config. -func NewInMemoryClientWithConfig(codec codec.Codec, cfg Config, logger log.Logger) (*Client, io.Closer) { +func NewInMemoryClientWithConfig(codec codec.Codec, cfg Config, logger log.Logger, registerer prometheus.Registerer) (*Client, io.Closer) { m := mockKV{ kvps: map[string]*consul.KVPair{}, // Always start from 1, we NEVER want to report back index 0 in the responses. @@ -58,10 +59,11 @@ func NewInMemoryClientWithConfig(codec codec.Codec, cfg Config, logger log.Logge go m.loop() return &Client{ - kv: &m, - codec: codec, - cfg: cfg, - logger: logger, + kv: &m, + codec: codec, + cfg: cfg, + logger: logger, + consulMetrics: newConsulMetrics(registerer), }, closer } diff --git a/vendor/github.com/grafana/dskit/kv/memberlist/kv_init_service.go b/vendor/github.com/grafana/dskit/kv/memberlist/kv_init_service.go index f1e053b13e..c137bc786d 100644 --- a/vendor/github.com/grafana/dskit/kv/memberlist/kv_init_service.go +++ b/vendor/github.com/grafana/dskit/kv/memberlist/kv_init_service.go @@ -14,6 +14,7 @@ import ( "github.com/go-kit/kit/log" "github.com/hashicorp/memberlist" + "github.com/prometheus/client_golang/prometheus" "go.uber.org/atomic" "github.com/grafana/dskit/services" @@ -28,6 +29,7 @@ type KVInitService struct { cfg *KVConfig logger log.Logger dnsProvider DNSProvider + registerer prometheus.Registerer // init function, to avoid multiple initializations. init sync.Once @@ -38,11 +40,12 @@ type KVInitService struct { watcher *services.FailureWatcher } -func NewKVInitService(cfg *KVConfig, logger log.Logger, dnsProvider DNSProvider) *KVInitService { +func NewKVInitService(cfg *KVConfig, logger log.Logger, dnsProvider DNSProvider, registerer prometheus.Registerer) *KVInitService { kvinit := &KVInitService{ cfg: cfg, watcher: services.NewFailureWatcher(), logger: logger, + registerer: registerer, dnsProvider: dnsProvider, } kvinit.Service = services.NewBasicService(nil, kvinit.running, kvinit.stopping).WithName("memberlist KV service") @@ -52,7 +55,7 @@ func NewKVInitService(cfg *KVConfig, logger log.Logger, dnsProvider DNSProvider) // GetMemberlistKV will initialize Memberlist.KV on first call, and add it to service failure watcher. func (kvs *KVInitService) GetMemberlistKV() (*KV, error) { kvs.init.Do(func() { - kv := NewKV(*kvs.cfg, kvs.logger, kvs.dnsProvider) + kv := NewKV(*kvs.cfg, kvs.logger, kvs.dnsProvider, kvs.registerer) kvs.watcher.WatchService(kv) kvs.err = kv.StartAsync(context.Background()) diff --git a/vendor/github.com/grafana/dskit/kv/memberlist/memberlist_client.go b/vendor/github.com/grafana/dskit/kv/memberlist/memberlist_client.go index 4faad94f32..d5c1c7e74c 100644 --- a/vendor/github.com/grafana/dskit/kv/memberlist/memberlist_client.go +++ b/vendor/github.com/grafana/dskit/kv/memberlist/memberlist_client.go @@ -212,8 +212,9 @@ func generateRandomSuffix(logger log.Logger) string { type KV struct { services.Service - cfg KVConfig - logger log.Logger + cfg KVConfig + logger log.Logger + registerer prometheus.Registerer // dns discovery provider provider DNSProvider @@ -326,14 +327,16 @@ var ( // gossiping part. Only after service is in Running state, it is really gossiping. Starting the service will also // trigger connecting to the existing memberlist cluster. If that fails and AbortIfJoinFails is true, error is returned // and service enters Failed state. -func NewKV(cfg KVConfig, logger log.Logger, dnsProvider DNSProvider) *KV { +func NewKV(cfg KVConfig, logger log.Logger, dnsProvider DNSProvider, registerer prometheus.Registerer) *KV { cfg.TCPTransport.MetricsRegisterer = cfg.MetricsRegisterer cfg.TCPTransport.MetricsNamespace = cfg.MetricsNamespace mlkv := &KV{ - cfg: cfg, - logger: logger, - provider: dnsProvider, + cfg: cfg, + logger: logger, + registerer: registerer, + provider: dnsProvider, + store: make(map[string]valueDesc), codecs: make(map[string]codec.Codec), watchers: make(map[string][]chan string), diff --git a/vendor/github.com/grafana/dskit/kv/memberlist/metrics.go b/vendor/github.com/grafana/dskit/kv/memberlist/metrics.go index 010288fbab..26fd905fb7 100644 --- a/vendor/github.com/grafana/dskit/kv/memberlist/metrics.go +++ b/vendor/github.com/grafana/dskit/kv/memberlist/metrics.go @@ -7,6 +7,7 @@ import ( armonprometheus "github.com/armon/go-metrics/prometheus" "github.com/go-kit/kit/log/level" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/grafana/dskit/services" ) @@ -14,56 +15,56 @@ import ( func (m *KV) createAndRegisterMetrics() { const subsystem = "memberlist_client" - m.numberOfReceivedMessages = prometheus.NewCounter(prometheus.CounterOpts{ + m.numberOfReceivedMessages = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "received_broadcasts_total", Help: "Number of received broadcast user messages", }) - m.totalSizeOfReceivedMessages = prometheus.NewCounter(prometheus.CounterOpts{ + m.totalSizeOfReceivedMessages = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "received_broadcasts_bytes_total", Help: "Total size of received broadcast user messages", }) - m.numberOfInvalidReceivedMessages = prometheus.NewCounter(prometheus.CounterOpts{ + m.numberOfInvalidReceivedMessages = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "received_broadcasts_invalid_total", Help: "Number of received broadcast user messages that were invalid. Hopefully 0.", }) - m.numberOfPushes = prometheus.NewCounter(prometheus.CounterOpts{ + m.numberOfPushes = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "state_pushes_total", Help: "How many times did this node push its full state to another node", }) - m.totalSizeOfPushes = prometheus.NewCounter(prometheus.CounterOpts{ + m.totalSizeOfPushes = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "state_pushes_bytes_total", Help: "Total size of pushed state", }) - m.numberOfPulls = prometheus.NewCounter(prometheus.CounterOpts{ + m.numberOfPulls = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "state_pulls_total", Help: "How many times did this node pull full state from another node", }) - m.totalSizeOfPulls = prometheus.NewCounter(prometheus.CounterOpts{ + m.totalSizeOfPulls = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "state_pulls_bytes_total", Help: "Total size of pulled state", }) - m.numberOfBroadcastMessagesInQueue = prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + m.numberOfBroadcastMessagesInQueue = promauto.With(m.registerer).NewGaugeFunc(prometheus.GaugeOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "messages_in_broadcast_queue", @@ -76,35 +77,35 @@ func (m *KV) createAndRegisterMetrics() { return 0 }) - m.totalSizeOfBroadcastMessagesInQueue = prometheus.NewGauge(prometheus.GaugeOpts{ + m.totalSizeOfBroadcastMessagesInQueue = promauto.With(m.registerer).NewGauge(prometheus.GaugeOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "messages_in_broadcast_queue_bytes", Help: "Total size of messages waiting in the broadcast queue", }) - m.numberOfBroadcastMessagesDropped = prometheus.NewCounter(prometheus.CounterOpts{ + m.numberOfBroadcastMessagesDropped = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "messages_to_broadcast_dropped_total", Help: "Number of broadcast messages intended to be sent but were dropped due to encoding errors or for being too big", }) - m.casAttempts = prometheus.NewCounter(prometheus.CounterOpts{ + m.casAttempts = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "cas_attempt_total", Help: "Attempted CAS operations", }) - m.casSuccesses = prometheus.NewCounter(prometheus.CounterOpts{ + m.casSuccesses = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "cas_success_total", Help: "Successful CAS operations", }) - m.casFailures = prometheus.NewCounter(prometheus.CounterOpts{ + m.casFailures = promauto.With(m.registerer).NewCounter(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "cas_failure_total", @@ -116,21 +117,21 @@ func (m *KV) createAndRegisterMetrics() { "Number of values in KV Store", nil, nil) - m.storeTombstones = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + m.storeTombstones = promauto.With(m.registerer).NewGaugeVec(prometheus.GaugeOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "kv_store_value_tombstones", Help: "Number of tombstones currently present in KV store values", }, []string{"key"}) - m.storeRemovedTombstones = prometheus.NewCounterVec(prometheus.CounterOpts{ + m.storeRemovedTombstones = promauto.With(m.registerer).NewCounterVec(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "kv_store_value_tombstones_removed_total", Help: "Total number of tombstones which have been removed from KV store values", }, []string{"key"}) - m.memberlistMembersCount = prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + m.memberlistMembersCount = promauto.With(m.registerer).NewGaugeFunc(prometheus.GaugeOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "cluster_members_count", @@ -143,7 +144,7 @@ func (m *KV) createAndRegisterMetrics() { return 0 }) - m.memberlistHealthScore = prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + m.memberlistHealthScore = promauto.With(m.registerer).NewGaugeFunc(prometheus.GaugeOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "cluster_node_health_score", @@ -156,7 +157,7 @@ func (m *KV) createAndRegisterMetrics() { return 0 }) - m.watchPrefixDroppedNotifications = prometheus.NewCounterVec(prometheus.CounterOpts{ + m.watchPrefixDroppedNotifications = promauto.With(m.registerer).NewCounterVec(prometheus.CounterOpts{ Namespace: m.cfg.MetricsNamespace, Subsystem: subsystem, Name: "watch_prefix_dropped_notifications", @@ -167,33 +168,6 @@ func (m *KV) createAndRegisterMetrics() { return } - all := []prometheus.Collector{ - m.numberOfReceivedMessages, - m.totalSizeOfReceivedMessages, - m.numberOfInvalidReceivedMessages, - m.numberOfBroadcastMessagesInQueue, - m.numberOfPushes, - m.numberOfPulls, - m.totalSizeOfPushes, - m.totalSizeOfPulls, - m.totalSizeOfBroadcastMessagesInQueue, - m.numberOfBroadcastMessagesDropped, - m.casAttempts, - m.casFailures, - m.casSuccesses, - m.watchPrefixDroppedNotifications, - m.storeTombstones, - m.storeRemovedTombstones, - m.memberlistMembersCount, - m.memberlistHealthScore, - } - - for _, c := range all { - m.cfg.MetricsRegisterer.MustRegister(c) - } - - m.cfg.MetricsRegisterer.MustRegister(m) - // memberlist uses armonmetrics package for internal usage // here we configure armonmetrics to use prometheus sink, err := armonprometheus.NewPrometheusSink() // there is no option to pass registrerer, this uses default diff --git a/vendor/github.com/grafana/dskit/kv/memberlist/tcp_transport.go b/vendor/github.com/grafana/dskit/kv/memberlist/tcp_transport.go index 1d50032cdf..4c6badee01 100644 --- a/vendor/github.com/grafana/dskit/kv/memberlist/tcp_transport.go +++ b/vendor/github.com/grafana/dskit/kv/memberlist/tcp_transport.go @@ -18,6 +18,7 @@ import ( "github.com/hashicorp/memberlist" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "go.uber.org/atomic" "github.com/grafana/dskit/flagext" @@ -128,7 +129,7 @@ func NewTCPTransport(config TCPTransportConfig, logger log.Logger) (*TCPTranspor } } - t.registerMetrics() + t.registerMetrics(config.MetricsRegisterer) // Clean up listeners if there's an error. defer func() { @@ -545,98 +546,76 @@ func (t *TCPTransport) Shutdown() error { return nil } -func (t *TCPTransport) registerMetrics() { +func (t *TCPTransport) registerMetrics(registerer prometheus.Registerer) { const subsystem = "memberlist_tcp_transport" - t.incomingStreams = prometheus.NewCounter(prometheus.CounterOpts{ + t.incomingStreams = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Namespace: t.cfg.MetricsNamespace, Subsystem: subsystem, Name: "incoming_streams_total", Help: "Number of incoming memberlist streams", }) - t.outgoingStreams = prometheus.NewCounter(prometheus.CounterOpts{ + t.outgoingStreams = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Namespace: t.cfg.MetricsNamespace, Subsystem: subsystem, Name: "outgoing_streams_total", Help: "Number of outgoing streams", }) - t.outgoingStreamErrors = prometheus.NewCounter(prometheus.CounterOpts{ + t.outgoingStreamErrors = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Namespace: t.cfg.MetricsNamespace, Subsystem: subsystem, Name: "outgoing_stream_errors_total", Help: "Number of errors when opening memberlist stream to another node", }) - t.receivedPackets = prometheus.NewCounter(prometheus.CounterOpts{ + t.receivedPackets = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Namespace: t.cfg.MetricsNamespace, Subsystem: subsystem, Name: "packets_received_total", Help: "Number of received memberlist packets", }) - t.receivedPacketsBytes = prometheus.NewCounter(prometheus.CounterOpts{ + t.receivedPacketsBytes = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Namespace: t.cfg.MetricsNamespace, Subsystem: subsystem, Name: "packets_received_bytes_total", Help: "Total bytes received as packets", }) - t.receivedPacketsErrors = prometheus.NewCounter(prometheus.CounterOpts{ + t.receivedPacketsErrors = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Namespace: t.cfg.MetricsNamespace, Subsystem: subsystem, Name: "packets_received_errors_total", Help: "Number of errors when receiving memberlist packets", }) - t.sentPackets = prometheus.NewCounter(prometheus.CounterOpts{ + t.sentPackets = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Namespace: t.cfg.MetricsNamespace, Subsystem: subsystem, Name: "packets_sent_total", Help: "Number of memberlist packets sent", }) - t.sentPacketsBytes = prometheus.NewCounter(prometheus.CounterOpts{ + t.sentPacketsBytes = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Namespace: t.cfg.MetricsNamespace, Subsystem: subsystem, Name: "packets_sent_bytes_total", Help: "Total bytes sent as packets", }) - t.sentPacketsErrors = prometheus.NewCounter(prometheus.CounterOpts{ + t.sentPacketsErrors = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Namespace: t.cfg.MetricsNamespace, Subsystem: subsystem, Name: "packets_sent_errors_total", Help: "Number of errors when sending memberlist packets", }) - t.unknownConnections = prometheus.NewCounter(prometheus.CounterOpts{ + t.unknownConnections = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Namespace: t.cfg.MetricsNamespace, Subsystem: subsystem, Name: "unknown_connections_total", Help: "Number of unknown TCP connections (not a packet or stream)", }) - - if t.cfg.MetricsRegisterer == nil { - return - } - - all := []prometheus.Metric{ - t.incomingStreams, - t.outgoingStreams, - t.outgoingStreamErrors, - t.receivedPackets, - t.receivedPacketsBytes, - t.receivedPacketsErrors, - t.sentPackets, - t.sentPacketsBytes, - t.sentPacketsErrors, - t.unknownConnections, - } - - // if registration fails, that's too bad, but don't panic - for _, c := range all { - t.cfg.MetricsRegisterer.MustRegister(c.(prometheus.Collector)) - } } diff --git a/vendor/github.com/grafana/dskit/kv/multi.go b/vendor/github.com/grafana/dskit/kv/multi.go index e750e9aa4b..233b3a1aa9 100644 --- a/vendor/github.com/grafana/dskit/kv/multi.go +++ b/vendor/github.com/grafana/dskit/kv/multi.go @@ -10,35 +10,10 @@ import ( "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "go.uber.org/atomic" ) -var ( - primaryStoreGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{ - Name: "multikv_primary_store", - Help: "Selected primary KV store", - }, []string{"store"}) - - mirrorEnabledGauge = prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "multikv_mirror_enabled", - Help: "Is mirroring to secondary store enabled", - }) - - mirrorWritesCounter = prometheus.NewCounter(prometheus.CounterOpts{ - Name: "multikv_mirror_writes_total", - Help: "Number of mirror-writes to secondary store", - }) - - mirrorFailuresCounter = prometheus.NewCounter(prometheus.CounterOpts{ - Name: "multikv_mirror_write_errors_total", - Help: "Number of failures to mirror-write to secondary store", - }) -) - -func init() { - prometheus.MustRegister(primaryStoreGauge, mirrorEnabledGauge, mirrorWritesCounter, mirrorFailuresCounter) -} - // MultiConfig is a configuration for MultiClient. type MultiConfig struct { Primary string `yaml:"primary"` @@ -102,11 +77,16 @@ type MultiClient struct { // so we use this map instead. inProgress map[int]clientInProgress inProgressCnt int + + primaryStoreGauge *prometheus.GaugeVec + mirrorEnabledGauge prometheus.Gauge + mirrorWritesCounter prometheus.Counter + mirrorFailuresCounter prometheus.Counter } // NewMultiClient creates new MultiClient with given KV Clients. // First client in the slice is the primary client. -func NewMultiClient(cfg MultiConfig, clients []kvclient, logger log.Logger) *MultiClient { +func NewMultiClient(cfg MultiConfig, clients []kvclient, logger log.Logger, registerer prometheus.Registerer) *MultiClient { c := &MultiClient{ clients: clients, primaryID: atomic.NewInt32(0), @@ -125,6 +105,7 @@ func NewMultiClient(cfg MultiConfig, clients []kvclient, logger log.Logger) *Mul go c.watchConfigChannel(ctx, cfg.ConfigProvider()) } + c.registerMetrics(registerer) c.updatePrimaryStoreGauge() c.updateMirrorEnabledGauge() return c @@ -201,6 +182,28 @@ func (m *MultiClient) setNewPrimaryClient(store string) (bool, error) { return true, nil } +func (m *MultiClient) registerMetrics(registerer prometheus.Registerer) { + m.primaryStoreGauge = promauto.With(registerer).NewGaugeVec(prometheus.GaugeOpts{ + Name: "multikv_primary_store", + Help: "Selected primary KV store", + }, []string{"store"}) + + m.mirrorEnabledGauge = promauto.With(registerer).NewGauge(prometheus.GaugeOpts{ + Name: "multikv_mirror_enabled", + Help: "Is mirroring to secondary store enabled", + }) + + m.mirrorWritesCounter = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ + Name: "multikv_mirror_writes_total", + Help: "Number of mirror-writes to secondary store", + }) + + m.mirrorFailuresCounter = promauto.With(registerer).NewCounter(prometheus.CounterOpts{ + Name: "multikv_mirror_write_errors_total", + Help: "Number of failures to mirror-write to secondary store", + }) +} + func (m *MultiClient) updatePrimaryStoreGauge() { _, pkv := m.getPrimaryClient() @@ -210,15 +213,15 @@ func (m *MultiClient) updatePrimaryStoreGauge() { value = 1 } - primaryStoreGauge.WithLabelValues(kv.name).Set(value) + m.primaryStoreGauge.WithLabelValues(kv.name).Set(value) } } func (m *MultiClient) updateMirrorEnabledGauge() { if m.mirroringEnabled.Load() { - mirrorEnabledGauge.Set(1) + m.mirrorEnabledGauge.Set(1) } else { - mirrorEnabledGauge.Set(0) + m.mirrorEnabledGauge.Set(0) } } @@ -345,14 +348,14 @@ func (m *MultiClient) writeToSecondary(ctx context.Context, primary kvclient, ke continue } - mirrorWritesCounter.Inc() + m.mirrorWritesCounter.Inc() err := kvc.client.CAS(ctx, key, func(in interface{}) (out interface{}, retry bool, err error) { // try once return newValue, false, nil }) if err != nil { - mirrorFailuresCounter.Inc() + m.mirrorFailuresCounter.Inc() level.Warn(m.logger).Log("msg", "failed to update value in secondary store", "key", key, "err", err, "primary", primary.name, "secondary", kvc.name) } else { level.Debug(m.logger).Log("msg", "stored updated value to secondary store", "key", key, "primary", primary.name, "secondary", kvc.name) diff --git a/vendor/modules.txt b/vendor/modules.txt index a899c6033d..2e8c664712 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -208,7 +208,7 @@ github.com/coreos/go-systemd/sdjournal github.com/coreos/go-systemd/v22/journal # github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f github.com/coreos/pkg/capnslog -# github.com/cortexproject/cortex v1.10.1-0.20210906152552-028c4b3c9e71 +# github.com/cortexproject/cortex v1.10.1-0.20210910135323-8250d8703a8f ## explicit github.com/cortexproject/cortex/pkg/alertmanager github.com/cortexproject/cortex/pkg/alertmanager/alertmanagerpb @@ -417,7 +417,6 @@ github.com/fsouza/fake-gcs-server/internal/backend github.com/go-kit/kit/log github.com/go-kit/kit/log/level # github.com/go-kit/log v0.1.0 -## explicit github.com/go-kit/log github.com/go-kit/log/level # github.com/go-logfmt/logfmt v0.5.0 @@ -561,7 +560,7 @@ github.com/gorilla/mux # github.com/gorilla/websocket v1.4.2 ## explicit github.com/gorilla/websocket -# github.com/grafana/dskit v0.0.0-20210827060659-9daca2f00327 +# github.com/grafana/dskit v0.0.0-20210910100700-60e6d9b19675 ## explicit github.com/grafana/dskit/backoff github.com/grafana/dskit/closer