From 48bc7ae88ed541522d2888d54f8a2175d1a6d303 Mon Sep 17 00:00:00 2001 From: aldernero Date: Tue, 25 Jan 2022 17:39:03 -0700 Subject: [PATCH 001/168] added autodetect of interfaces on private networks --- pkg/alertmanager/alertmanager_ring.go | 3 +- pkg/compactor/compactor_ring.go | 3 +- pkg/distributor/distributor_ring.go | 3 +- pkg/frontend/v2/frontend.go | 3 +- pkg/ruler/ruler_ring.go | 3 +- pkg/storegateway/gateway_ring.go | 3 +- pkg/util/net.go | 33 +++++++++++++++++++ .../grafana/dskit/ring/lifecycler.go | 3 +- 8 files changed, 47 insertions(+), 7 deletions(-) diff --git a/pkg/alertmanager/alertmanager_ring.go b/pkg/alertmanager/alertmanager_ring.go index f52fed0b7ff..3afa990eddf 100644 --- a/pkg/alertmanager/alertmanager_ring.go +++ b/pkg/alertmanager/alertmanager_ring.go @@ -17,6 +17,7 @@ import ( "github.com/grafana/dskit/kv" "github.com/grafana/dskit/ring" + "github.com/grafana/mimir/pkg/util" util_log "github.com/grafana/mimir/pkg/util/log" ) @@ -88,7 +89,7 @@ func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet) { f.BoolVar(&cfg.ZoneAwarenessEnabled, rfprefix+"zone-awareness-enabled", false, "True to enable zone-awareness and replicate alerts across different availability zones.") // Instance flags - cfg.InstanceInterfaceNames = []string{"eth0", "en0"} + cfg.InstanceInterfaceNames = util.PrivateNetworkInterfaces() f.Var((*flagext.StringSlice)(&cfg.InstanceInterfaceNames), rfprefix+"instance-interface-names", "Name of network interface to read address from.") f.StringVar(&cfg.InstanceAddr, rfprefix+"instance-addr", "", "IP address to advertise in the ring.") f.IntVar(&cfg.InstancePort, rfprefix+"instance-port", 0, "Port to advertise in the ring (defaults to server.grpc-listen-port).") diff --git a/pkg/compactor/compactor_ring.go b/pkg/compactor/compactor_ring.go index c7a9959855c..7c59ec7c268 100644 --- a/pkg/compactor/compactor_ring.go +++ b/pkg/compactor/compactor_ring.go @@ -15,6 +15,7 @@ import ( "github.com/grafana/dskit/kv" "github.com/grafana/dskit/ring" + "github.com/grafana/mimir/pkg/util" util_log "github.com/grafana/mimir/pkg/util/log" ) @@ -63,7 +64,7 @@ func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.WaitStabilityMaxDuration, "compactor.ring.wait-stability-max-duration", 5*time.Minute, "Maximum time to wait for ring stability at startup. If the compactor ring keeps changing after this period of time, the compactor will start anyway.") // Instance flags - cfg.InstanceInterfaceNames = []string{"eth0", "en0"} + cfg.InstanceInterfaceNames = util.PrivateNetworkInterfaces() f.Var((*flagext.StringSlice)(&cfg.InstanceInterfaceNames), "compactor.ring.instance-interface-names", "Name of network interface to read address from.") f.StringVar(&cfg.InstanceAddr, "compactor.ring.instance-addr", "", "IP address to advertise in the ring.") f.IntVar(&cfg.InstancePort, "compactor.ring.instance-port", 0, "Port to advertise in the ring (defaults to server.grpc-listen-port).") diff --git a/pkg/distributor/distributor_ring.go b/pkg/distributor/distributor_ring.go index 7724a008e98..76024c389fa 100644 --- a/pkg/distributor/distributor_ring.go +++ b/pkg/distributor/distributor_ring.go @@ -14,6 +14,7 @@ import ( "github.com/grafana/dskit/flagext" "github.com/grafana/dskit/kv" "github.com/grafana/dskit/ring" + "github.com/grafana/mimir/pkg/util" util_log "github.com/grafana/mimir/pkg/util/log" ) @@ -51,7 +52,7 @@ func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.HeartbeatTimeout, "distributor.ring.heartbeat-timeout", time.Minute, "The heartbeat timeout after which distributors are considered unhealthy within the ring. 0 = never (timeout disabled).") // Instance flags - cfg.InstanceInterfaceNames = []string{"eth0", "en0"} + cfg.InstanceInterfaceNames = util.PrivateNetworkInterfaces() f.Var((*flagext.StringSlice)(&cfg.InstanceInterfaceNames), "distributor.ring.instance-interface-names", "Name of network interface to read address from.") f.StringVar(&cfg.InstanceAddr, "distributor.ring.instance-addr", "", "IP address to advertise in the ring.") f.IntVar(&cfg.InstancePort, "distributor.ring.instance-port", 0, "Port to advertise in the ring (defaults to server.grpc-listen-port).") diff --git a/pkg/frontend/v2/frontend.go b/pkg/frontend/v2/frontend.go index 82e325939ae..e4381dec16f 100644 --- a/pkg/frontend/v2/frontend.go +++ b/pkg/frontend/v2/frontend.go @@ -29,6 +29,7 @@ import ( "github.com/grafana/mimir/pkg/frontend/v2/frontendv2pb" "github.com/grafana/mimir/pkg/querier/stats" "github.com/grafana/mimir/pkg/tenant" + "github.com/grafana/mimir/pkg/util" "github.com/grafana/mimir/pkg/util/httpgrpcutil" ) @@ -52,7 +53,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.DNSLookupPeriod, "frontend.scheduler-dns-lookup-period", 10*time.Second, "How often to resolve the scheduler-address, in order to look for new query-scheduler instances.") f.IntVar(&cfg.WorkerConcurrency, "frontend.scheduler-worker-concurrency", 5, "Number of concurrent workers forwarding queries to single query-scheduler.") - cfg.InfNames = []string{"eth0", "en0"} + cfg.InfNames = util.PrivateNetworkInterfaces() f.Var((*flagext.StringSlice)(&cfg.InfNames), "frontend.instance-interface-names", "Name of network interface to read address from. This address is sent to query-scheduler and querier, which uses it to send the query response back to query-frontend.") f.StringVar(&cfg.Addr, "frontend.instance-addr", "", "IP address to advertise to querier (via scheduler) (resolved via interfaces by default).") f.IntVar(&cfg.Port, "frontend.instance-port", 0, "Port to advertise to querier (via scheduler) (defaults to server.grpc-listen-port).") diff --git a/pkg/ruler/ruler_ring.go b/pkg/ruler/ruler_ring.go index 008f9ee4b73..e7c340cab7a 100644 --- a/pkg/ruler/ruler_ring.go +++ b/pkg/ruler/ruler_ring.go @@ -15,6 +15,7 @@ import ( "github.com/grafana/dskit/flagext" "github.com/grafana/dskit/kv" "github.com/grafana/dskit/ring" + "github.com/grafana/mimir/pkg/util" ) const ( @@ -66,7 +67,7 @@ func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.HeartbeatTimeout, "ruler.ring.heartbeat-timeout", time.Minute, "The heartbeat timeout after which rulers are considered unhealthy within the ring. 0 = never (timeout disabled).") // Instance flags - cfg.InstanceInterfaceNames = []string{"eth0", "en0"} + cfg.InstanceInterfaceNames = util.PrivateNetworkInterfaces() f.Var((*flagext.StringSlice)(&cfg.InstanceInterfaceNames), "ruler.ring.instance-interface-names", "Name of network interface to read address from.") f.StringVar(&cfg.InstanceAddr, "ruler.ring.instance-addr", "", "IP address to advertise in the ring.") f.IntVar(&cfg.InstancePort, "ruler.ring.instance-port", 0, "Port to advertise in the ring (defaults to server.grpc-listen-port).") diff --git a/pkg/storegateway/gateway_ring.go b/pkg/storegateway/gateway_ring.go index a21237cfeab..6030ac89d83 100644 --- a/pkg/storegateway/gateway_ring.go +++ b/pkg/storegateway/gateway_ring.go @@ -16,6 +16,7 @@ import ( "github.com/grafana/dskit/flagext" "github.com/grafana/dskit/kv" "github.com/grafana/dskit/ring" + "github.com/grafana/mimir/pkg/util" util_log "github.com/grafana/mimir/pkg/util/log" ) @@ -109,7 +110,7 @@ func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.WaitStabilityMaxDuration, ringFlagsPrefix+"wait-stability-max-duration", 5*time.Minute, "Maximum time to wait for ring stability at startup. If the store-gateway ring keeps changing after this period of time, the store-gateway will start anyway.") // Instance flags - cfg.InstanceInterfaceNames = []string{"eth0", "en0"} + cfg.InstanceInterfaceNames = util.PrivateNetworkInterfaces() f.Var((*flagext.StringSlice)(&cfg.InstanceInterfaceNames), ringFlagsPrefix+"instance-interface-names", "Name of network interface to read address from.") f.StringVar(&cfg.InstanceAddr, ringFlagsPrefix+"instance-addr", "", "IP address to advertise in the ring.") f.IntVar(&cfg.InstancePort, ringFlagsPrefix+"instance-port", 0, "Port to advertise in the ring (defaults to server.grpc-listen-port).") diff --git a/pkg/util/net.go b/pkg/util/net.go index 9a2edf8247e..24dec86a375 100644 --- a/pkg/util/net.go +++ b/pkg/util/net.go @@ -65,3 +65,36 @@ func filterIPs(addrs []net.Addr) string { } return ipAddr } + +// Parses network interfaces and returns those having an address conformant to RFC1918 +func PrivateNetworkInterfaces() []string { + var privInts []string + ints, err := net.Interfaces() + if err != nil { + level.Warn(util_log.Logger).Log("msg", "error getting interfaces", "err", err) + } + for _, i := range ints { + fmt.Println(i.Index, i.Name) + addrs, err := i.Addrs() + if err != nil { + level.Warn(util_log.Logger).Log("msg", "error getting addresses", "inf", i.Name, "err", err) + } + for _, a := range addrs { + s := a.String() + ip, _, err := net.ParseCIDR(s) + if err != nil { + level.Warn(util_log.Logger).Log("msg", "error getting ip address", "inf", i.Name, "addr", s, "err", err) + } + if ip.IsPrivate() { + privInts = append(privInts, i.Name) + break + } + } + } + if len(privInts) == 0 { + level.Warn(util_log.Logger).Log("msg", "couldn't find any interfaces on private networks, defaulting to [eth0 en0]") + return []string{"eth0", "en0"} + } + level.Info(util_log.Logger).Log("msg", "found interfaces on private networks:", "["+strings.Join(privInts, ", ")+"]") + return privInts +} diff --git a/vendor/github.com/grafana/dskit/ring/lifecycler.go b/vendor/github.com/grafana/dskit/ring/lifecycler.go index e8d1655e7a9..2f7579355f2 100644 --- a/vendor/github.com/grafana/dskit/ring/lifecycler.go +++ b/vendor/github.com/grafana/dskit/ring/lifecycler.go @@ -20,6 +20,7 @@ import ( "github.com/grafana/dskit/flagext" "github.com/grafana/dskit/kv" "github.com/grafana/dskit/services" + "github.com/grafana/mimir/pkg/util" ) // LifecyclerConfig is the config to build a Lifecycler. @@ -76,7 +77,7 @@ func (cfg *LifecyclerConfig) RegisterFlagsWithPrefix(prefix string, f *flag.Flag panic(fmt.Errorf("failed to get hostname %s", err)) } - cfg.InfNames = []string{"eth0", "en0"} + cfg.InfNames = util.PrivateNetworkInterfaces() f.Var((*flagext.StringSlice)(&cfg.InfNames), prefix+"lifecycler.interface", "Name of network interface to read address from.") f.StringVar(&cfg.Addr, prefix+"lifecycler.addr", "", "IP address to advertise in the ring.") f.IntVar(&cfg.Port, prefix+"lifecycler.port", 0, "port to advertise in consul (defaults to server.grpc-listen-port).") From 6a616ce94a572d3ba2cd774ec82663a22d233767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Wed, 26 Jan 2022 10:41:25 +0100 Subject: [PATCH 002/168] Remove sharding strategy from store-gateway. (#891) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove sharding strategy from store-gateway. Signed-off-by: Peter Štibraný --- CHANGELOG.md | 1 + docs/sources/blocks-storage/store-gateway.md | 16 +- .../blocks-storage/store-gateway.template | 11 +- .../configuration/config-file-reference.md | 11 +- docs/sources/guides/shuffle-sharding.md | 4 +- integration/querier_test.go | 77 ++--- pkg/querier/blocks_store_queryable.go | 2 +- pkg/querier/blocks_store_replicated_set.go | 12 +- .../blocks_store_replicated_set_test.go | 78 ++--- pkg/storegateway/gateway.go | 32 +- pkg/storegateway/gateway_test.go | 47 +-- pkg/storegateway/sharding_strategy.go | 28 -- pkg/storegateway/sharding_strategy_test.go | 276 ------------------ pkg/util/validation/limits.go | 2 +- 14 files changed, 96 insertions(+), 501 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 756149d336d..eb4610458a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -214,6 +214,7 @@ * `-query-frontend.cache-unaligned-requests` renamed to `-frontend.cache-unaligned-requests` * [CHANGE] Ruler: set new default limits for rule groups: `ruler.max_rules_per_rule_group` to 20 (previously 0, disabled) and `ruler.max_rule_groups_per_tenant` to 70 (previously 0, disabled). #847 * [CHANGE] Compactor is now included in `all` target (single-binary). #866 +* [CHANGE] Shuffle-sharding: `-store-gateway.sharding-strategy` option has been removed store-gateways. Store-gateway now uses shuffle-sharding by default, but respects `store_gateway_tenant_shard_size` for tenant, and this value defaults to 0. #891 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/docs/sources/blocks-storage/store-gateway.md b/docs/sources/blocks-storage/store-gateway.md index 5a0d3b183ad..3f5899584c8 100644 --- a/docs/sources/blocks-storage/store-gateway.md +++ b/docs/sources/blocks-storage/store-gateway.md @@ -50,16 +50,11 @@ This feature can be enabled via `-store-gateway.sharding-enabled=true` and requi ### Sharding strategies -The store-gateway supports two sharding strategies: +The store-gateway uses shuffle-sharding to spread the blocks of each tenant across a subset of store-gateway instances. The number of store-gateway instances loading blocks of a single tenant is limited and the blast radius of any issue that could be introduced by the tenant's workload is limited to its shard instances. -- `default` -- `shuffle-sharding` +The default number of store-gateway instances per tenant is configured using the `-store-gateway.tenant-shard-size` flag (or their respective YAML config options). The shard size can then be overridden on a per-tenant basis setting the `store_gateway_tenant_shard_size` in the limits overrides. -The **`default`** sharding strategy spreads the blocks of each tenant across all store-gateway instances. It's the easiest form of sharding supported, but doesn't provide any workload isolation between different tenants. - -The **`shuffle-sharding`** strategy spreads the blocks of a tenant across a subset of store-gateway instances. This way, the number of store-gateway instances loading blocks of a single tenant is limited and the blast radius of any issue that could be introduced by the tenant's workload is limited to its shard instances. - -The shuffle sharding strategy can be enabled via `-store-gateway.sharding-strategy=shuffle-sharding` and requires the `-store-gateway.tenant-shard-size` flag (or their respective YAML config options) to be set to the default shard size, which is the default number of store-gateway instances each tenant should be sharded to. The shard size can then be overridden on a per-tenant basis setting the `store_gateway_tenant_shard_size` in the limits overrides. +Default value for `-store-gateway.tenant-shard-size` is 0, which means that tenant's blocks are sharded across all store-gateway instances. _Please check out the [shuffle sharding documentation](../guides/shuffle-sharding.md) for more information about how it works._ @@ -280,11 +275,6 @@ store_gateway: # Unregister from the ring upon clean shutdown. # CLI flag: -store-gateway.sharding-ring.unregister-on-shutdown [unregister_on_shutdown: | default = true] - - # The sharding strategy to use. Supported values are: default, - # shuffle-sharding. - # CLI flag: -store-gateway.sharding-strategy - [sharding_strategy: | default = "default"] ``` ### `blocks_storage_config` diff --git a/docs/sources/blocks-storage/store-gateway.template b/docs/sources/blocks-storage/store-gateway.template index 68b787f1ab4..e950213c9d4 100644 --- a/docs/sources/blocks-storage/store-gateway.template +++ b/docs/sources/blocks-storage/store-gateway.template @@ -50,16 +50,11 @@ This feature can be enabled via `-store-gateway.sharding-enabled=true` and requi ### Sharding strategies -The store-gateway supports two sharding strategies: +The store-gateway uses shuffle-sharding to spread the blocks of each tenant across a subset of store-gateway instances. The number of store-gateway instances loading blocks of a single tenant is limited and the blast radius of any issue that could be introduced by the tenant's workload is limited to its shard instances. -- `default` -- `shuffle-sharding` +The default number of store-gateway instances per tenant is configured using the `-store-gateway.tenant-shard-size` flag (or their respective YAML config options). The shard size can then be overridden on a per-tenant basis setting the `store_gateway_tenant_shard_size` in the limits overrides. -The **`default`** sharding strategy spreads the blocks of each tenant across all store-gateway instances. It's the easiest form of sharding supported, but doesn't provide any workload isolation between different tenants. - -The **`shuffle-sharding`** strategy spreads the blocks of a tenant across a subset of store-gateway instances. This way, the number of store-gateway instances loading blocks of a single tenant is limited and the blast radius of any issue that could be introduced by the tenant's workload is limited to its shard instances. - -The shuffle sharding strategy can be enabled via `-store-gateway.sharding-strategy=shuffle-sharding` and requires the `-store-gateway.tenant-shard-size` flag (or their respective YAML config options) to be set to the default shard size, which is the default number of store-gateway instances each tenant should be sharded to. The shard size can then be overridden on a per-tenant basis setting the `store_gateway_tenant_shard_size` in the limits overrides. +Default value for `-store-gateway.tenant-shard-size` is 0, which means that tenant's blocks are sharded across all store-gateway instances. _Please check out the [shuffle sharding documentation](../guides/shuffle-sharding.md) for more information about how it works._ diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 91eb11949b2..cc10ffca51f 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -2584,10 +2584,9 @@ The `limits_config` configures default and per-tenant limits imposed by services # CLI flag: -ruler.max-rule-groups-per-tenant [ruler_max_rule_groups_per_tenant: | default = 70] -# The tenant's shard size when the shuffle-sharding strategy is used. Must be -# set when the store-gateway sharding is enabled with the shuffle-sharding -# strategy. When this setting is specified in the per-tenant overrides, a value -# of 0 disables shuffle sharding for the tenant. +# The tenant's shard size, used when store-gateway sharding is enabled. Value of +# 0 disables shuffle sharding for the tenant, that is all tenant blocks are +# sharded across all store-gateway replicas. # CLI flag: -store-gateway.tenant-shard-size [store_gateway_tenant_shard_size: | default = 0] @@ -3485,10 +3484,6 @@ sharding_ring: # Unregister from the ring upon clean shutdown. # CLI flag: -store-gateway.sharding-ring.unregister-on-shutdown [unregister_on_shutdown: | default = true] - -# The sharding strategy to use. Supported values are: default, shuffle-sharding. -# CLI flag: -store-gateway.sharding-strategy -[sharding_strategy: | default = "default"] ``` ### `s3_sse_config` diff --git a/docs/sources/guides/shuffle-sharding.md b/docs/sources/guides/shuffle-sharding.md index 207698a0a05..156fd73ae0e 100644 --- a/docs/sources/guides/shuffle-sharding.md +++ b/docs/sources/guides/shuffle-sharding.md @@ -138,9 +138,7 @@ To mitigate it, Cortex allows to configure a delay between when a querier discon ### Store-gateway shuffle sharding -The Cortex store-gateway -- used by the [blocks storage](../blocks-storage/_index.md) -- by default spreads each tenant's blocks across all running store-gateways. - -When shuffle sharding is **enabled** via `-store-gateway.sharding-strategy=shuffle-sharding` (or its respective YAML config option), each tenant blocks will be sharded across a subset of `-store-gateway.tenant-shard-size` store-gateway instances. This configuration needs to be set to **store-gateway**, **querier** and **ruler**. +The Mimir store-gateway -- used by the [blocks storage](../blocks-storage/_index.md) -- spreads each tenant's blocks across `-store-gateway.tenant-shard-size` running store-gateway instances. If this flag is 0, it means all store-gateway instances. This flag needs to be set to **store-gateway**, **querier** and **ruler**. _The shard size can be overridden on a per-tenant basis setting `store_gateway_tenant_shard_size` in the limits overrides configuration._ diff --git a/integration/querier_test.go b/integration/querier_test.go index 2fb742213ff..6c5d4bc4280 100644 --- a/integration/querier_test.go +++ b/integration/querier_test.go @@ -30,42 +30,37 @@ import ( func TestQuerierWithBlocksStorageRunningInMicroservicesMode(t *testing.T) { tests := map[string]struct { - blocksShardingStrategy string // Empty means sharding is disabled. - tenantShardSize int - indexCacheBackend string - bucketIndexEnabled bool - queryShardingEnabled bool + tenantShardSize int + indexCacheBackend string + bucketIndexEnabled bool + queryShardingEnabled bool }{ - "blocks default sharding, inmemory index cache": { - blocksShardingStrategy: "default", - indexCacheBackend: tsdb.IndexCacheBackendInMemory, + "shard size 0, inmemory index cache": { + tenantShardSize: 0, + indexCacheBackend: tsdb.IndexCacheBackendInMemory, }, - "blocks default sharding, memcached index cache": { - blocksShardingStrategy: "default", - indexCacheBackend: tsdb.IndexCacheBackendMemcached, + "shard size 0, memcached index cache": { + tenantShardSize: 0, + indexCacheBackend: tsdb.IndexCacheBackendMemcached, }, - "blocks shuffle sharding, memcached index cache": { - blocksShardingStrategy: "shuffle-sharding", - tenantShardSize: 1, - indexCacheBackend: tsdb.IndexCacheBackendMemcached, + "shard size 1, memcached index cache": { + tenantShardSize: 1, + indexCacheBackend: tsdb.IndexCacheBackendMemcached, }, - "blocks default sharding, inmemory index cache, bucket index enabled": { - blocksShardingStrategy: "default", - indexCacheBackend: tsdb.IndexCacheBackendInMemory, - bucketIndexEnabled: true, + "shard size 0, inmemory index cache, bucket index enabled": { + indexCacheBackend: tsdb.IndexCacheBackendInMemory, + bucketIndexEnabled: true, }, - "blocks shuffle sharding, memcached index cache, bucket index enabled": { - blocksShardingStrategy: "shuffle-sharding", - tenantShardSize: 1, - indexCacheBackend: tsdb.IndexCacheBackendMemcached, - bucketIndexEnabled: true, + "shard size 1, memcached index cache, bucket index enabled": { + tenantShardSize: 1, + indexCacheBackend: tsdb.IndexCacheBackendMemcached, + bucketIndexEnabled: true, }, - "blocks shuffle sharding, ingester gRPC streaming enabled, memcached index cache, bucket index enabled, query sharding enabled": { - blocksShardingStrategy: "shuffle-sharding", - tenantShardSize: 1, - indexCacheBackend: tsdb.IndexCacheBackendMemcached, - bucketIndexEnabled: true, - queryShardingEnabled: true, + "shard size 1, ingester gRPC streaming enabled, memcached index cache, bucket index enabled, query sharding enabled": { + tenantShardSize: 1, + indexCacheBackend: tsdb.IndexCacheBackendMemcached, + bucketIndexEnabled: true, + queryShardingEnabled: true, }, } @@ -154,8 +149,7 @@ func TestQuerierWithBlocksStorageRunningInMicroservicesMode(t *testing.T) { "-blocks-storage.bucket-store.sync-interval": "1s", "-blocks-storage.bucket-store.index-cache.backend": testCfg.indexCacheBackend, "-blocks-storage.bucket-store.bucket-index.enabled": strconv.FormatBool(testCfg.bucketIndexEnabled), - "-store-gateway.sharding-enabled": strconv.FormatBool(testCfg.blocksShardingStrategy != ""), - "-store-gateway.sharding-strategy": testCfg.blocksShardingStrategy, + "-store-gateway.sharding-enabled": strconv.FormatBool(true), "-store-gateway.tenant-shard-size": fmt.Sprintf("%d", testCfg.tenantShardSize), "-querier.query-store-for-labels-enabled": "true", "-frontend.query-stats-enabled": "true", @@ -178,11 +172,6 @@ func TestQuerierWithBlocksStorageRunningInMicroservicesMode(t *testing.T) { flags["-querier.frontend-address"] = queryFrontend.NetworkGRPCEndpoint() // Start the querier with configuring store-gateway addresses if sharding is disabled. - if testCfg.blocksShardingStrategy == "" { - flags = mergeFlags(flags, map[string]string{ - "-querier.store-gateway-addresses": strings.Join([]string{storeGateway1.NetworkGRPCEndpoint(), storeGateway2.NetworkGRPCEndpoint()}, ","), - }) - } querier := e2emimir.NewQuerier("querier", consul.NetworkHTTPEndpoint(), flags, "") t.Cleanup(func() { require.NoError(t, s.Stop(querier)) }) require.NoError(t, s.StartAndWaitReady(querier)) @@ -190,11 +179,7 @@ func TestQuerierWithBlocksStorageRunningInMicroservicesMode(t *testing.T) { // Wait until the querier has updated the ring. The querier will also watch // the store-gateway ring if blocks sharding is enabled. - if testCfg.blocksShardingStrategy != "" { - require.NoError(t, querier.WaitSumMetrics(e2e.Equals(float64(512+(512*storeGateways.NumInstances()))), "cortex_ring_tokens_total")) - } else { - require.NoError(t, querier.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total")) - } + require.NoError(t, querier.WaitSumMetrics(e2e.Equals(float64(512+(512*storeGateways.NumInstances()))), "cortex_ring_tokens_total")) if !testCfg.bucketIndexEnabled { // Wait until the querier has discovered the uploaded blocks. @@ -204,15 +189,11 @@ func TestQuerierWithBlocksStorageRunningInMicroservicesMode(t *testing.T) { // Wait until the store-gateway has synched the new uploaded blocks. When sharding is enabled // we don't known which store-gateway instance will synch the blocks, so we need to wait on // metrics extracted from all instances. - if testCfg.blocksShardingStrategy != "" { - require.NoError(t, storeGateways.WaitSumMetrics(e2e.Equals(2), "cortex_bucket_store_blocks_loaded")) - } else { - require.NoError(t, storeGateways.WaitSumMetrics(e2e.Equals(float64(2*storeGateways.NumInstances())), "cortex_bucket_store_blocks_loaded")) - } + require.NoError(t, storeGateways.WaitSumMetrics(e2e.Equals(2), "cortex_bucket_store_blocks_loaded")) // Check how many tenants have been discovered and synced by store-gateways. require.NoError(t, storeGateways.WaitSumMetrics(e2e.Equals(float64(1*storeGateways.NumInstances())), "cortex_bucket_stores_tenants_discovered")) - if testCfg.blocksShardingStrategy == "shuffle-sharding" { + if testCfg.tenantShardSize > 0 { require.NoError(t, storeGateways.WaitSumMetrics(e2e.Equals(float64(1)), "cortex_bucket_stores_tenants_synced")) } else { require.NoError(t, storeGateways.WaitSumMetrics(e2e.Equals(float64(1*storeGateways.NumInstances())), "cortex_bucket_stores_tenants_synced")) diff --git a/pkg/querier/blocks_store_queryable.go b/pkg/querier/blocks_store_queryable.go index 155d12fd199..bb1b804e0c2 100644 --- a/pkg/querier/blocks_store_queryable.go +++ b/pkg/querier/blocks_store_queryable.go @@ -247,7 +247,7 @@ func NewBlocksStoreQueryableFromConfig(querierCfg Config, gatewayCfg storegatewa return nil, errors.Wrap(err, "failed to create store-gateway ring client") } - stores, err = newBlocksStoreReplicationSet(storesRing, gatewayCfg.ShardingStrategy, randomLoadBalancing, limits, querierCfg.StoreGatewayClient, logger, reg) + stores, err = newBlocksStoreReplicationSet(storesRing, randomLoadBalancing, limits, querierCfg.StoreGatewayClient, logger, reg) if err != nil { return nil, errors.Wrap(err, "failed to create store set") } diff --git a/pkg/querier/blocks_store_replicated_set.go b/pkg/querier/blocks_store_replicated_set.go index 27d0c3cf64d..e78d754fe7d 100644 --- a/pkg/querier/blocks_store_replicated_set.go +++ b/pkg/querier/blocks_store_replicated_set.go @@ -37,7 +37,6 @@ type blocksStoreReplicationSet struct { storesRing *ring.Ring clientsPool *client.Pool - shardingStrategy string balancingStrategy loadBalancingStrategy limits BlocksStoreLimits @@ -48,7 +47,6 @@ type blocksStoreReplicationSet struct { func newBlocksStoreReplicationSet( storesRing *ring.Ring, - shardingStrategy string, balancingStrategy loadBalancingStrategy, limits BlocksStoreLimits, clientConfig ClientConfig, @@ -58,7 +56,6 @@ func newBlocksStoreReplicationSet( s := &blocksStoreReplicationSet{ storesRing: storesRing, clientsPool: newStoreGatewayClientPool(client.NewRingServiceDiscovery(storesRing), clientConfig, logger, reg), - shardingStrategy: shardingStrategy, balancingStrategy: balancingStrategy, limits: limits, } @@ -102,14 +99,7 @@ func (s *blocksStoreReplicationSet) stopping(_ error) error { func (s *blocksStoreReplicationSet) GetClientsFor(userID string, blockIDs []ulid.ULID, exclude map[ulid.ULID][]string) (map[BlocksStoreClient][]ulid.ULID, error) { shards := map[string][]ulid.ULID{} - // If shuffle sharding is enabled, we should build a subring for the user, - // otherwise we just use the full ring. - var userRing ring.ReadRing - if s.shardingStrategy == util.ShardingStrategyShuffle { - userRing = storegateway.GetShuffleShardingSubring(s.storesRing, userID, s.limits) - } else { - userRing = s.storesRing - } + userRing := storegateway.GetShuffleShardingSubring(s.storesRing, userID, s.limits) // Find the replication set of each block we need to query. for _, blockID := range blockIDs { diff --git a/pkg/querier/blocks_store_replicated_set_test.go b/pkg/querier/blocks_store_replicated_set_test.go index 185a43f1130..00c5e206747 100644 --- a/pkg/querier/blocks_store_replicated_set_test.go +++ b/pkg/querier/blocks_store_replicated_set_test.go @@ -25,7 +25,6 @@ import ( "github.com/stretchr/testify/require" mimir_tsdb "github.com/grafana/mimir/pkg/storage/tsdb" - "github.com/grafana/mimir/pkg/util" ) func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { @@ -45,7 +44,6 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { registeredAt := time.Now() tests := map[string]struct { - shardingStrategy string tenantShardSize int replicationFactor int setup func(*ring.Desc) @@ -54,11 +52,8 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { expectedClients map[string][]ulid.ULID expectedErr error }{ - // - // Sharding strategy: default - // - "default sharding, single instance in the ring with RF = 1": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, single instance in the ring with RF = 1": { + tenantShardSize: 0, replicationFactor: 1, setup: func(d *ring.Desc) { d.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) @@ -68,8 +63,8 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.1": {block1, block2}, }, }, - "default sharding, single instance in the ring with RF = 1 but excluded": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, single instance in the ring with RF = 1 but excluded": { + tenantShardSize: 0, replicationFactor: 1, setup: func(d *ring.Desc) { d.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) @@ -80,8 +75,8 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { }, expectedErr: fmt.Errorf("no store-gateway instance left after checking exclude for block %s", block1.String()), }, - "default sharding, single instance in the ring with RF = 1 but excluded for non queried block": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, single instance in the ring with RF = 1 but excluded for non queried block": { + tenantShardSize: 0, replicationFactor: 1, setup: func(d *ring.Desc) { d.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) @@ -94,8 +89,8 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.1": {block1, block2}, }, }, - "default sharding, single instance in the ring with RF = 2": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, single instance in the ring with RF = 2": { + tenantShardSize: 0, replicationFactor: 2, setup: func(d *ring.Desc) { d.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) @@ -105,8 +100,8 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.1": {block1, block2}, }, }, - "default sharding, multiple instances in the ring with each requested block belonging to a different store-gateway and RF = 1": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, multiple instances in the ring with each requested block belonging to a different store-gateway and RF = 1": { + tenantShardSize: 0, replicationFactor: 1, setup: func(d *ring.Desc) { d.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) @@ -121,8 +116,8 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.4": {block4}, }, }, - "default sharding, multiple instances in the ring with each requested block belonging to a different store-gateway and RF = 1 but excluded": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, multiple instances in the ring with each requested block belonging to a different store-gateway and RF = 1 but excluded": { + tenantShardSize: 0, replicationFactor: 1, setup: func(d *ring.Desc) { d.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) @@ -136,8 +131,8 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { }, expectedErr: fmt.Errorf("no store-gateway instance left after checking exclude for block %s", block3.String()), }, - "default sharding, multiple instances in the ring with each requested block belonging to a different store-gateway and RF = 2": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, multiple instances in the ring with each requested block belonging to a different store-gateway and RF = 2": { + tenantShardSize: 0, replicationFactor: 2, setup: func(d *ring.Desc) { d.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) @@ -152,8 +147,8 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.4": {block4}, }, }, - "default sharding, multiple instances in the ring with multiple requested blocks belonging to the same store-gateway and RF = 2": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, multiple instances in the ring with multiple requested blocks belonging to the same store-gateway and RF = 2": { + tenantShardSize: 0, replicationFactor: 2, setup: func(d *ring.Desc) { d.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) @@ -165,8 +160,8 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.2": {block2, block3}, }, }, - "default sharding, multiple instances in the ring with each requested block belonging to a different store-gateway and RF = 2 and some blocks excluded but with replacement available": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, multiple instances in the ring with each requested block belonging to a different store-gateway and RF = 2 and some blocks excluded but with replacement available": { + tenantShardSize: 0, replicationFactor: 2, setup: func(d *ring.Desc) { d.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) @@ -184,8 +179,8 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.4": {block3, block4}, }, }, - "default sharding, multiple instances in the ring are JOINING, the requested block + its replicas only belongs to JOINING instances": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, multiple instances in the ring are JOINING, the requested block + its replicas only belongs to JOINING instances": { + tenantShardSize: 0, replicationFactor: 2, setup: func(d *ring.Desc) { d.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.JOINING, registeredAt) @@ -198,11 +193,7 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.4": {block1}, }, }, - // - // Sharding strategy: shuffle sharding - // - "shuffle sharding, single instance in the ring with RF = 1, SS = 1": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 1, single instance in the ring with RF = 1": { tenantShardSize: 1, replicationFactor: 1, setup: func(d *ring.Desc) { @@ -213,8 +204,7 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.1": {block1, block2}, }, }, - "shuffle sharding, single instance in the ring with RF = 1, SS = 1 but excluded": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 1, single instance in the ring with RF = 1, but store-gateway excluded": { tenantShardSize: 1, replicationFactor: 1, setup: func(d *ring.Desc) { @@ -226,8 +216,7 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { }, expectedErr: fmt.Errorf("no store-gateway instance left after checking exclude for block %s", block1.String()), }, - "shuffle sharding, single instance in the ring with RF = 2, SS = 2": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 2, single instance in the ring with RF = 2": { tenantShardSize: 2, replicationFactor: 2, setup: func(d *ring.Desc) { @@ -238,8 +227,7 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.1": {block1, block2}, }, }, - "shuffle sharding, multiple instances in the ring with RF = 1, SS = 1": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 1, multiple instances in the ring with RF = 1": { tenantShardSize: 1, replicationFactor: 1, setup: func(d *ring.Desc) { @@ -253,8 +241,7 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.1": {block1, block2, block4}, }, }, - "shuffle sharding, multiple instances in the ring with RF = 1, SS = 2": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 2, shuffle sharding, multiple instances in the ring with RF = 1": { tenantShardSize: 2, replicationFactor: 1, setup: func(d *ring.Desc) { @@ -269,8 +256,7 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.3": {block2}, }, }, - "shuffle sharding, multiple instances in the ring with RF = 1, SS = 4": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 4, multiple instances in the ring with RF = 1": { tenantShardSize: 4, replicationFactor: 1, setup: func(d *ring.Desc) { @@ -286,8 +272,7 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.4": {block4}, }, }, - "shuffle sharding, multiple instances in the ring with RF = 2, SS = 2 with excluded blocks but some replacement available": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 2, multiple instances in the ring with RF = 2, with excluded blocks but some replacement available": { tenantShardSize: 2, replicationFactor: 2, setup: func(d *ring.Desc) { @@ -305,8 +290,7 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { "127.0.0.3": {block1, block2}, }, }, - "shuffle sharding, multiple instances in the ring with RF = 2, SS = 2 with excluded blocks and no replacement available": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 2, multiple instances in the ring with RF = 2, SS = 2 with excluded blocks and no replacement available": { tenantShardSize: 2, replicationFactor: 2, setup: func(d *ring.Desc) { @@ -354,7 +338,7 @@ func TestBlocksStoreReplicationSet_GetClientsFor(t *testing.T) { } reg := prometheus.NewPedanticRegistry() - s, err := newBlocksStoreReplicationSet(r, testData.shardingStrategy, noLoadBalancing, limits, ClientConfig{}, log.NewNopLogger(), reg) + s, err := newBlocksStoreReplicationSet(r, noLoadBalancing, limits, ClientConfig{}, log.NewNopLogger(), reg) require.NoError(t, err) require.NoError(t, services.StartAndAwaitRunning(ctx, s)) defer services.StopAndAwaitTerminated(ctx, s) //nolint:errcheck @@ -412,9 +396,9 @@ func TestBlocksStoreReplicationSet_GetClientsFor_ShouldSupportRandomLoadBalancin r, err := ring.NewWithStoreClientAndStrategy(ringCfg, "test", "test", ringStore, ring.NewIgnoreUnhealthyInstancesReplicationStrategy(), nil, log.NewNopLogger()) require.NoError(t, err) - limits := &blocksStoreLimitsMock{} + limits := &blocksStoreLimitsMock{storeGatewayTenantShardSize: 0} reg := prometheus.NewPedanticRegistry() - s, err := newBlocksStoreReplicationSet(r, util.ShardingStrategyDefault, randomLoadBalancing, limits, ClientConfig{}, log.NewNopLogger(), reg) + s, err := newBlocksStoreReplicationSet(r, randomLoadBalancing, limits, ClientConfig{}, log.NewNopLogger(), reg) require.NoError(t, err) require.NoError(t, services.StartAndAwaitRunning(ctx, s)) defer services.StopAndAwaitTerminated(ctx, s) //nolint:errcheck diff --git a/pkg/storegateway/gateway.go b/pkg/storegateway/gateway.go index 560f8892d07..294a3427837 100644 --- a/pkg/storegateway/gateway.go +++ b/pkg/storegateway/gateway.go @@ -9,7 +9,6 @@ import ( "context" "flag" "fmt" - "strings" "time" "github.com/go-kit/log" @@ -49,18 +48,14 @@ const ( ) var ( - supportedShardingStrategies = []string{util.ShardingStrategyDefault, util.ShardingStrategyShuffle} - // Validation errors. - errInvalidShardingStrategy = errors.New("invalid sharding strategy") - errInvalidTenantShardSize = errors.New("invalid tenant shard size, the value must be greater than 0") + errInvalidTenantShardSize = errors.New("invalid tenant shard size, the value must be greater or equal to 0") ) // Config holds the store gateway config. type Config struct { - ShardingEnabled bool `yaml:"sharding_enabled"` - ShardingRing RingConfig `yaml:"sharding_ring" doc:"description=The hash ring configuration. This option is required only if blocks sharding is enabled."` - ShardingStrategy string `yaml:"sharding_strategy"` + ShardingEnabled bool `yaml:"sharding_enabled"` + ShardingRing RingConfig `yaml:"sharding_ring" doc:"description=The hash ring configuration. This option is required only if blocks sharding is enabled."` } // RegisterFlags registers the Config flags. @@ -68,19 +63,12 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { cfg.ShardingRing.RegisterFlags(f) f.BoolVar(&cfg.ShardingEnabled, "store-gateway.sharding-enabled", false, "Shard blocks across multiple store gateway instances."+sharedOptionWithQuerier) - f.StringVar(&cfg.ShardingStrategy, "store-gateway.sharding-strategy", util.ShardingStrategyDefault, fmt.Sprintf("The sharding strategy to use. Supported values are: %s.", strings.Join(supportedShardingStrategies, ", "))) } // Validate the Config. func (cfg *Config) Validate(limits validation.Limits) error { - if cfg.ShardingEnabled { - if !util.StringsContain(supportedShardingStrategies, cfg.ShardingStrategy) { - return errInvalidShardingStrategy - } - - if cfg.ShardingStrategy == util.ShardingStrategyShuffle && limits.StoreGatewayTenantShardSize <= 0 { - return errInvalidTenantShardSize - } + if cfg.ShardingEnabled && limits.StoreGatewayTenantShardSize < 0 { + return errInvalidTenantShardSize } return nil @@ -178,15 +166,7 @@ func newStoreGateway(gatewayCfg Config, storageCfg mimir_tsdb.BlocksStorageConfi return nil, errors.Wrap(err, "create ring client") } - // Instance the right strategy. - switch gatewayCfg.ShardingStrategy { - case util.ShardingStrategyDefault: - shardingStrategy = NewDefaultShardingStrategy(g.ring, lifecyclerCfg.Addr, logger) - case util.ShardingStrategyShuffle: - shardingStrategy = NewShuffleShardingStrategy(g.ring, lifecyclerCfg.ID, lifecyclerCfg.Addr, limits, logger) - default: - return nil, errInvalidShardingStrategy - } + shardingStrategy = NewShuffleShardingStrategy(g.ring, lifecyclerCfg.ID, lifecyclerCfg.Addr, limits, logger) } else { shardingStrategy = NewNoShardingStrategy() } diff --git a/pkg/storegateway/gateway_test.go b/pkg/storegateway/gateway_test.go index 65f4afe86a9..9b5b2ee38e4 100644 --- a/pkg/storegateway/gateway_test.go +++ b/pkg/storegateway/gateway_test.go @@ -65,24 +65,16 @@ func TestConfig_Validate(t *testing.T) { setup: func(cfg *Config, limits *validation.Limits) {}, expected: nil, }, - "should fail if the sharding strategy is invalid": { + "should fail if shard size is negative": { setup: func(cfg *Config, limits *validation.Limits) { cfg.ShardingEnabled = true - cfg.ShardingStrategy = "xxx" - }, - expected: errInvalidShardingStrategy, - }, - "should fail if the sharding strategy is shuffle-sharding and shard size has not been set": { - setup: func(cfg *Config, limits *validation.Limits) { - cfg.ShardingEnabled = true - cfg.ShardingStrategy = util.ShardingStrategyShuffle + limits.StoreGatewayTenantShardSize = -3 }, expected: errInvalidTenantShardSize, }, - "should pass if the sharding strategy is shuffle-sharding and shard size has been set": { + "should pass if shard size has been set": { setup: func(cfg *Config, limits *validation.Limits) { cfg.ShardingEnabled = true - cfg.ShardingStrategy = util.ShardingStrategyShuffle limits.StoreGatewayTenantShardSize = 3 }, expected: nil, @@ -272,52 +264,48 @@ func TestStoreGateway_InitialSyncWithWaitRingTokensStability(t *testing.T) { } tests := map[string]struct { - shardingStrategy string - tenantShardSize int // Used only when the sharding strategy is shuffle-sharding. + tenantShardSize int replicationFactor int numGateways int expectedBlocksLoaded int }{ - "default sharding strategy, 1 gateway, RF = 1": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, 1 gateway, RF = 1": { + tenantShardSize: 0, replicationFactor: 1, numGateways: 1, expectedBlocksLoaded: numBlocks, }, - "default sharding strategy, 2 gateways, RF = 1": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, 2 gateways, RF = 1": { + tenantShardSize: 0, replicationFactor: 1, numGateways: 2, expectedBlocksLoaded: numBlocks, // blocks are sharded across gateways }, - "default sharding strategy, 3 gateways, RF = 2": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, 3 gateways, RF = 2": { + tenantShardSize: 0, replicationFactor: 2, numGateways: 3, expectedBlocksLoaded: 2 * numBlocks, // blocks are replicated 2 times }, - "default sharding strategy, 5 gateways, RF = 3": { - shardingStrategy: util.ShardingStrategyDefault, + "shard size 0, 5 gateways, RF = 3": { + tenantShardSize: 0, replicationFactor: 3, numGateways: 5, expectedBlocksLoaded: 3 * numBlocks, // blocks are replicated 3 times }, - "shuffle sharding strategy, 1 gateway, RF = 1, SS = 1": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 1, 1 gateway, RF = 1": { tenantShardSize: 1, replicationFactor: 1, numGateways: 1, expectedBlocksLoaded: numBlocks, }, - "shuffle sharding strategy, 5 gateways, RF = 2, SS = 3": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 3, 5 gateways, RF = 2": { tenantShardSize: 3, replicationFactor: 2, numGateways: 5, expectedBlocksLoaded: 2 * numBlocks, // blocks are replicated 2 times }, - "shuffle sharding strategy, 20 gateways, RF = 3, SS = 3": { - shardingStrategy: util.ShardingStrategyShuffle, + "shard size 3, 20 gateways, RF = 3": { tenantShardSize: 3, replicationFactor: 3, numGateways: 20, @@ -365,7 +353,6 @@ func TestStoreGateway_InitialSyncWithWaitRingTokensStability(t *testing.T) { gatewayCfg.ShardingRing.WaitStabilityMinDuration = 4 * time.Second gatewayCfg.ShardingRing.WaitStabilityMaxDuration = 30 * time.Second gatewayCfg.ShardingEnabled = true - gatewayCfg.ShardingStrategy = testData.shardingStrategy limits.StoreGatewayTenantShardSize = testData.tenantShardSize overrides, err := validation.NewOverrides(limits, nil) @@ -397,7 +384,7 @@ func TestStoreGateway_InitialSyncWithWaitRingTokensStability(t *testing.T) { assert.Equal(t, float64(testData.expectedBlocksLoaded), metrics.GetSumOfGauges("cortex_bucket_store_blocks_loaded")) assert.Equal(t, float64(2*testData.numGateways), metrics.GetSumOfGauges("cortex_bucket_stores_tenants_discovered")) - if testData.shardingStrategy == util.ShardingStrategyShuffle { + if testData.tenantShardSize > 0 { assert.Equal(t, float64(testData.tenantShardSize*numBlocks), metrics.GetSumOfGauges("cortex_blocks_meta_synced")) assert.Equal(t, float64(testData.tenantShardSize*numUsers), metrics.GetSumOfGauges("cortex_bucket_stores_tenants_synced")) } else { @@ -418,7 +405,6 @@ func TestStoreGateway_BlocksSyncWithDefaultSharding_RingTopologyChangedAfterScal const ( numUsers = 2 numBlocks = numUsers * 12 - shardingStrategy = util.ShardingStrategyDefault replicationFactor = 3 numInitialGateways = 4 numScaleUpGateways = 6 @@ -468,7 +454,6 @@ func TestStoreGateway_BlocksSyncWithDefaultSharding_RingTopologyChangedAfterScal gatewayCfg.ShardingRing.WaitStabilityMinDuration = waitStabilityMin gatewayCfg.ShardingRing.WaitStabilityMaxDuration = 30 * time.Second gatewayCfg.ShardingEnabled = true - gatewayCfg.ShardingStrategy = shardingStrategy overrides, err := validation.NewOverrides(limits, nil) require.NoError(t, err) diff --git a/pkg/storegateway/sharding_strategy.go b/pkg/storegateway/sharding_strategy.go index fe4b784e962..234a8941b61 100644 --- a/pkg/storegateway/sharding_strategy.go +++ b/pkg/storegateway/sharding_strategy.go @@ -56,34 +56,6 @@ func (s *NoShardingStrategy) FilterBlocks(_ context.Context, _ string, _ map[uli return nil } -// DefaultShardingStrategy is a sharding strategy based on the hash ring formed by store-gateways. -// Not go-routine safe. -type DefaultShardingStrategy struct { - r *ring.Ring - instanceAddr string - logger log.Logger -} - -// NewDefaultShardingStrategy creates DefaultShardingStrategy. -func NewDefaultShardingStrategy(r *ring.Ring, instanceAddr string, logger log.Logger) *DefaultShardingStrategy { - return &DefaultShardingStrategy{ - r: r, - instanceAddr: instanceAddr, - logger: logger, - } -} - -// FilterUsers implements ShardingStrategy. -func (s *DefaultShardingStrategy) FilterUsers(_ context.Context, userIDs []string) []string { - return userIDs -} - -// FilterBlocks implements ShardingStrategy. -func (s *DefaultShardingStrategy) FilterBlocks(_ context.Context, _ string, metas map[ulid.ULID]*metadata.Meta, loaded map[ulid.ULID]struct{}, synced *extprom.TxGaugeVec) error { - filterBlocksByRingSharding(s.r, s.instanceAddr, metas, loaded, synced, s.logger) - return nil -} - // ShuffleShardingStrategy is a shuffle sharding strategy, based on the hash ring formed by store-gateways, // where each tenant blocks are sharded across a subset of store-gateway instances. type ShuffleShardingStrategy struct { diff --git a/pkg/storegateway/sharding_strategy_test.go b/pkg/storegateway/sharding_strategy_test.go index 4a6ce0e4a47..702dd113389 100644 --- a/pkg/storegateway/sharding_strategy_test.go +++ b/pkg/storegateway/sharding_strategy_test.go @@ -25,282 +25,6 @@ import ( mimir_tsdb "github.com/grafana/mimir/pkg/storage/tsdb" ) -func TestDefaultShardingStrategy(t *testing.T) { - // The following block IDs have been picked to have increasing hash values - // in order to simplify the tests. - block1 := ulid.MustNew(1, nil) // hash: 283204220 - block2 := ulid.MustNew(2, nil) // hash: 444110359 - block3 := ulid.MustNew(5, nil) // hash: 2931974232 - block4 := ulid.MustNew(6, nil) // hash: 3092880371 - numAllBlocks := 4 - - block1Hash := mimir_tsdb.HashBlockID(block1) - block2Hash := mimir_tsdb.HashBlockID(block2) - block3Hash := mimir_tsdb.HashBlockID(block3) - block4Hash := mimir_tsdb.HashBlockID(block4) - - registeredAt := time.Now() - - tests := map[string]struct { - replicationFactor int - zoneAwarenessEnabled bool - setupRing func(*ring.Desc) - expectedBlocks map[string][]ulid.ULID - }{ - "one ACTIVE instance in the ring with replication factor = 1": { - replicationFactor: 1, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{0}, ring.ACTIVE, registeredAt) - }, - expectedBlocks: map[string][]ulid.ULID{ - "127.0.0.1": {block1, block2, block3, block4}, - "127.0.0.2": {}, - }, - }, - "two ACTIVE instances in the ring with replication factor = 1": { - replicationFactor: 1, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1, block3Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-2", "127.0.0.2", "", []uint32{block2Hash + 1, block4Hash + 1}, ring.ACTIVE, registeredAt) - }, - expectedBlocks: map[string][]ulid.ULID{ - "127.0.0.1": {block1, block3}, - "127.0.0.2": {block2, block4}, - }, - }, - "one ACTIVE instance in the ring with replication factor = 2": { - replicationFactor: 2, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{0}, ring.ACTIVE, registeredAt) - }, - expectedBlocks: map[string][]ulid.ULID{ - "127.0.0.1": {block1, block2, block3, block4}, - "127.0.0.2": {}, - }, - }, - "two ACTIVE instances in the ring with replication factor = 2": { - replicationFactor: 2, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1, block3Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-2", "127.0.0.2", "", []uint32{block2Hash + 1, block4Hash + 1}, ring.ACTIVE, registeredAt) - }, - expectedBlocks: map[string][]ulid.ULID{ - "127.0.0.1": {block1, block2, block3, block4}, - "127.0.0.2": {block1, block2, block3, block4}, - }, - }, - "multiple ACTIVE instances in the ring with replication factor = 2": { - replicationFactor: 2, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1, block3Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-2", "127.0.0.2", "", []uint32{block2Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-3", "127.0.0.3", "", []uint32{block4Hash + 1}, ring.ACTIVE, registeredAt) - }, - expectedBlocks: map[string][]ulid.ULID{ - "127.0.0.1": {block1, block3 /* replicated: */, block2, block4}, - "127.0.0.2": {block2 /* replicated: */, block1}, - "127.0.0.3": {block4 /* replicated: */, block3}, - }, - }, - "multiple ACTIVE instances in the ring with replication factor = 2 and zone-awareness enabled": { - replicationFactor: 2, - zoneAwarenessEnabled: true, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "zone-a", []uint32{block1Hash + 1, block3Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-2", "127.0.0.2", "zone-a", []uint32{block2Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-3", "127.0.0.3", "zone-b", []uint32{block4Hash + 1}, ring.ACTIVE, registeredAt) - }, - expectedBlocks: map[string][]ulid.ULID{ - "127.0.0.1": {block1, block3, block4}, - "127.0.0.2": {block2}, - "127.0.0.3": {block1, block2, block3, block4}, - }, - }, - "one unhealthy instance in the ring with replication factor = 1": { - replicationFactor: 1, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1, block3Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-2", "127.0.0.2", "", []uint32{block2Hash + 1}, ring.ACTIVE, registeredAt) - - r.Ingesters["instance-3"] = ring.InstanceDesc{ - Addr: "127.0.0.3", - Timestamp: time.Now().Add(-time.Hour).Unix(), - State: ring.ACTIVE, - Tokens: []uint32{block4Hash + 1}, - } - }, - expectedBlocks: map[string][]ulid.ULID{ - // No shard has the blocks of the unhealthy instance. - "127.0.0.1": {block1, block3}, - "127.0.0.2": {block2}, - "127.0.0.3": {}, - }, - }, - "one unhealthy instance in the ring with replication factor = 2": { - replicationFactor: 2, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1, block3Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-2", "127.0.0.2", "", []uint32{block2Hash + 1}, ring.ACTIVE, registeredAt) - - r.Ingesters["instance-3"] = ring.InstanceDesc{ - Addr: "127.0.0.3", - Timestamp: time.Now().Add(-time.Hour).Unix(), - State: ring.ACTIVE, - Tokens: []uint32{block4Hash + 1}, - } - }, - expectedBlocks: map[string][]ulid.ULID{ - "127.0.0.1": {block1, block3 /* replicated: */, block2, block4}, - "127.0.0.2": {block2 /* replicated: */, block1}, - "127.0.0.3": {}, - }, - }, - "two unhealthy instances in the ring with replication factor = 2": { - replicationFactor: 2, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) - - r.Ingesters["instance-2"] = ring.InstanceDesc{ - Addr: "127.0.0.2", - Timestamp: time.Now().Add(-time.Hour).Unix(), - State: ring.ACTIVE, - Tokens: []uint32{block2Hash + 1, block3Hash + 1}, - } - - r.Ingesters["instance-3"] = ring.InstanceDesc{ - Addr: "127.0.0.3", - Timestamp: time.Now().Add(-time.Hour).Unix(), - State: ring.ACTIVE, - Tokens: []uint32{block4Hash + 1}, - } - }, - expectedBlocks: map[string][]ulid.ULID{ - // There may be some blocks missing depending if there are shared blocks - // between the two unhealthy nodes. - "127.0.0.1": {block1 /* replicated: */, block4}, - "127.0.0.2": {}, - "127.0.0.3": {}, - }, - }, - "two unhealthy instances in the ring with replication factor = 3": { - replicationFactor: 3, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-2", "127.0.0.2", "", []uint32{block2Hash + 1}, ring.ACTIVE, registeredAt) - - r.Ingesters["instance-3"] = ring.InstanceDesc{ - Addr: "127.0.0.3", - Timestamp: time.Now().Add(-time.Hour).Unix(), - State: ring.ACTIVE, - Tokens: []uint32{block3Hash + 1}, - } - - r.Ingesters["instance-4"] = ring.InstanceDesc{ - Addr: "127.0.0.4", - Timestamp: time.Now().Add(-time.Hour).Unix(), - State: ring.ACTIVE, - Tokens: []uint32{block4Hash + 1}, - } - }, - expectedBlocks: map[string][]ulid.ULID{ - // There may be some blocks missing depending if there are shared blocks - // between the two unhealthy nodes. - "127.0.0.1": {block1 /* replicated: */, block3, block4}, - "127.0.0.2": {block2 /* replicated: */, block1, block4}, - "127.0.0.3": {}, - "127.0.0.4": {}, - }, - }, - "LEAVING instance in the ring should continue to keep its shard blocks and they should NOT be replicated to another instance": { - replicationFactor: 1, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1, block3Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-2", "127.0.0.2", "", []uint32{block2Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-3", "127.0.0.3", "", []uint32{block4Hash + 1}, ring.LEAVING, registeredAt) - }, - expectedBlocks: map[string][]ulid.ULID{ - "127.0.0.1": {block1, block3}, - "127.0.0.2": {block2}, - "127.0.0.3": {block4}, - }, - }, - "JOINING instance in the ring should get its shard blocks and they should not be replicated to another instance": { - replicationFactor: 1, - setupRing: func(r *ring.Desc) { - r.AddIngester("instance-1", "127.0.0.1", "", []uint32{block1Hash + 1, block3Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-2", "127.0.0.2", "", []uint32{block2Hash + 1}, ring.ACTIVE, registeredAt) - r.AddIngester("instance-3", "127.0.0.3", "", []uint32{block4Hash + 1}, ring.JOINING, registeredAt) - }, - expectedBlocks: map[string][]ulid.ULID{ - "127.0.0.1": {block1, block3}, - "127.0.0.2": {block2}, - "127.0.0.3": {block4}, - }, - }, - } - - for testName, testData := range tests { - testName := testName - testData := testData - - t.Run(testName, func(t *testing.T) { - t.Parallel() - - ctx := context.Background() - store, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) - t.Cleanup(func() { assert.NoError(t, closer.Close()) }) - - // Initialize the ring state. - require.NoError(t, store.CAS(ctx, "test", func(in interface{}) (interface{}, bool, error) { - d := ring.NewDesc() - testData.setupRing(d) - return d, true, nil - })) - - cfg := ring.Config{ - ReplicationFactor: testData.replicationFactor, - HeartbeatTimeout: time.Minute, - ZoneAwarenessEnabled: testData.zoneAwarenessEnabled, - } - - r, err := ring.NewWithStoreClientAndStrategy(cfg, "test", "test", store, ring.NewIgnoreUnhealthyInstancesReplicationStrategy(), nil, log.NewNopLogger()) - require.NoError(t, err) - require.NoError(t, services.StartAndAwaitRunning(ctx, r)) - defer services.StopAndAwaitTerminated(ctx, r) //nolint:errcheck - - // Wait until the ring client has synced. - require.NoError(t, ring.WaitInstanceState(ctx, r, "instance-1", ring.ACTIVE)) - - for instanceAddr, expectedBlocks := range testData.expectedBlocks { - filter := NewDefaultShardingStrategy(r, instanceAddr, log.NewNopLogger()) - synced := extprom.NewTxGaugeVec(nil, prometheus.GaugeOpts{}, []string{"state"}) - synced.WithLabelValues(shardExcludedMeta).Set(0) - - metas := map[ulid.ULID]*metadata.Meta{ - block1: {}, - block2: {}, - block3: {}, - block4: {}, - } - - err = filter.FilterBlocks(ctx, "user-1", metas, map[ulid.ULID]struct{}{}, synced) - require.NoError(t, err) - - var actualBlocks []ulid.ULID - for id := range metas { - actualBlocks = append(actualBlocks, id) - } - - assert.ElementsMatch(t, expectedBlocks, actualBlocks) - - // Assert on the metric used to keep track of the blocks filtered out. - synced.Submit() - assert.Equal(t, float64(numAllBlocks-len(testData.expectedBlocks[instanceAddr])), testutil.ToFloat64(synced)) - } - }) - } -} - func TestShuffleShardingStrategy(t *testing.T) { // The following block IDs have been picked to have increasing hash values // in order to simplify the tests. diff --git a/pkg/util/validation/limits.go b/pkg/util/validation/limits.go index 0e555ba7623..f9b31c0c52b 100644 --- a/pkg/util/validation/limits.go +++ b/pkg/util/validation/limits.go @@ -165,7 +165,7 @@ func (l *Limits) RegisterFlags(f *flag.FlagSet) { f.IntVar(&l.CompactorTenantShardSize, "compactor.compactor-tenant-shard-size", 0, "Max number of compactors that can compact blocks for single tenant. 0 to disable the limit and use all compactors.") // Store-gateway. - f.IntVar(&l.StoreGatewayTenantShardSize, "store-gateway.tenant-shard-size", 0, "The tenant's shard size when the shuffle-sharding strategy is used. Must be set when the store-gateway sharding is enabled with the shuffle-sharding strategy. When this setting is specified in the per-tenant overrides, a value of 0 disables shuffle sharding for the tenant.") + f.IntVar(&l.StoreGatewayTenantShardSize, "store-gateway.tenant-shard-size", 0, "The tenant's shard size, used when store-gateway sharding is enabled. Value of 0 disables shuffle sharding for the tenant, that is all tenant blocks are sharded across all store-gateway replicas.") // Alertmanager. f.Var(&l.AlertmanagerReceiversBlockCIDRNetworks, "alertmanager.receivers-firewall-block-cidr-networks", "Comma-separated list of network CIDRs to block in Alertmanager receiver integrations.") From 5c244288ed99522d47e7c0128cd6ef06ea977072 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Wed, 26 Jan 2022 10:54:38 +0100 Subject: [PATCH 003/168] Fix TestBlocksCleaner_ShouldRemoveBlocksOutsideRetentionPeriod flakyness (#894) Signed-off-by: Marco Pracucci --- pkg/compactor/blocks_cleaner.go | 19 +++++++----- pkg/compactor/blocks_cleaner_test.go | 44 ++++++++++++++++------------ pkg/compactor/compactor.go | 9 +++--- 3 files changed, 41 insertions(+), 31 deletions(-) diff --git a/pkg/compactor/blocks_cleaner.go b/pkg/compactor/blocks_cleaner.go index 77280439c02..d0d7ddeb68b 100644 --- a/pkg/compactor/blocks_cleaner.go +++ b/pkg/compactor/blocks_cleaner.go @@ -30,11 +30,16 @@ import ( util_log "github.com/grafana/mimir/pkg/util/log" ) +const ( + defaultDeleteBlocksConcurrency = 16 +) + type BlocksCleanerConfig struct { - DeletionDelay time.Duration - CleanupInterval time.Duration - CleanupConcurrency int - TenantCleanupDelay time.Duration // Delay before removing tenant deletion mark and "debug". + DeletionDelay time.Duration + CleanupInterval time.Duration + CleanupConcurrency int + TenantCleanupDelay time.Duration // Delay before removing tenant deletion mark and "debug". + DeleteBlocksConcurrency int } type BlocksCleaner struct { @@ -360,8 +365,6 @@ func (c *BlocksCleaner) cleanUser(ctx context.Context, userID string) (returnErr return nil } -const deleteBlocksConcurrency = 16 - // Concurrently deletes blocks marked for deletion, and removes blocks from index. func (c *BlocksCleaner) deleteBlocksMarkedForDeletion(ctx context.Context, idx *bucketindex.Index, userBucket objstore.Bucket, userLogger log.Logger) { blocksToDelete := make([]ulid.ULID, 0, len(idx.BlockDeletionMarks)) @@ -377,7 +380,7 @@ func (c *BlocksCleaner) deleteBlocksMarkedForDeletion(ctx context.Context, idx * var mu sync.Mutex // We don't want to return errors from our function, as that would stop ForEach loop early. - _ = concurrency.ForEachJob(ctx, len(blocksToDelete), deleteBlocksConcurrency, func(ctx context.Context, jobIdx int) error { + _ = concurrency.ForEachJob(ctx, len(blocksToDelete), c.cfg.DeleteBlocksConcurrency, func(ctx context.Context, jobIdx int) error { blockID := blocksToDelete[jobIdx] if err := block.Delete(ctx, userLogger, userBucket, blockID); err != nil { @@ -415,7 +418,7 @@ func (c *BlocksCleaner) cleanUserPartialBlocks(ctx context.Context, partials map var mu sync.Mutex // We don't want to return errors from our function, as that would stop ForEach loop early. - _ = concurrency.ForEachJob(ctx, len(blocks), deleteBlocksConcurrency, func(ctx context.Context, jobIdx int) error { + _ = concurrency.ForEachJob(ctx, len(blocks), c.cfg.DeleteBlocksConcurrency, func(ctx context.Context, jobIdx int) error { blockID := blocks[jobIdx] // We can safely delete only partial blocks with a deletion mark. diff --git a/pkg/compactor/blocks_cleaner_test.go b/pkg/compactor/blocks_cleaner_test.go index b7b6e01920b..3cb0d0c344b 100644 --- a/pkg/compactor/blocks_cleaner_test.go +++ b/pkg/compactor/blocks_cleaner_test.go @@ -96,10 +96,11 @@ func testBlocksCleanerWithOptions(t *testing.T, options testBlocksCleanerOptions require.NoError(t, bucketClient.Upload(context.Background(), user4DebugMetaFile, strings.NewReader("some random content here"))) cfg := BlocksCleanerConfig{ - DeletionDelay: deletionDelay, - CleanupInterval: time.Minute, - CleanupConcurrency: options.concurrency, - TenantCleanupDelay: options.tenantDeletionDelay, + DeletionDelay: deletionDelay, + CleanupInterval: time.Minute, + CleanupConcurrency: options.concurrency, + TenantCleanupDelay: options.tenantDeletionDelay, + DeleteBlocksConcurrency: 1, } reg := prometheus.NewPedanticRegistry() @@ -231,9 +232,10 @@ func TestBlocksCleaner_ShouldContinueOnBlockDeletionFailure(t *testing.T) { } cfg := BlocksCleanerConfig{ - DeletionDelay: deletionDelay, - CleanupInterval: time.Minute, - CleanupConcurrency: 1, + DeletionDelay: deletionDelay, + CleanupInterval: time.Minute, + CleanupConcurrency: 1, + DeleteBlocksConcurrency: 1, } logger := log.NewNopLogger() @@ -290,9 +292,10 @@ func TestBlocksCleaner_ShouldRebuildBucketIndexOnCorruptedOne(t *testing.T) { require.NoError(t, bucketClient.Upload(ctx, path.Join(userID, bucketindex.IndexCompressedFilename), strings.NewReader("invalid!}"))) cfg := BlocksCleanerConfig{ - DeletionDelay: deletionDelay, - CleanupInterval: time.Minute, - CleanupConcurrency: 1, + DeletionDelay: deletionDelay, + CleanupInterval: time.Minute, + CleanupConcurrency: 1, + DeleteBlocksConcurrency: 1, } logger := log.NewNopLogger() @@ -338,9 +341,10 @@ func TestBlocksCleaner_ShouldRemoveMetricsForTenantsNotBelongingAnymoreToTheShar createTSDBBlock(t, bucketClient, "user-2", 30, 40, 2, nil) cfg := BlocksCleanerConfig{ - DeletionDelay: time.Hour, - CleanupInterval: time.Minute, - CleanupConcurrency: 1, + DeletionDelay: time.Hour, + CleanupInterval: time.Minute, + CleanupConcurrency: 1, + DeleteBlocksConcurrency: 1, } ctx := context.Background() @@ -405,9 +409,10 @@ func TestBlocksCleaner_ShouldNotCleanupUserThatDoesntBelongToShardAnymore(t *tes createTSDBBlock(t, bucketClient, "user-2", 20, 30, 2, nil) cfg := BlocksCleanerConfig{ - DeletionDelay: time.Hour, - CleanupInterval: time.Minute, - CleanupConcurrency: 1, + DeletionDelay: time.Hour, + CleanupInterval: time.Minute, + CleanupConcurrency: 1, + DeleteBlocksConcurrency: 1, } ctx := context.Background() @@ -518,9 +523,10 @@ func TestBlocksCleaner_ShouldRemoveBlocksOutsideRetentionPeriod(t *testing.T) { block4 := createTSDBBlock(t, bucketClient, "user-2", ts(-8), ts(-6), 2, nil) cfg := BlocksCleanerConfig{ - DeletionDelay: time.Hour, - CleanupInterval: time.Minute, - CleanupConcurrency: 1, + DeletionDelay: time.Hour, + CleanupInterval: time.Minute, + CleanupConcurrency: 1, + DeleteBlocksConcurrency: 1, } ctx := context.Background() diff --git a/pkg/compactor/compactor.go b/pkg/compactor/compactor.go index 7ba96495326..d4453107015 100644 --- a/pkg/compactor/compactor.go +++ b/pkg/compactor/compactor.go @@ -454,10 +454,11 @@ func (c *MultitenantCompactor) starting(ctx context.Context) error { // Create the blocks cleaner (service). c.blocksCleaner = NewBlocksCleaner(BlocksCleanerConfig{ - DeletionDelay: c.compactorCfg.DeletionDelay, - CleanupInterval: util.DurationWithJitter(c.compactorCfg.CleanupInterval, 0.1), - CleanupConcurrency: c.compactorCfg.CleanupConcurrency, - TenantCleanupDelay: c.compactorCfg.TenantCleanupDelay, + DeletionDelay: c.compactorCfg.DeletionDelay, + CleanupInterval: util.DurationWithJitter(c.compactorCfg.CleanupInterval, 0.1), + CleanupConcurrency: c.compactorCfg.CleanupConcurrency, + TenantCleanupDelay: c.compactorCfg.TenantCleanupDelay, + DeleteBlocksConcurrency: defaultDeleteBlocksConcurrency, }, c.bucketClient, c.shardingStrategy.blocksCleanerOwnUser, c.cfgProvider, c.parentLogger, c.registerer) // Start blocks cleaner asynchronously, don't wait until initial cleanup is finished. From d290d3acb5578e2107956182be4a731ac70deb69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Wed, 26 Jan 2022 11:13:10 +0100 Subject: [PATCH 004/168] Remove -ruler.sharding-strategy from ruler. (#889) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove -ruler.sharding-strategy from ruler. Signed-off-by: Peter Štibraný --- CHANGELOG.md | 4 +- .../configuration/config-file-reference.md | 10 ++-- docs/sources/guides/shuffle-sharding.md | 5 +- pkg/ruler/ruler.go | 52 ++++--------------- pkg/ruler/ruler_test.go | 43 ++++++--------- pkg/util/validation/limits.go | 2 +- 6 files changed, 33 insertions(+), 83 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb4610458a0..e1a3c5bc0ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -214,7 +214,9 @@ * `-query-frontend.cache-unaligned-requests` renamed to `-frontend.cache-unaligned-requests` * [CHANGE] Ruler: set new default limits for rule groups: `ruler.max_rules_per_rule_group` to 20 (previously 0, disabled) and `ruler.max_rule_groups_per_tenant` to 70 (previously 0, disabled). #847 * [CHANGE] Compactor is now included in `all` target (single-binary). #866 -* [CHANGE] Shuffle-sharding: `-store-gateway.sharding-strategy` option has been removed store-gateways. Store-gateway now uses shuffle-sharding by default, but respects `store_gateway_tenant_shard_size` for tenant, and this value defaults to 0. #891 +* [CHANGE] Shuffle-sharding: + * `-store-gateway.sharding-strategy` option has been removed store-gateways. Store-gateway now uses shuffle-sharding by default, but respects `store_gateway_tenant_shard_size` for tenant, and this value defaults to 0. #891 + * `-ruler.sharding-strategy` option has been removed from ruler. Ruler now uses shuffle-sharding by default, but respects `ruler_tenant_shard_size`, which defaults to 0 (ie. use all rulers for tenant). #889 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index cc10ffca51f..25381d76258 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -1223,10 +1223,6 @@ alertmanager_client: # CLI flag: -ruler.enable-sharding [enable_sharding: | default = false] -# The sharding strategy to use. Supported values are: default, shuffle-sharding. -# CLI flag: -ruler.sharding-strategy -[sharding_strategy: | default = "default"] - # Time to spend searching for a pending ruler when shutting down. # CLI flag: -ruler.search-pending-for [search_pending_for: | default = 5m] @@ -2570,9 +2566,9 @@ The `limits_config` configures default and per-tenant limits imposed by services # CLI flag: -ruler.evaluation-delay-duration [ruler_evaluation_delay_duration: | default = 0s] -# The tenant's shard size when the shuffle-sharding strategy is used by ruler. -# When this setting is specified in the per-tenant overrides, a value of 0 -# disables shuffle sharding for the tenant. +# The tenant's shard size when sharding is used by ruler. Value of 0 disables +# shuffle sharding for the tenant, and tenant rules will be sharded across all +# ruler replicas. # CLI flag: -ruler.tenant-shard-size [ruler_tenant_shard_size: | default = 0] diff --git a/docs/sources/guides/shuffle-sharding.md b/docs/sources/guides/shuffle-sharding.md index 156fd73ae0e..6e2eafd3c1d 100644 --- a/docs/sources/guides/shuffle-sharding.md +++ b/docs/sources/guides/shuffle-sharding.md @@ -146,11 +146,10 @@ _Please check out the [store-gateway documentation](../blocks-storage/store-gate ### Ruler shuffle sharding -Cortex ruler can run in three modes: +Mimir ruler can run in two modes: 1. **No sharding at all.** This is the most basic mode of the ruler. It is activated by using `-ruler.enable-sharding=false` (default) and works correctly only if single ruler is running. In this mode the Ruler loads all rules for all tenants. -2. **Default sharding**, activated by using `-ruler.enable-sharding=true` and `-ruler.sharding-strategy=default` (default). In this mode rulers register themselves into the ring. Each ruler will then select and evaluate only those rules that it "owns". -3. **Shuffle sharding**, activated by using `-ruler.enable-sharding=true` and `-ruler.sharding-strategy=shuffle-sharding`. Similarly to default sharding, rulers use the ring to distribute workload, but rule groups for each tenant can only be evaluated on limited number of rulers (`-ruler.tenant-shard-size`, can also be set per tenant as `ruler_tenant_shard_size` in overrides). +2. **Sharding**, activated by using `-ruler.enable-sharding=true`. In this mode rulers register themselves into the ring. Each ruler will then select and evaluate only those rules that it "owns". Rule groups for each tenant can only be evaluated on limited number of rulers (`-ruler.tenant-shard-size`, can also be set per tenant as `ruler_tenant_shard_size` in overrides). If shard size for tenant is set to 0, then tenant's rules are sharded across all ruler replicas. Note that when using sharding strategy, each rule group is evaluated by single ruler only, there is no replication. diff --git a/pkg/ruler/ruler.go b/pkg/ruler/ruler.go index 4a1afe18e84..caad132d88d 100644 --- a/pkg/ruler/ruler.go +++ b/pkg/ruler/ruler.go @@ -45,11 +45,7 @@ import ( ) var ( - supportedShardingStrategies = []string{util.ShardingStrategyDefault, util.ShardingStrategyShuffle} - - // Validation errors. - errInvalidShardingStrategy = errors.New("invalid sharding strategy") - errInvalidTenantShardSize = errors.New("invalid tenant shard size, the value must be greater than 0") + errInvalidTenantShardSize = errors.New("invalid tenant shard size, the value must be greater or equal to 0") ) const ( @@ -111,7 +107,6 @@ type Config struct { // Enable sharding rule groups. EnableSharding bool `yaml:"enable_sharding"` - ShardingStrategy string `yaml:"sharding_strategy"` SearchPendingFor time.Duration `yaml:"search_pending_for"` Ring RingConfig `yaml:"ring"` FlushCheckPeriod time.Duration `yaml:"flush_period"` @@ -130,11 +125,7 @@ type Config struct { // Validate config and returns error on failure func (cfg *Config) Validate(limits validation.Limits, log log.Logger) error { - if !util.StringsContain(supportedShardingStrategies, cfg.ShardingStrategy) { - return errInvalidShardingStrategy - } - - if cfg.ShardingStrategy == util.ShardingStrategyShuffle && limits.RulerTenantShardSize <= 0 { + if limits.RulerTenantShardSize < 0 { return errInvalidTenantShardSize } @@ -165,7 +156,6 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.SearchPendingFor, "ruler.search-pending-for", 5*time.Minute, "Time to spend searching for a pending ruler when shutting down.") f.BoolVar(&cfg.EnableSharding, "ruler.enable-sharding", false, "Distribute rule evaluation using ring backend") - f.StringVar(&cfg.ShardingStrategy, "ruler.sharding-strategy", util.ShardingStrategyDefault, fmt.Sprintf("The sharding strategy to use. Supported values are: %s.", strings.Join(supportedShardingStrategies, ", "))) f.DurationVar(&cfg.FlushCheckPeriod, "ruler.flush-period", 1*time.Minute, "Period with which to attempt to flush rule groups.") f.StringVar(&cfg.RulePath, "ruler.rule-path", "/rules", "file path to store temporary rule files for the prometheus rule managers") f.BoolVar(&cfg.EnableAPI, "experimental.ruler.enable-api", false, "Enable the ruler api") @@ -495,18 +485,10 @@ func (r *Ruler) syncRules(ctx context.Context, reason string) { } func (r *Ruler) listRules(ctx context.Context) (result map[string]rulespb.RuleGroupList, err error) { - switch { - case !r.cfg.EnableSharding: - result, err = r.listRulesNoSharding(ctx) - - case r.cfg.ShardingStrategy == util.ShardingStrategyDefault: - result, err = r.listRulesShardingDefault(ctx) - - case r.cfg.ShardingStrategy == util.ShardingStrategyShuffle: - result, err = r.listRulesShuffleSharding(ctx) - - default: - return nil, errors.New("invalid sharding configuration") + if r.cfg.EnableSharding { + result, err = r.listRulesSharded(ctx) + } else { + result, err = r.listRulesUnsharded(ctx) } if err != nil { @@ -522,27 +504,11 @@ func (r *Ruler) listRules(ctx context.Context) (result map[string]rulespb.RuleGr return } -func (r *Ruler) listRulesNoSharding(ctx context.Context) (map[string]rulespb.RuleGroupList, error) { +func (r *Ruler) listRulesUnsharded(ctx context.Context) (map[string]rulespb.RuleGroupList, error) { return r.store.ListAllRuleGroups(ctx) } -func (r *Ruler) listRulesShardingDefault(ctx context.Context) (map[string]rulespb.RuleGroupList, error) { - configs, err := r.store.ListAllRuleGroups(ctx) - if err != nil { - return nil, err - } - - filteredConfigs := make(map[string]rulespb.RuleGroupList) - for userID, groups := range configs { - filtered := filterRuleGroups(userID, groups, r.ring, r.lifecycler.GetInstanceAddr(), r.logger, r.ringCheckErrors) - if len(filtered) > 0 { - filteredConfigs[userID] = filtered - } - } - return filteredConfigs, nil -} - -func (r *Ruler) listRulesShuffleSharding(ctx context.Context) (map[string]rulespb.RuleGroupList, error) { +func (r *Ruler) listRulesSharded(ctx context.Context) (map[string]rulespb.RuleGroupList, error) { users, err := r.store.ListAllUsers(ctx) if err != nil { return nil, errors.Wrap(err, "unable to list users of ruler") @@ -742,7 +708,7 @@ func (r *Ruler) getLocalRules(userID string) ([]*GroupStateDesc, error) { func (r *Ruler) getShardedRules(ctx context.Context, userID string) ([]*GroupStateDesc, error) { ring := ring.ReadRing(r.ring) - if shardSize := r.limits.RulerTenantShardSize(userID); shardSize > 0 && r.cfg.ShardingStrategy == util.ShardingStrategyShuffle { + if shardSize := r.limits.RulerTenantShardSize(userID); shardSize > 0 { ring = r.ring.ShuffleShard(userID, shardSize) } diff --git a/pkg/ruler/ruler_test.go b/pkg/ruler/ruler_test.go index a94efbcc4eb..cc0d0778eea 100644 --- a/pkg/ruler/ruler_test.go +++ b/pkg/ruler/ruler_test.go @@ -311,7 +311,6 @@ func TestGetRules(t *testing.T) { type testCase struct { sharding bool - shardingStrategy string shuffleShardSize int } @@ -349,14 +348,13 @@ func TestGetRules(t *testing.T) { "No Sharding": { sharding: false, }, - "Default Sharding": { + "Shuffle Shard Size 0": { sharding: true, - shardingStrategy: util.ShardingStrategyDefault, + shuffleShardSize: 0, }, - "Shuffle Sharding and ShardSize = 2": { + "Shuffle Shard Size 2": { sharding: true, shuffleShardSize: 2, - shardingStrategy: util.ShardingStrategyShuffle, }, } @@ -372,8 +370,6 @@ func TestGetRules(t *testing.T) { createRuler := func(id string) *Ruler { cfg := defaultRulerConfig(t) - - cfg.ShardingStrategy = tc.shardingStrategy cfg.EnableSharding = tc.sharding cfg.Ring = RingConfig{ @@ -439,7 +435,7 @@ func TestGetRules(t *testing.T) { if tc.sharding { mockPoolClient := r.clientsPool.(*mockRulerClientsPool) - if tc.shardingStrategy == util.ShardingStrategyShuffle { + if tc.shuffleShardSize > 0 { require.Equal(t, int32(tc.shuffleShardSize), mockPoolClient.numberOfCalls.Load()) } else { require.Equal(t, int32(len(rulerAddrMap)), mockPoolClient.numberOfCalls.Load()) @@ -502,7 +498,6 @@ func TestSharding(t *testing.T) { type testCase struct { sharding bool - shardingStrategy string shuffleShardSize int setupRing func(*ring.Desc) enabledUsers []string @@ -553,7 +548,7 @@ func TestSharding(t *testing.T) { "default sharding, single ruler": { sharding: true, - shardingStrategy: util.ShardingStrategyDefault, + shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", []uint32{0}, ring.ACTIVE, time.Now()) }, @@ -562,7 +557,7 @@ func TestSharding(t *testing.T) { "default sharding, single ruler, single enabled user": { sharding: true, - shardingStrategy: util.ShardingStrategyDefault, + shuffleShardSize: 0, enabledUsers: []string{user1}, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", []uint32{0}, ring.ACTIVE, time.Now()) @@ -574,7 +569,7 @@ func TestSharding(t *testing.T) { "default sharding, single ruler, single disabled user": { sharding: true, - shardingStrategy: util.ShardingStrategyDefault, + shuffleShardSize: 0, disabledUsers: []string{user1}, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", []uint32{0}, ring.ACTIVE, time.Now()) @@ -587,7 +582,7 @@ func TestSharding(t *testing.T) { "default sharding, multiple ACTIVE rulers": { sharding: true, - shardingStrategy: util.ShardingStrategyDefault, + shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", sortTokens([]uint32{user1Group1Token + 1, user2Group1Token + 1}), ring.ACTIVE, time.Now()) desc.AddIngester(ruler2, ruler2Addr, "", sortTokens([]uint32{user1Group2Token + 1, user3Group1Token + 1}), ring.ACTIVE, time.Now()) @@ -608,7 +603,7 @@ func TestSharding(t *testing.T) { "default sharding, multiple ACTIVE rulers, single enabled user": { sharding: true, - shardingStrategy: util.ShardingStrategyDefault, + shuffleShardSize: 0, enabledUsers: []string{user1}, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", sortTokens([]uint32{user1Group1Token + 1, user2Group1Token + 1}), ring.ACTIVE, time.Now()) @@ -628,7 +623,7 @@ func TestSharding(t *testing.T) { "default sharding, multiple ACTIVE rulers, single disabled user": { sharding: true, - shardingStrategy: util.ShardingStrategyDefault, + shuffleShardSize: 0, disabledUsers: []string{user1}, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", sortTokens([]uint32{user1Group1Token + 1, user2Group1Token + 1}), ring.ACTIVE, time.Now()) @@ -648,7 +643,7 @@ func TestSharding(t *testing.T) { "default sharding, unhealthy ACTIVE ruler": { sharding: true, - shardingStrategy: util.ShardingStrategyDefault, + shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", sortTokens([]uint32{user1Group1Token + 1, user2Group1Token + 1}), ring.ACTIVE, time.Now()) @@ -672,7 +667,7 @@ func TestSharding(t *testing.T) { "default sharding, LEAVING ruler": { sharding: true, - shardingStrategy: util.ShardingStrategyDefault, + shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", sortTokens([]uint32{user1Group1Token + 1, user2Group1Token + 1}), ring.LEAVING, time.Now()) @@ -688,7 +683,7 @@ func TestSharding(t *testing.T) { "default sharding, JOINING ruler": { sharding: true, - shardingStrategy: util.ShardingStrategyDefault, + shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", sortTokens([]uint32{user1Group1Token + 1, user2Group1Token + 1}), ring.JOINING, time.Now()) @@ -704,7 +699,7 @@ func TestSharding(t *testing.T) { "shuffle sharding, single ruler": { sharding: true, - shardingStrategy: util.ShardingStrategyShuffle, + shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", sortTokens([]uint32{0}), ring.ACTIVE, time.Now()) @@ -717,7 +712,6 @@ func TestSharding(t *testing.T) { "shuffle sharding, multiple rulers, shard size 1": { sharding: true, - shardingStrategy: util.ShardingStrategyShuffle, shuffleShardSize: 1, setupRing: func(desc *ring.Desc) { @@ -734,7 +728,6 @@ func TestSharding(t *testing.T) { // Same test as previous one, but with shard size=2. Second ruler gets all the rules. "shuffle sharding, two rulers, shard size 2": { sharding: true, - shardingStrategy: util.ShardingStrategyShuffle, shuffleShardSize: 2, setupRing: func(desc *ring.Desc) { @@ -751,7 +744,6 @@ func TestSharding(t *testing.T) { "shuffle sharding, two rulers, shard size 1, distributed users": { sharding: true, - shardingStrategy: util.ShardingStrategyShuffle, shuffleShardSize: 1, setupRing: func(desc *ring.Desc) { @@ -771,7 +763,6 @@ func TestSharding(t *testing.T) { }, "shuffle sharding, three rulers, shard size 2": { sharding: true, - shardingStrategy: util.ShardingStrategyShuffle, shuffleShardSize: 2, setupRing: func(desc *ring.Desc) { @@ -795,7 +786,6 @@ func TestSharding(t *testing.T) { }, "shuffle sharding, three rulers, shard size 2, ruler2 has no users": { sharding: true, - shardingStrategy: util.ShardingStrategyShuffle, shuffleShardSize: 2, setupRing: func(desc *ring.Desc) { @@ -818,7 +808,6 @@ func TestSharding(t *testing.T) { "shuffle sharding, three rulers, shard size 2, single enabled user": { sharding: true, - shardingStrategy: util.ShardingStrategyShuffle, shuffleShardSize: 2, enabledUsers: []string{user1}, @@ -841,7 +830,6 @@ func TestSharding(t *testing.T) { "shuffle sharding, three rulers, shard size 2, single disabled user": { sharding: true, - shardingStrategy: util.ShardingStrategyShuffle, shuffleShardSize: 2, disabledUsers: []string{user1}, @@ -869,8 +857,7 @@ func TestSharding(t *testing.T) { setupRuler := func(id string, host string, port int, forceRing *ring.Ring) *Ruler { cfg := Config{ - EnableSharding: tc.sharding, - ShardingStrategy: tc.shardingStrategy, + EnableSharding: tc.sharding, Ring: RingConfig{ InstanceID: id, InstanceAddr: host, diff --git a/pkg/util/validation/limits.go b/pkg/util/validation/limits.go index f9b31c0c52b..f0c5b505305 100644 --- a/pkg/util/validation/limits.go +++ b/pkg/util/validation/limits.go @@ -155,7 +155,7 @@ func (l *Limits) RegisterFlags(f *flag.FlagSet) { f.IntVar(&l.QueryShardingMaxShardedQueries, "frontend.query-sharding-max-sharded-queries", 128, "The max number of sharded queries that can be run for a given received query. 0 to disable limit.") f.Var(&l.RulerEvaluationDelay, "ruler.evaluation-delay-duration", "Duration to delay the evaluation of rules to ensure the underlying metrics have been pushed.") - f.IntVar(&l.RulerTenantShardSize, "ruler.tenant-shard-size", 0, "The tenant's shard size when the shuffle-sharding strategy is used by ruler. When this setting is specified in the per-tenant overrides, a value of 0 disables shuffle sharding for the tenant.") + f.IntVar(&l.RulerTenantShardSize, "ruler.tenant-shard-size", 0, "The tenant's shard size when sharding is used by ruler. Value of 0 disables shuffle sharding for the tenant, and tenant rules will be sharded across all ruler replicas.") f.IntVar(&l.RulerMaxRulesPerRuleGroup, "ruler.max-rules-per-rule-group", 20, "Maximum number of rules per rule group per-tenant. 0 to disable.") f.IntVar(&l.RulerMaxRuleGroupsPerTenant, "ruler.max-rule-groups-per-tenant", 70, "Maximum number of rule groups per-tenant. 0 to disable.") From 32843e5cbece3e79dbc995266a0e764ab801dc1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Wed, 26 Jan 2022 11:40:44 +0100 Subject: [PATCH 005/168] Remove distributor.sharding-strategy option. (#888) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove distributor.sharding-strategy option. Signed-off-by: Peter Štibraný --- CHANGELOG.md | 3 +- docs/sources/configuration/arguments.md | 4 +- .../configuration/config-file-reference.md | 9 +- docs/sources/guides/shuffle-sharding.md | 4 +- integration/ingester_limits_test.go | 10 +- integration/ingester_sharding_test.go | 20 +- pkg/distributor/distributor.go | 24 +- pkg/distributor/distributor_test.go | 247 +++++++----------- pkg/distributor/query.go | 25 +- pkg/ingester/ingester.go | 5 - pkg/ingester/limiter.go | 23 +- pkg/ingester/limiter_test.go | 103 ++++---- pkg/mimir/modules.go | 1 - pkg/util/validation/limits.go | 2 +- 14 files changed, 193 insertions(+), 287 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1a3c5bc0ae..e82f7941afc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -215,8 +215,9 @@ * [CHANGE] Ruler: set new default limits for rule groups: `ruler.max_rules_per_rule_group` to 20 (previously 0, disabled) and `ruler.max_rule_groups_per_tenant` to 70 (previously 0, disabled). #847 * [CHANGE] Compactor is now included in `all` target (single-binary). #866 * [CHANGE] Shuffle-sharding: - * `-store-gateway.sharding-strategy` option has been removed store-gateways. Store-gateway now uses shuffle-sharding by default, but respects `store_gateway_tenant_shard_size` for tenant, and this value defaults to 0. #891 + * `-distributor.sharding-strategy` option has been removed, and shuffle sharding is enabled by default. Default shard size is set to 0, which disables shuffle sharding for the tenant (all ingesters will receive tenants's samples). #888 * `-ruler.sharding-strategy` option has been removed from ruler. Ruler now uses shuffle-sharding by default, but respects `ruler_tenant_shard_size`, which defaults to 0 (ie. use all rulers for tenant). #889 + * `-store-gateway.sharding-strategy` option has been removed store-gateways. Store-gateway now uses shuffle-sharding by default, but respects `store_gateway_tenant_shard_size` for tenant, and this value defaults to 0. #891 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/docs/sources/configuration/arguments.md b/docs/sources/configuration/arguments.md index 228026610c2..6b3589527b8 100644 --- a/docs/sources/configuration/arguments.md +++ b/docs/sources/configuration/arguments.md @@ -365,7 +365,7 @@ Valid per-tenant limits are (with their corresponding flags for default values): Enforced by the ingesters; limits the number of in-memory series a user (or a given metric) can have. A series is kept in memory if a sample has been written since the last TSDB head compaction (occurring every 2h) or in the last 1h (regardless when the last TSDB head compaction occurred). The limit is enforced across the cluster. Each ingester is configured with a local limit based on the replication factor and the current number of healthy ingesters. The local limit is updated whenever the number of ingesters change. - Requires `-distributor.replication-factor`, `-distributor.sharding-strategy` and `-distributor.zone-awareness-enabled` set for the ingesters too. + Requires `-distributor.replication-factor` and `-distributor.zone-awareness-enabled` set for the ingesters too. - `max_samples_per_query` / `-ingester.max-samples-per-query` @@ -376,7 +376,7 @@ Valid per-tenant limits are (with their corresponding flags for default values): Enforced by the ingesters; limits the number of active metadata a user (or a given metric) can have. The limit is enforced across the cluster. Each ingester is configured with a local limit based on the replication factor and the current number of healthy ingesters. The local limit is updated whenever the number of ingesters change. - Requires `-distributor.replication-factor`, `-distributor.sharding-strategy` and `-distributor.zone-awareness-enabled` set for the ingesters too. + Requires `-distributor.replication-factor` and `-distributor.zone-awareness-enabled` set for the ingesters too. - `max_fetched_series_per_query` / `querier.max-fetched-series-per-query` This limit is enforced in the queriers on unique series fetched from ingesters and store-gateways (long-term storage). diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 25381d76258..37bec90d3ff 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -514,10 +514,6 @@ ha_tracker: # CLI flag: -distributor.extra-query-delay [extra_queue_delay: | default = 0s] -# The sharding strategy to use. Supported values are: default, shuffle-sharding. -# CLI flag: -distributor.sharding-strategy -[sharding_strategy: | default = "default"] - # Try writing to an additional ingester in the presence of an ingester not in # the ACTIVE state. It is useful to disable this along with # -ingester.unregister-on-shutdown=false in order to not spread samples to extra @@ -2439,9 +2435,8 @@ The `limits_config` configures default and per-tenant limits imposed by services # CLI flag: -validation.enforce-metadata-metric-name [enforce_metadata_metric_name: | default = true] -# The tenant's shard size when the shuffle-sharding strategy is used. Must be -# set both on ingesters and distributors. When this setting is specified in the -# per-tenant overrides, a value of 0 disables shuffle sharding for the tenant. +# The tenant's shard size used by shuffle-sharding. Must be set both on +# ingesters and distributors. 0 disables shuffle sharding. # CLI flag: -distributor.ingestion-tenant-shard-size [ingestion_tenant_shard_size: | default = 0] diff --git a/docs/sources/guides/shuffle-sharding.md b/docs/sources/guides/shuffle-sharding.md index 6e2eafd3c1d..42d0d2f17a5 100644 --- a/docs/sources/guides/shuffle-sharding.md +++ b/docs/sources/guides/shuffle-sharding.md @@ -83,15 +83,13 @@ _The shard size can be overridden on a per-tenant basis in the limits overrides To enable shuffle-sharding for ingesters on the write path you need to configure the following CLI flags (or their respective YAML config options) to **distributor**, **ingester** and **ruler**: -- `-distributor.sharding-strategy=shuffle-sharding` - `-distributor.ingestion-tenant-shard-size=`
- `` set to the number of ingesters each tenant series should be sharded to. If `` is greater than the number of available ingesters in the Cortex cluster, the tenant series are sharded across all ingesters. + `` set to the number of ingesters each tenant series should be sharded to. If `` is zero or greater than the number of available ingesters in the Cortex cluster, the tenant series are sharded across all ingesters. #### Ingesters read path Assuming shuffle-sharding has been enabled for the write path, to enable shuffle-sharding for ingesters on the read path too you need to configure the following CLI flags (or their respective YAML config options) to **querier** and **ruler**: -- `-distributor.sharding-strategy=shuffle-sharding` - `-distributor.ingestion-tenant-shard-size=` - `-querier.shuffle-sharding-ingesters-lookback-period=`
Queriers and rulers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The configured lookback `` should be greater or equal than `-querier.query-store-after` and `-querier.query-ingesters-within` if set, and greater than the estimated minimum time it takes for the oldest samples stored in a block uploaded by ingester to be discovered and available for querying (3h with the default configuration). diff --git a/integration/ingester_limits_test.go b/integration/ingester_limits_test.go index 17377119b6f..3005ade559b 100644 --- a/integration/ingester_limits_test.go +++ b/integration/ingester_limits_test.go @@ -27,19 +27,16 @@ import ( func TestIngesterGlobalLimits(t *testing.T) { tests := map[string]struct { - shardingStrategy string tenantShardSize int maxGlobalSeriesPerTenant int maxGlobalSeriesPerMetric int }{ - "default sharding strategy": { - shardingStrategy: "default", - tenantShardSize: 1, // Ignored by default strategy. + "shuffle sharding disabled": { + tenantShardSize: 0, maxGlobalSeriesPerTenant: 1000, maxGlobalSeriesPerMetric: 300, }, - "shuffle sharding strategy": { - shardingStrategy: "shuffle-sharding", + "shuffle sharding enabled": { tenantShardSize: 1, maxGlobalSeriesPerTenant: 1000, maxGlobalSeriesPerMetric: 300, @@ -54,7 +51,6 @@ func TestIngesterGlobalLimits(t *testing.T) { flags := BlocksStorageFlags() flags["-distributor.replication-factor"] = "1" - flags["-distributor.sharding-strategy"] = testData.shardingStrategy flags["-distributor.ingestion-tenant-shard-size"] = strconv.Itoa(testData.tenantShardSize) flags["-ingester.max-global-series-per-user"] = strconv.Itoa(testData.maxGlobalSeriesPerTenant) flags["-ingester.max-global-series-per-metric"] = strconv.Itoa(testData.maxGlobalSeriesPerMetric) diff --git a/integration/ingester_sharding_test.go b/integration/ingester_sharding_test.go index 2aeb9ce6aa9..e163eea2d05 100644 --- a/integration/ingester_sharding_test.go +++ b/integration/ingester_sharding_test.go @@ -27,17 +27,14 @@ func TestIngesterSharding(t *testing.T) { const numSeriesToPush = 1000 tests := map[string]struct { - shardingStrategy string tenantShardSize int expectedIngestersWithSeries int }{ - "default sharding strategy should spread series across all ingesters": { - shardingStrategy: "default", - tenantShardSize: 2, // Ignored by default strategy. + "zero shard size should spread series across all ingesters": { + tenantShardSize: 0, expectedIngestersWithSeries: 3, }, - "shuffle-sharding strategy should spread series across the configured shard size number of ingesters": { - shardingStrategy: "shuffle-sharding", + "non-zero shard size should spread series across the configured shard size number of ingesters": { tenantShardSize: 2, expectedIngestersWithSeries: 2, }, @@ -50,14 +47,11 @@ func TestIngesterSharding(t *testing.T) { defer s.Close() flags := BlocksStorageFlags() - flags["-distributor.sharding-strategy"] = testData.shardingStrategy flags["-distributor.ingestion-tenant-shard-size"] = strconv.Itoa(testData.tenantShardSize) - if testData.shardingStrategy == "shuffle-sharding" { - // Enable shuffle sharding on read path but not lookback, otherwise all ingesters would be - // queried being just registered. - flags["-querier.shuffle-sharding-ingesters-lookback-period"] = "1ns" - } + // Enable shuffle sharding on read path but not lookback, otherwise all ingesters would be + // queried being just registered. + flags["-querier.shuffle-sharding-ingesters-lookback-period"] = "1ns" // Start dependencies. consul := e2edb.NewConsul() @@ -128,7 +122,7 @@ func TestIngesterSharding(t *testing.T) { // We expect that only ingesters belonging to tenant's shard have been queried if // shuffle sharding is enabled. expectedIngesters := ingesters.NumInstances() - if testData.shardingStrategy == "shuffle-sharding" { + if testData.tenantShardSize > 0 { expectedIngesters = testData.tenantShardSize } diff --git a/pkg/distributor/distributor.go b/pkg/distributor/distributor.go index d5f3a5ccd12..4b4d664461f 100644 --- a/pkg/distributor/distributor.go +++ b/pkg/distributor/distributor.go @@ -13,7 +13,6 @@ import ( math "math" "net/http" "sort" - "strings" "sync" "time" @@ -48,11 +47,8 @@ import ( ) var ( - supportedShardingStrategies = []string{util.ShardingStrategyDefault, util.ShardingStrategyShuffle} - // Validation errors. - errInvalidShardingStrategy = errors.New("invalid sharding strategy") - errInvalidTenantShardSize = errors.New("invalid tenant shard size, the value must be greater than 0") + errInvalidTenantShardSize = errors.New("invalid tenant shard size, the value must be greater or equal to zero") // Distributor instance limits errors. errTooManyInflightPushRequests = errors.New("too many inflight push requests in distributor") @@ -133,8 +129,7 @@ type Config struct { RemoteTimeout time.Duration `yaml:"remote_timeout"` ExtraQueryDelay time.Duration `yaml:"extra_queue_delay"` - ShardingStrategy string `yaml:"sharding_strategy"` - ExtendWrites bool `yaml:"extend_writes"` + ExtendWrites bool `yaml:"extend_writes"` // Distributors ring DistributorRing RingConfig `yaml:"ring"` @@ -167,7 +162,6 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.IntVar(&cfg.MaxRecvMsgSize, "distributor.max-recv-msg-size", 100<<20, "remote_write API max receive message size (bytes).") f.DurationVar(&cfg.RemoteTimeout, "distributor.remote-timeout", 2*time.Second, "Timeout for downstream ingesters.") f.DurationVar(&cfg.ExtraQueryDelay, "distributor.extra-query-delay", 0, "Time to wait before sending more than the minimum successful query requests.") - f.StringVar(&cfg.ShardingStrategy, "distributor.sharding-strategy", util.ShardingStrategyDefault, fmt.Sprintf("The sharding strategy to use. Supported values are: %s.", strings.Join(supportedShardingStrategies, ", "))) f.BoolVar(&cfg.ExtendWrites, "distributor.extend-writes", true, "Try writing to an additional ingester in the presence of an ingester not in the ACTIVE state. It is useful to disable this along with -ingester.unregister-on-shutdown=false in order to not spread samples to extra ingesters during rolling restarts with consistent naming.") f.Float64Var(&cfg.InstanceLimits.MaxIngestionRate, "distributor.instance-limits.max-ingestion-rate", 0, "Max ingestion rate (samples/sec) that this distributor will accept. This limit is per-distributor, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited.") @@ -176,11 +170,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { // Validate config and returns error on failure func (cfg *Config) Validate(limits validation.Limits) error { - if !util.StringsContain(supportedShardingStrategies, cfg.ShardingStrategy) { - return errInvalidShardingStrategy - } - - if cfg.ShardingStrategy == util.ShardingStrategyShuffle && limits.IngestionTenantShardSize <= 0 { + if limits.IngestionTenantShardSize < 0 { return errInvalidTenantShardSize } @@ -774,12 +764,8 @@ func (d *Distributor) PushWithCleanup(ctx context.Context, req *mimirpb.WriteReq // totalN included samples and metadata. Ingester follows this pattern when computing its ingestion rate. d.ingestionRate.Add(int64(totalN)) - subRing := d.ingestersRing - - // Obtain a subring if required. - if d.cfg.ShardingStrategy == util.ShardingStrategyShuffle { - subRing = d.ingestersRing.ShuffleShard(userID, d.limits.IngestionTenantShardSize(userID)) - } + // Get a subring if tenant has shuffle shard size configured. + subRing := d.ingestersRing.ShuffleShard(userID, d.limits.IngestionTenantShardSize(userID)) // Use a background context to make sure all ingesters get samples even if we return early localCtx, cancel := context.WithTimeout(context.Background(), d.cfg.RemoteTimeout) diff --git a/pkg/distributor/distributor_test.go b/pkg/distributor/distributor_test.go index 9a3aaabebc5..83eb3392739 100644 --- a/pkg/distributor/distributor_test.go +++ b/pkg/distributor/distributor_test.go @@ -61,35 +61,20 @@ var ( func TestConfig_Validate(t *testing.T) { tests := map[string]struct { - initConfig func(*Config) initLimits func(*validation.Limits) expected error }{ "default config should pass": { - initConfig: func(_ *Config) {}, initLimits: func(_ *validation.Limits) {}, expected: nil, }, - "should fail on invalid sharding strategy": { - initConfig: func(cfg *Config) { - cfg.ShardingStrategy = "xxx" - }, - initLimits: func(_ *validation.Limits) {}, - expected: errInvalidShardingStrategy, - }, - "should fail if the default shard size is 0 on when sharding strategy = shuffle-sharding": { - initConfig: func(cfg *Config) { - cfg.ShardingStrategy = "shuffle-sharding" - }, + "should fail if the default shard size is negative": { initLimits: func(limits *validation.Limits) { - limits.IngestionTenantShardSize = 0 + limits.IngestionTenantShardSize = -5 }, expected: errInvalidTenantShardSize, }, - "should pass if the default shard size > 0 on when sharding strategy = shuffle-sharding": { - initConfig: func(cfg *Config) { - cfg.ShardingStrategy = "shuffle-sharding" - }, + "should pass if the default shard size >= 0": { initLimits: func(limits *validation.Limits) { limits.IngestionTenantShardSize = 3 }, @@ -103,7 +88,6 @@ func TestConfig_Validate(t *testing.T) { limits := validation.Limits{} flagext.DefaultValues(&cfg, &limits) - testData.initConfig(&cfg) testData.initLimits(&limits) assert.Equal(t, testData.expected, cfg.Validate(limits)) @@ -767,23 +751,21 @@ func TestDistributor_PushHAInstances(t *testing.T) { } func TestDistributor_PushQuery(t *testing.T) { - const shuffleShardSize = 5 - ctx := user.InjectOrgID(context.Background(), "user") nameMatcher := mustEqualMatcher(model.MetricNameLabel, "foo") barMatcher := mustEqualMatcher("bar", "baz") type testcase struct { - name string - numIngesters int - happyIngesters int - samples int - metadata int - matchers []*labels.Matcher - expectedIngesters int - expectedResponse model.Matrix - expectedError error - shuffleShardEnabled bool + name string + numIngesters int + happyIngesters int + samples int + metadata int + matchers []*labels.Matcher + expectedIngesters int + expectedResponse model.Matrix + expectedError error + shuffleShardSize int } // We'll programmatically build the test cases now, as we want complete @@ -797,11 +779,11 @@ func TestDistributor_PushQuery(t *testing.T) { for happyIngesters := 0; happyIngesters <= numIngesters; happyIngesters++ { // Test either with shuffle-sharding enabled or disabled. - for _, shuffleShardEnabled := range []bool{false, true} { - scenario := fmt.Sprintf("numIngester=%d, happyIngester=%d, shuffleSharding=%v)", numIngesters, happyIngesters, shuffleShardEnabled) + for _, shuffleShardSize := range []int{0, 5} { + scenario := fmt.Sprintf("numIngester=%d, happyIngester=%d, shuffleShardSize=%v)", numIngesters, happyIngesters, shuffleShardSize) var expectedIngesters int - if shuffleShardEnabled { + if shuffleShardSize > 0 { expectedIngesters = util_math.Min(shuffleShardSize, numIngesters) } else { expectedIngesters = numIngesters @@ -810,12 +792,12 @@ func TestDistributor_PushQuery(t *testing.T) { // Queriers with more than one failed ingester should fail. if numIngesters-happyIngesters > 1 { testcases = append(testcases, testcase{ - name: fmt.Sprintf("ExpectFail(%s)", scenario), - numIngesters: numIngesters, - happyIngesters: happyIngesters, - matchers: []*labels.Matcher{nameMatcher, barMatcher}, - expectedError: errFail, - shuffleShardEnabled: shuffleShardEnabled, + name: fmt.Sprintf("ExpectFail(%s)", scenario), + numIngesters: numIngesters, + happyIngesters: happyIngesters, + matchers: []*labels.Matcher{nameMatcher, barMatcher}, + expectedError: errFail, + shuffleShardSize: shuffleShardSize, }) continue } @@ -824,51 +806,51 @@ func TestDistributor_PushQuery(t *testing.T) { // will cause a failure. if numIngesters < 3 && happyIngesters < 2 { testcases = append(testcases, testcase{ - name: fmt.Sprintf("ExpectFail(%s)", scenario), - numIngesters: numIngesters, - happyIngesters: happyIngesters, - matchers: []*labels.Matcher{nameMatcher, barMatcher}, - expectedError: errFail, - shuffleShardEnabled: shuffleShardEnabled, + name: fmt.Sprintf("ExpectFail(%s)", scenario), + numIngesters: numIngesters, + happyIngesters: happyIngesters, + matchers: []*labels.Matcher{nameMatcher, barMatcher}, + expectedError: errFail, + shuffleShardSize: shuffleShardSize, }) continue } // Reading all the samples back should succeed. testcases = append(testcases, testcase{ - name: fmt.Sprintf("ReadAll(%s)", scenario), - numIngesters: numIngesters, - happyIngesters: happyIngesters, - samples: 10, - matchers: []*labels.Matcher{nameMatcher, barMatcher}, - expectedResponse: expectedResponse(0, 10), - expectedIngesters: expectedIngesters, - shuffleShardEnabled: shuffleShardEnabled, + name: fmt.Sprintf("ReadAll(%s)", scenario), + numIngesters: numIngesters, + happyIngesters: happyIngesters, + samples: 10, + matchers: []*labels.Matcher{nameMatcher, barMatcher}, + expectedResponse: expectedResponse(0, 10), + expectedIngesters: expectedIngesters, + shuffleShardSize: shuffleShardSize, }) // As should reading none of the samples back. testcases = append(testcases, testcase{ - name: fmt.Sprintf("ReadNone(%s)", scenario), - numIngesters: numIngesters, - happyIngesters: happyIngesters, - samples: 10, - matchers: []*labels.Matcher{nameMatcher, mustEqualMatcher("not", "found")}, - expectedResponse: expectedResponse(0, 0), - expectedIngesters: expectedIngesters, - shuffleShardEnabled: shuffleShardEnabled, + name: fmt.Sprintf("ReadNone(%s)", scenario), + numIngesters: numIngesters, + happyIngesters: happyIngesters, + samples: 10, + matchers: []*labels.Matcher{nameMatcher, mustEqualMatcher("not", "found")}, + expectedResponse: expectedResponse(0, 0), + expectedIngesters: expectedIngesters, + shuffleShardSize: shuffleShardSize, }) // And reading each sample individually. for i := 0; i < 10; i++ { testcases = append(testcases, testcase{ - name: fmt.Sprintf("ReadOne(%s, sample=%d)", scenario, i), - numIngesters: numIngesters, - happyIngesters: happyIngesters, - samples: 10, - matchers: []*labels.Matcher{nameMatcher, mustEqualMatcher("sample", strconv.Itoa(i))}, - expectedResponse: expectedResponse(i, i+1), - expectedIngesters: expectedIngesters, - shuffleShardEnabled: shuffleShardEnabled, + name: fmt.Sprintf("ReadOne(%s, sample=%d)", scenario, i), + numIngesters: numIngesters, + happyIngesters: happyIngesters, + samples: 10, + matchers: []*labels.Matcher{nameMatcher, mustEqualMatcher("sample", strconv.Itoa(i))}, + expectedResponse: expectedResponse(i, i+1), + expectedIngesters: expectedIngesters, + shuffleShardSize: shuffleShardSize, }) } } @@ -877,13 +859,15 @@ func TestDistributor_PushQuery(t *testing.T) { for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { - ds, ingesters, _ := prepare(t, prepConfig{ - numIngesters: tc.numIngesters, - happyIngesters: tc.happyIngesters, - numDistributors: 1, - shuffleShardEnabled: tc.shuffleShardEnabled, - shuffleShardSize: shuffleShardSize, - }) + cfg := prepConfig{ + numIngesters: tc.numIngesters, + happyIngesters: tc.happyIngesters, + numDistributors: 1, + } + + cfg.shuffleShardSize = tc.shuffleShardSize + + ds, ingesters, _ := prepare(t, cfg) request := makeWriteRequest(0, tc.samples, tc.metadata) writeResponse, err := ds[0].Push(ctx, request) @@ -1316,7 +1300,7 @@ func TestDistributor_Push_LabelNameValidation(t *testing.T) { numIngesters: 2, happyIngesters: 2, numDistributors: 1, - shuffleShardSize: 1, + shuffleShardSize: 0, skipLabelNameValidation: tc.skipLabelNameValidationCfg, }) req := mockWriteRequest(tc.inputLabels, 42, 100000) @@ -1378,7 +1362,7 @@ func TestDistributor_Push_ExemplarValidation(t *testing.T) { numIngesters: 2, happyIngesters: 2, numDistributors: 1, - shuffleShardSize: 1, + shuffleShardSize: 0, }) _, err := ds[0].Push(ctx, tc.req) if tc.errMsg != "" { @@ -1763,11 +1747,10 @@ func TestDistributor_MetricsForLabelMatchers(t *testing.T) { } tests := map[string]struct { - shuffleShardEnabled bool - shuffleShardSize int - matchers []*labels.Matcher - expectedResult []model.Metric - expectedIngesters int + shuffleShardSize int + matchers []*labels.Matcher + expectedResult []model.Metric + expectedIngesters int }{ "should return an empty response if no metric match": { matchers: []*labels.Matcher{ @@ -1806,9 +1789,8 @@ func TestDistributor_MetricsForLabelMatchers(t *testing.T) { }, expectedIngesters: numIngesters, }, - "should query only ingesters belonging to tenant's subring if shuffle sharding is enabled": { - shuffleShardEnabled: true, - shuffleShardSize: 3, + "should query only ingesters belonging to tenant's subring if shuffle shard size is set": { + shuffleShardSize: 3, matchers: []*labels.Matcher{ mustNewMatcher(labels.MatchEqual, model.MetricNameLabel, "test_1"), }, @@ -1818,18 +1800,6 @@ func TestDistributor_MetricsForLabelMatchers(t *testing.T) { }, expectedIngesters: 3, }, - "should query all ingesters if shuffle sharding is enabled but shard size is 0": { - shuffleShardEnabled: true, - shuffleShardSize: 0, - matchers: []*labels.Matcher{ - mustNewMatcher(labels.MatchEqual, model.MetricNameLabel, "test_1"), - }, - expectedResult: []model.Metric{ - util.LabelsToMetric(fixtures[0].lbls), - util.LabelsToMetric(fixtures[1].lbls), - }, - expectedIngesters: numIngesters, - }, } for testName, testData := range tests { @@ -1838,11 +1808,10 @@ func TestDistributor_MetricsForLabelMatchers(t *testing.T) { // Create distributor ds, ingesters, _ := prepare(t, prepConfig{ - numIngesters: numIngesters, - happyIngesters: numIngesters, - numDistributors: 1, - shuffleShardEnabled: testData.shuffleShardEnabled, - shuffleShardSize: testData.shuffleShardSize, + numIngesters: numIngesters, + happyIngesters: numIngesters, + numDistributors: 1, + shuffleShardSize: testData.shuffleShardSize, }) // Push fixtures @@ -1881,11 +1850,10 @@ func TestDistributor_LabelNames(t *testing.T) { } tests := map[string]struct { - shuffleShardEnabled bool - shuffleShardSize int - matchers []*labels.Matcher - expectedResult []string - expectedIngesters int + shuffleShardSize int + matchers []*labels.Matcher + expectedResult []string + expectedIngesters int }{ "should return an empty response if no metric match": { matchers: []*labels.Matcher{ @@ -1910,23 +1878,13 @@ func TestDistributor_LabelNames(t *testing.T) { expectedIngesters: numIngesters, }, "should query only ingesters belonging to tenant's subring if shuffle sharding is enabled": { - shuffleShardEnabled: true, - shuffleShardSize: 3, + shuffleShardSize: 3, matchers: []*labels.Matcher{ mustNewMatcher(labels.MatchEqual, model.MetricNameLabel, "test_1"), }, expectedResult: []string{labels.MetricName, "reason", "status"}, expectedIngesters: 3, }, - "should query all ingesters if shuffle sharding is enabled but shard size is 0": { - shuffleShardEnabled: true, - shuffleShardSize: 0, - matchers: []*labels.Matcher{ - mustNewMatcher(labels.MatchEqual, model.MetricNameLabel, "test_1"), - }, - expectedResult: []string{labels.MetricName, "reason", "status"}, - expectedIngesters: numIngesters, - }, } for testName, testData := range tests { @@ -1935,11 +1893,10 @@ func TestDistributor_LabelNames(t *testing.T) { // Create distributor ds, ingesters, _ := prepare(t, prepConfig{ - numIngesters: numIngesters, - happyIngesters: numIngesters, - numDistributors: 1, - shuffleShardEnabled: testData.shuffleShardEnabled, - shuffleShardSize: testData.shuffleShardSize, + numIngesters: numIngesters, + happyIngesters: numIngesters, + numDistributors: 1, + shuffleShardSize: testData.shuffleShardSize, }) // Push fixtures @@ -1968,23 +1925,16 @@ func TestDistributor_MetricsMetadata(t *testing.T) { const numIngesters = 5 tests := map[string]struct { - shuffleShardEnabled bool - shuffleShardSize int - expectedIngesters int + shuffleShardSize int + expectedIngesters int }{ - "should query all ingesters if shuffle sharding is disabled": { - shuffleShardEnabled: false, - expectedIngesters: numIngesters, - }, "should query all ingesters if shuffle sharding is enabled but shard size is 0": { - shuffleShardEnabled: true, - shuffleShardSize: 0, - expectedIngesters: numIngesters, + shuffleShardSize: 0, + expectedIngesters: numIngesters, }, "should query only ingesters belonging to tenant's subring if shuffle sharding is enabled": { - shuffleShardEnabled: true, - shuffleShardSize: 3, - expectedIngesters: 3, + shuffleShardSize: 3, + expectedIngesters: 3, }, } @@ -1992,12 +1942,11 @@ func TestDistributor_MetricsMetadata(t *testing.T) { t.Run(testName, func(t *testing.T) { // Create distributor ds, ingesters, _ := prepare(t, prepConfig{ - numIngesters: numIngesters, - happyIngesters: numIngesters, - numDistributors: 1, - shuffleShardEnabled: testData.shuffleShardEnabled, - shuffleShardSize: testData.shuffleShardSize, - limits: nil, + numIngesters: numIngesters, + happyIngesters: numIngesters, + numDistributors: 1, + shuffleShardSize: testData.shuffleShardSize, + limits: nil, }) // Push metadata @@ -2439,7 +2388,6 @@ func mockWriteRequest(lbls labels.Labels, value float64, timestampMs int64) *mim type prepConfig struct { numIngesters, happyIngesters int queryDelay time.Duration - shuffleShardEnabled bool shuffleShardSize int limits *validation.Limits numDistributors int @@ -2553,13 +2501,8 @@ func prepare(t *testing.T, cfg prepConfig) ([]*Distributor, []mockIngester, []*p distributorCfg.SkipLabelNameValidation = cfg.skipLabelNameValidation distributorCfg.InstanceLimits.MaxInflightPushRequests = cfg.maxInflightRequests distributorCfg.InstanceLimits.MaxIngestionRate = cfg.maxIngestionRate - - if cfg.shuffleShardEnabled { - distributorCfg.ShardingStrategy = util.ShardingStrategyShuffle - distributorCfg.ShuffleShardingLookbackPeriod = time.Hour - - cfg.limits.IngestionTenantShardSize = cfg.shuffleShardSize - } + distributorCfg.ShuffleShardingLookbackPeriod = time.Hour + cfg.limits.IngestionTenantShardSize = cfg.shuffleShardSize if cfg.enableTracker { codec := GetReplicaDescCodec() diff --git a/pkg/distributor/query.go b/pkg/distributor/query.go index b314587ea82..ca1538e50f4 100644 --- a/pkg/distributor/query.go +++ b/pkg/distributor/query.go @@ -22,7 +22,6 @@ import ( "github.com/grafana/mimir/pkg/mimirpb" "github.com/grafana/mimir/pkg/querier/stats" "github.com/grafana/mimir/pkg/tenant" - "github.com/grafana/mimir/pkg/util" "github.com/grafana/mimir/pkg/util/limiter" "github.com/grafana/mimir/pkg/util/validation" ) @@ -89,15 +88,13 @@ func (d *Distributor) GetIngestersForQuery(ctx context.Context, matchers ...*lab return ring.ReplicationSet{}, err } - // If shuffle sharding is enabled we should only query ingesters which are + // If tenant uses shuffle sharding, we should only query ingesters which are // part of the tenant's subring. - if d.cfg.ShardingStrategy == util.ShardingStrategyShuffle { - shardSize := d.limits.IngestionTenantShardSize(userID) - lookbackPeriod := d.cfg.ShuffleShardingLookbackPeriod + shardSize := d.limits.IngestionTenantShardSize(userID) + lookbackPeriod := d.cfg.ShuffleShardingLookbackPeriod - if shardSize > 0 && lookbackPeriod > 0 { - return d.ingestersRing.ShuffleShardWithLookback(userID, shardSize, lookbackPeriod, time.Now()).GetReplicationSetForOperation(ring.Read) - } + if shardSize > 0 && lookbackPeriod > 0 { + return d.ingestersRing.ShuffleShardWithLookback(userID, shardSize, lookbackPeriod, time.Now()).GetReplicationSetForOperation(ring.Read) } return d.ingestersRing.GetReplicationSetForOperation(ring.Read) @@ -111,15 +108,13 @@ func (d *Distributor) GetIngestersForMetadata(ctx context.Context) (ring.Replica return ring.ReplicationSet{}, err } - // If shuffle sharding is enabled we should only query ingesters which are + // If tenant uses shuffle sharding, we should only query ingesters which are // part of the tenant's subring. - if d.cfg.ShardingStrategy == util.ShardingStrategyShuffle { - shardSize := d.limits.IngestionTenantShardSize(userID) - lookbackPeriod := d.cfg.ShuffleShardingLookbackPeriod + shardSize := d.limits.IngestionTenantShardSize(userID) + lookbackPeriod := d.cfg.ShuffleShardingLookbackPeriod - if shardSize > 0 && lookbackPeriod > 0 { - return d.ingestersRing.ShuffleShardWithLookback(userID, shardSize, lookbackPeriod, time.Now()).GetReplicationSetForOperation(ring.Read) - } + if shardSize > 0 && lookbackPeriod > 0 { + return d.ingestersRing.ShuffleShardWithLookback(userID, shardSize, lookbackPeriod, time.Now()).GetReplicationSetForOperation(ring.Read) } return d.ingestersRing.GetReplicationSetForOperation(ring.Read) diff --git a/pkg/ingester/ingester.go b/pkg/ingester/ingester.go index 984d0d988da..a37f1b2f45f 100644 --- a/pkg/ingester/ingester.go +++ b/pkg/ingester/ingester.go @@ -133,10 +133,6 @@ type Config struct { // Runtime-override for type of streaming query to use (chunks or samples). StreamTypeFn func() QueryStreamType `yaml:"-"` - // Injected at runtime and read from the distributor config, required - // to accurately apply global limits. - DistributorShardingStrategy string `yaml:"-"` - DefaultLimits InstanceLimits `yaml:"instance_limits"` InstanceLimitsFn func() *InstanceLimits `yaml:"-"` @@ -315,7 +311,6 @@ func New(cfg Config, clientConfig client.Config, limits *validation.Overrides, r i.limiter = NewLimiter( limits, i.lifecycler, - cfg.DistributorShardingStrategy, cfg.LifecyclerConfig.RingConfig.ReplicationFactor, cfg.LifecyclerConfig.RingConfig.ZoneAwarenessEnabled) diff --git a/pkg/ingester/limiter.go b/pkg/ingester/limiter.go index 724f62945db..567ee7c82a7 100644 --- a/pkg/ingester/limiter.go +++ b/pkg/ingester/limiter.go @@ -33,27 +33,24 @@ type RingCount interface { // Limiter implements primitives to get the maximum number of series // an ingester can handle for a specific tenant type Limiter struct { - limits *validation.Overrides - ring RingCount - replicationFactor int - shuffleShardingEnabled bool - zoneAwarenessEnabled bool + limits *validation.Overrides + ring RingCount + replicationFactor int + zoneAwarenessEnabled bool } // NewLimiter makes a new in-memory series limiter func NewLimiter( limits *validation.Overrides, ring RingCount, - shardingStrategy string, replicationFactor int, zoneAwarenessEnabled bool, ) *Limiter { return &Limiter{ - limits: limits, - ring: ring, - replicationFactor: replicationFactor, - shuffleShardingEnabled: shardingStrategy == util.ShardingStrategyShuffle, - zoneAwarenessEnabled: zoneAwarenessEnabled, + limits: limits, + ring: ring, + replicationFactor: replicationFactor, + zoneAwarenessEnabled: zoneAwarenessEnabled, } } @@ -204,10 +201,6 @@ func (l *Limiter) convertGlobalToLocalLimit(userID string, globalLimit int) int } func (l *Limiter) getShardSize(userID string) int { - if !l.shuffleShardingEnabled { - return 0 - } - return l.limits.IngestionTenantShardSize(userID) } diff --git a/pkg/ingester/limiter_test.go b/pkg/ingester/limiter_test.go index 9e308c30384..69e1ee53b24 100644 --- a/pkg/ingester/limiter_test.go +++ b/pkg/ingester/limiter_test.go @@ -14,7 +14,6 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/grafana/mimir/pkg/util" "github.com/grafana/mimir/pkg/util/validation" ) @@ -78,34 +77,55 @@ func runLimiterMaxFunctionTest( ringIngesterCount int ringZonesCount int shardSize int - expectedDefaultSharding int - expectedShuffleSharding int + expectedValue int }{ "limit is disabled": { - globalLimit: 0, - ringReplicationFactor: 1, - ringIngesterCount: 1, - ringZonesCount: 1, - expectedDefaultSharding: math.MaxInt32, - expectedShuffleSharding: math.MaxInt32, + globalLimit: 0, + ringReplicationFactor: 1, + ringIngesterCount: 1, + ringZonesCount: 1, + expectedValue: math.MaxInt32, }, - "limit is enabled with replication-factor=1": { - globalLimit: 1000, - ringReplicationFactor: 1, - ringIngesterCount: 10, - ringZonesCount: 1, - shardSize: 5, - expectedDefaultSharding: 100, - expectedShuffleSharding: 200, + "limit is enabled with replication-factor=1, shard size 0": { + globalLimit: 1000, + ringReplicationFactor: 1, + ringIngesterCount: 10, + ringZonesCount: 1, + shardSize: 0, + expectedValue: 100, }, - "limit is enabled with replication-factor=3": { - globalLimit: 1000, - ringReplicationFactor: 3, - ringIngesterCount: 10, - ringZonesCount: 1, - shardSize: 5, - expectedDefaultSharding: 300, - expectedShuffleSharding: 600, + "limit is enabled with replication-factor=1, shard size 5": { + globalLimit: 1000, + ringReplicationFactor: 1, + ringIngesterCount: 10, + ringZonesCount: 1, + shardSize: 5, + expectedValue: 200, + }, + "limit is enabled with replication-factor=3, shard size 0": { + globalLimit: 1000, + ringReplicationFactor: 3, + ringIngesterCount: 10, + ringZonesCount: 1, + shardSize: 0, + expectedValue: 300, + }, + "limit is enabled with replication-factor=3, shard size 5": { + globalLimit: 1000, + ringReplicationFactor: 3, + ringIngesterCount: 10, + ringZonesCount: 1, + shardSize: 5, + expectedValue: 600, + }, + "zone-awareness enabled, limit enabled and the shard size is 0": { + globalLimit: 900, + ringReplicationFactor: 3, + ringZoneAwarenessEnabled: true, + ringIngesterCount: 9, + ringZonesCount: 3, + shardSize: 0, + expectedValue: 300, }, "zone-awareness enabled, limit enabled and the shard size is NOT divisible by number of zones": { globalLimit: 900, @@ -113,9 +133,8 @@ func runLimiterMaxFunctionTest( ringZoneAwarenessEnabled: true, ringIngesterCount: 9, ringZonesCount: 3, - shardSize: 5, // Not divisible by number of zones. - expectedDefaultSharding: 300, - expectedShuffleSharding: 450, // (900 / 6) * 3 + shardSize: 5, // Not divisible by number of zones. + expectedValue: 450, // (900 / 6) * 3 }, "zone-awareness enabled, limit enabled and the shard size is divisible by number of zones": { globalLimit: 900, @@ -123,9 +142,8 @@ func runLimiterMaxFunctionTest( ringZoneAwarenessEnabled: true, ringIngesterCount: 9, ringZonesCount: 3, - shardSize: 6, // Divisible by number of zones. - expectedDefaultSharding: 300, - expectedShuffleSharding: 450, // (900 / 6) * 3 + shardSize: 6, // Divisible by number of zones. + expectedValue: 450, // (900 / 6) * 3 }, "zone-awareness enabled, limit enabled and the shard size > number of ingesters": { globalLimit: 900, @@ -134,8 +152,7 @@ func runLimiterMaxFunctionTest( ringIngesterCount: 9, ringZonesCount: 3, shardSize: 20, // Greater than number of ingesters. - expectedDefaultSharding: 300, - expectedShuffleSharding: 300, + expectedValue: 300, }, } @@ -155,15 +172,9 @@ func runLimiterMaxFunctionTest( overrides, err := validation.NewOverrides(limits, nil) require.NoError(t, err) - // Assert on default sharding strategy. - limiter := NewLimiter(overrides, ring, util.ShardingStrategyDefault, testData.ringReplicationFactor, testData.ringZoneAwarenessEnabled) + limiter := NewLimiter(overrides, ring, testData.ringReplicationFactor, testData.ringZoneAwarenessEnabled) actual := runMaxFn(limiter) - assert.Equal(t, testData.expectedDefaultSharding, actual) - - // Assert on shuffle sharding strategy. - limiter = NewLimiter(overrides, ring, util.ShardingStrategyShuffle, testData.ringReplicationFactor, testData.ringZoneAwarenessEnabled) - actual = runMaxFn(limiter) - assert.Equal(t, testData.expectedShuffleSharding, actual) + assert.Equal(t, testData.expectedValue, actual) }) } } @@ -214,7 +225,7 @@ func TestLimiter_AssertMaxSeriesPerMetric(t *testing.T) { }, nil) require.NoError(t, err) - limiter := NewLimiter(limits, ring, util.ShardingStrategyDefault, testData.ringReplicationFactor, false) + limiter := NewLimiter(limits, ring, testData.ringReplicationFactor, false) actual := limiter.AssertMaxSeriesPerMetric("test", testData.series) assert.Equal(t, testData.expected, actual) @@ -267,7 +278,7 @@ func TestLimiter_AssertMaxMetadataPerMetric(t *testing.T) { }, nil) require.NoError(t, err) - limiter := NewLimiter(limits, ring, util.ShardingStrategyDefault, testData.ringReplicationFactor, false) + limiter := NewLimiter(limits, ring, testData.ringReplicationFactor, false) actual := limiter.AssertMaxMetadataPerMetric("test", testData.metadata) assert.Equal(t, testData.expected, actual) @@ -321,7 +332,7 @@ func TestLimiter_AssertMaxSeriesPerUser(t *testing.T) { }, nil) require.NoError(t, err) - limiter := NewLimiter(limits, ring, util.ShardingStrategyDefault, testData.ringReplicationFactor, false) + limiter := NewLimiter(limits, ring, testData.ringReplicationFactor, false) actual := limiter.AssertMaxSeriesPerUser("test", testData.series) assert.Equal(t, testData.expected, actual) @@ -375,7 +386,7 @@ func TestLimiter_AssertMaxMetricsWithMetadataPerUser(t *testing.T) { }, nil) require.NoError(t, err) - limiter := NewLimiter(limits, ring, util.ShardingStrategyDefault, testData.ringReplicationFactor, false) + limiter := NewLimiter(limits, ring, testData.ringReplicationFactor, false) actual := limiter.AssertMaxMetricsWithMetadataPerUser("test", testData.metadata) assert.Equal(t, testData.expected, actual) @@ -398,7 +409,7 @@ func TestLimiter_FormatError(t *testing.T) { }, nil) require.NoError(t, err) - limiter := NewLimiter(limits, ring, util.ShardingStrategyDefault, 3, false) + limiter := NewLimiter(limits, ring, 3, false) actual := limiter.FormatError("user-1", errMaxSeriesPerUserLimitExceeded) assert.EqualError(t, actual, "per-user series limit of 100 exceeded, please contact administrator to raise it (per-ingester local limit: 100)") diff --git a/pkg/mimir/modules.go b/pkg/mimir/modules.go index f3be8051410..62222fccf2f 100644 --- a/pkg/mimir/modules.go +++ b/pkg/mimir/modules.go @@ -429,7 +429,6 @@ func (t *Mimir) tsdbIngesterConfig() { func (t *Mimir) initIngesterService() (serv services.Service, err error) { t.Cfg.Ingester.LifecyclerConfig.RingConfig.KVStore.Multi.ConfigProvider = multiClientRuntimeConfigChannel(t.RuntimeConfig) t.Cfg.Ingester.LifecyclerConfig.ListenPort = t.Cfg.Server.GRPCListenPort - t.Cfg.Ingester.DistributorShardingStrategy = t.Cfg.Distributor.ShardingStrategy t.Cfg.Ingester.StreamTypeFn = ingesterChunkStreaming(t.RuntimeConfig) t.Cfg.Ingester.InstanceLimitsFn = ingesterInstanceLimits(t.RuntimeConfig) t.tsdbIngesterConfig() diff --git a/pkg/util/validation/limits.go b/pkg/util/validation/limits.go index f0c5b505305..fa6ae8eae30 100644 --- a/pkg/util/validation/limits.go +++ b/pkg/util/validation/limits.go @@ -113,7 +113,7 @@ type Limits struct { // RegisterFlags adds the flags required to config this to the given FlagSet func (l *Limits) RegisterFlags(f *flag.FlagSet) { - f.IntVar(&l.IngestionTenantShardSize, "distributor.ingestion-tenant-shard-size", 0, "The tenant's shard size when the shuffle-sharding strategy is used. Must be set both on ingesters and distributors. When this setting is specified in the per-tenant overrides, a value of 0 disables shuffle sharding for the tenant.") + f.IntVar(&l.IngestionTenantShardSize, "distributor.ingestion-tenant-shard-size", 0, "The tenant's shard size used by shuffle-sharding. Must be set both on ingesters and distributors. 0 disables shuffle sharding.") f.Float64Var(&l.IngestionRate, "distributor.ingestion-rate-limit", 10000, "Per-user ingestion rate limit in samples per second.") f.IntVar(&l.IngestionBurstSize, "distributor.ingestion-burst-size", 200000, "Per-user allowed ingestion burst size (in number of samples).") f.BoolVar(&l.AcceptHASamples, "distributor.ha-tracker.enable-for-all-users", false, "Flag to enable, for all users, handling of samples with external labels identifying replicas in an HA Prometheus setup.") From f301cab2cbe55c0f2fdecb0d8f08e79fd6771684 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Wed, 26 Jan 2022 12:16:30 +0100 Subject: [PATCH 006/168] Rename default image config field from 'cortex' to 'mimir' (#896) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 8 +++++++ operations/mimir/images.libsonnet | 23 ++++++++++--------- operations/mimir/overrides-exporter.libsonnet | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e82f7941afc..b0f3681d2b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -511,6 +511,14 @@ compactor_tenant_shard_size: 2, compactor_split_groups: 2, ``` +* [CHANGE] The default image config field has been renamed from `cortex` to `mimir`. #896 + ``` + { + _images+:: { + mimir: '...', + }, + } + ``` * [FEATURE] Added query sharding support. It can be enabled setting `cortex_query_sharding_enabled: true` in the `_config` object. #653 * [ENHANCEMENT] Add overrides config to compactor. This allows setting retention configs per user. [#386](https://github.com/grafana/cortex-jsonnet/pull/386) * [ENHANCEMENT] Added 256MB memory ballast to querier. [#369](https://github.com/grafana/cortex-jsonnet/pull/369) diff --git a/operations/mimir/images.libsonnet b/operations/mimir/images.libsonnet index 5cb99bcad51..78f758988d2 100644 --- a/operations/mimir/images.libsonnet +++ b/operations/mimir/images.libsonnet @@ -5,18 +5,19 @@ memcachedExporter: 'prom/memcached-exporter:v0.6.0', // Our services. - cortex: 'cortexproject/cortex:v1.9.0', + mimir: 'cortexproject/cortex:v1.9.0', - alertmanager: self.cortex, - distributor: self.cortex, - ingester: self.cortex, - querier: self.cortex, - query_frontend: self.cortex, - compactor: self.cortex, - flusher: self.cortex, - ruler: self.cortex, - store_gateway: self.cortex, - query_scheduler: self.cortex, + alertmanager: self.mimir, + distributor: self.mimir, + ingester: self.mimir, + querier: self.mimir, + query_frontend: self.mimir, + compactor: self.mimir, + flusher: self.mimir, + ruler: self.mimir, + store_gateway: self.mimir, + query_scheduler: self.mimir, + overrides_exporter: self.mimir, query_tee: 'quay.io/cortexproject/query-tee:v1.9.0', testExporter: 'cortexproject/test-exporter:v1.9.0', diff --git a/operations/mimir/overrides-exporter.libsonnet b/operations/mimir/overrides-exporter.libsonnet index ae8d7b914cd..cb4107d186f 100644 --- a/operations/mimir/overrides-exporter.libsonnet +++ b/operations/mimir/overrides-exporter.libsonnet @@ -29,7 +29,7 @@ local container = $.core.v1.container, overrides_exporter_container:: - container.new(name, $._images.cortex) + + container.new(name, $._images.overrides_exporter) + container.withPorts([ $.overrides_exporter_port, ]) + From e4ac570e3525ab29c00dff88ecc60d555ad48493 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Wed, 26 Jan 2022 12:29:41 +0100 Subject: [PATCH 007/168] Rename entrypoint jsonnet from cortex.libsonnet to mimir.libsonnet (#897) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 1 + operations/mimir-tests/test-disable-chunk-streaming.jsonnet | 2 +- operations/mimir-tests/test-query-sharding.jsonnet | 2 +- operations/mimir-tests/test-storage-azure.jsonnet | 2 +- operations/mimir-tests/test-storage-gcs.jsonnet | 2 +- operations/mimir-tests/test-storage-s3.jsonnet | 2 +- operations/mimir/mimir-manifests.jsonnet.example | 2 +- operations/mimir/{cortex.libsonnet => mimir.libsonnet} | 0 operations/mimir/query-scheduler.libsonnet | 2 +- 9 files changed, 8 insertions(+), 7 deletions(-) rename operations/mimir/{cortex.libsonnet => mimir.libsonnet} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0f3681d2b2..dc5359b6df0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -511,6 +511,7 @@ compactor_tenant_shard_size: 2, compactor_split_groups: 2, ``` +* [CHANGE] The entrypoint file to include has been renamed from `cortex.libsonnet` to `mimir.libsonnet`. #897 * [CHANGE] The default image config field has been renamed from `cortex` to `mimir`. #896 ``` { diff --git a/operations/mimir-tests/test-disable-chunk-streaming.jsonnet b/operations/mimir-tests/test-disable-chunk-streaming.jsonnet index 003ba019289..60614c9dcbc 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming.jsonnet +++ b/operations/mimir-tests/test-disable-chunk-streaming.jsonnet @@ -1,4 +1,4 @@ -local mimir = import 'mimir/cortex.libsonnet'; +local mimir = import 'mimir/mimir.libsonnet'; mimir { _config+:: { diff --git a/operations/mimir-tests/test-query-sharding.jsonnet b/operations/mimir-tests/test-query-sharding.jsonnet index fe593dfc5ec..2d99a716dd6 100644 --- a/operations/mimir-tests/test-query-sharding.jsonnet +++ b/operations/mimir-tests/test-query-sharding.jsonnet @@ -1,4 +1,4 @@ -local mimir = import 'mimir/cortex.libsonnet'; +local mimir = import 'mimir/mimir.libsonnet'; mimir { _config+:: { diff --git a/operations/mimir-tests/test-storage-azure.jsonnet b/operations/mimir-tests/test-storage-azure.jsonnet index 90e41cb5a80..0928718d0af 100644 --- a/operations/mimir-tests/test-storage-azure.jsonnet +++ b/operations/mimir-tests/test-storage-azure.jsonnet @@ -1,4 +1,4 @@ -local mimir = import 'mimir/cortex.libsonnet'; +local mimir = import 'mimir/mimir.libsonnet'; mimir { _config+:: { diff --git a/operations/mimir-tests/test-storage-gcs.jsonnet b/operations/mimir-tests/test-storage-gcs.jsonnet index da9b3c222b2..a01c1e34e29 100644 --- a/operations/mimir-tests/test-storage-gcs.jsonnet +++ b/operations/mimir-tests/test-storage-gcs.jsonnet @@ -1,4 +1,4 @@ -local mimir = import 'mimir/cortex.libsonnet'; +local mimir = import 'mimir/mimir.libsonnet'; mimir { _config+:: { diff --git a/operations/mimir-tests/test-storage-s3.jsonnet b/operations/mimir-tests/test-storage-s3.jsonnet index f2e859ea538..6b62aeb7398 100644 --- a/operations/mimir-tests/test-storage-s3.jsonnet +++ b/operations/mimir-tests/test-storage-s3.jsonnet @@ -1,4 +1,4 @@ -local mimir = import 'mimir/cortex.libsonnet'; +local mimir = import 'mimir/mimir.libsonnet'; mimir { _config+:: { diff --git a/operations/mimir/mimir-manifests.jsonnet.example b/operations/mimir/mimir-manifests.jsonnet.example index 2deb1ff1cab..a5841bb4db4 100644 --- a/operations/mimir/mimir-manifests.jsonnet.example +++ b/operations/mimir/mimir-manifests.jsonnet.example @@ -1,4 +1,4 @@ -local mimir = import "mimir/cortex.libsonnet"; +local mimir = import "mimir/mimir.libsonnet"; mimir { _config+:: { diff --git a/operations/mimir/cortex.libsonnet b/operations/mimir/mimir.libsonnet similarity index 100% rename from operations/mimir/cortex.libsonnet rename to operations/mimir/mimir.libsonnet diff --git a/operations/mimir/query-scheduler.libsonnet b/operations/mimir/query-scheduler.libsonnet index 604d258a6c5..51f1ea2cf63 100644 --- a/operations/mimir/query-scheduler.libsonnet +++ b/operations/mimir/query-scheduler.libsonnet @@ -1,4 +1,4 @@ -// Query-scheduler is optional service. When query-scheduler.libsonnet is added to Cortex, querier and frontend +// Query-scheduler is optional service. When query-scheduler.libsonnet is added to Mimir, querier and frontend // are reconfigured to use query-scheduler service. { local container = $.core.v1.container, From 7f776ccd967139382853a19cdb02923dd6e78c3d Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Wed, 26 Jan 2022 12:42:27 +0100 Subject: [PATCH 008/168] Removed prefix at all (#898) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 17 +++++++++++ .../test-disable-chunk-streaming.jsonnet | 2 +- .../mimir-tests/test-query-sharding.jsonnet | 4 +-- .../mimir-tests/test-storage-azure.jsonnet | 2 +- .../mimir-tests/test-storage-gcs.jsonnet | 2 +- .../mimir-tests/test-storage-s3.jsonnet | 2 +- operations/mimir/compactor.libsonnet | 10 +++---- operations/mimir/config.libsonnet | 30 +++++++++---------- operations/mimir/distributor.libsonnet | 2 +- operations/mimir/ingester.libsonnet | 4 +-- operations/mimir/querier.libsonnet | 2 +- operations/mimir/query-frontend.libsonnet | 2 +- operations/mimir/query-sharding.libsonnet | 18 +++++------ operations/mimir/ruler.libsonnet | 2 +- operations/mimir/store-gateway.libsonnet | 4 +-- 15 files changed, 60 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc5359b6df0..c07876640ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -520,6 +520,23 @@ }, } ``` +* [CHANGE] Removed `cortex_` prefix from config fields. #898 + * The following config fields have been renamed: + * `cortex_bucket_index_enabled` renamed to `bucket_index_enabled` + * `cortex_compactor_cleanup_interval` renamed to `compactor_cleanup_interval` + * `cortex_compactor_data_disk_class` renamed to `compactor_data_disk_class` + * `cortex_compactor_data_disk_size` renamed to `compactor_data_disk_size` + * `cortex_compactor_max_concurrency` renamed to `compactor_max_concurrency` + * `cortex_distributor_allow_multiple_replicas_on_same_node` renamed to `distributor_allow_multiple_replicas_on_same_node` + * `cortex_ingester_data_disk_class` renamed to `ingester_data_disk_class` + * `cortex_ingester_data_disk_size` renamed to `ingester_data_disk_size` + * `cortex_querier_allow_multiple_replicas_on_same_node` renamed to `querier_allow_multiple_replicas_on_same_node` + * `cortex_query_frontend_allow_multiple_replicas_on_same_node` renamed to `query_frontend_allow_multiple_replicas_on_same_node` + * `cortex_query_sharding_enabled` renamed to `query_sharding_enabled` + * `cortex_query_sharding_msg_size_factor` renamed to `query_sharding_msg_size_factor` + * `cortex_ruler_allow_multiple_replicas_on_same_node` renamed to `ruler_allow_multiple_replicas_on_same_node` + * `cortex_store_gateway_data_disk_class` renamed to `store_gateway_data_disk_class` + * `cortex_store_gateway_data_disk_size` renamed to `store_gateway_data_disk_size` * [FEATURE] Added query sharding support. It can be enabled setting `cortex_query_sharding_enabled: true` in the `_config` object. #653 * [ENHANCEMENT] Add overrides config to compactor. This allows setting retention configs per user. [#386](https://github.com/grafana/cortex-jsonnet/pull/386) * [ENHANCEMENT] Added 256MB memory ballast to querier. [#369](https://github.com/grafana/cortex-jsonnet/pull/369) diff --git a/operations/mimir-tests/test-disable-chunk-streaming.jsonnet b/operations/mimir-tests/test-disable-chunk-streaming.jsonnet index 60614c9dcbc..4621f004cf5 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming.jsonnet +++ b/operations/mimir-tests/test-disable-chunk-streaming.jsonnet @@ -7,7 +7,7 @@ mimir { blocks_storage_backend: 'gcs', blocks_storage_bucket_name: 'blocks-bucket', - cortex_bucket_index_enabled: true, + bucket_index_enabled: true, query_scheduler_enabled: true, ruler_enabled: true, diff --git a/operations/mimir-tests/test-query-sharding.jsonnet b/operations/mimir-tests/test-query-sharding.jsonnet index 2d99a716dd6..ec8a4611703 100644 --- a/operations/mimir-tests/test-query-sharding.jsonnet +++ b/operations/mimir-tests/test-query-sharding.jsonnet @@ -7,7 +7,7 @@ mimir { blocks_storage_backend: 'gcs', blocks_storage_bucket_name: 'blocks-bucket', - cortex_bucket_index_enabled: true, + bucket_index_enabled: true, query_scheduler_enabled: true, ruler_enabled: true, @@ -21,6 +21,6 @@ mimir { sharding_enabled: true, }, - cortex_query_sharding_enabled: true, + query_sharding_enabled: true, }, } diff --git a/operations/mimir-tests/test-storage-azure.jsonnet b/operations/mimir-tests/test-storage-azure.jsonnet index 0928718d0af..a40c195787f 100644 --- a/operations/mimir-tests/test-storage-azure.jsonnet +++ b/operations/mimir-tests/test-storage-azure.jsonnet @@ -9,7 +9,7 @@ mimir { blocks_storage_bucket_name: 'blocks-bucket', blocks_storage_azure_account_name: 'blocks-account-name', blocks_storage_azure_account_key: 'blocks-account-key', - cortex_bucket_index_enabled: true, + bucket_index_enabled: true, query_scheduler_enabled: true, ruler_enabled: true, diff --git a/operations/mimir-tests/test-storage-gcs.jsonnet b/operations/mimir-tests/test-storage-gcs.jsonnet index a01c1e34e29..bccb83690b6 100644 --- a/operations/mimir-tests/test-storage-gcs.jsonnet +++ b/operations/mimir-tests/test-storage-gcs.jsonnet @@ -7,7 +7,7 @@ mimir { blocks_storage_backend: 'gcs', blocks_storage_bucket_name: 'blocks-bucket', - cortex_bucket_index_enabled: true, + bucket_index_enabled: true, query_scheduler_enabled: true, ruler_enabled: true, diff --git a/operations/mimir-tests/test-storage-s3.jsonnet b/operations/mimir-tests/test-storage-s3.jsonnet index 6b62aeb7398..2c44fdfe29d 100644 --- a/operations/mimir-tests/test-storage-s3.jsonnet +++ b/operations/mimir-tests/test-storage-s3.jsonnet @@ -8,7 +8,7 @@ mimir { blocks_storage_backend: 's3', blocks_storage_bucket_name: 'blocks-bucket', - cortex_bucket_index_enabled: true, + bucket_index_enabled: true, query_scheduler_enabled: true, ruler_enabled: true, diff --git a/operations/mimir/compactor.libsonnet b/operations/mimir/compactor.libsonnet index bb63a68a1db..eb64940fc04 100644 --- a/operations/mimir/compactor.libsonnet +++ b/operations/mimir/compactor.libsonnet @@ -16,8 +16,8 @@ 'compactor.block-ranges': '2h,12h,24h', 'compactor.data-dir': '/data', 'compactor.compaction-interval': '30m', - 'compactor.compaction-concurrency': $._config.cortex_compactor_max_concurrency, - 'compactor.cleanup-interval': $._config.cortex_compactor_cleanup_interval, + 'compactor.compaction-concurrency': $._config.compactor_max_concurrency, + 'compactor.cleanup-interval': $._config.compactor_cleanup_interval, // Will be set on per-tenant basis via overrides and user classes. No splitting by default. 'compactor.split-and-merge-shards': 0, @@ -45,9 +45,9 @@ // it does not support horizontal scalability yet. local compactor_data_pvc = pvc.new() + - pvc.mixin.spec.resources.withRequests({ storage: $._config.cortex_compactor_data_disk_size }) + + pvc.mixin.spec.resources.withRequests({ storage: $._config.compactor_data_disk_size }) + pvc.mixin.spec.withAccessModes(['ReadWriteOnce']) + - pvc.mixin.spec.withStorageClassName($._config.cortex_compactor_data_disk_class) + + pvc.mixin.spec.withStorageClassName($._config.compactor_data_disk_class) + pvc.mixin.metadata.withName('compactor-data'), compactor_ports:: $.util.defaultPorts, @@ -58,7 +58,7 @@ container.withArgsMixin($.util.mapToFlags($.compactor_args)) + container.withVolumeMountsMixin([volumeMount.new('compactor-data', '/data')]) + // Do not limit compactor CPU and request enough cores to honor configured max concurrency. - $.util.resourcesRequests($._config.cortex_compactor_max_concurrency, '6Gi') + + $.util.resourcesRequests($._config.compactor_max_concurrency, '6Gi') + $.util.resourcesLimits(null, '6Gi') + $.util.readinessProbe + $.jaeger_mixin, diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index 2d7ecbd6bf3..b320a872db0 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -15,10 +15,10 @@ unregister_ingesters_on_shutdown: true, // Controls whether multiple pods for the same service can be scheduled on the same node. - cortex_distributor_allow_multiple_replicas_on_same_node: false, - cortex_ruler_allow_multiple_replicas_on_same_node: false, - cortex_querier_allow_multiple_replicas_on_same_node: false, - cortex_query_frontend_allow_multiple_replicas_on_same_node: false, + distributor_allow_multiple_replicas_on_same_node: false, + ruler_allow_multiple_replicas_on_same_node: false, + querier_allow_multiple_replicas_on_same_node: false, + query_frontend_allow_multiple_replicas_on_same_node: false, test_exporter_enabled: false, test_exporter_start_time: error 'must specify test exporter start time', @@ -42,25 +42,25 @@ blocks_storage_azure_account_key: if $._config.blocks_storage_backend == 'azure' then error 'must specify azure account key' else '', // Allow to configure the ingester disk. - cortex_ingester_data_disk_size: '100Gi', - cortex_ingester_data_disk_class: 'fast', + ingester_data_disk_size: '100Gi', + ingester_data_disk_class: 'fast', // Allow to configure the store-gateway disk. - cortex_store_gateway_data_disk_size: '50Gi', - cortex_store_gateway_data_disk_class: 'standard', + store_gateway_data_disk_size: '50Gi', + store_gateway_data_disk_class: 'standard', // Allow to configure the compactor disk. - cortex_compactor_data_disk_size: '250Gi', - cortex_compactor_data_disk_class: 'standard', + compactor_data_disk_size: '250Gi', + compactor_data_disk_class: 'standard', // Allow to fine tune compactor. - cortex_compactor_max_concurrency: 1, + compactor_max_concurrency: 1, // While this is the default value, we want to pass the same to the -blocks-storage.bucket-store.sync-interval - cortex_compactor_cleanup_interval: '15m', + compactor_cleanup_interval: '15m', // Enable use of bucket index by querier, ruler and store-gateway. // Bucket index is generated by compactor from Cortex 1.7, there is no flag required to enable this on compactor. - cortex_bucket_index_enabled: false, + bucket_index_enabled: false, store_gateway_replication_factor: 3, @@ -431,10 +431,10 @@ 'blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size': '100', } else {}, - bucket_index_config:: if $._config.cortex_bucket_index_enabled then { + bucket_index_config:: if $._config.bucket_index_enabled then { 'blocks-storage.bucket-store.bucket-index.enabled': true, // Bucket index is updated by compactor on each cleanup cycle. - 'blocks-storage.bucket-store.sync-interval': $._config.cortex_compactor_cleanup_interval, + 'blocks-storage.bucket-store.sync-interval': $._config.compactor_cleanup_interval, } else {}, } diff --git a/operations/mimir/distributor.libsonnet b/operations/mimir/distributor.libsonnet index c536f780468..f5102a66e98 100644 --- a/operations/mimir/distributor.libsonnet +++ b/operations/mimir/distributor.libsonnet @@ -54,7 +54,7 @@ distributor_deployment: deployment.new('distributor', 3, [$.distributor_container], $.distributor_deployment_labels) + - (if $._config.cortex_distributor_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + + (if $._config.distributor_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + deployment.mixin.spec.strategy.rollingUpdate.withMaxSurge(5) + deployment.mixin.spec.strategy.rollingUpdate.withMaxUnavailable(1), diff --git a/operations/mimir/ingester.libsonnet b/operations/mimir/ingester.libsonnet index 444a273f309..3a67a1409de 100644 --- a/operations/mimir/ingester.libsonnet +++ b/operations/mimir/ingester.libsonnet @@ -57,9 +57,9 @@ // volume in order to be crash resilient. local ingester_data_pvc = pvc.new() + - pvc.mixin.spec.resources.withRequests({ storage: $._config.cortex_ingester_data_disk_size }) + + pvc.mixin.spec.resources.withRequests({ storage: $._config.ingester_data_disk_size }) + pvc.mixin.spec.withAccessModes(['ReadWriteOnce']) + - pvc.mixin.spec.withStorageClassName($._config.cortex_ingester_data_disk_class) + + pvc.mixin.spec.withStorageClassName($._config.ingester_data_disk_class) + pvc.mixin.metadata.withName('ingester-data'), newIngesterStatefulSet(name, container, with_anti_affinity=true):: diff --git a/operations/mimir/querier.libsonnet b/operations/mimir/querier.libsonnet index 04a90a639b9..ac0802dc091 100644 --- a/operations/mimir/querier.libsonnet +++ b/operations/mimir/querier.libsonnet @@ -56,7 +56,7 @@ newQuerierDeployment(name, container):: deployment.new(name, $._config.querier.replicas, [container], $.querier_deployment_labels) + - (if $._config.cortex_querier_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + + (if $._config.querier_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + deployment.mixin.spec.strategy.rollingUpdate.withMaxSurge(5) + deployment.mixin.spec.strategy.rollingUpdate.withMaxUnavailable(1), diff --git a/operations/mimir/query-frontend.libsonnet b/operations/mimir/query-frontend.libsonnet index bef29cc3078..14290d53d3d 100644 --- a/operations/mimir/query-frontend.libsonnet +++ b/operations/mimir/query-frontend.libsonnet @@ -52,7 +52,7 @@ newQueryFrontendDeployment(name, container):: deployment.new(name, $._config.queryFrontend.replicas, [container]) + $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + - (if $._config.cortex_query_frontend_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + + (if $._config.query_frontend_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + deployment.mixin.spec.strategy.rollingUpdate.withMaxSurge(1) + deployment.mixin.spec.strategy.rollingUpdate.withMaxUnavailable(1), diff --git a/operations/mimir/query-sharding.libsonnet b/operations/mimir/query-sharding.libsonnet index cc567fb21e2..6cf2602048a 100644 --- a/operations/mimir/query-sharding.libsonnet +++ b/operations/mimir/query-sharding.libsonnet @@ -1,11 +1,11 @@ { _config+: { - cortex_query_sharding_enabled: false, + query_sharding_enabled: false, // Raise the msg size for the GRPC messages query-frontend <-> querier by this factor when query sharding is enabled - cortex_query_sharding_msg_size_factor: 4, + query_sharding_msg_size_factor: 4, - overrides+: if $._config.cortex_query_sharding_enabled then { + overrides+: if $._config.query_sharding_enabled then { // Target 6M active series. big_user+:: { query_sharding_total_shards: 8, @@ -31,9 +31,9 @@ replicas: std.max(super.replicas, min_replicas), }, }, - query_frontend_deployment+: if $._config.cortex_query_sharding_enabled then ensure_replica_ratio_to_queriers else {}, + query_frontend_deployment+: if $._config.query_sharding_enabled then ensure_replica_ratio_to_queriers else {}, - query_frontend_args+:: if !$._config.cortex_query_sharding_enabled then {} else + query_frontend_args+:: if !$._config.query_sharding_enabled then {} else // When sharding is enabled, query-frontend runs PromQL engine internally. $._config.queryEngineConfig { 'frontend.parallelize-shardable-queries': true, @@ -45,15 +45,15 @@ 'frontend.query-sharding-max-sharded-queries': 128, - 'server.grpc-max-recv-msg-size-bytes': super['server.grpc-max-recv-msg-size-bytes'] * $._config.cortex_query_sharding_msg_size_factor, + 'server.grpc-max-recv-msg-size-bytes': super['server.grpc-max-recv-msg-size-bytes'] * $._config.query_sharding_msg_size_factor, }, - query_scheduler_args+:: if !$._config.cortex_query_sharding_enabled then {} else { + query_scheduler_args+:: if !$._config.query_sharding_enabled then {} else { // Query sharding generates a higher order of magnitude of requests. 'query-scheduler.max-outstanding-requests-per-tenant': 800, }, - querier_args+:: if !$._config.cortex_query_sharding_enabled then {} else { + querier_args+:: if !$._config.query_sharding_enabled then {} else { // The expectation is that if sharding is enabled, we would run more but smaller // queries on the queriers. However this can't be extended too far because several // queries (including instant queries) can't be sharded. Therefore, we must strike a balance @@ -62,6 +62,6 @@ 'querier.max-concurrent': 16, // Raise the msg size for the GRPC messages query-frontend <-> querier by a factor when query sharding is enabled - 'querier.frontend-client.grpc-max-send-msg-size': super['querier.frontend-client.grpc-max-send-msg-size'] * $._config.cortex_query_sharding_msg_size_factor, + 'querier.frontend-client.grpc-max-send-msg-size': super['querier.frontend-client.grpc-max-send-msg-size'] * $._config.query_sharding_msg_size_factor, }, } diff --git a/operations/mimir/ruler.libsonnet b/operations/mimir/ruler.libsonnet index ca9500a014a..a0fbd735c69 100644 --- a/operations/mimir/ruler.libsonnet +++ b/operations/mimir/ruler.libsonnet @@ -53,7 +53,7 @@ deployment.mixin.spec.strategy.rollingUpdate.withMaxSurge(0) + deployment.mixin.spec.strategy.rollingUpdate.withMaxUnavailable(1) + deployment.mixin.spec.template.spec.withTerminationGracePeriodSeconds(600) + - (if $._config.cortex_ruler_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + + (if $._config.ruler_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') else {}, diff --git a/operations/mimir/store-gateway.libsonnet b/operations/mimir/store-gateway.libsonnet index ffcfe0399ee..c5eb44d60f0 100644 --- a/operations/mimir/store-gateway.libsonnet +++ b/operations/mimir/store-gateway.libsonnet @@ -8,9 +8,9 @@ // The store-gateway runs a statefulset. local store_gateway_data_pvc = pvc.new() + - pvc.mixin.spec.resources.withRequests({ storage: $._config.cortex_store_gateway_data_disk_size }) + + pvc.mixin.spec.resources.withRequests({ storage: $._config.store_gateway_data_disk_size }) + pvc.mixin.spec.withAccessModes(['ReadWriteOnce']) + - pvc.mixin.spec.withStorageClassName($._config.cortex_store_gateway_data_disk_class) + + pvc.mixin.spec.withStorageClassName($._config.store_gateway_data_disk_class) + pvc.mixin.metadata.withName('store-gateway-data'), store_gateway_args:: From af3a3b57a31a2a1f7cedc0e2b16a4c2149f7d5f8 Mon Sep 17 00:00:00 2001 From: Mauro Stettler Date: Wed, 26 Jan 2022 10:03:26 -0300 Subject: [PATCH 009/168] Populate maintainers list (#792) * set initial list of mimir maintainers Signed-off-by: Mauro Stettler * formatting Signed-off-by: Mauro Stettler * link to maintainer accounts * formatting Signed-off-by: Mauro Stettler * sort Signed-off-by: Mauro Stettler * remove whitespace Signed-off-by: Mauro Stettler * add company names beside maintainers Signed-off-by: Mauro Stettler * newline at end of file Signed-off-by: Mauro Stettler * formatting Signed-off-by: Mauro Stettler * remove people not actively working on Mimir Signed-off-by: Mauro Stettler * update team members and add maintainers per sub-pkgs Signed-off-by: Mauro Stettler * add newline at end of file Signed-off-by: Mauro Stettler * remove krajo Signed-off-by: Mauro Stettler * removing steve Signed-off-by: Mauro Stettler * add cyril as maintainer for frontend and fix formatting Signed-off-by: Mauro Stettler * remove christian simon Signed-off-by: Mauro Stettler * add newline at the end Signed-off-by: Mauro Stettler * include sub-packages in pkg paths Signed-off-by: Mauro Stettler * add comment for Cyril Signed-off-by: Mauro Stettler * add former team members sections Signed-off-by: Mauro Stettler * remove company from previous team members Signed-off-by: Mauro Stettler * use em-dash Signed-off-by: Mauro Stettler * Add krajorama & stevesg to team members Signed-off-by: Richard Hartmann * Update MAINTAINERS.md Signed-off-by: Richard Hartmann Co-authored-by: Richard Hartmann --- GOVERNANCE.md | 23 +++++++++++++++++------ MAINTAINERS.md | 25 ++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/GOVERNANCE.md b/GOVERNANCE.md index e1df4f51a00..cb6ec41f94e 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -48,12 +48,23 @@ In case a member leaves, the [offboarding](#offboarding) procedure is applied. The current team members are: -- Bryan Boreham - [bboreham](https://github.com/bboreham) ([Grafana Labs](https://grafana.com/)) -- Goutham Veeramachaneni - [gouthamve](https://github.com/gouthamve) ([Grafana Labs](https://grafana.com/)) -- Jacob Lisi - [jtlisi](https://github.com/jtlisi) ([Grafana Labs](https://grafana.com/)) -- Marco Pracucci - [pracucci](https://github.com/pracucci) ([Grafana Labs](https://grafana.com/)) -- Peter Štibraný - [pstibrany](https://github.com/pstibrany) ([Grafana Labs](https://grafana.com/)) -- Tom Wilkie - [tomwilkie](https://github.com/tomwilkie) ([Grafana Labs](https://grafana.com/)) +- Arve Knudsen — [@aknuds1](https://github.com/aknuds1) ([Grafana Labs](https://grafana.com/)) +- Bryan Boreham — [@bboreham](https://github.com/bboreham) ([Grafana Labs](https://grafana.com/)) +- George Krajcsovits - [@krajorama](https://github.com/krajorama) ([Grafana Labs](https://grafana.com/)) +- Johanna Ratliff — [@johannaratliff](https://github.com/johannaratliff) ([Grafana Labs](https://grafana.com/)) +- Marco Pracucci — [@pracucci](https://github.com/pracucci) ([Grafana Labs](https://grafana.com/)) +- Mauro Stettler — [@replay](https://github.com/replay) ([Grafana Labs](https://grafana.com/)) +- Nick Pillitteri — [@56quarters](https://github.com/56quarters) ([Grafana Labs](https://grafana.com/)) +- Oleg Zaytsev — [@colega](https://github.com/colega) ([Grafana Labs](https://grafana.com/)) +- Peter Štibraný — [@pstibrany](https://github.com/pstibrany) ([Grafana Labs](https://grafana.com/)) +- Steve Simpson - [@stevesg](https://github.com/stevesg) ([Grafana Labs](https://grafana.com/)) +- Tyler Reid — [@treid314](https://github.com/treid314) ([Grafana Labs](https://grafana.com/)) + +Previous team members: + +- Goutham Veeramachaneni — [@gouthamve](https://github.com/gouthamve) +- Jacob Lisi — [@jtlisi](https://github.com/jtlisi) +- Tom Wilkie — [@tomwilkie](https://github.com/tomwilkie) ### Maintainers diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 91c8aa9bdeb..9727a7ad031 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1 +1,24 @@ -There are currently no default maintainer or codebase-specific maintainers. Please see the list of maintainers in our [governance](GOVERNANCE.md). +The following are the main/default maintainers: + +- Arve Knudsen — [@aknuds1](https://github.com/aknuds1) ([Grafana Labs](https://grafana.com/)) +- Bryan Boreham — [@bboreham](https://github.com/bboreham) ([Grafana Labs](https://grafana.com/)) +- George Krajcsovits - [@krajorama](https://github.com/krajorama) ([Grafana Labs](https://grafana.com/)) +- Johanna Ratliff — [@johannaratliff](https://github.com/johannaratliff) ([Grafana Labs](https://grafana.com/)) +- Marco Pracucci — [@pracucci](https://github.com/pracucci) ([Grafana Labs](https://grafana.com/)) +- Mauro Stettler — [@replay](https://github.com/replay) ([Grafana Labs](https://grafana.com/)) +- Nick Pillitteri — [@56quarters](https://github.com/56quarters) ([Grafana Labs](https://grafana.com/)) +- Oleg Zaytsev — [@colega](https://github.com/colega) ([Grafana Labs](https://grafana.com/)) +- Peter Štibraný — [@pstibrany](https://github.com/pstibrany) ([Grafana Labs](https://grafana.com/)) +- Steve Simpson - [@stevesg](https://github.com/stevesg) ([Grafana Labs](https://grafana.com/)) +- Tyler Reid — [@treid314](https://github.com/treid314) ([Grafana Labs](https://grafana.com/)) + +Some parts of the codebase have other maintainers, the package paths also include all sub-packages: + +- `docs`: + - Ursula Kallio — [@osg-grafana](https://github.com/osg-grafana) ([Grafana Labs](https://grafana.com/)) +- `pkg/ruler`: + - Josh Abreu Mesa — [@gotjosh](https://github.com/gotjosh) ([Grafana Labs](https://grafana.com/)) +- `pkg/alertmanager`: + - Josh Abreu Mesa — [@gotjosh](https://github.com/gotjosh) ([Grafana Labs](https://grafana.com/)) +- `pkg/frontend`: + - Cyril Tovena — [@cyriltovena](https://github.com/cyriltovena) ([Grafana Labs](https://grafana.com/)) # limited to reviews From d96dac8501fcf575a9dfaabee669cb8ec64696df Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Wed, 26 Jan 2022 14:53:34 +0100 Subject: [PATCH 010/168] Mimir: Refactor test code to use t.TempDir (#900) Signed-off-by: Arve Knudsen --- cmd/mimir/main_test.go | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/cmd/mimir/main_test.go b/cmd/mimir/main_test.go index a14068fd52f..b84f25743eb 100644 --- a/cmd/mimir/main_test.go +++ b/cmd/mimir/main_test.go @@ -9,8 +9,8 @@ import ( "bytes" "flag" "io" - "io/ioutil" "os" + "path/filepath" "strings" "sync" "testing" @@ -116,18 +116,12 @@ func testSingle(t *testing.T, arguments []string, yaml string, stdoutMessage, st defer restoreIfNeeded() if yaml != "" { - tempFile, err := ioutil.TempFile("", "test") + tempDir := t.TempDir() + fpath := filepath.Join(tempDir, "test") + err := os.WriteFile(fpath, []byte(yaml), 0600) require.NoError(t, err) - defer func() { - require.NoError(t, tempFile.Close()) - require.NoError(t, os.Remove(tempFile.Name())) - }() - - _, err = tempFile.WriteString(yaml) - require.NoError(t, err) - - arguments = append(arguments, "-"+configFileOption, tempFile.Name()) + arguments = append(arguments, "-"+configFileOption, fpath) } arguments = append([]string{"./mimir"}, arguments...) From 91f04d2b2279dad37b82a0448111ca1666d183f4 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Wed, 26 Jan 2022 14:59:38 +0100 Subject: [PATCH 011/168] Rename the default overrides mountpoint from /etc/cortex to /etc/mimir (#899) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 1 + .../mimir-mixin/alerts/alerts.libsonnet | 2 +- ...est-disable-chunk-streaming-generated.yaml | 34 +++++++++---------- .../test-query-sharding-generated.yaml | 34 +++++++++---------- .../test-storage-azure-generated.yaml | 34 +++++++++---------- .../test-storage-gcs-generated.yaml | 34 +++++++++---------- .../test-storage-s3-generated.yaml | 34 +++++++++---------- operations/mimir/alertmanager.libsonnet | 4 +-- operations/mimir/compactor.libsonnet | 4 +-- operations/mimir/config.libsonnet | 3 +- operations/mimir/distributor.libsonnet | 4 +-- operations/mimir/flusher-job-blocks.libsonnet | 2 +- operations/mimir/ingester.libsonnet | 4 +-- operations/mimir/overrides-exporter.libsonnet | 4 +-- operations/mimir/querier.libsonnet | 2 +- operations/mimir/query-frontend.libsonnet | 4 +-- operations/mimir/query-scheduler.libsonnet | 2 +- operations/mimir/ruler.libsonnet | 2 +- operations/mimir/store-gateway.libsonnet | 4 +-- 19 files changed, 107 insertions(+), 105 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c07876640ae..aeadd5722ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -537,6 +537,7 @@ * `cortex_ruler_allow_multiple_replicas_on_same_node` renamed to `ruler_allow_multiple_replicas_on_same_node` * `cortex_store_gateway_data_disk_class` renamed to `store_gateway_data_disk_class` * `cortex_store_gateway_data_disk_size` renamed to `store_gateway_data_disk_size` +* [CHANGE] The overrides configmap default mountpoint has changed from `/etc/cortex` to `/etc/mimir`. It can be customized via the `overrides_configmap_mountpoint` config field. #899 * [FEATURE] Added query sharding support. It can be enabled setting `cortex_query_sharding_enabled: true` in the `_config` object. #653 * [ENHANCEMENT] Add overrides config to compactor. This allows setting retention configs per user. [#386](https://github.com/grafana/cortex-jsonnet/pull/386) * [ENHANCEMENT] Added 256MB memory ballast to querier. [#369](https://github.com/grafana/cortex-jsonnet/pull/369) diff --git a/operations/mimir-mixin/alerts/alerts.libsonnet b/operations/mimir-mixin/alerts/alerts.libsonnet index 985461ad65e..fcb9d67f04e 100644 --- a/operations/mimir-mixin/alerts/alerts.libsonnet +++ b/operations/mimir-mixin/alerts/alerts.libsonnet @@ -12,7 +12,7 @@ groups+: [ { - name: 'cortex_alerts', + name: 'mimir_alerts', rules: [ { alert: $.alertName('IngesterUnhealthy'), diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index f15b486f15a..2e9454eff5b 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -754,7 +754,7 @@ spec: - -mem-ballast-size-bytes=1073741824 - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.max-connection-age=2m - -server.grpc.keepalive.max-connection-age-grace=5m - -server.grpc.keepalive.max-connection-idle=1m @@ -782,7 +782,7 @@ spec: cpu: "2" memory: 2Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -845,7 +845,7 @@ spec: - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-write-timeout=1m @@ -880,7 +880,7 @@ spec: cpu: "1" memory: 12Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -927,7 +927,7 @@ spec: - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - -log.level=debug - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -955,7 +955,7 @@ spec: cpu: "2" memory: 600Mi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -1018,7 +1018,7 @@ spec: cpu: "2" memory: 1Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -1085,7 +1085,7 @@ spec: - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s @@ -1119,7 +1119,7 @@ spec: cpu: "1" memory: 6Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides terminationGracePeriodSeconds: 600 volumes: @@ -1157,7 +1157,7 @@ spec: - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - -log.level=debug - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -target=alertmanager @@ -1187,7 +1187,7 @@ spec: volumeMounts: - mountPath: /data name: alertmanager-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1249,7 +1249,7 @@ spec: - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -target=compactor @@ -1276,7 +1276,7 @@ spec: volumeMounts: - mountPath: /data name: compactor-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1346,7 +1346,7 @@ spec: - -ingester.unregister-on-shutdown=true - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-concurrent-streams=10000 - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 @@ -1376,7 +1376,7 @@ spec: volumeMounts: - mountPath: /data name: ingester-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1669,7 +1669,7 @@ spec: - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -store-gateway.sharding-enabled=true @@ -1702,7 +1702,7 @@ spec: volumeMounts: - mountPath: /data name: store-gateway-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index e72f6232dbd..df115929ad6 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -753,7 +753,7 @@ spec: - -mem-ballast-size-bytes=1073741824 - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.max-connection-age=2m - -server.grpc.keepalive.max-connection-age-grace=5m - -server.grpc.keepalive.max-connection-idle=1m @@ -781,7 +781,7 @@ spec: cpu: "2" memory: 2Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -844,7 +844,7 @@ spec: - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-write-timeout=1m @@ -879,7 +879,7 @@ spec: cpu: "1" memory: 12Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -930,7 +930,7 @@ spec: - -frontend.split-queries-by-interval=24h - -log.level=debug - -querier.max-query-parallelism=240 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=419430400 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -958,7 +958,7 @@ spec: cpu: "2" memory: 600Mi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -1021,7 +1021,7 @@ spec: cpu: "2" memory: 1Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -1088,7 +1088,7 @@ spec: - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s @@ -1122,7 +1122,7 @@ spec: cpu: "1" memory: 6Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides terminationGracePeriodSeconds: 600 volumes: @@ -1160,7 +1160,7 @@ spec: - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - -log.level=debug - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -target=alertmanager @@ -1190,7 +1190,7 @@ spec: volumeMounts: - mountPath: /data name: alertmanager-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1252,7 +1252,7 @@ spec: - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -target=compactor @@ -1279,7 +1279,7 @@ spec: volumeMounts: - mountPath: /data name: compactor-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1349,7 +1349,7 @@ spec: - -ingester.unregister-on-shutdown=true - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-concurrent-streams=10000 - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 @@ -1379,7 +1379,7 @@ spec: volumeMounts: - mountPath: /data name: ingester-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1672,7 +1672,7 @@ spec: - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -store-gateway.sharding-enabled=true @@ -1705,7 +1705,7 @@ spec: volumeMounts: - mountPath: /data name: store-gateway-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index 9baccbcaab9..8ec0dfa425f 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -753,7 +753,7 @@ spec: - -mem-ballast-size-bytes=1073741824 - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.max-connection-age=2m - -server.grpc.keepalive.max-connection-age-grace=5m - -server.grpc.keepalive.max-connection-idle=1m @@ -781,7 +781,7 @@ spec: cpu: "2" memory: 2Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -846,7 +846,7 @@ spec: - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-write-timeout=1m @@ -881,7 +881,7 @@ spec: cpu: "1" memory: 12Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -928,7 +928,7 @@ spec: - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - -log.level=debug - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -956,7 +956,7 @@ spec: cpu: "2" memory: 600Mi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -1019,7 +1019,7 @@ spec: cpu: "2" memory: 1Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -1090,7 +1090,7 @@ spec: - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s @@ -1124,7 +1124,7 @@ spec: cpu: "1" memory: 6Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides terminationGracePeriodSeconds: 600 volumes: @@ -1164,7 +1164,7 @@ spec: - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - -log.level=debug - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -target=alertmanager @@ -1194,7 +1194,7 @@ spec: volumeMounts: - mountPath: /data name: alertmanager-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1258,7 +1258,7 @@ spec: - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -target=compactor @@ -1285,7 +1285,7 @@ spec: volumeMounts: - mountPath: /data name: compactor-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1357,7 +1357,7 @@ spec: - -ingester.unregister-on-shutdown=true - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-concurrent-streams=10000 - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 @@ -1387,7 +1387,7 @@ spec: volumeMounts: - mountPath: /data name: ingester-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1682,7 +1682,7 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -store-gateway.sharding-enabled=true @@ -1715,7 +1715,7 @@ spec: volumeMounts: - mountPath: /data name: store-gateway-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 885666de137..0f64ab68c9a 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -753,7 +753,7 @@ spec: - -mem-ballast-size-bytes=1073741824 - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.max-connection-age=2m - -server.grpc.keepalive.max-connection-age-grace=5m - -server.grpc.keepalive.max-connection-idle=1m @@ -781,7 +781,7 @@ spec: cpu: "2" memory: 2Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -844,7 +844,7 @@ spec: - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-write-timeout=1m @@ -879,7 +879,7 @@ spec: cpu: "1" memory: 12Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -926,7 +926,7 @@ spec: - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - -log.level=debug - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -954,7 +954,7 @@ spec: cpu: "2" memory: 600Mi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -1017,7 +1017,7 @@ spec: cpu: "2" memory: 1Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -1084,7 +1084,7 @@ spec: - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s @@ -1118,7 +1118,7 @@ spec: cpu: "1" memory: 6Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides terminationGracePeriodSeconds: 600 volumes: @@ -1156,7 +1156,7 @@ spec: - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - -log.level=debug - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -target=alertmanager @@ -1186,7 +1186,7 @@ spec: volumeMounts: - mountPath: /data name: alertmanager-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1248,7 +1248,7 @@ spec: - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -target=compactor @@ -1275,7 +1275,7 @@ spec: volumeMounts: - mountPath: /data name: compactor-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1345,7 +1345,7 @@ spec: - -ingester.unregister-on-shutdown=true - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-concurrent-streams=10000 - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 @@ -1375,7 +1375,7 @@ spec: volumeMounts: - mountPath: /data name: ingester-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1668,7 +1668,7 @@ spec: - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -store-gateway.sharding-enabled=true @@ -1701,7 +1701,7 @@ spec: volumeMounts: - mountPath: /data name: store-gateway-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index bac7e7182ee..33fc81c6f0c 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -753,7 +753,7 @@ spec: - -mem-ballast-size-bytes=1073741824 - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.max-connection-age=2m - -server.grpc.keepalive.max-connection-age-grace=5m - -server.grpc.keepalive.max-connection-idle=1m @@ -781,7 +781,7 @@ spec: cpu: "2" memory: 2Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -845,7 +845,7 @@ spec: - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-write-timeout=1m @@ -880,7 +880,7 @@ spec: cpu: "1" memory: 12Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -927,7 +927,7 @@ spec: - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - -log.level=debug - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -955,7 +955,7 @@ spec: cpu: "2" memory: 600Mi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -1018,7 +1018,7 @@ spec: cpu: "2" memory: 1Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides volumes: - configMap: @@ -1088,7 +1088,7 @@ spec: - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s @@ -1122,7 +1122,7 @@ spec: cpu: "1" memory: 6Gi volumeMounts: - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides terminationGracePeriodSeconds: 600 volumes: @@ -1161,7 +1161,7 @@ spec: - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - -log.level=debug - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -target=alertmanager @@ -1191,7 +1191,7 @@ spec: volumeMounts: - mountPath: /data name: alertmanager-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1254,7 +1254,7 @@ spec: - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -target=compactor @@ -1281,7 +1281,7 @@ spec: volumeMounts: - mountPath: /data name: compactor-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1352,7 +1352,7 @@ spec: - -ingester.unregister-on-shutdown=true - -ring.heartbeat-timeout=10m - -ring.prefix= - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-concurrent-streams=10000 - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 @@ -1382,7 +1382,7 @@ spec: volumeMounts: - mountPath: /data name: ingester-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 @@ -1676,7 +1676,7 @@ spec: - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.s3.bucket-name=blocks-bucket - -blocks-storage.s3.endpoint=s3.dualstack.us-east-1.amazonaws.com - - -runtime-config.file=/etc/cortex/overrides.yaml + - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -store-gateway.sharding-enabled=true @@ -1709,7 +1709,7 @@ spec: volumeMounts: - mountPath: /data name: store-gateway-data - - mountPath: /etc/cortex + - mountPath: /etc/mimir name: overrides securityContext: runAsUser: 0 diff --git a/operations/mimir/alertmanager.libsonnet b/operations/mimir/alertmanager.libsonnet index 480112d3820..1bc78ff5e07 100644 --- a/operations/mimir/alertmanager.libsonnet +++ b/operations/mimir/alertmanager.libsonnet @@ -66,7 +66,7 @@ { target: 'alertmanager', 'log.level': 'debug', - 'runtime-config.file': '/etc/cortex/overrides.yaml', + 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, 'experimental.alertmanager.enable-api': 'true', 'alertmanager.storage.path': '/data', 'alertmanager.web.external-url': '%s/alertmanager' % $._config.external_url, @@ -123,7 +123,7 @@ statefulSet.mixin.spec.template.spec.securityContext.withRunAsUser(0) + statefulSet.mixin.spec.updateStrategy.withType('RollingUpdate') + statefulSet.mixin.spec.template.spec.withTerminationGracePeriodSeconds(900) + - $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint) + statefulSet.mixin.spec.template.spec.withVolumesMixin( if hasFallbackConfig then [volume.fromConfigMap('alertmanager-fallback-config', 'alertmanager-fallback-config')] diff --git a/operations/mimir/compactor.libsonnet b/operations/mimir/compactor.libsonnet index eb64940fc04..b3e76a7ed4c 100644 --- a/operations/mimir/compactor.libsonnet +++ b/operations/mimir/compactor.libsonnet @@ -38,7 +38,7 @@ 'compactor.ring.prefix': '', // Limits config. - 'runtime-config.file': '/etc/cortex/overrides.yaml', + 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, }, // The compactor runs a statefulset with a single replica, because @@ -78,7 +78,7 @@ // rolled out one by one (the next pod will be rolled out once the previous is // ready). statefulSet.mixin.spec.withPodManagementPolicy('Parallel') + - $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex'), + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint), compactor_statefulset: $.newCompactorStatefulSet('compactor', $.compactor_container), diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index b320a872db0..8409433c023 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -123,7 +123,7 @@ // Querier component config (shared between the ruler and querier). queryConfig: { - 'runtime-config.file': '/etc/cortex/overrides.yaml', + 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, // Don't allow individual queries of longer than 32days. Due to day query // splitting in the frontend, the reality is this only limits rate(foo[32d]) @@ -246,6 +246,7 @@ limitsConfig: self.distributorLimitsConfig + self.ingesterLimitsConfig + self.rulerLimitsConfig + self.compactorLimitsConfig, overrides_configmap: 'overrides', + overrides_configmap_mountpoint: '/etc/mimir', overrides: { extra_small_user:: { diff --git a/operations/mimir/distributor.libsonnet b/operations/mimir/distributor.libsonnet index f5102a66e98..341e3ac14f2 100644 --- a/operations/mimir/distributor.libsonnet +++ b/operations/mimir/distributor.libsonnet @@ -10,7 +10,7 @@ { target: 'distributor', - 'runtime-config.file': '/etc/cortex/overrides.yaml', + 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, 'distributor.remote-timeout': '20s', 'distributor.ha-tracker.enable': true, @@ -55,7 +55,7 @@ distributor_deployment: deployment.new('distributor', 3, [$.distributor_container], $.distributor_deployment_labels) + (if $._config.distributor_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + - $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint) + deployment.mixin.spec.strategy.rollingUpdate.withMaxSurge(5) + deployment.mixin.spec.strategy.rollingUpdate.withMaxUnavailable(1), diff --git a/operations/mimir/flusher-job-blocks.libsonnet b/operations/mimir/flusher-job-blocks.libsonnet index 5f621b46f10..4c9e651904a 100644 --- a/operations/mimir/flusher-job-blocks.libsonnet +++ b/operations/mimir/flusher-job-blocks.libsonnet @@ -44,6 +44,6 @@ job.mixin.spec.template.metadata.withLabels({ name: 'flusher' }) + job.mixin.spec.template.spec.securityContext.withRunAsUser(0) + job.mixin.spec.template.spec.withTerminationGracePeriodSeconds(300) + - $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint) + $.util.podPriority('high'), } diff --git a/operations/mimir/ingester.libsonnet b/operations/mimir/ingester.libsonnet index 3a67a1409de..007a54b73b6 100644 --- a/operations/mimir/ingester.libsonnet +++ b/operations/mimir/ingester.libsonnet @@ -22,7 +22,7 @@ 'ingester.unregister-on-shutdown': $._config.unregister_ingesters_on_shutdown, // Limits config. - 'runtime-config.file': '/etc/cortex/overrides.yaml', + 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, 'server.grpc-max-concurrent-streams': 10000, 'server.grpc-max-send-msg-size-bytes': 10 * 1024 * 1024, 'server.grpc-max-recv-msg-size-bytes': 10 * 1024 * 1024, @@ -78,7 +78,7 @@ // For this reason, we grant an high termination period (80 minutes). statefulSet.mixin.spec.template.spec.withTerminationGracePeriodSeconds(1200) + statefulSet.mixin.spec.updateStrategy.withType('RollingUpdate') + - $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint) + $.util.podPriority('high') + // Parallelly scale up/down ingester instances instead of starting them // one by one. This does NOT affect rolling updates: they will continue to be diff --git a/operations/mimir/overrides-exporter.libsonnet b/operations/mimir/overrides-exporter.libsonnet index cb4107d186f..9a8dd254644 100644 --- a/operations/mimir/overrides-exporter.libsonnet +++ b/operations/mimir/overrides-exporter.libsonnet @@ -24,7 +24,7 @@ overrides_exporter_args:: { target: 'overrides-exporter', - 'runtime-config.file': '/etc/cortex/overrides.yaml', + 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, } + $._config.limitsConfig, local container = $.core.v1.container, @@ -41,7 +41,7 @@ local deployment = $.apps.v1.deployment, overrides_exporter_deployment: deployment.new(name, 1, [$.overrides_exporter_container], { name: name }) + - $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint) + deployment.mixin.metadata.withLabels({ name: name }), overrides_exporter_service: diff --git a/operations/mimir/querier.libsonnet b/operations/mimir/querier.libsonnet index ac0802dc091..2ffd6bf2e57 100644 --- a/operations/mimir/querier.libsonnet +++ b/operations/mimir/querier.libsonnet @@ -57,7 +57,7 @@ newQuerierDeployment(name, container):: deployment.new(name, $._config.querier.replicas, [container], $.querier_deployment_labels) + (if $._config.querier_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + - $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint) + deployment.mixin.spec.strategy.rollingUpdate.withMaxSurge(5) + deployment.mixin.spec.strategy.rollingUpdate.withMaxUnavailable(1), diff --git a/operations/mimir/query-frontend.libsonnet b/operations/mimir/query-frontend.libsonnet index 14290d53d3d..5a56b2d7944 100644 --- a/operations/mimir/query-frontend.libsonnet +++ b/operations/mimir/query-frontend.libsonnet @@ -35,7 +35,7 @@ // Limit queries to 500 days, allow this to be override per-user. 'store.max-query-length': '12000h', // 500 Days - 'runtime-config.file': '/etc/cortex/overrides.yaml', + 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, }, query_frontend_container:: @@ -51,7 +51,7 @@ newQueryFrontendDeployment(name, container):: deployment.new(name, $._config.queryFrontend.replicas, [container]) + - $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint) + (if $._config.query_frontend_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + deployment.mixin.spec.strategy.rollingUpdate.withMaxSurge(1) + deployment.mixin.spec.strategy.rollingUpdate.withMaxUnavailable(1), diff --git a/operations/mimir/query-scheduler.libsonnet b/operations/mimir/query-scheduler.libsonnet index 51f1ea2cf63..5b786cb7844 100644 --- a/operations/mimir/query-scheduler.libsonnet +++ b/operations/mimir/query-scheduler.libsonnet @@ -24,7 +24,7 @@ newQuerySchedulerDeployment(name, container):: deployment.new(name, 2, [container]) + - $.util.configVolumeMount('overrides', '/etc/cortex') + + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint) + $.util.antiAffinity + // Do not run more query-schedulers than expected. deployment.mixin.spec.strategy.rollingUpdate.withMaxSurge(0) + diff --git a/operations/mimir/ruler.libsonnet b/operations/mimir/ruler.libsonnet index a0fbd735c69..9e7e53046b2 100644 --- a/operations/mimir/ruler.libsonnet +++ b/operations/mimir/ruler.libsonnet @@ -54,7 +54,7 @@ deployment.mixin.spec.strategy.rollingUpdate.withMaxUnavailable(1) + deployment.mixin.spec.template.spec.withTerminationGracePeriodSeconds(600) + (if $._config.ruler_allow_multiple_replicas_on_same_node then {} else $.util.antiAffinity) + - $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex') + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint) else {}, local service = $.core.v1.service, diff --git a/operations/mimir/store-gateway.libsonnet b/operations/mimir/store-gateway.libsonnet index c5eb44d60f0..200d861a3c0 100644 --- a/operations/mimir/store-gateway.libsonnet +++ b/operations/mimir/store-gateway.libsonnet @@ -20,7 +20,7 @@ $._config.queryBlocksStorageConfig + { target: 'store-gateway', - 'runtime-config.file': '/etc/cortex/overrides.yaml', + 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, // Persist ring tokens so that when the store-gateway will be restarted // it will pick the same tokens @@ -77,7 +77,7 @@ // rolled out one by one (the next pod will be rolled out once the previous is // ready). statefulSet.mixin.spec.withPodManagementPolicy('Parallel') + - $.util.configVolumeMount($._config.overrides_configmap, '/etc/cortex'), + $.util.configVolumeMount($._config.overrides_configmap, $._config.overrides_configmap_mountpoint), store_gateway_statefulset: self.newStoreGatewayStatefulSet('store-gateway', $.store_gateway_container), From 469934e9f235b16e9e4df38272706401180d47da Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Wed, 26 Jan 2022 15:45:02 +0100 Subject: [PATCH 012/168] Change default `server.http-listen-port` to 8080 (#871) * Change default -server.http-listen-port=8080 Signed-off-by: Dimitar Dimitrov * Update default httpPort used in e2e tests Signed-off-by: Dimitar Dimitrov * Update config-file-reference.md Signed-off-by: Dimitar Dimitrov * Update backward compatibility tests Signed-off-by: Dimitar Dimitrov * Update CHANGELOG.md Signed-off-by: Dimitar Dimitrov * Replace usages of port 80 with port 8080 Signed-off-by: Dimitar Dimitrov * Update docs Signed-off-by: Dimitar Dimitrov * Add container_http_port as config to jsonnet Signed-off-by: Dimitar Dimitrov * Rename container_http_port to server_http_port Signed-off-by: Dimitar Dimitrov * Use server_http_port to set `-server.http-listen-port` flag Signed-off-by: Dimitar Dimitrov --- CHANGELOG.md | 1 + cmd/mimir/Dockerfile | 2 +- .../configuration/config-file-reference.md | 2 +- .../operations/requests-mirroring-envoy.yaml | 4 +- ...requests-mirroring-to-secondary-cluster.md | 6 +- integration/backward_compatibility.go | 1 + integration/e2emimir/services.go | 2 +- ...est-disable-chunk-streaming-generated.yaml | 85 ++++++++++--------- .../test-query-sharding-generated.yaml | 85 ++++++++++--------- .../test-storage-azure-generated.yaml | 85 ++++++++++--------- .../test-storage-gcs-generated.yaml | 85 ++++++++++--------- .../test-storage-s3-generated.yaml | 85 ++++++++++--------- operations/mimir/alertmanager.libsonnet | 1 + operations/mimir/common.libsonnet | 4 +- operations/mimir/compactor.libsonnet | 2 + operations/mimir/config.libsonnet | 2 + operations/mimir/distributor.libsonnet | 1 + operations/mimir/ingester.libsonnet | 2 + operations/mimir/overrides-exporter.libsonnet | 4 +- operations/mimir/querier.libsonnet | 2 + operations/mimir/query-frontend.libsonnet | 2 + operations/mimir/query-scheduler.libsonnet | 1 + operations/mimir/ruler.libsonnet | 2 + operations/mimir/store-gateway.libsonnet | 3 + pkg/mimir/mimir.go | 3 + tools/migrate-ingester-statefulsets.sh | 2 +- 26 files changed, 272 insertions(+), 202 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aeadd5722ea..63503de99fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -218,6 +218,7 @@ * `-distributor.sharding-strategy` option has been removed, and shuffle sharding is enabled by default. Default shard size is set to 0, which disables shuffle sharding for the tenant (all ingesters will receive tenants's samples). #888 * `-ruler.sharding-strategy` option has been removed from ruler. Ruler now uses shuffle-sharding by default, but respects `ruler_tenant_shard_size`, which defaults to 0 (ie. use all rulers for tenant). #889 * `-store-gateway.sharding-strategy` option has been removed store-gateways. Store-gateway now uses shuffle-sharding by default, but respects `store_gateway_tenant_shard_size` for tenant, and this value defaults to 0. #891 +* [CHANGE] Server: `-server.http-listen-port` (yaml: `server.http_listen_port`) now defaults to `8080` (previously `80`). #871 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/cmd/mimir/Dockerfile b/cmd/mimir/Dockerfile index 53d04ffda97..934221b53db 100644 --- a/cmd/mimir/Dockerfile +++ b/cmd/mimir/Dockerfile @@ -12,7 +12,7 @@ ARG BINARY_SUFFIX="_${TARGETOS}_${TARGETARCH}" # Set to non-empty value to use ${TARGET_SUFFIX} when copying mimir binary, leave unset to use no suffix. ARG USE_BINARY_SUFFIX COPY mimir${USE_BINARY_SUFFIX:+${BINARY_SUFFIX}} /bin/mimir -EXPOSE 80 +EXPOSE 8080 ENTRYPOINT [ "/bin/mimir" ] ARG revision diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 37bec90d3ff..9d9dfe397bb 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -273,7 +273,7 @@ The `server_config` configures the HTTP and gRPC server of the launched service( # HTTP server listen port. # CLI flag: -server.http-listen-port -[http_listen_port: | default = 80] +[http_listen_port: | default = 8080] # Maximum number of simultaneous http connections, <=0 to disable # CLI flag: -server.http-conn-limit diff --git a/docs/sources/operations/requests-mirroring-envoy.yaml b/docs/sources/operations/requests-mirroring-envoy.yaml index 377a5e08b74..47ec01eeb89 100644 --- a/docs/sources/operations/requests-mirroring-envoy.yaml +++ b/docs/sources/operations/requests-mirroring-envoy.yaml @@ -40,10 +40,10 @@ static_resources: - name: cortex_primary type: STRICT_DNS connect_timeout: 1s - hosts: [{ socket_address: { address: cortex-primary, port_value: 80 }}] + hosts: [{ socket_address: { address: cortex-primary, port_value: 8080 }}] dns_refresh_rate: 5s - name: cortex_secondary type: STRICT_DNS connect_timeout: 1s - hosts: [{ socket_address: { address: cortex-secondary, port_value: 80 }}] + hosts: [{ socket_address: { address: cortex-secondary, port_value: 8080 }}] dns_refresh_rate: 5s diff --git a/docs/sources/operations/requests-mirroring-to-secondary-cluster.md b/docs/sources/operations/requests-mirroring-to-secondary-cluster.md index 211dd99cd21..9387954f02e 100644 --- a/docs/sources/operations/requests-mirroring-to-secondary-cluster.md +++ b/docs/sources/operations/requests-mirroring-to-secondary-cluster.md @@ -15,7 +15,7 @@ For example, requests mirroring can be used when you need to setup a testing Cor ### Example Envoy config -The following Envoy configuration shows an example with two Cortex clusters. Envoy will listen on port `9900` and will proxies all requests to `cortex-primary:80`, mirroring it to `cortex-secondary:80` too. +The following Envoy configuration shows an example with two Cortex clusters. Envoy will listen on port `9900` and will proxies all requests to `cortex-primary:8080`, mirroring it to `cortex-secondary:8080` too. [embedmd]:# (./requests-mirroring-envoy.yaml) @@ -62,12 +62,12 @@ static_resources: - name: cortex_primary type: STRICT_DNS connect_timeout: 1s - hosts: [{ socket_address: { address: cortex-primary, port_value: 80 }}] + hosts: [{ socket_address: { address: cortex-primary, port_value: 8080 }}] dns_refresh_rate: 5s - name: cortex_secondary type: STRICT_DNS connect_timeout: 1s - hosts: [{ socket_address: { address: cortex-secondary, port_value: 80 }}] + hosts: [{ socket_address: { address: cortex-secondary, port_value: 8080 }}] dns_refresh_rate: 5s ``` diff --git a/integration/backward_compatibility.go b/integration/backward_compatibility.go index cf5883f1c40..2bce150f132 100644 --- a/integration/backward_compatibility.go +++ b/integration/backward_compatibility.go @@ -7,6 +7,7 @@ package integration var DefaultPreviousVersionImages = map[string]func(map[string]string) map[string]string{ "quay.io/cortexproject/cortex:v1.11.0": func(flags map[string]string) map[string]string { flags["-store.engine"] = "blocks" + flags["-server.http-listen-port"] = "8080" return flags }, } diff --git a/integration/e2emimir/services.go b/integration/e2emimir/services.go index be798ef34a1..aee51eeb7c6 100644 --- a/integration/e2emimir/services.go +++ b/integration/e2emimir/services.go @@ -14,7 +14,7 @@ import ( ) const ( - httpPort = 80 + httpPort = 8080 grpcPort = 9095 GossipPort = 9094 ) diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index 2e9454eff5b..aaf15530134 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -301,8 +301,8 @@ spec: clusterIP: None ports: - name: alertmanager-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: alertmanager-grpc port: 9095 targetPort: 9095 @@ -350,8 +350,8 @@ spec: clusterIP: None ports: - name: distributor-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: distributor-grpc port: 9095 targetPort: 9095 @@ -368,8 +368,8 @@ metadata: spec: ports: - name: ingester-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ingester-grpc port: 9095 targetPort: 9095 @@ -462,8 +462,8 @@ metadata: spec: ports: - name: querier-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: querier-grpc port: 9095 targetPort: 9095 @@ -480,8 +480,8 @@ metadata: spec: ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -499,8 +499,8 @@ spec: clusterIP: None ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -518,8 +518,8 @@ metadata: spec: ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -537,8 +537,8 @@ spec: clusterIP: None ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -556,8 +556,8 @@ metadata: spec: ports: - name: ruler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ruler-grpc port: 9095 targetPort: 9095 @@ -574,8 +574,8 @@ metadata: spec: ports: - name: store-gateway-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: store-gateway-grpc port: 9095 targetPort: 9095 @@ -760,19 +760,20 @@ spec: - -server.grpc.keepalive.max-connection-idle=1m - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=distributor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: distributor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -848,6 +849,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -863,14 +865,14 @@ spec: imagePullPolicy: IfNotPresent name: querier ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -931,6 +933,7 @@ spec: - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store.max-query-length=12000h - -target=query-frontend @@ -938,14 +941,14 @@ spec: imagePullPolicy: IfNotPresent name: query-frontend ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -996,19 +999,20 @@ spec: - -query-scheduler.max-outstanding-requests-per-tenant=100 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=query-scheduler image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: query-scheduler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1090,6 +1094,7 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1101,14 +1106,14 @@ spec: imagePullPolicy: IfNotPresent name: ruler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1160,6 +1165,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=alertmanager env: - name: POD_IP @@ -1170,14 +1176,14 @@ spec: imagePullPolicy: IfNotPresent name: alertmanager ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1252,19 +1258,20 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=compactor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: compactor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1352,19 +1359,20 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=ingester image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: ingester ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1672,6 +1680,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1683,14 +1692,14 @@ spec: imagePullPolicy: IfNotPresent name: store-gateway ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index df115929ad6..cfdd56fea2b 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -300,8 +300,8 @@ spec: clusterIP: None ports: - name: alertmanager-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: alertmanager-grpc port: 9095 targetPort: 9095 @@ -349,8 +349,8 @@ spec: clusterIP: None ports: - name: distributor-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: distributor-grpc port: 9095 targetPort: 9095 @@ -367,8 +367,8 @@ metadata: spec: ports: - name: ingester-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ingester-grpc port: 9095 targetPort: 9095 @@ -461,8 +461,8 @@ metadata: spec: ports: - name: querier-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: querier-grpc port: 9095 targetPort: 9095 @@ -479,8 +479,8 @@ metadata: spec: ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -498,8 +498,8 @@ spec: clusterIP: None ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -517,8 +517,8 @@ metadata: spec: ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -536,8 +536,8 @@ spec: clusterIP: None ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -555,8 +555,8 @@ metadata: spec: ports: - name: ruler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ruler-grpc port: 9095 targetPort: 9095 @@ -573,8 +573,8 @@ metadata: spec: ports: - name: store-gateway-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: store-gateway-grpc port: 9095 targetPort: 9095 @@ -759,19 +759,20 @@ spec: - -server.grpc.keepalive.max-connection-idle=1m - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=distributor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: distributor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -847,6 +848,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -862,14 +864,14 @@ spec: imagePullPolicy: IfNotPresent name: querier ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -934,6 +936,7 @@ spec: - -server.grpc-max-recv-msg-size-bytes=419430400 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store.max-query-length=12000h - -target=query-frontend @@ -941,14 +944,14 @@ spec: imagePullPolicy: IfNotPresent name: query-frontend ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -999,19 +1002,20 @@ spec: - -query-scheduler.max-outstanding-requests-per-tenant=800 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=query-scheduler image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: query-scheduler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1093,6 +1097,7 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1104,14 +1109,14 @@ spec: imagePullPolicy: IfNotPresent name: ruler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1163,6 +1168,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=alertmanager env: - name: POD_IP @@ -1173,14 +1179,14 @@ spec: imagePullPolicy: IfNotPresent name: alertmanager ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1255,19 +1261,20 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=compactor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: compactor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1355,19 +1362,20 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=ingester image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: ingester ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1675,6 +1683,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1686,14 +1695,14 @@ spec: imagePullPolicy: IfNotPresent name: store-gateway ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index 8ec0dfa425f..a8613b230fd 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -300,8 +300,8 @@ spec: clusterIP: None ports: - name: alertmanager-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: alertmanager-grpc port: 9095 targetPort: 9095 @@ -349,8 +349,8 @@ spec: clusterIP: None ports: - name: distributor-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: distributor-grpc port: 9095 targetPort: 9095 @@ -367,8 +367,8 @@ metadata: spec: ports: - name: ingester-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ingester-grpc port: 9095 targetPort: 9095 @@ -461,8 +461,8 @@ metadata: spec: ports: - name: querier-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: querier-grpc port: 9095 targetPort: 9095 @@ -479,8 +479,8 @@ metadata: spec: ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -498,8 +498,8 @@ spec: clusterIP: None ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -517,8 +517,8 @@ metadata: spec: ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -536,8 +536,8 @@ spec: clusterIP: None ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -555,8 +555,8 @@ metadata: spec: ports: - name: ruler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ruler-grpc port: 9095 targetPort: 9095 @@ -573,8 +573,8 @@ metadata: spec: ports: - name: store-gateway-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: store-gateway-grpc port: 9095 targetPort: 9095 @@ -759,19 +759,20 @@ spec: - -server.grpc.keepalive.max-connection-idle=1m - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=distributor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: distributor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -849,6 +850,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -864,14 +866,14 @@ spec: imagePullPolicy: IfNotPresent name: querier ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -932,6 +934,7 @@ spec: - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store.max-query-length=12000h - -target=query-frontend @@ -939,14 +942,14 @@ spec: imagePullPolicy: IfNotPresent name: query-frontend ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -997,19 +1000,20 @@ spec: - -query-scheduler.max-outstanding-requests-per-tenant=100 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=query-scheduler image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: query-scheduler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1095,6 +1099,7 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1106,14 +1111,14 @@ spec: imagePullPolicy: IfNotPresent name: ruler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1167,6 +1172,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=alertmanager env: - name: POD_IP @@ -1177,14 +1183,14 @@ spec: imagePullPolicy: IfNotPresent name: alertmanager ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1261,19 +1267,20 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=compactor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: compactor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1363,19 +1370,20 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=ingester image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: ingester ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1685,6 +1693,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1696,14 +1705,14 @@ spec: imagePullPolicy: IfNotPresent name: store-gateway ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 0f64ab68c9a..646fd58b382 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -300,8 +300,8 @@ spec: clusterIP: None ports: - name: alertmanager-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: alertmanager-grpc port: 9095 targetPort: 9095 @@ -349,8 +349,8 @@ spec: clusterIP: None ports: - name: distributor-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: distributor-grpc port: 9095 targetPort: 9095 @@ -367,8 +367,8 @@ metadata: spec: ports: - name: ingester-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ingester-grpc port: 9095 targetPort: 9095 @@ -461,8 +461,8 @@ metadata: spec: ports: - name: querier-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: querier-grpc port: 9095 targetPort: 9095 @@ -479,8 +479,8 @@ metadata: spec: ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -498,8 +498,8 @@ spec: clusterIP: None ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -517,8 +517,8 @@ metadata: spec: ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -536,8 +536,8 @@ spec: clusterIP: None ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -555,8 +555,8 @@ metadata: spec: ports: - name: ruler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ruler-grpc port: 9095 targetPort: 9095 @@ -573,8 +573,8 @@ metadata: spec: ports: - name: store-gateway-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: store-gateway-grpc port: 9095 targetPort: 9095 @@ -759,19 +759,20 @@ spec: - -server.grpc.keepalive.max-connection-idle=1m - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=distributor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: distributor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -847,6 +848,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -862,14 +864,14 @@ spec: imagePullPolicy: IfNotPresent name: querier ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -930,6 +932,7 @@ spec: - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store.max-query-length=12000h - -target=query-frontend @@ -937,14 +940,14 @@ spec: imagePullPolicy: IfNotPresent name: query-frontend ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -995,19 +998,20 @@ spec: - -query-scheduler.max-outstanding-requests-per-tenant=100 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=query-scheduler image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: query-scheduler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1089,6 +1093,7 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1100,14 +1105,14 @@ spec: imagePullPolicy: IfNotPresent name: ruler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1159,6 +1164,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=alertmanager env: - name: POD_IP @@ -1169,14 +1175,14 @@ spec: imagePullPolicy: IfNotPresent name: alertmanager ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1251,19 +1257,20 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=compactor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: compactor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1351,19 +1358,20 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=ingester image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: ingester ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1671,6 +1679,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1682,14 +1691,14 @@ spec: imagePullPolicy: IfNotPresent name: store-gateway ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index 33fc81c6f0c..f8053cbd851 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -300,8 +300,8 @@ spec: clusterIP: None ports: - name: alertmanager-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: alertmanager-grpc port: 9095 targetPort: 9095 @@ -349,8 +349,8 @@ spec: clusterIP: None ports: - name: distributor-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: distributor-grpc port: 9095 targetPort: 9095 @@ -367,8 +367,8 @@ metadata: spec: ports: - name: ingester-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ingester-grpc port: 9095 targetPort: 9095 @@ -461,8 +461,8 @@ metadata: spec: ports: - name: querier-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: querier-grpc port: 9095 targetPort: 9095 @@ -479,8 +479,8 @@ metadata: spec: ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -498,8 +498,8 @@ spec: clusterIP: None ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -517,8 +517,8 @@ metadata: spec: ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -536,8 +536,8 @@ spec: clusterIP: None ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -555,8 +555,8 @@ metadata: spec: ports: - name: ruler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ruler-grpc port: 9095 targetPort: 9095 @@ -573,8 +573,8 @@ metadata: spec: ports: - name: store-gateway-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: store-gateway-grpc port: 9095 targetPort: 9095 @@ -759,19 +759,20 @@ spec: - -server.grpc.keepalive.max-connection-idle=1m - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=distributor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: distributor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -848,6 +849,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -863,14 +865,14 @@ spec: imagePullPolicy: IfNotPresent name: querier ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -931,6 +933,7 @@ spec: - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store.max-query-length=12000h - -target=query-frontend @@ -938,14 +941,14 @@ spec: imagePullPolicy: IfNotPresent name: query-frontend ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -996,19 +999,20 @@ spec: - -query-scheduler.max-outstanding-requests-per-tenant=100 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=query-scheduler image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: query-scheduler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1093,6 +1097,7 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1104,14 +1109,14 @@ spec: imagePullPolicy: IfNotPresent name: ruler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1164,6 +1169,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=alertmanager env: - name: POD_IP @@ -1174,14 +1180,14 @@ spec: imagePullPolicy: IfNotPresent name: alertmanager ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1257,19 +1263,20 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=compactor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: compactor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1358,19 +1365,20 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=ingester image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: ingester ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1679,6 +1687,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1690,14 +1699,14 @@ spec: imagePullPolicy: IfNotPresent name: store-gateway ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: diff --git a/operations/mimir/alertmanager.libsonnet b/operations/mimir/alertmanager.libsonnet index 1bc78ff5e07..070a4e46be5 100644 --- a/operations/mimir/alertmanager.libsonnet +++ b/operations/mimir/alertmanager.libsonnet @@ -70,6 +70,7 @@ 'experimental.alertmanager.enable-api': 'true', 'alertmanager.storage.path': '/data', 'alertmanager.web.external-url': '%s/alertmanager' % $._config.external_url, + 'server.http-listen-port': $._config.server_http_port, } + (if hasFallbackConfig then { 'alertmanager.configs.fallback': '/configs/alertmanager_fallback_config.yaml', diff --git a/operations/mimir/common.libsonnet b/operations/mimir/common.libsonnet index 9daf7ee57ea..b714914e95d 100644 --- a/operations/mimir/common.libsonnet +++ b/operations/mimir/common.libsonnet @@ -8,13 +8,13 @@ defaultPorts:: [ - containerPort.newNamed(name='http-metrics', containerPort=80), + containerPort.newNamed(name='http-metrics', containerPort=$._config.server_http_port), containerPort.newNamed(name='grpc', containerPort=9095), ], readinessProbe:: container.mixin.readinessProbe.httpGet.withPath('/ready') + - container.mixin.readinessProbe.httpGet.withPort(80) + + container.mixin.readinessProbe.httpGet.withPort($._config.server_http_port) + container.mixin.readinessProbe.withInitialDelaySeconds(15) + container.mixin.readinessProbe.withTimeoutSeconds(1), }, diff --git a/operations/mimir/compactor.libsonnet b/operations/mimir/compactor.libsonnet index b3e76a7ed4c..ad5ca5a49dc 100644 --- a/operations/mimir/compactor.libsonnet +++ b/operations/mimir/compactor.libsonnet @@ -12,6 +12,8 @@ { target: 'compactor', + 'server.http-listen-port': $._config.server_http_port, + // Compactor config. 'compactor.block-ranges': '2h,12h,24h', 'compactor.data-dir': '/data', diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index 8409433c023..774917cd7fb 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -184,6 +184,8 @@ }, }[$._config.ruler_client_type], + server_http_port: 8080, + alertmanager: { replicas: 3, sharding_enabled: false, diff --git a/operations/mimir/distributor.libsonnet b/operations/mimir/distributor.libsonnet index 341e3ac14f2..a85d2d1ff1f 100644 --- a/operations/mimir/distributor.libsonnet +++ b/operations/mimir/distributor.libsonnet @@ -24,6 +24,7 @@ // around 1.25G, reducing the 99%ile. 'mem-ballast-size-bytes': 1 << 30, // 1GB + 'server.http-listen-port': $._config.server_http_port, 'server.grpc.keepalive.max-connection-age': '2m', 'server.grpc.keepalive.max-connection-age-grace': '5m', 'server.grpc.keepalive.max-connection-idle': '1m', diff --git a/operations/mimir/ingester.libsonnet b/operations/mimir/ingester.libsonnet index 007a54b73b6..441403f9a61 100644 --- a/operations/mimir/ingester.libsonnet +++ b/operations/mimir/ingester.libsonnet @@ -15,6 +15,8 @@ { target: 'ingester', + 'server.http-listen-port': $._config.server_http_port, + // Ring config. 'ingester.num-tokens': 512, 'ingester.join-after': '0s', diff --git a/operations/mimir/overrides-exporter.libsonnet b/operations/mimir/overrides-exporter.libsonnet index 9a8dd254644..758f27f30f2 100644 --- a/operations/mimir/overrides-exporter.libsonnet +++ b/operations/mimir/overrides-exporter.libsonnet @@ -19,11 +19,13 @@ }, local containerPort = $.core.v1.containerPort, - overrides_exporter_port:: containerPort.newNamed(name='http-metrics', containerPort=80), + overrides_exporter_port:: containerPort.newNamed(name='http-metrics', containerPort=$._config.server_http_port), overrides_exporter_args:: { target: 'overrides-exporter', + 'server.http-listen-port': $._config.server_http_port, + 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, } + $._config.limitsConfig, diff --git a/operations/mimir/querier.libsonnet b/operations/mimir/querier.libsonnet index 2ffd6bf2e57..e4eb96079cc 100644 --- a/operations/mimir/querier.libsonnet +++ b/operations/mimir/querier.libsonnet @@ -15,6 +15,8 @@ { target: 'querier', + 'server.http-listen-port': $._config.server_http_port, + // Increase HTTP server response write timeout, as we were seeing some // queries that return a lot of data timeing out. 'server.http-write-timeout': '1m', diff --git a/operations/mimir/query-frontend.libsonnet b/operations/mimir/query-frontend.libsonnet index 5a56b2d7944..05261d7b45b 100644 --- a/operations/mimir/query-frontend.libsonnet +++ b/operations/mimir/query-frontend.libsonnet @@ -9,6 +9,8 @@ // Need log.level=debug so all queries are logged, needed for analyse.py. 'log.level': 'debug', + 'server.http-listen-port': $._config.server_http_port, + // Increase HTTP server response write timeout, as we were seeing some // queries that return a lot of data timeing out. 'server.http-write-timeout': '1m', diff --git a/operations/mimir/query-scheduler.libsonnet b/operations/mimir/query-scheduler.libsonnet index 5b786cb7844..d2401a2176b 100644 --- a/operations/mimir/query-scheduler.libsonnet +++ b/operations/mimir/query-scheduler.libsonnet @@ -10,6 +10,7 @@ { target: 'query-scheduler', 'log.level': 'debug', + 'server.http-listen-port': $._config.server_http_port, 'query-scheduler.max-outstanding-requests-per-tenant': 100, }, diff --git a/operations/mimir/ruler.libsonnet b/operations/mimir/ruler.libsonnet index 9e7e53046b2..438700965ea 100644 --- a/operations/mimir/ruler.libsonnet +++ b/operations/mimir/ruler.libsonnet @@ -29,6 +29,8 @@ 'server.grpc-max-send-msg-size-bytes': 10 * 1024 * 1024, 'server.grpc-max-recv-msg-size-bytes': 10 * 1024 * 1024, + 'server.http-listen-port': $._config.server_http_port, + // Do not extend the replication set on unhealthy (or LEAVING) ingester when "unregister on shutdown" // is set to false. 'distributor.extend-writes': $._config.unregister_ingesters_on_shutdown, diff --git a/operations/mimir/store-gateway.libsonnet b/operations/mimir/store-gateway.libsonnet index 200d861a3c0..fa0b9979381 100644 --- a/operations/mimir/store-gateway.libsonnet +++ b/operations/mimir/store-gateway.libsonnet @@ -20,6 +20,9 @@ $._config.queryBlocksStorageConfig + { target: 'store-gateway', + + 'server.http-listen-port': $._config.server_http_port, + 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, // Persist ring tokens so that when the store-gateway will be restarted diff --git a/pkg/mimir/mimir.go b/pkg/mimir/mimir.go index 92c897eff2a..284ee701048 100644 --- a/pkg/mimir/mimir.go +++ b/pkg/mimir/mimir.go @@ -255,6 +255,9 @@ func (c *Config) registerServerFlagsWithChangedDefaultValues(fs *flag.FlagSet) { case "server.grpc.keepalive.ping-without-stream-allowed": _ = f.Value.Set("true") + + case "server.http-listen-port": + _ = f.Value.Set("8080") } fs.Var(f.Value, f.Name, f.Usage) diff --git a/tools/migrate-ingester-statefulsets.sh b/tools/migrate-ingester-statefulsets.sh index 8f4cc443203..26055a0f005 100644 --- a/tools/migrate-ingester-statefulsets.sh +++ b/tools/migrate-ingester-statefulsets.sh @@ -43,7 +43,7 @@ while [[ $INSTANCES_TO_DOWNSCALE -gt 0 ]]; do # wget (BusyBox version) will fail, but we don't care ... important thing is that it has triggered shutdown. # -T causes wget to wait only 5 seconds, otherwise /shutdown takes a long time. # Preferably we would wait for /shutdown to return, but unfortunately that doesn't work (even with big timeout), wget complains with weird error. - kubectl exec "$POD_TO_SHUTDOWN" --namespace="$NAMESPACE" -- wget -T 5 http://localhost:80/shutdown >/dev/null 2>/dev/null || true + kubectl exec "$POD_TO_SHUTDOWN" --namespace="$NAMESPACE" -- wget -T 5 http://localhost:8080/shutdown >/dev/null 2>/dev/null || true # While request to /shutdown completes only after flushing has finished, it unfortunately returns 204 status code, # which confuses wget. That is the reason why instead of waiting for /shutdown to complete, this script waits for From cad5243915a739e026ba3352ce9b7bdff3de97d6 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Wed, 26 Jan 2022 16:24:40 +0100 Subject: [PATCH 013/168] Add shuffle-sharding support to jsonnet (#902) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 12 + .../test-shuffle-sharding-generated.yaml | 1771 +++++++++++++++++ .../mimir-tests/test-shuffle-sharding.jsonnet | 32 + operations/mimir/mimir.libsonnet | 1 + operations/mimir/shuffle-sharding.libsonnet | 140 ++ 5 files changed, 1956 insertions(+) create mode 100644 operations/mimir-tests/test-shuffle-sharding-generated.yaml create mode 100644 operations/mimir-tests/test-shuffle-sharding.jsonnet create mode 100644 operations/mimir/shuffle-sharding.libsonnet diff --git a/CHANGELOG.md b/CHANGELOG.md index 63503de99fc..951d53e2c58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -540,6 +540,18 @@ * `cortex_store_gateway_data_disk_size` renamed to `store_gateway_data_disk_size` * [CHANGE] The overrides configmap default mountpoint has changed from `/etc/cortex` to `/etc/mimir`. It can be customized via the `overrides_configmap_mountpoint` config field. #899 * [FEATURE] Added query sharding support. It can be enabled setting `cortex_query_sharding_enabled: true` in the `_config` object. #653 +* [FEATURE] Added shuffle-sharding support. It can be enabled and configured using the following config: #902 + ``` + _config+:: { + shuffle_sharding:: { + ingester_write_path_enabled: true, + ingester_read_path_enabled: true, + querier_enabled: true, + ruler_enabled: true, + store_gateway_enabled: true, + }, + } + ``` * [ENHANCEMENT] Add overrides config to compactor. This allows setting retention configs per user. [#386](https://github.com/grafana/cortex-jsonnet/pull/386) * [ENHANCEMENT] Added 256MB memory ballast to querier. [#369](https://github.com/grafana/cortex-jsonnet/pull/369) * [ENHANCEMENT] Update `etcd-operator` to latest version (see https://github.com/grafana/jsonnet-libs/pull/480). [#263](https://github.com/grafana/cortex-jsonnet/pull/263) diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml new file mode 100644 index 00000000000..bea84a11052 --- /dev/null +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -0,0 +1,1771 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: default +--- +apiVersion: policy/v1beta1 +kind: PodDisruptionBudget +metadata: + labels: + name: ingester-pdb + name: ingester-pdb + namespace: default +spec: + maxUnavailable: 1 + selector: + matchLabels: + name: ingester +--- +apiVersion: policy/v1beta1 +kind: PodDisruptionBudget +metadata: + labels: + name: store-gateway-pdb + name: store-gateway-pdb + namespace: default +spec: + maxUnavailable: 2 + selector: + matchLabels: + name: store-gateway +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: consul-sidekick + namespace: default +--- +apiVersion: v1 +data: + consul-config.json: '{"leave_on_terminate": true, "raft_snapshot_threshold": 128, + "raft_trailing_logs": 10000, "telemetry": {"dogstatsd_addr": "127.0.0.1:9125"}}' + mapping: | + mappings: + - match: consul.*.runtime.* + name: consul_runtime + labels: + type: $2 + - match: consul.runtime.total_gc_pause_ns + name: consul_runtime_total_gc_pause_ns + labels: + type: $2 + - match: consul.consul.health.service.query-tag.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3 + - match: consul.consul.health.service.query-tag.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4 + - match: consul.consul.health.service.query-tag.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9.$10 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9.$10.$11 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9.$10.$11.$12 + - match: consul.consul.catalog.deregister + name: consul_catalog_deregister + labels: {} + - match: consul.consul.dns.domain_query.*.*.*.*.* + name: consul_dns_domain_query + labels: + query: $1.$2.$3.$4.$5 + - match: consul.consul.health.service.not-found.* + name: consul_health_service_not_found + labels: + query: $1 + - match: consul.consul.health.service.query.* + name: consul_health_service_query + labels: + query: $1 + - match: consul.*.memberlist.health.score + name: consul_memberlist_health_score + labels: {} + - match: consul.serf.queue.* + name: consul_serf_events + labels: + type: $1 + - match: consul.serf.snapshot.appendLine + name: consul_serf_snapshot_appendLine + labels: + type: $1 + - match: consul.serf.coordinate.adjustment-ms + name: consul_serf_coordinate_adjustment_ms + labels: {} + - match: consul.consul.rpc.query + name: consul_rpc_query + labels: {} + - match: consul.*.consul.session_ttl.active + name: consul_session_ttl_active + labels: {} + - match: consul.raft.rpc.* + name: consul_raft_rpc + labels: + type: $1 + - match: consul.raft.rpc.appendEntries.storeLogs + name: consul_raft_rpc_appendEntries_storeLogs + labels: + type: $1 + - match: consul.consul.fsm.persist + name: consul_fsm_persist + labels: {} + - match: consul.raft.fsm.apply + name: consul_raft_fsm_apply + labels: {} + - match: consul.raft.leader.lastContact + name: consul_raft_leader_lastcontact + labels: {} + - match: consul.raft.leader.dispatchLog + name: consul_raft_leader_dispatchLog + labels: {} + - match: consul.raft.commitTime + name: consul_raft_commitTime + labels: {} + - match: consul.raft.replication.appendEntries.logs.*.*.*.* + name: consul_raft_replication_appendEntries_logs + labels: + query: ${1}.${2}.${3}.${4} + - match: consul.raft.replication.appendEntries.rpc.*.*.*.* + name: consul_raft_replication_appendEntries_rpc + labels: + query: ${1}.${2}.${3}.${4} + - match: consul.raft.replication.heartbeat.*.*.*.* + name: consul_raft_replication_heartbeat + labels: + query: ${1}.${2}.${3}.${4} + - match: consul.consul.rpc.request + name: consul_rpc_requests + labels: {} + - match: consul.consul.rpc.accept_conn + name: consul_rpc_accept_conn + labels: {} + - match: consul.memberlist.udp.* + name: consul_memberlist_udp + labels: + type: $1 + - match: consul.memberlist.tcp.* + name: consul_memberlist_tcp + labels: + type: $1 + - match: consul.memberlist.gossip + name: consul_memberlist_gossip + labels: {} + - match: consul.memberlist.probeNode + name: consul_memberlist_probenode + labels: {} + - match: consul.memberlist.pushPullNode + name: consul_memberlist_pushpullnode + labels: {} + - match: consul.http.* + name: consul_http_request + labels: + method: $1 + path: / + - match: consul.http.*.* + name: consul_http_request + labels: + method: $1 + path: /$2 + - match: consul.http.*.*.* + name: consul_http_request + labels: + method: $1 + path: /$2/$3 + - match: consul.http.*.*.*.* + name: consul_http_request + labels: + method: $1 + path: /$2/$3/$4 + - match: consul.http.*.*.*.*.* + name: consul_http_request + labels: + method: $1 + path: /$2/$3/$4/$5 + - match: consul.consul.leader.barrier + name: consul_leader_barrier + labels: {} + - match: consul.consul.leader.reconcileMember + name: consul_leader_reconcileMember + labels: {} + - match: consul.consul.leader.reconcile + name: consul_leader_reconcile + labels: {} + - match: consul.consul.fsm.coordinate.batch-update + name: consul_fsm_coordinate_batch_update + labels: {} + - match: consul.consul.fsm.autopilot + name: consul_fsm_autopilot + labels: {} + - match: consul.consul.fsm.kvs.cas + name: consul_fsm_kvs_cas + labels: {} + - match: consul.consul.fsm.register + name: consul_fsm_register + labels: {} + - match: consul.consul.fsm.deregister + name: consul_fsm_deregister + labels: {} + - match: consul.consul.fsm.tombstone.reap + name: consul_fsm_tombstone_reap + labels: {} + - match: consul.consul.catalog.register + name: consul_catalog_register + labels: {} + - match: consul.consul.catalog.deregister + name: consul_catalog_deregister + labels: {} + - match: consul.consul.leader.reapTombstones + name: consul_leader_reapTombstones + labels: {} +kind: ConfigMap +metadata: + name: consul + namespace: default +--- +apiVersion: v1 +data: + overrides.yaml: | + overrides: {} +kind: ConfigMap +metadata: + name: overrides + namespace: default +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: consul-sidekick + namespace: default +rules: +- apiGroups: + - "" + - extensions + - apps + resources: + - pods + - replicasets + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: consul-sidekick + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: consul-sidekick +subjects: +- kind: ServiceAccount + name: consul-sidekick + namespace: default +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: alertmanager + name: alertmanager + namespace: default +spec: + clusterIP: None + ports: + - name: alertmanager-http-metrics + port: 80 + targetPort: 80 + - name: alertmanager-grpc + port: 9095 + targetPort: 9095 + selector: + name: alertmanager +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: consul + name: consul + namespace: default +spec: + ports: + - name: consul-server + port: 8300 + targetPort: 8300 + - name: consul-serf + port: 8301 + targetPort: 8301 + - name: consul-client + port: 8400 + targetPort: 8400 + - name: consul-api + port: 8500 + targetPort: 8500 + - name: statsd-exporter-http-metrics + port: 8000 + targetPort: 8000 + - name: consul-exporter-http-metrics + port: 9107 + targetPort: 9107 + selector: + name: consul +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: distributor + name: distributor + namespace: default +spec: + clusterIP: None + ports: + - name: distributor-http-metrics + port: 80 + targetPort: 80 + - name: distributor-grpc + port: 9095 + targetPort: 9095 + selector: + name: distributor +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: ingester + name: ingester + namespace: default +spec: + ports: + - name: ingester-http-metrics + port: 80 + targetPort: 80 + - name: ingester-grpc + port: 9095 + targetPort: 9095 + selector: + name: ingester +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached + name: memcached + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached-frontend + name: memcached-frontend + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached-frontend +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached-index-queries + name: memcached-index-queries + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached-index-queries +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached-metadata + name: memcached-metadata + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached-metadata +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: querier + name: querier + namespace: default +spec: + ports: + - name: querier-http-metrics + port: 80 + targetPort: 80 + - name: querier-grpc + port: 9095 + targetPort: 9095 + selector: + name: querier +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: query-frontend + name: query-frontend + namespace: default +spec: + ports: + - name: query-frontend-http-metrics + port: 80 + targetPort: 80 + - name: query-frontend-grpc + port: 9095 + targetPort: 9095 + selector: + name: query-frontend +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: query-frontend + name: query-frontend-discovery + namespace: default +spec: + clusterIP: None + ports: + - name: query-frontend-http-metrics + port: 80 + targetPort: 80 + - name: query-frontend-grpc + port: 9095 + targetPort: 9095 + publishNotReadyAddresses: true + selector: + name: query-frontend +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: query-scheduler + name: query-scheduler + namespace: default +spec: + ports: + - name: query-scheduler-http-metrics + port: 80 + targetPort: 80 + - name: query-scheduler-grpc + port: 9095 + targetPort: 9095 + selector: + name: query-scheduler +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: query-scheduler + name: query-scheduler-discovery + namespace: default +spec: + clusterIP: None + ports: + - name: query-scheduler-http-metrics + port: 80 + targetPort: 80 + - name: query-scheduler-grpc + port: 9095 + targetPort: 9095 + publishNotReadyAddresses: true + selector: + name: query-scheduler +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: ruler + name: ruler + namespace: default +spec: + ports: + - name: ruler-http-metrics + port: 80 + targetPort: 80 + - name: ruler-grpc + port: 9095 + targetPort: 9095 + selector: + name: ruler +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: store-gateway + name: store-gateway + namespace: default +spec: + ports: + - name: store-gateway-http-metrics + port: 80 + targetPort: 80 + - name: store-gateway-grpc + port: 9095 + targetPort: 9095 + selector: + name: store-gateway +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: consul + namespace: default +spec: + minReadySeconds: 10 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: consul + template: + metadata: + annotations: + consul-hash: e56ef6821a3557604caccaf6d5820239 + labels: + name: consul + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: consul + topologyKey: kubernetes.io/hostname + - labelSelector: + matchLabels: + name: ingester + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - args: + - agent + - -ui + - -server + - -client=0.0.0.0 + - -config-file=/etc/config/consul-config.json + - -bootstrap-expect=1 + - -ui-content-path=/default/consul/ + env: + - name: CHECKPOINT_DISABLE + value: "1" + image: consul:1.5.3 + imagePullPolicy: IfNotPresent + name: consul + ports: + - containerPort: 8300 + name: server + - containerPort: 8301 + name: serf + - containerPort: 8400 + name: client + - containerPort: 8500 + name: api + resources: + requests: + cpu: "4" + memory: 4Gi + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + - args: + - --namespace=$(POD_NAMESPACE) + - --pod-name=$(POD_NAME) + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + image: weaveworks/consul-sidekick:master-f18ad13 + imagePullPolicy: IfNotPresent + name: sidekick + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + - args: + - --web.listen-address=:8000 + - --statsd.mapping-config=/etc/config/mapping + image: prom/statsd-exporter:v0.12.2 + imagePullPolicy: IfNotPresent + name: statsd-exporter + ports: + - containerPort: 8000 + name: http-metrics + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + - args: + - --consul.server=localhost:8500 + - --web.listen-address=:9107 + - --consul.timeout=1s + - --no-consul.health-summary + - --consul.allow_stale + image: prom/consul-exporter:v0.5.0 + imagePullPolicy: IfNotPresent + name: consul-exporter + ports: + - containerPort: 9107 + name: http-metrics + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + serviceAccount: consul-sidekick + volumes: + - configMap: + name: consul + name: consul + - emptyDir: + medium: Memory + name: data +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: distributor + namespace: default +spec: + minReadySeconds: 10 + replicas: 3 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: distributor + strategy: + rollingUpdate: + maxSurge: 5 + maxUnavailable: 1 + template: + metadata: + labels: + name: distributor + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: distributor + topologyKey: kubernetes.io/hostname + containers: + - args: + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.extend-writes=true + - -distributor.ha-tracker.enable=true + - -distributor.ha-tracker.enable-for-all-users=true + - -distributor.ha-tracker.etcd.endpoints=etcd-client.default.svc.cluster.local.:2379 + - -distributor.ha-tracker.prefix=prom_ha/ + - -distributor.ha-tracker.store=etcd + - -distributor.health-check-ingesters=true + - -distributor.ingestion-burst-size=200000 + - -distributor.ingestion-rate-limit=10000 + - -distributor.ingestion-tenant-shard-size=3 + - -distributor.remote-timeout=20s + - -distributor.replication-factor=3 + - -distributor.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.ring.prefix= + - -mem-ballast-size-bytes=1073741824 + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.max-connection-age=2m + - -server.grpc.keepalive.max-connection-age-grace=5m + - -server.grpc.keepalive.max-connection-idle=1m + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -target=distributor + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: distributor + ports: + - containerPort: 80 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 80 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 4Gi + requests: + cpu: "2" + memory: 2Gi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: querier + namespace: default +spec: + minReadySeconds: 10 + replicas: 6 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: querier + strategy: + rollingUpdate: + maxSurge: 5 + maxUnavailable: 1 + template: + metadata: + labels: + name: querier + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: querier + topologyKey: kubernetes.io/hostname + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h + - -blocks-storage.bucket-store.metadata-cache.backend=memcached + - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.sync-dir=/data/tsdb + - -blocks-storage.bucket-store.sync-interval=15m + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.health-check-ingesters=true + - -distributor.ingestion-tenant-shard-size=3 + - -distributor.replication-factor=3 + - -log.level=debug + - -mem-ballast-size-bytes=268435456 + - -querier.frontend-client.grpc-max-send-msg-size=104857600 + - -querier.max-concurrent=8 + - -querier.query-ingesters-within=13h + - -querier.query-store-after=12h + - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 + - -querier.shuffle-sharding-ingesters-lookback-period=13h + - -querier.worker-match-max-concurrent=true + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-write-timeout=1m + - -store-gateway.sharding-enabled=true + - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -store-gateway.sharding-ring.prefix= + - -store-gateway.sharding-ring.replication-factor=3 + - -store-gateway.sharding-ring.store=consul + - -store-gateway.tenant-shard-size=3 + - -store.max-query-length=768h + - -target=querier + env: + - name: JAEGER_REPORTER_MAX_QUEUE_SIZE + value: "1024" + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: querier + ports: + - containerPort: 80 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 80 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 24Gi + requests: + cpu: "1" + memory: 12Gi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: query-frontend + namespace: default +spec: + minReadySeconds: 10 + replicas: 2 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: query-frontend + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + template: + metadata: + labels: + name: query-frontend + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: query-frontend + topologyKey: kubernetes.io/hostname + containers: + - args: + - -api.response-compression-enabled=true + - -frontend.align-querier-with-step=false + - -frontend.cache-results=true + - -frontend.max-cache-freshness=10m + - -frontend.max-queriers-per-tenant=10 + - -frontend.results-cache.backend=memcached + - -frontend.results-cache.memcached.addresses=dnssrvnoa+memcached-frontend.default.svc.cluster.local:11211 + - -frontend.results-cache.memcached.timeout=500ms + - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 + - -frontend.split-queries-by-interval=24h + - -log.level=debug + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc-max-recv-msg-size-bytes=104857600 + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-write-timeout=1m + - -store.max-query-length=12000h + - -target=query-frontend + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: query-frontend + ports: + - containerPort: 80 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 80 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 1200Mi + requests: + cpu: "2" + memory: 600Mi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: query-scheduler + namespace: default +spec: + minReadySeconds: 10 + replicas: 2 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: query-scheduler + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + template: + metadata: + labels: + name: query-scheduler + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: query-scheduler + topologyKey: kubernetes.io/hostname + containers: + - args: + - -frontend.max-queriers-per-tenant=10 + - -log.level=debug + - -query-scheduler.max-outstanding-requests-per-tenant=100 + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -target=query-scheduler + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: query-scheduler + ports: + - containerPort: 80 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 80 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 2Gi + requests: + cpu: "2" + memory: 1Gi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ruler + namespace: default +spec: + minReadySeconds: 10 + replicas: 2 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: ruler + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + template: + metadata: + labels: + name: ruler + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: ruler + topologyKey: kubernetes.io/hostname + containers: + - args: + - -api.response-compression-enabled=true + - -blocks-storage.backend=gcs + - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h + - -blocks-storage.bucket-store.metadata-cache.backend=memcached + - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.sync-dir=/data/tsdb + - -blocks-storage.bucket-store.sync-interval=15m + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.extend-writes=true + - -distributor.health-check-ingesters=true + - -distributor.ingestion-tenant-shard-size=3 + - -distributor.replication-factor=3 + - -experimental.ruler.enable-api=true + - -querier.query-ingesters-within=13h + - -querier.query-store-after=12h + - -querier.shuffle-sharding-ingesters-lookback-period=13h + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -ruler-storage.backend=gcs + - -ruler-storage.gcs.bucket-name=rules-bucket + - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager + - -ruler.enable-sharding=true + - -ruler.max-rule-groups-per-tenant=35 + - -ruler.max-rules-per-rule-group=20 + - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -ruler.tenant-shard-size=2 + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc-max-recv-msg-size-bytes=10485760 + - -server.grpc-max-send-msg-size-bytes=10485760 + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -store-gateway.sharding-enabled=true + - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -store-gateway.sharding-ring.prefix= + - -store-gateway.sharding-ring.replication-factor=3 + - -store-gateway.sharding-ring.store=consul + - -store-gateway.tenant-shard-size=3 + - -store.max-query-length=768h + - -target=ruler + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: ruler + ports: + - containerPort: 80 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 80 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + cpu: "16" + memory: 16Gi + requests: + cpu: "1" + memory: 6Gi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + terminationGracePeriodSeconds: 600 + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: alertmanager + name: alertmanager + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: alertmanager + serviceName: alertmanager + template: + metadata: + labels: + name: alertmanager + spec: + containers: + - args: + - -alertmanager-storage.backend=gcs + - -alertmanager-storage.gcs.bucket-name=alerts-bucket + - -alertmanager.sharding-enabled=true + - -alertmanager.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -alertmanager.sharding-ring.replication-factor=3 + - -alertmanager.sharding-ring.store=consul + - -alertmanager.storage.path=/data + - -alertmanager.web.external-url=http://test/alertmanager + - -experimental.alertmanager.enable-api=true + - -log.level=debug + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -target=alertmanager + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: alertmanager + ports: + - containerPort: 80 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 80 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + requests: + cpu: 100m + memory: 1Gi + volumeMounts: + - mountPath: /data + name: alertmanager-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 900 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: alertmanager-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Gi +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: compactor + name: compactor + namespace: default +spec: + podManagementPolicy: Parallel + replicas: 1 + selector: + matchLabels: + name: compactor + serviceName: compactor + template: + metadata: + labels: + name: compactor + spec: + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -compactor.block-ranges=2h,12h,24h + - -compactor.blocks-retention-period=0 + - -compactor.cleanup-interval=15m + - -compactor.compaction-concurrency=1 + - -compactor.compaction-interval=30m + - -compactor.compactor-tenant-shard-size=1 + - -compactor.data-dir=/data + - -compactor.max-closing-blocks-concurrency=2 + - -compactor.max-opening-blocks-concurrency=4 + - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -compactor.ring.prefix= + - -compactor.ring.store=consul + - -compactor.sharding-enabled=true + - -compactor.split-and-merge-shards=0 + - -compactor.split-groups=1 + - -compactor.symbols-flushers-concurrency=4 + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -target=compactor + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: compactor + ports: + - containerPort: 80 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 80 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 6Gi + requests: + cpu: 1 + memory: 6Gi + volumeMounts: + - mountPath: /data + name: compactor-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 900 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: compactor-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 250Gi + storageClassName: standard +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: ingester + name: ingester + namespace: default +spec: + podManagementPolicy: Parallel + replicas: 3 + selector: + matchLabels: + name: ingester + serviceName: ingester + template: + metadata: + labels: + name: ingester + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: ingester + topologyKey: kubernetes.io/hostname + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -blocks-storage.tsdb.block-ranges-period=2h + - -blocks-storage.tsdb.dir=/data/tsdb + - -blocks-storage.tsdb.retention-period=96h + - -blocks-storage.tsdb.ship-interval=1m + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.health-check-ingesters=true + - -distributor.ingestion-tenant-shard-size=3 + - -distributor.replication-factor=3 + - -ingester.heartbeat-period=15s + - -ingester.join-after=0s + - -ingester.max-global-series-per-metric=20000 + - -ingester.max-global-series-per-user=150000 + - -ingester.num-tokens=512 + - -ingester.tokens-file-path=/data/tokens + - -ingester.unregister-on-shutdown=true + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc-max-concurrent-streams=10000 + - -server.grpc-max-recv-msg-size-bytes=10485760 + - -server.grpc-max-send-msg-size-bytes=10485760 + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -target=ingester + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: ingester + ports: + - containerPort: 80 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 80 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 25Gi + requests: + cpu: "4" + memory: 15Gi + volumeMounts: + - mountPath: /data + name: ingester-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 1200 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: ingester-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Gi + storageClassName: fast +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: memcached + serviceName: memcached + template: + metadata: + labels: + name: memcached + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 6144 + - -I 1m + - -c 16384 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 9Gi + requests: + cpu: 500m + memory: 6552Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached-frontend + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: memcached-frontend + serviceName: memcached-frontend + template: + metadata: + labels: + name: memcached-frontend + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached-frontend + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 1024 + - -I 5m + - -c 1024 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 1536Mi + requests: + cpu: 500m + memory: 1329Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached-index-queries + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: memcached-index-queries + serviceName: memcached-index-queries + template: + metadata: + labels: + name: memcached-index-queries + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached-index-queries + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 1024 + - -I 5m + - -c 16384 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 1536Mi + requests: + cpu: 500m + memory: 1329Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached-metadata + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + name: memcached-metadata + serviceName: memcached-metadata + template: + metadata: + labels: + name: memcached-metadata + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached-metadata + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 512 + - -I 1m + - -c 16384 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 768Mi + requests: + cpu: 500m + memory: 715Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: store-gateway + name: store-gateway + namespace: default +spec: + podManagementPolicy: Parallel + replicas: 3 + selector: + matchLabels: + name: store-gateway + serviceName: store-gateway + template: + metadata: + labels: + name: store-gateway + spec: + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.chunks-cache.backend=memcached + - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size=100 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h + - -blocks-storage.bucket-store.index-cache.backend=memcached + - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 + - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size=100 + - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 + - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 + - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 + - -blocks-storage.bucket-store.index-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.index-header-lazy-loading-enabled=true + - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout=60m + - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 + - -blocks-storage.bucket-store.metadata-cache.backend=memcached + - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.sync-dir=/data/tsdb + - -blocks-storage.bucket-store.sync-interval=15m + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -store-gateway.sharding-enabled=true + - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -store-gateway.sharding-ring.prefix= + - -store-gateway.sharding-ring.replication-factor=3 + - -store-gateway.sharding-ring.store=consul + - -store-gateway.sharding-ring.tokens-file-path=/data/tokens + - -store-gateway.tenant-shard-size=3 + - -target=store-gateway + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: store-gateway + ports: + - containerPort: 80 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 80 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 18Gi + requests: + cpu: "1" + memory: 12Gi + volumeMounts: + - mountPath: /data + name: store-gateway-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 120 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: store-gateway-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Gi + storageClassName: standard +--- +apiVersion: etcd.database.coreos.com/v1beta2 +kind: EtcdCluster +metadata: + annotations: + etcd.database.coreos.com/scope: clusterwide + name: etcd + namespace: default +spec: + pod: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + etcd_cluster: etcd + topologyKey: kubernetes.io/hostname + annotations: + prometheus.io/port: "2379" + prometheus.io/scrape: "true" + etcdEnv: + - name: ETCD_AUTO_COMPACTION_RETENTION + value: 1h + labels: + name: etcd + resources: + limits: + memory: 512Mi + requests: + cpu: 500m + memory: 512Mi + size: 3 + version: 3.3.13 diff --git a/operations/mimir-tests/test-shuffle-sharding.jsonnet b/operations/mimir-tests/test-shuffle-sharding.jsonnet new file mode 100644 index 00000000000..c7f822d589e --- /dev/null +++ b/operations/mimir-tests/test-shuffle-sharding.jsonnet @@ -0,0 +1,32 @@ +local mimir = import 'mimir/mimir.libsonnet'; + +mimir { + _config+:: { + namespace: 'default', + external_url: 'http://test', + + blocks_storage_backend: 'gcs', + blocks_storage_bucket_name: 'blocks-bucket', + bucket_index_enabled: true, + query_scheduler_enabled: true, + + ruler_enabled: true, + ruler_client_type: 'gcs', + ruler_storage_bucket_name: 'rules-bucket', + + alertmanager_enabled: true, + alertmanager_client_type: 'gcs', + alertmanager_gcs_bucket_name: 'alerts-bucket', + alertmanager+: { + sharding_enabled: true, + }, + + shuffle_sharding+:: { + ingester_write_path_enabled: true, + ingester_read_path_enabled: true, + querier_enabled: true, + ruler_enabled: true, + store_gateway_enabled: true, + }, + }, +} diff --git a/operations/mimir/mimir.libsonnet b/operations/mimir/mimir.libsonnet index d22227e9b3d..b0b7b2c5f97 100644 --- a/operations/mimir/mimir.libsonnet +++ b/operations/mimir/mimir.libsonnet @@ -22,4 +22,5 @@ (import 'test-exporter.libsonnet') + // Mimir features +(import 'shuffle-sharding.libsonnet') + (import 'query-sharding.libsonnet') diff --git a/operations/mimir/shuffle-sharding.libsonnet b/operations/mimir/shuffle-sharding.libsonnet new file mode 100644 index 00000000000..c5c28b0a01b --- /dev/null +++ b/operations/mimir/shuffle-sharding.libsonnet @@ -0,0 +1,140 @@ +{ + _config+:: { + shuffle_sharding:: { + // Shuffle sharding can be selectively enabled/disabled for each service. + ingester_write_path_enabled: false, + ingester_read_path_enabled: false, + querier_enabled: false, + ruler_enabled: false, + store_gateway_enabled: false, + + // Default shard sizes. We want the shard size to be divisible by the number of zones. + // We typically run 3 zones + ingester_shard_size: 3, + querier_shard_size: 10, + store_gateway_shard_size: 3, + ruler_shard_size: 2, + }, + + // Check if shuffle-sharding has been enabled. + local shuffle_sharding_enabled = + $._config.shuffle_sharding.ingester_write_path_enabled || + $._config.shuffle_sharding.ingester_read_path_enabled || + $._config.shuffle_sharding.querier_enabled || + $._config.shuffle_sharding.store_gateway_enabled || + $._config.shuffle_sharding.ruler_enabled, + + // The ingesters shard size has been computed this way: + // - Target for 50% utilisation of the user class + // - Target each tenant to 100K series / ingester (after replication) + // - Round up and ensure it's a multiple of 3 (so that it's multi-zone ready) + // + // Eg. small class = 1M series = ceil(((1M * 3) * 50%) / 100K) = 15 + // + overrides+:: if !shuffle_sharding_enabled then {} else { + // Use defaults for this user class. + extra_small_user+:: {}, + + // Target 300K active series. + medium_small_user+:: { + ingestion_tenant_shard_size: 6, + store_gateway_tenant_shard_size: 3, + ruler_tenant_shard_size: 2, + }, + + // Target 1M active series. + small_user+:: { + ingestion_tenant_shard_size: 15, + store_gateway_tenant_shard_size: 6, + ruler_tenant_shard_size: 2, + }, + + // Target 3M active series. + medium_user+:: { + ingestion_tenant_shard_size: 45, + store_gateway_tenant_shard_size: 9, + ruler_tenant_shard_size: 2, + }, + + // Target 6M active series. + big_user+:: { + ingestion_tenant_shard_size: 90, + store_gateway_tenant_shard_size: 12, + ruler_tenant_shard_size: 3, + }, + + // Target 12M active series. + super_user+:: { + ingestion_tenant_shard_size: 180, + store_gateway_tenant_shard_size: 18, + ruler_tenant_shard_size: 6, + }, + + // Target 16M active series. + mega_user+:: { + ingestion_tenant_shard_size: 240, + store_gateway_tenant_shard_size: 24, + ruler_tenant_shard_size: 8, + }, + }, + }, + + distributor_args+:: if !$._config.shuffle_sharding.ingester_write_path_enabled then {} else { + 'distributor.ingestion-tenant-shard-size': $._config.shuffle_sharding.ingester_shard_size, + }, + + ingester_args+:: if !$._config.shuffle_sharding.ingester_write_path_enabled then {} else { + // The shuffle sharding configuration is required on ingesters too because of global limits. + 'distributor.ingestion-tenant-shard-size': $._config.shuffle_sharding.ingester_shard_size, + }, + + query_frontend_args+:: if !$._config.shuffle_sharding.querier_enabled then {} else { + 'frontend.max-queriers-per-tenant': $._config.shuffle_sharding.querier_shard_size, + }, + + query_scheduler_args+:: if !$._config.shuffle_sharding.querier_enabled then {} else { + 'frontend.max-queriers-per-tenant': $._config.shuffle_sharding.querier_shard_size, + }, + + querier_args+:: ( + if !$._config.shuffle_sharding.store_gateway_enabled then {} else { + 'store-gateway.tenant-shard-size': $._config.shuffle_sharding.store_gateway_shard_size, + } + ) + ( + if !$._config.shuffle_sharding.ingester_read_path_enabled then {} else { + 'querier.shuffle-sharding-ingesters-lookback-period': $._config.queryConfig['querier.query-ingesters-within'], + 'distributor.ingestion-tenant-shard-size': $._config.shuffle_sharding.ingester_shard_size, + } + ), + + store_gateway_args+:: if !$._config.shuffle_sharding.store_gateway_enabled then {} else { + 'store-gateway.tenant-shard-size': $._config.shuffle_sharding.store_gateway_shard_size, + }, + + ruler_args+:: ( + if !$._config.shuffle_sharding.ruler_enabled then {} else { + 'ruler.tenant-shard-size': $._config.shuffle_sharding.ruler_shard_size, + } + ) + ( + if !$._config.shuffle_sharding.ingester_write_path_enabled then {} else { + // Required because the ruler directly writes to ingesters. + 'distributor.ingestion-tenant-shard-size': $._config.shuffle_sharding.ingester_shard_size, + } + ) + ( + if !$._config.shuffle_sharding.ingester_read_path_enabled then {} else { + 'querier.shuffle-sharding-ingesters-lookback-period': $._config.queryConfig['querier.query-ingesters-within'], + 'distributor.ingestion-tenant-shard-size': $._config.shuffle_sharding.ingester_shard_size, + } + ) + ( + if !($._config.shuffle_sharding.ingester_write_path_enabled && !$._config.shuffle_sharding.ingester_read_path_enabled) then {} else { + // The shuffle-sharding flags in the ruler applies both to read and write path, so we don’t have a way + // to keep it enabled on the write path and disable it only on the read path. However, we can obtain the + // same effect setting the lookback period to a very high value. + 'querier.shuffle-sharding-ingesters-lookback-period': '87600h', // 3650 days. + } + ) + ( + if !$._config.shuffle_sharding.store_gateway_enabled then {} else { + 'store-gateway.tenant-shard-size': $._config.shuffle_sharding.store_gateway_shard_size, + } + ), +} From 34cae90a140f29937c04bed95c8163c9d0472a5c Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Wed, 26 Jan 2022 16:52:43 +0100 Subject: [PATCH 014/168] Upstream jsonnet config used at Grafana Labs (#905) * Upstream jsonnet config used at Grafana Labs Signed-off-by: Marco Pracucci * Rebuilt tests Signed-off-by: Marco Pracucci --- CHANGELOG.md | 7 ++ ...est-disable-chunk-streaming-generated.yaml | 15 ++- .../test-query-sharding-generated.yaml | 16 ++- .../test-shuffle-sharding-generated.yaml | 100 ++++++++++-------- .../test-storage-azure-generated.yaml | 15 ++- .../test-storage-gcs-generated.yaml | 15 ++- .../test-storage-s3-generated.yaml | 15 ++- operations/mimir/alertmanager.libsonnet | 1 - operations/mimir/config.libsonnet | 5 +- operations/mimir/ingester.libsonnet | 8 +- operations/mimir/querier.libsonnet | 4 +- operations/mimir/query-frontend.libsonnet | 3 - operations/mimir/query-scheduler.libsonnet | 1 - operations/mimir/query-tee.libsonnet | 1 - operations/mimir/store-gateway.libsonnet | 8 ++ 15 files changed, 136 insertions(+), 78 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 951d53e2c58..e51ef847962 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -539,6 +539,13 @@ * `cortex_store_gateway_data_disk_class` renamed to `store_gateway_data_disk_class` * `cortex_store_gateway_data_disk_size` renamed to `store_gateway_data_disk_size` * [CHANGE] The overrides configmap default mountpoint has changed from `/etc/cortex` to `/etc/mimir`. It can be customized via the `overrides_configmap_mountpoint` config field. #899 +* [CHANGE] Enabled in the querier the features to query label names with matchers, PromQL at modifier and query long-term storage for labels. #905 +* [CHANGE] Reduced TSDB blocks retention on ingesters disk from 96h to 24h. #905 +* [CHANGE] Enabled closing of idle TSDB in ingesters. #905 +* [CHANGE] Disabled TSDB isolation in ingesters for better performances. #905 +* [CHANGE] Changed log level of querier, query-frontend, query-scheduler and alertmanager from `debug` to `info`. #905 +* [CHANGE] Enabled attributes in-memory cache in store-gateway. #905 +* [CHANGE] Configured store-gateway to not load blocks containing samples more recent than 10h (because such samples are queried from ingesters). #905 * [FEATURE] Added query sharding support. It can be enabled setting `cortex_query_sharding_enabled: true` in the `_config` object. #653 * [FEATURE] Added shuffle-sharding support. It can be enabled and configured using the following config: #902 ``` diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index aaf15530134..be67c6cc05e 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -836,12 +836,14 @@ spec: - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - - -log.level=debug - -mem-ballast-size-bytes=268435456 + - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h + - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m @@ -928,7 +930,6 @@ spec: - -frontend.results-cache.memcached.timeout=500ms - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s @@ -995,7 +996,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -log.level=debug - -query-scheduler.max-outstanding-requests-per-tenant=100 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -1078,7 +1078,9 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true + - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h - -ring.heartbeat-timeout=10m - -ring.prefix= @@ -1161,7 +1163,6 @@ spec: - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -1338,8 +1339,10 @@ spec: - -blocks-storage.backend=gcs - -blocks-storage.gcs.bucket-name=blocks-bucket - -blocks-storage.tsdb.block-ranges-period=2h + - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - - -blocks-storage.tsdb.retention-period=96h + - -blocks-storage.tsdb.isolation-enabled=false + - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true @@ -1643,6 +1646,7 @@ spec: - args: - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 @@ -1652,6 +1656,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index cfdd56fea2b..f437c840640 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -835,12 +835,14 @@ spec: - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - - -log.level=debug - -mem-ballast-size-bytes=268435456 + - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=419430400 - -querier.max-concurrent=16 - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h + - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m @@ -930,7 +932,7 @@ spec: - -frontend.results-cache.memcached.timeout=500ms - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - - -log.level=debug + - -querier.at-modifier-enabled=true - -querier.max-query-parallelism=240 - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=419430400 @@ -998,7 +1000,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -log.level=debug - -query-scheduler.max-outstanding-requests-per-tenant=800 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -1081,7 +1082,9 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true + - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h - -ring.heartbeat-timeout=10m - -ring.prefix= @@ -1164,7 +1167,6 @@ spec: - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -1341,8 +1343,10 @@ spec: - -blocks-storage.backend=gcs - -blocks-storage.gcs.bucket-name=blocks-bucket - -blocks-storage.tsdb.block-ranges-period=2h + - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - - -blocks-storage.tsdb.retention-period=96h + - -blocks-storage.tsdb.isolation-enabled=false + - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true @@ -1646,6 +1650,7 @@ spec: - args: - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 @@ -1655,6 +1660,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index bea84a11052..ccdf336096f 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -300,8 +300,8 @@ spec: clusterIP: None ports: - name: alertmanager-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: alertmanager-grpc port: 9095 targetPort: 9095 @@ -349,8 +349,8 @@ spec: clusterIP: None ports: - name: distributor-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: distributor-grpc port: 9095 targetPort: 9095 @@ -367,8 +367,8 @@ metadata: spec: ports: - name: ingester-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ingester-grpc port: 9095 targetPort: 9095 @@ -461,8 +461,8 @@ metadata: spec: ports: - name: querier-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: querier-grpc port: 9095 targetPort: 9095 @@ -479,8 +479,8 @@ metadata: spec: ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -498,8 +498,8 @@ spec: clusterIP: None ports: - name: query-frontend-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-frontend-grpc port: 9095 targetPort: 9095 @@ -517,8 +517,8 @@ metadata: spec: ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -536,8 +536,8 @@ spec: clusterIP: None ports: - name: query-scheduler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: query-scheduler-grpc port: 9095 targetPort: 9095 @@ -555,8 +555,8 @@ metadata: spec: ports: - name: ruler-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: ruler-grpc port: 9095 targetPort: 9095 @@ -573,8 +573,8 @@ metadata: spec: ports: - name: store-gateway-http-metrics - port: 80 - targetPort: 80 + port: 8080 + targetPort: 8080 - name: store-gateway-grpc port: 9095 targetPort: 9095 @@ -760,19 +760,20 @@ spec: - -server.grpc.keepalive.max-connection-idle=1m - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=distributor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: distributor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -836,12 +837,14 @@ spec: - -distributor.health-check-ingesters=true - -distributor.ingestion-tenant-shard-size=3 - -distributor.replication-factor=3 - - -log.level=debug - -mem-ballast-size-bytes=268435456 + - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h + - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -querier.shuffle-sharding-ingesters-lookback-period=13h - -querier.worker-match-max-concurrent=true @@ -850,6 +853,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -866,14 +870,14 @@ spec: imagePullPolicy: IfNotPresent name: querier ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -930,11 +934,11 @@ spec: - -frontend.results-cache.memcached.timeout=500ms - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -server.http-write-timeout=1m - -store.max-query-length=12000h - -target=query-frontend @@ -942,14 +946,14 @@ spec: imagePullPolicy: IfNotPresent name: query-frontend ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -997,23 +1001,23 @@ spec: containers: - args: - -frontend.max-queriers-per-tenant=10 - - -log.level=debug - -query-scheduler.max-outstanding-requests-per-tenant=100 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=query-scheduler image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: query-scheduler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1080,7 +1084,9 @@ spec: - -distributor.ingestion-tenant-shard-size=3 - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true + - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h - -querier.shuffle-sharding-ingesters-lookback-period=13h - -ring.heartbeat-timeout=10m @@ -1098,6 +1104,7 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1110,14 +1117,14 @@ spec: imagePullPolicy: IfNotPresent name: ruler ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1165,10 +1172,10 @@ spec: - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=alertmanager env: - name: POD_IP @@ -1179,14 +1186,14 @@ spec: imagePullPolicy: IfNotPresent name: alertmanager ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1261,19 +1268,20 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=compactor image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: compactor ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1340,8 +1348,10 @@ spec: - -blocks-storage.backend=gcs - -blocks-storage.gcs.bucket-name=blocks-bucket - -blocks-storage.tsdb.block-ranges-period=2h + - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - - -blocks-storage.tsdb.retention-period=96h + - -blocks-storage.tsdb.isolation-enabled=false + - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true @@ -1362,19 +1372,20 @@ spec: - -server.grpc-max-send-msg-size-bytes=10485760 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -target=ingester image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent name: ingester ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: @@ -1645,6 +1656,7 @@ spec: - args: - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 @@ -1654,6 +1666,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 @@ -1682,6 +1695,7 @@ spec: - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= @@ -1694,14 +1708,14 @@ spec: imagePullPolicy: IfNotPresent name: store-gateway ports: - - containerPort: 80 + - containerPort: 8080 name: http-metrics - containerPort: 9095 name: grpc readinessProbe: httpGet: path: /ready - port: 80 + port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1 resources: diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index a8613b230fd..8e7708ac03f 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -837,12 +837,14 @@ spec: - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - - -log.level=debug - -mem-ballast-size-bytes=268435456 + - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h + - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m @@ -929,7 +931,6 @@ spec: - -frontend.results-cache.memcached.timeout=500ms - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s @@ -996,7 +997,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -log.level=debug - -query-scheduler.max-outstanding-requests-per-tenant=100 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -1081,7 +1081,9 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true + - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h - -ring.heartbeat-timeout=10m - -ring.prefix= @@ -1168,7 +1170,6 @@ spec: - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -1349,8 +1350,10 @@ spec: - -blocks-storage.azure.container-name=blocks-bucket - -blocks-storage.backend=azure - -blocks-storage.tsdb.block-ranges-period=2h + - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - - -blocks-storage.tsdb.retention-period=96h + - -blocks-storage.tsdb.isolation-enabled=false + - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true @@ -1657,6 +1660,7 @@ spec: - -blocks-storage.azure.container-name=blocks-bucket - -blocks-storage.backend=azure - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 @@ -1666,6 +1670,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 646fd58b382..9b512e77669 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -835,12 +835,14 @@ spec: - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - - -log.level=debug - -mem-ballast-size-bytes=268435456 + - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h + - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m @@ -927,7 +929,6 @@ spec: - -frontend.results-cache.memcached.timeout=500ms - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s @@ -994,7 +995,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -log.level=debug - -query-scheduler.max-outstanding-requests-per-tenant=100 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -1077,7 +1077,9 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true + - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h - -ring.heartbeat-timeout=10m - -ring.prefix= @@ -1160,7 +1162,6 @@ spec: - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -1337,8 +1338,10 @@ spec: - -blocks-storage.backend=gcs - -blocks-storage.gcs.bucket-name=blocks-bucket - -blocks-storage.tsdb.block-ranges-period=2h + - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - - -blocks-storage.tsdb.retention-period=96h + - -blocks-storage.tsdb.isolation-enabled=false + - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true @@ -1642,6 +1645,7 @@ spec: - args: - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 @@ -1651,6 +1655,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index f8053cbd851..6ba5090c043 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -836,12 +836,14 @@ spec: - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - - -log.level=debug - -mem-ballast-size-bytes=268435456 + - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h + - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m @@ -928,7 +930,6 @@ spec: - -frontend.results-cache.memcached.timeout=500ms - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=104857600 - -server.grpc.keepalive.min-time-between-pings=10s @@ -995,7 +996,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -log.level=debug - -query-scheduler.max-outstanding-requests-per-tenant=100 - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -1079,7 +1079,9 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true + - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h - -ring.heartbeat-timeout=10m - -ring.prefix= @@ -1165,7 +1167,6 @@ spec: - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - -experimental.alertmanager.enable-api=true - - -log.level=debug - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true @@ -1344,8 +1345,10 @@ spec: - -blocks-storage.s3.bucket-name=blocks-bucket - -blocks-storage.s3.endpoint=s3.dualstack.us-east-1.amazonaws.com - -blocks-storage.tsdb.block-ranges-period=2h + - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - - -blocks-storage.tsdb.retention-period=96h + - -blocks-storage.tsdb.isolation-enabled=false + - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true @@ -1649,6 +1652,7 @@ spec: - args: - -blocks-storage.backend=s3 - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 @@ -1658,6 +1662,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 diff --git a/operations/mimir/alertmanager.libsonnet b/operations/mimir/alertmanager.libsonnet index 070a4e46be5..c2820334cfd 100644 --- a/operations/mimir/alertmanager.libsonnet +++ b/operations/mimir/alertmanager.libsonnet @@ -65,7 +65,6 @@ mode.args + { target: 'alertmanager', - 'log.level': 'debug', 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, 'experimental.alertmanager.enable-api': 'true', 'alertmanager.storage.path': '/data', diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index 774917cd7fb..58819e2c31b 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -136,11 +136,14 @@ // No need to look at store for data younger than 12h, as ingesters have all of it. 'querier.query-store-after': '12h', + + // Enable the support for label matchers when queriying label names. + 'querier.query-label-names-with-matchers-enabled': true, }, // PromQL query engine config (shared between all services running PromQL engine, like the ruler and querier). queryEngineConfig: { - // Keep it even if empty, to allow downstream projects to easily configure it. + 'querier.at-modifier-enabled': true, }, ringConfig: { diff --git a/operations/mimir/ingester.libsonnet b/operations/mimir/ingester.libsonnet index 441403f9a61..2dc7c32cba5 100644 --- a/operations/mimir/ingester.libsonnet +++ b/operations/mimir/ingester.libsonnet @@ -32,9 +32,15 @@ // Blocks storage. 'blocks-storage.tsdb.dir': '/data/tsdb', 'blocks-storage.tsdb.block-ranges-period': '2h', - 'blocks-storage.tsdb.retention-period': '96h', // 4 days protection against blocks not being uploaded from ingesters. + 'blocks-storage.tsdb.retention-period': '24h', // 1 day protection against blocks not being uploaded from ingesters. 'blocks-storage.tsdb.ship-interval': '1m', + // Close idle TSDBs. + 'blocks-storage.tsdb.close-idle-tsdb-timeout': $._config.queryConfig['querier.query-ingesters-within'], + + // Disable TSDB isolation. + 'blocks-storage.tsdb.isolation-enabled': 'false', + // Persist ring tokens so that when the ingester will be restarted // it will pick the same tokens 'ingester.tokens-file-path': '/data/tokens', diff --git a/operations/mimir/querier.libsonnet b/operations/mimir/querier.libsonnet index e4eb96079cc..44ff9c9aa11 100644 --- a/operations/mimir/querier.libsonnet +++ b/operations/mimir/querier.libsonnet @@ -29,11 +29,11 @@ 'querier.frontend-address': 'query-frontend-discovery.%(namespace)s.svc.cluster.local:9095' % $._config, 'querier.frontend-client.grpc-max-send-msg-size': 100 << 20, + 'querier.query-store-for-labels-enabled': true, + // We request high memory but the Go heap is typically very low (< 100MB) and this causes // the GC to trigger continuously. Setting a ballast of 256MB reduces GC. 'mem-ballast-size-bytes': 1 << 28, // 256M - - 'log.level': 'debug', }, querier_ports:: $.util.defaultPorts, diff --git a/operations/mimir/query-frontend.libsonnet b/operations/mimir/query-frontend.libsonnet index 05261d7b45b..61f1785fbc6 100644 --- a/operations/mimir/query-frontend.libsonnet +++ b/operations/mimir/query-frontend.libsonnet @@ -6,9 +6,6 @@ { target: 'query-frontend', - // Need log.level=debug so all queries are logged, needed for analyse.py. - 'log.level': 'debug', - 'server.http-listen-port': $._config.server_http_port, // Increase HTTP server response write timeout, as we were seeing some diff --git a/operations/mimir/query-scheduler.libsonnet b/operations/mimir/query-scheduler.libsonnet index d2401a2176b..f9e89c0a3c3 100644 --- a/operations/mimir/query-scheduler.libsonnet +++ b/operations/mimir/query-scheduler.libsonnet @@ -9,7 +9,6 @@ $._config.grpcConfig { target: 'query-scheduler', - 'log.level': 'debug', 'server.http-listen-port': $._config.server_http_port, 'query-scheduler.max-outstanding-requests-per-tenant': 100, }, diff --git a/operations/mimir/query-tee.libsonnet b/operations/mimir/query-tee.libsonnet index 4ac3b0a1275..36fb5572b61 100644 --- a/operations/mimir/query-tee.libsonnet +++ b/operations/mimir/query-tee.libsonnet @@ -6,7 +6,6 @@ local servicePort = $.core.v1.servicePort, query_tee_args:: { - 'log.level': 'debug', 'backend.endpoints': std.join(',', $._config.query_tee_backend_endpoints), 'backend.preferred': $._config.query_tee_backend_preferred, }, diff --git a/operations/mimir/store-gateway.libsonnet b/operations/mimir/store-gateway.libsonnet index fa0b9979381..c8ab7ca24b4 100644 --- a/operations/mimir/store-gateway.libsonnet +++ b/operations/mimir/store-gateway.libsonnet @@ -48,6 +48,14 @@ 'blocks-storage.bucket-store.index-cache.memcached.max-idle-connections': $.store_gateway_args['blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency'], 'blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections': $.store_gateway_args['blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency'], 'blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections': $.store_gateway_args['blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency'], + + // Enable segment objects attributes in-memory cache. + 'blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items': 50000, + + // Queriers will not query store for data younger than 12h (see -querier.query-store-after). + // Store-gateways don't need to load blocks with very most recent data. We use 2h buffer to + // make sure that blocks are ready for querying when needed. + 'blocks-storage.bucket-store.ignore-blocks-within': '10h', } + $.blocks_chunks_caching_config + $.blocks_metadata_caching_config + From 37e38164d50584e5d34e1e3ff41ab4199719c33e Mon Sep 17 00:00:00 2001 From: Andy Asp <90626759+andyasp@users.noreply.github.com> Date: Wed, 26 Jan 2022 14:07:19 -0500 Subject: [PATCH 015/168] Change the default of ignore_deletion_mark_delay to 1h (#892) * Change the default of ignore_deletion_mark_delay to 1h * Remove reference to actual default value in docs --- CHANGELOG.md | 1 + docs/sources/blocks-storage/production-tips.md | 2 +- docs/sources/blocks-storage/querier.md | 5 ++--- docs/sources/blocks-storage/store-gateway.md | 5 ++--- docs/sources/configuration/config-file-reference.md | 5 ++--- .../mimir-tests/test-disable-chunk-streaming-generated.yaml | 3 --- operations/mimir-tests/test-query-sharding-generated.yaml | 3 --- operations/mimir-tests/test-shuffle-sharding-generated.yaml | 3 --- operations/mimir-tests/test-storage-azure-generated.yaml | 3 --- operations/mimir-tests/test-storage-gcs-generated.yaml | 3 --- operations/mimir-tests/test-storage-s3-generated.yaml | 3 --- operations/mimir/config.libsonnet | 1 - pkg/storage/tsdb/config.go | 5 ++--- 13 files changed, 10 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e51ef847962..4558216fe39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -219,6 +219,7 @@ * `-ruler.sharding-strategy` option has been removed from ruler. Ruler now uses shuffle-sharding by default, but respects `ruler_tenant_shard_size`, which defaults to 0 (ie. use all rulers for tenant). #889 * `-store-gateway.sharding-strategy` option has been removed store-gateways. Store-gateway now uses shuffle-sharding by default, but respects `store_gateway_tenant_shard_size` for tenant, and this value defaults to 0. #891 * [CHANGE] Server: `-server.http-listen-port` (yaml: `server.http_listen_port`) now defaults to `8080` (previously `80`). #871 +* [CHANGE] Changed the default value of `blocks-storage.bucket-store.ignore-deletion-marks-delay` from 6h to 1h. #892 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/docs/sources/blocks-storage/production-tips.md b/docs/sources/blocks-storage/production-tips.md index 6f828a564d9..30b6dbfe7d9 100644 --- a/docs/sources/blocks-storage/production-tips.md +++ b/docs/sources/blocks-storage/production-tips.md @@ -51,7 +51,7 @@ Because of this, we would suggest to avoid querying non compacted blocks. In ord 3. Configure queriers `-querier.query-store-after` large enough to give compactor enough time to compact newly uploaded blocks (_see below_) 4. Configure queriers `-querier.query-ingesters-within` equal to `-querier.query-store-after` plus 5m (5 minutes is just a delta to query the boundary both from ingesters and queriers) 5. Configure ingesters `-blocks-storage.tsdb.retention-period` at least as `-querier.query-ingesters-within` -6. Lower `-blocks-storage.bucket-store.ignore-deletion-marks-delay` to 1h, otherwise non compacted blocks could be queried anyway, even if their compacted replacement is available +6. Ensure `-blocks-storage.bucket-store.ignore-deletion-marks-delay` is not too large (the default is suggested), otherwise non compacted blocks could be queried anyway, even if their compacted replacement is available #### How to estimate `-querier.query-store-after` diff --git a/docs/sources/blocks-storage/querier.md b/docs/sources/blocks-storage/querier.md index 9ce24e5e7e8..4d55b801d39 100644 --- a/docs/sources/blocks-storage/querier.md +++ b/docs/sources/blocks-storage/querier.md @@ -578,10 +578,9 @@ blocks_storage: # while fetching blocks. The idea of ignore-deletion-marks-delay is to # ignore blocks that are marked for deletion with some delay. This ensures # store can still serve blocks that are meant to be deleted but do not have - # a replacement yet. Default is 6h, half of the default value for - # -compactor.deletion-delay. + # a replacement yet. # CLI flag: -blocks-storage.bucket-store.ignore-deletion-marks-delay - [ignore_deletion_mark_delay: | default = 6h] + [ignore_deletion_mark_delay: | default = 1h] bucket_index: # True to enable querier and store-gateway to discover blocks in the diff --git a/docs/sources/blocks-storage/store-gateway.md b/docs/sources/blocks-storage/store-gateway.md index 3f5899584c8..ca3e0e77a64 100644 --- a/docs/sources/blocks-storage/store-gateway.md +++ b/docs/sources/blocks-storage/store-gateway.md @@ -649,10 +649,9 @@ blocks_storage: # while fetching blocks. The idea of ignore-deletion-marks-delay is to # ignore blocks that are marked for deletion with some delay. This ensures # store can still serve blocks that are meant to be deleted but do not have - # a replacement yet. Default is 6h, half of the default value for - # -compactor.deletion-delay. + # a replacement yet. # CLI flag: -blocks-storage.bucket-store.ignore-deletion-marks-delay - [ignore_deletion_mark_delay: | default = 6h] + [ignore_deletion_mark_delay: | default = 1h] bucket_index: # True to enable querier and store-gateway to discover blocks in the diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 9d9dfe397bb..158f8d69634 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -3047,10 +3047,9 @@ bucket_store: # while fetching blocks. The idea of ignore-deletion-marks-delay is to ignore # blocks that are marked for deletion with some delay. This ensures store can # still serve blocks that are meant to be deleted but do not have a - # replacement yet. Default is 6h, half of the default value for - # -compactor.deletion-delay. + # replacement yet. # CLI flag: -blocks-storage.bucket-store.ignore-deletion-marks-delay - [ignore_deletion_mark_delay: | default = 6h] + [ignore_deletion_mark_delay: | default = 1h] bucket_index: # True to enable querier and store-gateway to discover blocks in the storage diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index be67c6cc05e..e24104157ce 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -822,7 +822,6 @@ spec: - args: - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1062,7 +1061,6 @@ spec: - -api.response-compression-enabled=true - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1657,7 +1655,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index f437c840640..c80218d9365 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -821,7 +821,6 @@ spec: - args: - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1066,7 +1065,6 @@ spec: - -api.response-compression-enabled=true - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1661,7 +1659,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index ccdf336096f..f2c827b8a64 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -822,7 +822,6 @@ spec: - args: - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1067,7 +1066,6 @@ spec: - -api.response-compression-enabled=true - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1667,7 +1665,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index 8e7708ac03f..ae7e665920b 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -824,7 +824,6 @@ spec: - -blocks-storage.azure.container-name=blocks-bucket - -blocks-storage.backend=azure - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1066,7 +1065,6 @@ spec: - -blocks-storage.azure.container-name=blocks-bucket - -blocks-storage.backend=azure - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1671,7 +1669,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 9b512e77669..8bd4055a432 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -821,7 +821,6 @@ spec: - args: - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1061,7 +1060,6 @@ spec: - -api.response-compression-enabled=true - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1656,7 +1654,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index 6ba5090c043..4172785ef2e 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -821,7 +821,6 @@ spec: - args: - -blocks-storage.backend=s3 - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1062,7 +1061,6 @@ spec: - -api.response-compression-enabled=true - -blocks-storage.backend=s3 - -blocks-storage.bucket-store.bucket-index.enabled=true - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1663,7 +1661,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index 58819e2c31b..2ffc05abf84 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -89,7 +89,6 @@ genericBlocksStorageConfig:: {}, queryBlocksStorageConfig:: { 'blocks-storage.bucket-store.sync-dir': '/data/tsdb', - 'blocks-storage.bucket-store.ignore-deletion-marks-delay': '1h', 'store-gateway.sharding-enabled': true, 'store-gateway.sharding-ring.store': 'consul', diff --git a/pkg/storage/tsdb/config.go b/pkg/storage/tsdb/config.go index f239834c5d5..73b9a948130 100644 --- a/pkg/storage/tsdb/config.go +++ b/pkg/storage/tsdb/config.go @@ -307,9 +307,8 @@ func (cfg *BucketStoreConfig) RegisterFlags(f *flag.FlagSet) { f.IntVar(&cfg.BlockSyncConcurrency, "blocks-storage.bucket-store.block-sync-concurrency", 20, "Maximum number of concurrent blocks synching per tenant.") f.IntVar(&cfg.MetaSyncConcurrency, "blocks-storage.bucket-store.meta-sync-concurrency", 20, "Number of Go routines to use when syncing block meta files from object storage per tenant.") f.DurationVar(&cfg.ConsistencyDelay, "blocks-storage.bucket-store.consistency-delay", 0, "Minimum age of a block before it's being read. Set it to safe value (e.g 30m) if your object storage is eventually consistent. GCS and S3 are (roughly) strongly consistent.") - f.DurationVar(&cfg.IgnoreDeletionMarksDelay, "blocks-storage.bucket-store.ignore-deletion-marks-delay", time.Hour*6, "Duration after which the blocks marked for deletion will be filtered out while fetching blocks. "+ - "The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. "+ - "Default is 6h, half of the default value for -compactor.deletion-delay.") + f.DurationVar(&cfg.IgnoreDeletionMarksDelay, "blocks-storage.bucket-store.ignore-deletion-marks-delay", time.Hour*1, "Duration after which the blocks marked for deletion will be filtered out while fetching blocks. "+ + "The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet.") f.DurationVar(&cfg.IgnoreBlocksWithin, "blocks-storage.bucket-store.ignore-blocks-within", 0, "Blocks with minimum time within this duration are ignored, and not loaded by store-gateway. Useful when used together with -querier.query-store-after to prevent loading young blocks, because there are usually many of them (depending on number of ingesters) and they are not yet compacted. Negative values or 0 disable the filter.") f.IntVar(&cfg.PostingOffsetsInMemSampling, "blocks-storage.bucket-store.posting-offsets-in-mem-sampling", DefaultPostingOffsetInMemorySampling, "Controls what is the ratio of postings offsets that the store will hold in memory.") f.BoolVar(&cfg.IndexHeaderLazyLoadingEnabled, "blocks-storage.bucket-store.index-header-lazy-loading-enabled", true, "If enabled, store-gateway will lazy load an index-header only once required by a query.") From f2ca89c7870dd1778608b5f3dfa1e9dfaba54d57 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Thu, 27 Jan 2022 08:27:08 +0100 Subject: [PATCH 016/168] Implement configuration parameter categorization (#840) * cmd/mimir: Detect flags' categories Signed-off-by: Arve Knudsen * compactor: Mark BlockRanges as advanced Signed-off-by: Arve Knudsen * Implement help flag explicitly Signed-off-by: Arve Knudsen * Add advanced and experimental help flags Signed-off-by: Arve Knudsen * Fix printing of non-configuration param flags Signed-off-by: Arve Knudsen * Fix quoting of default string values Signed-off-by: Arve Knudsen * Add to changelog Signed-off-by: Arve Knudsen * Introduce -help-all flag instead of -help-advanced etc Signed-off-by: Arve Knudsen * Print [experimental] before experimental flags Signed-off-by: Arve Knudsen * Mark querier.at_modifier_enabled experimental Signed-off-by: Arve Knudsen * Move experimental prefix before usage string instead Signed-off-by: Arve Knudsen * cmd/mimir: Detect flags' categories Signed-off-by: Arve Knudsen * Implement help flag explicitly Signed-off-by: Arve Knudsen * Add advanced and experimental help flags Signed-off-by: Arve Knudsen * Fix printing of non-configuration param flags Signed-off-by: Arve Knudsen * Fix quoting of default string values Signed-off-by: Arve Knudsen * Add to changelog Signed-off-by: Arve Knudsen * Introduce -help-all flag instead of -help-advanced etc Signed-off-by: Arve Knudsen * Print [experimental] before experimental flags Signed-off-by: Arve Knudsen * Update cmd/mimir/usage.go Co-authored-by: Mauro Stettler * Move experimental prefix before usage string instead Signed-off-by: Arve Knudsen * Remove special formatting of one-character flags Signed-off-by: Arve Knudsen * Document that the basic flag category is the default Signed-off-by: Arve Knudsen * Add tests Signed-off-by: Arve Knudsen * Add Make target reference-help Signed-off-by: Arve Knudsen * Add hint to -help output Signed-off-by: Arve Knudsen Co-authored-by: Mauro Stettler --- CHANGELOG.md | 1 + Makefile | 9 + cmd/mimir/help-all.txt.tmpl | 1659 ++++++++++++++++++++++++++++++++++ cmd/mimir/help.txt.tmpl | 1657 +++++++++++++++++++++++++++++++++ cmd/mimir/main.go | 29 +- cmd/mimir/main_test.go | 83 +- cmd/mimir/usage.go | 148 +++ pkg/compactor/compactor.go | 2 +- pkg/querier/engine/config.go | 2 +- tools/doc-generator/main.go | 4 +- 10 files changed, 3579 insertions(+), 15 deletions(-) create mode 100644 cmd/mimir/help-all.txt.tmpl create mode 100644 cmd/mimir/help.txt.tmpl create mode 100644 cmd/mimir/usage.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 4558216fe39..84561b5d17e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -267,6 +267,7 @@ * Added `-ruler.tenant-federation.enabled` config flag. * Added support for `source_tenants` field on rule groups. * [FEATURE] Mimir: Added "Activity tracker" feature which can log ongoing activities from previous Mimir run in case of the crash. It is enabled by default and controlled by the `-activity-tracker.filepath` flag. It can be disabled by setting this path to an empty string. Currently, the Store-gateway, Ruler, Querier, and Query-frontend components uses this feature. #631 #782 #822 +* [FEATURE] Mimir: Divide configuration parameters into categories "basic", "advanced", and "experimental". Only flags in the basic category are shown when invoking `-help`, whereas `-help-all` will include flags in all categories (basic, advanced, experimental). #840 * [ENHANCEMENT] Query-frontend: added `cortex_query_frontend_workers_enqueued_requests_total` metric to track the number of requests enqueued in each query-scheduler. #384 * [ENHANCEMENT] Add a flag (`--proxy.compare-use-relative-error`) in the query-tee to compare floating point values using relative error. #208 * [ENHANCEMENT] Add a flag (`--proxy.compare-skip-recent-samples`) in the query-tee to skip comparing recent samples. By default samples not older than 1 minute are skipped. #234 diff --git a/Makefile b/Makefile index 9f42e55bfee..4cafab868e7 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,8 @@ VERSION=$(shell cat "./VERSION" 2> /dev/null) GOOS ?= $(shell go env GOOS) GOARCH ?= $(shell go env GOARCH) +HOSTNAME := $(shell hostname) + # Don't export GOOS and GOARCH as environment variables. They get exported when passed via CLI options, # but that breaks tools ran via "go run". We use GOOS/GOARCH explicitly in places where needed. unexport GOOS @@ -398,6 +400,13 @@ check-doc: doc ./operations/mimir-mixin/docs/sources/*.md \ || (echo "Please update generated documentation by running 'make doc'" && false) +.PHONY: reference-help +reference-help: cmd/mimir/mimir + @(./cmd/mimir/mimir -h || true) > cmd/mimir/help.txt.tmpl + @sed -i s/$(HOSTNAME)/\{\{.Hostname\}\}/g cmd/mimir/help.txt.tmpl + @(./cmd/mimir/mimir -help-all || true) > cmd/mimir/help-all.txt.tmpl + @sed -i s/$(HOSTNAME)/\{\{.Hostname\}\}/g cmd/mimir/help-all.txt.tmpl + clean-white-noise: @find . -path ./.pkg -prune -o -path ./vendor -prune -o -path ./website -prune -or -type f -name "*.md" -print | \ SED_BIN="$(SED)" xargs ./tools/cleanup-white-noise.sh diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl new file mode 100644 index 00000000000..8aa9e7e5571 --- /dev/null +++ b/cmd/mimir/help-all.txt.tmpl @@ -0,0 +1,1659 @@ +Usage of ./cmd/mimir/mimir: + -activity-tracker.filepath string + File where ongoing activities are stored. If empty, activity tracking is disabled. (default "/tmp/metrics-activity.log") + -activity-tracker.max-entries int + Max number of concurrent activities that can be tracked. Used to size the file in advance. Additional activities are ignored. (default 1024) + -alertmanager-storage.azure.account-key value + Azure storage account key + -alertmanager-storage.azure.account-name string + Azure storage account name + -alertmanager-storage.azure.container-name string + Azure storage container name + -alertmanager-storage.azure.endpoint-suffix string + Azure storage endpoint suffix without schema. The account name will be prefixed to this value to create the FQDN. If set to empty string, default endpoint suffix is used. + -alertmanager-storage.azure.max-retries int + Number of retries for recoverable errors (default 20) + -alertmanager-storage.azure.msi-resource string + If set, this URL is used instead of https://. for obtaining ServicePrincipalToken from MSI. + -alertmanager-storage.azure.user-assigned-id string + User assigned identity. If empty, then System assigned identity is used. + -alertmanager-storage.backend string + Backend storage to use. Supported backends are: s3, gcs, azure, swift, filesystem, local. (default "filesystem") + -alertmanager-storage.filesystem.dir string + Local filesystem storage directory. (default "alertmanager") + -alertmanager-storage.gcs.bucket-name string + GCS bucket name + -alertmanager-storage.gcs.service-account value + JSON representing either a Google Developers Console client_credentials.json file or a Google Developers service account key file. If empty, fallback to Google default logic. + -alertmanager-storage.local.path string + Path at which alertmanager configurations are stored. + -alertmanager-storage.s3.access-key-id string + S3 access key ID + -alertmanager-storage.s3.bucket-name string + S3 bucket name + -alertmanager-storage.s3.endpoint string + The S3 bucket endpoint. It could be an AWS S3 endpoint listed at https://docs.aws.amazon.com/general/latest/gr/s3.html or the address of an S3-compatible service in hostname:port format. + -alertmanager-storage.s3.expect-continue-timeout duration + The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) + -alertmanager-storage.s3.http.idle-conn-timeout duration + The time an idle connection will remain idle before closing. (default 1m30s) + -alertmanager-storage.s3.http.insecure-skip-verify + If the client connects to S3 via HTTPS and this option is enabled, the client will accept any certificate and hostname. + -alertmanager-storage.s3.http.response-header-timeout duration + The amount of time the client will wait for a servers response headers. (default 2m0s) + -alertmanager-storage.s3.insecure + If enabled, use http:// for the S3 endpoint instead of https://. This could be useful in local dev/test environments while using an S3-compatible backend storage, like Minio. + -alertmanager-storage.s3.max-connections-per-host int + Maximum number of connections per host. 0 means no limit. + -alertmanager-storage.s3.max-idle-connections int + Maximum number of idle (keep-alive) connections across all hosts. 0 means no limit. (default 100) + -alertmanager-storage.s3.max-idle-connections-per-host int + Maximum number of idle (keep-alive) connections to keep per-host. If 0, a built-in default value is used. (default 100) + -alertmanager-storage.s3.region string + S3 region. If unset, the client will issue a S3 GetBucketLocation API call to autodetect it. + -alertmanager-storage.s3.secret-access-key value + S3 secret access key + -alertmanager-storage.s3.signature-version string + The signature version to use for authenticating against S3. Supported values are: v4, v2. (default "v4") + -alertmanager-storage.s3.sse.kms-encryption-context string + KMS Encryption Context used for object encryption. It expects JSON formatted string. + -alertmanager-storage.s3.sse.kms-key-id string + KMS Key ID used to encrypt objects in S3 + -alertmanager-storage.s3.sse.type string + Enable AWS Server Side Encryption. Supported values: SSE-KMS, SSE-S3. + -alertmanager-storage.s3.tls-handshake-timeout duration + Maximum time to wait for a TLS handshake. 0 means no limit. (default 10s) + -alertmanager-storage.swift.auth-url string + OpenStack Swift authentication URL + -alertmanager-storage.swift.auth-version int + OpenStack Swift authentication API version. 0 to autodetect. + -alertmanager-storage.swift.connect-timeout duration + Time after which a connection attempt is aborted. (default 10s) + -alertmanager-storage.swift.container-name string + Name of the OpenStack Swift container to put chunks in. + -alertmanager-storage.swift.domain-id string + OpenStack Swift user's domain ID. + -alertmanager-storage.swift.domain-name string + OpenStack Swift user's domain name. + -alertmanager-storage.swift.max-retries int + Max retries on requests error. (default 3) + -alertmanager-storage.swift.password string + OpenStack Swift API key. + -alertmanager-storage.swift.project-domain-id string + ID of the OpenStack Swift project's domain (v3 auth only), only needed if it differs the from user domain. + -alertmanager-storage.swift.project-domain-name string + Name of the OpenStack Swift project's domain (v3 auth only), only needed if it differs from the user domain. + -alertmanager-storage.swift.project-id string + OpenStack Swift project ID (v2,v3 auth only). + -alertmanager-storage.swift.project-name string + OpenStack Swift project name (v2,v3 auth only). + -alertmanager-storage.swift.region-name string + OpenStack Swift Region to use (v2,v3 auth only). + -alertmanager-storage.swift.request-timeout duration + Time after which an idle request is aborted. The timeout watchdog is reset each time some data is received, so the timeout triggers after X time no data is received on a request. (default 5s) + -alertmanager-storage.swift.user-domain-id string + OpenStack Swift user's domain ID. + -alertmanager-storage.swift.user-domain-name string + OpenStack Swift user's domain name. + -alertmanager-storage.swift.user-id string + OpenStack Swift user ID. + -alertmanager-storage.swift.username string + OpenStack Swift username. + -alertmanager.alertmanager-client.remote-timeout duration + Timeout for downstream alertmanagers. (default 2s) + -alertmanager.alertmanager-client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -alertmanager.alertmanager-client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -alertmanager.alertmanager-client.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -alertmanager.alertmanager-client.tls-insecure-skip-verify + Skip validating server certificate. + -alertmanager.alertmanager-client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -alertmanager.alertmanager-client.tls-server-name string + Override the expected name on the server certificate. + -alertmanager.cluster.advertise-address string + Explicit address or hostname to advertise in cluster. + -alertmanager.cluster.gossip-interval duration + The interval between sending gossip messages. By lowering this value (more frequent) gossip messages are propagated across cluster more quickly at the expense of increased bandwidth usage. (default 200ms) + -alertmanager.cluster.listen-address string + Listen address and port for the cluster. Not specifying this flag disables high-availability mode. (default "0.0.0.0:9094") + -alertmanager.cluster.peer-timeout duration + Time to wait between peers to send notifications. (default 15s) + -alertmanager.cluster.peers value + Comma-separated list of initial peers. + -alertmanager.cluster.push-pull-interval duration + The interval between gossip state syncs. Setting this interval lower (more frequent) will increase convergence speeds across larger clusters at the expense of increased bandwidth usage. (default 1m0s) + -alertmanager.configs.auto-webhook-root string + Root of URL to generate if config is http://internal.monitor + -alertmanager.configs.fallback string + Filename of fallback config to use if none specified for instance. + -alertmanager.configs.poll-interval duration + How frequently to poll Alertmanager configs. (default 15s) + -alertmanager.max-alerts-count int + Maximum number of alerts that a single user can have. Inserting more alerts will fail with a log message and metric increment. 0 = no limit. + -alertmanager.max-alerts-size-bytes int + Maximum total size of alerts that a single user can have, alert size is the sum of the bytes of its labels, annotations and generatorURL. Inserting more alerts will fail with a log message and metric increment. 0 = no limit. + -alertmanager.max-config-size-bytes int + Maximum size of configuration file for Alertmanager that tenant can upload via Alertmanager API. 0 = no limit. + -alertmanager.max-dispatcher-aggregation-groups int + Maximum number of aggregation groups in Alertmanager's dispatcher that a tenant can have. Each active aggregation group uses single goroutine. When the limit is reached, dispatcher will not dispatch alerts that belong to additional aggregation groups, but existing groups will keep working properly. 0 = no limit. + -alertmanager.max-recv-msg-size int + Maximum size (bytes) of an accepted HTTP request body. (default 16777216) + -alertmanager.max-template-size-bytes int + Maximum size of single template in tenant's Alertmanager configuration uploaded via Alertmanager API. 0 = no limit. + -alertmanager.max-templates-count int + Maximum number of templates in tenant's Alertmanager configuration uploaded via Alertmanager API. 0 = no limit. + -alertmanager.notification-rate-limit float + Per-user rate limit for sending notifications from Alertmanager in notifications/sec. 0 = rate limit disabled. Negative value = no notifications are allowed. + -alertmanager.notification-rate-limit-per-integration value + Per-integration notification rate limits. Value is a map, where each key is integration name and value is a rate-limit (float). On command line, this map is given in JSON format. Rate limit has the same meaning as -alertmanager.notification-rate-limit, but only applies for specific integration. Allowed integration names: webhook, email, pagerduty, opsgenie, wechat, slack, victorops, pushover, sns. (default {}) + -alertmanager.persist-interval duration + The interval between persisting the current alertmanager state (notification log and silences) to object storage. This is only used when sharding is enabled. This state is read when all replicas for a shard can not be contacted. In this scenario, having persisted the state more frequently will result in potentially fewer lost silences, and fewer duplicate notifications. (default 15m0s) + -alertmanager.receivers-firewall-block-cidr-networks value + Comma-separated list of network CIDRs to block in Alertmanager receiver integrations. + -alertmanager.receivers-firewall-block-private-addresses + True to block private and local addresses in Alertmanager receiver integrations. It blocks private addresses defined by RFC 1918 (IPv4 addresses) and RFC 4193 (IPv6 addresses), as well as loopback, local unicast and local multicast addresses. + -alertmanager.sharding-enabled + Shard tenants across multiple alertmanager instances. + -alertmanager.sharding-ring.consul.acl-token string + ACL Token used to interact with Consul. + -alertmanager.sharding-ring.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -alertmanager.sharding-ring.consul.consistent-reads + Enable consistent reads to Consul. + -alertmanager.sharding-ring.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -alertmanager.sharding-ring.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -alertmanager.sharding-ring.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -alertmanager.sharding-ring.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -alertmanager.sharding-ring.etcd.endpoints value + The etcd endpoints to connect to. + -alertmanager.sharding-ring.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -alertmanager.sharding-ring.etcd.password string + Etcd password. + -alertmanager.sharding-ring.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -alertmanager.sharding-ring.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -alertmanager.sharding-ring.etcd.tls-enabled + Enable TLS. + -alertmanager.sharding-ring.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -alertmanager.sharding-ring.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -alertmanager.sharding-ring.etcd.tls-server-name string + Override the expected name on the server certificate. + -alertmanager.sharding-ring.etcd.username string + Etcd username. + -alertmanager.sharding-ring.heartbeat-period duration + Period at which to heartbeat to the ring. 0 = disabled. (default 15s) + -alertmanager.sharding-ring.heartbeat-timeout duration + The heartbeat timeout after which alertmanagers are considered unhealthy within the ring. 0 = never (timeout disabled). (default 1m0s) + -alertmanager.sharding-ring.instance-addr string + IP address to advertise in the ring. + -alertmanager.sharding-ring.instance-availability-zone string + The availability zone where this instance is running. Required if zone-awareness is enabled. + -alertmanager.sharding-ring.instance-id string + Instance ID to register in the ring. (default "{{.Hostname}}") + -alertmanager.sharding-ring.instance-interface-names value + Name of network interface to read address from. (default [eth0 en0]) + -alertmanager.sharding-ring.instance-port int + Port to advertise in the ring (defaults to server.grpc-listen-port). + -alertmanager.sharding-ring.multi.mirror-enabled + Mirror writes to secondary store. + -alertmanager.sharding-ring.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -alertmanager.sharding-ring.multi.primary string + Primary backend storage used by multi-client. + -alertmanager.sharding-ring.multi.secondary string + Secondary backend storage used by multi-client. + -alertmanager.sharding-ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "alertmanagers/") + -alertmanager.sharding-ring.replication-factor int + The replication factor to use when sharding the alertmanager. (default 3) + -alertmanager.sharding-ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -alertmanager.sharding-ring.zone-awareness-enabled + True to enable zone-awareness and replicate alerts across different availability zones. + -alertmanager.storage.path string + Base path for data storage. (default "data/") + -alertmanager.storage.retention duration + How long to keep data for. (default 120h0m0s) + -alertmanager.web.external-url value + The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself. If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Alertmanager. (default http://localhost) + -api.response-compression-enabled + Use GZIP compression for API responses. Some endpoints serve large YAML or JSON blobs which can benefit from compression. + -api.skip-label-name-validation-header-enabled + Allows to skip label name validation via header on the http write path. Use with caution as it breaks PromQL. Allowing this for external clients allows any client to send invalid label names. After enabling it, requests with a specific HTTP header set to true will not have label names validated. + -auth.enabled + Set to false to disable auth. (default true) + -blocks-storage.azure.account-key value + Azure storage account key + -blocks-storage.azure.account-name string + Azure storage account name + -blocks-storage.azure.container-name string + Azure storage container name + -blocks-storage.azure.endpoint-suffix string + Azure storage endpoint suffix without schema. The account name will be prefixed to this value to create the FQDN. If set to empty string, default endpoint suffix is used. + -blocks-storage.azure.max-retries int + Number of retries for recoverable errors (default 20) + -blocks-storage.azure.msi-resource string + If set, this URL is used instead of https://. for obtaining ServicePrincipalToken from MSI. + -blocks-storage.azure.user-assigned-id string + User assigned identity. If empty, then System assigned identity is used. + -blocks-storage.backend string + Backend storage to use. Supported backends are: s3, gcs, azure, swift, filesystem. (default "filesystem") + -blocks-storage.bucket-store.block-sync-concurrency int + Maximum number of concurrent blocks synching per tenant. (default 20) + -blocks-storage.bucket-store.bucket-index.enabled + True to enable querier and store-gateway to discover blocks in the storage via bucket index instead of bucket scanning. + -blocks-storage.bucket-store.bucket-index.idle-timeout duration + How long a unused bucket index should be cached. Once this timeout expires, the unused bucket index is removed from the in-memory cache. This option is used only by querier. (default 1h0m0s) + -blocks-storage.bucket-store.bucket-index.max-stale-period duration + The maximum allowed age of a bucket index (last updated) before queries start failing because the bucket index is too old. The bucket index is periodically updated by the compactor, while this check is enforced in the querier (at query time). (default 1h0m0s) + -blocks-storage.bucket-store.bucket-index.update-on-error-interval duration + How frequently a bucket index, which previously failed to load, should be tried to load again. This option is used only by querier. (default 1m0s) + -blocks-storage.bucket-store.chunk-pool-max-bucket-size-bytes int + Size - in bytes - of the largest chunks pool bucket. (default 50000000) + -blocks-storage.bucket-store.chunk-pool-min-bucket-size-bytes int + Size - in bytes - of the smallest chunks pool bucket. (default 16000) + -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items int + Maximum number of object attribute items to keep in a first level in-memory LRU cache. Metadata will be stored and fetched in-memory before hitting the cache backend. 0 to disable the in-memory cache. + -blocks-storage.bucket-store.chunks-cache.attributes-ttl duration + TTL for caching object attributes for chunks. If the metadata cache is configured, attributes will be stored under this cache backend, otherwise attributes are stored in the chunks cache backend. (default 168h0m0s) + -blocks-storage.bucket-store.chunks-cache.backend string + Backend for chunks cache, if not empty. Supported values: memcached. + -blocks-storage.bucket-store.chunks-cache.max-get-range-requests int + Maximum number of sub-GetRange requests that a single GetRange request can be split into when fetching chunks. Zero or negative value = unlimited number of sub-requests. (default 3) + -blocks-storage.bucket-store.chunks-cache.memcached.addresses string + Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). + -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size int + The maximum number of enqueued asynchronous operations allowed. (default 10000) + -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency int + The maximum number of concurrent asynchronous operations can occur. (default 50) + -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size int + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency int + The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) + -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections int + The maximum number of idle connections that will be maintained per address. (default 16) + -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size int + The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) + -blocks-storage.bucket-store.chunks-cache.memcached.timeout duration + The socket read/write timeout. (default 100ms) + -blocks-storage.bucket-store.chunks-cache.subrange-size int + Size of each subrange that bucket object is split into for better caching. (default 16000) + -blocks-storage.bucket-store.chunks-cache.subrange-ttl duration + TTL for caching individual chunks subranges. (default 24h0m0s) + -blocks-storage.bucket-store.consistency-delay duration + Minimum age of a block before it's being read. Set it to safe value (e.g 30m) if your object storage is eventually consistent. GCS and S3 are (roughly) strongly consistent. + -blocks-storage.bucket-store.ignore-blocks-within duration + Blocks with minimum time within this duration are ignored, and not loaded by store-gateway. Useful when used together with -querier.query-store-after to prevent loading young blocks, because there are usually many of them (depending on number of ingesters) and they are not yet compacted. Negative values or 0 disable the filter. + -blocks-storage.bucket-store.ignore-deletion-marks-delay duration + Duration after which the blocks marked for deletion will be filtered out while fetching blocks. The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. Default is 6h, half of the default value for -compactor.deletion-delay. (default 6h0m0s) + -blocks-storage.bucket-store.index-cache.backend string + The index cache backend type. Supported values: inmemory, memcached. (default "inmemory") + -blocks-storage.bucket-store.index-cache.inmemory.max-size-bytes uint + Maximum size in bytes of in-memory index cache used to speed up blocks index lookups (shared between all tenants). (default 1073741824) + -blocks-storage.bucket-store.index-cache.memcached.addresses string + Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). + -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size int + The maximum number of enqueued asynchronous operations allowed. (default 10000) + -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency int + The maximum number of concurrent asynchronous operations can occur. (default 50) + -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size int + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency int + The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) + -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections int + The maximum number of idle connections that will be maintained per address. (default 16) + -blocks-storage.bucket-store.index-cache.memcached.max-item-size int + The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) + -blocks-storage.bucket-store.index-cache.memcached.timeout duration + The socket read/write timeout. (default 100ms) + -blocks-storage.bucket-store.index-header-lazy-loading-enabled + If enabled, store-gateway will lazy load an index-header only once required by a query. (default true) + -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout duration + If index-header lazy loading is enabled and this setting is > 0, the store-gateway will offload unused index-headers after 'idle timeout' inactivity. (default 1h0m0s) + -blocks-storage.bucket-store.max-chunk-pool-bytes uint + Max size - in bytes - of a chunks pool, used to reduce memory allocations. The pool is shared across all tenants. 0 to disable the limit. (default 2147483648) + -blocks-storage.bucket-store.max-concurrent int + Max number of concurrent queries to execute against the long-term storage. The limit is shared across all tenants. (default 100) + -blocks-storage.bucket-store.meta-sync-concurrency int + Number of Go routines to use when syncing block meta files from object storage per tenant. (default 20) + -blocks-storage.bucket-store.metadata-cache.backend string + Backend for metadata cache, if not empty. Supported values: memcached. + -blocks-storage.bucket-store.metadata-cache.block-index-attributes-ttl duration + How long to cache attributes of the block index. (default 168h0m0s) + -blocks-storage.bucket-store.metadata-cache.bucket-index-content-ttl duration + How long to cache content of the bucket index. (default 5m0s) + -blocks-storage.bucket-store.metadata-cache.bucket-index-max-size-bytes int + Maximum size of bucket index content to cache in bytes. Caching will be skipped if the content exceeds this size. This is useful to avoid network round trip for large content if the configured caching backend has an hard limit on cached items size (in this case, you should set this limit to the same limit in the caching backend). (default 1048576) + -blocks-storage.bucket-store.metadata-cache.chunks-list-ttl duration + How long to cache list of chunks for a block. (default 24h0m0s) + -blocks-storage.bucket-store.metadata-cache.memcached.addresses string + Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). + -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size int + The maximum number of enqueued asynchronous operations allowed. (default 10000) + -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency int + The maximum number of concurrent asynchronous operations can occur. (default 50) + -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size int + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency int + The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) + -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections int + The maximum number of idle connections that will be maintained per address. (default 16) + -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size int + The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) + -blocks-storage.bucket-store.metadata-cache.memcached.timeout duration + The socket read/write timeout. (default 100ms) + -blocks-storage.bucket-store.metadata-cache.metafile-attributes-ttl duration + How long to cache attributes of the block metafile. (default 168h0m0s) + -blocks-storage.bucket-store.metadata-cache.metafile-content-ttl duration + How long to cache content of the metafile. (default 24h0m0s) + -blocks-storage.bucket-store.metadata-cache.metafile-doesnt-exist-ttl duration + How long to cache information that block metafile doesn't exist. Also used for user deletion mark file. (default 5m0s) + -blocks-storage.bucket-store.metadata-cache.metafile-exists-ttl duration + How long to cache information that block metafile exists. Also used for user deletion mark file. (default 2h0m0s) + -blocks-storage.bucket-store.metadata-cache.metafile-max-size-bytes int + Maximum size of metafile content to cache in bytes. Caching will be skipped if the content exceeds this size. This is useful to avoid network round trip for large content if the configured caching backend has an hard limit on cached items size (in this case, you should set this limit to the same limit in the caching backend). (default 1048576) + -blocks-storage.bucket-store.metadata-cache.tenant-blocks-list-ttl duration + How long to cache list of blocks for each tenant. (default 5m0s) + -blocks-storage.bucket-store.metadata-cache.tenants-list-ttl duration + How long to cache list of tenants in the bucket. (default 15m0s) + -blocks-storage.bucket-store.partitioner-max-gap-bytes uint + Max size - in bytes - of a gap for which the partitioner aggregates together two bucket GET object requests. (default 524288) + -blocks-storage.bucket-store.posting-offsets-in-mem-sampling int + Controls what is the ratio of postings offsets that the store will hold in memory. (default 32) + -blocks-storage.bucket-store.series-hash-cache-max-size-bytes uint + Max size - in bytes - of the in-memory series hash cache. The cache is shared across all tenants and it's used only when query sharding is enabled. (default 1073741824) + -blocks-storage.bucket-store.sync-dir string + Directory to store synchronized TSDB index headers. (default "tsdb-sync") + -blocks-storage.bucket-store.sync-interval duration + How frequently to scan the bucket, or to refresh the bucket index (if enabled), in order to look for changes (new blocks shipped by ingesters and blocks deleted by retention or compaction). (default 15m0s) + -blocks-storage.bucket-store.tenant-sync-concurrency int + Maximum number of concurrent tenants synching blocks. (default 10) + -blocks-storage.filesystem.dir string + Local filesystem storage directory. (default "blocks") + -blocks-storage.gcs.bucket-name string + GCS bucket name + -blocks-storage.gcs.service-account value + JSON representing either a Google Developers Console client_credentials.json file or a Google Developers service account key file. If empty, fallback to Google default logic. + -blocks-storage.s3.access-key-id string + S3 access key ID + -blocks-storage.s3.bucket-name string + S3 bucket name + -blocks-storage.s3.endpoint string + The S3 bucket endpoint. It could be an AWS S3 endpoint listed at https://docs.aws.amazon.com/general/latest/gr/s3.html or the address of an S3-compatible service in hostname:port format. + -blocks-storage.s3.expect-continue-timeout duration + The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) + -blocks-storage.s3.http.idle-conn-timeout duration + The time an idle connection will remain idle before closing. (default 1m30s) + -blocks-storage.s3.http.insecure-skip-verify + If the client connects to S3 via HTTPS and this option is enabled, the client will accept any certificate and hostname. + -blocks-storage.s3.http.response-header-timeout duration + The amount of time the client will wait for a servers response headers. (default 2m0s) + -blocks-storage.s3.insecure + If enabled, use http:// for the S3 endpoint instead of https://. This could be useful in local dev/test environments while using an S3-compatible backend storage, like Minio. + -blocks-storage.s3.max-connections-per-host int + Maximum number of connections per host. 0 means no limit. + -blocks-storage.s3.max-idle-connections int + Maximum number of idle (keep-alive) connections across all hosts. 0 means no limit. (default 100) + -blocks-storage.s3.max-idle-connections-per-host int + Maximum number of idle (keep-alive) connections to keep per-host. If 0, a built-in default value is used. (default 100) + -blocks-storage.s3.region string + S3 region. If unset, the client will issue a S3 GetBucketLocation API call to autodetect it. + -blocks-storage.s3.secret-access-key value + S3 secret access key + -blocks-storage.s3.signature-version string + The signature version to use for authenticating against S3. Supported values are: v4, v2. (default "v4") + -blocks-storage.s3.sse.kms-encryption-context string + KMS Encryption Context used for object encryption. It expects JSON formatted string. + -blocks-storage.s3.sse.kms-key-id string + KMS Key ID used to encrypt objects in S3 + -blocks-storage.s3.sse.type string + Enable AWS Server Side Encryption. Supported values: SSE-KMS, SSE-S3. + -blocks-storage.s3.tls-handshake-timeout duration + Maximum time to wait for a TLS handshake. 0 means no limit. (default 10s) + -blocks-storage.swift.auth-url string + OpenStack Swift authentication URL + -blocks-storage.swift.auth-version int + OpenStack Swift authentication API version. 0 to autodetect. + -blocks-storage.swift.connect-timeout duration + Time after which a connection attempt is aborted. (default 10s) + -blocks-storage.swift.container-name string + Name of the OpenStack Swift container to put chunks in. + -blocks-storage.swift.domain-id string + OpenStack Swift user's domain ID. + -blocks-storage.swift.domain-name string + OpenStack Swift user's domain name. + -blocks-storage.swift.max-retries int + Max retries on requests error. (default 3) + -blocks-storage.swift.password string + OpenStack Swift API key. + -blocks-storage.swift.project-domain-id string + ID of the OpenStack Swift project's domain (v3 auth only), only needed if it differs the from user domain. + -blocks-storage.swift.project-domain-name string + Name of the OpenStack Swift project's domain (v3 auth only), only needed if it differs from the user domain. + -blocks-storage.swift.project-id string + OpenStack Swift project ID (v2,v3 auth only). + -blocks-storage.swift.project-name string + OpenStack Swift project name (v2,v3 auth only). + -blocks-storage.swift.region-name string + OpenStack Swift Region to use (v2,v3 auth only). + -blocks-storage.swift.request-timeout duration + Time after which an idle request is aborted. The timeout watchdog is reset each time some data is received, so the timeout triggers after X time no data is received on a request. (default 5s) + -blocks-storage.swift.user-domain-id string + OpenStack Swift user's domain ID. + -blocks-storage.swift.user-domain-name string + OpenStack Swift user's domain name. + -blocks-storage.swift.user-id string + OpenStack Swift user ID. + -blocks-storage.swift.username string + OpenStack Swift username. + -blocks-storage.tsdb.block-ranges-period value + TSDB blocks range period. (default 2h0m0s) + -blocks-storage.tsdb.close-idle-tsdb-timeout duration + If TSDB has not received any data for this duration, and all blocks from TSDB have been shipped, TSDB is closed and deleted from local disk. If set to positive value, this value should be equal or higher than -querier.query-ingesters-within flag to make sure that TSDB is not closed prematurely, which could cause partial query results. 0 or negative value disables closing of idle TSDB. + -blocks-storage.tsdb.dir string + Local directory to store TSDBs in the ingesters. (default "tsdb") + -blocks-storage.tsdb.flush-blocks-on-shutdown + True to flush blocks to storage on shutdown. If false, incomplete blocks will be reused after restart. + -blocks-storage.tsdb.head-chunks-end-time-variance float + How much variance (as percentage between 0 and 1) should be applied to the chunk end time, to spread chunks writing across time. Doesn't apply to the last chunk of the chunk range. 0 means no variance. + -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes int + The write buffer size used by the head chunks mapper. Lower values reduce memory utilisation on clusters with a large number of tenants at the cost of increased disk I/O operations. (default 4194304) + -blocks-storage.tsdb.head-chunks-write-queue-size int + The size of the write queue used by the head chunks mapper. Lower values reduce memory utilisation at the cost of potentially higher ingest latency. 0 disables the use of the chunk write queue. + -blocks-storage.tsdb.head-compaction-concurrency int + Maximum number of tenants concurrently compacting TSDB head into a new block (default 5) + -blocks-storage.tsdb.head-compaction-idle-timeout duration + If TSDB head is idle for this duration, it is compacted. Note that up to 25% jitter is added to the value to avoid ingesters compacting concurrently. 0 means disabled. (default 1h0m0s) + -blocks-storage.tsdb.head-compaction-interval duration + How frequently ingesters try to compact TSDB head. Block is only created if data covers smallest block range. Must be greater than 0 and max 5 minutes. (default 1m0s) + -blocks-storage.tsdb.isolation-enabled + Enables TSDB isolation feature. Disabling may improve performance. (default true) + -blocks-storage.tsdb.max-tsdb-opening-concurrency-on-startup int + limit the number of concurrently opening TSDB's on startup (default 10) + -blocks-storage.tsdb.memory-snapshot-on-shutdown + True to enable snapshotting of in-memory TSDB data on disk when shutting down. + -blocks-storage.tsdb.retention-period duration + TSDB blocks retention in the ingester before a block is removed. This should be larger than the block_ranges_period and large enough to give store-gateways and queriers enough time to discover newly uploaded blocks. (default 6h0m0s) + -blocks-storage.tsdb.series-hash-cache-max-size-bytes uint + Max size - in bytes - of the in-memory series hash cache. The cache is shared across all tenants and it's used only when query sharding is enabled. (default 1073741824) + -blocks-storage.tsdb.ship-concurrency int + Maximum number of tenants concurrently shipping blocks to the storage. (default 10) + -blocks-storage.tsdb.ship-interval duration + How frequently the TSDB blocks are scanned and new ones are shipped to the storage. 0 means shipping is disabled. (default 1m0s) + -blocks-storage.tsdb.stripe-size int + The number of shards of series to use in TSDB (must be a power of 2). Reducing this will decrease memory footprint, but can negatively impact performance. (default 16384) + -blocks-storage.tsdb.wal-compression-enabled + True to enable TSDB WAL compression. + -blocks-storage.tsdb.wal-segment-size-bytes int + TSDB WAL segments files max size (bytes). (default 134217728) + -compactor.block-ranges value + List of compaction time ranges. (default 2h0m0s,12h0m0s,24h0m0s) + -compactor.block-sync-concurrency int + Number of Go routines to use when downloading blocks for compaction and uploading resulting blocks. (default 8) + -compactor.blocks-retention-period value + Delete blocks containing samples older than the specified retention period. 0 to disable. + -compactor.cleanup-concurrency int + Max number of tenants for which blocks cleanup and maintenance should run concurrently. (default 20) + -compactor.cleanup-interval duration + How frequently compactor should run blocks cleanup and maintenance, as well as update the bucket index. (default 15m0s) + -compactor.compaction-concurrency int + Max number of concurrent compactions running. (default 1) + -compactor.compaction-interval duration + The frequency at which the compaction runs (default 1h0m0s) + -compactor.compaction-jobs-order string + The sorting to use when deciding which compaction jobs should run first for a given tenant. Supported values are: smallest-range-oldest-blocks-first, newest-blocks-first. (default "smallest-range-oldest-blocks-first") + -compactor.compaction-retries int + How many times to retry a failed compaction within a single compaction run. (default 3) + -compactor.compactor-tenant-shard-size int + Max number of compactors that can compact blocks for single tenant. 0 to disable the limit and use all compactors. + -compactor.consistency-delay duration + Minimum age of fresh (non-compacted) blocks before they are being processed. Malformed blocks older than the maximum of consistency-delay and 48h0m0s will be removed. + -compactor.data-dir string + Data directory in which to cache blocks and process compactions (default "./data") + -compactor.deletion-delay duration + Time before a block marked for deletion is deleted from bucket. If not 0, blocks will be marked for deletion and compactor component will permanently delete blocks marked for deletion from the bucket. If 0, blocks will be deleted straight away. Note that deleting blocks immediately can cause query failures. (default 12h0m0s) + -compactor.disabled-tenants value + Comma separated list of tenants that cannot be compacted by this compactor. If specified, and compactor would normally pick given tenant for compaction (via -compactor.enabled-tenants or sharding), it will be ignored instead. + -compactor.enabled-tenants value + Comma separated list of tenants that can be compacted. If specified, only these tenants will be compacted by compactor, otherwise all tenants can be compacted. Subject to sharding. + -compactor.max-closing-blocks-concurrency int + Max number of blocks that can be closed concurrently during split compaction. Note that closing of newly compacted block uses a lot of memory for writing index. (default 1) + -compactor.max-compaction-time duration + Max time for starting compactions for a single tenant. After this time no new compactions for the tenant are started before next compaction cycle. This can help in multi-tenant environments to avoid single tenant using all compaction time, but also in single-tenant environments to force new discovery of blocks more often. 0 = disabled. + -compactor.max-opening-blocks-concurrency int + Number of goroutines opening blocks before compaction. (default 1) + -compactor.meta-sync-concurrency int + Number of Go routines to use when syncing block meta files from the long term storage. (default 20) + -compactor.ring.consul.acl-token string + ACL Token used to interact with Consul. + -compactor.ring.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -compactor.ring.consul.consistent-reads + Enable consistent reads to Consul. + -compactor.ring.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -compactor.ring.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -compactor.ring.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -compactor.ring.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -compactor.ring.etcd.endpoints value + The etcd endpoints to connect to. + -compactor.ring.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -compactor.ring.etcd.password string + Etcd password. + -compactor.ring.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -compactor.ring.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -compactor.ring.etcd.tls-enabled + Enable TLS. + -compactor.ring.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -compactor.ring.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -compactor.ring.etcd.tls-server-name string + Override the expected name on the server certificate. + -compactor.ring.etcd.username string + Etcd username. + -compactor.ring.heartbeat-period duration + Period at which to heartbeat to the ring. 0 = disabled. (default 5s) + -compactor.ring.heartbeat-timeout duration + The heartbeat timeout after which compactors are considered unhealthy within the ring. 0 = never (timeout disabled). (default 1m0s) + -compactor.ring.instance-addr string + IP address to advertise in the ring. + -compactor.ring.instance-id string + Instance ID to register in the ring. (default "{{.Hostname}}") + -compactor.ring.instance-interface-names value + Name of network interface to read address from. (default [eth0 en0]) + -compactor.ring.instance-port int + Port to advertise in the ring (defaults to server.grpc-listen-port). + -compactor.ring.multi.mirror-enabled + Mirror writes to secondary store. + -compactor.ring.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -compactor.ring.multi.primary string + Primary backend storage used by multi-client. + -compactor.ring.multi.secondary string + Secondary backend storage used by multi-client. + -compactor.ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "collectors/") + -compactor.ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -compactor.ring.wait-active-instance-timeout duration + Timeout for waiting on compactor to become ACTIVE in the ring. (default 10m0s) + -compactor.ring.wait-stability-max-duration duration + Maximum time to wait for ring stability at startup. If the compactor ring keeps changing after this period of time, the compactor will start anyway. (default 5m0s) + -compactor.ring.wait-stability-min-duration duration + Minimum time to wait for ring stability at startup. 0 to disable. (default 1m0s) + -compactor.sharding-enabled + Shard workload across multiple compactor instances. Sharding is required if you run multiple compactor instances, in order to coordinate compactions and avoid race conditions leading to the same tenant blocks simultaneously compacted by different instances. + -compactor.split-and-merge-shards int + The number of shards to use when splitting blocks. 0 to disable splitting. + -compactor.split-groups int + Number of groups that blocks for splitting should be grouped into. Each group of blocks is then split separately. Number of output split shards is controlled by -compactor.split-and-merge-shards. (default 1) + -compactor.symbols-flushers-concurrency int + Number of symbols flushers used when doing split compaction. (default 1) + -compactor.tenant-cleanup-delay duration + For tenants marked for deletion, this is time between deleting of last block, and doing final cleanup (marker files, debug files) of the tenant. (default 6h0m0s) + -config.expand-env + Expands ${var} or $var in config according to the values of the environment variables. + -config.file value + Configuration file to load. + -consul.acl-token string + ACL Token used to interact with Consul. + -consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -consul.consistent-reads + Enable consistent reads to Consul. + -consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -debug.block-profile-rate int + Fraction of goroutine blocking events that are reported in the blocking profile. 1 to include every blocking event in the profile, 0 to disable. + -debug.mutex-profile-fraction int + Fraction of mutex contention events that are reported in the mutex profile. On average 1/rate events are reported. 0 to disable. + -distributor.client-cleanup-period duration + How frequently to clean up clients for ingesters that have gone away. (default 15s) + -distributor.drop-label value + This flag can be used to specify label names that to drop during sample ingestion within the distributor and can be repeated in order to drop multiple labels. + -distributor.excluded-zones value + Comma-separated list of zones to exclude from the ring. Instances in excluded zones will be filtered out from the ring. + -distributor.extend-writes + Try writing to an additional ingester in the presence of an ingester not in the ACTIVE state. It is useful to disable this along with -ingester.unregister-on-shutdown=false in order to not spread samples to extra ingesters during rolling restarts with consistent naming. (default true) + -distributor.extra-query-delay duration + Time to wait before sending more than the minimum successful query requests. + -distributor.ha-tracker.cluster string + Prometheus label to look for in samples to identify a Prometheus HA cluster. (default "cluster") + -distributor.ha-tracker.consul.acl-token string + ACL Token used to interact with Consul. + -distributor.ha-tracker.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -distributor.ha-tracker.consul.consistent-reads + Enable consistent reads to Consul. + -distributor.ha-tracker.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -distributor.ha-tracker.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -distributor.ha-tracker.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -distributor.ha-tracker.enable + Enable the distributors HA tracker so that it can accept samples from Prometheus HA replicas gracefully (requires labels). + -distributor.ha-tracker.enable-for-all-users + Flag to enable, for all users, handling of samples with external labels identifying replicas in an HA Prometheus setup. + -distributor.ha-tracker.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -distributor.ha-tracker.etcd.endpoints value + The etcd endpoints to connect to. + -distributor.ha-tracker.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -distributor.ha-tracker.etcd.password string + Etcd password. + -distributor.ha-tracker.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -distributor.ha-tracker.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -distributor.ha-tracker.etcd.tls-enabled + Enable TLS. + -distributor.ha-tracker.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -distributor.ha-tracker.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -distributor.ha-tracker.etcd.tls-server-name string + Override the expected name on the server certificate. + -distributor.ha-tracker.etcd.username string + Etcd username. + -distributor.ha-tracker.failover-timeout duration + If we don't receive any samples from the accepted replica for a cluster in this amount of time we will failover to the next replica we receive a sample from. This value must be greater than the update timeout (default 30s) + -distributor.ha-tracker.max-clusters int + Maximum number of clusters that HA tracker will keep track of for single user. 0 to disable the limit. + -distributor.ha-tracker.multi.mirror-enabled + Mirror writes to secondary store. + -distributor.ha-tracker.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -distributor.ha-tracker.multi.primary string + Primary backend storage used by multi-client. + -distributor.ha-tracker.multi.secondary string + Secondary backend storage used by multi-client. + -distributor.ha-tracker.prefix string + The prefix for the keys in the store. Should end with a /. (default "ha-tracker/") + -distributor.ha-tracker.replica string + Prometheus label to look for in samples to identify a Prometheus HA replica. (default "__replica__") + -distributor.ha-tracker.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -distributor.ha-tracker.update-timeout duration + Update the timestamp in the KV store for a given cluster/replica only after this amount of time has passed since the current stored timestamp. (default 15s) + -distributor.ha-tracker.update-timeout-jitter-max duration + Maximum jitter applied to the update timeout, in order to spread the HA heartbeats over time. (default 5s) + -distributor.health-check-ingesters + Run a health check on each ingester client during periodic cleanup. (default true) + -distributor.ingestion-burst-size int + Per-user allowed ingestion burst size (in number of samples). (default 200000) + -distributor.ingestion-rate-limit float + Per-user ingestion rate limit in samples per second. (default 10000) + -distributor.ingestion-tenant-shard-size int + The tenant's shard size used by shuffle-sharding. Must be set both on ingesters and distributors. 0 disables shuffle sharding. + -distributor.instance-limits.max-inflight-push-requests int + Max inflight push requests that this distributor can handle. This limit is per-distributor, not per-tenant. Additional requests will be rejected. 0 = unlimited. + -distributor.instance-limits.max-ingestion-rate float + Max ingestion rate (samples/sec) that this distributor will accept. This limit is per-distributor, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited. + -distributor.max-recv-msg-size int + remote_write API max receive message size (bytes). (default 104857600) + -distributor.remote-timeout duration + Timeout for downstream ingesters. (default 2s) + -distributor.replication-factor int + The number of ingesters to write to and read from. (default 3) + -distributor.ring.consul.acl-token string + ACL Token used to interact with Consul. + -distributor.ring.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -distributor.ring.consul.consistent-reads + Enable consistent reads to Consul. + -distributor.ring.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -distributor.ring.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -distributor.ring.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -distributor.ring.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -distributor.ring.etcd.endpoints value + The etcd endpoints to connect to. + -distributor.ring.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -distributor.ring.etcd.password string + Etcd password. + -distributor.ring.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -distributor.ring.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -distributor.ring.etcd.tls-enabled + Enable TLS. + -distributor.ring.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -distributor.ring.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -distributor.ring.etcd.tls-server-name string + Override the expected name on the server certificate. + -distributor.ring.etcd.username string + Etcd username. + -distributor.ring.heartbeat-period duration + Period at which to heartbeat to the ring. 0 = disabled. (default 5s) + -distributor.ring.heartbeat-timeout duration + The heartbeat timeout after which distributors are considered unhealthy within the ring. 0 = never (timeout disabled). (default 1m0s) + -distributor.ring.instance-addr string + IP address to advertise in the ring. + -distributor.ring.instance-id string + Instance ID to register in the ring. (default "{{.Hostname}}") + -distributor.ring.instance-interface-names value + Name of network interface to read address from. (default [eth0 en0]) + -distributor.ring.instance-port int + Port to advertise in the ring (defaults to server.grpc-listen-port). + -distributor.ring.multi.mirror-enabled + Mirror writes to secondary store. + -distributor.ring.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -distributor.ring.multi.primary string + Primary backend storage used by multi-client. + -distributor.ring.multi.secondary string + Secondary backend storage used by multi-client. + -distributor.ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "collectors/") + -distributor.ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -distributor.zone-awareness-enabled + True to enable the zone-awareness and replicate ingested samples across different availability zones. + -etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -etcd.endpoints value + The etcd endpoints to connect to. + -etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -etcd.password string + Etcd password. + -etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -etcd.tls-enabled + Enable TLS. + -etcd.tls-insecure-skip-verify + Skip validating server certificate. + -etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -etcd.tls-server-name string + Override the expected name on the server certificate. + -etcd.username string + Etcd username. + -experimental.alertmanager.enable-api + Enable the experimental alertmanager config api. + -experimental.ruler.enable-api + Enable the ruler api + -flusher.exit-after-flush + Stop after flush has finished. If false, process will keep running, doing nothing. (default true) + -frontend.align-querier-with-step + Mutate incoming queries to align their start and end with their step. + -frontend.cache-results + Cache query results. + -frontend.cache-unaligned-requests + Cache requests that are not step-aligned. + -frontend.downstream-url string + URL of downstream Prometheus. + -frontend.grpc-client-config.backoff-max-period duration + Maximum delay when backing off. (default 10s) + -frontend.grpc-client-config.backoff-min-period duration + Minimum delay when backing off. (default 100ms) + -frontend.grpc-client-config.backoff-on-ratelimits + Enable backoff and retry when we hit ratelimits. + -frontend.grpc-client-config.backoff-retries int + Number of times to backoff and retry before failing. (default 10) + -frontend.grpc-client-config.grpc-client-rate-limit float + Rate limit for gRPC client; 0 means disabled. + -frontend.grpc-client-config.grpc-client-rate-limit-burst int + Rate limit burst for gRPC client. + -frontend.grpc-client-config.grpc-compression string + Use compression when sending messages. Supported values are: 'gzip', 'snappy' and '' (disable compression) + -frontend.grpc-client-config.grpc-max-recv-msg-size int + gRPC client max receive message size (bytes). (default 104857600) + -frontend.grpc-client-config.grpc-max-send-msg-size int + gRPC client max send message size (bytes). (default 16777216) + -frontend.grpc-client-config.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -frontend.grpc-client-config.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -frontend.grpc-client-config.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -frontend.grpc-client-config.tls-insecure-skip-verify + Skip validating server certificate. + -frontend.grpc-client-config.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -frontend.grpc-client-config.tls-server-name string + Override the expected name on the server certificate. + -frontend.instance-addr string + IP address to advertise to querier (via scheduler) (resolved via interfaces by default). + -frontend.instance-interface-names value + Name of network interface to read address from. This address is sent to query-scheduler and querier, which uses it to send the query response back to query-frontend. (default [eth0 en0]) + -frontend.instance-port int + Port to advertise to querier (via scheduler) (defaults to server.grpc-listen-port). + -frontend.log-queries-longer-than duration + Log queries that are slower than the specified duration. Set to 0 to disable. Set to < 0 to enable on all queries. + -frontend.max-body-size int + Max body size for downstream prometheus. (default 10485760) + -frontend.max-cache-freshness value + Most recent allowed cacheable result per-tenant, to prevent caching very recent results that might still be in flux. (default 1m) + -frontend.max-queriers-per-tenant int + Maximum number of queriers that can handle requests for a single tenant. If set to 0 or value higher than number of available queriers, *all* queriers will handle requests for the tenant. Each frontend (or query-scheduler, if used) will select the same set of queriers for the same tenant (given that all queriers are connected to all frontends / query-schedulers). This option only works with queriers connecting to the query-frontend / query-scheduler, not when using downstream URL. + -frontend.max-retries-per-request int + Maximum number of retries for a single request; beyond this, the downstream error is returned. (default 5) + -frontend.parallelize-shardable-queries + True to enable query sharding. + -frontend.query-sharding-max-sharded-queries int + The max number of sharded queries that can be run for a given received query. 0 to disable limit. (default 128) + -frontend.query-sharding-total-shards int + The amount of shards to use when doing parallelisation via query sharding by tenant. 0 to disable query sharding for tenant. Query sharding implementation will adjust the number of query shards based on compactor shards. This allows querier to not search the blocks which cannot possibly have the series for given query shard. (default 16) + -frontend.query-stats-enabled + False to disable query statistics tracking. When enabled, a message with some statistics is logged for every query. (default true) + -frontend.results-cache.backend string + Backend for query-frontend results cache, if not empty. Supported values: [memcached]. + -frontend.results-cache.compression string + Enable cache compression, if not empty. Supported values are: snappy. + -frontend.results-cache.memcached.addresses string + Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). + -frontend.results-cache.memcached.max-async-buffer-size int + The maximum number of enqueued asynchronous operations allowed. (default 10000) + -frontend.results-cache.memcached.max-async-concurrency int + The maximum number of concurrent asynchronous operations can occur. (default 50) + -frontend.results-cache.memcached.max-get-multi-batch-size int + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + -frontend.results-cache.memcached.max-get-multi-concurrency int + The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) + -frontend.results-cache.memcached.max-idle-connections int + The maximum number of idle connections that will be maintained per address. (default 16) + -frontend.results-cache.memcached.max-item-size int + The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) + -frontend.results-cache.memcached.timeout duration + The socket read/write timeout. (default 100ms) + -frontend.scheduler-address string + DNS hostname used for finding query-schedulers. + -frontend.scheduler-dns-lookup-period duration + How often to resolve the scheduler-address, in order to look for new query-scheduler instances. (default 10s) + -frontend.scheduler-worker-concurrency int + Number of concurrent workers forwarding queries to single query-scheduler. (default 5) + -frontend.split-queries-by-interval duration + Split queries by an interval and execute in parallel, 0 disables it. You should use an a multiple of 24 hours (same as the storage bucketing scheme), to avoid queriers downloading and processing the same chunks. This also determines how cache keys are chosen when result caching is enabled. + -h + Print basic help. + -help + Print basic help. + -help-all + Print help including also advanced and experimental flags. + -http.alertmanager-http-prefix string + HTTP URL path under which the Alertmanager ui and api will be served. (default "/alertmanager") + -http.prefix string + HTTP path prefix for API. (default "/api/prom") + -http.prometheus-http-prefix string + HTTP URL path under which the Prometheus api will be served. (default "/prometheus") + -ingester-client.expected-labels int + Expected number of labels per timeseries, used for preallocations. (default 20) + -ingester-client.expected-samples-per-series int + Expected number of samples per timeseries, used for preallocations. (default 10) + -ingester-client.expected-timeseries int + Expected number of timeseries per request, used for preallocations. (default 100) + -ingester.active-series-custom-trackers value + Additional active series metrics, matching the provided matchers. Matchers should be in form :, like 'foobar:{foo="bar"}'. Multiple matchers can be provided either providing the flag multiple times or providing multiple semicolon-separated values to a single flag. + -ingester.active-series-metrics-enabled + Enable tracking of active series and export them as metrics. (default true) + -ingester.active-series-metrics-idle-timeout duration + After what time a series is considered to be inactive. (default 10m0s) + -ingester.active-series-metrics-update-period duration + How often to update active series metrics. (default 1m0s) + -ingester.availability-zone string + The availability zone where this instance is running. + -ingester.client.backoff-max-period duration + Maximum delay when backing off. (default 10s) + -ingester.client.backoff-min-period duration + Minimum delay when backing off. (default 100ms) + -ingester.client.backoff-on-ratelimits + Enable backoff and retry when we hit ratelimits. + -ingester.client.backoff-retries int + Number of times to backoff and retry before failing. (default 10) + -ingester.client.grpc-client-rate-limit float + Rate limit for gRPC client; 0 means disabled. + -ingester.client.grpc-client-rate-limit-burst int + Rate limit burst for gRPC client. + -ingester.client.grpc-compression string + Use compression when sending messages. Supported values are: 'gzip', 'snappy' and '' (disable compression) + -ingester.client.grpc-max-recv-msg-size int + gRPC client max receive message size (bytes). (default 104857600) + -ingester.client.grpc-max-send-msg-size int + gRPC client max send message size (bytes). (default 16777216) + -ingester.client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -ingester.client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -ingester.client.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -ingester.client.tls-insecure-skip-verify + Skip validating server certificate. + -ingester.client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -ingester.client.tls-server-name string + Override the expected name on the server certificate. + -ingester.exemplars-update-period duration + Period with which to update per-user max exemplars. (default 15s) + -ingester.final-sleep duration + Duration to sleep for before exiting, to ensure metrics are scraped. (default 30s) + -ingester.heartbeat-period duration + Period at which to heartbeat to consul. 0 = disabled. (default 5s) + -ingester.ignore-series-limit-for-metric-names string + Comma-separated list of metric names, for which the -ingester.max-global-series-per-metric limit will be ignored. Does not affect the -ingester.max-global-series-per-user limit. + -ingester.instance-limits.max-inflight-push-requests int + Max inflight push requests that this ingester can handle (across all tenants). Additional requests will be rejected. 0 = unlimited. (default 30000) + -ingester.instance-limits.max-ingestion-rate float + Max ingestion rate (samples/sec) that ingester will accept. This limit is per-ingester, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. This limit only works when using blocks engine. 0 = unlimited. + -ingester.instance-limits.max-series int + Max series that this ingester can hold (across all tenants). Requests to create additional series will be rejected. This limit only works when using blocks engine. 0 = unlimited. + -ingester.instance-limits.max-tenants int + Max users that this ingester can hold. Requests from additional users will be rejected. This limit only works when using blocks engine. 0 = unlimited. + -ingester.join-after duration + Period to wait for a claim from another member; will join automatically after this. + -ingester.lifecycler.ID string + ID to register in the ring. (default "{{.Hostname}}") + -ingester.lifecycler.addr string + IP address to advertise in the ring. + -ingester.lifecycler.interface value + Name of network interface to read address from. (default [eth0 en0]) + -ingester.lifecycler.port int + port to advertise in consul (defaults to server.grpc-listen-port). + -ingester.max-global-exemplars-per-user int + The maximum number of exemplars in memory, across the cluster. 0 to disable exemplars ingestion. + -ingester.max-global-metadata-per-metric int + The maximum number of metadata per metric, across the cluster. 0 to disable. + -ingester.max-global-metadata-per-user int + The maximum number of active metrics with metadata per user, across the cluster. 0 to disable. + -ingester.max-global-series-per-metric int + The maximum number of active series per metric name, across the cluster before replication. 0 to disable. (default 20000) + -ingester.max-global-series-per-user int + The maximum number of active series per user, across the cluster before replication. 0 to disable. (default 150000) + -ingester.max-samples-per-query value + This option is no longer used, and will be removed. + -ingester.metadata-retain-period duration + Period at which metadata we have not seen will remain in memory before being deleted. (default 10m0s) + -ingester.min-ready-duration duration + Minimum duration to wait after the internal readiness checks have passed but before succeeding the readiness endpoint. This is used to slowdown deployment controllers (eg. Kubernetes) after an instance is ready and before they proceed with a rolling update, to give the rest of the cluster instances enough time to receive ring updates. (default 15s) + -ingester.num-tokens int + Number of tokens for each ingester. (default 128) + -ingester.observe-period duration + Observe tokens after generating to resolve collisions. Useful when using gossiping ring. + -ingester.rate-update-period duration + Period with which to update the per-user ingestion rates. (default 15s) + -ingester.readiness-check-ring-health + When enabled the readiness probe succeeds only after all instances are ACTIVE and healthy in the ring, otherwise only the instance itself is checked. This option should be disabled if in your cluster multiple instances can be rolled out simultaneously, otherwise rolling updates may be slowed down. (default true) + -ingester.stream-chunks-when-using-blocks + Stream chunks from ingesters to queriers. (default true) + -ingester.tokens-file-path string + File path where tokens are stored. If empty, tokens are not stored at shutdown and restored at startup. + -ingester.unregister-on-shutdown + Unregister from the ring upon clean shutdown. It can be useful to disable for rolling restarts with consistent naming in conjunction with -distributor.extend-writes=false. (default true) + -log.format value + Output log messages in the given format. Valid formats: [logfmt, json] (default logfmt) + -log.level value + Only log messages with the given severity or above. Valid levels: [debug, info, warn, error] (default info) + -mem-ballast-size-bytes int + Size of memory ballast to allocate. + -memberlist.abort-if-join-fails + If this node fails to join memberlist cluster, abort. (default true) + -memberlist.advertise-addr string + Gossip address to advertise to other members in the cluster. Used for NAT traversal. + -memberlist.advertise-port int + Gossip port to advertise to other members in the cluster. Used for NAT traversal. (default 7946) + -memberlist.bind-addr value + IP address to listen on for gossip messages. Multiple addresses may be specified. Defaults to 0.0.0.0 + -memberlist.bind-port int + Port to listen on for gossip messages. (default 7946) + -memberlist.compression-enabled + Enable message compression. This can be used to reduce bandwidth usage at the cost of slightly more CPU utilization. (default true) + -memberlist.dead-node-reclaim-time duration + How soon can dead node's name be reclaimed with new address. 0 to disable. + -memberlist.gossip-interval duration + How often to gossip. (default 200ms) + -memberlist.gossip-nodes int + How many nodes to gossip to. (default 3) + -memberlist.gossip-to-dead-nodes-time duration + How long to keep gossiping to dead nodes, to give them chance to refute their death. (default 30s) + -memberlist.join value + Other cluster members to join. Can be specified multiple times. It can be an IP, hostname or an entry specified in the DNS Service Discovery format. + -memberlist.leave-timeout duration + Timeout for leaving memberlist cluster. (default 5s) + -memberlist.left-ingesters-timeout duration + How long to keep LEFT ingesters in the ring. (default 5m0s) + -memberlist.max-join-backoff duration + Max backoff duration to join other cluster members. (default 1m0s) + -memberlist.max-join-retries int + Max number of retries to join other cluster members. (default 10) + -memberlist.message-history-buffer-bytes int + How much space to use for keeping received and sent messages in memory for troubleshooting (two buffers). 0 to disable. + -memberlist.min-join-backoff duration + Min backoff duration to join other cluster members. (default 1s) + -memberlist.nodename string + Name of the node in memberlist cluster. Defaults to hostname. + -memberlist.packet-dial-timeout duration + Timeout used when connecting to other nodes to send packet. (default 5s) + -memberlist.packet-write-timeout duration + Timeout for writing 'packet' data. (default 5s) + -memberlist.pullpush-interval duration + How often to use pull/push sync. (default 30s) + -memberlist.randomize-node-name + Add random suffix to the node name. (default true) + -memberlist.rejoin-interval duration + If not 0, how often to rejoin the cluster. Occasional rejoin can help to fix the cluster split issue, and is harmless otherwise. For example when using only few components as a seed nodes (via -memberlist.join), then it's recommended to use rejoin. If -memberlist.join points to dynamic service that resolves to all gossiping nodes (eg. Kubernetes headless service), then rejoin is not needed. + -memberlist.retransmit-factor int + Multiplication factor used when sending out messages (factor * log(N+1)). (default 4) + -memberlist.stream-timeout duration + The timeout for establishing a connection with a remote node, and for read/write operations. (default 10s) + -memberlist.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -memberlist.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -memberlist.tls-enabled + Enable TLS on the memberlist transport layer. + -memberlist.tls-insecure-skip-verify + Skip validating server certificate. + -memberlist.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -memberlist.tls-server-name string + Override the expected name on the server certificate. + -memberlist.transport-debug + Log debug transport messages. Note: global log.level must be at debug level as well. + -modules + List available values that can be used as target. + -multi.mirror-enabled + Mirror writes to secondary store. + -multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -multi.primary string + Primary backend storage used by multi-client. + -multi.secondary string + Secondary backend storage used by multi-client. + -print.config + Print the config and exit. + -querier.at-modifier-enabled + [experimental] Enable the @ modifier in PromQL. This config option should be set on query-frontend too when query sharding is enabled. + -querier.batch-iterators + Use batch iterators to execute query, as opposed to fully materialising the series in memory. Takes precedent over the -querier.iterators flag. (default true) + -querier.cardinality-analysis-enabled + Enables endpoints used for cardinality analysis. + -querier.default-evaluation-interval duration + The default evaluation interval or step size for subqueries. This config option should be set on query-frontend too when query sharding is enabled. (default 1m0s) + -querier.dns-lookup-period duration + How often to query DNS for query-frontend or query-scheduler address. (default 10s) + -querier.frontend-address string + Address of query frontend service, in host:port format. If -querier.scheduler-address is set as well, querier will use scheduler instead. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint. + -querier.frontend-client.backoff-max-period duration + Maximum delay when backing off. (default 10s) + -querier.frontend-client.backoff-min-period duration + Minimum delay when backing off. (default 100ms) + -querier.frontend-client.backoff-on-ratelimits + Enable backoff and retry when we hit ratelimits. + -querier.frontend-client.backoff-retries int + Number of times to backoff and retry before failing. (default 10) + -querier.frontend-client.grpc-client-rate-limit float + Rate limit for gRPC client; 0 means disabled. + -querier.frontend-client.grpc-client-rate-limit-burst int + Rate limit burst for gRPC client. + -querier.frontend-client.grpc-compression string + Use compression when sending messages. Supported values are: 'gzip', 'snappy' and '' (disable compression) + -querier.frontend-client.grpc-max-recv-msg-size int + gRPC client max receive message size (bytes). (default 104857600) + -querier.frontend-client.grpc-max-send-msg-size int + gRPC client max send message size (bytes). (default 16777216) + -querier.frontend-client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -querier.frontend-client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -querier.frontend-client.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -querier.frontend-client.tls-insecure-skip-verify + Skip validating server certificate. + -querier.frontend-client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -querier.frontend-client.tls-server-name string + Override the expected name on the server certificate. + -querier.id string + Querier ID, sent to frontend service to identify requests from the same querier. Defaults to hostname. + -querier.iterators + Use iterators to execute query, as opposed to fully materialising the series in memory. + -querier.label-names-and-values-results-max-size-bytes int + Maximum size in bytes of distinct label names and values. When querier receives response from ingester, it merges the response with responses from other ingesters. This maximum size limit is applied to the merged(distinct) results. If the limit is reached, an error is returned. (default 419430400) + -querier.label-values-max-cardinality-label-names-per-request int + Maximum number of label names allowed to be queried in a single /api/v1/cardinality/label_values API call. (default 100) + -querier.lookback-delta duration + Time since the last sample after which a time series is considered stale and ignored by expression evaluations. This config option should be set on query-frontend too when query sharding is enabled. (default 5m0s) + -querier.max-concurrent int + The maximum number of concurrent queries. This config option should be set on query-frontend too when query sharding is enabled. (default 20) + -querier.max-fetched-chunk-bytes-per-query int + The maximum size of all chunks in bytes that a query can fetch from each ingester and storage. This limit is enforced in the querier and ruler. 0 to disable. + -querier.max-fetched-chunks-per-query int + Maximum number of chunks that can be fetched in a single query from ingesters and long-term storage. This limit is enforced in the querier, ruler and store-gateway. 0 to disable. (default 2000000) + -querier.max-fetched-series-per-query int + The maximum number of unique series for which a query can fetch samples from each ingesters and storage. This limit is enforced in the querier and ruler. 0 to disable + -querier.max-outstanding-requests-per-tenant int + Maximum number of outstanding requests per tenant per frontend; requests beyond this error with HTTP 429. (default 100) + -querier.max-query-into-future duration + Maximum duration into the future you can query. 0 to disable. (default 10m0s) + -querier.max-query-lookback value + Limit how long back data (series and metadata) can be queried, up until duration ago. This limit is enforced in the query-frontend, querier and ruler. If the requested time range is outside the allowed range, the request will not fail but will be manipulated to only query data within the allowed time range. 0 to disable. + -querier.max-query-parallelism int + Maximum number of split queries will be scheduled in parallel by the frontend. (default 14) + -querier.max-samples int + Maximum number of samples a single query can load into memory. This config option should be set on query-frontend too when query sharding is enabled. (default 50000000) + -querier.query-ingesters-within duration + Maximum lookback beyond which queries are not sent to ingester. 0 means all queries are sent to ingester. + -querier.query-label-names-with-matchers-enabled + True to enable queriers to use an optimized implementation which passes down to ingesters the label matchers when running the label names API. Can be enabled once all ingesters run a version >= the one where this option has been introduced. + -querier.query-store-after duration + The time after which a metric should be queried from storage and not just ingesters. 0 means all queries are sent to store. If this option is enabled, the time range of the query sent to the store-gateway will be manipulated to ensure the query end is not more recent than 'now - query-store-after'. + -querier.query-store-for-labels-enabled value + This option is no longer used, and will be removed. + -querier.scheduler-address string + Hostname (and port) of scheduler that querier will periodically resolve, connect to and receive queries from. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint. + -querier.shuffle-sharding-ingesters-lookback-period duration + When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured 'query store after' and 'query ingesters within'. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled). + -querier.store-gateway-addresses string + Comma separated list of store-gateway addresses in DNS Service Discovery format. This option should be set when the store-gateway sharding is disabled (when enabled, the store-gateway instances form a ring and addresses are picked from the ring). + -querier.store-gateway-client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -querier.store-gateway-client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -querier.store-gateway-client.tls-enabled + Enable TLS for gRPC client connecting to store-gateway. + -querier.store-gateway-client.tls-insecure-skip-verify + Skip validating server certificate. + -querier.store-gateway-client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -querier.store-gateway-client.tls-server-name string + Override the expected name on the server certificate. + -querier.timeout duration + The timeout for a query. This config option should be set on query-frontend too when query sharding is enabled. (default 2m0s) + -querier.worker-match-max-concurrent + Force worker concurrency to match the -querier.max-concurrent option. Overrides querier.worker-parallelism. + -querier.worker-parallelism int + Number of simultaneous queries to process per query-frontend or query-scheduler. (default 10) + -query-frontend.querier-forget-delay duration + If a querier disconnects without sending notification about graceful shutdown, the query-frontend will keep the querier in the tenant's shard until the forget delay has passed. This feature is useful to reduce the blast radius when shuffle-sharding is enabled. + -query-scheduler.grpc-client-config.backoff-max-period duration + Maximum delay when backing off. (default 10s) + -query-scheduler.grpc-client-config.backoff-min-period duration + Minimum delay when backing off. (default 100ms) + -query-scheduler.grpc-client-config.backoff-on-ratelimits + Enable backoff and retry when we hit ratelimits. + -query-scheduler.grpc-client-config.backoff-retries int + Number of times to backoff and retry before failing. (default 10) + -query-scheduler.grpc-client-config.grpc-client-rate-limit float + Rate limit for gRPC client; 0 means disabled. + -query-scheduler.grpc-client-config.grpc-client-rate-limit-burst int + Rate limit burst for gRPC client. + -query-scheduler.grpc-client-config.grpc-compression string + Use compression when sending messages. Supported values are: 'gzip', 'snappy' and '' (disable compression) + -query-scheduler.grpc-client-config.grpc-max-recv-msg-size int + gRPC client max receive message size (bytes). (default 104857600) + -query-scheduler.grpc-client-config.grpc-max-send-msg-size int + gRPC client max send message size (bytes). (default 16777216) + -query-scheduler.grpc-client-config.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -query-scheduler.grpc-client-config.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -query-scheduler.grpc-client-config.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -query-scheduler.grpc-client-config.tls-insecure-skip-verify + Skip validating server certificate. + -query-scheduler.grpc-client-config.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -query-scheduler.grpc-client-config.tls-server-name string + Override the expected name on the server certificate. + -query-scheduler.max-outstanding-requests-per-tenant int + Maximum number of outstanding requests per tenant per query-scheduler. In-flight requests above this limit will fail with HTTP response status code 429. (default 100) + -query-scheduler.querier-forget-delay duration + If a querier disconnects without sending notification about graceful shutdown, the query-scheduler will keep the querier in the tenant's shard until the forget delay has passed. This feature is useful to reduce the blast radius when shuffle-sharding is enabled. + -ring.heartbeat-timeout duration + The heartbeat timeout after which ingesters are skipped for reads/writes. 0 = never (timeout disabled). (default 1m0s) + -ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "collectors/") + -ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -ruler-storage.azure.account-key value + Azure storage account key + -ruler-storage.azure.account-name string + Azure storage account name + -ruler-storage.azure.container-name string + Azure storage container name + -ruler-storage.azure.endpoint-suffix string + Azure storage endpoint suffix without schema. The account name will be prefixed to this value to create the FQDN. If set to empty string, default endpoint suffix is used. + -ruler-storage.azure.max-retries int + Number of retries for recoverable errors (default 20) + -ruler-storage.azure.msi-resource string + If set, this URL is used instead of https://. for obtaining ServicePrincipalToken from MSI. + -ruler-storage.azure.user-assigned-id string + User assigned identity. If empty, then System assigned identity is used. + -ruler-storage.backend string + Backend storage to use. Supported backends are: s3, gcs, azure, swift, filesystem, local. (default "filesystem") + -ruler-storage.filesystem.dir string + Local filesystem storage directory. (default "ruler") + -ruler-storage.gcs.bucket-name string + GCS bucket name + -ruler-storage.gcs.service-account value + JSON representing either a Google Developers Console client_credentials.json file or a Google Developers service account key file. If empty, fallback to Google default logic. + -ruler-storage.local.directory string + Directory to scan for rules + -ruler-storage.s3.access-key-id string + S3 access key ID + -ruler-storage.s3.bucket-name string + S3 bucket name + -ruler-storage.s3.endpoint string + The S3 bucket endpoint. It could be an AWS S3 endpoint listed at https://docs.aws.amazon.com/general/latest/gr/s3.html or the address of an S3-compatible service in hostname:port format. + -ruler-storage.s3.expect-continue-timeout duration + The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) + -ruler-storage.s3.http.idle-conn-timeout duration + The time an idle connection will remain idle before closing. (default 1m30s) + -ruler-storage.s3.http.insecure-skip-verify + If the client connects to S3 via HTTPS and this option is enabled, the client will accept any certificate and hostname. + -ruler-storage.s3.http.response-header-timeout duration + The amount of time the client will wait for a servers response headers. (default 2m0s) + -ruler-storage.s3.insecure + If enabled, use http:// for the S3 endpoint instead of https://. This could be useful in local dev/test environments while using an S3-compatible backend storage, like Minio. + -ruler-storage.s3.max-connections-per-host int + Maximum number of connections per host. 0 means no limit. + -ruler-storage.s3.max-idle-connections int + Maximum number of idle (keep-alive) connections across all hosts. 0 means no limit. (default 100) + -ruler-storage.s3.max-idle-connections-per-host int + Maximum number of idle (keep-alive) connections to keep per-host. If 0, a built-in default value is used. (default 100) + -ruler-storage.s3.region string + S3 region. If unset, the client will issue a S3 GetBucketLocation API call to autodetect it. + -ruler-storage.s3.secret-access-key value + S3 secret access key + -ruler-storage.s3.signature-version string + The signature version to use for authenticating against S3. Supported values are: v4, v2. (default "v4") + -ruler-storage.s3.sse.kms-encryption-context string + KMS Encryption Context used for object encryption. It expects JSON formatted string. + -ruler-storage.s3.sse.kms-key-id string + KMS Key ID used to encrypt objects in S3 + -ruler-storage.s3.sse.type string + Enable AWS Server Side Encryption. Supported values: SSE-KMS, SSE-S3. + -ruler-storage.s3.tls-handshake-timeout duration + Maximum time to wait for a TLS handshake. 0 means no limit. (default 10s) + -ruler-storage.swift.auth-url string + OpenStack Swift authentication URL + -ruler-storage.swift.auth-version int + OpenStack Swift authentication API version. 0 to autodetect. + -ruler-storage.swift.connect-timeout duration + Time after which a connection attempt is aborted. (default 10s) + -ruler-storage.swift.container-name string + Name of the OpenStack Swift container to put chunks in. + -ruler-storage.swift.domain-id string + OpenStack Swift user's domain ID. + -ruler-storage.swift.domain-name string + OpenStack Swift user's domain name. + -ruler-storage.swift.max-retries int + Max retries on requests error. (default 3) + -ruler-storage.swift.password string + OpenStack Swift API key. + -ruler-storage.swift.project-domain-id string + ID of the OpenStack Swift project's domain (v3 auth only), only needed if it differs the from user domain. + -ruler-storage.swift.project-domain-name string + Name of the OpenStack Swift project's domain (v3 auth only), only needed if it differs from the user domain. + -ruler-storage.swift.project-id string + OpenStack Swift project ID (v2,v3 auth only). + -ruler-storage.swift.project-name string + OpenStack Swift project name (v2,v3 auth only). + -ruler-storage.swift.region-name string + OpenStack Swift Region to use (v2,v3 auth only). + -ruler-storage.swift.request-timeout duration + Time after which an idle request is aborted. The timeout watchdog is reset each time some data is received, so the timeout triggers after X time no data is received on a request. (default 5s) + -ruler-storage.swift.user-domain-id string + OpenStack Swift user's domain ID. + -ruler-storage.swift.user-domain-name string + OpenStack Swift user's domain name. + -ruler-storage.swift.user-id string + OpenStack Swift user ID. + -ruler-storage.swift.username string + OpenStack Swift username. + -ruler.alertmanager-client.basic-auth-password string + HTTP Basic authentication password. It overrides the password set in the URL (if any). + -ruler.alertmanager-client.basic-auth-username string + HTTP Basic authentication username. It overrides the username set in the URL (if any). + -ruler.alertmanager-client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -ruler.alertmanager-client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -ruler.alertmanager-client.tls-insecure-skip-verify + Skip validating server certificate. + -ruler.alertmanager-client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -ruler.alertmanager-client.tls-server-name string + Override the expected name on the server certificate. + -ruler.alertmanager-discovery + Use DNS SRV records to discover Alertmanager hosts. + -ruler.alertmanager-refresh-interval duration + How long to wait between refreshing DNS resolutions of Alertmanager hosts. (default 1m0s) + -ruler.alertmanager-url string + Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each Alertmanager URL is treated as a separate group in the configuration. Multiple Alertmanagers in HA per group can be supported by using DNS resolution via -ruler.alertmanager-discovery. + -ruler.alertmanager-use-v2 + If enabled requests to Alertmanager will utilize the V2 API. + -ruler.client.backoff-max-period duration + Maximum delay when backing off. (default 10s) + -ruler.client.backoff-min-period duration + Minimum delay when backing off. (default 100ms) + -ruler.client.backoff-on-ratelimits + Enable backoff and retry when we hit ratelimits. + -ruler.client.backoff-retries int + Number of times to backoff and retry before failing. (default 10) + -ruler.client.grpc-client-rate-limit float + Rate limit for gRPC client; 0 means disabled. + -ruler.client.grpc-client-rate-limit-burst int + Rate limit burst for gRPC client. + -ruler.client.grpc-compression string + Use compression when sending messages. Supported values are: 'gzip', 'snappy' and '' (disable compression) + -ruler.client.grpc-max-recv-msg-size int + gRPC client max receive message size (bytes). (default 104857600) + -ruler.client.grpc-max-send-msg-size int + gRPC client max send message size (bytes). (default 16777216) + -ruler.client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -ruler.client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -ruler.client.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -ruler.client.tls-insecure-skip-verify + Skip validating server certificate. + -ruler.client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -ruler.client.tls-server-name string + Override the expected name on the server certificate. + -ruler.disabled-tenants value + Comma separated list of tenants whose rules this ruler cannot evaluate. If specified, a ruler that would normally pick the specified tenant(s) for processing will ignore them instead. Subject to sharding. + -ruler.enable-sharding + Distribute rule evaluation using ring backend + -ruler.enabled-tenants value + Comma separated list of tenants whose rules this ruler can evaluate. If specified, only these tenants will be handled by ruler, otherwise this ruler can process rules from all tenants. Subject to sharding. + -ruler.evaluation-delay-duration value + Duration to delay the evaluation of rules to ensure the underlying metrics have been pushed. + -ruler.evaluation-interval duration + How frequently to evaluate rules (default 1m0s) + -ruler.external.url value + URL of alerts return path. + -ruler.flush-period duration + Period with which to attempt to flush rule groups. (default 1m0s) + -ruler.for-grace-period duration + Minimum duration between alert and restored "for" state. This is maintained only for alerts with configured "for" time greater than grace period. (default 10m0s) + -ruler.for-outage-tolerance duration + Max time to tolerate outage for restoring "for" state of alert. (default 1h0m0s) + -ruler.max-rule-groups-per-tenant int + Maximum number of rule groups per-tenant. 0 to disable. (default 70) + -ruler.max-rules-per-rule-group int + Maximum number of rules per rule group per-tenant. 0 to disable. (default 20) + -ruler.notification-queue-capacity int + Capacity of the queue for notifications to be sent to the Alertmanager. (default 10000) + -ruler.notification-timeout duration + HTTP timeout duration when sending notifications to the Alertmanager. (default 10s) + -ruler.poll-interval duration + How frequently to poll for rule changes (default 1m0s) + -ruler.query-stats-enabled + Report the wall time for ruler queries to complete as a per user metric and as an info level log message. + -ruler.resend-delay duration + Minimum amount of time to wait before resending an alert to Alertmanager. (default 1m0s) + -ruler.ring.consul.acl-token string + ACL Token used to interact with Consul. + -ruler.ring.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -ruler.ring.consul.consistent-reads + Enable consistent reads to Consul. + -ruler.ring.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -ruler.ring.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -ruler.ring.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -ruler.ring.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -ruler.ring.etcd.endpoints value + The etcd endpoints to connect to. + -ruler.ring.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -ruler.ring.etcd.password string + Etcd password. + -ruler.ring.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -ruler.ring.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -ruler.ring.etcd.tls-enabled + Enable TLS. + -ruler.ring.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -ruler.ring.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -ruler.ring.etcd.tls-server-name string + Override the expected name on the server certificate. + -ruler.ring.etcd.username string + Etcd username. + -ruler.ring.heartbeat-period duration + Period at which to heartbeat to the ring. 0 = disabled. (default 5s) + -ruler.ring.heartbeat-timeout duration + The heartbeat timeout after which rulers are considered unhealthy within the ring. 0 = never (timeout disabled). (default 1m0s) + -ruler.ring.instance-addr string + IP address to advertise in the ring. + -ruler.ring.instance-id string + Instance ID to register in the ring. (default "{{.Hostname}}") + -ruler.ring.instance-interface-names value + Name of network interface to read address from. (default [eth0 en0]) + -ruler.ring.instance-port int + Port to advertise in the ring (defaults to server.grpc-listen-port). + -ruler.ring.multi.mirror-enabled + Mirror writes to secondary store. + -ruler.ring.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -ruler.ring.multi.primary string + Primary backend storage used by multi-client. + -ruler.ring.multi.secondary string + Secondary backend storage used by multi-client. + -ruler.ring.num-tokens int + Number of tokens for each ruler. (default 128) + -ruler.ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "rulers/") + -ruler.ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -ruler.rule-path string + file path to store temporary rule files for the prometheus rule managers (default "/rules") + -ruler.search-pending-for duration + Time to spend searching for a pending ruler when shutting down. (default 5m0s) + -ruler.tenant-federation.enabled source_tenants + Enable running rule groups against multiple tenants. The tenant IDs involved need to be in the rule group's source_tenants field. If this flag is set to `false` when there are already created federated rule groups, then these rules groups will be skipped during evaluations. + -ruler.tenant-shard-size int + The tenant's shard size when sharding is used by ruler. Value of 0 disables shuffle sharding for the tenant, and tenant rules will be sharded across all ruler replicas. + -runtime-config.file string + File with the configuration that can be updated in runtime. + -runtime-config.reload-period duration + How often to check runtime config file. (default 10s) + -server.graceful-shutdown-timeout duration + Timeout for graceful shutdowns (default 30s) + -server.grpc-conn-limit int + Maximum number of simultaneous grpc connections, <=0 to disable + -server.grpc-listen-address string + gRPC server listen address. + -server.grpc-listen-network string + gRPC server listen network (default "tcp") + -server.grpc-listen-port int + gRPC server listen port. (default 9095) + -server.grpc-max-concurrent-streams uint + Limit on the number of concurrent streams for gRPC calls (0 = unlimited) (default 100) + -server.grpc-max-recv-msg-size-bytes int + Limit on the size of a gRPC message this server can receive (bytes). (default 4194304) + -server.grpc-max-send-msg-size-bytes int + Limit on the size of a gRPC message this server can send (bytes). (default 4194304) + -server.grpc-tls-ca-path string + GRPC TLS Client CA path. + -server.grpc-tls-cert-path string + GRPC TLS server cert path. + -server.grpc-tls-client-auth string + GRPC TLS Client Auth type. + -server.grpc-tls-key-path string + GRPC TLS server key path. + -server.grpc.keepalive.max-connection-age duration + The duration for the maximum amount of time a connection may exist before it will be closed. Default: infinity (default 2562047h47m16.854775807s) + -server.grpc.keepalive.max-connection-age-grace duration + An additive period after max-connection-age after which the connection will be forcibly closed. Default: infinity (default 2562047h47m16.854775807s) + -server.grpc.keepalive.max-connection-idle duration + The duration after which an idle connection should be closed. Default: infinity (default 2562047h47m16.854775807s) + -server.grpc.keepalive.min-time-between-pings duration + Minimum amount of time a client should wait before sending a keepalive ping. If client sends keepalive ping more often, server will send GOAWAY and close the connection. (default 10s) + -server.grpc.keepalive.ping-without-stream-allowed + If true, server allows keepalive pings even when there are no active streams(RPCs). If false, and client sends ping when there are no active streams, server will send GOAWAY and close the connection. (default true) + -server.grpc.keepalive.time duration + Duration after which a keepalive probe is sent in case of no activity over the connection., Default: 2h (default 2h0m0s) + -server.grpc.keepalive.timeout duration + After having pinged for keepalive check, the duration after which an idle connection should be closed, Default: 20s (default 20s) + -server.http-conn-limit int + Maximum number of simultaneous http connections, <=0 to disable + -server.http-idle-timeout duration + Idle timeout for HTTP server (default 2m0s) + -server.http-listen-address string + HTTP server listen address. + -server.http-listen-network string + HTTP server listen network, default tcp (default "tcp") + -server.http-listen-port int + HTTP server listen port. (default 8080) + -server.http-read-timeout duration + Read timeout for HTTP server (default 30s) + -server.http-tls-ca-path string + HTTP TLS Client CA path. + -server.http-tls-cert-path string + HTTP server cert path. + -server.http-tls-client-auth string + HTTP TLS Client Auth type. + -server.http-tls-key-path string + HTTP server key path. + -server.http-write-timeout duration + Write timeout for HTTP server (default 30s) + -server.log-source-ips-enabled + Optionally log the source IPs. + -server.log-source-ips-header string + Header field storing the source IPs. Only used if server.log-source-ips-enabled is true. If not set the default Forwarded, X-Real-IP and X-Forwarded-For headers are used + -server.log-source-ips-regex string + Regex for matching the source IPs. Only used if server.log-source-ips-enabled is true. If not set the default Forwarded, X-Real-IP and X-Forwarded-For headers are used + -server.path-prefix string + Base path to serve all API routes from (e.g. /v1/) + -server.register-instrumentation + Register the intrumentation handlers (/metrics etc). (default true) + -store-gateway.sharding-enabled + Shard blocks across multiple store gateway instances. This option needs be set both on the store-gateway and querier when running in microservices mode. + -store-gateway.sharding-ring.consul.acl-token string + ACL Token used to interact with Consul. + -store-gateway.sharding-ring.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -store-gateway.sharding-ring.consul.consistent-reads + Enable consistent reads to Consul. + -store-gateway.sharding-ring.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -store-gateway.sharding-ring.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -store-gateway.sharding-ring.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -store-gateway.sharding-ring.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -store-gateway.sharding-ring.etcd.endpoints value + The etcd endpoints to connect to. + -store-gateway.sharding-ring.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -store-gateway.sharding-ring.etcd.password string + Etcd password. + -store-gateway.sharding-ring.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -store-gateway.sharding-ring.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -store-gateway.sharding-ring.etcd.tls-enabled + Enable TLS. + -store-gateway.sharding-ring.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -store-gateway.sharding-ring.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -store-gateway.sharding-ring.etcd.tls-server-name string + Override the expected name on the server certificate. + -store-gateway.sharding-ring.etcd.username string + Etcd username. + -store-gateway.sharding-ring.heartbeat-period duration + Period at which to heartbeat to the ring. 0 = disabled. (default 15s) + -store-gateway.sharding-ring.heartbeat-timeout duration + The heartbeat timeout after which store gateways are considered unhealthy within the ring. 0 = never (timeout disabled). This option needs be set both on the store-gateway and querier when running in microservices mode. (default 1m0s) + -store-gateway.sharding-ring.instance-addr string + IP address to advertise in the ring. + -store-gateway.sharding-ring.instance-availability-zone string + The availability zone where this instance is running. Required if zone-awareness is enabled. + -store-gateway.sharding-ring.instance-id string + Instance ID to register in the ring. (default "{{.Hostname}}") + -store-gateway.sharding-ring.instance-interface-names value + Name of network interface to read address from. (default [eth0 en0]) + -store-gateway.sharding-ring.instance-port int + Port to advertise in the ring (defaults to server.grpc-listen-port). + -store-gateway.sharding-ring.multi.mirror-enabled + Mirror writes to secondary store. + -store-gateway.sharding-ring.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -store-gateway.sharding-ring.multi.primary string + Primary backend storage used by multi-client. + -store-gateway.sharding-ring.multi.secondary string + Secondary backend storage used by multi-client. + -store-gateway.sharding-ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "collectors/") + -store-gateway.sharding-ring.replication-factor int + The replication factor to use when sharding blocks. This option needs be set both on the store-gateway and querier when running in microservices mode. (default 3) + -store-gateway.sharding-ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -store-gateway.sharding-ring.tokens-file-path string + File path where tokens are stored. If empty, tokens are not stored at shutdown and restored at startup. + -store-gateway.sharding-ring.unregister-on-shutdown + Unregister from the ring upon clean shutdown. (default true) + -store-gateway.sharding-ring.wait-stability-max-duration duration + Maximum time to wait for ring stability at startup. If the store-gateway ring keeps changing after this period of time, the store-gateway will start anyway. (default 5m0s) + -store-gateway.sharding-ring.wait-stability-min-duration duration + Minimum time to wait for ring stability at startup. 0 to disable. (default 1m0s) + -store-gateway.sharding-ring.zone-awareness-enabled + True to enable zone-awareness and replicate blocks across different availability zones. + -store-gateway.tenant-shard-size int + The tenant's shard size, used when store-gateway sharding is enabled. Value of 0 disables shuffle sharding for the tenant, that is all tenant blocks are sharded across all store-gateway replicas. + -store.max-labels-query-length value + Limit the time range (end - start time) of series, label names and values queries. This limit is enforced in the querier. If the requested time range is outside the allowed range, the request will not fail but will be manipulated to only query data within the allowed time range. 0 to disable. + -store.max-query-length value + Limit the query time range (end - start time). This limit is enforced in the query-frontend (on the received query), in the querier (on the query possibly split by the query-frontend) and ruler. 0 to disable. + -target value + Comma-separated list of modules to load. The alias 'all' can be used in the list to load a number of core modules and will enable single-binary mode. Use '-modules' command line flag to get a list of available modules, and to see which modules are included in 'all'. (default all) + -tenant-federation.enabled | + If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a | character in the `X-Scope-OrgID` header (experimental). + -validation.create-grace-period value + Duration which table will be created/deleted before/after it's needed; we won't accept sample from before this time. (default 10m) + -validation.enforce-metadata-metric-name + Enforce every metadata has a metric name. (default true) + -validation.max-label-names-per-series int + Maximum number of label names per series. (default 30) + -validation.max-length-label-name int + Maximum length accepted for label names (default 1024) + -validation.max-length-label-value int + Maximum length accepted for label value. This setting also applies to the metric name (default 2048) + -validation.max-metadata-length int + Maximum length accepted for metric metadata. Metadata refers to Metric Name, HELP and UNIT. (default 1024) + -version + Print application version and exit. diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl new file mode 100644 index 00000000000..6d074ee9753 --- /dev/null +++ b/cmd/mimir/help.txt.tmpl @@ -0,0 +1,1657 @@ +Usage of ./cmd/mimir/mimir: + -activity-tracker.filepath string + File where ongoing activities are stored. If empty, activity tracking is disabled. (default "/tmp/metrics-activity.log") + -activity-tracker.max-entries int + Max number of concurrent activities that can be tracked. Used to size the file in advance. Additional activities are ignored. (default 1024) + -alertmanager-storage.azure.account-key value + Azure storage account key + -alertmanager-storage.azure.account-name string + Azure storage account name + -alertmanager-storage.azure.container-name string + Azure storage container name + -alertmanager-storage.azure.endpoint-suffix string + Azure storage endpoint suffix without schema. The account name will be prefixed to this value to create the FQDN. If set to empty string, default endpoint suffix is used. + -alertmanager-storage.azure.max-retries int + Number of retries for recoverable errors (default 20) + -alertmanager-storage.azure.msi-resource string + If set, this URL is used instead of https://. for obtaining ServicePrincipalToken from MSI. + -alertmanager-storage.azure.user-assigned-id string + User assigned identity. If empty, then System assigned identity is used. + -alertmanager-storage.backend string + Backend storage to use. Supported backends are: s3, gcs, azure, swift, filesystem, local. (default "filesystem") + -alertmanager-storage.filesystem.dir string + Local filesystem storage directory. (default "alertmanager") + -alertmanager-storage.gcs.bucket-name string + GCS bucket name + -alertmanager-storage.gcs.service-account value + JSON representing either a Google Developers Console client_credentials.json file or a Google Developers service account key file. If empty, fallback to Google default logic. + -alertmanager-storage.local.path string + Path at which alertmanager configurations are stored. + -alertmanager-storage.s3.access-key-id string + S3 access key ID + -alertmanager-storage.s3.bucket-name string + S3 bucket name + -alertmanager-storage.s3.endpoint string + The S3 bucket endpoint. It could be an AWS S3 endpoint listed at https://docs.aws.amazon.com/general/latest/gr/s3.html or the address of an S3-compatible service in hostname:port format. + -alertmanager-storage.s3.expect-continue-timeout duration + The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) + -alertmanager-storage.s3.http.idle-conn-timeout duration + The time an idle connection will remain idle before closing. (default 1m30s) + -alertmanager-storage.s3.http.insecure-skip-verify + If the client connects to S3 via HTTPS and this option is enabled, the client will accept any certificate and hostname. + -alertmanager-storage.s3.http.response-header-timeout duration + The amount of time the client will wait for a servers response headers. (default 2m0s) + -alertmanager-storage.s3.insecure + If enabled, use http:// for the S3 endpoint instead of https://. This could be useful in local dev/test environments while using an S3-compatible backend storage, like Minio. + -alertmanager-storage.s3.max-connections-per-host int + Maximum number of connections per host. 0 means no limit. + -alertmanager-storage.s3.max-idle-connections int + Maximum number of idle (keep-alive) connections across all hosts. 0 means no limit. (default 100) + -alertmanager-storage.s3.max-idle-connections-per-host int + Maximum number of idle (keep-alive) connections to keep per-host. If 0, a built-in default value is used. (default 100) + -alertmanager-storage.s3.region string + S3 region. If unset, the client will issue a S3 GetBucketLocation API call to autodetect it. + -alertmanager-storage.s3.secret-access-key value + S3 secret access key + -alertmanager-storage.s3.signature-version string + The signature version to use for authenticating against S3. Supported values are: v4, v2. (default "v4") + -alertmanager-storage.s3.sse.kms-encryption-context string + KMS Encryption Context used for object encryption. It expects JSON formatted string. + -alertmanager-storage.s3.sse.kms-key-id string + KMS Key ID used to encrypt objects in S3 + -alertmanager-storage.s3.sse.type string + Enable AWS Server Side Encryption. Supported values: SSE-KMS, SSE-S3. + -alertmanager-storage.s3.tls-handshake-timeout duration + Maximum time to wait for a TLS handshake. 0 means no limit. (default 10s) + -alertmanager-storage.swift.auth-url string + OpenStack Swift authentication URL + -alertmanager-storage.swift.auth-version int + OpenStack Swift authentication API version. 0 to autodetect. + -alertmanager-storage.swift.connect-timeout duration + Time after which a connection attempt is aborted. (default 10s) + -alertmanager-storage.swift.container-name string + Name of the OpenStack Swift container to put chunks in. + -alertmanager-storage.swift.domain-id string + OpenStack Swift user's domain ID. + -alertmanager-storage.swift.domain-name string + OpenStack Swift user's domain name. + -alertmanager-storage.swift.max-retries int + Max retries on requests error. (default 3) + -alertmanager-storage.swift.password string + OpenStack Swift API key. + -alertmanager-storage.swift.project-domain-id string + ID of the OpenStack Swift project's domain (v3 auth only), only needed if it differs the from user domain. + -alertmanager-storage.swift.project-domain-name string + Name of the OpenStack Swift project's domain (v3 auth only), only needed if it differs from the user domain. + -alertmanager-storage.swift.project-id string + OpenStack Swift project ID (v2,v3 auth only). + -alertmanager-storage.swift.project-name string + OpenStack Swift project name (v2,v3 auth only). + -alertmanager-storage.swift.region-name string + OpenStack Swift Region to use (v2,v3 auth only). + -alertmanager-storage.swift.request-timeout duration + Time after which an idle request is aborted. The timeout watchdog is reset each time some data is received, so the timeout triggers after X time no data is received on a request. (default 5s) + -alertmanager-storage.swift.user-domain-id string + OpenStack Swift user's domain ID. + -alertmanager-storage.swift.user-domain-name string + OpenStack Swift user's domain name. + -alertmanager-storage.swift.user-id string + OpenStack Swift user ID. + -alertmanager-storage.swift.username string + OpenStack Swift username. + -alertmanager.alertmanager-client.remote-timeout duration + Timeout for downstream alertmanagers. (default 2s) + -alertmanager.alertmanager-client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -alertmanager.alertmanager-client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -alertmanager.alertmanager-client.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -alertmanager.alertmanager-client.tls-insecure-skip-verify + Skip validating server certificate. + -alertmanager.alertmanager-client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -alertmanager.alertmanager-client.tls-server-name string + Override the expected name on the server certificate. + -alertmanager.cluster.advertise-address string + Explicit address or hostname to advertise in cluster. + -alertmanager.cluster.gossip-interval duration + The interval between sending gossip messages. By lowering this value (more frequent) gossip messages are propagated across cluster more quickly at the expense of increased bandwidth usage. (default 200ms) + -alertmanager.cluster.listen-address string + Listen address and port for the cluster. Not specifying this flag disables high-availability mode. (default "0.0.0.0:9094") + -alertmanager.cluster.peer-timeout duration + Time to wait between peers to send notifications. (default 15s) + -alertmanager.cluster.peers value + Comma-separated list of initial peers. + -alertmanager.cluster.push-pull-interval duration + The interval between gossip state syncs. Setting this interval lower (more frequent) will increase convergence speeds across larger clusters at the expense of increased bandwidth usage. (default 1m0s) + -alertmanager.configs.auto-webhook-root string + Root of URL to generate if config is http://internal.monitor + -alertmanager.configs.fallback string + Filename of fallback config to use if none specified for instance. + -alertmanager.configs.poll-interval duration + How frequently to poll Alertmanager configs. (default 15s) + -alertmanager.max-alerts-count int + Maximum number of alerts that a single user can have. Inserting more alerts will fail with a log message and metric increment. 0 = no limit. + -alertmanager.max-alerts-size-bytes int + Maximum total size of alerts that a single user can have, alert size is the sum of the bytes of its labels, annotations and generatorURL. Inserting more alerts will fail with a log message and metric increment. 0 = no limit. + -alertmanager.max-config-size-bytes int + Maximum size of configuration file for Alertmanager that tenant can upload via Alertmanager API. 0 = no limit. + -alertmanager.max-dispatcher-aggregation-groups int + Maximum number of aggregation groups in Alertmanager's dispatcher that a tenant can have. Each active aggregation group uses single goroutine. When the limit is reached, dispatcher will not dispatch alerts that belong to additional aggregation groups, but existing groups will keep working properly. 0 = no limit. + -alertmanager.max-recv-msg-size int + Maximum size (bytes) of an accepted HTTP request body. (default 16777216) + -alertmanager.max-template-size-bytes int + Maximum size of single template in tenant's Alertmanager configuration uploaded via Alertmanager API. 0 = no limit. + -alertmanager.max-templates-count int + Maximum number of templates in tenant's Alertmanager configuration uploaded via Alertmanager API. 0 = no limit. + -alertmanager.notification-rate-limit float + Per-user rate limit for sending notifications from Alertmanager in notifications/sec. 0 = rate limit disabled. Negative value = no notifications are allowed. + -alertmanager.notification-rate-limit-per-integration value + Per-integration notification rate limits. Value is a map, where each key is integration name and value is a rate-limit (float). On command line, this map is given in JSON format. Rate limit has the same meaning as -alertmanager.notification-rate-limit, but only applies for specific integration. Allowed integration names: webhook, email, pagerduty, opsgenie, wechat, slack, victorops, pushover, sns. (default {}) + -alertmanager.persist-interval duration + The interval between persisting the current alertmanager state (notification log and silences) to object storage. This is only used when sharding is enabled. This state is read when all replicas for a shard can not be contacted. In this scenario, having persisted the state more frequently will result in potentially fewer lost silences, and fewer duplicate notifications. (default 15m0s) + -alertmanager.receivers-firewall-block-cidr-networks value + Comma-separated list of network CIDRs to block in Alertmanager receiver integrations. + -alertmanager.receivers-firewall-block-private-addresses + True to block private and local addresses in Alertmanager receiver integrations. It blocks private addresses defined by RFC 1918 (IPv4 addresses) and RFC 4193 (IPv6 addresses), as well as loopback, local unicast and local multicast addresses. + -alertmanager.sharding-enabled + Shard tenants across multiple alertmanager instances. + -alertmanager.sharding-ring.consul.acl-token string + ACL Token used to interact with Consul. + -alertmanager.sharding-ring.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -alertmanager.sharding-ring.consul.consistent-reads + Enable consistent reads to Consul. + -alertmanager.sharding-ring.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -alertmanager.sharding-ring.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -alertmanager.sharding-ring.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -alertmanager.sharding-ring.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -alertmanager.sharding-ring.etcd.endpoints value + The etcd endpoints to connect to. + -alertmanager.sharding-ring.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -alertmanager.sharding-ring.etcd.password string + Etcd password. + -alertmanager.sharding-ring.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -alertmanager.sharding-ring.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -alertmanager.sharding-ring.etcd.tls-enabled + Enable TLS. + -alertmanager.sharding-ring.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -alertmanager.sharding-ring.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -alertmanager.sharding-ring.etcd.tls-server-name string + Override the expected name on the server certificate. + -alertmanager.sharding-ring.etcd.username string + Etcd username. + -alertmanager.sharding-ring.heartbeat-period duration + Period at which to heartbeat to the ring. 0 = disabled. (default 15s) + -alertmanager.sharding-ring.heartbeat-timeout duration + The heartbeat timeout after which alertmanagers are considered unhealthy within the ring. 0 = never (timeout disabled). (default 1m0s) + -alertmanager.sharding-ring.instance-addr string + IP address to advertise in the ring. + -alertmanager.sharding-ring.instance-availability-zone string + The availability zone where this instance is running. Required if zone-awareness is enabled. + -alertmanager.sharding-ring.instance-id string + Instance ID to register in the ring. (default "{{.Hostname}}") + -alertmanager.sharding-ring.instance-interface-names value + Name of network interface to read address from. (default [eth0 en0]) + -alertmanager.sharding-ring.instance-port int + Port to advertise in the ring (defaults to server.grpc-listen-port). + -alertmanager.sharding-ring.multi.mirror-enabled + Mirror writes to secondary store. + -alertmanager.sharding-ring.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -alertmanager.sharding-ring.multi.primary string + Primary backend storage used by multi-client. + -alertmanager.sharding-ring.multi.secondary string + Secondary backend storage used by multi-client. + -alertmanager.sharding-ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "alertmanagers/") + -alertmanager.sharding-ring.replication-factor int + The replication factor to use when sharding the alertmanager. (default 3) + -alertmanager.sharding-ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -alertmanager.sharding-ring.zone-awareness-enabled + True to enable zone-awareness and replicate alerts across different availability zones. + -alertmanager.storage.path string + Base path for data storage. (default "data/") + -alertmanager.storage.retention duration + How long to keep data for. (default 120h0m0s) + -alertmanager.web.external-url value + The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself. If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Alertmanager. (default http://localhost) + -api.response-compression-enabled + Use GZIP compression for API responses. Some endpoints serve large YAML or JSON blobs which can benefit from compression. + -api.skip-label-name-validation-header-enabled + Allows to skip label name validation via header on the http write path. Use with caution as it breaks PromQL. Allowing this for external clients allows any client to send invalid label names. After enabling it, requests with a specific HTTP header set to true will not have label names validated. + -auth.enabled + Set to false to disable auth. (default true) + -blocks-storage.azure.account-key value + Azure storage account key + -blocks-storage.azure.account-name string + Azure storage account name + -blocks-storage.azure.container-name string + Azure storage container name + -blocks-storage.azure.endpoint-suffix string + Azure storage endpoint suffix without schema. The account name will be prefixed to this value to create the FQDN. If set to empty string, default endpoint suffix is used. + -blocks-storage.azure.max-retries int + Number of retries for recoverable errors (default 20) + -blocks-storage.azure.msi-resource string + If set, this URL is used instead of https://. for obtaining ServicePrincipalToken from MSI. + -blocks-storage.azure.user-assigned-id string + User assigned identity. If empty, then System assigned identity is used. + -blocks-storage.backend string + Backend storage to use. Supported backends are: s3, gcs, azure, swift, filesystem. (default "filesystem") + -blocks-storage.bucket-store.block-sync-concurrency int + Maximum number of concurrent blocks synching per tenant. (default 20) + -blocks-storage.bucket-store.bucket-index.enabled + True to enable querier and store-gateway to discover blocks in the storage via bucket index instead of bucket scanning. + -blocks-storage.bucket-store.bucket-index.idle-timeout duration + How long a unused bucket index should be cached. Once this timeout expires, the unused bucket index is removed from the in-memory cache. This option is used only by querier. (default 1h0m0s) + -blocks-storage.bucket-store.bucket-index.max-stale-period duration + The maximum allowed age of a bucket index (last updated) before queries start failing because the bucket index is too old. The bucket index is periodically updated by the compactor, while this check is enforced in the querier (at query time). (default 1h0m0s) + -blocks-storage.bucket-store.bucket-index.update-on-error-interval duration + How frequently a bucket index, which previously failed to load, should be tried to load again. This option is used only by querier. (default 1m0s) + -blocks-storage.bucket-store.chunk-pool-max-bucket-size-bytes int + Size - in bytes - of the largest chunks pool bucket. (default 50000000) + -blocks-storage.bucket-store.chunk-pool-min-bucket-size-bytes int + Size - in bytes - of the smallest chunks pool bucket. (default 16000) + -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items int + Maximum number of object attribute items to keep in a first level in-memory LRU cache. Metadata will be stored and fetched in-memory before hitting the cache backend. 0 to disable the in-memory cache. + -blocks-storage.bucket-store.chunks-cache.attributes-ttl duration + TTL for caching object attributes for chunks. If the metadata cache is configured, attributes will be stored under this cache backend, otherwise attributes are stored in the chunks cache backend. (default 168h0m0s) + -blocks-storage.bucket-store.chunks-cache.backend string + Backend for chunks cache, if not empty. Supported values: memcached. + -blocks-storage.bucket-store.chunks-cache.max-get-range-requests int + Maximum number of sub-GetRange requests that a single GetRange request can be split into when fetching chunks. Zero or negative value = unlimited number of sub-requests. (default 3) + -blocks-storage.bucket-store.chunks-cache.memcached.addresses string + Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). + -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size int + The maximum number of enqueued asynchronous operations allowed. (default 10000) + -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency int + The maximum number of concurrent asynchronous operations can occur. (default 50) + -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size int + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency int + The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) + -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections int + The maximum number of idle connections that will be maintained per address. (default 16) + -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size int + The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) + -blocks-storage.bucket-store.chunks-cache.memcached.timeout duration + The socket read/write timeout. (default 100ms) + -blocks-storage.bucket-store.chunks-cache.subrange-size int + Size of each subrange that bucket object is split into for better caching. (default 16000) + -blocks-storage.bucket-store.chunks-cache.subrange-ttl duration + TTL for caching individual chunks subranges. (default 24h0m0s) + -blocks-storage.bucket-store.consistency-delay duration + Minimum age of a block before it's being read. Set it to safe value (e.g 30m) if your object storage is eventually consistent. GCS and S3 are (roughly) strongly consistent. + -blocks-storage.bucket-store.ignore-blocks-within duration + Blocks with minimum time within this duration are ignored, and not loaded by store-gateway. Useful when used together with -querier.query-store-after to prevent loading young blocks, because there are usually many of them (depending on number of ingesters) and they are not yet compacted. Negative values or 0 disable the filter. + -blocks-storage.bucket-store.ignore-deletion-marks-delay duration + Duration after which the blocks marked for deletion will be filtered out while fetching blocks. The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. Default is 6h, half of the default value for -compactor.deletion-delay. (default 6h0m0s) + -blocks-storage.bucket-store.index-cache.backend string + The index cache backend type. Supported values: inmemory, memcached. (default "inmemory") + -blocks-storage.bucket-store.index-cache.inmemory.max-size-bytes uint + Maximum size in bytes of in-memory index cache used to speed up blocks index lookups (shared between all tenants). (default 1073741824) + -blocks-storage.bucket-store.index-cache.memcached.addresses string + Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). + -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size int + The maximum number of enqueued asynchronous operations allowed. (default 10000) + -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency int + The maximum number of concurrent asynchronous operations can occur. (default 50) + -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size int + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency int + The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) + -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections int + The maximum number of idle connections that will be maintained per address. (default 16) + -blocks-storage.bucket-store.index-cache.memcached.max-item-size int + The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) + -blocks-storage.bucket-store.index-cache.memcached.timeout duration + The socket read/write timeout. (default 100ms) + -blocks-storage.bucket-store.index-header-lazy-loading-enabled + If enabled, store-gateway will lazy load an index-header only once required by a query. (default true) + -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout duration + If index-header lazy loading is enabled and this setting is > 0, the store-gateway will offload unused index-headers after 'idle timeout' inactivity. (default 1h0m0s) + -blocks-storage.bucket-store.max-chunk-pool-bytes uint + Max size - in bytes - of a chunks pool, used to reduce memory allocations. The pool is shared across all tenants. 0 to disable the limit. (default 2147483648) + -blocks-storage.bucket-store.max-concurrent int + Max number of concurrent queries to execute against the long-term storage. The limit is shared across all tenants. (default 100) + -blocks-storage.bucket-store.meta-sync-concurrency int + Number of Go routines to use when syncing block meta files from object storage per tenant. (default 20) + -blocks-storage.bucket-store.metadata-cache.backend string + Backend for metadata cache, if not empty. Supported values: memcached. + -blocks-storage.bucket-store.metadata-cache.block-index-attributes-ttl duration + How long to cache attributes of the block index. (default 168h0m0s) + -blocks-storage.bucket-store.metadata-cache.bucket-index-content-ttl duration + How long to cache content of the bucket index. (default 5m0s) + -blocks-storage.bucket-store.metadata-cache.bucket-index-max-size-bytes int + Maximum size of bucket index content to cache in bytes. Caching will be skipped if the content exceeds this size. This is useful to avoid network round trip for large content if the configured caching backend has an hard limit on cached items size (in this case, you should set this limit to the same limit in the caching backend). (default 1048576) + -blocks-storage.bucket-store.metadata-cache.chunks-list-ttl duration + How long to cache list of chunks for a block. (default 24h0m0s) + -blocks-storage.bucket-store.metadata-cache.memcached.addresses string + Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). + -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size int + The maximum number of enqueued asynchronous operations allowed. (default 10000) + -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency int + The maximum number of concurrent asynchronous operations can occur. (default 50) + -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size int + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency int + The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) + -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections int + The maximum number of idle connections that will be maintained per address. (default 16) + -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size int + The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) + -blocks-storage.bucket-store.metadata-cache.memcached.timeout duration + The socket read/write timeout. (default 100ms) + -blocks-storage.bucket-store.metadata-cache.metafile-attributes-ttl duration + How long to cache attributes of the block metafile. (default 168h0m0s) + -blocks-storage.bucket-store.metadata-cache.metafile-content-ttl duration + How long to cache content of the metafile. (default 24h0m0s) + -blocks-storage.bucket-store.metadata-cache.metafile-doesnt-exist-ttl duration + How long to cache information that block metafile doesn't exist. Also used for user deletion mark file. (default 5m0s) + -blocks-storage.bucket-store.metadata-cache.metafile-exists-ttl duration + How long to cache information that block metafile exists. Also used for user deletion mark file. (default 2h0m0s) + -blocks-storage.bucket-store.metadata-cache.metafile-max-size-bytes int + Maximum size of metafile content to cache in bytes. Caching will be skipped if the content exceeds this size. This is useful to avoid network round trip for large content if the configured caching backend has an hard limit on cached items size (in this case, you should set this limit to the same limit in the caching backend). (default 1048576) + -blocks-storage.bucket-store.metadata-cache.tenant-blocks-list-ttl duration + How long to cache list of blocks for each tenant. (default 5m0s) + -blocks-storage.bucket-store.metadata-cache.tenants-list-ttl duration + How long to cache list of tenants in the bucket. (default 15m0s) + -blocks-storage.bucket-store.partitioner-max-gap-bytes uint + Max size - in bytes - of a gap for which the partitioner aggregates together two bucket GET object requests. (default 524288) + -blocks-storage.bucket-store.posting-offsets-in-mem-sampling int + Controls what is the ratio of postings offsets that the store will hold in memory. (default 32) + -blocks-storage.bucket-store.series-hash-cache-max-size-bytes uint + Max size - in bytes - of the in-memory series hash cache. The cache is shared across all tenants and it's used only when query sharding is enabled. (default 1073741824) + -blocks-storage.bucket-store.sync-dir string + Directory to store synchronized TSDB index headers. (default "tsdb-sync") + -blocks-storage.bucket-store.sync-interval duration + How frequently to scan the bucket, or to refresh the bucket index (if enabled), in order to look for changes (new blocks shipped by ingesters and blocks deleted by retention or compaction). (default 15m0s) + -blocks-storage.bucket-store.tenant-sync-concurrency int + Maximum number of concurrent tenants synching blocks. (default 10) + -blocks-storage.filesystem.dir string + Local filesystem storage directory. (default "blocks") + -blocks-storage.gcs.bucket-name string + GCS bucket name + -blocks-storage.gcs.service-account value + JSON representing either a Google Developers Console client_credentials.json file or a Google Developers service account key file. If empty, fallback to Google default logic. + -blocks-storage.s3.access-key-id string + S3 access key ID + -blocks-storage.s3.bucket-name string + S3 bucket name + -blocks-storage.s3.endpoint string + The S3 bucket endpoint. It could be an AWS S3 endpoint listed at https://docs.aws.amazon.com/general/latest/gr/s3.html or the address of an S3-compatible service in hostname:port format. + -blocks-storage.s3.expect-continue-timeout duration + The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) + -blocks-storage.s3.http.idle-conn-timeout duration + The time an idle connection will remain idle before closing. (default 1m30s) + -blocks-storage.s3.http.insecure-skip-verify + If the client connects to S3 via HTTPS and this option is enabled, the client will accept any certificate and hostname. + -blocks-storage.s3.http.response-header-timeout duration + The amount of time the client will wait for a servers response headers. (default 2m0s) + -blocks-storage.s3.insecure + If enabled, use http:// for the S3 endpoint instead of https://. This could be useful in local dev/test environments while using an S3-compatible backend storage, like Minio. + -blocks-storage.s3.max-connections-per-host int + Maximum number of connections per host. 0 means no limit. + -blocks-storage.s3.max-idle-connections int + Maximum number of idle (keep-alive) connections across all hosts. 0 means no limit. (default 100) + -blocks-storage.s3.max-idle-connections-per-host int + Maximum number of idle (keep-alive) connections to keep per-host. If 0, a built-in default value is used. (default 100) + -blocks-storage.s3.region string + S3 region. If unset, the client will issue a S3 GetBucketLocation API call to autodetect it. + -blocks-storage.s3.secret-access-key value + S3 secret access key + -blocks-storage.s3.signature-version string + The signature version to use for authenticating against S3. Supported values are: v4, v2. (default "v4") + -blocks-storage.s3.sse.kms-encryption-context string + KMS Encryption Context used for object encryption. It expects JSON formatted string. + -blocks-storage.s3.sse.kms-key-id string + KMS Key ID used to encrypt objects in S3 + -blocks-storage.s3.sse.type string + Enable AWS Server Side Encryption. Supported values: SSE-KMS, SSE-S3. + -blocks-storage.s3.tls-handshake-timeout duration + Maximum time to wait for a TLS handshake. 0 means no limit. (default 10s) + -blocks-storage.swift.auth-url string + OpenStack Swift authentication URL + -blocks-storage.swift.auth-version int + OpenStack Swift authentication API version. 0 to autodetect. + -blocks-storage.swift.connect-timeout duration + Time after which a connection attempt is aborted. (default 10s) + -blocks-storage.swift.container-name string + Name of the OpenStack Swift container to put chunks in. + -blocks-storage.swift.domain-id string + OpenStack Swift user's domain ID. + -blocks-storage.swift.domain-name string + OpenStack Swift user's domain name. + -blocks-storage.swift.max-retries int + Max retries on requests error. (default 3) + -blocks-storage.swift.password string + OpenStack Swift API key. + -blocks-storage.swift.project-domain-id string + ID of the OpenStack Swift project's domain (v3 auth only), only needed if it differs the from user domain. + -blocks-storage.swift.project-domain-name string + Name of the OpenStack Swift project's domain (v3 auth only), only needed if it differs from the user domain. + -blocks-storage.swift.project-id string + OpenStack Swift project ID (v2,v3 auth only). + -blocks-storage.swift.project-name string + OpenStack Swift project name (v2,v3 auth only). + -blocks-storage.swift.region-name string + OpenStack Swift Region to use (v2,v3 auth only). + -blocks-storage.swift.request-timeout duration + Time after which an idle request is aborted. The timeout watchdog is reset each time some data is received, so the timeout triggers after X time no data is received on a request. (default 5s) + -blocks-storage.swift.user-domain-id string + OpenStack Swift user's domain ID. + -blocks-storage.swift.user-domain-name string + OpenStack Swift user's domain name. + -blocks-storage.swift.user-id string + OpenStack Swift user ID. + -blocks-storage.swift.username string + OpenStack Swift username. + -blocks-storage.tsdb.block-ranges-period value + TSDB blocks range period. (default 2h0m0s) + -blocks-storage.tsdb.close-idle-tsdb-timeout duration + If TSDB has not received any data for this duration, and all blocks from TSDB have been shipped, TSDB is closed and deleted from local disk. If set to positive value, this value should be equal or higher than -querier.query-ingesters-within flag to make sure that TSDB is not closed prematurely, which could cause partial query results. 0 or negative value disables closing of idle TSDB. + -blocks-storage.tsdb.dir string + Local directory to store TSDBs in the ingesters. (default "tsdb") + -blocks-storage.tsdb.flush-blocks-on-shutdown + True to flush blocks to storage on shutdown. If false, incomplete blocks will be reused after restart. + -blocks-storage.tsdb.head-chunks-end-time-variance float + How much variance (as percentage between 0 and 1) should be applied to the chunk end time, to spread chunks writing across time. Doesn't apply to the last chunk of the chunk range. 0 means no variance. + -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes int + The write buffer size used by the head chunks mapper. Lower values reduce memory utilisation on clusters with a large number of tenants at the cost of increased disk I/O operations. (default 4194304) + -blocks-storage.tsdb.head-chunks-write-queue-size int + The size of the write queue used by the head chunks mapper. Lower values reduce memory utilisation at the cost of potentially higher ingest latency. 0 disables the use of the chunk write queue. + -blocks-storage.tsdb.head-compaction-concurrency int + Maximum number of tenants concurrently compacting TSDB head into a new block (default 5) + -blocks-storage.tsdb.head-compaction-idle-timeout duration + If TSDB head is idle for this duration, it is compacted. Note that up to 25% jitter is added to the value to avoid ingesters compacting concurrently. 0 means disabled. (default 1h0m0s) + -blocks-storage.tsdb.head-compaction-interval duration + How frequently ingesters try to compact TSDB head. Block is only created if data covers smallest block range. Must be greater than 0 and max 5 minutes. (default 1m0s) + -blocks-storage.tsdb.isolation-enabled + Enables TSDB isolation feature. Disabling may improve performance. (default true) + -blocks-storage.tsdb.max-tsdb-opening-concurrency-on-startup int + limit the number of concurrently opening TSDB's on startup (default 10) + -blocks-storage.tsdb.memory-snapshot-on-shutdown + True to enable snapshotting of in-memory TSDB data on disk when shutting down. + -blocks-storage.tsdb.retention-period duration + TSDB blocks retention in the ingester before a block is removed. This should be larger than the block_ranges_period and large enough to give store-gateways and queriers enough time to discover newly uploaded blocks. (default 6h0m0s) + -blocks-storage.tsdb.series-hash-cache-max-size-bytes uint + Max size - in bytes - of the in-memory series hash cache. The cache is shared across all tenants and it's used only when query sharding is enabled. (default 1073741824) + -blocks-storage.tsdb.ship-concurrency int + Maximum number of tenants concurrently shipping blocks to the storage. (default 10) + -blocks-storage.tsdb.ship-interval duration + How frequently the TSDB blocks are scanned and new ones are shipped to the storage. 0 means shipping is disabled. (default 1m0s) + -blocks-storage.tsdb.stripe-size int + The number of shards of series to use in TSDB (must be a power of 2). Reducing this will decrease memory footprint, but can negatively impact performance. (default 16384) + -blocks-storage.tsdb.wal-compression-enabled + True to enable TSDB WAL compression. + -blocks-storage.tsdb.wal-segment-size-bytes int + TSDB WAL segments files max size (bytes). (default 134217728) + -compactor.block-sync-concurrency int + Number of Go routines to use when downloading blocks for compaction and uploading resulting blocks. (default 8) + -compactor.blocks-retention-period value + Delete blocks containing samples older than the specified retention period. 0 to disable. + -compactor.cleanup-concurrency int + Max number of tenants for which blocks cleanup and maintenance should run concurrently. (default 20) + -compactor.cleanup-interval duration + How frequently compactor should run blocks cleanup and maintenance, as well as update the bucket index. (default 15m0s) + -compactor.compaction-concurrency int + Max number of concurrent compactions running. (default 1) + -compactor.compaction-interval duration + The frequency at which the compaction runs (default 1h0m0s) + -compactor.compaction-jobs-order string + The sorting to use when deciding which compaction jobs should run first for a given tenant. Supported values are: smallest-range-oldest-blocks-first, newest-blocks-first. (default "smallest-range-oldest-blocks-first") + -compactor.compaction-retries int + How many times to retry a failed compaction within a single compaction run. (default 3) + -compactor.compactor-tenant-shard-size int + Max number of compactors that can compact blocks for single tenant. 0 to disable the limit and use all compactors. + -compactor.consistency-delay duration + Minimum age of fresh (non-compacted) blocks before they are being processed. Malformed blocks older than the maximum of consistency-delay and 48h0m0s will be removed. + -compactor.data-dir string + Data directory in which to cache blocks and process compactions (default "./data") + -compactor.deletion-delay duration + Time before a block marked for deletion is deleted from bucket. If not 0, blocks will be marked for deletion and compactor component will permanently delete blocks marked for deletion from the bucket. If 0, blocks will be deleted straight away. Note that deleting blocks immediately can cause query failures. (default 12h0m0s) + -compactor.disabled-tenants value + Comma separated list of tenants that cannot be compacted by this compactor. If specified, and compactor would normally pick given tenant for compaction (via -compactor.enabled-tenants or sharding), it will be ignored instead. + -compactor.enabled-tenants value + Comma separated list of tenants that can be compacted. If specified, only these tenants will be compacted by compactor, otherwise all tenants can be compacted. Subject to sharding. + -compactor.max-closing-blocks-concurrency int + Max number of blocks that can be closed concurrently during split compaction. Note that closing of newly compacted block uses a lot of memory for writing index. (default 1) + -compactor.max-compaction-time duration + Max time for starting compactions for a single tenant. After this time no new compactions for the tenant are started before next compaction cycle. This can help in multi-tenant environments to avoid single tenant using all compaction time, but also in single-tenant environments to force new discovery of blocks more often. 0 = disabled. + -compactor.max-opening-blocks-concurrency int + Number of goroutines opening blocks before compaction. (default 1) + -compactor.meta-sync-concurrency int + Number of Go routines to use when syncing block meta files from the long term storage. (default 20) + -compactor.ring.consul.acl-token string + ACL Token used to interact with Consul. + -compactor.ring.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -compactor.ring.consul.consistent-reads + Enable consistent reads to Consul. + -compactor.ring.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -compactor.ring.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -compactor.ring.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -compactor.ring.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -compactor.ring.etcd.endpoints value + The etcd endpoints to connect to. + -compactor.ring.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -compactor.ring.etcd.password string + Etcd password. + -compactor.ring.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -compactor.ring.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -compactor.ring.etcd.tls-enabled + Enable TLS. + -compactor.ring.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -compactor.ring.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -compactor.ring.etcd.tls-server-name string + Override the expected name on the server certificate. + -compactor.ring.etcd.username string + Etcd username. + -compactor.ring.heartbeat-period duration + Period at which to heartbeat to the ring. 0 = disabled. (default 5s) + -compactor.ring.heartbeat-timeout duration + The heartbeat timeout after which compactors are considered unhealthy within the ring. 0 = never (timeout disabled). (default 1m0s) + -compactor.ring.instance-addr string + IP address to advertise in the ring. + -compactor.ring.instance-id string + Instance ID to register in the ring. (default "{{.Hostname}}") + -compactor.ring.instance-interface-names value + Name of network interface to read address from. (default [eth0 en0]) + -compactor.ring.instance-port int + Port to advertise in the ring (defaults to server.grpc-listen-port). + -compactor.ring.multi.mirror-enabled + Mirror writes to secondary store. + -compactor.ring.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -compactor.ring.multi.primary string + Primary backend storage used by multi-client. + -compactor.ring.multi.secondary string + Secondary backend storage used by multi-client. + -compactor.ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "collectors/") + -compactor.ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -compactor.ring.wait-active-instance-timeout duration + Timeout for waiting on compactor to become ACTIVE in the ring. (default 10m0s) + -compactor.ring.wait-stability-max-duration duration + Maximum time to wait for ring stability at startup. If the compactor ring keeps changing after this period of time, the compactor will start anyway. (default 5m0s) + -compactor.ring.wait-stability-min-duration duration + Minimum time to wait for ring stability at startup. 0 to disable. (default 1m0s) + -compactor.sharding-enabled + Shard workload across multiple compactor instances. Sharding is required if you run multiple compactor instances, in order to coordinate compactions and avoid race conditions leading to the same tenant blocks simultaneously compacted by different instances. + -compactor.split-and-merge-shards int + The number of shards to use when splitting blocks. 0 to disable splitting. + -compactor.split-groups int + Number of groups that blocks for splitting should be grouped into. Each group of blocks is then split separately. Number of output split shards is controlled by -compactor.split-and-merge-shards. (default 1) + -compactor.symbols-flushers-concurrency int + Number of symbols flushers used when doing split compaction. (default 1) + -compactor.tenant-cleanup-delay duration + For tenants marked for deletion, this is time between deleting of last block, and doing final cleanup (marker files, debug files) of the tenant. (default 6h0m0s) + -config.expand-env + Expands ${var} or $var in config according to the values of the environment variables. + -config.file value + Configuration file to load. + -consul.acl-token string + ACL Token used to interact with Consul. + -consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -consul.consistent-reads + Enable consistent reads to Consul. + -consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -debug.block-profile-rate int + Fraction of goroutine blocking events that are reported in the blocking profile. 1 to include every blocking event in the profile, 0 to disable. + -debug.mutex-profile-fraction int + Fraction of mutex contention events that are reported in the mutex profile. On average 1/rate events are reported. 0 to disable. + -distributor.client-cleanup-period duration + How frequently to clean up clients for ingesters that have gone away. (default 15s) + -distributor.drop-label value + This flag can be used to specify label names that to drop during sample ingestion within the distributor and can be repeated in order to drop multiple labels. + -distributor.excluded-zones value + Comma-separated list of zones to exclude from the ring. Instances in excluded zones will be filtered out from the ring. + -distributor.extend-writes + Try writing to an additional ingester in the presence of an ingester not in the ACTIVE state. It is useful to disable this along with -ingester.unregister-on-shutdown=false in order to not spread samples to extra ingesters during rolling restarts with consistent naming. (default true) + -distributor.extra-query-delay duration + Time to wait before sending more than the minimum successful query requests. + -distributor.ha-tracker.cluster string + Prometheus label to look for in samples to identify a Prometheus HA cluster. (default "cluster") + -distributor.ha-tracker.consul.acl-token string + ACL Token used to interact with Consul. + -distributor.ha-tracker.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -distributor.ha-tracker.consul.consistent-reads + Enable consistent reads to Consul. + -distributor.ha-tracker.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -distributor.ha-tracker.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -distributor.ha-tracker.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -distributor.ha-tracker.enable + Enable the distributors HA tracker so that it can accept samples from Prometheus HA replicas gracefully (requires labels). + -distributor.ha-tracker.enable-for-all-users + Flag to enable, for all users, handling of samples with external labels identifying replicas in an HA Prometheus setup. + -distributor.ha-tracker.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -distributor.ha-tracker.etcd.endpoints value + The etcd endpoints to connect to. + -distributor.ha-tracker.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -distributor.ha-tracker.etcd.password string + Etcd password. + -distributor.ha-tracker.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -distributor.ha-tracker.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -distributor.ha-tracker.etcd.tls-enabled + Enable TLS. + -distributor.ha-tracker.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -distributor.ha-tracker.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -distributor.ha-tracker.etcd.tls-server-name string + Override the expected name on the server certificate. + -distributor.ha-tracker.etcd.username string + Etcd username. + -distributor.ha-tracker.failover-timeout duration + If we don't receive any samples from the accepted replica for a cluster in this amount of time we will failover to the next replica we receive a sample from. This value must be greater than the update timeout (default 30s) + -distributor.ha-tracker.max-clusters int + Maximum number of clusters that HA tracker will keep track of for single user. 0 to disable the limit. + -distributor.ha-tracker.multi.mirror-enabled + Mirror writes to secondary store. + -distributor.ha-tracker.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -distributor.ha-tracker.multi.primary string + Primary backend storage used by multi-client. + -distributor.ha-tracker.multi.secondary string + Secondary backend storage used by multi-client. + -distributor.ha-tracker.prefix string + The prefix for the keys in the store. Should end with a /. (default "ha-tracker/") + -distributor.ha-tracker.replica string + Prometheus label to look for in samples to identify a Prometheus HA replica. (default "__replica__") + -distributor.ha-tracker.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -distributor.ha-tracker.update-timeout duration + Update the timestamp in the KV store for a given cluster/replica only after this amount of time has passed since the current stored timestamp. (default 15s) + -distributor.ha-tracker.update-timeout-jitter-max duration + Maximum jitter applied to the update timeout, in order to spread the HA heartbeats over time. (default 5s) + -distributor.health-check-ingesters + Run a health check on each ingester client during periodic cleanup. (default true) + -distributor.ingestion-burst-size int + Per-user allowed ingestion burst size (in number of samples). (default 200000) + -distributor.ingestion-rate-limit float + Per-user ingestion rate limit in samples per second. (default 10000) + -distributor.ingestion-tenant-shard-size int + The tenant's shard size used by shuffle-sharding. Must be set both on ingesters and distributors. 0 disables shuffle sharding. + -distributor.instance-limits.max-inflight-push-requests int + Max inflight push requests that this distributor can handle. This limit is per-distributor, not per-tenant. Additional requests will be rejected. 0 = unlimited. + -distributor.instance-limits.max-ingestion-rate float + Max ingestion rate (samples/sec) that this distributor will accept. This limit is per-distributor, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited. + -distributor.max-recv-msg-size int + remote_write API max receive message size (bytes). (default 104857600) + -distributor.remote-timeout duration + Timeout for downstream ingesters. (default 2s) + -distributor.replication-factor int + The number of ingesters to write to and read from. (default 3) + -distributor.ring.consul.acl-token string + ACL Token used to interact with Consul. + -distributor.ring.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -distributor.ring.consul.consistent-reads + Enable consistent reads to Consul. + -distributor.ring.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -distributor.ring.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -distributor.ring.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -distributor.ring.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -distributor.ring.etcd.endpoints value + The etcd endpoints to connect to. + -distributor.ring.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -distributor.ring.etcd.password string + Etcd password. + -distributor.ring.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -distributor.ring.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -distributor.ring.etcd.tls-enabled + Enable TLS. + -distributor.ring.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -distributor.ring.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -distributor.ring.etcd.tls-server-name string + Override the expected name on the server certificate. + -distributor.ring.etcd.username string + Etcd username. + -distributor.ring.heartbeat-period duration + Period at which to heartbeat to the ring. 0 = disabled. (default 5s) + -distributor.ring.heartbeat-timeout duration + The heartbeat timeout after which distributors are considered unhealthy within the ring. 0 = never (timeout disabled). (default 1m0s) + -distributor.ring.instance-addr string + IP address to advertise in the ring. + -distributor.ring.instance-id string + Instance ID to register in the ring. (default "{{.Hostname}}") + -distributor.ring.instance-interface-names value + Name of network interface to read address from. (default [eth0 en0]) + -distributor.ring.instance-port int + Port to advertise in the ring (defaults to server.grpc-listen-port). + -distributor.ring.multi.mirror-enabled + Mirror writes to secondary store. + -distributor.ring.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -distributor.ring.multi.primary string + Primary backend storage used by multi-client. + -distributor.ring.multi.secondary string + Secondary backend storage used by multi-client. + -distributor.ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "collectors/") + -distributor.ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -distributor.zone-awareness-enabled + True to enable the zone-awareness and replicate ingested samples across different availability zones. + -etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -etcd.endpoints value + The etcd endpoints to connect to. + -etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -etcd.password string + Etcd password. + -etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -etcd.tls-enabled + Enable TLS. + -etcd.tls-insecure-skip-verify + Skip validating server certificate. + -etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -etcd.tls-server-name string + Override the expected name on the server certificate. + -etcd.username string + Etcd username. + -experimental.alertmanager.enable-api + Enable the experimental alertmanager config api. + -experimental.ruler.enable-api + Enable the ruler api + -flusher.exit-after-flush + Stop after flush has finished. If false, process will keep running, doing nothing. (default true) + -frontend.align-querier-with-step + Mutate incoming queries to align their start and end with their step. + -frontend.cache-results + Cache query results. + -frontend.cache-unaligned-requests + Cache requests that are not step-aligned. + -frontend.downstream-url string + URL of downstream Prometheus. + -frontend.grpc-client-config.backoff-max-period duration + Maximum delay when backing off. (default 10s) + -frontend.grpc-client-config.backoff-min-period duration + Minimum delay when backing off. (default 100ms) + -frontend.grpc-client-config.backoff-on-ratelimits + Enable backoff and retry when we hit ratelimits. + -frontend.grpc-client-config.backoff-retries int + Number of times to backoff and retry before failing. (default 10) + -frontend.grpc-client-config.grpc-client-rate-limit float + Rate limit for gRPC client; 0 means disabled. + -frontend.grpc-client-config.grpc-client-rate-limit-burst int + Rate limit burst for gRPC client. + -frontend.grpc-client-config.grpc-compression string + Use compression when sending messages. Supported values are: 'gzip', 'snappy' and '' (disable compression) + -frontend.grpc-client-config.grpc-max-recv-msg-size int + gRPC client max receive message size (bytes). (default 104857600) + -frontend.grpc-client-config.grpc-max-send-msg-size int + gRPC client max send message size (bytes). (default 16777216) + -frontend.grpc-client-config.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -frontend.grpc-client-config.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -frontend.grpc-client-config.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -frontend.grpc-client-config.tls-insecure-skip-verify + Skip validating server certificate. + -frontend.grpc-client-config.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -frontend.grpc-client-config.tls-server-name string + Override the expected name on the server certificate. + -frontend.instance-addr string + IP address to advertise to querier (via scheduler) (resolved via interfaces by default). + -frontend.instance-interface-names value + Name of network interface to read address from. This address is sent to query-scheduler and querier, which uses it to send the query response back to query-frontend. (default [eth0 en0]) + -frontend.instance-port int + Port to advertise to querier (via scheduler) (defaults to server.grpc-listen-port). + -frontend.log-queries-longer-than duration + Log queries that are slower than the specified duration. Set to 0 to disable. Set to < 0 to enable on all queries. + -frontend.max-body-size int + Max body size for downstream prometheus. (default 10485760) + -frontend.max-cache-freshness value + Most recent allowed cacheable result per-tenant, to prevent caching very recent results that might still be in flux. (default 1m) + -frontend.max-queriers-per-tenant int + Maximum number of queriers that can handle requests for a single tenant. If set to 0 or value higher than number of available queriers, *all* queriers will handle requests for the tenant. Each frontend (or query-scheduler, if used) will select the same set of queriers for the same tenant (given that all queriers are connected to all frontends / query-schedulers). This option only works with queriers connecting to the query-frontend / query-scheduler, not when using downstream URL. + -frontend.max-retries-per-request int + Maximum number of retries for a single request; beyond this, the downstream error is returned. (default 5) + -frontend.parallelize-shardable-queries + True to enable query sharding. + -frontend.query-sharding-max-sharded-queries int + The max number of sharded queries that can be run for a given received query. 0 to disable limit. (default 128) + -frontend.query-sharding-total-shards int + The amount of shards to use when doing parallelisation via query sharding by tenant. 0 to disable query sharding for tenant. Query sharding implementation will adjust the number of query shards based on compactor shards. This allows querier to not search the blocks which cannot possibly have the series for given query shard. (default 16) + -frontend.query-stats-enabled + False to disable query statistics tracking. When enabled, a message with some statistics is logged for every query. (default true) + -frontend.results-cache.backend string + Backend for query-frontend results cache, if not empty. Supported values: [memcached]. + -frontend.results-cache.compression string + Enable cache compression, if not empty. Supported values are: snappy. + -frontend.results-cache.memcached.addresses string + Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). + -frontend.results-cache.memcached.max-async-buffer-size int + The maximum number of enqueued asynchronous operations allowed. (default 10000) + -frontend.results-cache.memcached.max-async-concurrency int + The maximum number of concurrent asynchronous operations can occur. (default 50) + -frontend.results-cache.memcached.max-get-multi-batch-size int + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + -frontend.results-cache.memcached.max-get-multi-concurrency int + The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) + -frontend.results-cache.memcached.max-idle-connections int + The maximum number of idle connections that will be maintained per address. (default 16) + -frontend.results-cache.memcached.max-item-size int + The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) + -frontend.results-cache.memcached.timeout duration + The socket read/write timeout. (default 100ms) + -frontend.scheduler-address string + DNS hostname used for finding query-schedulers. + -frontend.scheduler-dns-lookup-period duration + How often to resolve the scheduler-address, in order to look for new query-scheduler instances. (default 10s) + -frontend.scheduler-worker-concurrency int + Number of concurrent workers forwarding queries to single query-scheduler. (default 5) + -frontend.split-queries-by-interval duration + Split queries by an interval and execute in parallel, 0 disables it. You should use an a multiple of 24 hours (same as the storage bucketing scheme), to avoid queriers downloading and processing the same chunks. This also determines how cache keys are chosen when result caching is enabled. + -h + Print basic help. + -help + Print basic help. + -help-all + Print help including also advanced and experimental flags. + -http.alertmanager-http-prefix string + HTTP URL path under which the Alertmanager ui and api will be served. (default "/alertmanager") + -http.prefix string + HTTP path prefix for API. (default "/api/prom") + -http.prometheus-http-prefix string + HTTP URL path under which the Prometheus api will be served. (default "/prometheus") + -ingester-client.expected-labels int + Expected number of labels per timeseries, used for preallocations. (default 20) + -ingester-client.expected-samples-per-series int + Expected number of samples per timeseries, used for preallocations. (default 10) + -ingester-client.expected-timeseries int + Expected number of timeseries per request, used for preallocations. (default 100) + -ingester.active-series-custom-trackers value + Additional active series metrics, matching the provided matchers. Matchers should be in form :, like 'foobar:{foo="bar"}'. Multiple matchers can be provided either providing the flag multiple times or providing multiple semicolon-separated values to a single flag. + -ingester.active-series-metrics-enabled + Enable tracking of active series and export them as metrics. (default true) + -ingester.active-series-metrics-idle-timeout duration + After what time a series is considered to be inactive. (default 10m0s) + -ingester.active-series-metrics-update-period duration + How often to update active series metrics. (default 1m0s) + -ingester.availability-zone string + The availability zone where this instance is running. + -ingester.client.backoff-max-period duration + Maximum delay when backing off. (default 10s) + -ingester.client.backoff-min-period duration + Minimum delay when backing off. (default 100ms) + -ingester.client.backoff-on-ratelimits + Enable backoff and retry when we hit ratelimits. + -ingester.client.backoff-retries int + Number of times to backoff and retry before failing. (default 10) + -ingester.client.grpc-client-rate-limit float + Rate limit for gRPC client; 0 means disabled. + -ingester.client.grpc-client-rate-limit-burst int + Rate limit burst for gRPC client. + -ingester.client.grpc-compression string + Use compression when sending messages. Supported values are: 'gzip', 'snappy' and '' (disable compression) + -ingester.client.grpc-max-recv-msg-size int + gRPC client max receive message size (bytes). (default 104857600) + -ingester.client.grpc-max-send-msg-size int + gRPC client max send message size (bytes). (default 16777216) + -ingester.client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -ingester.client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -ingester.client.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -ingester.client.tls-insecure-skip-verify + Skip validating server certificate. + -ingester.client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -ingester.client.tls-server-name string + Override the expected name on the server certificate. + -ingester.exemplars-update-period duration + Period with which to update per-user max exemplars. (default 15s) + -ingester.final-sleep duration + Duration to sleep for before exiting, to ensure metrics are scraped. (default 30s) + -ingester.heartbeat-period duration + Period at which to heartbeat to consul. 0 = disabled. (default 5s) + -ingester.ignore-series-limit-for-metric-names string + Comma-separated list of metric names, for which the -ingester.max-global-series-per-metric limit will be ignored. Does not affect the -ingester.max-global-series-per-user limit. + -ingester.instance-limits.max-inflight-push-requests int + Max inflight push requests that this ingester can handle (across all tenants). Additional requests will be rejected. 0 = unlimited. (default 30000) + -ingester.instance-limits.max-ingestion-rate float + Max ingestion rate (samples/sec) that ingester will accept. This limit is per-ingester, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. This limit only works when using blocks engine. 0 = unlimited. + -ingester.instance-limits.max-series int + Max series that this ingester can hold (across all tenants). Requests to create additional series will be rejected. This limit only works when using blocks engine. 0 = unlimited. + -ingester.instance-limits.max-tenants int + Max users that this ingester can hold. Requests from additional users will be rejected. This limit only works when using blocks engine. 0 = unlimited. + -ingester.join-after duration + Period to wait for a claim from another member; will join automatically after this. + -ingester.lifecycler.ID string + ID to register in the ring. (default "{{.Hostname}}") + -ingester.lifecycler.addr string + IP address to advertise in the ring. + -ingester.lifecycler.interface value + Name of network interface to read address from. (default [eth0 en0]) + -ingester.lifecycler.port int + port to advertise in consul (defaults to server.grpc-listen-port). + -ingester.max-global-exemplars-per-user int + The maximum number of exemplars in memory, across the cluster. 0 to disable exemplars ingestion. + -ingester.max-global-metadata-per-metric int + The maximum number of metadata per metric, across the cluster. 0 to disable. + -ingester.max-global-metadata-per-user int + The maximum number of active metrics with metadata per user, across the cluster. 0 to disable. + -ingester.max-global-series-per-metric int + The maximum number of active series per metric name, across the cluster before replication. 0 to disable. (default 20000) + -ingester.max-global-series-per-user int + The maximum number of active series per user, across the cluster before replication. 0 to disable. (default 150000) + -ingester.max-samples-per-query value + This option is no longer used, and will be removed. + -ingester.metadata-retain-period duration + Period at which metadata we have not seen will remain in memory before being deleted. (default 10m0s) + -ingester.min-ready-duration duration + Minimum duration to wait after the internal readiness checks have passed but before succeeding the readiness endpoint. This is used to slowdown deployment controllers (eg. Kubernetes) after an instance is ready and before they proceed with a rolling update, to give the rest of the cluster instances enough time to receive ring updates. (default 15s) + -ingester.num-tokens int + Number of tokens for each ingester. (default 128) + -ingester.observe-period duration + Observe tokens after generating to resolve collisions. Useful when using gossiping ring. + -ingester.rate-update-period duration + Period with which to update the per-user ingestion rates. (default 15s) + -ingester.readiness-check-ring-health + When enabled the readiness probe succeeds only after all instances are ACTIVE and healthy in the ring, otherwise only the instance itself is checked. This option should be disabled if in your cluster multiple instances can be rolled out simultaneously, otherwise rolling updates may be slowed down. (default true) + -ingester.stream-chunks-when-using-blocks + Stream chunks from ingesters to queriers. (default true) + -ingester.tokens-file-path string + File path where tokens are stored. If empty, tokens are not stored at shutdown and restored at startup. + -ingester.unregister-on-shutdown + Unregister from the ring upon clean shutdown. It can be useful to disable for rolling restarts with consistent naming in conjunction with -distributor.extend-writes=false. (default true) + -log.format value + Output log messages in the given format. Valid formats: [logfmt, json] (default logfmt) + -log.level value + Only log messages with the given severity or above. Valid levels: [debug, info, warn, error] (default info) + -mem-ballast-size-bytes int + Size of memory ballast to allocate. + -memberlist.abort-if-join-fails + If this node fails to join memberlist cluster, abort. (default true) + -memberlist.advertise-addr string + Gossip address to advertise to other members in the cluster. Used for NAT traversal. + -memberlist.advertise-port int + Gossip port to advertise to other members in the cluster. Used for NAT traversal. (default 7946) + -memberlist.bind-addr value + IP address to listen on for gossip messages. Multiple addresses may be specified. Defaults to 0.0.0.0 + -memberlist.bind-port int + Port to listen on for gossip messages. (default 7946) + -memberlist.compression-enabled + Enable message compression. This can be used to reduce bandwidth usage at the cost of slightly more CPU utilization. (default true) + -memberlist.dead-node-reclaim-time duration + How soon can dead node's name be reclaimed with new address. 0 to disable. + -memberlist.gossip-interval duration + How often to gossip. (default 200ms) + -memberlist.gossip-nodes int + How many nodes to gossip to. (default 3) + -memberlist.gossip-to-dead-nodes-time duration + How long to keep gossiping to dead nodes, to give them chance to refute their death. (default 30s) + -memberlist.join value + Other cluster members to join. Can be specified multiple times. It can be an IP, hostname or an entry specified in the DNS Service Discovery format. + -memberlist.leave-timeout duration + Timeout for leaving memberlist cluster. (default 5s) + -memberlist.left-ingesters-timeout duration + How long to keep LEFT ingesters in the ring. (default 5m0s) + -memberlist.max-join-backoff duration + Max backoff duration to join other cluster members. (default 1m0s) + -memberlist.max-join-retries int + Max number of retries to join other cluster members. (default 10) + -memberlist.message-history-buffer-bytes int + How much space to use for keeping received and sent messages in memory for troubleshooting (two buffers). 0 to disable. + -memberlist.min-join-backoff duration + Min backoff duration to join other cluster members. (default 1s) + -memberlist.nodename string + Name of the node in memberlist cluster. Defaults to hostname. + -memberlist.packet-dial-timeout duration + Timeout used when connecting to other nodes to send packet. (default 5s) + -memberlist.packet-write-timeout duration + Timeout for writing 'packet' data. (default 5s) + -memberlist.pullpush-interval duration + How often to use pull/push sync. (default 30s) + -memberlist.randomize-node-name + Add random suffix to the node name. (default true) + -memberlist.rejoin-interval duration + If not 0, how often to rejoin the cluster. Occasional rejoin can help to fix the cluster split issue, and is harmless otherwise. For example when using only few components as a seed nodes (via -memberlist.join), then it's recommended to use rejoin. If -memberlist.join points to dynamic service that resolves to all gossiping nodes (eg. Kubernetes headless service), then rejoin is not needed. + -memberlist.retransmit-factor int + Multiplication factor used when sending out messages (factor * log(N+1)). (default 4) + -memberlist.stream-timeout duration + The timeout for establishing a connection with a remote node, and for read/write operations. (default 10s) + -memberlist.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -memberlist.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -memberlist.tls-enabled + Enable TLS on the memberlist transport layer. + -memberlist.tls-insecure-skip-verify + Skip validating server certificate. + -memberlist.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -memberlist.tls-server-name string + Override the expected name on the server certificate. + -memberlist.transport-debug + Log debug transport messages. Note: global log.level must be at debug level as well. + -modules + List available values that can be used as target. + -multi.mirror-enabled + Mirror writes to secondary store. + -multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -multi.primary string + Primary backend storage used by multi-client. + -multi.secondary string + Secondary backend storage used by multi-client. + -print.config + Print the config and exit. + -querier.batch-iterators + Use batch iterators to execute query, as opposed to fully materialising the series in memory. Takes precedent over the -querier.iterators flag. (default true) + -querier.cardinality-analysis-enabled + Enables endpoints used for cardinality analysis. + -querier.default-evaluation-interval duration + The default evaluation interval or step size for subqueries. This config option should be set on query-frontend too when query sharding is enabled. (default 1m0s) + -querier.dns-lookup-period duration + How often to query DNS for query-frontend or query-scheduler address. (default 10s) + -querier.frontend-address string + Address of query frontend service, in host:port format. If -querier.scheduler-address is set as well, querier will use scheduler instead. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint. + -querier.frontend-client.backoff-max-period duration + Maximum delay when backing off. (default 10s) + -querier.frontend-client.backoff-min-period duration + Minimum delay when backing off. (default 100ms) + -querier.frontend-client.backoff-on-ratelimits + Enable backoff and retry when we hit ratelimits. + -querier.frontend-client.backoff-retries int + Number of times to backoff and retry before failing. (default 10) + -querier.frontend-client.grpc-client-rate-limit float + Rate limit for gRPC client; 0 means disabled. + -querier.frontend-client.grpc-client-rate-limit-burst int + Rate limit burst for gRPC client. + -querier.frontend-client.grpc-compression string + Use compression when sending messages. Supported values are: 'gzip', 'snappy' and '' (disable compression) + -querier.frontend-client.grpc-max-recv-msg-size int + gRPC client max receive message size (bytes). (default 104857600) + -querier.frontend-client.grpc-max-send-msg-size int + gRPC client max send message size (bytes). (default 16777216) + -querier.frontend-client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -querier.frontend-client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -querier.frontend-client.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -querier.frontend-client.tls-insecure-skip-verify + Skip validating server certificate. + -querier.frontend-client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -querier.frontend-client.tls-server-name string + Override the expected name on the server certificate. + -querier.id string + Querier ID, sent to frontend service to identify requests from the same querier. Defaults to hostname. + -querier.iterators + Use iterators to execute query, as opposed to fully materialising the series in memory. + -querier.label-names-and-values-results-max-size-bytes int + Maximum size in bytes of distinct label names and values. When querier receives response from ingester, it merges the response with responses from other ingesters. This maximum size limit is applied to the merged(distinct) results. If the limit is reached, an error is returned. (default 419430400) + -querier.label-values-max-cardinality-label-names-per-request int + Maximum number of label names allowed to be queried in a single /api/v1/cardinality/label_values API call. (default 100) + -querier.lookback-delta duration + Time since the last sample after which a time series is considered stale and ignored by expression evaluations. This config option should be set on query-frontend too when query sharding is enabled. (default 5m0s) + -querier.max-concurrent int + The maximum number of concurrent queries. This config option should be set on query-frontend too when query sharding is enabled. (default 20) + -querier.max-fetched-chunk-bytes-per-query int + The maximum size of all chunks in bytes that a query can fetch from each ingester and storage. This limit is enforced in the querier and ruler. 0 to disable. + -querier.max-fetched-chunks-per-query int + Maximum number of chunks that can be fetched in a single query from ingesters and long-term storage. This limit is enforced in the querier, ruler and store-gateway. 0 to disable. (default 2000000) + -querier.max-fetched-series-per-query int + The maximum number of unique series for which a query can fetch samples from each ingesters and storage. This limit is enforced in the querier and ruler. 0 to disable + -querier.max-outstanding-requests-per-tenant int + Maximum number of outstanding requests per tenant per frontend; requests beyond this error with HTTP 429. (default 100) + -querier.max-query-into-future duration + Maximum duration into the future you can query. 0 to disable. (default 10m0s) + -querier.max-query-lookback value + Limit how long back data (series and metadata) can be queried, up until duration ago. This limit is enforced in the query-frontend, querier and ruler. If the requested time range is outside the allowed range, the request will not fail but will be manipulated to only query data within the allowed time range. 0 to disable. + -querier.max-query-parallelism int + Maximum number of split queries will be scheduled in parallel by the frontend. (default 14) + -querier.max-samples int + Maximum number of samples a single query can load into memory. This config option should be set on query-frontend too when query sharding is enabled. (default 50000000) + -querier.query-ingesters-within duration + Maximum lookback beyond which queries are not sent to ingester. 0 means all queries are sent to ingester. + -querier.query-label-names-with-matchers-enabled + True to enable queriers to use an optimized implementation which passes down to ingesters the label matchers when running the label names API. Can be enabled once all ingesters run a version >= the one where this option has been introduced. + -querier.query-store-after duration + The time after which a metric should be queried from storage and not just ingesters. 0 means all queries are sent to store. If this option is enabled, the time range of the query sent to the store-gateway will be manipulated to ensure the query end is not more recent than 'now - query-store-after'. + -querier.query-store-for-labels-enabled value + This option is no longer used, and will be removed. + -querier.scheduler-address string + Hostname (and port) of scheduler that querier will periodically resolve, connect to and receive queries from. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint. + -querier.shuffle-sharding-ingesters-lookback-period duration + When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured 'query store after' and 'query ingesters within'. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled). + -querier.store-gateway-addresses string + Comma separated list of store-gateway addresses in DNS Service Discovery format. This option should be set when the store-gateway sharding is disabled (when enabled, the store-gateway instances form a ring and addresses are picked from the ring). + -querier.store-gateway-client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -querier.store-gateway-client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -querier.store-gateway-client.tls-enabled + Enable TLS for gRPC client connecting to store-gateway. + -querier.store-gateway-client.tls-insecure-skip-verify + Skip validating server certificate. + -querier.store-gateway-client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -querier.store-gateway-client.tls-server-name string + Override the expected name on the server certificate. + -querier.timeout duration + The timeout for a query. This config option should be set on query-frontend too when query sharding is enabled. (default 2m0s) + -querier.worker-match-max-concurrent + Force worker concurrency to match the -querier.max-concurrent option. Overrides querier.worker-parallelism. + -querier.worker-parallelism int + Number of simultaneous queries to process per query-frontend or query-scheduler. (default 10) + -query-frontend.querier-forget-delay duration + If a querier disconnects without sending notification about graceful shutdown, the query-frontend will keep the querier in the tenant's shard until the forget delay has passed. This feature is useful to reduce the blast radius when shuffle-sharding is enabled. + -query-scheduler.grpc-client-config.backoff-max-period duration + Maximum delay when backing off. (default 10s) + -query-scheduler.grpc-client-config.backoff-min-period duration + Minimum delay when backing off. (default 100ms) + -query-scheduler.grpc-client-config.backoff-on-ratelimits + Enable backoff and retry when we hit ratelimits. + -query-scheduler.grpc-client-config.backoff-retries int + Number of times to backoff and retry before failing. (default 10) + -query-scheduler.grpc-client-config.grpc-client-rate-limit float + Rate limit for gRPC client; 0 means disabled. + -query-scheduler.grpc-client-config.grpc-client-rate-limit-burst int + Rate limit burst for gRPC client. + -query-scheduler.grpc-client-config.grpc-compression string + Use compression when sending messages. Supported values are: 'gzip', 'snappy' and '' (disable compression) + -query-scheduler.grpc-client-config.grpc-max-recv-msg-size int + gRPC client max receive message size (bytes). (default 104857600) + -query-scheduler.grpc-client-config.grpc-max-send-msg-size int + gRPC client max send message size (bytes). (default 16777216) + -query-scheduler.grpc-client-config.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -query-scheduler.grpc-client-config.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -query-scheduler.grpc-client-config.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -query-scheduler.grpc-client-config.tls-insecure-skip-verify + Skip validating server certificate. + -query-scheduler.grpc-client-config.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -query-scheduler.grpc-client-config.tls-server-name string + Override the expected name on the server certificate. + -query-scheduler.max-outstanding-requests-per-tenant int + Maximum number of outstanding requests per tenant per query-scheduler. In-flight requests above this limit will fail with HTTP response status code 429. (default 100) + -query-scheduler.querier-forget-delay duration + If a querier disconnects without sending notification about graceful shutdown, the query-scheduler will keep the querier in the tenant's shard until the forget delay has passed. This feature is useful to reduce the blast radius when shuffle-sharding is enabled. + -ring.heartbeat-timeout duration + The heartbeat timeout after which ingesters are skipped for reads/writes. 0 = never (timeout disabled). (default 1m0s) + -ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "collectors/") + -ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -ruler-storage.azure.account-key value + Azure storage account key + -ruler-storage.azure.account-name string + Azure storage account name + -ruler-storage.azure.container-name string + Azure storage container name + -ruler-storage.azure.endpoint-suffix string + Azure storage endpoint suffix without schema. The account name will be prefixed to this value to create the FQDN. If set to empty string, default endpoint suffix is used. + -ruler-storage.azure.max-retries int + Number of retries for recoverable errors (default 20) + -ruler-storage.azure.msi-resource string + If set, this URL is used instead of https://. for obtaining ServicePrincipalToken from MSI. + -ruler-storage.azure.user-assigned-id string + User assigned identity. If empty, then System assigned identity is used. + -ruler-storage.backend string + Backend storage to use. Supported backends are: s3, gcs, azure, swift, filesystem, local. (default "filesystem") + -ruler-storage.filesystem.dir string + Local filesystem storage directory. (default "ruler") + -ruler-storage.gcs.bucket-name string + GCS bucket name + -ruler-storage.gcs.service-account value + JSON representing either a Google Developers Console client_credentials.json file or a Google Developers service account key file. If empty, fallback to Google default logic. + -ruler-storage.local.directory string + Directory to scan for rules + -ruler-storage.s3.access-key-id string + S3 access key ID + -ruler-storage.s3.bucket-name string + S3 bucket name + -ruler-storage.s3.endpoint string + The S3 bucket endpoint. It could be an AWS S3 endpoint listed at https://docs.aws.amazon.com/general/latest/gr/s3.html or the address of an S3-compatible service in hostname:port format. + -ruler-storage.s3.expect-continue-timeout duration + The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) + -ruler-storage.s3.http.idle-conn-timeout duration + The time an idle connection will remain idle before closing. (default 1m30s) + -ruler-storage.s3.http.insecure-skip-verify + If the client connects to S3 via HTTPS and this option is enabled, the client will accept any certificate and hostname. + -ruler-storage.s3.http.response-header-timeout duration + The amount of time the client will wait for a servers response headers. (default 2m0s) + -ruler-storage.s3.insecure + If enabled, use http:// for the S3 endpoint instead of https://. This could be useful in local dev/test environments while using an S3-compatible backend storage, like Minio. + -ruler-storage.s3.max-connections-per-host int + Maximum number of connections per host. 0 means no limit. + -ruler-storage.s3.max-idle-connections int + Maximum number of idle (keep-alive) connections across all hosts. 0 means no limit. (default 100) + -ruler-storage.s3.max-idle-connections-per-host int + Maximum number of idle (keep-alive) connections to keep per-host. If 0, a built-in default value is used. (default 100) + -ruler-storage.s3.region string + S3 region. If unset, the client will issue a S3 GetBucketLocation API call to autodetect it. + -ruler-storage.s3.secret-access-key value + S3 secret access key + -ruler-storage.s3.signature-version string + The signature version to use for authenticating against S3. Supported values are: v4, v2. (default "v4") + -ruler-storage.s3.sse.kms-encryption-context string + KMS Encryption Context used for object encryption. It expects JSON formatted string. + -ruler-storage.s3.sse.kms-key-id string + KMS Key ID used to encrypt objects in S3 + -ruler-storage.s3.sse.type string + Enable AWS Server Side Encryption. Supported values: SSE-KMS, SSE-S3. + -ruler-storage.s3.tls-handshake-timeout duration + Maximum time to wait for a TLS handshake. 0 means no limit. (default 10s) + -ruler-storage.swift.auth-url string + OpenStack Swift authentication URL + -ruler-storage.swift.auth-version int + OpenStack Swift authentication API version. 0 to autodetect. + -ruler-storage.swift.connect-timeout duration + Time after which a connection attempt is aborted. (default 10s) + -ruler-storage.swift.container-name string + Name of the OpenStack Swift container to put chunks in. + -ruler-storage.swift.domain-id string + OpenStack Swift user's domain ID. + -ruler-storage.swift.domain-name string + OpenStack Swift user's domain name. + -ruler-storage.swift.max-retries int + Max retries on requests error. (default 3) + -ruler-storage.swift.password string + OpenStack Swift API key. + -ruler-storage.swift.project-domain-id string + ID of the OpenStack Swift project's domain (v3 auth only), only needed if it differs the from user domain. + -ruler-storage.swift.project-domain-name string + Name of the OpenStack Swift project's domain (v3 auth only), only needed if it differs from the user domain. + -ruler-storage.swift.project-id string + OpenStack Swift project ID (v2,v3 auth only). + -ruler-storage.swift.project-name string + OpenStack Swift project name (v2,v3 auth only). + -ruler-storage.swift.region-name string + OpenStack Swift Region to use (v2,v3 auth only). + -ruler-storage.swift.request-timeout duration + Time after which an idle request is aborted. The timeout watchdog is reset each time some data is received, so the timeout triggers after X time no data is received on a request. (default 5s) + -ruler-storage.swift.user-domain-id string + OpenStack Swift user's domain ID. + -ruler-storage.swift.user-domain-name string + OpenStack Swift user's domain name. + -ruler-storage.swift.user-id string + OpenStack Swift user ID. + -ruler-storage.swift.username string + OpenStack Swift username. + -ruler.alertmanager-client.basic-auth-password string + HTTP Basic authentication password. It overrides the password set in the URL (if any). + -ruler.alertmanager-client.basic-auth-username string + HTTP Basic authentication username. It overrides the username set in the URL (if any). + -ruler.alertmanager-client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -ruler.alertmanager-client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -ruler.alertmanager-client.tls-insecure-skip-verify + Skip validating server certificate. + -ruler.alertmanager-client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -ruler.alertmanager-client.tls-server-name string + Override the expected name on the server certificate. + -ruler.alertmanager-discovery + Use DNS SRV records to discover Alertmanager hosts. + -ruler.alertmanager-refresh-interval duration + How long to wait between refreshing DNS resolutions of Alertmanager hosts. (default 1m0s) + -ruler.alertmanager-url string + Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each Alertmanager URL is treated as a separate group in the configuration. Multiple Alertmanagers in HA per group can be supported by using DNS resolution via -ruler.alertmanager-discovery. + -ruler.alertmanager-use-v2 + If enabled requests to Alertmanager will utilize the V2 API. + -ruler.client.backoff-max-period duration + Maximum delay when backing off. (default 10s) + -ruler.client.backoff-min-period duration + Minimum delay when backing off. (default 100ms) + -ruler.client.backoff-on-ratelimits + Enable backoff and retry when we hit ratelimits. + -ruler.client.backoff-retries int + Number of times to backoff and retry before failing. (default 10) + -ruler.client.grpc-client-rate-limit float + Rate limit for gRPC client; 0 means disabled. + -ruler.client.grpc-client-rate-limit-burst int + Rate limit burst for gRPC client. + -ruler.client.grpc-compression string + Use compression when sending messages. Supported values are: 'gzip', 'snappy' and '' (disable compression) + -ruler.client.grpc-max-recv-msg-size int + gRPC client max receive message size (bytes). (default 104857600) + -ruler.client.grpc-max-send-msg-size int + gRPC client max send message size (bytes). (default 16777216) + -ruler.client.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -ruler.client.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -ruler.client.tls-enabled + Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. + -ruler.client.tls-insecure-skip-verify + Skip validating server certificate. + -ruler.client.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -ruler.client.tls-server-name string + Override the expected name on the server certificate. + -ruler.disabled-tenants value + Comma separated list of tenants whose rules this ruler cannot evaluate. If specified, a ruler that would normally pick the specified tenant(s) for processing will ignore them instead. Subject to sharding. + -ruler.enable-sharding + Distribute rule evaluation using ring backend + -ruler.enabled-tenants value + Comma separated list of tenants whose rules this ruler can evaluate. If specified, only these tenants will be handled by ruler, otherwise this ruler can process rules from all tenants. Subject to sharding. + -ruler.evaluation-delay-duration value + Duration to delay the evaluation of rules to ensure the underlying metrics have been pushed. + -ruler.evaluation-interval duration + How frequently to evaluate rules (default 1m0s) + -ruler.external.url value + URL of alerts return path. + -ruler.flush-period duration + Period with which to attempt to flush rule groups. (default 1m0s) + -ruler.for-grace-period duration + Minimum duration between alert and restored "for" state. This is maintained only for alerts with configured "for" time greater than grace period. (default 10m0s) + -ruler.for-outage-tolerance duration + Max time to tolerate outage for restoring "for" state of alert. (default 1h0m0s) + -ruler.max-rule-groups-per-tenant int + Maximum number of rule groups per-tenant. 0 to disable. (default 70) + -ruler.max-rules-per-rule-group int + Maximum number of rules per rule group per-tenant. 0 to disable. (default 20) + -ruler.notification-queue-capacity int + Capacity of the queue for notifications to be sent to the Alertmanager. (default 10000) + -ruler.notification-timeout duration + HTTP timeout duration when sending notifications to the Alertmanager. (default 10s) + -ruler.poll-interval duration + How frequently to poll for rule changes (default 1m0s) + -ruler.query-stats-enabled + Report the wall time for ruler queries to complete as a per user metric and as an info level log message. + -ruler.resend-delay duration + Minimum amount of time to wait before resending an alert to Alertmanager. (default 1m0s) + -ruler.ring.consul.acl-token string + ACL Token used to interact with Consul. + -ruler.ring.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -ruler.ring.consul.consistent-reads + Enable consistent reads to Consul. + -ruler.ring.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -ruler.ring.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -ruler.ring.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -ruler.ring.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -ruler.ring.etcd.endpoints value + The etcd endpoints to connect to. + -ruler.ring.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -ruler.ring.etcd.password string + Etcd password. + -ruler.ring.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -ruler.ring.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -ruler.ring.etcd.tls-enabled + Enable TLS. + -ruler.ring.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -ruler.ring.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -ruler.ring.etcd.tls-server-name string + Override the expected name on the server certificate. + -ruler.ring.etcd.username string + Etcd username. + -ruler.ring.heartbeat-period duration + Period at which to heartbeat to the ring. 0 = disabled. (default 5s) + -ruler.ring.heartbeat-timeout duration + The heartbeat timeout after which rulers are considered unhealthy within the ring. 0 = never (timeout disabled). (default 1m0s) + -ruler.ring.instance-addr string + IP address to advertise in the ring. + -ruler.ring.instance-id string + Instance ID to register in the ring. (default "{{.Hostname}}") + -ruler.ring.instance-interface-names value + Name of network interface to read address from. (default [eth0 en0]) + -ruler.ring.instance-port int + Port to advertise in the ring (defaults to server.grpc-listen-port). + -ruler.ring.multi.mirror-enabled + Mirror writes to secondary store. + -ruler.ring.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -ruler.ring.multi.primary string + Primary backend storage used by multi-client. + -ruler.ring.multi.secondary string + Secondary backend storage used by multi-client. + -ruler.ring.num-tokens int + Number of tokens for each ruler. (default 128) + -ruler.ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "rulers/") + -ruler.ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -ruler.rule-path string + file path to store temporary rule files for the prometheus rule managers (default "/rules") + -ruler.search-pending-for duration + Time to spend searching for a pending ruler when shutting down. (default 5m0s) + -ruler.tenant-federation.enabled source_tenants + Enable running rule groups against multiple tenants. The tenant IDs involved need to be in the rule group's source_tenants field. If this flag is set to `false` when there are already created federated rule groups, then these rules groups will be skipped during evaluations. + -ruler.tenant-shard-size int + The tenant's shard size when sharding is used by ruler. Value of 0 disables shuffle sharding for the tenant, and tenant rules will be sharded across all ruler replicas. + -runtime-config.file string + File with the configuration that can be updated in runtime. + -runtime-config.reload-period duration + How often to check runtime config file. (default 10s) + -server.graceful-shutdown-timeout duration + Timeout for graceful shutdowns (default 30s) + -server.grpc-conn-limit int + Maximum number of simultaneous grpc connections, <=0 to disable + -server.grpc-listen-address string + gRPC server listen address. + -server.grpc-listen-network string + gRPC server listen network (default "tcp") + -server.grpc-listen-port int + gRPC server listen port. (default 9095) + -server.grpc-max-concurrent-streams uint + Limit on the number of concurrent streams for gRPC calls (0 = unlimited) (default 100) + -server.grpc-max-recv-msg-size-bytes int + Limit on the size of a gRPC message this server can receive (bytes). (default 4194304) + -server.grpc-max-send-msg-size-bytes int + Limit on the size of a gRPC message this server can send (bytes). (default 4194304) + -server.grpc-tls-ca-path string + GRPC TLS Client CA path. + -server.grpc-tls-cert-path string + GRPC TLS server cert path. + -server.grpc-tls-client-auth string + GRPC TLS Client Auth type. + -server.grpc-tls-key-path string + GRPC TLS server key path. + -server.grpc.keepalive.max-connection-age duration + The duration for the maximum amount of time a connection may exist before it will be closed. Default: infinity (default 2562047h47m16.854775807s) + -server.grpc.keepalive.max-connection-age-grace duration + An additive period after max-connection-age after which the connection will be forcibly closed. Default: infinity (default 2562047h47m16.854775807s) + -server.grpc.keepalive.max-connection-idle duration + The duration after which an idle connection should be closed. Default: infinity (default 2562047h47m16.854775807s) + -server.grpc.keepalive.min-time-between-pings duration + Minimum amount of time a client should wait before sending a keepalive ping. If client sends keepalive ping more often, server will send GOAWAY and close the connection. (default 10s) + -server.grpc.keepalive.ping-without-stream-allowed + If true, server allows keepalive pings even when there are no active streams(RPCs). If false, and client sends ping when there are no active streams, server will send GOAWAY and close the connection. (default true) + -server.grpc.keepalive.time duration + Duration after which a keepalive probe is sent in case of no activity over the connection., Default: 2h (default 2h0m0s) + -server.grpc.keepalive.timeout duration + After having pinged for keepalive check, the duration after which an idle connection should be closed, Default: 20s (default 20s) + -server.http-conn-limit int + Maximum number of simultaneous http connections, <=0 to disable + -server.http-idle-timeout duration + Idle timeout for HTTP server (default 2m0s) + -server.http-listen-address string + HTTP server listen address. + -server.http-listen-network string + HTTP server listen network, default tcp (default "tcp") + -server.http-listen-port int + HTTP server listen port. (default 8080) + -server.http-read-timeout duration + Read timeout for HTTP server (default 30s) + -server.http-tls-ca-path string + HTTP TLS Client CA path. + -server.http-tls-cert-path string + HTTP server cert path. + -server.http-tls-client-auth string + HTTP TLS Client Auth type. + -server.http-tls-key-path string + HTTP server key path. + -server.http-write-timeout duration + Write timeout for HTTP server (default 30s) + -server.log-source-ips-enabled + Optionally log the source IPs. + -server.log-source-ips-header string + Header field storing the source IPs. Only used if server.log-source-ips-enabled is true. If not set the default Forwarded, X-Real-IP and X-Forwarded-For headers are used + -server.log-source-ips-regex string + Regex for matching the source IPs. Only used if server.log-source-ips-enabled is true. If not set the default Forwarded, X-Real-IP and X-Forwarded-For headers are used + -server.path-prefix string + Base path to serve all API routes from (e.g. /v1/) + -server.register-instrumentation + Register the intrumentation handlers (/metrics etc). (default true) + -store-gateway.sharding-enabled + Shard blocks across multiple store gateway instances. This option needs be set both on the store-gateway and querier when running in microservices mode. + -store-gateway.sharding-ring.consul.acl-token string + ACL Token used to interact with Consul. + -store-gateway.sharding-ring.consul.client-timeout duration + HTTP timeout when talking to Consul (default 20s) + -store-gateway.sharding-ring.consul.consistent-reads + Enable consistent reads to Consul. + -store-gateway.sharding-ring.consul.hostname string + Hostname and port of Consul. (default "localhost:8500") + -store-gateway.sharding-ring.consul.watch-burst-size int + Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) + -store-gateway.sharding-ring.consul.watch-rate-limit float + Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) + -store-gateway.sharding-ring.etcd.dial-timeout duration + The dial timeout for the etcd connection. (default 10s) + -store-gateway.sharding-ring.etcd.endpoints value + The etcd endpoints to connect to. + -store-gateway.sharding-ring.etcd.max-retries int + The maximum number of retries to do for failed ops. (default 10) + -store-gateway.sharding-ring.etcd.password string + Etcd password. + -store-gateway.sharding-ring.etcd.tls-ca-path string + Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. + -store-gateway.sharding-ring.etcd.tls-cert-path string + Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. + -store-gateway.sharding-ring.etcd.tls-enabled + Enable TLS. + -store-gateway.sharding-ring.etcd.tls-insecure-skip-verify + Skip validating server certificate. + -store-gateway.sharding-ring.etcd.tls-key-path string + Path to the key file for the client certificate. Also requires the client certificate to be configured. + -store-gateway.sharding-ring.etcd.tls-server-name string + Override the expected name on the server certificate. + -store-gateway.sharding-ring.etcd.username string + Etcd username. + -store-gateway.sharding-ring.heartbeat-period duration + Period at which to heartbeat to the ring. 0 = disabled. (default 15s) + -store-gateway.sharding-ring.heartbeat-timeout duration + The heartbeat timeout after which store gateways are considered unhealthy within the ring. 0 = never (timeout disabled). This option needs be set both on the store-gateway and querier when running in microservices mode. (default 1m0s) + -store-gateway.sharding-ring.instance-addr string + IP address to advertise in the ring. + -store-gateway.sharding-ring.instance-availability-zone string + The availability zone where this instance is running. Required if zone-awareness is enabled. + -store-gateway.sharding-ring.instance-id string + Instance ID to register in the ring. (default "{{.Hostname}}") + -store-gateway.sharding-ring.instance-interface-names value + Name of network interface to read address from. (default [eth0 en0]) + -store-gateway.sharding-ring.instance-port int + Port to advertise in the ring (defaults to server.grpc-listen-port). + -store-gateway.sharding-ring.multi.mirror-enabled + Mirror writes to secondary store. + -store-gateway.sharding-ring.multi.mirror-timeout duration + Timeout for storing value to secondary store. (default 2s) + -store-gateway.sharding-ring.multi.primary string + Primary backend storage used by multi-client. + -store-gateway.sharding-ring.multi.secondary string + Secondary backend storage used by multi-client. + -store-gateway.sharding-ring.prefix string + The prefix for the keys in the store. Should end with a /. (default "collectors/") + -store-gateway.sharding-ring.replication-factor int + The replication factor to use when sharding blocks. This option needs be set both on the store-gateway and querier when running in microservices mode. (default 3) + -store-gateway.sharding-ring.store string + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + -store-gateway.sharding-ring.tokens-file-path string + File path where tokens are stored. If empty, tokens are not stored at shutdown and restored at startup. + -store-gateway.sharding-ring.unregister-on-shutdown + Unregister from the ring upon clean shutdown. (default true) + -store-gateway.sharding-ring.wait-stability-max-duration duration + Maximum time to wait for ring stability at startup. If the store-gateway ring keeps changing after this period of time, the store-gateway will start anyway. (default 5m0s) + -store-gateway.sharding-ring.wait-stability-min-duration duration + Minimum time to wait for ring stability at startup. 0 to disable. (default 1m0s) + -store-gateway.sharding-ring.zone-awareness-enabled + True to enable zone-awareness and replicate blocks across different availability zones. + -store-gateway.tenant-shard-size int + The tenant's shard size, used when store-gateway sharding is enabled. Value of 0 disables shuffle sharding for the tenant, that is all tenant blocks are sharded across all store-gateway replicas. + -store.max-labels-query-length value + Limit the time range (end - start time) of series, label names and values queries. This limit is enforced in the querier. If the requested time range is outside the allowed range, the request will not fail but will be manipulated to only query data within the allowed time range. 0 to disable. + -store.max-query-length value + Limit the query time range (end - start time). This limit is enforced in the query-frontend (on the received query), in the querier (on the query possibly split by the query-frontend) and ruler. 0 to disable. + -target value + Comma-separated list of modules to load. The alias 'all' can be used in the list to load a number of core modules and will enable single-binary mode. Use '-modules' command line flag to get a list of available modules, and to see which modules are included in 'all'. (default all) + -tenant-federation.enabled | + If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a | character in the `X-Scope-OrgID` header (experimental). + -validation.create-grace-period value + Duration which table will be created/deleted before/after it's needed; we won't accept sample from before this time. (default 10m) + -validation.enforce-metadata-metric-name + Enforce every metadata has a metric name. (default true) + -validation.max-label-names-per-series int + Maximum number of label names per series. (default 30) + -validation.max-length-label-name int + Maximum length accepted for label names (default 1024) + -validation.max-length-label-value int + Maximum length accepted for label value. This setting also applies to the metric name (default 2048) + -validation.max-metadata-length int + Maximum length accepted for metric metadata. Metadata refers to Metric Name, HELP and UNIT. (default 1024) + -version + Print application version and exit. + +To see all flags, use -help-all diff --git a/cmd/mimir/main.go b/cmd/mimir/main.go index 4465d3c194e..ec7a5c9bad4 100644 --- a/cmd/mimir/main.go +++ b/cmd/mimir/main.go @@ -68,6 +68,8 @@ func main() { blockProfileRate int printVersion bool printModules bool + printHelp bool + printHelpAll bool ) configFile, expandENV := parseConfigFileParameter(os.Args[1:]) @@ -95,24 +97,32 @@ func main() { flag.IntVar(&blockProfileRate, "debug.block-profile-rate", 0, "Fraction of goroutine blocking events that are reported in the blocking profile. 1 to include every blocking event in the profile, 0 to disable.") flag.BoolVar(&printVersion, "version", false, "Print application version and exit.") flag.BoolVar(&printModules, "modules", false, "List available values that can be used as target.") + flag.BoolVar(&printHelp, "help", false, "Print basic help.") + flag.BoolVar(&printHelp, "h", false, "Print basic help.") + flag.BoolVar(&printHelpAll, "help-all", false, "Print help including also advanced and experimental flags.") - usage := flag.CommandLine.Usage flag.CommandLine.Usage = func() { /* don't do anything by default, we will print usage ourselves, but only when requested. */ } flag.CommandLine.Init(flag.CommandLine.Name(), flag.ContinueOnError) - err := flag.CommandLine.Parse(os.Args[1:]) - if err == flag.ErrHelp { - // Print available parameters to stdout, so that users can grep/less it easily. - flag.CommandLine.SetOutput(os.Stdout) - usage() + if err := flag.CommandLine.Parse(os.Args[1:]); err != nil { + fmt.Fprintln(flag.CommandLine.Output(), "Run with -help to get list of available parameters") if !testMode { os.Exit(2) } - } else if err != nil { - fmt.Fprintln(flag.CommandLine.Output(), "Run with -help to get list of available parameters") + } + + if printHelp || printHelpAll { + // Print available parameters to stdout, so that users can grep/less them easily. + flag.CommandLine.SetOutput(os.Stdout) + if err := usage(&cfg, printHelpAll); err != nil { + fmt.Fprintf(os.Stderr, "error printing usage: %s\n", err) + os.Exit(1) + } + if !testMode { os.Exit(2) } + return } if printVersion { @@ -122,8 +132,7 @@ func main() { // Validate the config once both the config file has been loaded // and CLI flags parsed. - err = cfg.Validate(util_log.Logger) - if err != nil { + if err := cfg.Validate(util_log.Logger); err != nil { fmt.Fprintf(os.Stderr, "error validating config: %v\n", err) if !testMode { os.Exit(1) diff --git a/cmd/mimir/main_test.go b/cmd/mimir/main_test.go index b84f25743eb..835f411d101 100644 --- a/cmd/mimir/main_test.go +++ b/cmd/mimir/main_test.go @@ -14,6 +14,7 @@ import ( "strings" "sync" "testing" + "text/template" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -28,12 +29,24 @@ func TestFlagParsing(t *testing.T) { stdoutExcluded string // string that must NOT be included in stdout stderrExcluded string // string that must NOT be included in stderr }{ - "help": { + "help-short": { arguments: []string{"-h"}, stdoutMessage: "Usage of", // Usage must be on stdout, not stderr. stderrExcluded: "Usage of", }, + "help": { + arguments: []string{"-help"}, + stdoutMessage: "Usage of", // Usage must be on stdout, not stderr. + stderrExcluded: "Usage of", + }, + + "help-all": { + arguments: []string{"-help-all"}, + stdoutMessage: "Usage of", // Usage must be on stdout, not stderr. + stderrExcluded: "Usage of", + }, + "unknown flag": { arguments: []string{"-unknown.flag"}, stderrMessage: "Run with -help to get list of available parameters", @@ -99,6 +112,74 @@ func TestFlagParsing(t *testing.T) { } } +func TestHelp(t *testing.T) { + for _, tc := range []struct { + name string + arg string + filename string + }{ + { + name: "basic", + arg: "-h", + filename: "help.txt.tmpl", + }, + { + name: "all", + arg: "-help-all", + filename: "help-all.txt.tmpl", + }, + } { + t.Run(tc.name, func(t *testing.T) { + oldArgs, oldStdout, oldStderr, oldTestMode, oldCmdLine := os.Args, os.Stdout, os.Stderr, testMode, flag.CommandLine + restored := false + restoreIfNeeded := func() { + if restored { + return + } + + os.Stdout = oldStdout + os.Stderr = oldStderr + os.Args = oldArgs + testMode = oldTestMode + flag.CommandLine = oldCmdLine + restored = true + } + t.Cleanup(restoreIfNeeded) + + testMode = true + co := captureOutput(t) + + const cmd = "./cmd/mimir/mimir" + os.Args = []string{cmd, tc.arg} + + // reset default flags + flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) + + main() + + stdout, stderr := co.Done() + + // Restore stdout and stderr before reporting errors to make them visible. + restoreIfNeeded() + + hostname, err := os.Hostname() + require.NoError(t, err) + c := struct { + Hostname string + }{ + Hostname: hostname, + } + + tmpl, err := template.ParseFiles(tc.filename) + require.NoError(t, err) + var b strings.Builder + require.NoError(t, tmpl.Execute(&b, c)) + assert.Equalf(t, b.String(), string(stdout), "%s %s output changed; try `make reference-help`", cmd, tc.arg) + assert.Empty(t, stderr) + }) + } +} + func testSingle(t *testing.T, arguments []string, yaml string, stdoutMessage, stderrMessage, stdoutExcluded, stderrExcluded []byte) { t.Helper() oldArgs, oldStdout, oldStderr, oldTestMode := os.Args, os.Stdout, os.Stderr, testMode diff --git a/cmd/mimir/usage.go b/cmd/mimir/usage.go new file mode 100644 index 00000000000..a196ca2dbdb --- /dev/null +++ b/cmd/mimir/usage.go @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package main + +import ( + "flag" + "fmt" + "os" + "reflect" + "strings" + + "github.com/grafana/mimir/pkg/mimir" +) + +// category is an enumeration of flag categories. +type category int + +const ( + // categoryBasic is the basic flag category, and the default if none is defined. + categoryBasic category = iota + // categoryAdvanced is the advanced flag category. + categoryAdvanced + // categoryExperimental is the experimental flag category. + categoryExperimental +) + +// usage prints command-line usage, the printAll argument controls whether also non-basic flags will be included. +func usage(cfg *mimir.Config, printAll bool) error { + fields := map[uintptr]reflect.StructField{} + if err := parseConfig(cfg, fields); err != nil { + return err + } + + fs := flag.CommandLine + fmt.Fprintf(fs.Output(), "Usage of %s:\n", os.Args[0]) + fs.VisitAll(func(fl *flag.Flag) { + v := reflect.ValueOf(fl.Value) + fieldCat := categoryBasic + if v.Kind() == reflect.Ptr { + ptr := v.Pointer() + field, ok := fields[ptr] + if ok { + catStr := field.Tag.Get("category") + switch catStr { + case "advanced": + fieldCat = categoryAdvanced + case "experimental": + fieldCat = categoryExperimental + } + } + } + + if fieldCat != categoryBasic && !printAll { + // Don't print help for this flag since we're supposed to print only basic flags + return + } + + var b strings.Builder + // Two spaces before -; see next two comments. + fmt.Fprintf(&b, " -%s", fl.Name) + name, usage := flag.UnquoteUsage(fl) + if len(name) > 0 { + b.WriteString(" ") + b.WriteString(name) + } + // Four spaces before the tab triggers good alignment + // for both 4- and 8-space tab stops. + b.WriteString("\n \t") + if fieldCat == categoryExperimental { + b.WriteString("[experimental] ") + } + b.WriteString(strings.ReplaceAll(usage, "\n", "\n \t")) + + if !isZeroValue(fl, fl.DefValue) { + v := reflect.ValueOf(fl.Value) + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if v.Kind() == reflect.String { + // put quotes on the value + fmt.Fprintf(&b, " (default %q)", fl.DefValue) + } else { + fmt.Fprintf(&b, " (default %v)", fl.DefValue) + } + } + fmt.Fprint(fs.Output(), b.String(), "\n") + }) + + if !printAll { + fmt.Fprintf(fs.Output(), "\nTo see all flags, use -help-all\n") + } + + return nil +} + +// isZeroValue determines whether the string represents the zero +// value for a flag. +func isZeroValue(fl *flag.Flag, value string) bool { + // Build a zero value of the flag's Value type, and see if the + // result of calling its String method equals the value passed in. + // This works unless the Value type is itself an interface type. + typ := reflect.TypeOf(fl.Value) + var z reflect.Value + if typ.Kind() == reflect.Ptr { + z = reflect.New(typ.Elem()) + } else { + z = reflect.Zero(typ) + } + return value == z.Interface().(flag.Value).String() +} + +// parseConfig parses a mimir.Config and populates fields. +func parseConfig(cfg interface{}, fields map[uintptr]reflect.StructField) error { + // The input config is expected to be a pointer to struct. + if reflect.TypeOf(cfg).Kind() != reflect.Ptr { + t := reflect.TypeOf(cfg) + return fmt.Errorf("%s is a %s while a %s is expected", t, t.Kind(), reflect.Ptr) + } + v := reflect.ValueOf(cfg).Elem() + if v.Kind() != reflect.Struct { + return fmt.Errorf("%s is a %s while a %s is expected", v, v.Kind(), reflect.Struct) + } + + t := v.Type() + + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + if field.Type.Kind() == reflect.Func { + continue + } + + fieldValue := v.FieldByIndex(field.Index) + + // Take address of field value and map it to field + fields[fieldValue.Addr().Pointer()] = field + + // Recurse if a struct + if field.Type.Kind() != reflect.Struct { + continue + } + + if err := parseConfig(fieldValue.Addr().Interface(), fields); err != nil { + return err + } + } + + return nil +} diff --git a/pkg/compactor/compactor.go b/pkg/compactor/compactor.go index d4453107015..77cd8e19970 100644 --- a/pkg/compactor/compactor.go +++ b/pkg/compactor/compactor.go @@ -80,7 +80,7 @@ type BlocksCompactorFactory func( // Config holds the MultitenantCompactor config. type Config struct { - BlockRanges mimir_tsdb.DurationList `yaml:"block_ranges"` + BlockRanges mimir_tsdb.DurationList `yaml:"block_ranges" category:"advanced"` BlockSyncConcurrency int `yaml:"block_sync_concurrency"` MetaSyncConcurrency int `yaml:"meta_sync_concurrency"` ConsistencyDelay time.Duration `yaml:"consistency_delay"` diff --git a/pkg/querier/engine/config.go b/pkg/querier/engine/config.go index 2760eb77ca5..b9c2c019493 100644 --- a/pkg/querier/engine/config.go +++ b/pkg/querier/engine/config.go @@ -19,7 +19,7 @@ type Config struct { MaxConcurrent int `yaml:"max_concurrent"` Timeout time.Duration `yaml:"timeout"` MaxSamples int `yaml:"max_samples"` - AtModifierEnabled bool `yaml:"at_modifier_enabled"` + AtModifierEnabled bool `yaml:"at_modifier_enabled" category:"experimental"` // The default evaluation interval for the promql engine. // Needs to be configured for subqueries to work as it is the default diff --git a/tools/doc-generator/main.go b/tools/doc-generator/main.go index 49fe16d6b1c..eb94c02550d 100644 --- a/tools/doc-generator/main.go +++ b/tools/doc-generator/main.go @@ -279,9 +279,9 @@ func main() { templatePath := flag.Arg(0) - // In order to match YAML config fields with CLI flags, we do map + // In order to match YAML config fields with CLI flags, we map // the memory address of the CLI flag variables and match them with - // the config struct fields address. + // the config struct fields' addresses. cfg := &mimir.Config{} flags := parseFlags(cfg, util_log.Logger) From f88f9d6f70b72279ad304d717e6c4cbf037f3ad3 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Thu, 27 Jan 2022 08:35:23 +0100 Subject: [PATCH 017/168] Dynamically compute -compactor.deletion-delay setting in jsonnet (#907) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 1 + .../mimir-tests/test-defaults-generated.yaml | 1443 +++++++++++++++++ operations/mimir-tests/test-defaults.jsonnet | 11 + ...est-disable-chunk-streaming-generated.yaml | 1 + .../test-query-sharding-generated.yaml | 1 + .../test-shuffle-sharding-generated.yaml | 1 + .../test-storage-azure-generated.yaml | 1 + .../test-storage-gcs-generated.yaml | 1 + .../test-storage-s3-generated.yaml | 1 + operations/mimir/compactor.libsonnet | 35 + 10 files changed, 1496 insertions(+) create mode 100644 operations/mimir-tests/test-defaults-generated.yaml create mode 100644 operations/mimir-tests/test-defaults.jsonnet diff --git a/CHANGELOG.md b/CHANGELOG.md index 84561b5d17e..ebba3adafcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -548,6 +548,7 @@ * [CHANGE] Changed log level of querier, query-frontend, query-scheduler and alertmanager from `debug` to `info`. #905 * [CHANGE] Enabled attributes in-memory cache in store-gateway. #905 * [CHANGE] Configured store-gateway to not load blocks containing samples more recent than 10h (because such samples are queried from ingesters). #905 +* [CHANGE] Dynamically compute `-compactor.deletion-delay` based on other settings, in order to reduce the deletion delay as much as possible and lower the number of live blocks in the storage. #907 * [FEATURE] Added query sharding support. It can be enabled setting `cortex_query_sharding_enabled: true` in the `_config` object. #653 * [FEATURE] Added shuffle-sharding support. It can be enabled and configured using the following config: #902 ``` diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml new file mode 100644 index 00000000000..91b19345a94 --- /dev/null +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -0,0 +1,1443 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: default +--- +apiVersion: policy/v1beta1 +kind: PodDisruptionBudget +metadata: + labels: + name: ingester-pdb + name: ingester-pdb + namespace: default +spec: + maxUnavailable: 1 + selector: + matchLabels: + name: ingester +--- +apiVersion: policy/v1beta1 +kind: PodDisruptionBudget +metadata: + labels: + name: store-gateway-pdb + name: store-gateway-pdb + namespace: default +spec: + maxUnavailable: 2 + selector: + matchLabels: + name: store-gateway +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: consul-sidekick + namespace: default +--- +apiVersion: v1 +data: + consul-config.json: '{"leave_on_terminate": true, "raft_snapshot_threshold": 128, + "raft_trailing_logs": 10000, "telemetry": {"dogstatsd_addr": "127.0.0.1:9125"}}' + mapping: | + mappings: + - match: consul.*.runtime.* + name: consul_runtime + labels: + type: $2 + - match: consul.runtime.total_gc_pause_ns + name: consul_runtime_total_gc_pause_ns + labels: + type: $2 + - match: consul.consul.health.service.query-tag.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3 + - match: consul.consul.health.service.query-tag.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4 + - match: consul.consul.health.service.query-tag.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9.$10 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9.$10.$11 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9.$10.$11.$12 + - match: consul.consul.catalog.deregister + name: consul_catalog_deregister + labels: {} + - match: consul.consul.dns.domain_query.*.*.*.*.* + name: consul_dns_domain_query + labels: + query: $1.$2.$3.$4.$5 + - match: consul.consul.health.service.not-found.* + name: consul_health_service_not_found + labels: + query: $1 + - match: consul.consul.health.service.query.* + name: consul_health_service_query + labels: + query: $1 + - match: consul.*.memberlist.health.score + name: consul_memberlist_health_score + labels: {} + - match: consul.serf.queue.* + name: consul_serf_events + labels: + type: $1 + - match: consul.serf.snapshot.appendLine + name: consul_serf_snapshot_appendLine + labels: + type: $1 + - match: consul.serf.coordinate.adjustment-ms + name: consul_serf_coordinate_adjustment_ms + labels: {} + - match: consul.consul.rpc.query + name: consul_rpc_query + labels: {} + - match: consul.*.consul.session_ttl.active + name: consul_session_ttl_active + labels: {} + - match: consul.raft.rpc.* + name: consul_raft_rpc + labels: + type: $1 + - match: consul.raft.rpc.appendEntries.storeLogs + name: consul_raft_rpc_appendEntries_storeLogs + labels: + type: $1 + - match: consul.consul.fsm.persist + name: consul_fsm_persist + labels: {} + - match: consul.raft.fsm.apply + name: consul_raft_fsm_apply + labels: {} + - match: consul.raft.leader.lastContact + name: consul_raft_leader_lastcontact + labels: {} + - match: consul.raft.leader.dispatchLog + name: consul_raft_leader_dispatchLog + labels: {} + - match: consul.raft.commitTime + name: consul_raft_commitTime + labels: {} + - match: consul.raft.replication.appendEntries.logs.*.*.*.* + name: consul_raft_replication_appendEntries_logs + labels: + query: ${1}.${2}.${3}.${4} + - match: consul.raft.replication.appendEntries.rpc.*.*.*.* + name: consul_raft_replication_appendEntries_rpc + labels: + query: ${1}.${2}.${3}.${4} + - match: consul.raft.replication.heartbeat.*.*.*.* + name: consul_raft_replication_heartbeat + labels: + query: ${1}.${2}.${3}.${4} + - match: consul.consul.rpc.request + name: consul_rpc_requests + labels: {} + - match: consul.consul.rpc.accept_conn + name: consul_rpc_accept_conn + labels: {} + - match: consul.memberlist.udp.* + name: consul_memberlist_udp + labels: + type: $1 + - match: consul.memberlist.tcp.* + name: consul_memberlist_tcp + labels: + type: $1 + - match: consul.memberlist.gossip + name: consul_memberlist_gossip + labels: {} + - match: consul.memberlist.probeNode + name: consul_memberlist_probenode + labels: {} + - match: consul.memberlist.pushPullNode + name: consul_memberlist_pushpullnode + labels: {} + - match: consul.http.* + name: consul_http_request + labels: + method: $1 + path: / + - match: consul.http.*.* + name: consul_http_request + labels: + method: $1 + path: /$2 + - match: consul.http.*.*.* + name: consul_http_request + labels: + method: $1 + path: /$2/$3 + - match: consul.http.*.*.*.* + name: consul_http_request + labels: + method: $1 + path: /$2/$3/$4 + - match: consul.http.*.*.*.*.* + name: consul_http_request + labels: + method: $1 + path: /$2/$3/$4/$5 + - match: consul.consul.leader.barrier + name: consul_leader_barrier + labels: {} + - match: consul.consul.leader.reconcileMember + name: consul_leader_reconcileMember + labels: {} + - match: consul.consul.leader.reconcile + name: consul_leader_reconcile + labels: {} + - match: consul.consul.fsm.coordinate.batch-update + name: consul_fsm_coordinate_batch_update + labels: {} + - match: consul.consul.fsm.autopilot + name: consul_fsm_autopilot + labels: {} + - match: consul.consul.fsm.kvs.cas + name: consul_fsm_kvs_cas + labels: {} + - match: consul.consul.fsm.register + name: consul_fsm_register + labels: {} + - match: consul.consul.fsm.deregister + name: consul_fsm_deregister + labels: {} + - match: consul.consul.fsm.tombstone.reap + name: consul_fsm_tombstone_reap + labels: {} + - match: consul.consul.catalog.register + name: consul_catalog_register + labels: {} + - match: consul.consul.catalog.deregister + name: consul_catalog_deregister + labels: {} + - match: consul.consul.leader.reapTombstones + name: consul_leader_reapTombstones + labels: {} +kind: ConfigMap +metadata: + name: consul + namespace: default +--- +apiVersion: v1 +data: + overrides.yaml: | + overrides: {} +kind: ConfigMap +metadata: + name: overrides + namespace: default +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: consul-sidekick + namespace: default +rules: +- apiGroups: + - "" + - extensions + - apps + resources: + - pods + - replicasets + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: consul-sidekick + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: consul-sidekick +subjects: +- kind: ServiceAccount + name: consul-sidekick + namespace: default +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: consul + name: consul + namespace: default +spec: + ports: + - name: consul-server + port: 8300 + targetPort: 8300 + - name: consul-serf + port: 8301 + targetPort: 8301 + - name: consul-client + port: 8400 + targetPort: 8400 + - name: consul-api + port: 8500 + targetPort: 8500 + - name: statsd-exporter-http-metrics + port: 8000 + targetPort: 8000 + - name: consul-exporter-http-metrics + port: 9107 + targetPort: 9107 + selector: + name: consul +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: distributor + name: distributor + namespace: default +spec: + clusterIP: None + ports: + - name: distributor-http-metrics + port: 8080 + targetPort: 8080 + - name: distributor-grpc + port: 9095 + targetPort: 9095 + selector: + name: distributor +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: ingester + name: ingester + namespace: default +spec: + ports: + - name: ingester-http-metrics + port: 8080 + targetPort: 8080 + - name: ingester-grpc + port: 9095 + targetPort: 9095 + selector: + name: ingester +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached + name: memcached + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached-frontend + name: memcached-frontend + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached-frontend +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached-index-queries + name: memcached-index-queries + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached-index-queries +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached-metadata + name: memcached-metadata + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached-metadata +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: querier + name: querier + namespace: default +spec: + ports: + - name: querier-http-metrics + port: 8080 + targetPort: 8080 + - name: querier-grpc + port: 9095 + targetPort: 9095 + selector: + name: querier +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: query-frontend + name: query-frontend + namespace: default +spec: + ports: + - name: query-frontend-http-metrics + port: 8080 + targetPort: 8080 + - name: query-frontend-grpc + port: 9095 + targetPort: 9095 + selector: + name: query-frontend +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: query-frontend + name: query-frontend-discovery + namespace: default +spec: + clusterIP: None + ports: + - name: query-frontend-http-metrics + port: 8080 + targetPort: 8080 + - name: query-frontend-grpc + port: 9095 + targetPort: 9095 + publishNotReadyAddresses: true + selector: + name: query-frontend +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: store-gateway + name: store-gateway + namespace: default +spec: + ports: + - name: store-gateway-http-metrics + port: 8080 + targetPort: 8080 + - name: store-gateway-grpc + port: 9095 + targetPort: 9095 + selector: + name: store-gateway +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: consul + namespace: default +spec: + minReadySeconds: 10 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: consul + template: + metadata: + annotations: + consul-hash: e56ef6821a3557604caccaf6d5820239 + labels: + name: consul + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: consul + topologyKey: kubernetes.io/hostname + - labelSelector: + matchLabels: + name: ingester + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - args: + - agent + - -ui + - -server + - -client=0.0.0.0 + - -config-file=/etc/config/consul-config.json + - -bootstrap-expect=1 + - -ui-content-path=/default/consul/ + env: + - name: CHECKPOINT_DISABLE + value: "1" + image: consul:1.5.3 + imagePullPolicy: IfNotPresent + name: consul + ports: + - containerPort: 8300 + name: server + - containerPort: 8301 + name: serf + - containerPort: 8400 + name: client + - containerPort: 8500 + name: api + resources: + requests: + cpu: "4" + memory: 4Gi + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + - args: + - --namespace=$(POD_NAMESPACE) + - --pod-name=$(POD_NAME) + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + image: weaveworks/consul-sidekick:master-f18ad13 + imagePullPolicy: IfNotPresent + name: sidekick + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + - args: + - --web.listen-address=:8000 + - --statsd.mapping-config=/etc/config/mapping + image: prom/statsd-exporter:v0.12.2 + imagePullPolicy: IfNotPresent + name: statsd-exporter + ports: + - containerPort: 8000 + name: http-metrics + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + - args: + - --consul.server=localhost:8500 + - --web.listen-address=:9107 + - --consul.timeout=1s + - --no-consul.health-summary + - --consul.allow_stale + image: prom/consul-exporter:v0.5.0 + imagePullPolicy: IfNotPresent + name: consul-exporter + ports: + - containerPort: 9107 + name: http-metrics + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + serviceAccount: consul-sidekick + volumes: + - configMap: + name: consul + name: consul + - emptyDir: + medium: Memory + name: data +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: distributor + namespace: default +spec: + minReadySeconds: 10 + replicas: 3 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: distributor + strategy: + rollingUpdate: + maxSurge: 5 + maxUnavailable: 1 + template: + metadata: + labels: + name: distributor + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: distributor + topologyKey: kubernetes.io/hostname + containers: + - args: + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.extend-writes=true + - -distributor.ha-tracker.enable=true + - -distributor.ha-tracker.enable-for-all-users=true + - -distributor.ha-tracker.etcd.endpoints=etcd-client.default.svc.cluster.local.:2379 + - -distributor.ha-tracker.prefix=prom_ha/ + - -distributor.ha-tracker.store=etcd + - -distributor.health-check-ingesters=true + - -distributor.ingestion-burst-size=200000 + - -distributor.ingestion-rate-limit=10000 + - -distributor.remote-timeout=20s + - -distributor.replication-factor=3 + - -distributor.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.ring.prefix= + - -mem-ballast-size-bytes=1073741824 + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.max-connection-age=2m + - -server.grpc.keepalive.max-connection-age-grace=5m + - -server.grpc.keepalive.max-connection-idle=1m + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -target=distributor + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: distributor + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 4Gi + requests: + cpu: "2" + memory: 2Gi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: querier + namespace: default +spec: + minReadySeconds: 10 + replicas: 6 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: querier + strategy: + rollingUpdate: + maxSurge: 5 + maxUnavailable: 1 + template: + metadata: + labels: + name: querier + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: querier + topologyKey: kubernetes.io/hostname + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h + - -blocks-storage.bucket-store.metadata-cache.backend=memcached + - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.sync-dir=/data/tsdb + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.health-check-ingesters=true + - -distributor.replication-factor=3 + - -mem-ballast-size-bytes=268435456 + - -querier.at-modifier-enabled=true + - -querier.frontend-address=query-frontend-discovery.default.svc.cluster.local:9095 + - -querier.frontend-client.grpc-max-send-msg-size=104857600 + - -querier.max-concurrent=8 + - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true + - -querier.query-store-after=12h + - -querier.query-store-for-labels-enabled=true + - -querier.worker-parallelism=4 + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -server.http-write-timeout=1m + - -store-gateway.sharding-enabled=true + - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -store-gateway.sharding-ring.prefix= + - -store-gateway.sharding-ring.replication-factor=3 + - -store-gateway.sharding-ring.store=consul + - -store.max-query-length=768h + - -target=querier + env: + - name: JAEGER_REPORTER_MAX_QUEUE_SIZE + value: "1024" + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: querier + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 24Gi + requests: + cpu: "1" + memory: 12Gi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: query-frontend + namespace: default +spec: + minReadySeconds: 10 + replicas: 2 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: query-frontend + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + template: + metadata: + labels: + name: query-frontend + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: query-frontend + topologyKey: kubernetes.io/hostname + containers: + - args: + - -api.response-compression-enabled=true + - -frontend.align-querier-with-step=false + - -frontend.cache-results=true + - -frontend.max-cache-freshness=10m + - -frontend.results-cache.backend=memcached + - -frontend.results-cache.memcached.addresses=dnssrvnoa+memcached-frontend.default.svc.cluster.local:11211 + - -frontend.results-cache.memcached.timeout=500ms + - -frontend.split-queries-by-interval=24h + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc-max-recv-msg-size-bytes=104857600 + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -server.http-write-timeout=1m + - -store.max-query-length=12000h + - -target=query-frontend + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: query-frontend + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 1200Mi + requests: + cpu: "2" + memory: 600Mi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: compactor + name: compactor + namespace: default +spec: + podManagementPolicy: Parallel + replicas: 1 + selector: + matchLabels: + name: compactor + serviceName: compactor + template: + metadata: + labels: + name: compactor + spec: + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -compactor.block-ranges=2h,12h,24h + - -compactor.blocks-retention-period=0 + - -compactor.cleanup-interval=15m + - -compactor.compaction-concurrency=1 + - -compactor.compaction-interval=30m + - -compactor.compactor-tenant-shard-size=1 + - -compactor.data-dir=/data + - -compactor.deletion-delay=2h + - -compactor.max-closing-blocks-concurrency=2 + - -compactor.max-opening-blocks-concurrency=4 + - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -compactor.ring.prefix= + - -compactor.ring.store=consul + - -compactor.sharding-enabled=true + - -compactor.split-and-merge-shards=0 + - -compactor.split-groups=1 + - -compactor.symbols-flushers-concurrency=4 + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -target=compactor + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: compactor + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 6Gi + requests: + cpu: 1 + memory: 6Gi + volumeMounts: + - mountPath: /data + name: compactor-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 900 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: compactor-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 250Gi + storageClassName: standard +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: ingester + name: ingester + namespace: default +spec: + podManagementPolicy: Parallel + replicas: 3 + selector: + matchLabels: + name: ingester + serviceName: ingester + template: + metadata: + labels: + name: ingester + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: ingester + topologyKey: kubernetes.io/hostname + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -blocks-storage.tsdb.block-ranges-period=2h + - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h + - -blocks-storage.tsdb.dir=/data/tsdb + - -blocks-storage.tsdb.isolation-enabled=false + - -blocks-storage.tsdb.retention-period=24h + - -blocks-storage.tsdb.ship-interval=1m + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.health-check-ingesters=true + - -distributor.replication-factor=3 + - -ingester.heartbeat-period=15s + - -ingester.join-after=0s + - -ingester.max-global-series-per-metric=20000 + - -ingester.max-global-series-per-user=150000 + - -ingester.num-tokens=512 + - -ingester.tokens-file-path=/data/tokens + - -ingester.unregister-on-shutdown=true + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc-max-concurrent-streams=10000 + - -server.grpc-max-recv-msg-size-bytes=10485760 + - -server.grpc-max-send-msg-size-bytes=10485760 + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -target=ingester + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: ingester + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 25Gi + requests: + cpu: "4" + memory: 15Gi + volumeMounts: + - mountPath: /data + name: ingester-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 1200 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: ingester-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Gi + storageClassName: fast +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: memcached + serviceName: memcached + template: + metadata: + labels: + name: memcached + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 6144 + - -I 1m + - -c 16384 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 9Gi + requests: + cpu: 500m + memory: 6552Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached-frontend + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: memcached-frontend + serviceName: memcached-frontend + template: + metadata: + labels: + name: memcached-frontend + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached-frontend + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 1024 + - -I 5m + - -c 1024 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 1536Mi + requests: + cpu: 500m + memory: 1329Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached-index-queries + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: memcached-index-queries + serviceName: memcached-index-queries + template: + metadata: + labels: + name: memcached-index-queries + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached-index-queries + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 1024 + - -I 5m + - -c 16384 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 1536Mi + requests: + cpu: 500m + memory: 1329Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached-metadata + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + name: memcached-metadata + serviceName: memcached-metadata + template: + metadata: + labels: + name: memcached-metadata + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached-metadata + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 512 + - -I 1m + - -c 16384 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 768Mi + requests: + cpu: 500m + memory: 715Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: store-gateway + name: store-gateway + namespace: default +spec: + podManagementPolicy: Parallel + replicas: 3 + selector: + matchLabels: + name: store-gateway + serviceName: store-gateway + template: + metadata: + labels: + name: store-gateway + spec: + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 + - -blocks-storage.bucket-store.chunks-cache.backend=memcached + - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size=100 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.ignore-blocks-within=10h + - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h + - -blocks-storage.bucket-store.index-cache.backend=memcached + - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 + - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size=100 + - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 + - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 + - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 + - -blocks-storage.bucket-store.index-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.index-header-lazy-loading-enabled=true + - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout=60m + - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 + - -blocks-storage.bucket-store.metadata-cache.backend=memcached + - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms + - -blocks-storage.bucket-store.sync-dir=/data/tsdb + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -store-gateway.sharding-enabled=true + - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -store-gateway.sharding-ring.prefix= + - -store-gateway.sharding-ring.replication-factor=3 + - -store-gateway.sharding-ring.store=consul + - -store-gateway.sharding-ring.tokens-file-path=/data/tokens + - -target=store-gateway + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: store-gateway + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 18Gi + requests: + cpu: "1" + memory: 12Gi + volumeMounts: + - mountPath: /data + name: store-gateway-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 120 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: store-gateway-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Gi + storageClassName: standard +--- +apiVersion: etcd.database.coreos.com/v1beta2 +kind: EtcdCluster +metadata: + annotations: + etcd.database.coreos.com/scope: clusterwide + name: etcd + namespace: default +spec: + pod: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + etcd_cluster: etcd + topologyKey: kubernetes.io/hostname + annotations: + prometheus.io/port: "2379" + prometheus.io/scrape: "true" + etcdEnv: + - name: ETCD_AUTO_COMPACTION_RETENTION + value: 1h + labels: + name: etcd + resources: + limits: + memory: 512Mi + requests: + cpu: 500m + memory: 512Mi + size: 3 + version: 3.3.13 diff --git a/operations/mimir-tests/test-defaults.jsonnet b/operations/mimir-tests/test-defaults.jsonnet new file mode 100644 index 00000000000..2802a59baf4 --- /dev/null +++ b/operations/mimir-tests/test-defaults.jsonnet @@ -0,0 +1,11 @@ +local mimir = import 'mimir/mimir.libsonnet'; + +mimir { + _config+:: { + namespace: 'default', + external_url: 'http://test', + + blocks_storage_backend: 'gcs', + blocks_storage_bucket_name: 'blocks-bucket', + }, +} diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index e24104157ce..3474e66a04d 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -1245,6 +1245,7 @@ spec: - -compactor.compaction-interval=30m - -compactor.compactor-tenant-shard-size=1 - -compactor.data-dir=/data + - -compactor.deletion-delay=2h - -compactor.max-closing-blocks-concurrency=2 - -compactor.max-opening-blocks-concurrency=4 - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index c80218d9365..7fc893f5725 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -1249,6 +1249,7 @@ spec: - -compactor.compaction-interval=30m - -compactor.compactor-tenant-shard-size=1 - -compactor.data-dir=/data + - -compactor.deletion-delay=2h - -compactor.max-closing-blocks-concurrency=2 - -compactor.max-opening-blocks-concurrency=4 - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index f2c827b8a64..98af58f6e60 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -1254,6 +1254,7 @@ spec: - -compactor.compaction-interval=30m - -compactor.compactor-tenant-shard-size=1 - -compactor.data-dir=/data + - -compactor.deletion-delay=2h - -compactor.max-closing-blocks-concurrency=2 - -compactor.max-opening-blocks-concurrency=4 - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index ae7e665920b..06fad6a7fe8 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -1254,6 +1254,7 @@ spec: - -compactor.compaction-interval=30m - -compactor.compactor-tenant-shard-size=1 - -compactor.data-dir=/data + - -compactor.deletion-delay=2h - -compactor.max-closing-blocks-concurrency=2 - -compactor.max-opening-blocks-concurrency=4 - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 8bd4055a432..9569bfc5b99 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -1244,6 +1244,7 @@ spec: - -compactor.compaction-interval=30m - -compactor.compactor-tenant-shard-size=1 - -compactor.data-dir=/data + - -compactor.deletion-delay=2h - -compactor.max-closing-blocks-concurrency=2 - -compactor.max-opening-blocks-concurrency=4 - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index 4172785ef2e..09ba43b8412 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -1250,6 +1250,7 @@ spec: - -compactor.compaction-interval=30m - -compactor.compactor-tenant-shard-size=1 - -compactor.data-dir=/data + - -compactor.deletion-delay=2h - -compactor.max-closing-blocks-concurrency=2 - -compactor.max-opening-blocks-concurrency=4 - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 diff --git a/operations/mimir/compactor.libsonnet b/operations/mimir/compactor.libsonnet index ad5ca5a49dc..292ed1b2b14 100644 --- a/operations/mimir/compactor.libsonnet +++ b/operations/mimir/compactor.libsonnet @@ -4,6 +4,26 @@ local container = $.core.v1.container, local statefulSet = $.apps.v1.statefulSet, + local parseDuration(duration) = + if std.endsWith(duration, 's') then + std.parseInt(std.substr(duration, 0, std.length(duration) - 1)) + else if std.endsWith(duration, 'm') then + std.parseInt(std.substr(duration, 0, std.length(duration) - 1)) * 60 + else if std.endsWith(duration, 'h') then + std.parseInt(std.substr(duration, 0, std.length(duration) - 1)) * 3600 + else + error 'unable to parse duration %s' % duration, + + local formatDuration(seconds) = + if seconds <= 60 then + '%ds' % seconds + else if seconds <= 3600 && seconds % 60 == 0 then + '%dm' % (seconds / 60) + else if seconds % 3600 == 0 then + '%dh' % (seconds / 3600) + else + '%dm%ds' % [seconds / 60, seconds % 60], + compactor_args:: $._config.grpcConfig + $._config.storageConfig + @@ -39,6 +59,21 @@ 'compactor.ring.consul.hostname': 'consul.%s.svc.cluster.local:8500' % $._config.namespace, 'compactor.ring.prefix': '', + // Delete blocks sooner in order to keep the number of live blocks lower in the storage. + 'compactor.deletion-delay': formatDuration( + // Bucket index is updated every cleanup interval. + parseDuration($._config.compactor_cleanup_interval) + + // Wait until after the ignore deletion marks delay. + parseDuration($._config.queryBlocksStorageConfig['blocks-storage.bucket-store.ignore-deletion-marks-delay']) + + // Wait until store-gateway have updated. Add 3x the sync interval (instead of 1x) to account for delays and temporarily failures. + (parseDuration( + if std.objectHas($.store_gateway_args, 'blocks-storage.bucket-store.sync-interval') then + $.store_gateway_args['blocks-storage.bucket-store.sync-interval'] + else + '15m' // Default config. + ) * 3) + ), + // Limits config. 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, }, From 7f0f26884096874f30f0cd0d7b5d86c18ddaf25c Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Thu, 27 Jan 2022 09:29:26 +0100 Subject: [PATCH 018/168] Fix jsonnet after PRs 892 and 907 (#908) * Fix jsonnet after PRs 892 and 907 Signed-off-by: Marco Pracucci * Fix reference help too Signed-off-by: Marco Pracucci --- Makefile | 4 ++-- cmd/mimir/help-all.txt.tmpl | 2 +- cmd/mimir/help.txt.tmpl | 2 +- operations/mimir-tests/test-defaults-generated.yaml | 2 -- operations/mimir/compactor.libsonnet | 7 ++++++- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 4cafab868e7..5abb9388144 100644 --- a/Makefile +++ b/Makefile @@ -403,9 +403,9 @@ check-doc: doc .PHONY: reference-help reference-help: cmd/mimir/mimir @(./cmd/mimir/mimir -h || true) > cmd/mimir/help.txt.tmpl - @sed -i s/$(HOSTNAME)/\{\{.Hostname\}\}/g cmd/mimir/help.txt.tmpl + @$(SED) -i s/$(HOSTNAME)/\{\{.Hostname\}\}/g cmd/mimir/help.txt.tmpl @(./cmd/mimir/mimir -help-all || true) > cmd/mimir/help-all.txt.tmpl - @sed -i s/$(HOSTNAME)/\{\{.Hostname\}\}/g cmd/mimir/help-all.txt.tmpl + @$(SED) -i s/$(HOSTNAME)/\{\{.Hostname\}\}/g cmd/mimir/help-all.txt.tmpl clean-white-noise: @find . -path ./.pkg -prune -o -path ./vendor -prune -o -path ./website -prune -or -type f -name "*.md" -print | \ diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 8aa9e7e5571..94734c0846e 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -296,7 +296,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.ignore-blocks-within duration Blocks with minimum time within this duration are ignored, and not loaded by store-gateway. Useful when used together with -querier.query-store-after to prevent loading young blocks, because there are usually many of them (depending on number of ingesters) and they are not yet compacted. Negative values or 0 disable the filter. -blocks-storage.bucket-store.ignore-deletion-marks-delay duration - Duration after which the blocks marked for deletion will be filtered out while fetching blocks. The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. Default is 6h, half of the default value for -compactor.deletion-delay. (default 6h0m0s) + Duration after which the blocks marked for deletion will be filtered out while fetching blocks. The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. (default 1h0m0s) -blocks-storage.bucket-store.index-cache.backend string The index cache backend type. Supported values: inmemory, memcached. (default "inmemory") -blocks-storage.bucket-store.index-cache.inmemory.max-size-bytes uint diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 6d074ee9753..47cf5dbaf38 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -296,7 +296,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.ignore-blocks-within duration Blocks with minimum time within this duration are ignored, and not loaded by store-gateway. Useful when used together with -querier.query-store-after to prevent loading young blocks, because there are usually many of them (depending on number of ingesters) and they are not yet compacted. Negative values or 0 disable the filter. -blocks-storage.bucket-store.ignore-deletion-marks-delay duration - Duration after which the blocks marked for deletion will be filtered out while fetching blocks. The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. Default is 6h, half of the default value for -compactor.deletion-delay. (default 6h0m0s) + Duration after which the blocks marked for deletion will be filtered out while fetching blocks. The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. (default 1h0m0s) -blocks-storage.bucket-store.index-cache.backend string The index cache backend type. Supported values: inmemory, memcached. (default "inmemory") -blocks-storage.bucket-store.index-cache.inmemory.max-size-bytes uint diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml index 91b19345a94..37e5fd07a22 100644 --- a/operations/mimir-tests/test-defaults-generated.yaml +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -745,7 +745,6 @@ spec: containers: - args: - -blocks-storage.backend=gcs - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 @@ -1327,7 +1326,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - - -blocks-storage.bucket-store.ignore-deletion-marks-delay=1h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 diff --git a/operations/mimir/compactor.libsonnet b/operations/mimir/compactor.libsonnet index 292ed1b2b14..632160009f7 100644 --- a/operations/mimir/compactor.libsonnet +++ b/operations/mimir/compactor.libsonnet @@ -64,7 +64,12 @@ // Bucket index is updated every cleanup interval. parseDuration($._config.compactor_cleanup_interval) + // Wait until after the ignore deletion marks delay. - parseDuration($._config.queryBlocksStorageConfig['blocks-storage.bucket-store.ignore-deletion-marks-delay']) + + parseDuration( + if std.objectHas($.store_gateway_args, 'blocks-storage.bucket-store.ignore-deletion-marks-delay') then + $.store_gateway_args['blocks-storage.bucket-store.ignore-deletion-marks-delay'] + else + '1h' // Default config. + ) + // Wait until store-gateway have updated. Add 3x the sync interval (instead of 1x) to account for delays and temporarily failures. (parseDuration( if std.objectHas($.store_gateway_args, 'blocks-storage.bucket-store.sync-interval') then From 7edb67d30da022eae7f324fe71cc8485816abc20 Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Thu, 27 Jan 2022 10:43:50 +0100 Subject: [PATCH 019/168] Set server port when mimir image is overridden (#915) This complements the change by #871 in backward_compatibility.go Signed-off-by: Dimitar Dimitrov --- integration/backward_compatibility_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/integration/backward_compatibility_test.go b/integration/backward_compatibility_test.go index 93b2ddae413..6eda2ea033f 100644 --- a/integration/backward_compatibility_test.go +++ b/integration/backward_compatibility_test.go @@ -37,6 +37,7 @@ func previousVersionImages() map[string]func(map[string]string) map[string]strin for _, image := range strings.Split(overrideImageVersions, ",") { previousVersionImages[image] = func(flags map[string]string) map[string]string { flags["-store.engine"] = "blocks" + flags["-server.http-listen-port"] = "8080" return flags } } From f7791300005e3680b006aff6f9a28e9436b9ea08 Mon Sep 17 00:00:00 2001 From: Richard Hartmann Date: Thu, 27 Jan 2022 12:50:09 +0100 Subject: [PATCH 020/168] Ignore Vim swap files (#923) Signed-off-by: Richard Hartmann --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index af18ad724d9..e40231f08c4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ cmd/thanosconvert/thanosconvert .uptodate .pkg .cache +.swp docker-images/ website/public website/resources From b9dc577e56c5ad13e6eb8c86040ce40cc5ea8a4c Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Thu, 27 Jan 2022 12:55:01 +0100 Subject: [PATCH 021/168] Enable resources dashboards by default (#920) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 1 + operations/mimir-mixin-compiled/alerts.yaml | 2 +- .../dashboards/alertmanager-resources.json | 1350 ++++++++++ .../dashboards/mimir-reads-networking.json | 2210 ++++++++++++++++ .../dashboards/mimir-reads-resources.json | 2329 +++++++++++++++++ .../dashboards/mimir-writes-networking.json | 1169 +++++++++ .../dashboards/mimir-writes-resources.json | 1259 +++++++++ operations/mimir-mixin/config.libsonnet | 2 +- 8 files changed, 8320 insertions(+), 2 deletions(-) create mode 100644 operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json create mode 100644 operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json create mode 100644 operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json create mode 100644 operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json create mode 100644 operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json diff --git a/CHANGELOG.md b/CHANGELOG.md index ebba3adafcc..b4c69a4ae8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -398,6 +398,7 @@ * [CHANGE] Removed `cortex_overrides_metric` from `_config`. #871 * [CHANGE] Renamed recording rule groups (`cortex_` prefix changed to `mimir_`). #871 * [CHANGE] Alerts name prefix has been changed from `Cortex` to `Mimir` (eg. alert `CortexIngesterUnhealthy` has been renamed to `MimirIngesterUnhealthy`). #879 +* [CHANGE] Enabled resources dashboards by default. Can be disabled setting `resources_dashboards_enabled` config field to `false`. #920 * [FEATURE] Added `Cortex / Overrides` dashboard, displaying default limits and per-tenant overrides applied to Mimir. #673 * [FEATURE] Added `Mimir / Tenants` and `Mimir / Top tenants` dashboards, displaying user-based metrics. #776 * [ENHANCEMENT] cortex-mixin: Make `cluster_namespace_deployment:kube_pod_container_resource_requests_{cpu_cores,memory_bytes}:sum` backwards compatible with `kube-state-metrics` v2.0.0. [#317](https://github.com/grafana/cortex-jsonnet/pull/317) diff --git a/operations/mimir-mixin-compiled/alerts.yaml b/operations/mimir-mixin-compiled/alerts.yaml index da85fc731b0..366584f4057 100644 --- a/operations/mimir-mixin-compiled/alerts.yaml +++ b/operations/mimir-mixin-compiled/alerts.yaml @@ -1,5 +1,5 @@ groups: -- name: cortex_alerts +- name: mimir_alerts rules: - alert: MimirIngesterUnhealthy annotations: diff --git a/operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json b/operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json new file mode 100644 index 00000000000..c1b97313750 --- /dev/null +++ b/operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json @@ -0,0 +1,1350 @@ +{ + "annotations": { + "list": [ ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "hideControls": false, + "links": [ + { + "asDropdown": true, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [ + "mimir" + ], + "targetBlank": false, + "title": "Mimir Dashboards", + "type": "dashboards" + } + ], + "refresh": "10s", + "rows": [ + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Gateway", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"alertmanager\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"alertmanager\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"alertmanager\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 5, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"alertmanager\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"alertmanager\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Alertmanager", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"alertmanager-im\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"alertmanager-im\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"alertmanager-im\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"alertmanager-im\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"alertmanager-im\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager-im\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Instance Mapper", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 6, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_receive_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"alertmanager.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 11, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 6, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_transmit_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"alertmanager.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Network", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 6, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(instance, pod, device) (\n rate(\n node_disk_written_bytes_total[$__rate_interval]\n )\n)\n+\nignoring(pod) group_right() (\n label_replace(\n count by(\n instance,\n pod,\n device\n )\n (\n container_fs_writes_bytes_total{\n cluster=~\"$cluster\", namespace=~\"$namespace\",\n container=\"alertmanager\",\n device!~\".*sda.*\"\n }\n ),\n \"device\",\n \"$1\",\n \"device\",\n \"/dev/(.*)\"\n ) * 0\n)\n\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}} - {{device}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Writes", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 13, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 6, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(instance, pod, device) (\n rate(\n node_disk_read_bytes_total[$__rate_interval]\n )\n) + ignoring(pod) group_right() (\n label_replace(\n count by(\n instance,\n pod,\n device\n )\n (\n container_fs_writes_bytes_total{\n cluster=~\"$cluster\", namespace=~\"$namespace\",\n container=\"alertmanager\",\n device!~\".*sda.*\"\n }\n ),\n \"device\",\n \"$1\",\n \"device\",\n \"/dev/(.*)\"\n ) * 0\n)\n\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}} - {{device}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Reads", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Disk", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(persistentvolumeclaim) (\n kubelet_volume_stats_used_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\"} /\n kubelet_volume_stats_capacity_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\"}\n)\nand\ncount by(persistentvolumeclaim) (\n kube_persistentvolumeclaim_labels{\n cluster=~\"$cluster\", namespace=~\"$namespace\",\n label_name=\"alertmanager\"\n }\n)\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{persistentvolumeclaim}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Disk Space Utilization", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "percentunit", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "", + "titleSize": "h6" + } + ], + "schemaVersion": 14, + "style": "dark", + "tags": [ + "mimir" + ], + "templating": { + "list": [ + { + "current": { + "text": "default", + "value": "default" + }, + "hide": 0, + "label": null, + "name": "datasource", + "options": [ ], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allValue": null, + "current": { + "text": "prod", + "value": "prod" + }, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "cluster", + "multi": false, + "name": "cluster", + "options": [ ], + "query": "label_values(cortex_build_info, cluster)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [ ], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "text": "prod", + "value": "prod" + }, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ ], + "query": "label_values(cortex_build_info{cluster=~\"$cluster\"}, namespace)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [ ], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "utc", + "title": "Mimir / Alertmanager Resources", + "uid": "68b66aed90ccab448009089544a8d6c6", + "version": 0 + } \ No newline at end of file diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json b/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json new file mode 100644 index 00000000000..130d30a5f94 --- /dev/null +++ b/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json @@ -0,0 +1,2210 @@ +{ + "annotations": { + "list": [ ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "hideControls": false, + "links": [ + { + "asDropdown": true, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [ + "mimir" + ], + "targetBlank": false, + "title": "Mimir Dashboards", + "type": "dashboards" + } + ], + "refresh": "10s", + "rows": [ + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_receive_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"(gateway|cortex-gw|cortex-gw).*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_transmit_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"(gateway|cortex-gw|cortex-gw).*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Inflight Requests (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "TCP Connections (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Gateway", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 5, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_receive_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"query-frontend.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_transmit_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"query-frontend.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Inflight Requests (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "TCP Connections (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Query-frontend", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_receive_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"query-scheduler.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_transmit_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"query-scheduler.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 11, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Inflight Requests (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "TCP Connections (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Query-scheduler", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 13, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_receive_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"querier.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_transmit_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"querier.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 15, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Inflight Requests (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 16, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "TCP Connections (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Querier", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 17, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_receive_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"store-gateway.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 18, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_transmit_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"store-gateway.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 19, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Inflight Requests (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 20, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "TCP Connections (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Store-gateway", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 21, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_receive_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"ruler.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 22, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_transmit_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"ruler.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 23, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Inflight Requests (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "TCP Connections (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Ruler", + "titleSize": "h6" + } + ], + "schemaVersion": 14, + "style": "dark", + "tags": [ + "mimir" + ], + "templating": { + "list": [ + { + "current": { + "text": "default", + "value": "default" + }, + "hide": 0, + "label": null, + "name": "datasource", + "options": [ ], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allValue": null, + "current": { + "text": "prod", + "value": "prod" + }, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "cluster", + "multi": false, + "name": "cluster", + "options": [ ], + "query": "label_values(cortex_build_info, cluster)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [ ], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "text": "prod", + "value": "prod" + }, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ ], + "query": "label_values(cortex_build_info{cluster=~\"$cluster\"}, namespace)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [ ], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "utc", + "title": "Mimir / Reads Networking", + "uid": "c0464f0d8bd026f776c9006b05910000", + "version": 0 + } \ No newline at end of file diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json b/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json new file mode 100644 index 00000000000..604617bd41c --- /dev/null +++ b/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json @@ -0,0 +1,2329 @@ +{ + "annotations": { + "list": [ ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "hideControls": false, + "links": [ + { + "asDropdown": true, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [ + "mimir" + ], + "targetBlank": false, + "title": "Mimir Dashboards", + "type": "dashboards" + } + ], + "refresh": "10s", + "rows": [ + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Gateway", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"query-frontend\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"query-frontend\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"query-frontend\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 5, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"query-frontend\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"query-frontend\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Query Frontend", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"query-scheduler\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"query-scheduler\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"query-scheduler\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"query-scheduler\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"query-scheduler\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Query Scheduler", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"querier\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"querier\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"querier\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 11, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"querier\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"querier\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Querier", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 13, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ingester\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ingester\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ingester\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ingester\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ingester\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 15, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Ingester", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 16, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Rules", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 17, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ruler\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ruler\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ruler\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Ruler", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 18, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ruler\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ruler\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 19, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 20, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"store-gateway\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"store-gateway\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"store-gateway\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 21, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"store-gateway\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"store-gateway\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 22, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Store-gateway", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 23, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(instance, pod, device) (\n rate(\n node_disk_written_bytes_total[$__rate_interval]\n )\n)\n+\nignoring(pod) group_right() (\n label_replace(\n count by(\n instance,\n pod,\n device\n )\n (\n container_fs_writes_bytes_total{\n cluster=~\"$cluster\", namespace=~\"$namespace\",\n container=\"store-gateway\",\n device!~\".*sda.*\"\n }\n ),\n \"device\",\n \"$1\",\n \"device\",\n \"/dev/(.*)\"\n ) * 0\n)\n\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}} - {{device}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Disk Writes", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(instance, pod, device) (\n rate(\n node_disk_read_bytes_total[$__rate_interval]\n )\n) + ignoring(pod) group_right() (\n label_replace(\n count by(\n instance,\n pod,\n device\n )\n (\n container_fs_writes_bytes_total{\n cluster=~\"$cluster\", namespace=~\"$namespace\",\n container=\"store-gateway\",\n device!~\".*sda.*\"\n }\n ),\n \"device\",\n \"$1\",\n \"device\",\n \"/dev/(.*)\"\n ) * 0\n)\n\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}} - {{device}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Disk Reads", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(persistentvolumeclaim) (\n kubelet_volume_stats_used_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\"} /\n kubelet_volume_stats_capacity_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\"}\n)\nand\ncount by(persistentvolumeclaim) (\n kube_persistentvolumeclaim_labels{\n cluster=~\"$cluster\", namespace=~\"$namespace\",\n label_name=~\"store-gateway.*\"\n }\n)\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{persistentvolumeclaim}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Disk Space Utilization", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "percentunit", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "", + "titleSize": "h6" + } + ], + "schemaVersion": 14, + "style": "dark", + "tags": [ + "mimir" + ], + "templating": { + "list": [ + { + "current": { + "text": "default", + "value": "default" + }, + "hide": 0, + "label": null, + "name": "datasource", + "options": [ ], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allValue": null, + "current": { + "text": "prod", + "value": "prod" + }, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "cluster", + "multi": false, + "name": "cluster", + "options": [ ], + "query": "label_values(cortex_build_info, cluster)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [ ], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "text": "prod", + "value": "prod" + }, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ ], + "query": "label_values(cortex_build_info{cluster=~\"$cluster\"}, namespace)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [ ], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "utc", + "title": "Mimir / Reads Resources", + "uid": "2fd2cda9eea8d8af9fbc0a5960425120", + "version": 0 + } \ No newline at end of file diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json b/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json new file mode 100644 index 00000000000..9bd104ec28f --- /dev/null +++ b/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json @@ -0,0 +1,1169 @@ +{ + "annotations": { + "list": [ ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "hideControls": false, + "links": [ + { + "asDropdown": true, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [ + "mimir" + ], + "targetBlank": false, + "title": "Mimir Dashboards", + "type": "dashboards" + } + ], + "refresh": "10s", + "rows": [ + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_receive_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"(gateway|cortex-gw|cortex-gw).*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_transmit_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"(gateway|cortex-gw|cortex-gw).*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Inflight Requests (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "TCP Connections (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Gateway", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 5, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_receive_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"distributor.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_transmit_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"distributor.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Inflight Requests (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "TCP Connections (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Distributor", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_receive_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"ingester.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_network_transmit_bytes_total{cluster=~\"$cluster\", namespace=~\"$namespace\",pod=~\"ingester.*\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 11, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Inflight Requests (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 0, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "avg", + "legendLink": null, + "step": 10 + }, + { + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "highest", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "TCP Connections (per pod)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Ingester", + "titleSize": "h6" + } + ], + "schemaVersion": 14, + "style": "dark", + "tags": [ + "mimir" + ], + "templating": { + "list": [ + { + "current": { + "text": "default", + "value": "default" + }, + "hide": 0, + "label": null, + "name": "datasource", + "options": [ ], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allValue": null, + "current": { + "text": "prod", + "value": "prod" + }, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "cluster", + "multi": false, + "name": "cluster", + "options": [ ], + "query": "label_values(cortex_build_info, cluster)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [ ], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "text": "prod", + "value": "prod" + }, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ ], + "query": "label_values(cortex_build_info{cluster=~\"$cluster\"}, namespace)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [ ], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "utc", + "title": "Mimir / Writes Networking", + "uid": "681cd62b680b7154811fe73af55dcfd4", + "version": 0 + } \ No newline at end of file diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json b/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json new file mode 100644 index 00000000000..d0267f2e85b --- /dev/null +++ b/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json @@ -0,0 +1,1259 @@ +{ + "annotations": { + "list": [ ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "hideControls": false, + "links": [ + { + "asDropdown": true, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [ + "mimir" + ], + "targetBlank": false, + "title": "Mimir Dashboards", + "type": "dashboards" + } + ], + "refresh": "10s", + "rows": [ + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"(gateway|cortex-gw|cortex-gw-internal)\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Gateway", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"distributor\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"distributor\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"distributor\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 5, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"distributor\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"distributor\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Distributor", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (cortex_ingester_memory_series{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "In-memory series", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (rate(container_cpu_usage_seconds_total{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ingester\"}[$__rate_interval]))", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_cpu_quota{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ingester\"} / container_spec_cpu_period{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ingester\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Ingester", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "limit", + "color": "#E02F44", + "fill": 0 + } + ], + "spaceLength": 10, + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(pod) (container_memory_working_set_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ingester\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + }, + { + "expr": "min(container_spec_memory_limit_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"ingester\"} > 0)", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "limit", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (workingset)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Memory (go heap inuse)", + "tooltip": { + "sort": 2 + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 11, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(instance, pod, device) (\n rate(\n node_disk_written_bytes_total[$__rate_interval]\n )\n)\n+\nignoring(pod) group_right() (\n label_replace(\n count by(\n instance,\n pod,\n device\n )\n (\n container_fs_writes_bytes_total{\n cluster=~\"$cluster\", namespace=~\"$namespace\",\n container=\"ingester\",\n device!~\".*sda.*\"\n }\n ),\n \"device\",\n \"$1\",\n \"device\",\n \"/dev/(.*)\"\n ) * 0\n)\n\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}} - {{device}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Disk Writes", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by(instance, pod, device) (\n rate(\n node_disk_read_bytes_total[$__rate_interval]\n )\n) + ignoring(pod) group_right() (\n label_replace(\n count by(\n instance,\n pod,\n device\n )\n (\n container_fs_writes_bytes_total{\n cluster=~\"$cluster\", namespace=~\"$namespace\",\n container=\"ingester\",\n device!~\".*sda.*\"\n }\n ),\n \"device\",\n \"$1\",\n \"device\",\n \"/dev/(.*)\"\n ) * 0\n)\n\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{pod}} - {{device}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Disk Reads", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "id": 13, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max by(persistentvolumeclaim) (\n kubelet_volume_stats_used_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\"} /\n kubelet_volume_stats_capacity_bytes{cluster=~\"$cluster\", namespace=~\"$namespace\"}\n)\nand\ncount by(persistentvolumeclaim) (\n kube_persistentvolumeclaim_labels{\n cluster=~\"$cluster\", namespace=~\"$namespace\",\n label_name=~\"ingester.*\"\n }\n)\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "{{persistentvolumeclaim}}", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Disk Space Utilization", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "percentunit", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "", + "titleSize": "h6" + } + ], + "schemaVersion": 14, + "style": "dark", + "tags": [ + "mimir" + ], + "templating": { + "list": [ + { + "current": { + "text": "default", + "value": "default" + }, + "hide": 0, + "label": null, + "name": "datasource", + "options": [ ], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allValue": null, + "current": { + "text": "prod", + "value": "prod" + }, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "cluster", + "multi": false, + "name": "cluster", + "options": [ ], + "query": "label_values(cortex_build_info, cluster)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [ ], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "text": "prod", + "value": "prod" + }, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ ], + "query": "label_values(cortex_build_info{cluster=~\"$cluster\"}, namespace)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [ ], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "utc", + "title": "Mimir / Writes Resources", + "uid": "c0464f0d8bd026f776c9006b0591bb0b", + "version": 0 + } \ No newline at end of file diff --git a/operations/mimir-mixin/config.libsonnet b/operations/mimir-mixin/config.libsonnet index 8d2164062e1..73f66c1b0f6 100644 --- a/operations/mimir-mixin/config.libsonnet +++ b/operations/mimir-mixin/config.libsonnet @@ -35,7 +35,7 @@ cortex_p99_latency_threshold_seconds: 2.5, // Whether resources dashboards are enabled (based on cAdvisor metrics). - resources_dashboards_enabled: false, + resources_dashboards_enabled: true, // The label used to differentiate between different application instances (i.e. 'pod' in a kubernetes install). per_instance_label: 'pod', From f5781b43a797c40dfd388001d24a464724a29052 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Thu, 27 Jan 2022 14:52:34 +0100 Subject: [PATCH 022/168] Mimir: Tweak -help-all flag description (#914) Tweaking -help-all flag description based on tech writer feedback. Signed-off-by: Arve Knudsen --- cmd/mimir/help-all.txt.tmpl | 2 +- cmd/mimir/help.txt.tmpl | 2 +- cmd/mimir/main.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 94734c0846e..88ba267e6f2 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -902,7 +902,7 @@ Usage of ./cmd/mimir/mimir: -help Print basic help. -help-all - Print help including also advanced and experimental flags. + Print help, also including advanced and experimental parameters. -http.alertmanager-http-prefix string HTTP URL path under which the Alertmanager ui and api will be served. (default "/alertmanager") -http.prefix string diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 47cf5dbaf38..6bc8306dede 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -900,7 +900,7 @@ Usage of ./cmd/mimir/mimir: -help Print basic help. -help-all - Print help including also advanced and experimental flags. + Print help, also including advanced and experimental parameters. -http.alertmanager-http-prefix string HTTP URL path under which the Alertmanager ui and api will be served. (default "/alertmanager") -http.prefix string diff --git a/cmd/mimir/main.go b/cmd/mimir/main.go index ec7a5c9bad4..942dac93b1a 100644 --- a/cmd/mimir/main.go +++ b/cmd/mimir/main.go @@ -99,7 +99,7 @@ func main() { flag.BoolVar(&printModules, "modules", false, "List available values that can be used as target.") flag.BoolVar(&printHelp, "help", false, "Print basic help.") flag.BoolVar(&printHelp, "h", false, "Print basic help.") - flag.BoolVar(&printHelpAll, "help-all", false, "Print help including also advanced and experimental flags.") + flag.BoolVar(&printHelpAll, "help-all", false, "Print help, also including advanced and experimental parameters.") flag.CommandLine.Usage = func() { /* don't do anything by default, we will print usage ourselves, but only when requested. */ } flag.CommandLine.Init(flag.CommandLine.Name(), flag.ContinueOnError) From 7a4c3345a127e7644b038ae70a459fa990643ee4 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Thu, 27 Jan 2022 14:53:17 +0100 Subject: [PATCH 023/168] Mimir: Tweak help output (#917) Tweak help output when an unrecognized flag is provided, based on tech writer feedback. Signed-off-by: Arve Knudsen --- cmd/mimir/main.go | 2 +- cmd/mimir/main_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/mimir/main.go b/cmd/mimir/main.go index 942dac93b1a..440d6a1e5b3 100644 --- a/cmd/mimir/main.go +++ b/cmd/mimir/main.go @@ -105,7 +105,7 @@ func main() { flag.CommandLine.Init(flag.CommandLine.Name(), flag.ContinueOnError) if err := flag.CommandLine.Parse(os.Args[1:]); err != nil { - fmt.Fprintln(flag.CommandLine.Output(), "Run with -help to get list of available parameters") + fmt.Fprintln(flag.CommandLine.Output(), "Run with -help to get a list of available parameters") if !testMode { os.Exit(2) } diff --git a/cmd/mimir/main_test.go b/cmd/mimir/main_test.go index 835f411d101..0f14f95f87d 100644 --- a/cmd/mimir/main_test.go +++ b/cmd/mimir/main_test.go @@ -49,7 +49,7 @@ func TestFlagParsing(t *testing.T) { "unknown flag": { arguments: []string{"-unknown.flag"}, - stderrMessage: "Run with -help to get list of available parameters", + stderrMessage: "Run with -help to get a list of available parameters", stdoutExcluded: "Usage of", // No usage description on unknown flag. stderrExcluded: "Usage of", }, From b2ee51c7911dfbfb525870d9dcb1d370817019d4 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Thu, 27 Jan 2022 15:23:31 +0100 Subject: [PATCH 024/168] Added 'mimir' to default job names in the mixin (#921) * Added 'mimir' to default job names in the mixin Signed-off-by: Marco Pracucci * Fixed jobMatcher() and jobSelector() Signed-off-by: Marco Pracucci * Fix job names selector in alerts too Signed-off-by: Marco Pracucci --- CHANGELOG.md | 1 + operations/mimir-mixin-compiled/alerts.yaml | 10 +- .../dashboards/alertmanager-resources.json | 6 +- .../dashboards/mimir-alertmanager.json | 70 ++++----- .../dashboards/mimir-compactor-resources.json | 2 +- .../dashboards/mimir-compactor.json | 44 +++--- .../dashboards/mimir-queries.json | 140 +++++++++--------- .../dashboards/mimir-reads-networking.json | 60 ++++---- .../dashboards/mimir-reads-resources.json | 16 +- .../dashboards/mimir-reads.json | 124 ++++++++-------- .../dashboards/mimir-rollout-progress.json | 30 ++-- .../dashboards/mimir-ruler.json | 76 +++++----- .../dashboards/mimir-tenants.json | 50 +++---- .../dashboards/mimir-top-tenants.json | 10 +- .../dashboards/mimir-writes-networking.json | 30 ++-- .../dashboards/mimir-writes-resources.json | 8 +- .../dashboards/mimir-writes.json | 108 +++++++------- .../mimir-mixin/alerts/compactor.libsonnet | 8 +- operations/mimir-mixin/config.libsonnet | 16 +- .../dashboards/dashboard-utils.libsonnet | 4 +- .../dashboards/rollout-progress.libsonnet | 2 +- 21 files changed, 408 insertions(+), 407 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4c69a4ae8c..f22dfaeba55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -440,6 +440,7 @@ * [ENHANCEMENT] Added "Recover accidentally deleted blocks (Google Cloud specific)" playbook. #475 * [ENHANCEMENT] Added support to multi-zone store-gateway deployments. #608 #615 * [ENHANCEMENT] Show supplementary alertmanager services in the Rollout Progress dashboard. #738 #855 +* [ENHANCEMENT] Added `mimir` to default job names. This makes dashboards and alerts working when Mimir is installed in single-binary mode and the deployment is named `mimir`. #921 * [BUGFIX] Fixed `CortexIngesterHasNotShippedBlocks` alert false positive in case an ingester instance had ingested samples in the past, then no traffic was received for a long period and then it started receiving samples again. [#308](https://github.com/grafana/cortex-jsonnet/pull/308) * [BUGFIX] Fixed `CortexInconsistentRuntimeConfig` metric. [#335](https://github.com/grafana/cortex-jsonnet/pull/335) * [BUGFIX] Fixed scaling dashboard to correctly work when a Cortex service deployment spans across multiple zones (a zone is expected to have the `zone-[a-z]` suffix). [#365](https://github.com/grafana/cortex-jsonnet/pull/365) diff --git a/operations/mimir-mixin-compiled/alerts.yaml b/operations/mimir-mixin-compiled/alerts.yaml index 366584f4057..3322fdb94e2 100644 --- a/operations/mimir-mixin-compiled/alerts.yaml +++ b/operations/mimir-mixin-compiled/alerts.yaml @@ -349,7 +349,7 @@ groups: expr: | memberlist_client_cluster_members_count != on (cluster, namespace) group_left - sum by (cluster, namespace) (up{job=~".+/(compactor|distributor|ingester.*|querier.*|ruler|store-gateway.*|cortex)"}) + sum by (cluster, namespace) (up{job=~".+/(compactor|distributor|ingester.*|querier.*|ruler|store-gateway.*|cortex|mimir)"}) for: 5m labels: severity: warning @@ -619,9 +619,9 @@ groups: annotations: message: Mimir Compactor {{ $labels.instance }} in {{ $labels.cluster }}/{{ $labels.namespace }} has not uploaded any block in the last 24 hours. expr: | - (time() - thanos_objstore_bucket_last_successful_upload_time{job=~".+/compactor.*"} > 60 * 60 * 24) + (time() - thanos_objstore_bucket_last_successful_upload_time{job=~".+/(compactor.*|cortex|mimir)"} > 60 * 60 * 24) and - (thanos_objstore_bucket_last_successful_upload_time{job=~".+/compactor.*"} > 0) + (thanos_objstore_bucket_last_successful_upload_time{job=~".+/(compactor.*|cortex|mimir)"} > 0) for: 15m labels: severity: critical @@ -629,7 +629,7 @@ groups: annotations: message: Mimir Compactor {{ $labels.instance }} in {{ $labels.cluster }}/{{ $labels.namespace }} has not uploaded any block in the last 24 hours. expr: | - thanos_objstore_bucket_last_successful_upload_time{job=~".+/compactor.*"} == 0 + thanos_objstore_bucket_last_successful_upload_time{job=~".+/(compactor.*|cortex|mimir)"} == 0 for: 24h labels: severity: critical @@ -637,7 +637,7 @@ groups: annotations: message: Mimir Compactor {{ $labels.instance }} in {{ $labels.cluster }}/{{ $labels.namespace }} has found and ignored blocks with out of order chunks. expr: | - increase(cortex_compactor_blocks_marked_for_no_compaction_total{job=~".+/compactor.*", reason="block-index-out-of-order-chunk"}[5m]) > 0 + increase(cortex_compactor_blocks_marked_for_no_compaction_total{job=~".+/(compactor.*|cortex|mimir)", reason="block-index-out-of-order-chunk"}[5m]) > 0 for: 1m labels: severity: warning diff --git a/operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json b/operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json index c1b97313750..7cd6553a7f6 100644 --- a/operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json +++ b/operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json @@ -238,7 +238,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -505,7 +505,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -772,7 +772,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager-im\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager-im)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-alertmanager.json b/operations/mimir-mixin-compiled/dashboards/mimir-alertmanager.json index d394f62404d..51d2f0453cc 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-alertmanager.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-alertmanager.json @@ -59,7 +59,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cluster_job_pod:cortex_alertmanager_alerts:sum{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "sum(cluster_job_pod:cortex_alertmanager_alerts:sum{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -135,7 +135,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cluster_job_pod:cortex_alertmanager_silences:sum{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "sum(cluster_job_pod:cortex_alertmanager_silences:sum{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -211,7 +211,7 @@ "steppedLine": false, "targets": [ { - "expr": "max(cortex_alertmanager_tenants_discovered{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "max(cortex_alertmanager_tenants_discovered{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -298,7 +298,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cluster_job:cortex_alertmanager_alerts_received_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})\n-\nsum(cluster_job:cortex_alertmanager_alerts_invalid_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})\n", + "expr": "sum(cluster_job:cortex_alertmanager_alerts_received_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})\n-\nsum(cluster_job:cortex_alertmanager_alerts_invalid_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -307,7 +307,7 @@ "step": 10 }, { - "expr": "sum(cluster_job:cortex_alertmanager_alerts_invalid_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "sum(cluster_job:cortex_alertmanager_alerts_invalid_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -396,7 +396,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cluster_job_integration:cortex_alertmanager_notifications_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})\n-\nsum(cluster_job_integration:cortex_alertmanager_notifications_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})\n", + "expr": "sum(cluster_job_integration:cortex_alertmanager_notifications_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})\n-\nsum(cluster_job_integration:cortex_alertmanager_notifications_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -405,7 +405,7 @@ "step": 10 }, { - "expr": "sum(cluster_job_integration:cortex_alertmanager_notifications_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "sum(cluster_job_integration:cortex_alertmanager_notifications_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -482,7 +482,7 @@ "steppedLine": false, "targets": [ { - "expr": "(\nsum(cluster_job_integration:cortex_alertmanager_notifications_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}) by(integration)\n-\nsum(cluster_job_integration:cortex_alertmanager_notifications_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}) by(integration)\n) > 0\nor on () vector(0)\n", + "expr": "(\nsum(cluster_job_integration:cortex_alertmanager_notifications_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}) by(integration)\n-\nsum(cluster_job_integration:cortex_alertmanager_notifications_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}) by(integration)\n) > 0\nor on () vector(0)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -491,7 +491,7 @@ "step": 10 }, { - "expr": "sum(cluster_job_integration:cortex_alertmanager_notifications_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}) by(integration)", + "expr": "sum(cluster_job_integration:cortex_alertmanager_notifications_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}) by(integration)", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -568,7 +568,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_alertmanager_notification_latency_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_alertmanager_notification_latency_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -577,7 +577,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_alertmanager_notification_latency_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_alertmanager_notification_latency_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -586,7 +586,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_alertmanager_notification_latency_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_alertmanager_notification_latency_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_alertmanager_notification_latency_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_alertmanager_notification_latency_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -683,7 +683,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_v1_alerts|alertmanager\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_v1_alerts|alertmanager\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -760,7 +760,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_v1_alerts|alertmanager\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_v1_alerts|alertmanager\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -768,7 +768,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_v1_alerts|alertmanager\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_v1_alerts|alertmanager\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -776,7 +776,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_v1_alerts|alertmanager\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_v1_alerts|alertmanager\"})", + "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_v1_alerts|alertmanager\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_v1_alerts|alertmanager\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -1612,7 +1612,7 @@ "steppedLine": false, "targets": [ { - "expr": "max by(pod) (cortex_alertmanager_tenants_owned{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "max by(pod) (cortex_alertmanager_tenants_owned{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1689,7 +1689,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (cluster_job_pod:cortex_alertmanager_alerts:sum{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "sum by(pod) (cluster_job_pod:cortex_alertmanager_alerts:sum{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1766,7 +1766,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (cluster_job_pod:cortex_alertmanager_silences:sum{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "sum by(pod) (cluster_job_pod:cortex_alertmanager_silences:sum{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1855,7 +1855,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_alertmanager_sync_configs_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))\n-\nsum(rate(cortex_alertmanager_sync_configs_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_alertmanager_sync_configs_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))\n-\nsum(rate(cortex_alertmanager_sync_configs_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1864,7 +1864,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_alertmanager_sync_configs_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_alertmanager_sync_configs_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1941,7 +1941,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(reason) (rate(cortex_alertmanager_sync_configs_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))", + "expr": "sum by(reason) (rate(cortex_alertmanager_sync_configs_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2018,7 +2018,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum (rate(cortex_alertmanager_ring_check_errors_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))", + "expr": "sum (rate(cortex_alertmanager_ring_check_errors_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2107,7 +2107,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(outcome) (rate(cortex_alertmanager_state_initial_sync_completed_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))", + "expr": "sum by(outcome) (rate(cortex_alertmanager_state_initial_sync_completed_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))", "format": "time_series", "interval": "1m", "intervalFactor": 2, @@ -2184,7 +2184,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_alertmanager_state_initial_sync_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_alertmanager_state_initial_sync_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "1m", "intervalFactor": 2, @@ -2193,7 +2193,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_alertmanager_state_initial_sync_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_alertmanager_state_initial_sync_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "1m", "intervalFactor": 2, @@ -2202,7 +2202,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_alertmanager_state_initial_sync_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_alertmanager_state_initial_sync_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_alertmanager_state_initial_sync_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_alertmanager_state_initial_sync_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))", "format": "time_series", "interval": "1m", "intervalFactor": 2, @@ -2279,7 +2279,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_alertmanager_state_fetch_replica_state_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))\n-\nsum(rate(cortex_alertmanager_state_fetch_replica_state_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_alertmanager_state_fetch_replica_state_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))\n-\nsum(rate(cortex_alertmanager_state_fetch_replica_state_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))\n", "format": "time_series", "interval": "1m", "intervalFactor": 2, @@ -2288,7 +2288,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_alertmanager_state_fetch_replica_state_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_alertmanager_state_fetch_replica_state_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))", "format": "time_series", "interval": "1m", "intervalFactor": 2, @@ -2377,7 +2377,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cluster_job:cortex_alertmanager_state_replication_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})\n-\nsum(cluster_job:cortex_alertmanager_state_replication_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})\n", + "expr": "sum(cluster_job:cortex_alertmanager_state_replication_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})\n-\nsum(cluster_job:cortex_alertmanager_state_replication_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2386,7 +2386,7 @@ "step": 10 }, { - "expr": "sum(cluster_job:cortex_alertmanager_state_replication_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "sum(cluster_job:cortex_alertmanager_state_replication_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2463,7 +2463,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cluster_job:cortex_alertmanager_partial_state_merges_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})\n-\nsum(cluster_job:cortex_alertmanager_partial_state_merges_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})\n", + "expr": "sum(cluster_job:cortex_alertmanager_partial_state_merges_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})\n-\nsum(cluster_job:cortex_alertmanager_partial_state_merges_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2472,7 +2472,7 @@ "step": 10 }, { - "expr": "sum(cluster_job:cortex_alertmanager_partial_state_merges_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"})", + "expr": "sum(cluster_job:cortex_alertmanager_partial_state_merges_failed_total:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2549,7 +2549,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_alertmanager_state_persist_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))\n-\nsum(rate(cortex_alertmanager_state_persist_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_alertmanager_state_persist_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))\n-\nsum(rate(cortex_alertmanager_state_persist_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2558,7 +2558,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_alertmanager_state_persist_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/alertmanager\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_alertmanager_state_persist_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(alertmanager)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-compactor-resources.json b/operations/mimir-mixin-compiled/dashboards/mimir-compactor-resources.json index c2db5cc4dc4..ebbf4c0a2a1 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-compactor-resources.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-compactor-resources.json @@ -238,7 +238,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-compactor.json b/operations/mimir-mixin-compiled/dashboards/mimir-compactor.json index 8b4987d9e61..a8008d39933 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-compactor.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-compactor.json @@ -63,7 +63,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_compactor_runs_started_total{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_compactor_runs_started_total{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -72,7 +72,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_compactor_runs_completed_total{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_compactor_runs_completed_total{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -81,7 +81,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_compactor_runs_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_compactor_runs_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -159,7 +159,7 @@ "steppedLine": false, "targets": [ { - "expr": "(\n cortex_compactor_tenants_processing_succeeded{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"} +\n cortex_compactor_tenants_processing_failed{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"} +\n cortex_compactor_tenants_skipped{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}\n) / cortex_compactor_tenants_discovered{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}\n", + "expr": "(\n cortex_compactor_tenants_processing_succeeded{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"} +\n cortex_compactor_tenants_processing_failed{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"} +\n cortex_compactor_tenants_skipped{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}\n) / cortex_compactor_tenants_discovered{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -249,7 +249,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(prometheus_tsdb_compactions_total{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(prometheus_tsdb_compactions_total{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -327,7 +327,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(prometheus_tsdb_compaction_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(prometheus_tsdb_compaction_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -336,7 +336,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(prometheus_tsdb_compaction_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(prometheus_tsdb_compaction_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -345,7 +345,7 @@ "step": 10 }, { - "expr": "sum(rate(prometheus_tsdb_compaction_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval])) * 1e3 / sum(rate(prometheus_tsdb_compaction_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(prometheus_tsdb_compaction_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval])) * 1e3 / sum(rate(prometheus_tsdb_compaction_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -434,7 +434,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(max by(user) (cortex_bucket_blocks_count{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}))", + "expr": "avg(max by(user) (cortex_bucket_blocks_count{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -512,7 +512,7 @@ "steppedLine": false, "targets": [ { - "expr": "topk(10, max by(user) (cortex_bucket_blocks_count{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}))", + "expr": "topk(10, max by(user) (cortex_bucket_blocks_count{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -601,7 +601,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_compactor_blocks_marked_for_deletion_total{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_compactor_blocks_marked_for_deletion_total{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -681,7 +681,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_compactor_blocks_cleaned_total{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_compactor_blocks_cleaned_total{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -690,7 +690,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_compactor_block_cleanup_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_compactor_block_cleanup_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -782,7 +782,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_compactor_meta_syncs_total{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval])) - sum(rate(cortex_compactor_meta_sync_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_compactor_meta_syncs_total{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval])) - sum(rate(cortex_compactor_meta_sync_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -791,7 +791,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_compactor_meta_sync_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_compactor_meta_sync_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -868,7 +868,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_compactor_meta_sync_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_compactor_meta_sync_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -877,7 +877,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_compactor_meta_sync_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_compactor_meta_sync_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -886,7 +886,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_compactor_meta_sync_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_compactor_meta_sync_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_compactor_meta_sync_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_compactor_meta_sync_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1731,7 +1731,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\", kv_name=~\".+\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\", kv_name=~\".+\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1808,7 +1808,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\", kv_name=~\".+\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\", kv_name=~\".+\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1817,7 +1817,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\", kv_name=~\".+\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\", kv_name=~\".+\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1826,7 +1826,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\", kv_name=~\".+\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/compactor.*\", kv_name=~\".+\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\", kv_name=~\".+\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(compactor.*|cortex|mimir)\", kv_name=~\".+\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-queries.json b/operations/mimir-mixin-compiled/dashboards/mimir-queries.json index 6c6e84a2dcc..5d44330f585 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-queries.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-queries.json @@ -58,7 +58,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_query_frontend_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_query_frontend_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -67,7 +67,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_query_frontend_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_query_frontend_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -76,7 +76,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_query_frontend_queue_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_query_frontend_queue_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_query_frontend_queue_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_query_frontend_queue_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -153,7 +153,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_query_frontend_retries_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.99, sum(rate(cortex_query_frontend_retries_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -162,7 +162,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_query_frontend_retries_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.50, sum(rate(cortex_query_frontend_retries_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -171,7 +171,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_query_frontend_retries_sum{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])) * 1 / sum(rate(cortex_query_frontend_retries_count{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_query_frontend_retries_sum{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])) * 1 / sum(rate(cortex_query_frontend_retries_count{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -248,7 +248,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (cortex_query_frontend_queue_length{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"})", + "expr": "sum by(pod) (cortex_query_frontend_queue_length{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -325,7 +325,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(user) (cortex_query_frontend_queue_length{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}) > 0", + "expr": "sum by(user) (cortex_query_frontend_queue_length{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}) > 0", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -414,7 +414,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_query_scheduler_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_query_scheduler_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -423,7 +423,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_query_scheduler_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_query_scheduler_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -432,7 +432,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_query_scheduler_queue_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_query_scheduler_queue_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_query_scheduler_queue_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_query_scheduler_queue_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -509,7 +509,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (cortex_query_scheduler_queue_length{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"})", + "expr": "sum by(pod) (cortex_query_scheduler_queue_length{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -586,7 +586,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(user) (cortex_query_scheduler_queue_length{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}) > 0", + "expr": "sum by(user) (cortex_query_scheduler_queue_length{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}) > 0", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -676,7 +676,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_frontend_split_queries_total{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[1m])) / sum(rate(cortex_frontend_query_range_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", method=\"split_by_interval\"}[1m]))", + "expr": "sum(rate(cortex_frontend_split_queries_total{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[1m])) / sum(rate(cortex_frontend_query_range_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", method=\"split_by_interval\"}[1m]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -753,7 +753,7 @@ "steppedLine": false, "targets": [ { - "expr": "# Query metrics before and after migration to new memcached backend.\nsum (\n rate(cortex_cache_hits{name=~\"frontend.+\", cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[1m])\n or\n rate(thanos_cache_memcached_hits_total{name=\"frontend-cache\", cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[1m])\n)\n/\nsum (\n rate(cortex_cache_fetched_keys{name=~\"frontend.+\", cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[1m])\n or\n rate(thanos_cache_memcached_requests_total{name=~\"frontend-cache\", cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[1m])\n)\n", + "expr": "# Query metrics before and after migration to new memcached backend.\nsum (\n rate(cortex_cache_hits{name=~\"frontend.+\", cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[1m])\n or\n rate(thanos_cache_memcached_hits_total{name=\"frontend-cache\", cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[1m])\n)\n/\nsum (\n rate(cortex_cache_fetched_keys{name=~\"frontend.+\", cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[1m])\n or\n rate(thanos_cache_memcached_requests_total{name=~\"frontend-cache\", cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[1m])\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -830,7 +830,7 @@ "steppedLine": false, "targets": [ { - "expr": "# Query metrics before and after migration to new memcached backend.\nsum (\n rate(cortex_cache_fetched_keys{name=~\"frontend.+\", cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[1m])\n or\n rate(thanos_cache_memcached_requests_total{name=\"frontend-cache\", cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[1m])\n)\n-\nsum (\n rate(cortex_cache_hits{name=~\"frontend.+\", cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[1m])\n or\n rate(thanos_cache_memcached_hits_total{name=~\"frontend-cache\", cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[1m])\n)\n", + "expr": "# Query metrics before and after migration to new memcached backend.\nsum (\n rate(cortex_cache_fetched_keys{name=~\"frontend.+\", cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[1m])\n or\n rate(thanos_cache_memcached_requests_total{name=\"frontend-cache\", cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[1m])\n)\n-\nsum (\n rate(cortex_cache_hits{name=~\"frontend.+\", cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[1m])\n or\n rate(thanos_cache_memcached_hits_total{name=~\"frontend-cache\", cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[1m])\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -920,7 +920,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_frontend_query_sharding_rewrites_succeeded_total{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])) /\nsum(rate(cortex_frontend_query_sharding_rewrites_attempted_total{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_frontend_query_sharding_rewrites_succeeded_total{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])) /\nsum(rate(cortex_frontend_query_sharding_rewrites_attempted_total{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval]))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -998,7 +998,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_frontend_sharded_queries_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.99, sum(rate(cortex_frontend_sharded_queries_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1007,7 +1007,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_frontend_sharded_queries_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.50, sum(rate(cortex_frontend_sharded_queries_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1016,7 +1016,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_frontend_sharded_queries_per_query_sum{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])) * 1 / sum(rate(cortex_frontend_sharded_queries_per_query_count{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_frontend_sharded_queries_per_query_sum{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])) * 1 / sum(rate(cortex_frontend_sharded_queries_per_query_count{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1105,7 +1105,7 @@ "steppedLine": false, "targets": [ { - "expr": "max by (slice) (prometheus_engine_query_duration_seconds{quantile=\"0.9\",cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}) * 1e3", + "expr": "max by (slice) (prometheus_engine_query_duration_seconds{quantile=\"0.9\",cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1194,7 +1194,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job:cortex_ingester_queried_series_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})) * 1", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job:cortex_ingester_queried_series_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})) * 1", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -1202,7 +1202,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job:cortex_ingester_queried_series_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})) * 1", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job:cortex_ingester_queried_series_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})) * 1", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -1210,7 +1210,7 @@ "step": 10 }, { - "expr": "1 * sum(cluster_job:cortex_ingester_queried_series_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}) / sum(cluster_job:cortex_ingester_queried_series_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "expr": "1 * sum(cluster_job:cortex_ingester_queried_series_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}) / sum(cluster_job:cortex_ingester_queried_series_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -1286,7 +1286,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job:cortex_ingester_queried_chunks_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})) * 1", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job:cortex_ingester_queried_chunks_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})) * 1", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -1294,7 +1294,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job:cortex_ingester_queried_chunks_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})) * 1", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job:cortex_ingester_queried_chunks_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})) * 1", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -1302,7 +1302,7 @@ "step": 10 }, { - "expr": "1 * sum(cluster_job:cortex_ingester_queried_chunks_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}) / sum(cluster_job:cortex_ingester_queried_chunks_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "expr": "1 * sum(cluster_job:cortex_ingester_queried_chunks_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}) / sum(cluster_job:cortex_ingester_queried_chunks_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -1378,7 +1378,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job:cortex_ingester_queried_samples_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})) * 1", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job:cortex_ingester_queried_samples_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})) * 1", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -1386,7 +1386,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job:cortex_ingester_queried_samples_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})) * 1", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job:cortex_ingester_queried_samples_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})) * 1", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -1394,7 +1394,7 @@ "step": 10 }, { - "expr": "1 * sum(cluster_job:cortex_ingester_queried_samples_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}) / sum(cluster_job:cortex_ingester_queried_samples_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "expr": "1 * sum(cluster_job:cortex_ingester_queried_samples_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}) / sum(cluster_job:cortex_ingester_queried_samples_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -1470,7 +1470,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job:cortex_ingester_queried_exemplars_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})) * 1", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job:cortex_ingester_queried_exemplars_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})) * 1", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -1478,7 +1478,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job:cortex_ingester_queried_exemplars_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})) * 1", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job:cortex_ingester_queried_exemplars_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})) * 1", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -1486,7 +1486,7 @@ "step": 10 }, { - "expr": "1 * sum(cluster_job:cortex_ingester_queried_exemplars_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}) / sum(cluster_job:cortex_ingester_queried_exemplars_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "expr": "1 * sum(cluster_job:cortex_ingester_queried_exemplars_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}) / sum(cluster_job:cortex_ingester_queried_exemplars_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -1574,7 +1574,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_querier_storegateway_instances_hit_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.99, sum(rate(cortex_querier_storegateway_instances_hit_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1583,7 +1583,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_querier_storegateway_instances_hit_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.50, sum(rate(cortex_querier_storegateway_instances_hit_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1592,7 +1592,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_querier_storegateway_instances_hit_per_query_sum{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval])) * 1 / sum(rate(cortex_querier_storegateway_instances_hit_per_query_count{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_querier_storegateway_instances_hit_per_query_sum{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval])) * 1 / sum(rate(cortex_querier_storegateway_instances_hit_per_query_count{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1669,7 +1669,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_querier_storegateway_refetches_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.99, sum(rate(cortex_querier_storegateway_refetches_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1678,7 +1678,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_querier_storegateway_refetches_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.50, sum(rate(cortex_querier_storegateway_refetches_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1687,7 +1687,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_querier_storegateway_refetches_per_query_sum{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval])) * 1 / sum(rate(cortex_querier_storegateway_refetches_per_query_count{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_querier_storegateway_refetches_per_query_sum{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval])) * 1 / sum(rate(cortex_querier_storegateway_refetches_per_query_count{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1764,7 +1764,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_querier_blocks_consistency_checks_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[1m])) / sum(rate(cortex_querier_blocks_consistency_checks_total{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[1m]))", + "expr": "sum(rate(cortex_querier_blocks_consistency_checks_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[1m])) / sum(rate(cortex_querier_blocks_consistency_checks_total{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[1m]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1853,7 +1853,7 @@ "steppedLine": false, "targets": [ { - "expr": "max(cortex_bucket_index_loaded{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "expr": "max(cortex_bucket_index_loaded{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1862,7 +1862,7 @@ "step": 10 }, { - "expr": "min(cortex_bucket_index_loaded{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "expr": "min(cortex_bucket_index_loaded{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1871,7 +1871,7 @@ "step": 10 }, { - "expr": "avg(cortex_bucket_index_loaded{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "expr": "avg(cortex_bucket_index_loaded{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1951,7 +1951,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_bucket_index_loads_total{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval])) - sum(rate(cortex_bucket_index_load_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_index_loads_total{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval])) - sum(rate(cortex_bucket_index_load_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1960,7 +1960,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_bucket_index_load_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_index_load_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2037,7 +2037,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_bucket_index_load_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_bucket_index_load_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2046,7 +2046,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_bucket_index_load_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_bucket_index_load_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2055,7 +2055,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_bucket_index_load_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_bucket_index_load_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_index_load_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_bucket_index_load_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2144,7 +2144,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_bucket_store_series_blocks_queried_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_store_series_blocks_queried_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2221,7 +2221,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(data_type) (rate(cortex_bucket_store_series_data_fetched_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum by(data_type) (rate(cortex_bucket_store_series_data_fetched_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2298,7 +2298,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(data_type) (rate(cortex_bucket_store_series_data_touched_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum by(data_type) (rate(cortex_bucket_store_series_data_touched_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2387,7 +2387,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_bucket_store_series_get_all_duration_seconds_bucket{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_bucket_store_series_get_all_duration_seconds_bucket{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2396,7 +2396,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_bucket_store_series_get_all_duration_seconds_bucket{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_bucket_store_series_get_all_duration_seconds_bucket{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2405,7 +2405,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_bucket_store_series_get_all_duration_seconds_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_bucket_store_series_get_all_duration_seconds_count{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_store_series_get_all_duration_seconds_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_bucket_store_series_get_all_duration_seconds_count{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2482,7 +2482,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_bucket_store_series_merge_duration_seconds_bucket{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_bucket_store_series_merge_duration_seconds_bucket{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2491,7 +2491,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_bucket_store_series_merge_duration_seconds_bucket{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_bucket_store_series_merge_duration_seconds_bucket{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2500,7 +2500,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_bucket_store_series_merge_duration_seconds_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_bucket_store_series_merge_duration_seconds_count{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_store_series_merge_duration_seconds_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_bucket_store_series_merge_duration_seconds_count{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2577,7 +2577,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_bucket_store_series_result_series_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) / sum(rate(cortex_bucket_store_series_result_series_count{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_store_series_result_series_sum{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) / sum(rate(cortex_bucket_store_series_result_series_count{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2666,7 +2666,7 @@ "steppedLine": false, "targets": [ { - "expr": "cortex_bucket_store_blocks_loaded{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}", + "expr": "cortex_bucket_store_blocks_loaded{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2746,7 +2746,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_bucket_store_block_loads_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) - sum(rate(cortex_bucket_store_block_load_failures_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_store_block_loads_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) - sum(rate(cortex_bucket_store_block_load_failures_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2755,7 +2755,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_bucket_store_block_load_failures_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_store_block_load_failures_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2835,7 +2835,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_bucket_store_block_drops_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) - sum(rate(cortex_bucket_store_block_drop_failures_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_store_block_drops_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) - sum(rate(cortex_bucket_store_block_drop_failures_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2844,7 +2844,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_bucket_store_block_drop_failures_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_store_block_drop_failures_total{component=\"store-gateway\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2933,7 +2933,7 @@ "steppedLine": false, "targets": [ { - "expr": "cortex_bucket_store_indexheader_lazy_load_total{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"} - cortex_bucket_store_indexheader_lazy_unload_total{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}", + "expr": "cortex_bucket_store_indexheader_lazy_load_total{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"} - cortex_bucket_store_indexheader_lazy_unload_total{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -3010,7 +3010,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_bucket_store_indexheader_lazy_load_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_bucket_store_indexheader_lazy_load_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -3019,7 +3019,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_bucket_store_indexheader_lazy_load_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_bucket_store_indexheader_lazy_load_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -3028,7 +3028,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_bucket_store_indexheader_lazy_load_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_bucket_store_indexheader_lazy_load_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_bucket_store_indexheader_lazy_load_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_bucket_store_indexheader_lazy_load_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -3117,7 +3117,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_bucket_store_series_hash_cache_hits_total{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))\n/\nsum(rate(cortex_bucket_store_series_hash_cache_requests_total{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_bucket_store_series_hash_cache_hits_total{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))\n/\nsum(rate(cortex_bucket_store_series_hash_cache_requests_total{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -3194,7 +3194,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(thanos_store_index_cache_hits_total{item_type=\"ExpandedPostings\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))\n/\nsum(rate(thanos_store_index_cache_requests_total{item_type=\"ExpandedPostings\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))\n", + "expr": "sum(rate(thanos_store_index_cache_hits_total{item_type=\"ExpandedPostings\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))\n/\nsum(rate(thanos_store_index_cache_requests_total{item_type=\"ExpandedPostings\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -3271,7 +3271,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_cache_memory_hits_total{name=\"chunks-attributes-cache\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))\n/\nsum(rate(cortex_cache_memory_requests_total{name=\"chunks-attributes-cache\",cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_cache_memory_hits_total{name=\"chunks-attributes-cache\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))\n/\nsum(rate(cortex_cache_memory_requests_total{name=\"chunks-attributes-cache\",cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}[$__rate_interval]))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json b/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json index 130d30a5f94..9a662f4690d 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json @@ -212,7 +212,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -221,7 +221,7 @@ "step": 10 }, { - "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -298,7 +298,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"}))", + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -307,7 +307,7 @@ "step": 10 }, { - "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"}))", + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -316,7 +316,7 @@ "step": 10 }, { - "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -559,7 +559,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"})", + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -568,7 +568,7 @@ "step": 10 }, { - "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"})", + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -645,7 +645,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}))", + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -654,7 +654,7 @@ "step": 10 }, { - "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}))", + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -663,7 +663,7 @@ "step": 10 }, { - "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"})", + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -906,7 +906,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"})", + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -915,7 +915,7 @@ "step": 10 }, { - "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"})", + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -992,7 +992,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}))", + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1001,7 +1001,7 @@ "step": 10 }, { - "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}))", + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1010,7 +1010,7 @@ "step": 10 }, { - "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"})", + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1253,7 +1253,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1262,7 +1262,7 @@ "step": 10 }, { - "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1339,7 +1339,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}))", + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1348,7 +1348,7 @@ "step": 10 }, { - "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"}))", + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1357,7 +1357,7 @@ "step": 10 }, { - "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1600,7 +1600,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"})", + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1609,7 +1609,7 @@ "step": 10 }, { - "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"})", + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1686,7 +1686,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}))", + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1695,7 +1695,7 @@ "step": 10 }, { - "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"}))", + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1704,7 +1704,7 @@ "step": 10 }, { - "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"})", + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1947,7 +1947,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"})", + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1956,7 +1956,7 @@ "step": 10 }, { - "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"})", + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2033,7 +2033,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}))", + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2042,7 +2042,7 @@ "step": 10 }, { - "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}))", + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2051,7 +2051,7 @@ "step": 10 }, { - "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"})", + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json b/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json index 604617bd41c..534b9b948b0 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json @@ -238,7 +238,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -505,7 +505,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -772,7 +772,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1039,7 +1039,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1306,7 +1306,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1393,7 +1393,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"})", + "expr": "sum by(pod) (cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1662,7 +1662,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1929,7 +1929,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-reads.json b/operations/mimir-mixin-compiled/dashboards/mimir-reads.json index 8d51d5ed37a..706a70619c4 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-reads.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-reads.json @@ -83,7 +83,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(\n rate(\n cortex_request_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\",\n route=~\"(prometheus|api_prom)_api_v1_query\"\n }[$__rate_interval]\n )\n or\n rate(\n cortex_prometheus_rule_evaluations_total{\n cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"\n }[$__rate_interval]\n )\n)\n", + "expr": "sum(\n rate(\n cortex_request_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\",\n route=~\"(prometheus|api_prom)_api_v1_query\"\n }[$__rate_interval]\n )\n or\n rate(\n cortex_prometheus_rule_evaluations_total{\n cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"\n }[$__rate_interval]\n )\n)\n", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -160,7 +160,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(\n rate(\n cortex_request_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\",\n route=~\"(prometheus|api_prom)_api_v1_query_range\"\n }[$__rate_interval]\n )\n)\n", + "expr": "sum(\n rate(\n cortex_request_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\",\n route=~\"(prometheus|api_prom)_api_v1_query_range\"\n }[$__rate_interval]\n )\n)\n", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -255,7 +255,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -332,7 +332,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -340,7 +340,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -348,7 +348,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"})", + "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -418,7 +418,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval])))", + "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval])))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -513,7 +513,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -590,7 +590,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -598,7 +598,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -606,7 +606,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"})", + "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -676,7 +676,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval])))", + "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval])))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -782,7 +782,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_query_scheduler_queue_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_query_scheduler_queue_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -859,7 +859,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_query_scheduler_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_query_scheduler_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -868,7 +868,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_query_scheduler_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_query_scheduler_queue_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -877,7 +877,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_query_scheduler_queue_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_query_scheduler_queue_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/query-scheduler.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_query_scheduler_queue_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_query_scheduler_queue_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(query-scheduler.*)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -966,7 +966,7 @@ "steppedLine": false, "targets": [ { - "expr": "# Query metrics before and after migration to new memcached backend.\nsum (\n rate(cortex_cache_request_duration_seconds_count{name=~\"frontend.+\", cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])\n or\n rate(thanos_memcached_operation_duration_seconds_count{name=\"frontend-cache\", cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\"}[$__rate_interval])\n)\n", + "expr": "# Query metrics before and after migration to new memcached backend.\nsum (\n rate(cortex_cache_request_duration_seconds_count{name=~\"frontend.+\", cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])\n or\n rate(thanos_memcached_operation_duration_seconds_count{name=\"frontend-cache\", cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\"}[$__rate_interval])\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1043,7 +1043,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_method:cortex_cache_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", method=~\"frontend.+\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_method:cortex_cache_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", method=~\"frontend.+\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -1051,7 +1051,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_method:cortex_cache_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", method=~\"frontend.+\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_method:cortex_cache_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", method=~\"frontend.+\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -1059,7 +1059,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_method:cortex_cache_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", method=~\"frontend.+\"}) / sum(cluster_job_method:cortex_cache_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", method=~\"frontend.+\"})", + "expr": "1e3 * sum(cluster_job_method:cortex_cache_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", method=~\"frontend.+\"}) / sum(cluster_job_method:cortex_cache_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", method=~\"frontend.+\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -1135,7 +1135,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(thanos_memcached_operation_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", name=\"frontend-cache\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(thanos_memcached_operation_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", name=\"frontend-cache\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1144,7 +1144,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(thanos_memcached_operation_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", name=\"frontend-cache\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(thanos_memcached_operation_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", name=\"frontend-cache\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1153,7 +1153,7 @@ "step": 10 }, { - "expr": "sum(rate(thanos_memcached_operation_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", name=\"frontend-cache\"}[$__rate_interval])) * 1e3 / sum(rate(thanos_memcached_operation_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(query-frontend.*|cortex$)\", name=\"frontend-cache\"}[$__rate_interval]))", + "expr": "sum(rate(thanos_memcached_operation_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", name=\"frontend-cache\"}[$__rate_interval])) * 1e3 / sum(rate(thanos_memcached_operation_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((query-frontend.*|cortex|mimir))\", name=\"frontend-cache\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1250,7 +1250,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_querier_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_querier_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1327,7 +1327,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_querier_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_querier_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -1335,7 +1335,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_querier_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_querier_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -1343,7 +1343,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_route:cortex_querier_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}) / sum(cluster_job_route:cortex_querier_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"})", + "expr": "1e3 * sum(cluster_job_route:cortex_querier_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}) / sum(cluster_job_route:cortex_querier_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -1413,7 +1413,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_querier_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval])))", + "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_querier_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval])))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1508,7 +1508,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\",route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\",route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1585,7 +1585,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -1593,7 +1593,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -1601,7 +1601,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"})", + "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -1671,7 +1671,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"}[$__rate_interval])))", + "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", route=~\"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata\"}[$__rate_interval])))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1766,7 +1766,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",route=~\"/gatewaypb.StoreGateway/.*\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",route=~\"/gatewaypb.StoreGateway/.*\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1843,7 +1843,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\", route=~\"/gatewaypb.StoreGateway/.*\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\", route=~\"/gatewaypb.StoreGateway/.*\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -1851,7 +1851,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\", route=~\"/gatewaypb.StoreGateway/.*\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\", route=~\"/gatewaypb.StoreGateway/.*\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -1859,7 +1859,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\", route=~\"/gatewaypb.StoreGateway/.*\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\", route=~\"/gatewaypb.StoreGateway/.*\"})", + "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\", route=~\"/gatewaypb.StoreGateway/.*\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\", route=~\"/gatewaypb.StoreGateway/.*\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -1929,7 +1929,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\", route=~\"/gatewaypb.StoreGateway/.*\"}[$__rate_interval])))", + "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\", route=~\"/gatewaypb.StoreGateway/.*\"}[$__rate_interval])))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2024,7 +2024,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\", kv_name=~\"store-gateway\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\", kv_name=~\"store-gateway\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2101,7 +2101,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\", kv_name=~\"store-gateway\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\", kv_name=~\"store-gateway\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2110,7 +2110,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\", kv_name=~\"store-gateway\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\", kv_name=~\"store-gateway\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2119,7 +2119,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\", kv_name=~\"store-gateway\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\", kv_name=~\"store-gateway\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\", kv_name=~\"store-gateway\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\", kv_name=~\"store-gateway\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2208,7 +2208,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(operation) (\n rate(\n thanos_memcached_operations_total{\n component=\"store-gateway\",\n name=\"index-cache\",\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"\n }[$__rate_interval]\n )\n)\n", + "expr": "sum by(operation) (\n rate(\n thanos_memcached_operations_total{\n component=\"store-gateway\",\n name=\"index-cache\",\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"\n }[$__rate_interval]\n )\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2285,7 +2285,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"index-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"index-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2294,7 +2294,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"index-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"index-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2303,7 +2303,7 @@ "step": 10 }, { - "expr": "sum(rate(thanos_memcached_operation_duration_seconds_sum{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"index-cache\"\n}\n[$__rate_interval])) * 1e3 / sum(rate(thanos_memcached_operation_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"index-cache\"\n}\n[$__rate_interval]))", + "expr": "sum(rate(thanos_memcached_operation_duration_seconds_sum{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"index-cache\"\n}\n[$__rate_interval])) * 1e3 / sum(rate(thanos_memcached_operation_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"index-cache\"\n}\n[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2381,7 +2381,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(item_type) (\n rate(\n thanos_store_index_cache_hits_total{\n component=\"store-gateway\",\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"\n }[$__rate_interval]\n )\n)\n/\nsum by(item_type) (\n rate(\n thanos_store_index_cache_requests_total{\n component=\"store-gateway\",\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\"\n }[$__rate_interval]\n )\n)\n", + "expr": "sum by(item_type) (\n rate(\n thanos_store_index_cache_hits_total{\n component=\"store-gateway\",\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"\n }[$__rate_interval]\n )\n)\n/\nsum by(item_type) (\n rate(\n thanos_store_index_cache_requests_total{\n component=\"store-gateway\",\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\"\n }[$__rate_interval]\n )\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2470,7 +2470,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(operation) (\n rate(\n thanos_memcached_operations_total{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n }[$__rate_interval]\n )\n)\n", + "expr": "sum by(operation) (\n rate(\n thanos_memcached_operations_total{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n }[$__rate_interval]\n )\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2547,7 +2547,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2556,7 +2556,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2565,7 +2565,7 @@ "step": 10 }, { - "expr": "sum(rate(thanos_memcached_operation_duration_seconds_sum{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n}\n[$__rate_interval])) * 1e3 / sum(rate(thanos_memcached_operation_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n}\n[$__rate_interval]))", + "expr": "sum(rate(thanos_memcached_operation_duration_seconds_sum{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n}\n[$__rate_interval])) * 1e3 / sum(rate(thanos_memcached_operation_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n}\n[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2642,7 +2642,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(\n rate(\n thanos_cache_memcached_hits_total{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n }[$__rate_interval]\n )\n)\n/\nsum(\n rate(\n thanos_cache_memcached_requests_total{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n }[$__rate_interval]\n )\n)\n", + "expr": "sum(\n rate(\n thanos_cache_memcached_hits_total{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n }[$__rate_interval]\n )\n)\n/\nsum(\n rate(\n thanos_cache_memcached_requests_total{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n component=\"store-gateway\",\n name=\"chunks-cache\"\n }[$__rate_interval]\n )\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2731,7 +2731,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(operation) (\n rate(\n thanos_memcached_operations_total{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n", + "expr": "sum by(operation) (\n rate(\n thanos_memcached_operations_total{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2808,7 +2808,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2817,7 +2817,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2826,7 +2826,7 @@ "step": 10 }, { - "expr": "sum(rate(thanos_memcached_operation_duration_seconds_sum{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) * 1e3 / sum(rate(thanos_memcached_operation_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n}\n[$__rate_interval]))", + "expr": "sum(rate(thanos_memcached_operation_duration_seconds_sum{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) * 1e3 / sum(rate(thanos_memcached_operation_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n}\n[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2903,7 +2903,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(\n rate(\n thanos_cache_memcached_hits_total{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n/\nsum(\n rate(\n thanos_cache_memcached_requests_total{\n cluster=~\"$cluster\", job=~\"($namespace)/(store-gateway.*|cortex$)\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n", + "expr": "sum(\n rate(\n thanos_cache_memcached_hits_total{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n/\nsum(\n rate(\n thanos_cache_memcached_requests_total{\n cluster=~\"$cluster\", job=~\"($namespace)/((store-gateway.*|cortex|mimir))\",\n component=\"store-gateway\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2992,7 +2992,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(operation) (\n rate(\n thanos_memcached_operations_total{\n cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\",\n component=\"querier\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n", + "expr": "sum by(operation) (\n rate(\n thanos_memcached_operations_total{\n cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\",\n component=\"querier\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -3069,7 +3069,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\",\n operation=\"getmulti\",\n component=\"querier\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"querier\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -3078,7 +3078,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\",\n operation=\"getmulti\",\n component=\"querier\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(thanos_memcached_operation_duration_seconds_bucket{\n cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"querier\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -3087,7 +3087,7 @@ "step": 10 }, { - "expr": "sum(rate(thanos_memcached_operation_duration_seconds_sum{\n cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\",\n operation=\"getmulti\",\n component=\"querier\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) * 1e3 / sum(rate(thanos_memcached_operation_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\",\n operation=\"getmulti\",\n component=\"querier\",\n name=\"metadata-cache\"\n}\n[$__rate_interval]))", + "expr": "sum(rate(thanos_memcached_operation_duration_seconds_sum{\n cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"querier\",\n name=\"metadata-cache\"\n}\n[$__rate_interval])) * 1e3 / sum(rate(thanos_memcached_operation_duration_seconds_count{\n cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\",\n operation=\"getmulti\",\n component=\"querier\",\n name=\"metadata-cache\"\n}\n[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -3164,7 +3164,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(\n rate(\n thanos_cache_memcached_hits_total{\n cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\",\n component=\"querier\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n/\nsum(\n rate(\n thanos_cache_memcached_requests_total{\n cluster=~\"$cluster\", job=~\"($namespace)/(querier.*|cortex$)\",\n component=\"querier\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n", + "expr": "sum(\n rate(\n thanos_cache_memcached_hits_total{\n cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\",\n component=\"querier\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n/\nsum(\n rate(\n thanos_cache_memcached_requests_total{\n cluster=~\"$cluster\", job=~\"($namespace)/((querier.*|cortex|mimir))\",\n component=\"querier\",\n name=\"metadata-cache\"\n }[$__rate_interval]\n )\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-rollout-progress.json b/operations/mimir-mixin-compiled/dashboards/mimir-rollout-progress.json index 5f3c459e5df..56b91e2215e 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-rollout-progress.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-rollout-progress.json @@ -98,7 +98,7 @@ "steppedLine": false, "targets": [ { - "expr": "(\n sum by(cortex_service) (\n label_replace(\n kube_statefulset_status_replicas_updated{cluster=~\"$cluster\", namespace=~\"$namespace\",statefulset=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter\"},\n \"cortex_service\", \"$1\", \"statefulset\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n /\n sum by(cortex_service) (\n label_replace(\n kube_statefulset_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\"},\n \"cortex_service\", \"$1\", \"statefulset\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n) and (\n sum by(cortex_service) (\n label_replace(\n kube_statefulset_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\"},\n \"cortex_service\", \"$1\", \"statefulset\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n > 0\n)\n", + "expr": "(\n sum by(cortex_service) (\n label_replace(\n kube_statefulset_status_replicas_updated{cluster=~\"$cluster\", namespace=~\"$namespace\",statefulset=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter|cortex|mimir\"},\n \"cortex_service\", \"$1\", \"statefulset\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n /\n sum by(cortex_service) (\n label_replace(\n kube_statefulset_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\"},\n \"cortex_service\", \"$1\", \"statefulset\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n) and (\n sum by(cortex_service) (\n label_replace(\n kube_statefulset_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\"},\n \"cortex_service\", \"$1\", \"statefulset\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n > 0\n)\n", "format": null, "intervalFactor": null, "legendFormat": "{{cortex_service}}", @@ -106,7 +106,7 @@ "step": null }, { - "expr": "(\n sum by(cortex_service) (\n label_replace(\n kube_deployment_status_replicas_updated{cluster=~\"$cluster\", namespace=~\"$namespace\",deployment=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter\"},\n \"cortex_service\", \"$1\", \"deployment\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n /\n sum by(cortex_service) (\n label_replace(\n kube_deployment_spec_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\"},\n \"cortex_service\", \"$1\", \"deployment\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n) and (\n sum by(cortex_service) (\n label_replace(\n kube_deployment_spec_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\"},\n \"cortex_service\", \"$1\", \"deployment\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n > 0\n)\n", + "expr": "(\n sum by(cortex_service) (\n label_replace(\n kube_deployment_status_replicas_updated{cluster=~\"$cluster\", namespace=~\"$namespace\",deployment=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter|cortex|mimir\"},\n \"cortex_service\", \"$1\", \"deployment\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n /\n sum by(cortex_service) (\n label_replace(\n kube_deployment_spec_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\"},\n \"cortex_service\", \"$1\", \"deployment\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n) and (\n sum by(cortex_service) (\n label_replace(\n kube_deployment_spec_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\"},\n \"cortex_service\", \"$1\", \"deployment\", \"(.*?)(?:-zone-[a-z])?\"\n )\n )\n > 0\n)\n", "format": null, "intervalFactor": null, "legendFormat": "{{cortex_service}}", @@ -208,7 +208,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\",status_code=~\"2.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\",status_code=~\"2.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"}[$__rate_interval]))\n", "format": null, "instant": false, "interval": "", @@ -320,7 +320,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\",status_code=~\"4.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\",status_code=~\"4.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"}[$__rate_interval]))\n", "format": null, "instant": false, "interval": "", @@ -428,7 +428,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\",status_code=~\"5.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\",status_code=~\"5.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"}[$__rate_interval]))\n", "format": null, "instant": false, "interval": "", @@ -540,7 +540,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"}))\n", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"}))\n", "format": null, "instant": false, "interval": "", @@ -644,7 +644,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\",status_code=~\"2.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\",status_code=~\"2.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]))\n", "format": null, "instant": false, "interval": "", @@ -756,7 +756,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\",status_code=~\"4.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\",status_code=~\"4.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]))\n", "format": null, "instant": false, "interval": "", @@ -864,7 +864,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\",status_code=~\"5.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\",status_code=~\"5.+\"}[$__rate_interval])) /\nsum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}[$__rate_interval]))\n", "format": null, "instant": false, "interval": "", @@ -976,7 +976,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}))\n", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}))\n", "format": null, "instant": false, "interval": "", @@ -1094,7 +1094,7 @@ "steppedLine": false, "targets": [ { - "expr": "kube_deployment_status_replicas_unavailable{cluster=~\"$cluster\", namespace=~\"$namespace\", deployment=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter\"}\n> 0\n", + "expr": "kube_deployment_status_replicas_unavailable{cluster=~\"$cluster\", namespace=~\"$namespace\", deployment=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter|cortex|mimir\"}\n> 0\n", "format": null, "instant": true, "interval": "", @@ -1104,7 +1104,7 @@ "step": null }, { - "expr": "kube_statefulset_status_replicas_current{cluster=~\"$cluster\", namespace=~\"$namespace\", statefulset=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter\"} -\nkube_statefulset_status_replicas_ready {cluster=~\"$cluster\", namespace=~\"$namespace\", statefulset=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter\"}\n> 0\n", + "expr": "kube_statefulset_status_replicas_current{cluster=~\"$cluster\", namespace=~\"$namespace\", statefulset=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter|cortex|mimir\"} -\nkube_statefulset_status_replicas_ready {cluster=~\"$cluster\", namespace=~\"$namespace\", statefulset=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter|cortex|mimir\"}\n> 0\n", "format": null, "instant": true, "interval": "", @@ -1177,7 +1177,7 @@ "id": 11, "targets": [ { - "expr": "count by(container, version) (\n label_replace(\n kube_pod_container_info{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter\"},\n \"version\", \"$1\", \"image\", \".*:(.+)-.*\"\n )\n)\n", + "expr": "count by(container, version) (\n label_replace(\n kube_pod_container_info{cluster=~\"$cluster\", namespace=~\"$namespace\",container=~\"cortex-gw|distributor|ingester.*|query-frontend.*|query-scheduler.*|querier.*|compactor|store-gateway.*|ruler|alertmanager.*|overrides-exporter|cortex|mimir\"},\n \"version\", \"$1\", \"image\", \".*:(.+)-.*\"\n )\n)\n", "instant": true, "legendFormat": "", "refId": "A" @@ -1251,7 +1251,7 @@ "steppedLine": false, "targets": [ { - "expr": "1 - (\n avg_over_time(histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"} offset 24h))[1h:])\n /\n avg_over_time(histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"}))[1h:])\n)\n", + "expr": "1 - (\n avg_over_time(histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"} offset 24h))[1h:])\n /\n avg_over_time(histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"}))[1h:])\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1260,7 +1260,7 @@ "step": 10 }, { - "expr": "1 - (\n avg_over_time(histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"} offset 24h))[1h:])\n /\n avg_over_time(histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"(prometheus|api_prom)_api_v1_.+\"}))[1h:])\n)\n", + "expr": "1 - (\n avg_over_time(histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"} offset 24h))[1h:])\n /\n avg_over_time(histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"(prometheus|api_prom)_api_v1_.+\"}))[1h:])\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-ruler.json b/operations/mimir-mixin-compiled/dashboards/mimir-ruler.json index a36b1aa53d2..6efb200c9e8 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-ruler.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-ruler.json @@ -59,7 +59,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cortex_ruler_managers_total{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"})", + "expr": "sum(cortex_ruler_managers_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"})", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -135,7 +135,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"})", + "expr": "sum(cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"})", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -211,7 +211,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/QueryStream\"}[5m]))", + "expr": "sum(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/QueryStream\"}[5m]))", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -287,7 +287,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/Push\"}[5m]))", + "expr": "sum(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/Push\"}[5m]))", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -374,7 +374,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_prometheus_rule_evaluations_total{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval]))\n-\nsum(rate(cortex_prometheus_rule_evaluation_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval]))\n", + "expr": "sum(rate(cortex_prometheus_rule_evaluations_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval]))\n-\nsum(rate(cortex_prometheus_rule_evaluation_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval]))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -383,7 +383,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_prometheus_rule_evaluation_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_prometheus_rule_evaluation_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -460,7 +460,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum (rate(cortex_prometheus_rule_evaluation_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval]))\n /\nsum (rate(cortex_prometheus_rule_evaluation_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval]))\n", + "expr": "sum (rate(cortex_prometheus_rule_evaluation_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval]))\n /\nsum (rate(cortex_prometheus_rule_evaluation_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval]))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -557,7 +557,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -634,7 +634,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -642,7 +642,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -650,7 +650,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"})", + "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -726,7 +726,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (route, le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"}))", + "expr": "histogram_quantile(0.99, sum by (route, le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_prom_rules.*|api_prom_api_v1_(rules|alerts)\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -823,7 +823,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/Push\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/Push\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -900,7 +900,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_ingester_client_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/Push\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_ingester_client_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/Push\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -909,7 +909,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_ingester_client_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/Push\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_ingester_client_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/Push\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -918,7 +918,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_ingester_client_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/Push\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/Push\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_client_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/Push\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/Push\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1015,7 +1015,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/QueryStream\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/QueryStream\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1092,7 +1092,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_ingester_client_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/QueryStream\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_ingester_client_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/QueryStream\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1101,7 +1101,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_ingester_client_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/QueryStream\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_ingester_client_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/QueryStream\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1110,7 +1110,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_ingester_client_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/QueryStream\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/ruler\", operation=\"/cortex.Ingester/QueryStream\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_client_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/QueryStream\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_ingester_client_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\", operation=\"/cortex.Ingester/QueryStream\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1207,7 +1207,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", kv_name=~\"ruler\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", kv_name=~\"ruler\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1284,7 +1284,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", kv_name=~\"ruler\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", kv_name=~\"ruler\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1293,7 +1293,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", kv_name=~\"ruler\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", kv_name=~\"ruler\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1302,7 +1302,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", kv_name=~\"ruler\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", kv_name=~\"ruler\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", kv_name=~\"ruler\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", kv_name=~\"ruler\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1391,7 +1391,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_querier_storegateway_instances_hit_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.99, sum(rate(cortex_querier_storegateway_instances_hit_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1400,7 +1400,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_querier_storegateway_instances_hit_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.50, sum(rate(cortex_querier_storegateway_instances_hit_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1409,7 +1409,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_querier_storegateway_instances_hit_per_query_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}[$__rate_interval])) * 1 / sum(rate(cortex_querier_storegateway_instances_hit_per_query_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_querier_storegateway_instances_hit_per_query_sum{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}[$__rate_interval])) * 1 / sum(rate(cortex_querier_storegateway_instances_hit_per_query_count{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1486,7 +1486,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_querier_storegateway_refetches_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.99, sum(rate(cortex_querier_storegateway_refetches_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1495,7 +1495,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_querier_storegateway_refetches_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}[$__rate_interval])) by (le)) * 1", + "expr": "histogram_quantile(0.50, sum(rate(cortex_querier_storegateway_refetches_per_query_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1504,7 +1504,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_querier_storegateway_refetches_per_query_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}[$__rate_interval])) * 1 / sum(rate(cortex_querier_storegateway_refetches_per_query_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_querier_storegateway_refetches_per_query_sum{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}[$__rate_interval])) * 1 / sum(rate(cortex_querier_storegateway_refetches_per_query_count{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1581,7 +1581,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_querier_blocks_consistency_checks_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}[1m])) / sum(rate(cortex_querier_blocks_consistency_checks_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}[1m]))", + "expr": "sum(rate(cortex_querier_blocks_consistency_checks_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}[1m])) / sum(rate(cortex_querier_blocks_consistency_checks_total{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}[1m]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1670,7 +1670,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(user) (rate(cortex_prometheus_notifications_errors_total{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval]))\n /\nsum by(user) (rate(cortex_prometheus_notifications_sent_total{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval]))\n> 0\n", + "expr": "sum by(user) (rate(cortex_prometheus_notifications_errors_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval]))\n /\nsum by(user) (rate(cortex_prometheus_notifications_sent_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval]))\n> 0\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1747,7 +1747,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(user) (rate(cortex_prometheus_notifications_queue_length{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval]))\n /\nsum by(user) (rate(cortex_prometheus_notifications_queue_capacity{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval])) > 0\n", + "expr": "sum by(user) (rate(cortex_prometheus_notifications_queue_length{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval]))\n /\nsum by(user) (rate(cortex_prometheus_notifications_queue_capacity{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval])) > 0\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1824,7 +1824,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (increase(cortex_prometheus_notifications_dropped_total{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval])) > 0\n", + "expr": "sum by (user) (increase(cortex_prometheus_notifications_dropped_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval])) > 0\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1913,7 +1913,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(user) (rate(cortex_prometheus_rule_group_iterations_missed_total{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval])) > 0", + "expr": "sum by(user) (rate(cortex_prometheus_rule_group_iterations_missed_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval])) > 0", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1990,7 +1990,7 @@ "steppedLine": false, "targets": [ { - "expr": "rate(cortex_prometheus_rule_group_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval])\n /\nrate(cortex_prometheus_rule_group_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval])\n", + "expr": "rate(cortex_prometheus_rule_group_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval])\n /\nrate(cortex_prometheus_rule_group_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval])\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2067,7 +2067,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(rule_group) (rate(cortex_prometheus_rule_evaluation_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval])) > 0", + "expr": "sum by(rule_group) (rate(cortex_prometheus_rule_evaluation_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval])) > 0", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2156,7 +2156,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(user) (rate(cortex_prometheus_rule_evaluation_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval]))\n /\nsum by(user) (rate(cortex_prometheus_rule_evaluation_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/ruler\"}[$__rate_interval]))\n", + "expr": "sum by(user) (rate(cortex_prometheus_rule_evaluation_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval]))\n /\nsum by(user) (rate(cortex_prometheus_rule_evaluation_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ruler)\"}[$__rate_interval]))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-tenants.json b/operations/mimir-mixin-compiled/dashboards/mimir-tenants.json index de7614d47c0..d2a2f138516 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-tenants.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-tenants.json @@ -82,7 +82,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (\n cortex_ingester_active_series{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", user=~\"$user\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})\n)\n", + "expr": "sum by (user) (\n cortex_ingester_active_series{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", user=~\"$user\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -91,7 +91,7 @@ "step": 10 }, { - "expr": "sum by (user, name) (\n cortex_ingester_active_series_custom_tracker{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", user=~\"$user\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})\n) > 0\n", + "expr": "sum by (user, name) (\n cortex_ingester_active_series_custom_tracker{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", user=~\"$user\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})\n) > 0\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -169,7 +169,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (\n cortex_ingester_tsdb_exemplar_series_with_exemplars_in_storage{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", user=~\"$user\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})\n)\n", + "expr": "sum by (user) (\n cortex_ingester_tsdb_exemplar_series_with_exemplars_in_storage{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", user=~\"$user\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -247,7 +247,7 @@ "steppedLine": false, "targets": [ { - "expr": "time() - max by (user) (cortex_distributor_latest_seen_sample_timestamp_seconds{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", user=~\"$user\"} > 0)", + "expr": "time() - max by (user) (cortex_distributor_latest_seen_sample_timestamp_seconds{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", user=~\"$user\"} > 0)", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -325,7 +325,7 @@ "steppedLine": false, "targets": [ { - "expr": "time() - min by (user) (cortex_ingester_tsdb_exemplar_last_exemplars_timestamp_seconds{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", user=~\"$user\"} > 0)", + "expr": "time() - min by (user) (cortex_ingester_tsdb_exemplar_last_exemplars_timestamp_seconds{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", user=~\"$user\"} > 0)", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -415,7 +415,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (rate(cortex_distributor_samples_in_total{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user) (rate(cortex_distributor_samples_in_total{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -493,7 +493,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (rate(cortex_distributor_received_samples_total{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user) (rate(cortex_distributor_received_samples_total{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -571,7 +571,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (rate(cortex_distributor_deduped_samples_total{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user) (rate(cortex_distributor_deduped_samples_total{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -580,7 +580,7 @@ "step": 10 }, { - "expr": "sum by (user) (rate(cortex_distributor_non_ha_samples_received_total{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user) (rate(cortex_distributor_non_ha_samples_received_total{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -658,7 +658,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user, reason) (rate(cortex_discarded_samples_total{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user, reason) (rate(cortex_discarded_samples_total{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -667,7 +667,7 @@ "step": 10 }, { - "expr": "sum by (user, reason) (rate(cortex_discarded_samples_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user, reason) (rate(cortex_discarded_samples_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -757,7 +757,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (rate(cortex_distributor_exemplars_in_total{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user) (rate(cortex_distributor_exemplars_in_total{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -835,7 +835,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (rate(cortex_distributor_received_exemplars_total{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user) (rate(cortex_distributor_received_exemplars_total{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -913,7 +913,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user, reason) (rate(cortex_discarded_exemplars_total{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user, reason) (rate(cortex_discarded_exemplars_total{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -991,7 +991,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (\n rate(cortex_ingester_tsdb_exemplar_exemplars_appended_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", user=~\"$user\"}[$__rate_interval])\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})\n)\n", + "expr": "sum by (user) (\n rate(cortex_ingester_tsdb_exemplar_exemplars_appended_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", user=~\"$user\"}[$__rate_interval])\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1081,7 +1081,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user, job) (cortex_ingester_tsdb_symbol_table_size_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", user=~\"$user\"})", + "expr": "sum by (user, job) (cortex_ingester_tsdb_symbol_table_size_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", user=~\"$user\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1159,7 +1159,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user, job) (cortex_ingester_tsdb_storage_blocks_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", user=~\"$user\"})", + "expr": "sum by (user, job) (cortex_ingester_tsdb_storage_blocks_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", user=~\"$user\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1249,7 +1249,7 @@ "steppedLine": false, "targets": [ { - "expr": "count by (user) (sum by (user, rule_group) (cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", user=~\"$user\"}))", + "expr": "count by (user) (sum by (user, rule_group) (cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", user=~\"$user\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1327,7 +1327,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", user=~\"$user\"})", + "expr": "sum by (user) (cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", user=~\"$user\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1404,7 +1404,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user) (rate(cortex_prometheus_rule_evaluations_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user) (rate(cortex_prometheus_rule_evaluations_total{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1481,7 +1481,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (user, rule_group) (rate(cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by (user, rule_group) (rate(cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1608,7 +1608,7 @@ ], "targets": [ { - "expr": "topk($limit, sum by (user, rule_group) (cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", user=~\"$user\"}))", + "expr": "topk($limit, sum by (user, rule_group) (cortex_prometheus_rule_group_rules{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", user=~\"$user\"}))", "format": "table", "instant": true, "intervalFactor": 2, @@ -1724,7 +1724,7 @@ ], "targets": [ { - "expr": "topk($limit, sum by (user, rule_group) (cortex_prometheus_rule_group_last_duration_seconds{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\"}))", + "expr": "topk($limit, sum by (user, rule_group) (cortex_prometheus_rule_group_last_duration_seconds{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\"}))", "format": "table", "instant": true, "intervalFactor": 2, @@ -1814,7 +1814,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(user) (rate(cortex_prometheus_notifications_sent_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by(user) (rate(cortex_prometheus_notifications_sent_total{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1891,7 +1891,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(user) (rate(cortex_prometheus_notifications_errors_total{cluster=~\"$cluster\", job=~\"($namespace)/(ruler|cortex$)\", user=~\"$user\"}[$__rate_interval]))", + "expr": "sum by(user) (rate(cortex_prometheus_notifications_errors_total{cluster=~\"$cluster\", job=~\"($namespace)/((ruler|cortex|mimir))\", user=~\"$user\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-top-tenants.json b/operations/mimir-mixin-compiled/dashboards/mimir-top-tenants.json index 1e5861743d4..0b7d78ed4f0 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-top-tenants.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-top-tenants.json @@ -119,7 +119,7 @@ ], "targets": [ { - "expr": "topk($limit,\n sum by (user) (\n cortex_ingester_active_series{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})\n )\n)\n", + "expr": "topk($limit,\n sum by (user) (\n cortex_ingester_active_series{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})\n )\n)\n", "format": "table", "instant": true, "intervalFactor": 2, @@ -247,7 +247,7 @@ ], "targets": [ { - "expr": "topk($limit,\n sum by (user) (\n (\n sum by (user, cluster, namespace) (cortex_ingester_memory_series_created_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})\n -\n sum by (user, cluster, namespace) (cortex_ingester_memory_series_removed_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})\n )\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})\n )\n)\n", + "expr": "topk($limit,\n sum by (user) (\n (\n sum by (user, cluster, namespace) (cortex_ingester_memory_series_created_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})\n -\n sum by (user, cluster, namespace) (cortex_ingester_memory_series_removed_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})\n )\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})\n )\n)\n", "format": "table", "instant": true, "intervalFactor": 2, @@ -375,7 +375,7 @@ ], "targets": [ { - "expr": "topk($limit, sum by (user) (rate(cortex_distributor_received_samples_total{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"}[5m])))", + "expr": "topk($limit, sum by (user) (rate(cortex_distributor_received_samples_total{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"}[5m])))", "format": "table", "instant": true, "intervalFactor": 2, @@ -503,7 +503,7 @@ ], "targets": [ { - "expr": "topk($limit,\n sum by (user) (\n cortex_ingester_tsdb_exemplar_series_with_exemplars_in_storage{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})\n )\n)\n", + "expr": "topk($limit,\n sum by (user) (\n cortex_ingester_tsdb_exemplar_series_with_exemplars_in_storage{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})\n )\n)\n", "format": "table", "instant": true, "intervalFactor": 2, @@ -631,7 +631,7 @@ ], "targets": [ { - "expr": "topk($limit, sum by (user) (rate(cortex_distributor_received_exemplars_total{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"}[5m])))", + "expr": "topk($limit, sum by (user) (rate(cortex_distributor_received_exemplars_total{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"}[5m])))", "format": "table", "instant": true, "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json b/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json index 9bd104ec28f..c2eb454d95f 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json @@ -212,7 +212,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -221,7 +221,7 @@ "step": 10 }, { - "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -298,7 +298,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"}))", + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -307,7 +307,7 @@ "step": 10 }, { - "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"}))", + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -316,7 +316,7 @@ "step": 10 }, { - "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -559,7 +559,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -568,7 +568,7 @@ "step": 10 }, { - "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -645,7 +645,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"}))", + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -654,7 +654,7 @@ "step": 10 }, { - "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"}))", + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -663,7 +663,7 @@ "step": 10 }, { - "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -906,7 +906,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "expr": "avg(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -915,7 +915,7 @@ "step": 10 }, { - "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "expr": "max(cortex_inflight_requests{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -992,7 +992,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}))", + "expr": "avg(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1001,7 +1001,7 @@ "step": 10 }, { - "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}))", + "expr": "max(sum by(pod) (cortex_tcp_connections{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1010,7 +1010,7 @@ "step": 10 }, { - "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "expr": "min(cortex_tcp_connections_limit{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json b/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json index d0267f2e85b..0cb25d0c81d 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json @@ -238,7 +238,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -505,7 +505,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -592,7 +592,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (cortex_ingester_memory_series{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "expr": "sum by(pod) (cortex_ingester_memory_series{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -859,7 +859,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"})", + "expr": "sum by(pod) (go_memstats_heap_inuse_bytes{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-writes.json b/operations/mimir-mixin-compiled/dashboards/mimir-writes.json index 0f4083c1419..e5a8c8e9241 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-writes.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-writes.json @@ -82,7 +82,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cluster_namespace_job:cortex_distributor_received_samples:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "expr": "sum(cluster_namespace_job:cortex_distributor_received_samples:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -159,7 +159,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cluster_namespace_job:cortex_distributor_received_exemplars:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "expr": "sum(cluster_namespace_job:cortex_distributor_received_exemplars:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -236,7 +236,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cortex_ingester_memory_series{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}\n/ on(cluster, namespace) group_left\nmax by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"}))\n", + "expr": "sum(cortex_ingester_memory_series{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}\n/ on(cluster, namespace) group_left\nmax by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"}))\n", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -313,7 +313,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cortex_ingester_tsdb_exemplar_exemplars_in_storage{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}\n/ on(cluster, namespace) group_left\nmax by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"}))\n", + "expr": "sum(cortex_ingester_tsdb_exemplar_exemplars_in_storage{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}\n/ on(cluster, namespace) group_left\nmax by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"}))\n", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -389,7 +389,7 @@ "steppedLine": false, "targets": [ { - "expr": "count(count by(user) (cortex_ingester_active_series{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}))", + "expr": "count(count by(user) (cortex_ingester_active_series{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}))", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -465,7 +465,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"}[5m]))", + "expr": "sum(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"}[5m]))", "format": "time_series", "instant": true, "intervalFactor": 2, @@ -560,7 +560,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -637,7 +637,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -645,7 +645,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -653,7 +653,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"})", + "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -723,7 +723,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(gateway|cortex-gw|cortex-gw-internal)\", route=~\"api_(v1|prom)_push\"}[$__rate_interval])))", + "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((gateway|cortex-gw|cortex-gw-internal))\", route=~\"api_(v1|prom)_push\"}[$__rate_interval])))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -818,7 +818,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -895,7 +895,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -903,7 +903,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -911,7 +911,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"})", + "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -981,7 +981,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"}[$__rate_interval])))", + "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", route=~\"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push\"}[$__rate_interval])))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1076,7 +1076,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\",route=\"/cortex.Ingester/Push\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\",route=\"/cortex.Ingester/Push\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1153,7 +1153,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", route=\"/cortex.Ingester/Push\"})) * 1e3", + "expr": "histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", route=\"/cortex.Ingester/Push\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "99th Percentile", @@ -1161,7 +1161,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", route=\"/cortex.Ingester/Push\"})) * 1e3", + "expr": "histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", route=\"/cortex.Ingester/Push\"})) * 1e3", "format": "time_series", "intervalFactor": 2, "legendFormat": "50th Percentile", @@ -1169,7 +1169,7 @@ "step": 10 }, { - "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", route=\"/cortex.Ingester/Push\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", route=\"/cortex.Ingester/Push\"})", + "expr": "1e3 * sum(cluster_job_route:cortex_request_duration_seconds_sum:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", route=\"/cortex.Ingester/Push\"}) / sum(cluster_job_route:cortex_request_duration_seconds_count:sum_rate{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", route=\"/cortex.Ingester/Push\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Average", @@ -1239,7 +1239,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", route=\"/cortex.Ingester/Push\"}[$__rate_interval])))", + "expr": "histogram_quantile(0.99, sum by(le, pod) (rate(cortex_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", route=\"/cortex.Ingester/Push\"}[$__rate_interval])))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1334,7 +1334,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", kv_name=~\"distributor-hatracker\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", kv_name=~\"distributor-hatracker\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1411,7 +1411,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", kv_name=~\"distributor-hatracker\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", kv_name=~\"distributor-hatracker\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1420,7 +1420,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", kv_name=~\"distributor-hatracker\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", kv_name=~\"distributor-hatracker\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1429,7 +1429,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", kv_name=~\"distributor-hatracker\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", kv_name=~\"distributor-hatracker\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", kv_name=~\"distributor-hatracker\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", kv_name=~\"distributor-hatracker\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1526,7 +1526,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", kv_name=~\"distributor-(lifecycler|ring)\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", kv_name=~\"distributor-(lifecycler|ring)\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1603,7 +1603,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", kv_name=~\"distributor-(lifecycler|ring)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", kv_name=~\"distributor-(lifecycler|ring)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1612,7 +1612,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", kv_name=~\"distributor-(lifecycler|ring)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", kv_name=~\"distributor-(lifecycler|ring)\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1621,7 +1621,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", kv_name=~\"distributor-(lifecycler|ring)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\", kv_name=~\"distributor-(lifecycler|ring)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", kv_name=~\"distributor-(lifecycler|ring)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\", kv_name=~\"distributor-(lifecycler|ring)\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1718,7 +1718,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", kv_name=~\"ingester-.*\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", + "expr": "sum by (status) (\n label_replace(label_replace(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", kv_name=~\"ingester-.*\"}[$__rate_interval]),\n \"status\", \"${1}xx\", \"status_code\", \"([0-9])..\"),\n \"status\", \"${1}\", \"status_code\", \"([a-z]+)\"))\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1795,7 +1795,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", kv_name=~\"ingester-.*\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", kv_name=~\"ingester-.*\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1804,7 +1804,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", kv_name=~\"ingester-.*\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_kv_request_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", kv_name=~\"ingester-.*\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1813,7 +1813,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", kv_name=~\"ingester-.*\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\", kv_name=~\"ingester-.*\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_kv_request_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", kv_name=~\"ingester-.*\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_kv_request_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\", kv_name=~\"ingester-.*\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1906,7 +1906,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_ingester_shipper_uploads_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval])) - sum(rate(cortex_ingester_shipper_upload_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_shipper_uploads_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval])) - sum(rate(cortex_ingester_shipper_upload_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1915,7 +1915,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_ingester_shipper_upload_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_shipper_upload_failures_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -1993,7 +1993,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(thanos_objstore_bucket_operation_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\",component=\"ingester\",operation=\"upload\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(thanos_objstore_bucket_operation_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\",component=\"ingester\",operation=\"upload\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2002,7 +2002,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(thanos_objstore_bucket_operation_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\",component=\"ingester\",operation=\"upload\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(thanos_objstore_bucket_operation_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\",component=\"ingester\",operation=\"upload\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2011,7 +2011,7 @@ "step": 10 }, { - "expr": "sum(rate(thanos_objstore_bucket_operation_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\",component=\"ingester\",operation=\"upload\"}[$__rate_interval])) * 1e3 / sum(rate(thanos_objstore_bucket_operation_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\",component=\"ingester\",operation=\"upload\"}[$__rate_interval]))", + "expr": "sum(rate(thanos_objstore_bucket_operation_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\",component=\"ingester\",operation=\"upload\"}[$__rate_interval])) * 1e3 / sum(rate(thanos_objstore_bucket_operation_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\",component=\"ingester\",operation=\"upload\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2104,7 +2104,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_ingester_tsdb_compactions_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_tsdb_compactions_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2113,7 +2113,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_ingester_tsdb_compactions_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_tsdb_compactions_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2191,7 +2191,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(cortex_ingester_tsdb_compaction_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.99, sum(rate(cortex_ingester_tsdb_compaction_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2200,7 +2200,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.50, sum(rate(cortex_ingester_tsdb_compaction_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval])) by (le)) * 1e3", + "expr": "histogram_quantile(0.50, sum(rate(cortex_ingester_tsdb_compaction_duration_seconds_bucket{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval])) by (le)) * 1e3", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2209,7 +2209,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_ingester_tsdb_compaction_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_ingester_tsdb_compaction_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_tsdb_compaction_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval])) * 1e3 / sum(rate(cortex_ingester_tsdb_compaction_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2302,7 +2302,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_ingester_tsdb_wal_truncations_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval])) - sum(rate(cortex_ingester_tsdb_wal_truncations_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_tsdb_wal_truncations_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval])) - sum(rate(cortex_ingester_tsdb_wal_truncations_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2311,7 +2311,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_ingester_tsdb_wal_truncations_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_tsdb_wal_truncations_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2392,7 +2392,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_ingester_tsdb_checkpoint_creations_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval])) - sum(rate(cortex_ingester_tsdb_checkpoint_creations_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_tsdb_checkpoint_creations_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval])) - sum(rate(cortex_ingester_tsdb_checkpoint_creations_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2401,7 +2401,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_ingester_tsdb_checkpoint_creations_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_tsdb_checkpoint_creations_failed_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2479,7 +2479,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_ingester_tsdb_wal_truncate_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval])) / sum(rate(cortex_ingester_tsdb_wal_truncate_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_tsdb_wal_truncate_duration_seconds_sum{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval])) / sum(rate(cortex_ingester_tsdb_wal_truncate_duration_seconds_count{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2559,7 +2559,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(cortex_ingester_tsdb_wal_corruptions_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_tsdb_wal_corruptions_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2568,7 +2568,7 @@ "step": 10 }, { - "expr": "sum(rate(cortex_ingester_tsdb_mmap_chunk_corruptions_total{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}[$__rate_interval]))", + "expr": "sum(rate(cortex_ingester_tsdb_mmap_chunk_corruptions_total{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}[$__rate_interval]))", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2658,7 +2658,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cluster_namespace_job:cortex_distributor_exemplars_in:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "expr": "sum(cluster_namespace_job:cortex_distributor_exemplars_in:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2736,7 +2736,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(cluster_namespace_job:cortex_distributor_received_exemplars:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})", + "expr": "sum(cluster_namespace_job:cortex_distributor_received_exemplars:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2814,7 +2814,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(\n cluster_namespace_job:cortex_ingester_ingested_exemplars:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})\n)\n", + "expr": "sum(\n cluster_namespace_job:cortex_ingester_ingested_exemplars:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -2892,7 +2892,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(\n cluster_namespace_job:cortex_ingester_tsdb_exemplar_exemplars_appended:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/(ingester.*|cortex$)\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/(distributor|cortex$)\"})\n)\n", + "expr": "sum(\n cluster_namespace_job:cortex_ingester_tsdb_exemplar_exemplars_appended:rate5m{cluster=~\"$cluster\", job=~\"($namespace)/((ingester.*|cortex|mimir))\"}\n / on(cluster, namespace) group_left\n max by (cluster, namespace) (cortex_distributor_replication_factor{cluster=~\"$cluster\", job=~\"($namespace)/((distributor|cortex|mimir))\"})\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin/alerts/compactor.libsonnet b/operations/mimir-mixin/alerts/compactor.libsonnet index 177ef370f4f..6ca2f0a1985 100644 --- a/operations/mimir-mixin/alerts/compactor.libsonnet +++ b/operations/mimir-mixin/alerts/compactor.libsonnet @@ -65,9 +65,9 @@ alert: $.alertName('CompactorHasNotUploadedBlocks'), 'for': '15m', expr: ||| - (time() - thanos_objstore_bucket_last_successful_upload_time{job=~".+/%(compactor)s"} > 60 * 60 * 24) + (time() - thanos_objstore_bucket_last_successful_upload_time{job=~".+/(%(compactor)s)"} > 60 * 60 * 24) and - (thanos_objstore_bucket_last_successful_upload_time{job=~".+/%(compactor)s"} > 0) + (thanos_objstore_bucket_last_successful_upload_time{job=~".+/(%(compactor)s)"} > 0) ||| % $._config.job_names, labels: { severity: 'critical', @@ -81,7 +81,7 @@ alert: $.alertName('CompactorHasNotUploadedBlocks'), 'for': '24h', expr: ||| - thanos_objstore_bucket_last_successful_upload_time{job=~".+/%(compactor)s"} == 0 + thanos_objstore_bucket_last_successful_upload_time{job=~".+/(%(compactor)s)"} == 0 ||| % $._config.job_names, labels: { severity: 'critical', @@ -95,7 +95,7 @@ alert: $.alertName('CompactorSkippedBlocksWithOutOfOrderChunks'), 'for': '1m', expr: ||| - increase(cortex_compactor_blocks_marked_for_no_compaction_total{job=~".+/%(compactor)s", reason="block-index-out-of-order-chunk"}[5m]) > 0 + increase(cortex_compactor_blocks_marked_for_no_compaction_total{job=~".+/(%(compactor)s)", reason="block-index-out-of-order-chunk"}[5m]) > 0 ||| % $._config.job_names, labels: { severity: 'warning', diff --git a/operations/mimir-mixin/config.libsonnet b/operations/mimir-mixin/config.libsonnet index 73f66c1b0f6..51574ce56ae 100644 --- a/operations/mimir-mixin/config.libsonnet +++ b/operations/mimir-mixin/config.libsonnet @@ -16,16 +16,16 @@ // These are used by the dashboards and allow for the simultaneous display of // microservice and single binary Mimir clusters. job_names: { - ingester: '(ingester.*|cortex$)', // Match also custom and per-zone ingester deployments. - distributor: '(distributor|cortex$)', - querier: '(querier.*|cortex$)', // Match also custom querier deployments. - ruler: '(ruler|cortex$)', - query_frontend: '(query-frontend.*|cortex$)', // Match also custom query-frontend deployments. + ingester: '(ingester.*|cortex|mimir)', // Match also custom and per-zone ingester deployments. + distributor: '(distributor|cortex|mimir)', + querier: '(querier.*|cortex|mimir)', // Match also custom querier deployments. + ruler: '(ruler|cortex|mimir)', + query_frontend: '(query-frontend.*|cortex|mimir)', // Match also custom query-frontend deployments. query_scheduler: 'query-scheduler.*', // Not part of single-binary. Match also custom query-scheduler deployments. - ring_members: ['compactor', 'distributor', 'ingester.*', 'querier.*', 'ruler', 'store-gateway.*', 'cortex'], - store_gateway: '(store-gateway.*|cortex$)', // Match also per-zone store-gateway deployments. + ring_members: ['compactor', 'distributor', 'ingester.*', 'querier.*', 'ruler', 'store-gateway.*', 'cortex', 'mimir'], + store_gateway: '(store-gateway.*|cortex|mimir)', // Match also per-zone store-gateway deployments. gateway: '(gateway|cortex-gw|cortex-gw-internal)', - compactor: 'compactor.*', // Match also custom compactor deployments. + compactor: 'compactor.*|cortex|mimir', // Match also custom compactor deployments. }, // Grouping labels, to uniquely identify and group by {jobs, clusters} diff --git a/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet b/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet index 9f0d93a3b4c..cfe2942e453 100644 --- a/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet +++ b/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet @@ -99,7 +99,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; jobMatcher(job):: if $._config.singleBinary then 'job=~"$job"' - else 'cluster=~"$cluster", job=~"($namespace)/%s"' % job, + else 'cluster=~"$cluster", job=~"($namespace)/(%s)"' % job, namespaceMatcher():: if $._config.singleBinary @@ -109,7 +109,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; jobSelector(job):: if $._config.singleBinary then [utils.selector.noop('cluster'), utils.selector.re('job', '$job')] - else [utils.selector.re('cluster', '$cluster'), utils.selector.re('job', '($namespace)/%s' % job)], + else [utils.selector.re('cluster', '$cluster'), utils.selector.re('job', '($namespace)/(%s)' % job)], queryPanel(queries, legends, legendLink=null):: super.queryPanel(queries, legends, legendLink) + { diff --git a/operations/mimir-mixin/dashboards/rollout-progress.libsonnet b/operations/mimir-mixin/dashboards/rollout-progress.libsonnet index 5fdeb1b00cf..0991ced93f3 100644 --- a/operations/mimir-mixin/dashboards/rollout-progress.libsonnet +++ b/operations/mimir-mixin/dashboards/rollout-progress.libsonnet @@ -6,7 +6,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; gateway_job_matcher: $.jobMatcher($._config.job_names.gateway), gateway_write_routes_regex: 'api_(v1|prom)_push', gateway_read_routes_regex: '(prometheus|api_prom)_api_v1_.+', - all_services_regex: std.join('|', ['cortex-gw', 'distributor', 'ingester.*', 'query-frontend.*', 'query-scheduler.*', 'querier.*', 'compactor', 'store-gateway.*', 'ruler', 'alertmanager.*', 'overrides-exporter']), + all_services_regex: std.join('|', ['cortex-gw', 'distributor', 'ingester.*', 'query-frontend.*', 'query-scheduler.*', 'querier.*', 'compactor', 'store-gateway.*', 'ruler', 'alertmanager.*', 'overrides-exporter', 'cortex', 'mimir']), }, 'mimir-rollout-progress.json': From 9ab387cbd6547942e0cad4f01a20e2eede585120 Mon Sep 17 00:00:00 2001 From: Richard Hartmann Date: Thu, 27 Jan 2022 15:36:57 +0100 Subject: [PATCH 025/168] Fix code of conduct (#922) Signed-off-by: Richard Hartmann --- CODE_OF_CONDUCT.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ code-of-conduct.md | 3 --- 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 CODE_OF_CONDUCT.md delete mode 100644 code-of-conduct.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..3d4caa4f5cf --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at conduct@grafana.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/code-of-conduct.md b/code-of-conduct.md deleted file mode 100644 index fb32cfa04ee..00000000000 --- a/code-of-conduct.md +++ /dev/null @@ -1,3 +0,0 @@ -## Cortex Community Code of Conduct - -Cortex follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). From 3ad728fc2a60a5a3c67c26af5e4d54a04895ece8 Mon Sep 17 00:00:00 2001 From: Christian Simon Date: Thu, 27 Jan 2022 16:27:20 +0000 Subject: [PATCH 026/168] Add tool for analyse query step alignmnet (#392) A tool to parse the query stats log messages of query-frontends to understand the impact toggling `-querier.align-querier-with-step` setting. --- tools/query-step-alignment-analysis/README.md | 17 ++ tools/query-step-alignment-analysis/main.go | 159 ++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 tools/query-step-alignment-analysis/README.md create mode 100644 tools/query-step-alignment-analysis/main.go diff --git a/tools/query-step-alignment-analysis/README.md b/tools/query-step-alignment-analysis/README.md new file mode 100644 index 00000000000..fac0a48e970 --- /dev/null +++ b/tools/query-step-alignment-analysis/README.md @@ -0,0 +1,17 @@ +# Query Step Alignment analysis + +This tools allow to parse the query stats log messages of query-frontends to +understand the impact toggling query-step-alignment. + +## Usage + +- This requires a working Loki and logcli setup for the Mimir cluster + +``` +$ logcli query '{namespace="mimir", container="query-frontend"} |="path=/api/prom/api/v1/query_range" | logfmt' --limit 1000000 --output jsonl | go run main.go +time-frame: 2022-01-27 09:35:52.108468366 +0000 UTC to 2022-01-27 10:35:51.62229847 +0000 UTC +total queries: 192338 +cachable-today: 86232 44.83% +cachable-without-step-align: 85372 44.39% +step-aligned: 168402 87.56% +``` diff --git a/tools/query-step-alignment-analysis/main.go b/tools/query-step-alignment-analysis/main.go new file mode 100644 index 00000000000..3fa990c90d2 --- /dev/null +++ b/tools/query-step-alignment-analysis/main.go @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package main + +import ( + "encoding/json" + "fmt" + "io" + "log" + "math" + "os" + "strconv" + "time" + + "github.com/prometheus/common/model" +) + +type QueryStat struct { + Start time.Time + End time.Time + Timestamp time.Time + Step time.Duration + Query string + OrgID string +} + +func parseTime(str string) (time.Time, error) { + t, err := strconv.ParseFloat(str, 64) + if err != nil { + timestamp, err := time.Parse(time.RFC3339Nano, str) + if err != nil { + return time.Time{}, err + } + return timestamp, nil + } + + s, ns := math.Modf(t) + ns = math.Round(ns*1000) / 1000 + return time.Unix(int64(s), int64(ns*float64(time.Second))).UTC(), nil +} + +// Queries which are step aligned +func (qs *QueryStat) IsStepAligned() bool { + start := qs.Start.Truncate(qs.Step) + end := qs.End.Truncate(qs.Step) + return qs.Start == start && qs.End == end +} + +// Queries which are involving only recent data are not cached +func (qs *QueryStat) IsInLast10Minutes() bool { + return qs.Timestamp.Add(-10 * time.Minute).Before(qs.Start) +} + +func (qs *QueryStat) UnmarshalJSON(b []byte) error { + + var d struct { + Labels struct { + Query string `json:"param_query"` + Start string `json:"param_start"` + Step string `json:"param_step"` + End string `json:"param_end"` + OrgID string `json:"org_id"` + } `json:"labels"` + Timestamp string `json:"timestamp"` + } + if err := json.Unmarshal(b, &d); err != nil { + return err + } + + qs.Query = d.Labels.Query + qs.OrgID = d.Labels.OrgID + + var err error + qs.Start, err = parseTime(d.Labels.Start) + if err != nil { + return err + } + + qs.End, err = parseTime(d.Labels.End) + if err != nil { + return err + } + + timestamp, err := time.Parse(time.RFC3339Nano, d.Timestamp) + if err != nil { + return err + } + qs.Timestamp = timestamp + + step, err := parseDuration(d.Labels.Step) + if err != nil { + return err + } + qs.Step = step + + return nil +} + +func parseDuration(s string) (time.Duration, error) { + if step, err := strconv.ParseFloat(s, 64); err == nil { + return time.Second * time.Duration(step), nil + } + + stepD, err := model.ParseDuration(s) + if err != nil { + return 0, err + } + return time.Duration(stepD), nil +} + +func main() { + dec := json.NewDecoder(os.Stdin) + + var ( + total uint64 + countStepAligned uint64 + countCacheableWithStepAlign uint64 + countCacheableWithoutStepAlign uint64 + startTimestamp time.Time + endTimestamp time.Time + ) + + var qs QueryStat + + for { + if err := dec.Decode(&qs); err == io.EOF { + break + } else if err != nil { + log.Print("warning: ", err) + continue + } + total++ + + if !qs.IsInLast10Minutes() { + countCacheableWithStepAlign++ + } + + if qs.IsStepAligned() { + countStepAligned++ + } + + if !qs.IsInLast10Minutes() && qs.IsStepAligned() { + countCacheableWithoutStepAlign++ + } + + if startTimestamp.IsZero() || startTimestamp.After(qs.Timestamp) { + startTimestamp = qs.Timestamp + } + if endTimestamp.Before(qs.Timestamp) { + endTimestamp = qs.Timestamp + } + } + + fmt.Printf("time-frame: %s to %s\n", startTimestamp, endTimestamp) + fmt.Printf("total queries: % 9d\n", total) + fmt.Printf("cachable-with-step-align: % 9d % 2.2f%%\n", countCacheableWithStepAlign, float64(countCacheableWithStepAlign)/float64(total)*100.0) + fmt.Printf("cachable-without-step-align: % 9d % 2.2f%%\n", countCacheableWithoutStepAlign, float64(countCacheableWithoutStepAlign)/float64(total)*100.0) + fmt.Printf("step-aligned: % 9d % 2.2f%%\n", countStepAligned, float64(countStepAligned)/float64(total)*100.0) +} From 559f96d43509d97bdf557f4c864727e9c325c8a4 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Thu, 27 Jan 2022 17:31:42 +0100 Subject: [PATCH 027/168] Mimir: Don't unquote usage in help output (#919) * Mimir: Don't unquote usage in help output * ruler: Change from backticks to single quotes in flag help * querier: Change from backticks to single quotes in flag help Signed-off-by: Arve Knudsen --- cmd/mimir/help-all.txt.tmpl | 8 ++--- cmd/mimir/help.txt.tmpl | 8 ++--- cmd/mimir/usage.go | 32 +++++++++++++++++-- .../configuration/config-file-reference.md | 8 ++--- .../tenantfederation/tenant_federation.go | 2 +- pkg/ruler/tenant_federation.go | 2 +- 6 files changed, 44 insertions(+), 16 deletions(-) diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 88ba267e6f2..0fcbe0fd713 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -1481,8 +1481,8 @@ Usage of ./cmd/mimir/mimir: file path to store temporary rule files for the prometheus rule managers (default "/rules") -ruler.search-pending-for duration Time to spend searching for a pending ruler when shutting down. (default 5m0s) - -ruler.tenant-federation.enabled source_tenants - Enable running rule groups against multiple tenants. The tenant IDs involved need to be in the rule group's source_tenants field. If this flag is set to `false` when there are already created federated rule groups, then these rules groups will be skipped during evaluations. + -ruler.tenant-federation.enabled + Enable running rule groups against multiple tenants. The tenant IDs involved need to be in the rule group's 'source_tenants' field. If this flag is set to 'false' when there are already created federated rule groups, then these rules groups will be skipped during evaluations. -ruler.tenant-shard-size int The tenant's shard size when sharding is used by ruler. Value of 0 disables shuffle sharding for the tenant, and tenant rules will be sharded across all ruler replicas. -runtime-config.file string @@ -1641,8 +1641,8 @@ Usage of ./cmd/mimir/mimir: Limit the query time range (end - start time). This limit is enforced in the query-frontend (on the received query), in the querier (on the query possibly split by the query-frontend) and ruler. 0 to disable. -target value Comma-separated list of modules to load. The alias 'all' can be used in the list to load a number of core modules and will enable single-binary mode. Use '-modules' command line flag to get a list of available modules, and to see which modules are included in 'all'. (default all) - -tenant-federation.enabled | - If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a | character in the `X-Scope-OrgID` header (experimental). + -tenant-federation.enabled + If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header (experimental). -validation.create-grace-period value Duration which table will be created/deleted before/after it's needed; we won't accept sample from before this time. (default 10m) -validation.enforce-metadata-metric-name diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 6bc8306dede..5130e147e30 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -1477,8 +1477,8 @@ Usage of ./cmd/mimir/mimir: file path to store temporary rule files for the prometheus rule managers (default "/rules") -ruler.search-pending-for duration Time to spend searching for a pending ruler when shutting down. (default 5m0s) - -ruler.tenant-federation.enabled source_tenants - Enable running rule groups against multiple tenants. The tenant IDs involved need to be in the rule group's source_tenants field. If this flag is set to `false` when there are already created federated rule groups, then these rules groups will be skipped during evaluations. + -ruler.tenant-federation.enabled + Enable running rule groups against multiple tenants. The tenant IDs involved need to be in the rule group's 'source_tenants' field. If this flag is set to 'false' when there are already created federated rule groups, then these rules groups will be skipped during evaluations. -ruler.tenant-shard-size int The tenant's shard size when sharding is used by ruler. Value of 0 disables shuffle sharding for the tenant, and tenant rules will be sharded across all ruler replicas. -runtime-config.file string @@ -1637,8 +1637,8 @@ Usage of ./cmd/mimir/mimir: Limit the query time range (end - start time). This limit is enforced in the query-frontend (on the received query), in the querier (on the query possibly split by the query-frontend) and ruler. 0 to disable. -target value Comma-separated list of modules to load. The alias 'all' can be used in the list to load a number of core modules and will enable single-binary mode. Use '-modules' command line flag to get a list of available modules, and to see which modules are included in 'all'. (default all) - -tenant-federation.enabled | - If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a | character in the `X-Scope-OrgID` header (experimental). + -tenant-federation.enabled + If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header (experimental). -validation.create-grace-period value Duration which table will be created/deleted before/after it's needed; we won't accept sample from before this time. (default 10m) -validation.enforce-metadata-metric-name diff --git a/cmd/mimir/usage.go b/cmd/mimir/usage.go index a196ca2dbdb..9701fdf81a8 100644 --- a/cmd/mimir/usage.go +++ b/cmd/mimir/usage.go @@ -58,7 +58,7 @@ func usage(cfg *mimir.Config, printAll bool) error { var b strings.Builder // Two spaces before -; see next two comments. fmt.Fprintf(&b, " -%s", fl.Name) - name, usage := flag.UnquoteUsage(fl) + name := getFlagName(fl) if len(name) > 0 { b.WriteString(" ") b.WriteString(name) @@ -69,7 +69,7 @@ func usage(cfg *mimir.Config, printAll bool) error { if fieldCat == categoryExperimental { b.WriteString("[experimental] ") } - b.WriteString(strings.ReplaceAll(usage, "\n", "\n \t")) + b.WriteString(strings.ReplaceAll(fl.Usage, "\n", "\n \t")) if !isZeroValue(fl, fl.DefValue) { v := reflect.ValueOf(fl.Value) @@ -146,3 +146,31 @@ func parseConfig(cfg interface{}, fields map[uintptr]reflect.StructField) error return nil } + +func getFlagName(fl *flag.Flag) string { + getter, ok := fl.Value.(flag.Getter) + if !ok { + return "value" + } + + name := "value" + + v := reflect.ValueOf(getter.Get()) + t := v.Type() + switch t.Name() { + case "bool": + name = "" + case "Duration": + name = "duration" + case "float64": + name = "float" + case "int", "int64": + name = "int" + case "string": + name = "string" + case "uint", "uint64": + name = "uint" + } + + return name +} diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 158f8d69634..ead7f2ca5c3 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -133,8 +133,8 @@ api: tenant_federation: # If enabled on all services, queries can be federated across multiple - # tenants. The tenant IDs involved need to be specified separated by a `|` - # character in the `X-Scope-OrgID` header (experimental). + # tenants. The tenant IDs involved need to be specified separated by a '|' + # character in the 'X-Scope-OrgID' header (experimental). # CLI flag: -tenant-federation.enabled [enabled: | default = false] @@ -1303,8 +1303,8 @@ ring: tenant_federation: # Enable running rule groups against multiple tenants. The tenant IDs involved - # need to be in the rule group's `source_tenants` field. If this flag is set - # to `false` when there are already created federated rule groups, then these + # need to be in the rule group's 'source_tenants' field. If this flag is set + # to 'false' when there are already created federated rule groups, then these # rules groups will be skipped during evaluations. # CLI flag: -ruler.tenant-federation.enabled [enabled: | default = false] diff --git a/pkg/querier/tenantfederation/tenant_federation.go b/pkg/querier/tenantfederation/tenant_federation.go index b6a0dbdaad8..b7fe3480d7e 100644 --- a/pkg/querier/tenantfederation/tenant_federation.go +++ b/pkg/querier/tenantfederation/tenant_federation.go @@ -15,5 +15,5 @@ type Config struct { } func (cfg *Config) RegisterFlags(f *flag.FlagSet) { - f.BoolVar(&cfg.Enabled, "tenant-federation.enabled", false, "If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a `|` character in the `X-Scope-OrgID` header (experimental).") + f.BoolVar(&cfg.Enabled, "tenant-federation.enabled", false, "If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header (experimental).") } diff --git a/pkg/ruler/tenant_federation.go b/pkg/ruler/tenant_federation.go index c79704b4b70..f2ae49812ba 100644 --- a/pkg/ruler/tenant_federation.go +++ b/pkg/ruler/tenant_federation.go @@ -20,7 +20,7 @@ type TenantFederationConfig struct { } func (cfg *TenantFederationConfig) RegisterFlags(f *flag.FlagSet) { - f.BoolVar(&cfg.Enabled, "ruler.tenant-federation.enabled", false, "Enable running rule groups against multiple tenants. The tenant IDs involved need to be in the rule group's `source_tenants` field. If this flag is set to `false` when there are already created federated rule groups, then these rules groups will be skipped during evaluations.") + f.BoolVar(&cfg.Enabled, "ruler.tenant-federation.enabled", false, "Enable running rule groups against multiple tenants. The tenant IDs involved need to be in the rule group's 'source_tenants' field. If this flag is set to 'false' when there are already created federated rule groups, then these rules groups will be skipped during evaluations.") } type contextKey int From f5633f24fa0e5076c017111d365ab65aa9cac699 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Fri, 28 Jan 2022 09:02:15 +0100 Subject: [PATCH 028/168] Fix 'make docs' to show doc compilation errors (#926) Signed-off-by: Marco Pracucci --- docs.mk | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/docs.mk b/docs.mk index b38f1c4b4f2..474a0737f64 100644 --- a/docs.mk +++ b/docs.mk @@ -13,23 +13,14 @@ DOCS_VERSION = next DOCS_DOCKER_RUN_FLAGS = -ti -v $(CURDIR)/$(DOCS_DIR):/hugo/content/docs/$(DOCS_PROJECT)/$(DOCS_VERSION):ro,z -p $(DOCS_HOST_PORT):$(DOCS_LISTEN_PORT) --rm $(DOCS_IMAGE) DOCS_DOCKER_CONTAINER = $(DOCS_PROJECT)-docs -# This wrapper will delete the pre-existing Grafana and Loki docs, which -# significantly slows down the build process, due to the duplication of pages -# through versioning. +# This wrapper will serve documentation on a local webserver. define docs_docker_run - @docker run --name $(DOCS_DOCKER_CONTAINER) -d $(DOCS_DOCKER_RUN_FLAGS) /bin/bash -c 'find content/docs/ -mindepth 1 -maxdepth 1 -type d -a ! -name "$(DOCS_PROJECT)" -exec rm -rf {} \; && exec $(1)'; \ - until curl -sLw '%{http_code}' http://localhost:$(DOCS_HOST_PORT)/docs/$(DOCS_PROJECT)/ | grep -q 200; do \ - echo "Waiting for docs container to be ready..."; \ - sleep 1; \ - done; \ - docker logs $(DOCS_DOCKER_CONTAINER); \ - echo ; \ - echo ------------------------- ; \ - echo Serving documentation at: ; \ - echo http://$(DOCS_BASE_URL)/docs/$(DOCS_PROJECT)/$(DOCS_VERSION)/; \ - echo ------------------------- ; \ - echo ; \ - docker attach $(DOCS_DOCKER_CONTAINER) + @echo "Documentation will be served at:" + @echo "http://$(DOCS_BASE_URL)/docs/$(DOCS_PROJECT)/$(DOCS_VERSION)/" + @echo "" + @read -p "Press a key to continue" + + @docker run --name $(DOCS_DOCKER_CONTAINER) $(DOCS_DOCKER_RUN_FLAGS) /bin/bash -c 'find content/docs/ -mindepth 1 -maxdepth 1 -type d -a ! -name "$(DOCS_PROJECT)" -exec rm -rf {} \; && exec $(1)' endef .PHONY: docs-docker-rm From f2bae6a50515999a1b27b9ec0a252379d13c0f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Fri, 28 Jan 2022 09:47:32 +0100 Subject: [PATCH 029/168] Update dskit (#935) --- go.mod | 2 +- go.sum | 5 +++-- vendor/github.com/grafana/dskit/kv/client.go | 8 +++++++- vendor/modules.txt | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 7756cd9ca89..a5448e16dcb 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.4 github.com/gorilla/mux v1.8.0 - github.com/grafana/dskit v0.0.0-20220117094654-cd9c89e7e460 + github.com/grafana/dskit v0.0.0-20220128074435-7436a77cd54e github.com/grafana/e2e v0.1.0 github.com/hashicorp/golang-lru v0.5.4 github.com/json-iterator/go v1.1.12 diff --git a/go.sum b/go.sum index 7e330862790..0f0414b2d17 100644 --- a/go.sum +++ b/go.sum @@ -463,6 +463,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cristalhq/hedgedhttp v0.7.0/go.mod h1:XkqWU6qVMutbhW68NnzjWrGtH8NUx1UfYqGYtHVKIsI= github.com/cucumber/godog v0.8.1/go.mod h1:vSh3r/lM+psC1BPXvdkSEuNjmXfpVqrMGYAElF6hxnA= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= @@ -970,8 +971,8 @@ github.com/grafana-tools/sdk v0.0.0-20211220201350-966b3088eec9 h1:LQAhgcUPnzdjU github.com/grafana-tools/sdk v0.0.0-20211220201350-966b3088eec9/go.mod h1:AHHlOEv1+GGQ3ktHMlhuTUwo3zljV3QJbC0+8o2kn+4= github.com/grafana/dskit v0.0.0-20211021180445-3bd016e9d7f1/go.mod h1:uPG2nyK4CtgNDmWv7qyzYcdI+S90kHHRWvHnBtEMBXM= github.com/grafana/dskit v0.0.0-20220112093026-95274ccc858d/go.mod h1:M0/dlftwBvH7+hdNNpjMa/CUXD7gsew67mbkCuDlFXE= -github.com/grafana/dskit v0.0.0-20220117094654-cd9c89e7e460 h1:3x/PT5aycDZGRhNHvtS28SZvPo/ckehjQG6i71pRgZo= -github.com/grafana/dskit v0.0.0-20220117094654-cd9c89e7e460/go.mod h1:M0/dlftwBvH7+hdNNpjMa/CUXD7gsew67mbkCuDlFXE= +github.com/grafana/dskit v0.0.0-20220128074435-7436a77cd54e h1:ObGEDlygoLXjcXINVlDpYjvpMT86q8r8KxEdG1sCagM= +github.com/grafana/dskit v0.0.0-20220128074435-7436a77cd54e/go.mod h1:Q9WmQ9cVkrHx6g4KSl6TN+N3vEOkDZd9RtyXCHd5OPQ= github.com/grafana/e2e v0.1.0 h1:nThd0U0TjUqyOOupSb+qDd4BOdhqwhR/oYbjoqiMlZk= github.com/grafana/e2e v0.1.0/go.mod h1:+26VJWpczg2OU3D0537acnHSHzhJORpxOs6F+M27tZo= github.com/grafana/memberlist v0.2.5-0.20211201083710-c7bc8e9df94b/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= diff --git a/vendor/github.com/grafana/dskit/kv/client.go b/vendor/github.com/grafana/dskit/kv/client.go index b73620dfd6a..e8f0c6b5970 100644 --- a/vendor/github.com/grafana/dskit/kv/client.go +++ b/vendor/github.com/grafana/dskit/kv/client.go @@ -76,8 +76,14 @@ func (cfg *Config) RegisterFlagsWithPrefix(flagsPrefix, defaultPrefix string, f if flagsPrefix == "" { flagsPrefix = "ring." } + + // Allow clients to override default store by setting it before calling this method. + if cfg.Store == "" { + cfg.Store = "consul" + } + f.StringVar(&cfg.Prefix, flagsPrefix+"prefix", defaultPrefix, "The prefix for the keys in the store. Should end with a /.") - f.StringVar(&cfg.Store, flagsPrefix+"store", "consul", "Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi.") + f.StringVar(&cfg.Store, flagsPrefix+"store", cfg.Store, "Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi.") } // Client is a high-level client for key-value stores (such as Etcd and diff --git a/vendor/modules.txt b/vendor/modules.txt index 97cf9e48ea0..78d084aa364 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -338,7 +338,7 @@ github.com/gosimple/slug # github.com/grafana-tools/sdk v0.0.0-20211220201350-966b3088eec9 ## explicit; go 1.13 github.com/grafana-tools/sdk -# github.com/grafana/dskit v0.0.0-20220117094654-cd9c89e7e460 +# github.com/grafana/dskit v0.0.0-20220128074435-7436a77cd54e ## explicit; go 1.16 github.com/grafana/dskit/backoff github.com/grafana/dskit/concurrency From 208782a5a2960bed3ab8c9f6f4dadfd8f1dfd28e Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Fri, 28 Jan 2022 11:54:24 +0100 Subject: [PATCH 030/168] Remove storage engine from bug report template (#940) Signed-off-by: Marco Pracucci --- .github/ISSUE_TEMPLATE/bug_report.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index e47143a4d8f..b023881fae4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,11 +23,6 @@ A clear and concise description of what you expected to happen. - Infrastructure: [e.g., Kubernetes, bare-metal, laptop] - Deployment tool: [e.g., helm, jsonnet] -**Storage Engine** - -- [ ] Blocks -- [ ] Chunks - **Additional Context** From 291bbe4aafaebe1407d15c480284e2cdc0a90416 Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Fri, 28 Jan 2022 12:09:55 +0100 Subject: [PATCH 031/168] Replce cortex with mimir in mimirtool (#883) * Rename environment variables in mimirtool Signed-off-by: Dimitar Dimitrov * Rename mimirtool to cortextool Signed-off-by: Dimitar Dimitrov * Change "cortex" rules backend to "mimir" Signed-off-by: Dimitar Dimitrov * Change cortex to mimir in help text and errors Signed-off-by: Dimitar Dimitrov * Update CHANGELOG.md with PR # Signed-off-by: Dimitar Dimitrov * Update usage of CortexBackend in fed rules test Signed-off-by: Dimitar Dimitrov * Apply suggestions from code review Co-authored-by: Marco Pracucci * Remove unused links in mimirtool README.md Signed-off-by: Dimitar Dimitrov * Remove chunktool logcli benchtool from mimritool README Signed-off-by: Dimitar Dimitrov * Change license mention in mimirtool README Signed-off-by: Dimitar Dimitrov * Clean up code examples in mimirtool README Signed-off-by: Dimitar Dimitrov * Add spacing to mimirtool README.md Signed-off-by: Dimitar Dimitrov * Apply suggestions from code review Co-authored-by: Marco Pracucci * Fix linting Signed-off-by: Dimitar Dimitrov * Remove mention of brew in mimirtool README Signed-off-by: Dimitar Dimitrov Co-authored-by: Marco Pracucci --- cmd/mimirtool/CHANGELOG.md | 9 + cmd/mimirtool/README.md | 281 +++++++++---------- cmd/mimirtool/main.go | 2 +- development/tsdb-blocks-storage-s3/ruler.sh | 6 +- pkg/mimirtool/client/client.go | 2 +- pkg/mimirtool/commands/access_control.go | 2 +- pkg/mimirtool/commands/alerts.go | 33 +-- pkg/mimirtool/commands/analyse.go | 24 +- pkg/mimirtool/commands/analyse_rules_test.go | 2 +- pkg/mimirtool/commands/remote_read.go | 12 +- pkg/mimirtool/commands/rules.go | 34 +-- pkg/mimirtool/rules/compare.go | 2 +- pkg/mimirtool/rules/parser.go | 4 +- pkg/mimirtool/rules/parser_test.go | 8 +- pkg/mimirtool/rules/rules.go | 2 +- pkg/mimirtool/rules/rules_test.go | 2 +- 16 files changed, 204 insertions(+), 221 deletions(-) diff --git a/cmd/mimirtool/CHANGELOG.md b/cmd/mimirtool/CHANGELOG.md index 791ec008252..587c2a5f1b8 100644 --- a/cmd/mimirtool/CHANGELOG.md +++ b/cmd/mimirtool/CHANGELOG.md @@ -7,6 +7,15 @@ Order should be `CHANGE`, `FEATURE`, `ENHANCEMENT`, and `BUGFIX` * [FEATURE] Support Arm64 on Darwin for all binaries (benchtool etc). https://github.com/grafana/cortex-tools/pull/215 * [ENHANCEMENT] Correctly support federated rules. #823 * [BUGFIX] Fix `cortextool rules` legends displaying wrong symbols for updates and deletions. https://github.com/grafana/cortex-tools/pull/226 +* [CHANGE] The following environment variables have been renamed: #883 + * `CORTEX_ADDRESS` to `MIMIR_ADDRESS` + * `CORTEX_API_USER` to `MIMIR_API_USER` + * `CORTEX_API_KEY` to `MIMIR_API_KEY` + * `CORTEX_TENANT_ID` to `MIMIR_TENANT_ID` + * `CORTEX_TLS_CA_PATH` to `MIMIR_TLS_CA_PATH` + * `CORTEX_TLS_CERT_PATH` to `MIMIR_TLS_CERT_PATH` + * `CORTEX_TLS_KEY_PATH` to `MIMIR_TLS_KEY_PATH` +* [CHANGE] Change `cortex` backend to `mimir`. #883 ## v0.10.7 diff --git a/cmd/mimirtool/README.md b/cmd/mimirtool/README.md index a34d092d772..e8238875e12 100644 --- a/cmd/mimirtool/README.md +++ b/cmd/mimirtool/README.md @@ -1,94 +1,94 @@ -# Cortex Tools +# Mimir Tools -This repo contains tools used for interacting with [Cortex](https://github.com/cortexproject/cortex). +This tool is used to interact with user-facing Mimir APIs. -- [benchtool](docs/benchtool.md): A powerful YAML driven tool for benchmarking - Cortex write and query API. -- [cortextool](#cortextool): Interacts with user-facing Cortex APIs and backend storage components -- [chunktool](#chunktool): Interacts with chunks stored and indexed in Cortex storage backends. -- [logtool](#logtool): Tool which parses Cortex query-frontend logs and formats them for easy analysis. -- [e2ealerting](docs/e2ealerting.md): Tool that helps measure how long an alerts takes from scrape of sample to Alertmanager notifcation delivery. +- [mimirtool](#mimirtool): Interacts with user-facing Mimir APIs and backend storage components # Installation The various binaries are available for macOS, Windows, and Linux. -## macOS +## macOS, Linux, Windows, and Docker -`cortextool` is available on macOS via [Homebrew](https://brew.sh/): +Refer to the [latest release](https://github.com/grafana/mimir/releases) for installation instructions on these. -```bash -$ brew install grafana/grafana/cortextool -``` - -## Linux, Docker and Windows +## mimirtool -Refer to the [latest release](https://github.com/grafana/cortex-tools/releases) for installation intructions on these. - -## cortextool - -This tool is designed to interact with the various user-facing APIs provided by Cortex, as well as, interact with various backend storage components containing Cortex data. +This tool is designed to interact with the various user-facing APIs provided by Mimir, as well as, interact with various backend storage components containing Mimir data. ### Config Commands -Config commands interact with the Cortex api and read/create/update/delete user configs from Cortex. Specifically a users alertmanager and rule configs can be composed and updated using these commands. +Config commands interact with the Mimir api and read/create/update/delete user configs from Mimir. Specifically a users alertmanager and rule configs can be composed and updated using these commands. #### Configuration -| Env Variables | Flag | Description | -| ---------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| CORTEX_ADDRESS | `address` | Address of the API of the desired Cortex cluster. | -| CORTEX_API_USER | `user` | In cases where the Cortex API is set behind a basic auth gateway, a user can be set as a basic auth user. If empty and CORTEX_API_KEY is set, CORTEX_TENANT_ID will be used instead. | -| CORTEX_API_KEY | `key` | In cases where the Cortex API is set behind a basic auth gateway, a key can be set as a basic auth password. | -| CORTEX_TENANT_ID | `id` | The tenant ID of the Cortex instance to interact with. | +| Env Variables | Flag | Description | +| --------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| MIMIR_ADDRESS | `address` | Address of the API of the desired Mimir cluster. | +| MIMIR_API_USER | `user` | In cases where the Mimir API is set behind a basic auth gateway, a user can be set as a basic auth user. If empty and MIMIR_API_KEY is set, MIMIR_TENANT_ID will be used instead. | +| MIMIR_API_KEY | `key` | In cases where the Mimir API is set behind a basic auth gateway, a key can be set as a basic auth password. | +| MIMIR_TENANT_ID | `id` | The tenant ID of the Mimir instance to interact with. | #### Alertmanager -The following commands are used by users to interact with their Cortex alertmanager configuration, as well as their alert template files. +The following commands are used by users to interact with their Mimir alertmanager configuration, as well as their alert template files. ##### Alertmanager Get - cortextool alertmanager get +```bash +mimirtool alertmanager get +``` ##### Alertmanager Load - cortextool alertmanager load ./example_alertmanager_config.yaml - - cortextool alertmanager load ./example_alertmanager_config.yaml template_file1.tmpl template_file2.tmpl +```bash +mimirtool alertmanager load ./example_alertmanager_config.yaml +mimirtool alertmanager load ./example_alertmanager_config.yaml template_file1.tmpl template_file2.tmpl +``` #### Rules -The following commands are used by users to interact with their Cortex ruler configuration. They can load prometheus rule files, as well as interact with individual rule groups. +The following commands are used by users to interact with their Mimir ruler configuration. They can load prometheus rule files, as well as interact with individual rule groups. ##### Rules List -This command will retrieve all of the rule groups stored in the specified Cortex instance and print each one by rule group name and namespace to the terminal. +This command will retrieve all of the rule groups stored in the specified Mimir instance and print each one by rule group name and namespace to the terminal. - cortextool rules list +```bash +mimirtool rules list +``` ##### Rules Print -This command will retrieve all of the rule groups stored in the specified Cortex instance and print them to the terminal. +This command will retrieve all of the rule groups stored in the specified Mimir instance and print them to the terminal. - cortextool rules print +```bash +mimirtool rules print +``` ##### Rules Get -This command will retrieve the specified rule group from Cortex and print it to the terminal. +This command will retrieve the specified rule group from Mimir and print it to the terminal. - cortextool rules get example_namespace example_rule_group +```bash +mimirtool rules get example_namespace example_rule_group +``` ##### Rules Delete This command will delete the specified rule group from the specified namespace. - cortextool rules delete example_namespace example_rule_group +```bash +mimirtool rules delete example_namespace example_rule_group +``` ##### Rules Load -This command will load each rule group in the specified files and load them into Cortex. If a rule already exists in Cortex it will be overwritten if a diff is found. +This command will load each rule group in the specified files and load them into Mimir. If a rule already exists in Mimir it will be overwritten if a diff is found. - cortextool rules load ./example_rules_one.yaml ./example_rules_two.yaml ... +```bash +mimirtool rules load ./example_rules_one.yaml ./example_rules_two.yaml +``` Example file: @@ -105,17 +105,21 @@ groups: ##### Rules Lint -This command lints a rules file. The linter's aim is not to verify correctness but just YAML and PromQL expression formatting within the rule file. This command always edits in place, you can use the dry run flag (`-n`) if you'd like to perform a trial run that does not make any changes. This command does not interact with your Cortex cluster. +This command lints a rules file. The linter's aim is not to verify correctness but just YAML and PromQL expression formatting within the rule file. This command always edits in place, you can use the dry run flag (`-n`) if you'd like to perform a trial run that does not make any changes. This command does not interact with your Mimir cluster. - cortextool rules lint -n ./example_rules_one.yaml ./example_rules_two.yaml ... +```bash +mimirtool rules lint -n ./example_rules_one.yaml ./example_rules_two.yaml +``` The format of the file is the same as in [Rules Diff](#rules-diff). ##### Rules Prepare -This command prepares a rules file for upload to Cortex. It lints all your PromQL expressions and adds an specific label to your PromQL query aggregations in the file. This command does not interact with your Cortex cluster. +This command prepares a rules file for upload to Mimir. It lints all your PromQL expressions and adds an specific label to your PromQL query aggregations in the file. This command does not interact with your Mimir cluster. - cortextool rules prepare -i ./example_rules_one.yaml ./example_rules_two.yaml ... +```bash +mimirtool rules prepare -i ./example_rules_one.yaml ./example_rules_two.yaml +``` The format of the file is the same as in [Rules Diff](#rules-diff). @@ -126,7 +130,9 @@ There are two flags of note for this command: At the end of the run, the command tells you whenever the operation was a success in the form of - INFO[0000] SUCESS: 194 rules found, 0 modified expressions +```console +INFO[0000] SUCESS: 194 rules found, 0 modified expressions +``` It is important to note that a modification can be a PromQL expression lint or a label add to your aggregation. @@ -134,7 +140,9 @@ It is important to note that a modification can be a PromQL expression lint or a This command checks rules against the recommended [best practices](https://prometheus.io/docs/practices/rules/) for rules. This command does not interact with your Mimir cluster. - mimirtool rules check ./example_rules_one.yaml +```bash +mimirtool rules check ./example_rules_one.yaml +``` The format of the file is the same as in [Rules Diff](#rules-diff). @@ -142,7 +150,9 @@ The format of the file is the same as in [Rules Diff](#rules-diff). This command compares rules against the rules in your Mimir cluster. - mimirtool rules diff ./example_rules_one.yaml +```bash +mimirtool rules diff ./example_rules_one.yaml +``` The format of the file is the same as in [Rules Diff](#rules-diff). @@ -150,13 +160,15 @@ The format of the file is the same as in [Rules Diff](#rules-diff). This command compares rules against the rules in your Mimir cluster. It applies any differences to your Mimir cluster. - mimirtool rules sync ./example_rules_one.yaml +```bash +mimirtool rules sync ./example_rules_one.yaml +``` The format of the file is the same as in [Rules Diff](#rules-diff). #### Remote Read -Cortex exposes a [Remote Read API] which allows access to the stored series. The `remote-read` subcommand of `cortextool` allows to interact with its API, to find out which series are stored. +Mimir exposes a [Remote Read API] which allows access to the stored series. The `remote-read` subcommand of `mimirtool` allows to interact with its API, to find out which series are stored. [remote read api]: https://prometheus.io/docs/prometheus/latest/storage/#remote-storage-integrations @@ -164,8 +176,13 @@ Cortex exposes a [Remote Read API] which allows access to the stored series. The The `remote-read stats` command summarizes statistics of the stored series matching the selector. -```sh -cortextool remote-read stats --selector '{job="node"}' --address http://demo.robustperception.io:9090 --remote-read-path /api/v1/read +```bash +mimirtool remote-read stats --selector '{job="node"}' --address http://demo.robustperception.io:9090 --remote-read-path /api/v1/read +``` + +The output is the following: + +```console INFO[0000] Create remote read client using endpoint 'http://demo.robustperception.io:9090/api/v1/read' INFO[0000] Querying time from=2020-12-30T14:00:00Z to=2020-12-30T15:00:00Z with selector={job="node"} INFO[0000] MIN TIME MAX TIME DURATION NUM SAMPLES NUM SERIES NUM STALE NAN VALUES NUM NAN VALUES @@ -176,8 +193,13 @@ INFO[0000] 2020-12-30 14:00:00.629 +0000 UTC 2020-12-30 14:59:59.629 +0000 UTC The `remote-read dump` command prints all series and samples matching the selector. -```sh -cortextool remote-read dump --selector 'up{job="node"}' --address http://demo.robustperception.io:9090 --remote-read-path /api/v1/read +```bash +mimirtool remote-read dump --selector 'up{job="node"}' --address http://demo.robustperception.io:9090 --remote-read-path /api/v1/read +``` + +The output is the following: + +```console {__name__="up", instance="demo.robustperception.io:9100", job="node"} 1 1609336914711 {__name__="up", instance="demo.robustperception.io:9100", job="node"} NaN 1609336924709 # StaleNaN [...] @@ -187,9 +209,14 @@ cortextool remote-read dump --selector 'up{job="node"}' --address http://demo.ro The `remote-read export` command exports all series and samples matching the selector into a local TSDB. This TSDB can then be further analysed with local tooling like `prometheus` and `promtool`. -```sh +```bash # Use Remote Read API to download all metrics with label job=name into local tsdb -cortextool remote-read export --selector '{job="node"}' --address http://demo.robustperception.io:9090 --remote-read-path /api/v1/read --tsdb-path ./local-tsdb +mimirtool remote-read export --selector '{job="node"}' --address http://demo.robustperception.io:9090 --remote-read-path /api/v1/read --tsdb-path ./local-tsdb +``` + +The output is the following: + +```console INFO[0000] Create remote read client using endpoint 'http://demo.robustperception.io:9090/api/v1/read' INFO[0000] Created TSDB in path './local-tsdb' INFO[0000] Using existing TSDB in path './local-tsdb' @@ -198,15 +225,25 @@ INFO[0001] Store TSDB blocks in './local-tsdb' INFO[0001] BLOCK ULID MIN TIME MAX TIME DURATION NUM SAMPLES NUM CHUNKS NUM SERIES SIZE INFO[0001] 01ETT28D6B8948J87NZXY8VYD9 2020-12-30 13:53:59 +0000 UTC 2020-12-30 13:59:59 +0000 UTC 6m0.001s 15950 429 425 105KiB867B INFO[0001] 01ETT28D91Z9SVRYF3DY0KNV41 2020-12-30 14:00:00 +0000 UTC 2020-12-30 14:53:58 +0000 UTC 53m58.001s 143530 1325 425 509KiB679B +``` -# Examples for using local TSDB -## Analyzing contents using promtool +###### Examples for using local TSDB + +Analyzing contents using promtool + +```bash promtool tsdb analyze ./local-tsdb +``` + +Dump all values of the TSDB -## Dump all values of the TSDB +```bash promtool tsdb dump ./local-tsdb +``` + +Run a local prometheus -## Run a local prometheus +```bash prometheus --storage.tsdb.path ./local-tsdb --config.file=<(echo "") ``` @@ -214,7 +251,9 @@ prometheus --storage.tsdb.path ./local-tsdb --config.file=<(echo "") The Overrides Exporter allows to continuously export [per tenant configuration overrides][runtime-config] as metrics. Optionally it can also export a presets file (cf. example [override config file] and [presets file]). - cortextool overrides-exporter --overrides-file overrides.yaml --presets-file presets.yaml +```bash +mimirtool overrides-exporter --overrides-file overrides.yaml --presets-file presets.yaml +``` [override config file]: ./pkg/commands/testdata/overrides.yaml [presets file]: ./pkg/commands/testdata/presets.yaml @@ -224,13 +263,13 @@ The Overrides Exporter allows to continuously export [per tenant configuration o This lets you generate the header which can then be used to enforce access control rules in GME / GrafanaCloud. -``` -./cortextool acl generate-header --id=1234 --rule='{namespace="A"}' +```bash +mimirtool acl generate-header --id=1234 --rule='{namespace="A"}' ``` #### Analyse -Run analysis against your Prometheus, Grafana and Cortex to see which metrics being used and exported. Can also extract metrics +Run analysis against your Prometheus, Grafana and Mimir to see which metrics being used and exported. Can also extract metrics from dashboard JSON and rules YAML files. ##### `analyse grafana` @@ -247,8 +286,8 @@ This command will run against your Grafana instance and will download its dashbo ###### Running the command -```shell -cortextool analyse grafana --address= --key= +```bash +mimirtool analyse grafana --address= --key= ``` ###### Sample output @@ -286,17 +325,17 @@ This command will run against your Grafana Cloud Prometheus instance and will fe ###### Configuration -| Env Variables | Flag | Description | -| ---------------- | --------- | ------------------------------------------------------- | -| CORTEX_ADDRESS | `address` | Address of the Prometheus instance. | -| CORTEX_TENANT_ID | `id` | If you're using Grafana Cloud this is your instance ID. | -| CORTEX_API_KEY | `key` | If you're using Grafana Cloud this is your API Key. | -| \_\_ | `output` | The output file path. metrics-in-ruler.json by default. | +| Env Variables | Flag | Description | +| --------------- | --------- | ------------------------------------------------------- | +| MIMIR_ADDRESS | `address` | Address of the Prometheus instance. | +| MIMIR_TENANT_ID | `id` | If you're using Grafana Cloud this is your instance ID. | +| MIMIR_API_KEY | `key` | If you're using Grafana Cloud this is your API Key. | +| \_\_ | `output` | The output file path. metrics-in-ruler.json by default. | ###### Running the command -```shell -cortextool analyse ruler --address=https://prometheus-blocks-prod-us-central1.grafana.net --id=<1234> --key= +```bash +mimirtool analyse ruler --address=https://prometheus-blocks-prod-us-central1.grafana.net --id=<1234> --key= ``` ###### Sample output @@ -330,19 +369,19 @@ This command will run against your Prometheus / Cloud Prometheus instance. It wi ###### Configuration -| Env Variables | Flag | Description | -| ---------------- | ---------------------- | ---------------------------------------------------------------------------- | -| CORTEX_ADDRESS | `address` | Address of the Prometheus instance. | -| CORTEX_TENANT_ID | `id` | If you're using Grafana Cloud this is your instance ID. | -| CORTEX_API_KEY | `key` | If you're using Grafana Cloud this is your API Key. | -| \_\_ | `grafana-metrics-file` | The dashboard metrics input file path. `metrics-in-grafana.json` by default. | -| \_\_ | `ruler-metrics-file` | The rules metrics input file path. `metrics-in-ruler.json` by default. | -| \_\_ | `output` | The output file path. `prometheus-metrics.json` by default. | +| Env Variables | Flag | Description | +| --------------- | ---------------------- | ---------------------------------------------------------------------------- | +| MIMIR_ADDRESS | `address` | Address of the Prometheus instance. | +| MIMIR_TENANT_ID | `id` | If you're using Grafana Cloud this is your instance ID. | +| MIMIR_API_KEY | `key` | If you're using Grafana Cloud this is your API Key. | +| \_\_ | `grafana-metrics-file` | The dashboard metrics input file path. `metrics-in-grafana.json` by default. | +| \_\_ | `ruler-metrics-file` | The rules metrics input file path. `metrics-in-ruler.json` by default. | +| \_\_ | `output` | The output file path. `prometheus-metrics.json` by default. | ###### Running the command -```shell -cortextool analyse prometheus --address=https://prometheus-blocks-prod-us-central1.grafana.net --id=<1234> --key= --log.level=debug +```bash +mimirtool analyse prometheus --address=https://prometheus-blocks-prod-us-central1.grafana.net --id=<1234> --key= --log.level=debug ``` ###### Sample output @@ -395,8 +434,8 @@ This command accepts Grafana dashboard JSON files as input and extracts Promethe ###### Running the command -```shell -cortextool analyse dashboard ./dashboard_one.json ./dashboard_two.json ... +```bash +mimirtool analyse dashboard ./dashboard_one.json ./dashboard_two.json ``` ##### `analyse rule-file` @@ -405,72 +444,10 @@ This command accepts Prometheus rule YAML files as input and extracts Prometheus ###### Running the command -```shell -cortextool analyse rule-file ./rule_file_one.yaml ./rule_file_two.yaml ... -``` - -## chunktool - -This repo also contains the `chunktool`. A client meant to interact with chunks stored and indexed in cortex backends. - -##### Chunk Delete - -The delete command currently cleans all index entries pointing to chunks in the specified index. Only bigtable and the v10 schema are currently fully supported. This will not delete the entire index entry, only the corresponding chunk entries within the index row. - -##### Chunk Migrate - -The migrate command helps with migrating chunks across cortex clusters. It also takes care of setting right index in the new cluster as per the specified schema config. - -As of now it only supports `Bigtable` or `GCS` as a source to read chunks from for migration while for writing it supports all the storages that Cortex supports. -More details about it [here](./pkg/chunk/migrate/README.md) - -##### Chunk Validate/Clean-Index - -The `chunk validate-index` and `chunk clean-index` command allows users to scan their index and chunk backends for invalid entries. The `validate-index` command will find invalid entries and ouput them to a CSV file. The `clean-index` command will take that CSV file as input and delete the invalid entries. - -## logtool - -A CLI tool to parse Cortex query-frontend logs and formats them for easy analysis. - -``` -Options: - -dur duration - only show queries which took longer than this duration, e.g. -dur 10s - -query - show the query - -utc - show timestamp in UTC time -``` - -Feed logs into it using [`logcli`](https://github.com/grafana/loki/blob/master/docs/getting-started/logcli.md) from Loki, [`kubectl`](https://kubernetes.io/docs/reference/kubectl/overview/) for Kubernetes, `cat` from a file, or any other way to get raw logs: - -Loki `logcli` example: - -``` -$ logcli query '{cluster="us-central1", name="query-frontend", namespace="dev"}' --limit=5000 --since=3h --forward -o raw | ./logtool -dur 5s -https://logs-dev-ops-tools1.grafana.net/loki/api/v1/query_range?direction=FORWARD&end=1591119479093405000&limit=5000&query=%7Bcluster%3D%22us-central1%22%2C+name%3D%22query-frontend%22%2C+namespace%3D%22dev%22%7D&start=1591108679093405000 -Common labels: {cluster="us-central1", container_name="query-frontend", job="dev/query-frontend", level="debug", name="query-frontend", namespace="dev", pod_template_hash="7cd4bf469d", stream="stderr"} - -Timestamp TraceID Length Duration Status Path -2020-06-02 10:38:40.34205349 -0400 EDT 1f2533b40f7711d3 12h0m0s 21.92465802s (200) /api/prom/api/v1/query_range -2020-06-02 10:40:25.171649132 -0400 EDT 2ac59421db0000d8 168h0m0s 16.378698276s (200) /api/prom/api/v1/query_range -2020-06-02 10:40:29.698167258 -0400 EDT 3fd088d900160ba8 168h0m0s 20.912864541s (200) /api/prom/api/v1/query_range -``` - -``` -$ cat query-frontend-logs.log | ./logtool -dur 5s -Timestamp TraceID Length Duration Status Path -2020-05-26 13:51:15.0577354 -0400 EDT 76b9939fd5c78b8f 6h0m0s 10.249149614s (200) /api/prom/api/v1/query_range -2020-05-26 13:52:15.771988849 -0400 EDT 2e7473ab10160630 10h33m0s 7.472855362s (200) /api/prom/api/v1/query_range -2020-05-26 13:53:46.712563497 -0400 EDT 761f3221dcdd85de 10h33m0s 11.874296689s (200) /api/prom/api/v1/query_range +```bash +mimirtool analyse rule-file ./rule_file_one.yaml ./rule_file_two.yaml ``` -## benchtool - -A tool for benchmarking a Prometheus remote-write backend and PromQL compatible -API. It allows for metrics to be generated using a [workload -file](docs/benchtool.md). - ### License -Licensed Apache 2.0, see [LICENSE](LICENSE). +Licensed AGPLv3, see [LICENSE](../../LICENSE). diff --git a/cmd/mimirtool/main.go b/cmd/mimirtool/main.go index 1cf579075ff..a192a66d876 100644 --- a/cmd/mimirtool/main.go +++ b/cmd/mimirtool/main.go @@ -29,7 +29,7 @@ var ( ) func main() { - app := kingpin.New("mimirtool", "A command-line tool to manage cortex.") + app := kingpin.New("mimirtool", "A command-line tool to manage mimir and GEM.") logConfig.Register(app) alertCommand.Register(app) alertmanagerCommand.Register(app) diff --git a/development/tsdb-blocks-storage-s3/ruler.sh b/development/tsdb-blocks-storage-s3/ruler.sh index 7a2e6c26fdc..7b066614205 100755 --- a/development/tsdb-blocks-storage-s3/ruler.sh +++ b/development/tsdb-blocks-storage-s3/ruler.sh @@ -1,7 +1,7 @@ #!/bin/sh # SPDX-License-Identifier: AGPL-3.0-only -export CORTEX_ADDRESS=http://localhost:8021/ -export CORTEX_TENANT_ID=fake +export MIMIR_ADDRESS=http://localhost:8021/ +export MIMIR_TENANT_ID=fake -cortextool rules $@ +mimirtool rules $@ diff --git a/pkg/mimirtool/client/client.go b/pkg/mimirtool/client/client.go index 38a7986138c..1e1b53b263b 100644 --- a/pkg/mimirtool/client/client.go +++ b/pkg/mimirtool/client/client.go @@ -99,7 +99,7 @@ func New(cfg Config) (*CortexClient, error) { }, nil } -// Query executes a PromQL query against the Cortex cluster. +// Query executes a PromQL query against the Mimir cluster. func (r *CortexClient) Query(ctx context.Context, query string) (*http.Response, error) { query = fmt.Sprintf("query=%s&time=%d", query, time.Now().Unix()) diff --git a/pkg/mimirtool/commands/access_control.go b/pkg/mimirtool/commands/access_control.go index 802535c758b..070c058ec20 100644 --- a/pkg/mimirtool/commands/access_control.go +++ b/pkg/mimirtool/commands/access_control.go @@ -26,7 +26,7 @@ func (a *AccessControlCommand) Register(app *kingpin.Application) { aclCmd := app.Command("acl", "Generate and view ACL options in GrafanaCloud.") generateHeaderCmd := aclCmd.Command("generate-header", "Generate the header that needs to be passed to the datasource for setting ACLs.").Action(a.generateHeader) - generateHeaderCmd.Flag("id", "Cortex tenant ID, alternatively set CORTEX_TENANT_ID.").Envar("CORTEX_TENANT_ID").Required().StringVar(&a.InstanceID) + generateHeaderCmd.Flag("id", "Cortex tenant ID, alternatively set MIMIR_TENANT_ID.").Envar("MIMIR_TENANT_ID").Required().StringVar(&a.InstanceID) generateHeaderCmd.Flag("rule", "The access control rules (Prometheus selectors). Set it multiple times to set multiple rules.").Required().StringsVar(&a.ACLs) } diff --git a/pkg/mimirtool/commands/alerts.go b/pkg/mimirtool/commands/alerts.go index 2ebcdcbac5b..e14a7cd3dee 100644 --- a/pkg/mimirtool/commands/alerts.go +++ b/pkg/mimirtool/commands/alerts.go @@ -9,22 +9,19 @@ import ( "context" "encoding/json" "fmt" + "io/ioutil" "net/http" + "net/url" "os" "os/signal" "strings" "time" - "io/ioutil" - "net/url" - "github.com/pkg/errors" - "github.com/prometheus/alertmanager/config" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" - log "github.com/sirupsen/logrus" "gopkg.in/alecthomas/kingpin.v2" @@ -41,7 +38,7 @@ var ( ) ) -// AlertmanagerCommand configures and executes rule related cortex api operations +// AlertmanagerCommand configures and executes rule related mimir api operations type AlertmanagerCommand struct { ClientConfig client.Config AlertmanagerURL url.URL @@ -68,13 +65,13 @@ type AlertCommand struct { // Register rule related commands and flags with the kingpin application func (a *AlertmanagerCommand) Register(app *kingpin.Application) { alertCmd := app.Command("alertmanager", "View & edit alertmanager configs stored in cortex.").PreAction(a.setup) - alertCmd.Flag("address", "Address of the cortex cluster, alternatively set CORTEX_ADDRESS.").Envar("CORTEX_ADDRESS").Required().StringVar(&a.ClientConfig.Address) - alertCmd.Flag("id", "Cortex tenant id, alternatively set CORTEX_TENANT_ID.").Envar("CORTEX_TENANT_ID").Required().StringVar(&a.ClientConfig.ID) - alertCmd.Flag("user", "API user to use when contacting cortex, alternatively set CORTEX_API_USER. If empty, CORTEX_TENANT_ID will be used instead.").Default("").Envar("CORTEX_API_USER").StringVar(&a.ClientConfig.User) - alertCmd.Flag("key", "API key to use when contacting cortex, alternatively set CORTEX_API_KEY.").Default("").Envar("CORTEX_API_KEY").StringVar(&a.ClientConfig.Key) - alertCmd.Flag("tls-ca-path", "TLS CA certificate to verify cortex API as part of mTLS, alternatively set CORTEX_TLS_CA_PATH.").Default("").Envar("CORTEX_TLS_CA_PATH").StringVar(&a.ClientConfig.TLS.CAPath) - alertCmd.Flag("tls-cert-path", "TLS client certificate to authenticate with cortex API as part of mTLS, alternatively set CORTEX_TLS_CERT_PATH.").Default("").Envar("CORTEX_TLS_CERT_PATH").StringVar(&a.ClientConfig.TLS.CertPath) - alertCmd.Flag("tls-key-path", "TLS client certificate private key to authenticate with cortex API as part of mTLS, alternatively set CORTEX_TLS_KEY_PATH.").Default("").Envar("CORTEX_TLS_KEY_PATH").StringVar(&a.ClientConfig.TLS.KeyPath) + alertCmd.Flag("address", "Address of the cortex cluster, alternatively set MIMIR_ADDRESS.").Envar("MIMIR_ADDRESS").Required().StringVar(&a.ClientConfig.Address) + alertCmd.Flag("id", "Cortex tenant id, alternatively set MIMIR_TENANT_ID.").Envar("MIMIR_TENANT_ID").Required().StringVar(&a.ClientConfig.ID) + alertCmd.Flag("user", "API user to use when contacting cortex, alternatively set MIMIR_API_USER. If empty, MIMIR_TENANT_ID will be used instead.").Default("").Envar("MIMIR_API_USER").StringVar(&a.ClientConfig.User) + alertCmd.Flag("key", "API key to use when contacting cortex, alternatively set MIMIR_API_KEY.").Default("").Envar("MIMIR_API_KEY").StringVar(&a.ClientConfig.Key) + alertCmd.Flag("tls-ca-path", "TLS CA certificate to verify cortex API as part of mTLS, alternatively set MIMIR_TLS_CA_PATH.").Default("").Envar("MIMIR_TLS_CA_PATH").StringVar(&a.ClientConfig.TLS.CAPath) + alertCmd.Flag("tls-cert-path", "TLS client certificate to authenticate with cortex API as part of mTLS, alternatively set MIMIR_TLS_CERT_PATH.").Default("").Envar("MIMIR_TLS_CERT_PATH").StringVar(&a.ClientConfig.TLS.CertPath) + alertCmd.Flag("tls-key-path", "TLS client certificate private key to authenticate with cortex API as part of mTLS, alternatively set MIMIR_TLS_KEY_PATH.").Default("").Envar("MIMIR_TLS_KEY_PATH").StringVar(&a.ClientConfig.TLS.KeyPath) // Get Alertmanager Configs Command getAlertsCmd := alertCmd.Command("get", "Get the alertmanager config currently in the cortex alertmanager.").Action(a.getConfig) @@ -146,10 +143,10 @@ func (a *AlertmanagerCommand) deleteConfig(k *kingpin.ParseContext) error { func (a *AlertCommand) Register(app *kingpin.Application) { alertCmd := app.Command("alerts", "View active alerts in alertmanager.").PreAction(a.setup) - alertCmd.Flag("address", "Address of the cortex cluster, alternatively set CORTEX_ADDRESS.").Envar("CORTEX_ADDRESS").Required().StringVar(&a.ClientConfig.Address) - alertCmd.Flag("id", "Cortex tenant id, alternatively set CORTEX_TENANT_ID.").Envar("CORTEX_TENANT_ID").Required().StringVar(&a.ClientConfig.ID) - alertCmd.Flag("user", "API user to use when contacting cortex, alternatively set CORTEX_API_USER. If empty, CORTEX_TENANT_ID will be used instead.").Default("").Envar("CORTEX_API_USER").StringVar(&a.ClientConfig.User) - alertCmd.Flag("key", "API key to use when contacting cortex, alternatively set CORTEX_API_KEY.").Default("").Envar("CORTEX_API_KEY").StringVar(&a.ClientConfig.Key) + alertCmd.Flag("address", "Address of the cortex cluster, alternatively set MIMIR_ADDRESS.").Envar("MIMIR_ADDRESS").Required().StringVar(&a.ClientConfig.Address) + alertCmd.Flag("id", "Cortex tenant id, alternatively set MIMIR_TENANT_ID.").Envar("MIMIR_TENANT_ID").Required().StringVar(&a.ClientConfig.ID) + alertCmd.Flag("user", "API user to use when contacting cortex, alternatively set MIMIR_API_USER. If empty, MIMIR_TENANT_ID will be used instead.").Default("").Envar("MIMIR_API_USER").StringVar(&a.ClientConfig.User) + alertCmd.Flag("key", "API key to use when contacting cortex, alternatively set MIMIR_API_KEY.").Default("").Envar("MIMIR_API_KEY").StringVar(&a.ClientConfig.Key) verifyAlertsCmd := alertCmd.Command("verify", "Verifies alerts in an alertmanager cluster are deduplicated; useful for verifying correct configuration when transferring from Prometheus to Cortex alert evaluation.").Action(a.verifyConfig) verifyAlertsCmd.Flag("ignore-alerts", "A comma separated list of Alert names to ignore in deduplication checks.").StringVar(&a.IgnoreString) @@ -208,7 +205,7 @@ func (a *AlertCommand) verifyConfig(k *kingpin.ParseContext) error { return err } - // Use a different registerer than default so we don't get all the Cortex metrics, but include Go runtime metrics. + // Use a different registerer than default so we don't get all the Mimir metrics, but include Go runtime metrics. goStats := collectors.NewGoCollector() reg := prometheus.NewRegistry() reg.MustRegister(nonDuplicateAlerts) diff --git a/pkg/mimirtool/commands/analyse.go b/pkg/mimirtool/commands/analyse.go index a6c0f332af1..9781a3943c1 100644 --- a/pkg/mimirtool/commands/analyse.go +++ b/pkg/mimirtool/commands/analyse.go @@ -17,16 +17,16 @@ func (cmd *AnalyseCommand) Register(app *kingpin.Application) { paCmd := &PrometheusAnalyseCommand{} prometheusAnalyseCmd := analyseCmd.Command("prometheus", "Take the metrics being used in Grafana and get the cardinality from a Prometheus.").Action(paCmd.run) - prometheusAnalyseCmd.Flag("address", "Address of the Prometheus/Cortex instance, alternatively set $CORTEX_ADDRESS."). - Envar("CORTEX_ADDRESS"). + prometheusAnalyseCmd.Flag("address", "Address of the Prometheus/Cortex instance, alternatively set $MIMIR_ADDRESS."). + Envar("MIMIR_ADDRESS"). Required(). StringVar(&paCmd.address) - prometheusAnalyseCmd.Flag("id", "Username to use when contacting Prometheus/Cortex, alternatively set $CORTEX_TENANT_ID."). - Envar("CORTEX_TENANT_ID"). + prometheusAnalyseCmd.Flag("id", "Username to use when contacting Prometheus/Cortex, alternatively set $MIMIR_TENANT_ID."). + Envar("MIMIR_TENANT_ID"). Default(""). StringVar(&paCmd.username) - prometheusAnalyseCmd.Flag("key", "Password to use when contacting Prometheus/Cortex, alternatively set $CORTEX_API_KEY."). - Envar("CORTEX_API_KEY"). + prometheusAnalyseCmd.Flag("key", "Password to use when contacting Prometheus/Cortex, alternatively set $MIMIR_API_KEY."). + Envar("MIMIR_API_KEY"). Default(""). StringVar(&paCmd.password) prometheusAnalyseCmd.Flag("read-timeout", "timeout for read requests"). @@ -63,16 +63,16 @@ func (cmd *AnalyseCommand) Register(app *kingpin.Application) { raCmd := &RulerAnalyseCommand{} rulerAnalyseCmd := analyseCmd.Command("ruler", "Analyse and extract the metrics used in Cortex rules"). Action(raCmd.run) - rulerAnalyseCmd.Flag("address", "Address of the Prometheus/Cortex instance, alternatively set $CORTEX_ADDRESS."). - Envar("CORTEX_ADDRESS"). + rulerAnalyseCmd.Flag("address", "Address of the Prometheus/Cortex instance, alternatively set $MIMIR_ADDRESS."). + Envar("MIMIR_ADDRESS"). Required(). StringVar(&raCmd.ClientConfig.Address) - rulerAnalyseCmd.Flag("id", "Username to use when contacting Prometheus/Cortex, alternatively set $CORTEX_TENANT_ID."). - Envar("CORTEX_TENANT_ID"). + rulerAnalyseCmd.Flag("id", "Username to use when contacting Prometheus/Cortex, alternatively set $MIMIR_TENANT_ID."). + Envar("MIMIR_TENANT_ID"). Default(""). StringVar(&raCmd.ClientConfig.ID) - rulerAnalyseCmd.Flag("key", "Password to use when contacting Prometheus/Cortex, alternatively set $CORTEX_API_KEY."). - Envar("CORTEX_API_KEY"). + rulerAnalyseCmd.Flag("key", "Password to use when contacting Prometheus/Cortex, alternatively set $MIMIR_API_KEY."). + Envar("MIMIR_API_KEY"). Default(""). StringVar(&raCmd.ClientConfig.Key) rulerAnalyseCmd.Flag("output", "The path for the output file"). diff --git a/pkg/mimirtool/commands/analyse_rules_test.go b/pkg/mimirtool/commands/analyse_rules_test.go index f9a7bfa8056..91c5bf15138 100644 --- a/pkg/mimirtool/commands/analyse_rules_test.go +++ b/pkg/mimirtool/commands/analyse_rules_test.go @@ -53,7 +53,7 @@ func TestParseMetricsInRuleFile(t *testing.T) { output := &analyse.MetricsInRuler{} output.OverallMetrics = make(map[string]struct{}) - nss, err := rules.ParseFiles("cortex", []string{"testdata/prometheus_rules.yaml"}) + nss, err := rules.ParseFiles("mimir", []string{"testdata/prometheus_rules.yaml"}) require.NoError(t, err) for _, ns := range nss { diff --git a/pkg/mimirtool/commands/remote_read.go b/pkg/mimirtool/commands/remote_read.go index c978952212a..e078fd2e302 100644 --- a/pkg/mimirtool/commands/remote_read.go +++ b/pkg/mimirtool/commands/remote_read.go @@ -57,19 +57,19 @@ func (c *RemoteReadCommand) Register(app *kingpin.Application) { now := time.Now() for _, cmd := range []*kingpin.CmdClause{exportCmd, dumpCmd, statsCmd} { - cmd.Flag("address", "Address of the cortex cluster, alternatively set $CORTEX_ADDRESS."). - Envar("CORTEX_ADDRESS"). + cmd.Flag("address", "Address of the cortex cluster, alternatively set $MIMIR_ADDRESS."). + Envar("MIMIR_ADDRESS"). Required(). StringVar(&c.address) cmd.Flag("remote-read-path", "Path of the remote read endpoint."). Default("/prometheus/api/v1/read"). StringVar(&c.remoteReadPath) - cmd.Flag("id", "Cortex tenant id, alternatively set $CORTEX_TENANT_ID."). - Envar("CORTEX_TENANT_ID"). + cmd.Flag("id", "Cortex tenant id, alternatively set $MIMIR_TENANT_ID."). + Envar("MIMIR_TENANT_ID"). Default(""). StringVar(&c.tenantID) - cmd.Flag("key", "Api key to use when contacting cortex, alternatively set $CORTEX_API_KEY."). - Envar("CORTEX_API_KEY"). + cmd.Flag("key", "Api key to use when contacting cortex, alternatively set $MIMIR_API_KEY."). + Envar("MIMIR_API_KEY"). Default(""). StringVar(&c.apiKey) cmd.Flag("read-timeout", "timeout for read requests"). diff --git a/pkg/mimirtool/commands/rules.go b/pkg/mimirtool/commands/rules.go index 118287a5915..fbe16fa4dd2 100644 --- a/pkg/mimirtool/commands/rules.go +++ b/pkg/mimirtool/commands/rules.go @@ -43,11 +43,11 @@ var ( Help: "The timestamp of the last successful rule load.", }) - backends = []string{rules.CortexBackend} // list of supported backend types + backends = []string{rules.MimirBackend} // list of supported backend types formats = []string{"json", "yaml", "table"} // list of supported formats for the list command ) -// RuleCommand configures and executes rule related cortex operations +// RuleCommand configures and executes rule related mimir operations type RuleCommand struct { ClientConfig client.Config @@ -95,8 +95,8 @@ type RuleCommand struct { // Register rule related commands and flags with the kingpin application func (r *RuleCommand) Register(app *kingpin.Application) { rulesCmd := app.Command("rules", "View & edit rules stored in cortex.").PreAction(r.setup) - rulesCmd.Flag("user", "API user to use when contacting cortex, alternatively set CORTEX_API_USER. If empty, CORTEX_TENANT_ID will be used instead.").Default("").Envar("CORTEX_API_USER").StringVar(&r.ClientConfig.User) - rulesCmd.Flag("key", "API key to use when contacting cortex, alternatively set CORTEX_API_KEY.").Default("").Envar("CORTEX_API_KEY").StringVar(&r.ClientConfig.Key) + rulesCmd.Flag("user", "API user to use when contacting cortex, alternatively set MIMIR_API_USER. If empty, MIMIR_TENANT_ID will be used instead.").Default("").Envar("MIMIR_API_USER").StringVar(&r.ClientConfig.User) + rulesCmd.Flag("key", "API key to use when contacting cortex, alternatively set MIMIR_API_KEY.").Default("").Envar("MIMIR_API_KEY").StringVar(&r.ClientConfig.Key) rulesCmd.Flag("backend", "Backend type to interact with: ").Default("cortex").EnumVar(&r.Backend, backends...) // Register rule commands @@ -131,15 +131,15 @@ func (r *RuleCommand) Register(app *kingpin.Application) { Command("check", "runs various best practice checks against rules."). Action(r.checkRecordingRuleNames) - // Require Cortex cluster address and tentant ID on all these commands + // Require Mimir cluster address and tentant ID on all these commands for _, c := range []*kingpin.CmdClause{listCmd, printRulesCmd, getRuleGroupCmd, deleteRuleGroupCmd, loadRulesCmd, diffRulesCmd, syncRulesCmd} { - c.Flag("address", "Address of the cortex cluster, alternatively set CORTEX_ADDRESS."). - Envar("CORTEX_ADDRESS"). + c.Flag("address", "Address of the cortex cluster, alternatively set MIMIR_ADDRESS."). + Envar("MIMIR_ADDRESS"). Required(). StringVar(&r.ClientConfig.Address) - c.Flag("id", "Cortex tenant id, alternatively set CORTEX_TENANT_ID."). - Envar("CORTEX_TENANT_ID"). + c.Flag("id", "Cortex tenant id, alternatively set MIMIR_TENANT_ID."). + Envar("MIMIR_TENANT_ID"). Required(). StringVar(&r.ClientConfig.ID) @@ -148,19 +148,19 @@ func (r *RuleCommand) Register(app *kingpin.Application) { Envar("CORTEX_USE_LEGACY_ROUTES"). BoolVar(&r.ClientConfig.UseLegacyRoutes) - c.Flag("tls-ca-path", "TLS CA certificate to verify cortex API as part of mTLS, alternatively set CORTEX_TLS_CA_PATH."). + c.Flag("tls-ca-path", "TLS CA certificate to verify cortex API as part of mTLS, alternatively set MIMIR_TLS_CA_PATH."). Default(""). - Envar("CORTEX_TLS_CA_CERT"). + Envar("MIMIR_TLS_CA_PATH"). StringVar(&r.ClientConfig.TLS.CAPath) - c.Flag("tls-cert-path", "TLS client certificate to authenticate with cortex API as part of mTLS, alternatively set CORTEX_TLS_CERT_PATH."). + c.Flag("tls-cert-path", "TLS client certificate to authenticate with cortex API as part of mTLS, alternatively set MIMIR_TLS_CERT_PATH."). Default(""). - Envar("CORTEX_TLS_CLIENT_CERT"). + Envar("MIMIR_TLS_CERT_PATH"). StringVar(&r.ClientConfig.TLS.CertPath) - c.Flag("tls-key-path", "TLS client certificate private key to authenticate with cortex API as part of mTLS, alternatively set CORTEX_TLS_KEY_PATH."). + c.Flag("tls-key-path", "TLS client certificate private key to authenticate with cortex API as part of mTLS, alternatively set MIMIR_TLS_KEY_PATH."). Default(""). - Envar("CORTEX_TLS_CLIENT_KEY"). + Envar("MIMIR_TLS_KEY_PATH"). StringVar(&r.ClientConfig.TLS.KeyPath) } @@ -446,7 +446,7 @@ func (r *RuleCommand) diffRules(k *kingpin.ParseContext) error { currentNamespaceMap, err := r.cli.ListRules(context.Background(), "") //TODO: Skipping the 404s here might end up in an unsual scenario. - // If we're unable to reach the Cortex API due to a bad URL, we'll assume no rules are + // If we're unable to reach the Mimir API due to a bad URL, we'll assume no rules are // part of the namespace and provide a diff of the whole ruleset. if err != nil && err != client.ErrResourceNotFound { return errors.Wrap(err, "diff operation unsuccessful, unable to contact cortex api") @@ -509,7 +509,7 @@ func (r *RuleCommand) syncRules(k *kingpin.ParseContext) error { currentNamespaceMap, err := r.cli.ListRules(context.Background(), "") //TODO: Skipping the 404s here might end up in an unsual scenario. - // If we're unable to reach the Cortex API due to a bad URL, we'll assume no rules are + // If we're unable to reach the Mimir API due to a bad URL, we'll assume no rules are // part of the namespace and provide a diff of the whole ruleset. if err != nil && err != client.ErrResourceNotFound { return errors.Wrap(err, "sync operation unsuccessful, unable to contact cortex api") diff --git a/pkg/mimirtool/rules/compare.go b/pkg/mimirtool/rules/compare.go index 23301a5eb8c..1449ec75561 100644 --- a/pkg/mimirtool/rules/compare.go +++ b/pkg/mimirtool/rules/compare.go @@ -27,7 +27,7 @@ var ( ) // NamespaceState is used to denote the difference between the staged namespace -// and active namespace for the cortex tenant +// and active namespace for the mimir tenant type NamespaceState int const ( diff --git a/pkg/mimirtool/rules/parser.go b/pkg/mimirtool/rules/parser.go index e2f5ada8451..267739d6f92 100644 --- a/pkg/mimirtool/rules/parser.go +++ b/pkg/mimirtool/rules/parser.go @@ -18,7 +18,7 @@ import ( ) const ( - CortexBackend = "cortex" + MimirBackend = "mimir" ) var ( @@ -31,7 +31,7 @@ func ParseFiles(backend string, files []string) (map[string]RuleNamespace, error ruleSet := map[string]RuleNamespace{} var parseFn func(f string) ([]RuleNamespace, []error) switch backend { - case CortexBackend: + case MimirBackend: parseFn = Parse default: return nil, errInvalidBackend diff --git a/pkg/mimirtool/rules/parser_test.go b/pkg/mimirtool/rules/parser_test.go index ba0163e63d5..941e3ba4617 100644 --- a/pkg/mimirtool/rules/parser_test.go +++ b/pkg/mimirtool/rules/parser_test.go @@ -24,7 +24,7 @@ func TestParseFiles(t *testing.T) { }{ { name: "basic_file", - backend: CortexBackend, + backend: MimirBackend, files: []string{ "testdata/basic_namespace.yaml", }, @@ -48,7 +48,7 @@ func TestParseFiles(t *testing.T) { }, { name: "file_namespace_overlap", - backend: CortexBackend, + backend: MimirBackend, files: []string{ "testdata/basic_namespace.yaml", "testdata/basic_namespace_repeated.yaml", @@ -57,7 +57,7 @@ func TestParseFiles(t *testing.T) { }, { name: "multiple_namespace_file", - backend: CortexBackend, + backend: MimirBackend, files: []string{ "testdata/multiple_namespace.yaml", }, @@ -96,7 +96,7 @@ func TestParseFiles(t *testing.T) { }, { name: "federated_rule_groups", - backend: CortexBackend, + backend: MimirBackend, files: []string{ "testdata/mimir_federated_rules.yaml", }, diff --git a/pkg/mimirtool/rules/rules.go b/pkg/mimirtool/rules/rules.go index 6ebea1f24b5..7f0b7da1f2f 100644 --- a/pkg/mimirtool/rules/rules.go +++ b/pkg/mimirtool/rules/rules.go @@ -34,7 +34,7 @@ func (r RuleNamespace) LintExpressions(backend string) (int, int, error) { var queryLanguage string switch backend { - case CortexBackend: + case MimirBackend: queryLanguage = "PromQL" parseFn = func(s string) (fmt.Stringer, error) { return parser.ParseExpr(s) diff --git a/pkg/mimirtool/rules/rules_test.go b/pkg/mimirtool/rules/rules_test.go index 89c550e5476..c5c44a3e6be 100644 --- a/pkg/mimirtool/rules/rules_test.go +++ b/pkg/mimirtool/rules/rules_test.go @@ -270,7 +270,7 @@ func TestLintExpressions(t *testing.T) { }, } - backend := CortexBackend + backend := MimirBackend c, m, err := r.LintExpressions(backend) rexpr := r.Groups[0].Rules[0].Expr.Value From d0f904da76e55f0b27344caa97140a355b4f8621 Mon Sep 17 00:00:00 2001 From: Christian Simon Date: Fri, 28 Jan 2022 11:46:39 +0000 Subject: [PATCH 032/168] Classify ingester flags (#942) --- cmd/mimir/help.txt.tmpl | 20 -------------------- pkg/ingester/ingester.go | 12 ++++++------ pkg/ingester/instance_limits.go | 8 ++++---- 3 files changed, 10 insertions(+), 30 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 5130e147e30..eef170e784d 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -917,10 +917,6 @@ Usage of ./cmd/mimir/mimir: Additional active series metrics, matching the provided matchers. Matchers should be in form :, like 'foobar:{foo="bar"}'. Multiple matchers can be provided either providing the flag multiple times or providing multiple semicolon-separated values to a single flag. -ingester.active-series-metrics-enabled Enable tracking of active series and export them as metrics. (default true) - -ingester.active-series-metrics-idle-timeout duration - After what time a series is considered to be inactive. (default 10m0s) - -ingester.active-series-metrics-update-period duration - How often to update active series metrics. (default 1m0s) -ingester.availability-zone string The availability zone where this instance is running. -ingester.client.backoff-max-period duration @@ -953,22 +949,10 @@ Usage of ./cmd/mimir/mimir: Path to the key file for the client certificate. Also requires the client certificate to be configured. -ingester.client.tls-server-name string Override the expected name on the server certificate. - -ingester.exemplars-update-period duration - Period with which to update per-user max exemplars. (default 15s) -ingester.final-sleep duration Duration to sleep for before exiting, to ensure metrics are scraped. (default 30s) -ingester.heartbeat-period duration Period at which to heartbeat to consul. 0 = disabled. (default 5s) - -ingester.ignore-series-limit-for-metric-names string - Comma-separated list of metric names, for which the -ingester.max-global-series-per-metric limit will be ignored. Does not affect the -ingester.max-global-series-per-user limit. - -ingester.instance-limits.max-inflight-push-requests int - Max inflight push requests that this ingester can handle (across all tenants). Additional requests will be rejected. 0 = unlimited. (default 30000) - -ingester.instance-limits.max-ingestion-rate float - Max ingestion rate (samples/sec) that ingester will accept. This limit is per-ingester, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. This limit only works when using blocks engine. 0 = unlimited. - -ingester.instance-limits.max-series int - Max series that this ingester can hold (across all tenants). Requests to create additional series will be rejected. This limit only works when using blocks engine. 0 = unlimited. - -ingester.instance-limits.max-tenants int - Max users that this ingester can hold. Requests from additional users will be rejected. This limit only works when using blocks engine. 0 = unlimited. -ingester.join-after duration Period to wait for a claim from another member; will join automatically after this. -ingester.lifecycler.ID string @@ -991,16 +975,12 @@ Usage of ./cmd/mimir/mimir: The maximum number of active series per user, across the cluster before replication. 0 to disable. (default 150000) -ingester.max-samples-per-query value This option is no longer used, and will be removed. - -ingester.metadata-retain-period duration - Period at which metadata we have not seen will remain in memory before being deleted. (default 10m0s) -ingester.min-ready-duration duration Minimum duration to wait after the internal readiness checks have passed but before succeeding the readiness endpoint. This is used to slowdown deployment controllers (eg. Kubernetes) after an instance is ready and before they proceed with a rolling update, to give the rest of the cluster instances enough time to receive ring updates. (default 15s) -ingester.num-tokens int Number of tokens for each ingester. (default 128) -ingester.observe-period duration Observe tokens after generating to resolve collisions. Useful when using gossiping ring. - -ingester.rate-update-period duration - Period with which to update the per-user ingestion rates. (default 15s) -ingester.readiness-check-ring-health When enabled the readiness probe succeeds only after all instances are ACTIVE and healthy in the ring, otherwise only the instance itself is checked. This option should be disabled if in your cluster multiple instances can be rolled out simultaneously, otherwise rolling updates may be slowed down. (default true) -ingester.stream-chunks-when-using-blocks diff --git a/pkg/ingester/ingester.go b/pkg/ingester/ingester.go index a37f1b2f45f..f2c6469359f 100644 --- a/pkg/ingester/ingester.go +++ b/pkg/ingester/ingester.go @@ -117,16 +117,16 @@ type Config struct { LifecyclerConfig ring.LifecyclerConfig `yaml:"lifecycler"` // Config for metadata purging. - MetadataRetainPeriod time.Duration `yaml:"metadata_retain_period"` + MetadataRetainPeriod time.Duration `yaml:"metadata_retain_period" category:"advanced"` - RateUpdatePeriod time.Duration `yaml:"rate_update_period"` + RateUpdatePeriod time.Duration `yaml:"rate_update_period" category:"advanced"` ActiveSeriesMetricsEnabled bool `yaml:"active_series_metrics_enabled"` - ActiveSeriesMetricsUpdatePeriod time.Duration `yaml:"active_series_metrics_update_period"` - ActiveSeriesMetricsIdleTimeout time.Duration `yaml:"active_series_metrics_idle_timeout"` + ActiveSeriesMetricsUpdatePeriod time.Duration `yaml:"active_series_metrics_update_period" category:"advanced"` + ActiveSeriesMetricsIdleTimeout time.Duration `yaml:"active_series_metrics_idle_timeout" category:"advanced"` ActiveSeriesCustomTrackers ActiveSeriesCustomTrackersConfig `yaml:"active_series_custom_trackers" doc:"description=Additional custom trackers for active metrics. If there are active series matching a provided matcher (map value), the count will be exposed in the custom trackers metric labeled using the tracker name (map key). Zero valued counts are not exposed (and removed when they go back to zero)."` - ExemplarsUpdatePeriod time.Duration `yaml:"exemplars_update_period"` + ExemplarsUpdatePeriod time.Duration `yaml:"exemplars_update_period" category:"advanced"` BlocksStorageConfig mimir_tsdb.BlocksStorageConfig `yaml:"-"` StreamChunksWhenUsingBlocks bool `yaml:"-"` @@ -136,7 +136,7 @@ type Config struct { DefaultLimits InstanceLimits `yaml:"instance_limits"` InstanceLimitsFn func() *InstanceLimits `yaml:"-"` - IgnoreSeriesLimitForMetricNames string `yaml:"ignore_series_limit_for_metric_names"` + IgnoreSeriesLimitForMetricNames string `yaml:"ignore_series_limit_for_metric_names" category:"advanced"` // For testing, you can override the address and ID of this ingester. ingesterClientFactory func(addr string, cfg client.Config) (client.HealthAndIngesterClient, error) diff --git a/pkg/ingester/instance_limits.go b/pkg/ingester/instance_limits.go index 3ee5b546c71..bade91ab093 100644 --- a/pkg/ingester/instance_limits.go +++ b/pkg/ingester/instance_limits.go @@ -18,10 +18,10 @@ var ( // InstanceLimits describes limits used by ingester. Reaching any of these will result in Push method to return // (internal) error. type InstanceLimits struct { - MaxIngestionRate float64 `yaml:"max_ingestion_rate"` - MaxInMemoryTenants int64 `yaml:"max_tenants"` - MaxInMemorySeries int64 `yaml:"max_series"` - MaxInflightPushRequests int64 `yaml:"max_inflight_push_requests"` + MaxIngestionRate float64 `yaml:"max_ingestion_rate" category:"advanced"` + MaxInMemoryTenants int64 `yaml:"max_tenants" category:"advanced"` + MaxInMemorySeries int64 `yaml:"max_series" category:"advanced"` + MaxInflightPushRequests int64 `yaml:"max_inflight_push_requests" category:"advanced"` } // Sets default limit values for unmarshalling. From e787f478e2a810ce364d2777fe4f007fa0f4ca87 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Fri, 28 Jan 2022 12:47:11 +0100 Subject: [PATCH 033/168] Remove -querier.at-modifier-enabled and enable it by default (#941) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 2 -- docs/sources/blocks-storage/querier.md | 5 ----- docs/sources/configuration/config-file-reference.md | 5 ----- integration/query_frontend_test.go | 8 -------- operations/mimir-tests/test-defaults-generated.yaml | 1 - .../test-disable-chunk-streaming-generated.yaml | 2 -- .../mimir-tests/test-query-sharding-generated.yaml | 3 --- .../mimir-tests/test-shuffle-sharding-generated.yaml | 2 -- .../mimir-tests/test-storage-azure-generated.yaml | 2 -- operations/mimir-tests/test-storage-gcs-generated.yaml | 2 -- operations/mimir-tests/test-storage-s3-generated.yaml | 2 -- operations/mimir/config.libsonnet | 4 +--- pkg/api/error_translate_query_engine.go | 3 --- pkg/querier/engine/config.go | 10 ++++------ 15 files changed, 6 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f22dfaeba55..9bde54334fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -220,6 +220,7 @@ * `-store-gateway.sharding-strategy` option has been removed store-gateways. Store-gateway now uses shuffle-sharding by default, but respects `store_gateway_tenant_shard_size` for tenant, and this value defaults to 0. #891 * [CHANGE] Server: `-server.http-listen-port` (yaml: `server.http_listen_port`) now defaults to `8080` (previously `80`). #871 * [CHANGE] Changed the default value of `blocks-storage.bucket-store.ignore-deletion-marks-delay` from 6h to 1h. #892 +* [CHANGE] Querier/ruler/query-frontend: the experimental `-querier.at-modifier-enabled` CLI flag has been removed and the PromQL `@` modifier is always enabled. #941 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 0fcbe0fd713..f23426b2216 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -1093,8 +1093,6 @@ Usage of ./cmd/mimir/mimir: Secondary backend storage used by multi-client. -print.config Print the config and exit. - -querier.at-modifier-enabled - [experimental] Enable the @ modifier in PromQL. This config option should be set on query-frontend too when query sharding is enabled. -querier.batch-iterators Use batch iterators to execute query, as opposed to fully materialising the series in memory. Takes precedent over the -querier.iterators flag. (default true) -querier.cardinality-analysis-enabled diff --git a/docs/sources/blocks-storage/querier.md b/docs/sources/blocks-storage/querier.md index 4d55b801d39..8a02ea87c14 100644 --- a/docs/sources/blocks-storage/querier.md +++ b/docs/sources/blocks-storage/querier.md @@ -189,11 +189,6 @@ querier: # CLI flag: -querier.max-samples [max_samples: | default = 50000000] - # Enable the @ modifier in PromQL. This config option should be set on - # query-frontend too when query sharding is enabled. - # CLI flag: -querier.at-modifier-enabled - [at_modifier_enabled: | default = false] - # The default evaluation interval or step size for subqueries. This config # option should be set on query-frontend too when query sharding is enabled. # CLI flag: -querier.default-evaluation-interval diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index ead7f2ca5c3..aef86130813 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -870,11 +870,6 @@ store_gateway_client: # CLI flag: -querier.max-samples [max_samples: | default = 50000000] -# Enable the @ modifier in PromQL. This config option should be set on -# query-frontend too when query sharding is enabled. -# CLI flag: -querier.at-modifier-enabled -[at_modifier_enabled: | default = false] - # The default evaluation interval or step size for subqueries. This config # option should be set on query-frontend too when query sharding is enabled. # CLI flag: -querier.default-evaluation-interval diff --git a/integration/query_frontend_test.go b/integration/query_frontend_test.go index 419794d11da..9674c6b95fb 100644 --- a/integration/query_frontend_test.go +++ b/integration/query_frontend_test.go @@ -513,14 +513,6 @@ overrides: expStatusCode: http.StatusBadRequest, expBody: `{"error": "negative offsets are not supported", "errorType":"bad_data", "status":"error"}`, }, - { - name: "error when at-modifier is unsupported", - query: func(c *e2emimir.Client) (*http.Response, []byte, error) { - return c.QueryRangeRaw(`http_requests_total @ start()`, now.Add(-time.Minute), now, time.Minute) - }, - expStatusCode: http.StatusBadRequest, - expBody: `{"error":"@ modifier is disabled, use -querier.at-modifier-enabled to enable it", "errorType":"bad_data", "status":"error"}`, - }, } { t.Run(tc.name, func(t *testing.T) { resp, body, err := tc.query(cQuerier) diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml index 37e5fd07a22..5abe80d4707 100644 --- a/operations/mimir-tests/test-defaults-generated.yaml +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -758,7 +758,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -mem-ballast-size-bytes=268435456 - - -querier.at-modifier-enabled=true - -querier.frontend-address=query-frontend-discovery.default.svc.cluster.local:9095 - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index 3474e66a04d..7db1745d000 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -836,7 +836,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -mem-ballast-size-bytes=268435456 - - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 - -querier.query-ingesters-within=13h @@ -1076,7 +1075,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true - - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index 7fc893f5725..28ed7ee185b 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -835,7 +835,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -mem-ballast-size-bytes=268435456 - - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=419430400 - -querier.max-concurrent=16 - -querier.query-ingesters-within=13h @@ -931,7 +930,6 @@ spec: - -frontend.results-cache.memcached.timeout=500ms - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -frontend.split-queries-by-interval=24h - - -querier.at-modifier-enabled=true - -querier.max-query-parallelism=240 - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=419430400 @@ -1080,7 +1078,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true - - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index 98af58f6e60..be949ffad16 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -837,7 +837,6 @@ spec: - -distributor.ingestion-tenant-shard-size=3 - -distributor.replication-factor=3 - -mem-ballast-size-bytes=268435456 - - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 - -querier.query-ingesters-within=13h @@ -1082,7 +1081,6 @@ spec: - -distributor.ingestion-tenant-shard-size=3 - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true - - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index 06fad6a7fe8..a24dd4d237e 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -837,7 +837,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -mem-ballast-size-bytes=268435456 - - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 - -querier.query-ingesters-within=13h @@ -1079,7 +1078,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true - - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 9569bfc5b99..ae8cbd31647 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -835,7 +835,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -mem-ballast-size-bytes=268435456 - - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 - -querier.query-ingesters-within=13h @@ -1075,7 +1074,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true - - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index 09ba43b8412..3e9d44f8d3e 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -836,7 +836,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -mem-ballast-size-bytes=268435456 - - -querier.at-modifier-enabled=true - -querier.frontend-client.grpc-max-send-msg-size=104857600 - -querier.max-concurrent=8 - -querier.query-ingesters-within=13h @@ -1077,7 +1076,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - -experimental.ruler.enable-api=true - - -querier.at-modifier-enabled=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index 2ffc05abf84..edabcfbbcd9 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -141,9 +141,7 @@ }, // PromQL query engine config (shared between all services running PromQL engine, like the ruler and querier). - queryEngineConfig: { - 'querier.at-modifier-enabled': true, - }, + queryEngineConfig: {}, ringConfig: { 'consul.hostname': 'consul.%s.svc.cluster.local:8500' % $._config.namespace, diff --git a/pkg/api/error_translate_query_engine.go b/pkg/api/error_translate_query_engine.go index b431dbebd54..eea778cd2f4 100644 --- a/pkg/api/error_translate_query_engine.go +++ b/pkg/api/error_translate_query_engine.go @@ -12,7 +12,6 @@ import ( ) var ( - errValidationAtModifierDisabled = errors.New("@ modifier is disabled, use -querier.at-modifier-enabled to enable it") errValidationNegativeOffsetDisabled = errors.New("negative offsets are not supported") ) @@ -36,8 +35,6 @@ func (qe errorTranslateQueryEngine) NewRangeQuery(q storage.Queryable, qs string func (qe errorTranslateQueryEngine) translate(err error) error { switch err { - case promql.ErrValidationAtModifierDisabled: - return errValidationAtModifierDisabled case promql.ErrValidationNegativeOffsetDisabled: return errValidationNegativeOffsetDisabled default: diff --git a/pkg/querier/engine/config.go b/pkg/querier/engine/config.go index b9c2c019493..64aa3ad4775 100644 --- a/pkg/querier/engine/config.go +++ b/pkg/querier/engine/config.go @@ -16,10 +16,9 @@ import ( // Config holds the PromQL engine config exposed by Mimir. type Config struct { - MaxConcurrent int `yaml:"max_concurrent"` - Timeout time.Duration `yaml:"timeout"` - MaxSamples int `yaml:"max_samples"` - AtModifierEnabled bool `yaml:"at_modifier_enabled" category:"experimental"` + MaxConcurrent int `yaml:"max_concurrent"` + Timeout time.Duration `yaml:"timeout"` + MaxSamples int `yaml:"max_samples"` // The default evaluation interval for the promql engine. // Needs to be configured for subqueries to work as it is the default @@ -43,7 +42,6 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.IntVar(&cfg.MaxConcurrent, "querier.max-concurrent", 20, sharedWithQueryFrontend("The maximum number of concurrent queries.")) f.DurationVar(&cfg.Timeout, "querier.timeout", 2*time.Minute, sharedWithQueryFrontend("The timeout for a query.")) f.IntVar(&cfg.MaxSamples, "querier.max-samples", 50e6, sharedWithQueryFrontend("Maximum number of samples a single query can load into memory.")) - f.BoolVar(&cfg.AtModifierEnabled, "querier.at-modifier-enabled", false, sharedWithQueryFrontend("Enable the @ modifier in PromQL.")) f.DurationVar(&cfg.DefaultEvaluationInterval, "querier.default-evaluation-interval", time.Minute, sharedWithQueryFrontend("The default evaluation interval or step size for subqueries.")) f.DurationVar(&cfg.LookbackDelta, "querier.lookback-delta", 5*time.Minute, sharedWithQueryFrontend("Time since the last sample after which a time series is considered stale and ignored by expression evaluations.")) } @@ -57,7 +55,7 @@ func NewPromQLEngineOptions(cfg Config, activityTracker *activitytracker.Activit MaxSamples: cfg.MaxSamples, Timeout: cfg.Timeout, LookbackDelta: cfg.LookbackDelta, - EnableAtModifier: cfg.AtModifierEnabled, + EnableAtModifier: true, EnableNegativeOffset: false, // If this can be enabled, please change the error mapping in errorTranslateQueryEngine. NoStepSubqueryIntervalFn: func(int64) int64 { return cfg.DefaultEvaluationInterval.Milliseconds() From 6047d6969e6da5fb4485515884843d4275263bf0 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Fri, 28 Jan 2022 14:48:30 +0100 Subject: [PATCH 034/168] Chore: Move index and bucket cache to dedicated packages (#890) * Moved bucket cache implementation to pkg/storage/tsdb/bucketcache Signed-off-by: Marco Pracucci * Moved pkg/storage/tsdb/cache to pkg/storegateway/indexcache Signed-off-by: Marco Pracucci * Fix goleak test, using our own options Signed-off-by: Marco Pracucci * Address review feedback, moving factories back to pkg/storage/tsdb Signed-off-by: Marco Pracucci * Unexport errUnsupportedIndexCacheBackend Signed-off-by: Marco Pracucci --- .../{cache => bucketcache}/caching_bucket.go | 2 +- .../caching_bucket_config.go | 2 +- .../caching_bucket_test.go | 2 +- .../{caching_bucket.go => caching_config.go} | 10 +-- ..._bucket_test.go => caching_config_test.go} | 0 pkg/storage/tsdb/index_cache.go | 14 ++--- pkg/storegateway/bucket.go | 63 +++++++++---------- pkg/storegateway/bucket_e2e_test.go | 12 ++-- pkg/storegateway/bucket_stores.go | 4 +- pkg/storegateway/bucket_stores_test.go | 8 +-- pkg/storegateway/bucket_test.go | 26 ++++---- .../indexcache}/cache.go | 2 +- .../indexcache}/cache_test.go | 7 ++- .../indexcache}/inmemory.go | 2 +- .../indexcache}/inmemory_test.go | 2 +- .../indexcache}/memcached.go | 2 +- .../indexcache}/memcached_test.go | 2 +- .../indexcache}/tracing.go | 2 +- pkg/storegateway/snappy_gob_codec_test.go | 6 +- pkg/util/test/leak.go | 18 ++++-- 20 files changed, 96 insertions(+), 90 deletions(-) rename pkg/storage/tsdb/{cache => bucketcache}/caching_bucket.go (99%) rename pkg/storage/tsdb/{cache => bucketcache}/caching_bucket_config.go (99%) rename pkg/storage/tsdb/{cache => bucketcache}/caching_bucket_test.go (99%) rename pkg/storage/tsdb/{caching_bucket.go => caching_config.go} (97%) rename pkg/storage/tsdb/{caching_bucket_test.go => caching_config_test.go} (100%) rename pkg/{storage/tsdb/cache => storegateway/indexcache}/cache.go (99%) rename pkg/{storage/tsdb/cache => storegateway/indexcache}/cache_test.go (92%) rename pkg/{storage/tsdb/cache => storegateway/indexcache}/inmemory.go (99%) rename pkg/{storage/tsdb/cache => storegateway/indexcache}/inmemory_test.go (99%) rename pkg/{storage/tsdb/cache => storegateway/indexcache}/memcached.go (99%) rename pkg/{storage/tsdb/cache => storegateway/indexcache}/memcached_test.go (99%) rename pkg/{storage/tsdb/cache => storegateway/indexcache}/tracing.go (99%) diff --git a/pkg/storage/tsdb/cache/caching_bucket.go b/pkg/storage/tsdb/bucketcache/caching_bucket.go similarity index 99% rename from pkg/storage/tsdb/cache/caching_bucket.go rename to pkg/storage/tsdb/bucketcache/caching_bucket.go index b4d5e20e445..29d19dd3c46 100644 --- a/pkg/storage/tsdb/cache/caching_bucket.go +++ b/pkg/storage/tsdb/bucketcache/caching_bucket.go @@ -3,7 +3,7 @@ // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Thanos Authors. -package cache +package bucketcache import ( "bytes" diff --git a/pkg/storage/tsdb/cache/caching_bucket_config.go b/pkg/storage/tsdb/bucketcache/caching_bucket_config.go similarity index 99% rename from pkg/storage/tsdb/cache/caching_bucket_config.go rename to pkg/storage/tsdb/bucketcache/caching_bucket_config.go index 85162bce5f2..e682cc5beaa 100644 --- a/pkg/storage/tsdb/cache/caching_bucket_config.go +++ b/pkg/storage/tsdb/bucketcache/caching_bucket_config.go @@ -3,7 +3,7 @@ // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Thanos Authors. -package cache +package bucketcache import ( "time" diff --git a/pkg/storage/tsdb/cache/caching_bucket_test.go b/pkg/storage/tsdb/bucketcache/caching_bucket_test.go similarity index 99% rename from pkg/storage/tsdb/cache/caching_bucket_test.go rename to pkg/storage/tsdb/bucketcache/caching_bucket_test.go index abcabde86d9..ab136b558ac 100644 --- a/pkg/storage/tsdb/cache/caching_bucket_test.go +++ b/pkg/storage/tsdb/bucketcache/caching_bucket_test.go @@ -4,7 +4,7 @@ // Provenance-includes-copyright: The Thanos Authors. //nolint:unparam -package cache +package bucketcache import ( "bytes" diff --git a/pkg/storage/tsdb/caching_bucket.go b/pkg/storage/tsdb/caching_config.go similarity index 97% rename from pkg/storage/tsdb/caching_bucket.go rename to pkg/storage/tsdb/caching_config.go index 23ec43748e6..f3a12bd3b6d 100644 --- a/pkg/storage/tsdb/caching_bucket.go +++ b/pkg/storage/tsdb/caching_config.go @@ -23,7 +23,7 @@ import ( "github.com/thanos-io/thanos/pkg/objstore" "github.com/grafana/mimir/pkg/cache" - tsdb_cache "github.com/grafana/mimir/pkg/storage/tsdb/cache" + "github.com/grafana/mimir/pkg/storage/tsdb/bucketcache" ) type ChunksCacheConfig struct { @@ -91,7 +91,7 @@ func (cfg *MetadataCacheConfig) Validate() error { } func CreateCachingBucket(chunksConfig ChunksCacheConfig, metadataConfig MetadataCacheConfig, bkt objstore.Bucket, logger log.Logger, reg prometheus.Registerer) (objstore.Bucket, error) { - cfg := tsdb_cache.NewCachingBucketConfig() + cfg := bucketcache.NewCachingBucketConfig() cachingConfigured := false chunksCache, err := cache.CreateClient("chunks-cache", chunksConfig.BackendConfig, logger, reg) @@ -113,7 +113,7 @@ func CreateCachingBucket(chunksConfig ChunksCacheConfig, metadataConfig Metadata cfg.CacheAttributes("block-index", metadataCache, isBlockIndexFile, metadataConfig.BlockIndexAttributesTTL) cfg.CacheGet("bucket-index", metadataCache, isBucketIndexFile, metadataConfig.BucketIndexMaxSize, metadataConfig.BucketIndexContentTTL /* do not cache exist / not exist: */, 0, 0) - codec := snappyIterCodec{tsdb_cache.JSONIterCodec{}} + codec := snappyIterCodec{bucketcache.JSONIterCodec{}} cfg.CacheIter("tenants-iter", metadataCache, isTenantsDir, metadataConfig.TenantsListTTL, codec) cfg.CacheIter("tenant-blocks-iter", metadataCache, isTenantBlocksDir, metadataConfig.TenantBlocksListTTL, codec) cfg.CacheIter("chunks-iter", metadataCache, isChunksDir, metadataConfig.ChunksListTTL, codec) @@ -145,7 +145,7 @@ func CreateCachingBucket(chunksConfig ChunksCacheConfig, metadataConfig Metadata return bkt, nil } - return tsdb_cache.NewCachingBucket(bkt, cfg, logger, reg) + return bucketcache.NewCachingBucket(bkt, cfg, logger, reg) } var chunksMatcher = regexp.MustCompile(`^.*/chunks/\d+$`) @@ -186,7 +186,7 @@ func isChunksDir(name string) bool { } type snappyIterCodec struct { - tsdb_cache.IterCodec + bucketcache.IterCodec } func (i snappyIterCodec) Encode(files []string) ([]byte, error) { diff --git a/pkg/storage/tsdb/caching_bucket_test.go b/pkg/storage/tsdb/caching_config_test.go similarity index 100% rename from pkg/storage/tsdb/caching_bucket_test.go rename to pkg/storage/tsdb/caching_config_test.go diff --git a/pkg/storage/tsdb/index_cache.go b/pkg/storage/tsdb/index_cache.go index 09833f3a429..e7b7e925e43 100644 --- a/pkg/storage/tsdb/index_cache.go +++ b/pkg/storage/tsdb/index_cache.go @@ -18,7 +18,7 @@ import ( "github.com/thanos-io/thanos/pkg/model" "github.com/grafana/mimir/pkg/cache" - storecache "github.com/grafana/mimir/pkg/storage/tsdb/cache" + "github.com/grafana/mimir/pkg/storegateway/indexcache" "github.com/grafana/mimir/pkg/util" ) @@ -81,7 +81,7 @@ func (cfg *InMemoryIndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, pr } // NewIndexCache creates a new index cache based on the input configuration. -func NewIndexCache(cfg IndexCacheConfig, logger log.Logger, registerer prometheus.Registerer) (storecache.IndexCache, error) { +func NewIndexCache(cfg IndexCacheConfig, logger log.Logger, registerer prometheus.Registerer) (indexcache.IndexCache, error) { switch cfg.Backend { case IndexCacheBackendInMemory: return newInMemoryIndexCache(cfg.InMemory, logger, registerer) @@ -92,7 +92,7 @@ func NewIndexCache(cfg IndexCacheConfig, logger log.Logger, registerer prometheu } } -func newInMemoryIndexCache(cfg InMemoryIndexCacheConfig, logger log.Logger, registerer prometheus.Registerer) (storecache.IndexCache, error) { +func newInMemoryIndexCache(cfg InMemoryIndexCacheConfig, logger log.Logger, registerer prometheus.Registerer) (indexcache.IndexCache, error) { maxCacheSize := model.Bytes(cfg.MaxSizeBytes) // Calculate the max item size. @@ -101,22 +101,22 @@ func newInMemoryIndexCache(cfg InMemoryIndexCacheConfig, logger log.Logger, regi maxItemSize = maxCacheSize } - return storecache.NewInMemoryIndexCacheWithConfig(logger, registerer, storecache.InMemoryIndexCacheConfig{ + return indexcache.NewInMemoryIndexCacheWithConfig(logger, registerer, indexcache.InMemoryIndexCacheConfig{ MaxSize: maxCacheSize, MaxItemSize: maxItemSize, }) } -func newMemcachedIndexCache(cfg cache.MemcachedConfig, logger log.Logger, registerer prometheus.Registerer) (storecache.IndexCache, error) { +func newMemcachedIndexCache(cfg cache.MemcachedConfig, logger log.Logger, registerer prometheus.Registerer) (indexcache.IndexCache, error) { client, err := cacheutil.NewMemcachedClientWithConfig(logger, "index-cache", cfg.ToMemcachedClientConfig(), registerer) if err != nil { return nil, errors.Wrap(err, "create index cache memcached client") } - cache, err := storecache.NewMemcachedIndexCache(logger, client, registerer) + cache, err := indexcache.NewMemcachedIndexCache(logger, client, registerer) if err != nil { return nil, errors.Wrap(err, "create memcached-based index cache") } - return storecache.NewTracingIndexCache(cache, logger), nil + return indexcache.NewTracingIndexCache(cache, logger), nil } diff --git a/pkg/storegateway/bucket.go b/pkg/storegateway/bucket.go index b83579a5c34..6d36a2fb47a 100644 --- a/pkg/storegateway/bucket.go +++ b/pkg/storegateway/bucket.go @@ -59,8 +59,7 @@ import ( "github.com/grafana/mimir/pkg/storage/sharding" mimir_tsdb "github.com/grafana/mimir/pkg/storage/tsdb" - "github.com/grafana/mimir/pkg/storage/tsdb/cache" - storecache "github.com/grafana/mimir/pkg/storage/tsdb/cache" + "github.com/grafana/mimir/pkg/storegateway/indexcache" util_math "github.com/grafana/mimir/pkg/util/math" "github.com/grafana/mimir/pkg/util/spanlogger" ) @@ -118,7 +117,7 @@ type BucketStore struct { bkt objstore.InstrumentedBucketReader fetcher block.MetadataFetcher dir string - indexCache storecache.IndexCache + indexCache indexcache.IndexCache indexReaderPool *indexheader.ReaderPool chunkPool pool.Bytes seriesHashCache *hashcache.SeriesHashCache @@ -166,28 +165,28 @@ func (noopCache) FetchMultiSeriesForRefs(_ context.Context, _ string, _ ulid.ULI return map[storage.SeriesRef][]byte{}, ids } -func (c noopCache) StoreExpandedPostings(_ context.Context, _ string, _ ulid.ULID, _ cache.LabelMatchersKey, _ []byte) { +func (c noopCache) StoreExpandedPostings(_ context.Context, _ string, _ ulid.ULID, _ indexcache.LabelMatchersKey, _ []byte) { } -func (c noopCache) FetchExpandedPostings(_ context.Context, _ string, _ ulid.ULID, _ cache.LabelMatchersKey) ([]byte, bool) { +func (c noopCache) FetchExpandedPostings(_ context.Context, _ string, _ ulid.ULID, _ indexcache.LabelMatchersKey) ([]byte, bool) { return nil, false } -func (noopCache) StoreSeries(_ context.Context, _ string, _ ulid.ULID, _ storecache.LabelMatchersKey, _ *sharding.ShardSelector, _ []byte) { +func (noopCache) StoreSeries(_ context.Context, _ string, _ ulid.ULID, _ indexcache.LabelMatchersKey, _ *sharding.ShardSelector, _ []byte) { } -func (noopCache) FetchSeries(_ context.Context, _ string, _ ulid.ULID, _ storecache.LabelMatchersKey, _ *sharding.ShardSelector) ([]byte, bool) { +func (noopCache) FetchSeries(_ context.Context, _ string, _ ulid.ULID, _ indexcache.LabelMatchersKey, _ *sharding.ShardSelector) ([]byte, bool) { return nil, false } -func (noopCache) StoreLabelNames(_ context.Context, _ string, _ ulid.ULID, _ storecache.LabelMatchersKey, _ []byte) { +func (noopCache) StoreLabelNames(_ context.Context, _ string, _ ulid.ULID, _ indexcache.LabelMatchersKey, _ []byte) { } -func (noopCache) FetchLabelNames(_ context.Context, _ string, _ ulid.ULID, _ storecache.LabelMatchersKey) ([]byte, bool) { +func (noopCache) FetchLabelNames(_ context.Context, _ string, _ ulid.ULID, _ indexcache.LabelMatchersKey) ([]byte, bool) { return nil, false } -func (noopCache) StoreLabelValues(_ context.Context, _ string, _ ulid.ULID, _ string, _ storecache.LabelMatchersKey, _ []byte) { +func (noopCache) StoreLabelValues(_ context.Context, _ string, _ ulid.ULID, _ string, _ indexcache.LabelMatchersKey, _ []byte) { } -func (noopCache) FetchLabelValues(_ context.Context, _ string, _ ulid.ULID, _ string, _ storecache.LabelMatchersKey) ([]byte, bool) { +func (noopCache) FetchLabelValues(_ context.Context, _ string, _ ulid.ULID, _ string, _ indexcache.LabelMatchersKey) ([]byte, bool) { return nil, false } @@ -202,7 +201,7 @@ func WithLogger(logger log.Logger) BucketStoreOption { } // WithIndexCache sets a indexCache to use instead of a noopCache. -func WithIndexCache(cache storecache.IndexCache) BucketStoreOption { +func WithIndexCache(cache indexcache.IndexCache) BucketStoreOption { return func(s *BucketStore) { s.indexCache = cache } @@ -787,12 +786,12 @@ func blockSeries( type seriesCacheEntry struct { LabelSets []labels.Labels - MatchersKey cache.LabelMatchersKey + MatchersKey indexcache.LabelMatchersKey Shard sharding.ShardSelector } -func fetchCachedSeries(ctx context.Context, userID string, indexCache cache.IndexCache, blockID ulid.ULID, matchers []*labels.Matcher, shard *sharding.ShardSelector, logger log.Logger) ([]seriesEntry, bool) { - matchersKey := cache.CanonicalLabelMatchersKey(matchers) +func fetchCachedSeries(ctx context.Context, userID string, indexCache indexcache.IndexCache, blockID ulid.ULID, matchers []*labels.Matcher, shard *sharding.ShardSelector, logger log.Logger) ([]seriesEntry, bool) { + matchersKey := indexcache.CanonicalLabelMatchersKey(matchers) data, ok := indexCache.FetchSeries(ctx, userID, blockID, matchersKey, shard) if !ok { return nil, false @@ -818,10 +817,10 @@ func fetchCachedSeries(ctx context.Context, userID string, indexCache cache.Inde return res, true } -func storeCachedSeries(ctx context.Context, indexCache cache.IndexCache, userID string, blockID ulid.ULID, matchers []*labels.Matcher, shard *sharding.ShardSelector, series []seriesEntry, logger log.Logger) { +func storeCachedSeries(ctx context.Context, indexCache indexcache.IndexCache, userID string, blockID ulid.ULID, matchers []*labels.Matcher, shard *sharding.ShardSelector, series []seriesEntry, logger log.Logger) { entry := seriesCacheEntry{ LabelSets: make([]labels.Labels, len(series)), - MatchersKey: cache.CanonicalLabelMatchersKey(matchers), + MatchersKey: indexcache.CanonicalLabelMatchersKey(matchers), Shard: maybeNilShard(shard), } for i, s := range series { @@ -1330,11 +1329,11 @@ func blockLabelNames(ctx context.Context, indexr *bucketIndexReader, matchers [] type labelNamesCacheEntry struct { Names []string - MatchersKey cache.LabelMatchersKey + MatchersKey indexcache.LabelMatchersKey } -func fetchCachedLabelNames(ctx context.Context, indexCache cache.IndexCache, userID string, blockID ulid.ULID, matchers []*labels.Matcher, logger log.Logger) ([]string, bool) { - matchersKey := cache.CanonicalLabelMatchersKey(matchers) +func fetchCachedLabelNames(ctx context.Context, indexCache indexcache.IndexCache, userID string, blockID ulid.ULID, matchers []*labels.Matcher, logger log.Logger) ([]string, bool) { + matchersKey := indexcache.CanonicalLabelMatchersKey(matchers) data, ok := indexCache.FetchLabelNames(ctx, userID, blockID, matchersKey) if !ok { return nil, false @@ -1352,10 +1351,10 @@ func fetchCachedLabelNames(ctx context.Context, indexCache cache.IndexCache, use return entry.Names, true } -func storeCachedLabelNames(ctx context.Context, indexCache cache.IndexCache, userID string, blockID ulid.ULID, matchers []*labels.Matcher, values []string, logger log.Logger) { +func storeCachedLabelNames(ctx context.Context, indexCache indexcache.IndexCache, userID string, blockID ulid.ULID, matchers []*labels.Matcher, values []string, logger log.Logger) { entry := labelNamesCacheEntry{ Names: values, - MatchersKey: cache.CanonicalLabelMatchersKey(matchers), + MatchersKey: indexcache.CanonicalLabelMatchersKey(matchers), } data, err := encodeSnappyGob(entry) if err != nil { @@ -1503,11 +1502,11 @@ func blockLabelValues(ctx context.Context, indexr *bucketIndexReader, labelName type labelValuesCacheEntry struct { Values []string LabelName string - MatchersKey cache.LabelMatchersKey + MatchersKey indexcache.LabelMatchersKey } -func fetchCachedLabelValues(ctx context.Context, indexCache cache.IndexCache, userID string, blockID ulid.ULID, labelName string, matchers []*labels.Matcher, logger log.Logger) ([]string, bool) { - matchersKey := cache.CanonicalLabelMatchersKey(matchers) +func fetchCachedLabelValues(ctx context.Context, indexCache indexcache.IndexCache, userID string, blockID ulid.ULID, labelName string, matchers []*labels.Matcher, logger log.Logger) ([]string, bool) { + matchersKey := indexcache.CanonicalLabelMatchersKey(matchers) data, ok := indexCache.FetchLabelValues(ctx, userID, blockID, labelName, matchersKey) if !ok { return nil, false @@ -1529,11 +1528,11 @@ func fetchCachedLabelValues(ctx context.Context, indexCache cache.IndexCache, us return entry.Values, true } -func storeCachedLabelValues(ctx context.Context, indexCache cache.IndexCache, userID string, blockID ulid.ULID, labelName string, matchers []*labels.Matcher, values []string, logger log.Logger) { +func storeCachedLabelValues(ctx context.Context, indexCache indexcache.IndexCache, userID string, blockID ulid.ULID, labelName string, matchers []*labels.Matcher, values []string, logger log.Logger) { entry := labelValuesCacheEntry{ Values: values, LabelName: labelName, - MatchersKey: cache.CanonicalLabelMatchersKey(matchers), + MatchersKey: indexcache.CanonicalLabelMatchersKey(matchers), } data, err := encodeSnappyGob(entry) if err != nil { @@ -1687,7 +1686,7 @@ type bucketBlock struct { bkt objstore.BucketReader meta *metadata.Meta dir string - indexCache storecache.IndexCache + indexCache indexcache.IndexCache chunkPool pool.Bytes indexHeaderReader indexheader.Reader @@ -1713,7 +1712,7 @@ func newBucketBlock( meta *metadata.Meta, bkt objstore.BucketReader, dir string, - indexCache storecache.IndexCache, + indexCache indexcache.IndexCache, chunkPool pool.Bytes, indexHeadReader indexheader.Reader, p Partitioner, @@ -1935,7 +1934,7 @@ func (r *bucketIndexReader) expandedPostingsPromise(ctx context.Context, ms []*l return refsCopy, cached, nil } - key := cache.CanonicalLabelMatchersKey(ms) + key := indexcache.CanonicalLabelMatchersKey(ms) var loadedPromise interface{} loadedPromise, loaded = r.block.expandedPostingsPromises.LoadOrStore(key, promise) @@ -1957,7 +1956,7 @@ func (r *bucketIndexReader) expandedPostingsPromise(ctx context.Context, ms []*l return promise, false } -func (r *bucketIndexReader) cacheExpandedPostings(ctx context.Context, userID string, key storecache.LabelMatchersKey, refs []storage.SeriesRef) { +func (r *bucketIndexReader) cacheExpandedPostings(ctx context.Context, userID string, key indexcache.LabelMatchersKey, refs []storage.SeriesRef) { data, err := diffVarintSnappyEncode(index.NewListPostings(refs), len(refs)) if err != nil { level.Warn(r.block.logger).Log("msg", "can't encode expanded postings cache", "err", err, "matchers_key", key, "block", r.block.meta.ULID) @@ -1966,7 +1965,7 @@ func (r *bucketIndexReader) cacheExpandedPostings(ctx context.Context, userID st r.block.indexCache.StoreExpandedPostings(ctx, userID, r.block.meta.ULID, key, data) } -func (r *bucketIndexReader) fetchCachedExpandedPostings(ctx context.Context, userID string, key cache.LabelMatchersKey) ([]storage.SeriesRef, bool) { +func (r *bucketIndexReader) fetchCachedExpandedPostings(ctx context.Context, userID string, key indexcache.LabelMatchersKey) ([]storage.SeriesRef, bool) { data, ok := r.block.indexCache.FetchExpandedPostings(ctx, userID, r.block.meta.ULID, key) if !ok { return nil, false diff --git a/pkg/storegateway/bucket_e2e_test.go b/pkg/storegateway/bucket_e2e_test.go index c9fafb8d5c8..f52c9f36aa9 100644 --- a/pkg/storegateway/bucket_e2e_test.go +++ b/pkg/storegateway/bucket_e2e_test.go @@ -28,7 +28,7 @@ import ( "google.golang.org/grpc/codes" mimir_tsdb "github.com/grafana/mimir/pkg/storage/tsdb" - storecache "github.com/grafana/mimir/pkg/storage/tsdb/cache" + "github.com/grafana/mimir/pkg/storegateway/indexcache" "github.com/thanos-io/thanos/pkg/block" "github.com/thanos-io/thanos/pkg/block/metadata" @@ -50,7 +50,7 @@ var ( ) type swappableCache struct { - storecache.IndexCache + indexcache.IndexCache } type customLimiter struct { @@ -67,7 +67,7 @@ func (c *customLimiter) Reserve(num uint64) error { return nil } -func (c *swappableCache) SwapWith(cache storecache.IndexCache) { +func (c *swappableCache) SwapWith(cache indexcache.IndexCache) { c.IndexCache = cache } @@ -438,7 +438,7 @@ func TestBucketStore_e2e(t *testing.T) { } if ok := t.Run("with large, sufficient index cache", func(t *testing.T) { - indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(s.logger, nil, storecache.InMemoryIndexCacheConfig{ + indexCache, err := indexcache.NewInMemoryIndexCacheWithConfig(s.logger, nil, indexcache.InMemoryIndexCacheConfig{ MaxItemSize: 1e5, MaxSize: 2e5, }) @@ -450,7 +450,7 @@ func TestBucketStore_e2e(t *testing.T) { } t.Run("with small index cache", func(t *testing.T) { - indexCache2, err := storecache.NewInMemoryIndexCacheWithConfig(s.logger, nil, storecache.InMemoryIndexCacheConfig{ + indexCache2, err := indexcache.NewInMemoryIndexCacheWithConfig(s.logger, nil, indexcache.InMemoryIndexCacheConfig{ MaxItemSize: 50, MaxSize: 100, }) @@ -485,7 +485,7 @@ func TestBucketStore_ManyParts_e2e(t *testing.T) { s := prepareStoreWithTestBlocks(t, dir, bkt, true, NewChunksLimiterFactory(0), NewSeriesLimiterFactory(0), emptyRelabelConfig, allowAllFilterConf) - indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(s.logger, nil, storecache.InMemoryIndexCacheConfig{ + indexCache, err := indexcache.NewInMemoryIndexCacheWithConfig(s.logger, nil, indexcache.InMemoryIndexCacheConfig{ MaxItemSize: 1e5, MaxSize: 2e5, }) diff --git a/pkg/storegateway/bucket_stores.go b/pkg/storegateway/bucket_stores.go index b1852aa292c..b8f1e331076 100644 --- a/pkg/storegateway/bucket_stores.go +++ b/pkg/storegateway/bucket_stores.go @@ -37,7 +37,7 @@ import ( "github.com/grafana/mimir/pkg/storage/bucket" "github.com/grafana/mimir/pkg/storage/tsdb" - storecache "github.com/grafana/mimir/pkg/storage/tsdb/cache" + "github.com/grafana/mimir/pkg/storegateway/indexcache" util_log "github.com/grafana/mimir/pkg/util/log" "github.com/grafana/mimir/pkg/util/spanlogger" "github.com/grafana/mimir/pkg/util/validation" @@ -55,7 +55,7 @@ type BucketStores struct { shardingStrategy ShardingStrategy // Index cache shared across all tenants. - indexCache storecache.IndexCache + indexCache indexcache.IndexCache // Series hash cache shared across all tenants. seriesHashCache *hashcache.SeriesHashCache diff --git a/pkg/storegateway/bucket_stores_test.go b/pkg/storegateway/bucket_stores_test.go index 139ee541e9a..16b823af0be 100644 --- a/pkg/storegateway/bucket_stores_test.go +++ b/pkg/storegateway/bucket_stores_test.go @@ -47,8 +47,8 @@ import ( "github.com/grafana/mimir/pkg/storage/bucket" "github.com/grafana/mimir/pkg/storage/bucket/filesystem" mimir_tsdb "github.com/grafana/mimir/pkg/storage/tsdb" - storecache "github.com/grafana/mimir/pkg/storage/tsdb/cache" mimir_testutil "github.com/grafana/mimir/pkg/storage/tsdb/testutil" + "github.com/grafana/mimir/pkg/storegateway/indexcache" "github.com/grafana/mimir/pkg/util" "github.com/grafana/mimir/pkg/util/test" ) @@ -762,7 +762,7 @@ func BenchmarkBucketStoreLabelValues(tb *testing.B) { assert.Equal(tb, s.minTime, mint) assert.Equal(tb, s.maxTime, maxt) - indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(s.logger, nil, storecache.InMemoryIndexCacheConfig{ + indexCache, err := indexcache.NewInMemoryIndexCacheWithConfig(s.logger, nil, indexcache.InMemoryIndexCacheConfig{ MaxItemSize: 1e5, MaxSize: 2e5, }) @@ -862,10 +862,10 @@ func BenchmarkBucketStoreLabelValues(tb *testing.B) { // indexCacheMissingLabelValues wraps an IndexCache returning a miss on all FetchLabelValues calls, // making it useful to benchmark the LabelValues calls (it still caches the underlying postings calls) type indexCacheMissingLabelValues struct { - storecache.IndexCache + indexcache.IndexCache } -func (indexCacheMissingLabelValues) FetchLabelValues(ctx context.Context, userID string, blockID ulid.ULID, labelName string, matchersKey storecache.LabelMatchersKey) ([]byte, bool) { +func (indexCacheMissingLabelValues) FetchLabelValues(ctx context.Context, userID string, blockID ulid.ULID, labelName string, matchersKey indexcache.LabelMatchersKey) ([]byte, bool) { return nil, false } diff --git a/pkg/storegateway/bucket_test.go b/pkg/storegateway/bucket_test.go index 7e2a3e817fd..4e274756c12 100644 --- a/pkg/storegateway/bucket_test.go +++ b/pkg/storegateway/bucket_test.go @@ -64,7 +64,7 @@ import ( "github.com/grafana/mimir/pkg/compactor" "github.com/grafana/mimir/pkg/storage/sharding" mimir_tsdb "github.com/grafana/mimir/pkg/storage/tsdb" - storecache "github.com/grafana/mimir/pkg/storage/tsdb/cache" + "github.com/grafana/mimir/pkg/storegateway/indexcache" "github.com/grafana/mimir/pkg/util/test" ) @@ -1049,7 +1049,7 @@ type cacheNotExpectingToStoreLabelNames struct { t *testing.T } -func (c cacheNotExpectingToStoreLabelNames) StoreLabelNames(ctx context.Context, userID string, blockID ulid.ULID, matchersKey storecache.LabelMatchersKey, v []byte) { +func (c cacheNotExpectingToStoreLabelNames) StoreLabelNames(ctx context.Context, userID string, blockID ulid.ULID, matchersKey indexcache.LabelMatchersKey, v []byte) { c.t.Fatalf("StoreLabelNames should not be called") } @@ -1150,7 +1150,7 @@ type cacheNotExpectingToStoreLabelValues struct { t *testing.T } -func (c cacheNotExpectingToStoreLabelValues) StoreLabelValues(ctx context.Context, userID string, blockID ulid.ULID, labelName string, matchersKey storecache.LabelMatchersKey, v []byte) { +func (c cacheNotExpectingToStoreLabelValues) StoreLabelValues(ctx context.Context, userID string, blockID ulid.ULID, labelName string, matchersKey indexcache.LabelMatchersKey, v []byte) { c.t.Fatalf("StoreLabelValues should not be called") } @@ -1377,8 +1377,8 @@ func TestBucketIndexReader_ExpandedPostings(t *testing.T) { }) } -func newInMemoryIndexCache(t *testing.T) storecache.IndexCache { - cache, err := storecache.NewInMemoryIndexCacheWithConfig(log.NewNopLogger(), nil, storecache.DefaultInMemoryIndexCacheConfig) +func newInMemoryIndexCache(t *testing.T) indexcache.IndexCache { + cache, err := indexcache.NewInMemoryIndexCacheWithConfig(log.NewNopLogger(), nil, indexcache.DefaultInMemoryIndexCacheConfig) require.NoError(t, err) return cache } @@ -1422,7 +1422,7 @@ func (w *contextNotifyingOnDoneWaiting) Done() <-chan struct{} { type corruptedExpandedPostingsCache struct{ noopCache } -func (c corruptedExpandedPostingsCache) FetchExpandedPostings(ctx context.Context, userID string, blockID ulid.ULID, key storecache.LabelMatchersKey) ([]byte, bool) { +func (c corruptedExpandedPostingsCache) FetchExpandedPostings(ctx context.Context, userID string, blockID ulid.ULID, key indexcache.LabelMatchersKey) ([]byte, bool) { return []byte(codecHeaderSnappy + "corrupted"), true } @@ -1441,7 +1441,7 @@ type cacheNotExpectingToStoreExpandedPostings struct { t *testing.T } -func (c cacheNotExpectingToStoreExpandedPostings) StoreExpandedPostings(ctx context.Context, userID string, blockID ulid.ULID, key storecache.LabelMatchersKey, v []byte) { +func (c cacheNotExpectingToStoreExpandedPostings) StoreExpandedPostings(ctx context.Context, userID string, blockID ulid.ULID, key indexcache.LabelMatchersKey, v []byte) { c.t.Fatalf("StoreExpandedPostings should not be called") } @@ -1844,7 +1844,7 @@ func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) { chunkPool, err := pool.NewBucketedBytes(chunkBytesPoolMinSize, chunkBytesPoolMaxSize, 2, 100e7) assert.NoError(t, err) - indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(logger, nil, storecache.InMemoryIndexCacheConfig{ + indexCache, err := indexcache.NewInMemoryIndexCacheWithConfig(logger, nil, indexcache.InMemoryIndexCacheConfig{ MaxItemSize: 3000, // This is the exact size of cache needed for our *single request*. // This is limited in order to make sure we test evictions. @@ -2088,7 +2088,7 @@ func TestSeries_ErrorUnmarshallingRequestHints(t *testing.T) { fetcher, err := block.NewMetaFetcher(logger, 10, instrBkt, tmpDir, nil, nil, nil) assert.NoError(t, err) - indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(logger, nil, storecache.InMemoryIndexCacheConfig{}) + indexCache, err := indexcache.NewInMemoryIndexCacheWithConfig(logger, nil, indexcache.InMemoryIndexCacheConfig{}) assert.NoError(t, err) store, err := NewBucketStore( @@ -2181,7 +2181,7 @@ func TestSeries_BlockWithMultipleChunks(t *testing.T) { fetcher, err := block.NewMetaFetcher(logger, 10, instrBkt, tmpDir, nil, nil, nil) assert.NoError(t, err) - indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(logger, nil, storecache.InMemoryIndexCacheConfig{}) + indexCache, err := indexcache.NewInMemoryIndexCacheWithConfig(logger, nil, indexcache.InMemoryIndexCacheConfig{}) assert.NoError(t, err) store, err := NewBucketStore( @@ -2367,7 +2367,7 @@ func setupStoreForHintsTest(t *testing.T) (test.TB, *BucketStore, []*storepb.Ser fetcher, err := block.NewMetaFetcher(logger, 10, instrBkt, tmpDir, nil, nil, nil) assert.NoError(tb, err) - indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(logger, nil, storecache.InMemoryIndexCacheConfig{}) + indexCache, err := indexcache.NewInMemoryIndexCacheWithConfig(logger, nil, indexcache.InMemoryIndexCacheConfig{}) assert.NoError(tb, err) store, err := NewBucketStore( @@ -2691,7 +2691,7 @@ func prepareBucket(b *testing.B, resolutionLevel compactor.ResolutionLevel) (*bu // Create an index header reader. indexHeaderReader, err := indexheader.NewBinaryReader(ctx, logger, bkt, tmpDir, blockMeta.ULID, mimir_tsdb.DefaultPostingOffsetInMemorySampling) assert.NoError(b, err) - indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(logger, nil, storecache.DefaultInMemoryIndexCacheConfig) + indexCache, err := indexcache.NewInMemoryIndexCacheWithConfig(logger, nil, indexcache.DefaultInMemoryIndexCacheConfig) assert.NoError(b, err) // Create a bucket block with only the dependencies we need for the benchmark. @@ -2906,7 +2906,7 @@ type cacheNotExpectingToStoreSeries struct { t *testing.T } -func (c cacheNotExpectingToStoreSeries) StoreSeries(ctx context.Context, userID string, blockID ulid.ULID, matchersKey storecache.LabelMatchersKey, shard *sharding.ShardSelector, v []byte) { +func (c cacheNotExpectingToStoreSeries) StoreSeries(ctx context.Context, userID string, blockID ulid.ULID, matchersKey indexcache.LabelMatchersKey, shard *sharding.ShardSelector, v []byte) { c.t.Fatalf("StoreSeries should not be called") } diff --git a/pkg/storage/tsdb/cache/cache.go b/pkg/storegateway/indexcache/cache.go similarity index 99% rename from pkg/storage/tsdb/cache/cache.go rename to pkg/storegateway/indexcache/cache.go index c1a507b86ef..e4028e10942 100644 --- a/pkg/storage/tsdb/cache/cache.go +++ b/pkg/storegateway/indexcache/cache.go @@ -3,7 +3,7 @@ // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Thanos Authors. -package cache +package indexcache import ( "context" diff --git a/pkg/storage/tsdb/cache/cache_test.go b/pkg/storegateway/indexcache/cache_test.go similarity index 92% rename from pkg/storage/tsdb/cache/cache_test.go rename to pkg/storegateway/indexcache/cache_test.go index 588ddefd975..50ee25ede9f 100644 --- a/pkg/storage/tsdb/cache/cache_test.go +++ b/pkg/storegateway/indexcache/cache_test.go @@ -3,7 +3,7 @@ // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Thanos Authors. -package cache +package indexcache import ( "fmt" @@ -11,11 +11,12 @@ import ( "github.com/prometheus/prometheus/model/labels" "github.com/stretchr/testify/assert" - "go.uber.org/goleak" + + "github.com/grafana/mimir/pkg/util/test" ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + test.VerifyNoLeakTestMain(m) } func TestCanonicalLabelMatchersKey(t *testing.T) { diff --git a/pkg/storage/tsdb/cache/inmemory.go b/pkg/storegateway/indexcache/inmemory.go similarity index 99% rename from pkg/storage/tsdb/cache/inmemory.go rename to pkg/storegateway/indexcache/inmemory.go index c7c43ce7be9..6d5cf8e246a 100644 --- a/pkg/storage/tsdb/cache/inmemory.go +++ b/pkg/storegateway/indexcache/inmemory.go @@ -2,7 +2,7 @@ // Provenance-includes-location: https://github.com/thanos-io/thanos/blob/main/pkg/store/cache/inmemory.go // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Thanos Authors. -package cache +package indexcache import ( "context" diff --git a/pkg/storage/tsdb/cache/inmemory_test.go b/pkg/storegateway/indexcache/inmemory_test.go similarity index 99% rename from pkg/storage/tsdb/cache/inmemory_test.go rename to pkg/storegateway/indexcache/inmemory_test.go index 9adcaf83c21..cd3899596f1 100644 --- a/pkg/storage/tsdb/cache/inmemory_test.go +++ b/pkg/storegateway/indexcache/inmemory_test.go @@ -4,7 +4,7 @@ // Provenance-includes-copyright: The Thanos Authors. // Tests out the index cache implementation. -package cache +package indexcache import ( "bytes" diff --git a/pkg/storage/tsdb/cache/memcached.go b/pkg/storegateway/indexcache/memcached.go similarity index 99% rename from pkg/storage/tsdb/cache/memcached.go rename to pkg/storegateway/indexcache/memcached.go index 70ce081e94e..6b31df96db8 100644 --- a/pkg/storage/tsdb/cache/memcached.go +++ b/pkg/storegateway/indexcache/memcached.go @@ -3,7 +3,7 @@ // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Thanos Authors. -package cache +package indexcache import ( "context" diff --git a/pkg/storage/tsdb/cache/memcached_test.go b/pkg/storegateway/indexcache/memcached_test.go similarity index 99% rename from pkg/storage/tsdb/cache/memcached_test.go rename to pkg/storegateway/indexcache/memcached_test.go index 4e7b6a7c8c0..4b5b0bb09f6 100644 --- a/pkg/storage/tsdb/cache/memcached_test.go +++ b/pkg/storegateway/indexcache/memcached_test.go @@ -3,7 +3,7 @@ // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Thanos Authors. -package cache +package indexcache import ( "context" diff --git a/pkg/storage/tsdb/cache/tracing.go b/pkg/storegateway/indexcache/tracing.go similarity index 99% rename from pkg/storage/tsdb/cache/tracing.go rename to pkg/storegateway/indexcache/tracing.go index 14bdffc1357..90c0726c96f 100644 --- a/pkg/storage/tsdb/cache/tracing.go +++ b/pkg/storegateway/indexcache/tracing.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0-only -package cache +package indexcache import ( "context" diff --git a/pkg/storegateway/snappy_gob_codec_test.go b/pkg/storegateway/snappy_gob_codec_test.go index 9fb3f91d585..a9a10a212d3 100644 --- a/pkg/storegateway/snappy_gob_codec_test.go +++ b/pkg/storegateway/snappy_gob_codec_test.go @@ -9,13 +9,13 @@ import ( "github.com/prometheus/prometheus/model/labels" - "github.com/grafana/mimir/pkg/storage/tsdb/cache" + "github.com/grafana/mimir/pkg/storegateway/indexcache" ) func TestSnappyGobSeriesCacheEntryCodec(t *testing.T) { type testType struct { LabelSets []labels.Labels - MatchersKey cache.LabelMatchersKey + MatchersKey indexcache.LabelMatchersKey } entry := testType{ @@ -23,7 +23,7 @@ func TestSnappyGobSeriesCacheEntryCodec(t *testing.T) { {{Name: "foo", Value: "bar"}}, {{Name: "baz", Value: "boo"}}, }, - MatchersKey: cache.CanonicalLabelMatchersKey([]*labels.Matcher{labels.MustNewMatcher(labels.MatchRegexp, "foo", "bar")}), + MatchersKey: indexcache.CanonicalLabelMatchersKey([]*labels.Matcher{labels.MustNewMatcher(labels.MatchRegexp, "foo", "bar")}), } t.Run("happy case roundtrip", func(t *testing.T) { diff --git a/pkg/util/test/leak.go b/pkg/util/test/leak.go index 071393d9b3f..740975f5a39 100644 --- a/pkg/util/test/leak.go +++ b/pkg/util/test/leak.go @@ -9,7 +9,18 @@ import ( ) func VerifyNoLeak(t testing.TB) { - opts := []goleak.Option{ + // Run it as a cleanup function so that "last added, first called" ordering execution is guaranteed. + t.Cleanup(func() { + goleak.VerifyNone(t, goLeakOptions()...) + }) +} + +func VerifyNoLeakTestMain(m *testing.M) { + goleak.VerifyTestMain(m, goLeakOptions()...) +} + +func goLeakOptions() []goleak.Option { + return []goleak.Option{ // Ignore opencensus default worker because it's started in a init() function. goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), @@ -18,9 +29,4 @@ func VerifyNoLeak(t testing.TB) { // on store-gateway termination so it never gets terminated. goleak.IgnoreTopFunction("github.com/thanos-io/thanos/pkg/block/indexheader.NewReaderPool.func1"), } - - // Run it as a cleanup function so that "last added, first called" ordering execution is guaranteed. - t.Cleanup(func() { - goleak.VerifyNone(t, opts...) - }) } From ebd461e4893c75c81716d6e5e66cae4edee77638 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Fri, 28 Jan 2022 15:03:50 +0100 Subject: [PATCH 035/168] flusher: Tag advanced config parameters (#950) Signed-off-by: Arve Knudsen --- cmd/mimir/help.txt.tmpl | 2 -- pkg/flusher/flusher.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index eef170e784d..ad4ce5b321c 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -803,8 +803,6 @@ Usage of ./cmd/mimir/mimir: Enable the experimental alertmanager config api. -experimental.ruler.enable-api Enable the ruler api - -flusher.exit-after-flush - Stop after flush has finished. If false, process will keep running, doing nothing. (default true) -frontend.align-querier-with-step Mutate incoming queries to align their start and end with their step. -frontend.cache-results diff --git a/pkg/flusher/flusher.go b/pkg/flusher/flusher.go index 04badbc5649..5b670adff37 100644 --- a/pkg/flusher/flusher.go +++ b/pkg/flusher/flusher.go @@ -23,7 +23,7 @@ import ( // Config for an Ingester. type Config struct { - ExitAfterFlush bool `yaml:"exit_after_flush"` + ExitAfterFlush bool `yaml:"exit_after_flush" category:"advanced"` } // RegisterFlags adds the flags required to config this to the given FlagSet From d6cc594d9545c56664ceb6a5e3c7fbc79fe3f58c Mon Sep 17 00:00:00 2001 From: Mauro Stettler Date: Fri, 28 Jan 2022 11:05:19 -0300 Subject: [PATCH 036/168] update vendored mimir-prometheus (#932) * update vendored mimir-prometheus Signed-off-by: Mauro Stettler * go mod tidy Signed-off-by: Mauro Stettler * set chunk write queue size default to 1000 Signed-off-by: Mauro Stettler * update reference help Signed-off-by: Mauro Stettler * update default chunk write queue size to 1M Signed-off-by: Mauro Stettler * update docs with new default Signed-off-by: Mauro Stettler --- cmd/mimir/help-all.txt.tmpl | 2 +- cmd/mimir/help.txt.tmpl | 2 +- docs/sources/blocks-storage/querier.md | 4 +- docs/sources/blocks-storage/store-gateway.md | 4 +- .../configuration/config-file-reference.md | 3 +- go.mod | 2 +- go.sum | 4 +- pkg/storage/tsdb/config.go | 2 +- .../prometheus/prometheus/rules/manager.go | 29 +- .../tsdb/chunks/chunk_write_queue.go | 110 +-- .../prometheus/tsdb/chunks/head_chunks.go | 37 +- .../prometheus/tsdb/chunks/old_head_chunks.go | 710 ------------------ .../prometheus/prometheus/tsdb/head.go | 37 +- .../prometheus/prometheus/tsdb/head_append.go | 7 +- .../prometheus/prometheus/tsdb/head_read.go | 6 +- vendor/modules.txt | 4 +- 16 files changed, 122 insertions(+), 841 deletions(-) delete mode 100644 vendor/github.com/prometheus/prometheus/tsdb/chunks/old_head_chunks.go diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index f23426b2216..f65481700ed 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -470,7 +470,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes int The write buffer size used by the head chunks mapper. Lower values reduce memory utilisation on clusters with a large number of tenants at the cost of increased disk I/O operations. (default 4194304) -blocks-storage.tsdb.head-chunks-write-queue-size int - The size of the write queue used by the head chunks mapper. Lower values reduce memory utilisation at the cost of potentially higher ingest latency. 0 disables the use of the chunk write queue. + The size of the write queue used by the head chunks mapper. Lower values reduce memory utilisation at the cost of potentially higher ingest latency. (default 1000000) -blocks-storage.tsdb.head-compaction-concurrency int Maximum number of tenants concurrently compacting TSDB head into a new block (default 5) -blocks-storage.tsdb.head-compaction-idle-timeout duration diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index ad4ce5b321c..d8588e4a224 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -470,7 +470,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes int The write buffer size used by the head chunks mapper. Lower values reduce memory utilisation on clusters with a large number of tenants at the cost of increased disk I/O operations. (default 4194304) -blocks-storage.tsdb.head-chunks-write-queue-size int - The size of the write queue used by the head chunks mapper. Lower values reduce memory utilisation at the cost of potentially higher ingest latency. 0 disables the use of the chunk write queue. + The size of the write queue used by the head chunks mapper. Lower values reduce memory utilisation at the cost of potentially higher ingest latency. (default 1000000) -blocks-storage.tsdb.head-compaction-concurrency int Maximum number of tenants concurrently compacting TSDB head into a new block (default 5) -blocks-storage.tsdb.head-compaction-idle-timeout duration diff --git a/docs/sources/blocks-storage/querier.md b/docs/sources/blocks-storage/querier.md index 8a02ea87c14..1fd3afef35b 100644 --- a/docs/sources/blocks-storage/querier.md +++ b/docs/sources/blocks-storage/querier.md @@ -713,9 +713,9 @@ blocks_storage: # The size of the write queue used by the head chunks mapper. Lower values # reduce memory utilisation at the cost of potentially higher ingest - # latency. 0 disables the use of the chunk write queue. + # latency. # CLI flag: -blocks-storage.tsdb.head-chunks-write-queue-size - [head_chunks_write_queue_size: | default = 0] + [head_chunks_write_queue_size: | default = 1000000] # Enables TSDB isolation feature. Disabling may improve performance. # CLI flag: -blocks-storage.tsdb.isolation-enabled diff --git a/docs/sources/blocks-storage/store-gateway.md b/docs/sources/blocks-storage/store-gateway.md index ca3e0e77a64..606024758cc 100644 --- a/docs/sources/blocks-storage/store-gateway.md +++ b/docs/sources/blocks-storage/store-gateway.md @@ -789,9 +789,9 @@ blocks_storage: # The size of the write queue used by the head chunks mapper. Lower values # reduce memory utilisation at the cost of potentially higher ingest - # latency. 0 disables the use of the chunk write queue. + # latency. # CLI flag: -blocks-storage.tsdb.head-chunks-write-queue-size - [head_chunks_write_queue_size: | default = 0] + [head_chunks_write_queue_size: | default = 1000000] # Enables TSDB isolation feature. Disabling may improve performance. # CLI flag: -blocks-storage.tsdb.isolation-enabled diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index aef86130813..612b209cf26 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -3179,9 +3179,8 @@ tsdb: # The size of the write queue used by the head chunks mapper. Lower values # reduce memory utilisation at the cost of potentially higher ingest latency. - # 0 disables the use of the chunk write queue. # CLI flag: -blocks-storage.tsdb.head-chunks-write-queue-size - [head_chunks_write_queue_size: | default = 0] + [head_chunks_write_queue_size: | default = 1000000] # Enables TSDB isolation feature. Disabling may improve performance. # CLI flag: -blocks-storage.tsdb.isolation-enabled diff --git a/go.mod b/go.mod index a5448e16dcb..24171db8e65 100644 --- a/go.mod +++ b/go.mod @@ -202,7 +202,7 @@ replace git.apache.org/thrift.git => github.com/apache/thrift v0.0.0-20180902110 replace github.com/bradfitz/gomemcache => github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab // Using a fork of Prometheus while we work on querysharding to avoid a dependency on the upstream. -replace github.com/prometheus/prometheus => github.com/grafana/mimir-prometheus v0.0.0-20220107153801-049c5e44352c +replace github.com/prometheus/prometheus => github.com/grafana/mimir-prometheus v0.0.0-20220124124958-644605deb599 // Pin hashicorp depencencies since the Prometheus fork, go mod tries to update them. replace github.com/hashicorp/go-immutable-radix => github.com/hashicorp/go-immutable-radix v1.2.0 diff --git a/go.sum b/go.sum index 0f0414b2d17..70e2abe4794 100644 --- a/go.sum +++ b/go.sum @@ -976,8 +976,8 @@ github.com/grafana/dskit v0.0.0-20220128074435-7436a77cd54e/go.mod h1:Q9WmQ9cVkr github.com/grafana/e2e v0.1.0 h1:nThd0U0TjUqyOOupSb+qDd4BOdhqwhR/oYbjoqiMlZk= github.com/grafana/e2e v0.1.0/go.mod h1:+26VJWpczg2OU3D0537acnHSHzhJORpxOs6F+M27tZo= github.com/grafana/memberlist v0.2.5-0.20211201083710-c7bc8e9df94b/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/grafana/mimir-prometheus v0.0.0-20220107153801-049c5e44352c h1:VhgI4e6KUPHqDUhLuSw9DdYhBXlD20MtKZ3iXFWt1Fw= -github.com/grafana/mimir-prometheus v0.0.0-20220107153801-049c5e44352c/go.mod h1:6K+MGuCdYASOcOEKusiGUeYeRoobrW/26smN9OCXb0M= +github.com/grafana/mimir-prometheus v0.0.0-20220124124958-644605deb599 h1:vFQ6CQRhIv+i+18GJtxSIjGsEK8k7Rqu8s3m1ZGmYNU= +github.com/grafana/mimir-prometheus v0.0.0-20220124124958-644605deb599/go.mod h1:6K+MGuCdYASOcOEKusiGUeYeRoobrW/26smN9OCXb0M= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= diff --git a/pkg/storage/tsdb/config.go b/pkg/storage/tsdb/config.go index 73b9a948130..2221474e015 100644 --- a/pkg/storage/tsdb/config.go +++ b/pkg/storage/tsdb/config.go @@ -197,7 +197,7 @@ func (cfg *TSDBConfig) RegisterFlags(f *flag.FlagSet) { f.BoolVar(&cfg.FlushBlocksOnShutdown, "blocks-storage.tsdb.flush-blocks-on-shutdown", false, "True to flush blocks to storage on shutdown. If false, incomplete blocks will be reused after restart.") f.DurationVar(&cfg.CloseIdleTSDBTimeout, "blocks-storage.tsdb.close-idle-tsdb-timeout", 0, "If TSDB has not received any data for this duration, and all blocks from TSDB have been shipped, TSDB is closed and deleted from local disk. If set to positive value, this value should be equal or higher than -querier.query-ingesters-within flag to make sure that TSDB is not closed prematurely, which could cause partial query results. 0 or negative value disables closing of idle TSDB.") f.BoolVar(&cfg.MemorySnapshotOnShutdown, "blocks-storage.tsdb.memory-snapshot-on-shutdown", false, "True to enable snapshotting of in-memory TSDB data on disk when shutting down.") - f.IntVar(&cfg.HeadChunksWriteQueueSize, "blocks-storage.tsdb.head-chunks-write-queue-size", 0, "The size of the write queue used by the head chunks mapper. Lower values reduce memory utilisation at the cost of potentially higher ingest latency. 0 disables the use of the chunk write queue.") + f.IntVar(&cfg.HeadChunksWriteQueueSize, "blocks-storage.tsdb.head-chunks-write-queue-size", 1000000, "The size of the write queue used by the head chunks mapper. Lower values reduce memory utilisation at the cost of potentially higher ingest latency.") f.BoolVar(&cfg.IsolationEnabled, "blocks-storage.tsdb.isolation-enabled", true, "Enables TSDB isolation feature. Disabling may improve performance.") } diff --git a/vendor/github.com/prometheus/prometheus/rules/manager.go b/vendor/github.com/prometheus/prometheus/rules/manager.go index da0964b46c2..15d26b14e45 100644 --- a/vendor/github.com/prometheus/prometheus/rules/manager.go +++ b/vendor/github.com/prometheus/prometheus/rules/manager.go @@ -875,21 +875,26 @@ func (g *Group) Equals(ng *Group) bool { return false } } + { + // compare source tenants + if len(g.sourceTenants) != len(ng.sourceTenants) { + return false + } - // compare source tenants ignoring their order - if len(g.sourceTenants) != len(ng.sourceTenants) { - return false - } - - thisSourceTenants := make(map[string]struct{}, len(g.sourceTenants)) + copyAndSort := func(x []string) []string { + copied := make([]string, len(x)) + copy(copied, x) + sort.Strings(copied) + return copied + } - for _, tenant := range g.sourceTenants { - thisSourceTenants[tenant] = struct{}{} - } + ngSourceTenantsCopy := copyAndSort(ng.sourceTenants) + gSourceTenantsCopy := copyAndSort(g.sourceTenants) - for _, tenant := range ng.sourceTenants { - if _, ok := thisSourceTenants[tenant]; !ok { - return false + for i := range ngSourceTenantsCopy { + if gSourceTenantsCopy[i] != ngSourceTenantsCopy[i] { + return false + } } } diff --git a/vendor/github.com/prometheus/prometheus/tsdb/chunks/chunk_write_queue.go b/vendor/github.com/prometheus/prometheus/tsdb/chunks/chunk_write_queue.go index 307ccfcdd97..5cdd2e81f04 100644 --- a/vendor/github.com/prometheus/prometheus/tsdb/chunks/chunk_write_queue.go +++ b/vendor/github.com/prometheus/prometheus/tsdb/chunks/chunk_write_queue.go @@ -32,60 +32,53 @@ type chunkWriteJob struct { callback func(error) } -var ( - queueOperationAdd = "add" - queueOperationGet = "get" - queueOperationComplete = "complete" - queueOperations = []string{queueOperationAdd, queueOperationGet, queueOperationComplete} -) - // chunkWriteQueue is a queue for writing chunks to disk in a non-blocking fashion. // Chunks that shall be written get added to the queue, which is consumed asynchronously. -// Adding jobs to the queue is non-blocking as long as the queue isn't full. +// Adding jobs to the job is non-blocking as long as the queue isn't full. type chunkWriteQueue struct { - size int - jobCh chan chunkWriteJob + jobs chan chunkWriteJob - chunkRefMapMtx sync.RWMutex - chunkRefMap map[ChunkDiskMapperRef]chunkenc.Chunk - chunkRefMapOversized bool // indicates whether more than chunks were put into the chunkRefMap. + chunkRefMapMtx sync.RWMutex + chunkRefMap map[ChunkDiskMapperRef]chunkenc.Chunk - isRunningMtx sync.RWMutex - isRunning bool + isRunningMtx sync.Mutex // Protects the isRunning property. + isRunning bool // Used to prevent that new jobs get added to the queue when the chan is already closed. workerWg sync.WaitGroup writeChunk writeChunkF - operationsMetric *prometheus.CounterVec + // Keeping three separate counters instead of only a single CounterVec to improve the performance of the critical + // addJob() method which otherwise would need to perform a WithLabelValues call on the CounterVec. + adds prometheus.Counter + gets prometheus.Counter + completed prometheus.Counter } // writeChunkF is a function which writes chunks, it is dynamic to allow mocking in tests. type writeChunkF func(HeadSeriesRef, int64, int64, chunkenc.Chunk, ChunkDiskMapperRef, bool) error func newChunkWriteQueue(reg prometheus.Registerer, size int, writeChunk writeChunkF) *chunkWriteQueue { + counters := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "prometheus_tsdb_chunk_write_queue_operations_total", + Help: "Number of operations on the chunk_write_queue.", + }, + []string{"operation"}, + ) + q := &chunkWriteQueue{ - size: size, - jobCh: make(chan chunkWriteJob, size), + jobs: make(chan chunkWriteJob, size), chunkRefMap: make(map[ChunkDiskMapperRef]chunkenc.Chunk, size), writeChunk: writeChunk, - operationsMetric: prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "prometheus_tsdb_chunk_write_queue_operations_total", - Help: "Number of operations on the chunk_write_queue.", - }, - []string{"operation"}, - ), + adds: counters.WithLabelValues("add"), + gets: counters.WithLabelValues("get"), + completed: counters.WithLabelValues("complete"), } if reg != nil { - reg.MustRegister(q.operationsMetric) - - // Initialize series for all the possible labels. - for _, op := range queueOperations { - q.operationsMetric.WithLabelValues(op).Add(0) - } + reg.MustRegister(counters) } q.start() @@ -97,7 +90,7 @@ func (c *chunkWriteQueue) start() { go func() { defer c.workerWg.Done() - for job := range c.jobCh { + for job := range c.jobs { c.processJob(job) } }() @@ -118,36 +111,28 @@ func (c *chunkWriteQueue) processJob(job chunkWriteJob) { delete(c.chunkRefMap, job.ref) - if len(c.chunkRefMap) == 0 { - // If the map had to be grown beyond its allocated size, then we recreate it to free memory. - if c.chunkRefMapOversized { - c.chunkRefMap = make(map[ChunkDiskMapperRef]chunkenc.Chunk, c.size) - c.chunkRefMapOversized = false - } - } - - c.operationsMetric.WithLabelValues(queueOperationComplete).Inc() + c.completed.Inc() } -func (c *chunkWriteQueue) addJob(job chunkWriteJob) error { - c.isRunningMtx.RLock() - defer c.isRunningMtx.RUnlock() +func (c *chunkWriteQueue) addJob(job chunkWriteJob) (err error) { + defer func() { + if err == nil { + c.adds.Inc() + } + }() + + c.isRunningMtx.Lock() + defer c.isRunningMtx.Unlock() if !c.isRunning { return errors.New("queue is not started") } c.chunkRefMapMtx.Lock() - // The map might grow beyond the allocated size here, in which case we'll recreate it as soon as it is drained. c.chunkRefMap[job.ref] = job.chk - if len(c.chunkRefMap) > c.size { - c.chunkRefMapOversized = true - } c.chunkRefMapMtx.Unlock() - c.jobCh <- job - - c.operationsMetric.WithLabelValues(queueOperationAdd).Inc() + c.jobs <- job return nil } @@ -158,7 +143,7 @@ func (c *chunkWriteQueue) get(ref ChunkDiskMapperRef) chunkenc.Chunk { chk, ok := c.chunkRefMap[ref] if ok { - c.operationsMetric.WithLabelValues(queueOperationGet).Inc() + c.gets.Inc() } return chk @@ -174,7 +159,26 @@ func (c *chunkWriteQueue) stop() { c.isRunning = false - close(c.jobCh) + close(c.jobs) c.workerWg.Wait() } + +func (c *chunkWriteQueue) queueIsEmpty() bool { + return c.queueSize() == 0 +} + +func (c *chunkWriteQueue) queueIsFull() bool { + // When the queue is full and blocked on the writer the chunkRefMap has one more job than the cap of the jobCh + // because one job is currently being processed and blocked in the writer. + return c.queueSize() == cap(c.jobs)+1 +} + +func (c *chunkWriteQueue) queueSize() int { + c.chunkRefMapMtx.Lock() + defer c.chunkRefMapMtx.Unlock() + + // Looking at chunkRefMap instead of jobCh because the job is popped from the chan before it has + // been fully processed, it remains in the chunkRefMap until the processing is complete. + return len(c.chunkRefMap) +} diff --git a/vendor/github.com/prometheus/prometheus/tsdb/chunks/head_chunks.go b/vendor/github.com/prometheus/prometheus/tsdb/chunks/head_chunks.go index bb1730722eb..4ea454de620 100644 --- a/vendor/github.com/prometheus/prometheus/tsdb/chunks/head_chunks.go +++ b/vendor/github.com/prometheus/prometheus/tsdb/chunks/head_chunks.go @@ -113,7 +113,7 @@ func (f *chunkPos) getNextChunkRef(chk chunkenc.Chunk) (chkRef ChunkDiskMapperRe chkLen := uint64(len(chk.Bytes())) bytesToWrite := f.bytesToWriteForChunk(chkLen) - if f.shouldCutNewFile(bytesToWrite) { + if f.shouldCutNewFile(chkLen) { f.toNewFile() f.cutFile = false cutFile = true @@ -137,37 +137,37 @@ func (f *chunkPos) cutFileOnNextChunk() { f.cutFile = true } -// setSeq sets the sequence number of the head chunk file. +// initSeq sets the sequence number of the head chunk file. // Should only be used for initialization, after that the sequence number will be managed by chunkPos. -func (f *chunkPos) setSeq(seq uint64) { +func (f *chunkPos) initSeq(seq uint64) { f.seq = seq } // shouldCutNewFile returns whether a new file should be cut based on the file size. -// Not thread safe, a lock must be held when calling this. -func (f *chunkPos) shouldCutNewFile(bytesToWrite uint64) bool { +// The read or write lock on chunkPos must be held when calling this. +func (f *chunkPos) shouldCutNewFile(chunkSize uint64) bool { if f.cutFile { return true } return f.offset == 0 || // First head chunk file. - f.offset+bytesToWrite > MaxHeadChunkFileSize // Exceeds the max head chunk file size. + f.offset+chunkSize+MaxHeadChunkMetaSize > MaxHeadChunkFileSize // Exceeds the max head chunk file size. } // bytesToWriteForChunk returns the number of bytes that will need to be written for the given chunk size, // including all meta data before and after the chunk data. // Head chunk format: https://github.com/prometheus/prometheus/blob/main/tsdb/docs/format/head_chunks.md#chunk func (f *chunkPos) bytesToWriteForChunk(chkLen uint64) uint64 { - // headers + // Headers. bytes := uint64(SeriesRefSize) + 2*MintMaxtSize + ChunkEncodingSize - // size of chunk length encoded as uvarint + // Size of chunk length encoded as uvarint. bytes += uint64(varint.UvarintSize(chkLen)) - // chunk length + // Chunk length. bytes += chkLen - // crc32 + // crc32. bytes += CRCSize return bytes @@ -321,7 +321,7 @@ func (cdm *ChunkDiskMapper) openMMapFiles() (returnErr error) { } } - cdm.evtlPos.setSeq(uint64(lastSeq)) + cdm.evtlPos.initSeq(uint64(lastSeq)) return nil } @@ -410,7 +410,7 @@ func (cdm *ChunkDiskMapper) writeChunk(seriesRef HeadSeriesRef, mint, maxt int64 } if cutFile { - err := cdm.cutExpectRef(ref) + err := cdm.cutAndExpectRef(ref) if err != nil { return err } @@ -466,18 +466,21 @@ func (cdm *ChunkDiskMapper) writeChunk(seriesRef HeadSeriesRef, mint, maxt int64 } // CutNewFile makes that a new file will be created the next time a chunk is written. -func (cdm *ChunkDiskMapper) CutNewFile() error { +func (cdm *ChunkDiskMapper) CutNewFile() { cdm.evtlPosMtx.Lock() defer cdm.evtlPosMtx.Unlock() cdm.evtlPos.cutFileOnNextChunk() - return nil } -// cutExpectRef creates a new m-mapped file. +func (cdm *ChunkDiskMapper) IsQueueEmpty() bool { + return cdm.writeQueue.queueIsEmpty() +} + +// cutAndExpectRef creates a new m-mapped file. // The write lock should be held before calling this. // It ensures that the position in the new file matches the given chunk reference, if not then it errors. -func (cdm *ChunkDiskMapper) cutExpectRef(chkRef ChunkDiskMapperRef) (err error) { +func (cdm *ChunkDiskMapper) cutAndExpectRef(chkRef ChunkDiskMapperRef) (err error) { seq, offset, err := cdm.cut() if err != nil { return err @@ -864,7 +867,7 @@ func (cdm *ChunkDiskMapper) Truncate(mint int64) error { // There is a known race condition here because between the check of curFileSize() and the call to CutNewFile() // a new file could already be cut, this is acceptable because it will simply result in an empty file which // won't do any harm. - errs.Add(cdm.CutNewFile()) + cdm.CutNewFile() } errs.Add(cdm.deleteFiles(removedFiles)) return errs.Err() diff --git a/vendor/github.com/prometheus/prometheus/tsdb/chunks/old_head_chunks.go b/vendor/github.com/prometheus/prometheus/tsdb/chunks/old_head_chunks.go deleted file mode 100644 index 194d5be95f2..00000000000 --- a/vendor/github.com/prometheus/prometheus/tsdb/chunks/old_head_chunks.go +++ /dev/null @@ -1,710 +0,0 @@ -// Copyright 2020 The Prometheus Authors -// 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 chunks - -import ( - "bufio" - "bytes" - "encoding/binary" - "hash" - "io" - "os" - "sort" - "sync" - - "github.com/pkg/errors" - "go.uber.org/atomic" - - "github.com/prometheus/prometheus/tsdb/chunkenc" - tsdb_errors "github.com/prometheus/prometheus/tsdb/errors" - "github.com/prometheus/prometheus/tsdb/fileutil" -) - -// OldChunkDiskMapper is for writing the Head block chunks to the disk -// and access chunks via mmapped file. -type OldChunkDiskMapper struct { - curFileNumBytes atomic.Int64 // Bytes written in current open file. - - /// Writer. - dir *os.File - writeBufferSize int - - curFile *os.File // File being written to. - curFileSequence int // Index of current open file being appended to. - curFileMaxt int64 // Used for the size retention. - - byteBuf [MaxHeadChunkMetaSize]byte // Buffer used to write the header of the chunk. - chkWriter *bufio.Writer // Writer for the current open file. - crc32 hash.Hash - writePathMtx sync.Mutex - - /// Reader. - // The int key in the map is the file number on the disk. - mmappedChunkFiles map[int]*mmappedChunkFile // Contains the m-mapped files for each chunk file mapped with its index. - closers map[int]io.Closer // Closers for resources behind the byte slices. - readPathMtx sync.RWMutex // Mutex used to protect the above 2 maps. - pool chunkenc.Pool // This is used when fetching a chunk from the disk to allocate a chunk. - - // Writer and Reader. - // We flush chunks to disk in batches. Hence, we store them in this buffer - // from which chunks are served till they are flushed and are ready for m-mapping. - chunkBuffer *chunkBuffer - - // Whether the maxt field is set for all mmapped chunk files tracked within the mmappedChunkFiles map. - // This is done after iterating through all the chunks in those files using the IterateAllChunks method. - fileMaxtSet bool - - closed bool -} - -// NewOldChunkDiskMapper returns a new ChunkDiskMapper against the given directory -// using the default head chunk file duration. -// NOTE: 'IterateAllChunks' method needs to be called at least once after creating ChunkDiskMapper -// to set the maxt of all the file. -func NewOldChunkDiskMapper(dir string, pool chunkenc.Pool, writeBufferSize int) (*OldChunkDiskMapper, error) { - // Validate write buffer size. - if writeBufferSize < MinWriteBufferSize || writeBufferSize > MaxWriteBufferSize { - return nil, errors.Errorf("ChunkDiskMapper write buffer size should be between %d and %d (actual: %d)", MinWriteBufferSize, MaxWriteBufferSize, writeBufferSize) - } - if writeBufferSize%1024 != 0 { - return nil, errors.Errorf("ChunkDiskMapper write buffer size should be a multiple of 1024 (actual: %d)", writeBufferSize) - } - - if err := os.MkdirAll(dir, 0o777); err != nil { - return nil, err - } - dirFile, err := fileutil.OpenDir(dir) - if err != nil { - return nil, err - } - - m := &OldChunkDiskMapper{ - dir: dirFile, - pool: pool, - writeBufferSize: writeBufferSize, - crc32: newCRC32(), - chunkBuffer: newChunkBuffer(), - } - - if m.pool == nil { - m.pool = chunkenc.NewPool() - } - - return m, m.openMMapFiles() -} - -// openMMapFiles opens all files within dir for mmapping. -func (cdm *OldChunkDiskMapper) openMMapFiles() (returnErr error) { - cdm.mmappedChunkFiles = map[int]*mmappedChunkFile{} - cdm.closers = map[int]io.Closer{} - defer func() { - if returnErr != nil { - returnErr = tsdb_errors.NewMulti(returnErr, closeAllFromMap(cdm.closers)).Err() - - cdm.mmappedChunkFiles = nil - cdm.closers = nil - } - }() - - files, err := listChunkFiles(cdm.dir.Name()) - if err != nil { - return err - } - - files, err = repairLastChunkFile(files) - if err != nil { - return err - } - - chkFileIndices := make([]int, 0, len(files)) - for seq, fn := range files { - f, err := fileutil.OpenMmapFile(fn) - if err != nil { - return errors.Wrapf(err, "mmap files, file: %s", fn) - } - cdm.closers[seq] = f - cdm.mmappedChunkFiles[seq] = &mmappedChunkFile{byteSlice: realByteSlice(f.Bytes())} - chkFileIndices = append(chkFileIndices, seq) - } - - // Check for gaps in the files. - sort.Ints(chkFileIndices) - if len(chkFileIndices) == 0 { - return nil - } - lastSeq := chkFileIndices[0] - for _, seq := range chkFileIndices[1:] { - if seq != lastSeq+1 { - return errors.Errorf("found unsequential head chunk files %s (index: %d) and %s (index: %d)", files[lastSeq], lastSeq, files[seq], seq) - } - lastSeq = seq - } - - for i, b := range cdm.mmappedChunkFiles { - if b.byteSlice.Len() < HeadChunkFileHeaderSize { - return errors.Wrapf(errInvalidSize, "%s: invalid head chunk file header", files[i]) - } - // Verify magic number. - if m := binary.BigEndian.Uint32(b.byteSlice.Range(0, MagicChunksSize)); m != MagicHeadChunks { - return errors.Errorf("%s: invalid magic number %x", files[i], m) - } - - // Verify chunk format version. - if v := int(b.byteSlice.Range(MagicChunksSize, MagicChunksSize+ChunksFormatVersionSize)[0]); v != chunksFormatV1 { - return errors.Errorf("%s: invalid chunk format version %d", files[i], v) - } - } - - return nil -} - -// WriteChunk writes the chunk to the disk. -// The returned chunk ref is the reference from where the chunk encoding starts for the chunk. -func (cdm *OldChunkDiskMapper) WriteChunk(seriesRef HeadSeriesRef, mint, maxt int64, chk chunkenc.Chunk, callback func(err error)) (chkRef ChunkDiskMapperRef) { - chkRef, err := func() (ChunkDiskMapperRef, error) { - cdm.writePathMtx.Lock() - defer cdm.writePathMtx.Unlock() - - if cdm.closed { - return 0, ErrChunkDiskMapperClosed - } - - if cdm.shouldCutNewFile(len(chk.Bytes())) { - if err := cdm.cut(); err != nil { - return 0, err - } - } - - // if len(chk.Bytes())+MaxHeadChunkMetaSize >= writeBufferSize, it means that chunk >= the buffer size; - // so no need to flush here, as we have to flush at the end (to not keep partial chunks in buffer). - if len(chk.Bytes())+MaxHeadChunkMetaSize < cdm.writeBufferSize && cdm.chkWriter.Available() < MaxHeadChunkMetaSize+len(chk.Bytes()) { - if err := cdm.flushBuffer(); err != nil { - return 0, err - } - } - - cdm.crc32.Reset() - bytesWritten := 0 - - chkRef = newChunkDiskMapperRef(uint64(cdm.curFileSequence), uint64(cdm.curFileSize())) - - binary.BigEndian.PutUint64(cdm.byteBuf[bytesWritten:], uint64(seriesRef)) - bytesWritten += SeriesRefSize - binary.BigEndian.PutUint64(cdm.byteBuf[bytesWritten:], uint64(mint)) - bytesWritten += MintMaxtSize - binary.BigEndian.PutUint64(cdm.byteBuf[bytesWritten:], uint64(maxt)) - bytesWritten += MintMaxtSize - cdm.byteBuf[bytesWritten] = byte(chk.Encoding()) - bytesWritten += ChunkEncodingSize - n := binary.PutUvarint(cdm.byteBuf[bytesWritten:], uint64(len(chk.Bytes()))) - bytesWritten += n - - if err := cdm.writeAndAppendToCRC32(cdm.byteBuf[:bytesWritten]); err != nil { - return 0, err - } - if err := cdm.writeAndAppendToCRC32(chk.Bytes()); err != nil { - return 0, err - } - if err := cdm.writeCRC32(); err != nil { - return 0, err - } - - if maxt > cdm.curFileMaxt { - cdm.curFileMaxt = maxt - } - - cdm.chunkBuffer.put(chkRef, chk) - - if len(chk.Bytes())+MaxHeadChunkMetaSize >= cdm.writeBufferSize { - // The chunk was bigger than the buffer itself. - // Flushing to not keep partial chunks in buffer. - if err := cdm.flushBuffer(); err != nil { - return 0, err - } - } - - return chkRef, nil - }() - - if err != nil && callback != nil { - callback(err) - } - - return chkRef -} - -// shouldCutNewFile returns whether a new file should be cut, based on time and size retention. -// Size retention: because depending on the system architecture, there is a limit on how big of a file we can m-map. -// Time retention: so that we can delete old chunks with some time guarantee in low load environments. -func (cdm *OldChunkDiskMapper) shouldCutNewFile(chunkSize int) bool { - return cdm.curFileSize() == 0 || // First head chunk file. - cdm.curFileSize()+int64(chunkSize+MaxHeadChunkMetaSize) > MaxHeadChunkFileSize // Exceeds the max head chunk file size. -} - -// CutNewFile creates a new m-mapped file. -func (cdm *OldChunkDiskMapper) CutNewFile() (returnErr error) { - cdm.writePathMtx.Lock() - defer cdm.writePathMtx.Unlock() - - return cdm.cut() -} - -// cut creates a new m-mapped file. The write lock should be held before calling this. -func (cdm *OldChunkDiskMapper) cut() (returnErr error) { - // Sync current tail to disk and close. - if err := cdm.finalizeCurFile(); err != nil { - return err - } - - n, newFile, seq, err := cutSegmentFile(cdm.dir, MagicHeadChunks, headChunksFormatV1, HeadChunkFilePreallocationSize) - if err != nil { - return err - } - defer func() { - // The file should not be closed if there is no error, - // its kept open in the ChunkDiskMapper. - if returnErr != nil { - returnErr = tsdb_errors.NewMulti(returnErr, newFile.Close()).Err() - } - }() - - cdm.curFileNumBytes.Store(int64(n)) - - if cdm.curFile != nil { - cdm.readPathMtx.Lock() - cdm.mmappedChunkFiles[cdm.curFileSequence].maxt = cdm.curFileMaxt - cdm.readPathMtx.Unlock() - } - - mmapFile, err := fileutil.OpenMmapFileWithSize(newFile.Name(), MaxHeadChunkFileSize) - if err != nil { - return err - } - - cdm.readPathMtx.Lock() - cdm.curFileSequence = seq - cdm.curFile = newFile - if cdm.chkWriter != nil { - cdm.chkWriter.Reset(newFile) - } else { - cdm.chkWriter = bufio.NewWriterSize(newFile, cdm.writeBufferSize) - } - - cdm.closers[cdm.curFileSequence] = mmapFile - cdm.mmappedChunkFiles[cdm.curFileSequence] = &mmappedChunkFile{byteSlice: realByteSlice(mmapFile.Bytes())} - cdm.readPathMtx.Unlock() - - cdm.curFileMaxt = 0 - - return nil -} - -// finalizeCurFile writes all pending data to the current tail file, -// truncates its size, and closes it. -func (cdm *OldChunkDiskMapper) finalizeCurFile() error { - if cdm.curFile == nil { - return nil - } - - if err := cdm.flushBuffer(); err != nil { - return err - } - - if err := cdm.curFile.Sync(); err != nil { - return err - } - - return cdm.curFile.Close() -} - -func (cdm *OldChunkDiskMapper) write(b []byte) error { - n, err := cdm.chkWriter.Write(b) - cdm.curFileNumBytes.Add(int64(n)) - return err -} - -func (cdm *OldChunkDiskMapper) writeAndAppendToCRC32(b []byte) error { - if err := cdm.write(b); err != nil { - return err - } - _, err := cdm.crc32.Write(b) - return err -} - -func (cdm *OldChunkDiskMapper) writeCRC32() error { - return cdm.write(cdm.crc32.Sum(cdm.byteBuf[:0])) -} - -// flushBuffer flushes the current in-memory chunks. -// Assumes that writePathMtx is _write_ locked before calling this method. -func (cdm *OldChunkDiskMapper) flushBuffer() error { - if err := cdm.chkWriter.Flush(); err != nil { - return err - } - cdm.chunkBuffer.clear() - return nil -} - -// Chunk returns a chunk from a given reference. -func (cdm *OldChunkDiskMapper) Chunk(ref ChunkDiskMapperRef) (chunkenc.Chunk, error) { - cdm.readPathMtx.RLock() - // We hold this read lock for the entire duration because if Close() - // is called, the data in the byte slice will get corrupted as the mmapped - // file will be closed. - defer cdm.readPathMtx.RUnlock() - - if cdm.closed { - return nil, ErrChunkDiskMapperClosed - } - - sgmIndex, chkStart := ref.Unpack() - // We skip the series ref and the mint/maxt beforehand. - chkStart += SeriesRefSize + (2 * MintMaxtSize) - chkCRC32 := newCRC32() - - // If it is the current open file, then the chunks can be in the buffer too. - if sgmIndex == cdm.curFileSequence { - chunk := cdm.chunkBuffer.get(ref) - if chunk != nil { - return chunk, nil - } - } - - mmapFile, ok := cdm.mmappedChunkFiles[sgmIndex] - if !ok { - if sgmIndex > cdm.curFileSequence { - return nil, &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: -1, - Err: errors.Errorf("head chunk file index %d more than current open file", sgmIndex), - } - } - return nil, &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: sgmIndex, - Err: errors.New("head chunk file index %d does not exist on disk"), - } - } - - if chkStart+MaxChunkLengthFieldSize > mmapFile.byteSlice.Len() { - return nil, &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: sgmIndex, - Err: errors.Errorf("head chunk file doesn't include enough bytes to read the chunk size data field - required:%v, available:%v", chkStart+MaxChunkLengthFieldSize, mmapFile.byteSlice.Len()), - } - } - - // Encoding. - chkEnc := mmapFile.byteSlice.Range(chkStart, chkStart+ChunkEncodingSize)[0] - - // Data length. - // With the minimum chunk length this should never cause us reading - // over the end of the slice. - chkDataLenStart := chkStart + ChunkEncodingSize - c := mmapFile.byteSlice.Range(chkDataLenStart, chkDataLenStart+MaxChunkLengthFieldSize) - chkDataLen, n := binary.Uvarint(c) - if n <= 0 { - return nil, &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: sgmIndex, - Err: errors.Errorf("reading chunk length failed with %d", n), - } - } - - // Verify the chunk data end. - chkDataEnd := chkDataLenStart + n + int(chkDataLen) - if chkDataEnd > mmapFile.byteSlice.Len() { - return nil, &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: sgmIndex, - Err: errors.Errorf("head chunk file doesn't include enough bytes to read the chunk - required:%v, available:%v", chkDataEnd, mmapFile.byteSlice.Len()), - } - } - - // Check the CRC. - sum := mmapFile.byteSlice.Range(chkDataEnd, chkDataEnd+CRCSize) - if _, err := chkCRC32.Write(mmapFile.byteSlice.Range(chkStart-(SeriesRefSize+2*MintMaxtSize), chkDataEnd)); err != nil { - return nil, &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: sgmIndex, - Err: err, - } - } - if act := chkCRC32.Sum(nil); !bytes.Equal(act, sum) { - return nil, &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: sgmIndex, - Err: errors.Errorf("checksum mismatch expected:%x, actual:%x", sum, act), - } - } - - // The chunk data itself. - chkData := mmapFile.byteSlice.Range(chkDataEnd-int(chkDataLen), chkDataEnd) - - // Make a copy of the chunk data to prevent a panic occurring because the returned - // chunk data slice references an mmap-ed file which could be closed after the - // function returns but while the chunk is still in use. - chkDataCopy := make([]byte, len(chkData)) - copy(chkDataCopy, chkData) - - chk, err := cdm.pool.Get(chunkenc.Encoding(chkEnc), chkDataCopy) - if err != nil { - return nil, &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: sgmIndex, - Err: err, - } - } - return chk, nil -} - -// IterateAllChunks iterates all mmappedChunkFiles (in order of head chunk file name/number) and all the chunks within it -// and runs the provided function with information about each chunk. It returns on the first error encountered. -// NOTE: This method needs to be called at least once after creating ChunkDiskMapper -// to set the maxt of all the file. -func (cdm *OldChunkDiskMapper) IterateAllChunks(f func(seriesRef HeadSeriesRef, chunkRef ChunkDiskMapperRef, mint, maxt int64, numSamples uint16) error) (err error) { - cdm.writePathMtx.Lock() - defer cdm.writePathMtx.Unlock() - - defer func() { - cdm.fileMaxtSet = true - }() - - chkCRC32 := newCRC32() - - // Iterate files in ascending order. - segIDs := make([]int, 0, len(cdm.mmappedChunkFiles)) - for seg := range cdm.mmappedChunkFiles { - segIDs = append(segIDs, seg) - } - sort.Ints(segIDs) - for _, segID := range segIDs { - mmapFile := cdm.mmappedChunkFiles[segID] - fileEnd := mmapFile.byteSlice.Len() - if segID == cdm.curFileSequence { - fileEnd = int(cdm.curFileSize()) - } - idx := HeadChunkFileHeaderSize - for idx < fileEnd { - if fileEnd-idx < MaxHeadChunkMetaSize { - // Check for all 0s which marks the end of the file. - allZeros := true - for _, b := range mmapFile.byteSlice.Range(idx, fileEnd) { - if b != byte(0) { - allZeros = false - break - } - } - if allZeros { - // End of segment chunk file content. - break - } - return &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: segID, - Err: errors.Errorf("head chunk file has some unread data, but doesn't include enough bytes to read the chunk header"+ - " - required:%v, available:%v, file:%d", idx+MaxHeadChunkMetaSize, fileEnd, segID), - } - } - chkCRC32.Reset() - chunkRef := newChunkDiskMapperRef(uint64(segID), uint64(idx)) - - startIdx := idx - seriesRef := HeadSeriesRef(binary.BigEndian.Uint64(mmapFile.byteSlice.Range(idx, idx+SeriesRefSize))) - idx += SeriesRefSize - mint := int64(binary.BigEndian.Uint64(mmapFile.byteSlice.Range(idx, idx+MintMaxtSize))) - idx += MintMaxtSize - maxt := int64(binary.BigEndian.Uint64(mmapFile.byteSlice.Range(idx, idx+MintMaxtSize))) - idx += MintMaxtSize - - // We preallocate file to help with m-mapping (especially windows systems). - // As series ref always starts from 1, we assume it being 0 to be the end of the actual file data. - // We are not considering possible file corruption that can cause it to be 0. - // Additionally we are checking mint and maxt just to be sure. - if seriesRef == 0 && mint == 0 && maxt == 0 { - break - } - - idx += ChunkEncodingSize // Skip encoding. - dataLen, n := binary.Uvarint(mmapFile.byteSlice.Range(idx, idx+MaxChunkLengthFieldSize)) - idx += n - - numSamples := binary.BigEndian.Uint16(mmapFile.byteSlice.Range(idx, idx+2)) - idx += int(dataLen) // Skip the data. - - // In the beginning we only checked for the chunk meta size. - // Now that we have added the chunk data length, we check for sufficient bytes again. - if idx+CRCSize > fileEnd { - return &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: segID, - Err: errors.Errorf("head chunk file doesn't include enough bytes to read the chunk header - required:%v, available:%v, file:%d", idx+CRCSize, fileEnd, segID), - } - } - - // Check CRC. - sum := mmapFile.byteSlice.Range(idx, idx+CRCSize) - if _, err := chkCRC32.Write(mmapFile.byteSlice.Range(startIdx, idx)); err != nil { - return err - } - if act := chkCRC32.Sum(nil); !bytes.Equal(act, sum) { - return &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: segID, - Err: errors.Errorf("checksum mismatch expected:%x, actual:%x", sum, act), - } - } - idx += CRCSize - - if maxt > mmapFile.maxt { - mmapFile.maxt = maxt - } - - if err := f(seriesRef, chunkRef, mint, maxt, numSamples); err != nil { - if cerr, ok := err.(*CorruptionErr); ok { - cerr.Dir = cdm.dir.Name() - cerr.FileIndex = segID - return cerr - } - return err - } - } - - if idx > fileEnd { - // It should be equal to the slice length. - return &CorruptionErr{ - Dir: cdm.dir.Name(), - FileIndex: segID, - Err: errors.Errorf("head chunk file doesn't include enough bytes to read the last chunk data - required:%v, available:%v, file:%d", idx, fileEnd, segID), - } - } - } - - return nil -} - -// Truncate deletes the head chunk files which are strictly below the mint. -// mint should be in milliseconds. -func (cdm *OldChunkDiskMapper) Truncate(mint int64) error { - if !cdm.fileMaxtSet { - return errors.New("maxt of the files are not set") - } - cdm.readPathMtx.RLock() - - // Sort the file indices, else if files deletion fails in between, - // it can lead to unsequential files as the map is not sorted. - chkFileIndices := make([]int, 0, len(cdm.mmappedChunkFiles)) - for seq := range cdm.mmappedChunkFiles { - chkFileIndices = append(chkFileIndices, seq) - } - sort.Ints(chkFileIndices) - - var removedFiles []int - for _, seq := range chkFileIndices { - if seq == cdm.curFileSequence || cdm.mmappedChunkFiles[seq].maxt >= mint { - break - } - if cdm.mmappedChunkFiles[seq].maxt < mint { - removedFiles = append(removedFiles, seq) - } - } - cdm.readPathMtx.RUnlock() - - errs := tsdb_errors.NewMulti() - // Cut a new file only if the current file has some chunks. - if cdm.curFileSize() > HeadChunkFileHeaderSize { - errs.Add(cdm.CutNewFile()) - } - errs.Add(cdm.deleteFiles(removedFiles)) - return errs.Err() -} - -func (cdm *OldChunkDiskMapper) deleteFiles(removedFiles []int) error { - cdm.readPathMtx.Lock() - for _, seq := range removedFiles { - if err := cdm.closers[seq].Close(); err != nil { - cdm.readPathMtx.Unlock() - return err - } - delete(cdm.mmappedChunkFiles, seq) - delete(cdm.closers, seq) - } - cdm.readPathMtx.Unlock() - - // We actually delete the files separately to not block the readPathMtx for long. - for _, seq := range removedFiles { - if err := os.Remove(segmentFile(cdm.dir.Name(), seq)); err != nil { - return err - } - } - - return nil -} - -// DeleteCorrupted deletes all the head chunk files after the one which had the corruption -// (including the corrupt file). -func (cdm *OldChunkDiskMapper) DeleteCorrupted(originalErr error) error { - err := errors.Cause(originalErr) // So that we can pick up errors even if wrapped. - cerr, ok := err.(*CorruptionErr) - if !ok { - return errors.Wrap(originalErr, "cannot handle error") - } - - // Delete all the head chunk files following the corrupt head chunk file. - segs := []int{} - cdm.readPathMtx.RLock() - for seg := range cdm.mmappedChunkFiles { - if seg >= cerr.FileIndex { - segs = append(segs, seg) - } - } - cdm.readPathMtx.RUnlock() - - return cdm.deleteFiles(segs) -} - -// Size returns the size of the chunk files. -func (cdm *OldChunkDiskMapper) Size() (int64, error) { - return fileutil.DirSize(cdm.dir.Name()) -} - -func (cdm *OldChunkDiskMapper) curFileSize() int64 { - return cdm.curFileNumBytes.Load() -} - -// Close closes all the open files in ChunkDiskMapper. -// It is not longer safe to access chunks from this struct after calling Close. -func (cdm *OldChunkDiskMapper) Close() error { - // 'WriteChunk' locks writePathMtx first and then readPathMtx for cutting head chunk file. - // The lock order should not be reversed here else it can cause deadlocks. - cdm.writePathMtx.Lock() - defer cdm.writePathMtx.Unlock() - cdm.readPathMtx.Lock() - defer cdm.readPathMtx.Unlock() - - if cdm.closed { - return nil - } - cdm.closed = true - - errs := tsdb_errors.NewMulti( - closeAllFromMap(cdm.closers), - cdm.finalizeCurFile(), - cdm.dir.Close(), - ) - cdm.mmappedChunkFiles = map[int]*mmappedChunkFile{} - cdm.closers = map[int]io.Closer{} - - return errs.Err() -} diff --git a/vendor/github.com/prometheus/prometheus/tsdb/head.go b/vendor/github.com/prometheus/prometheus/tsdb/head.go index 104b02e9425..dcd732a2e03 100644 --- a/vendor/github.com/prometheus/prometheus/tsdb/head.go +++ b/vendor/github.com/prometheus/prometheus/tsdb/head.go @@ -57,19 +57,6 @@ var ( defaultIsolationDisabled = false ) -// chunkDiskMapper is a temporary interface while we transition from -// 0 size queue to queue based chunk disk mapper. -type chunkDiskMapper interface { - CutNewFile() (returnErr error) - IterateAllChunks(f func(seriesRef chunks.HeadSeriesRef, chunkRef chunks.ChunkDiskMapperRef, mint, maxt int64, numSamples uint16) error) (err error) - Truncate(mint int64) error - DeleteCorrupted(originalErr error) error - Size() (int64, error) - Close() error - Chunk(ref chunks.ChunkDiskMapperRef) (chunkenc.Chunk, error) - WriteChunk(seriesRef chunks.HeadSeriesRef, mint, maxt int64, chk chunkenc.Chunk, callback func(err error)) (chkRef chunks.ChunkDiskMapperRef) -} - // Head handles reads and writes of time series data within a time window. type Head struct { chunkRange atomic.Int64 @@ -110,7 +97,7 @@ type Head struct { lastPostingsStatsCall time.Duration // Last posting stats call (PostingsCardinalityStats()) time for caching. // chunkDiskMapper is used to write and read Head chunks to/from disk. - chunkDiskMapper chunkDiskMapper + chunkDiskMapper *chunks.ChunkDiskMapper chunkSnapshotMtx sync.Mutex @@ -228,21 +215,13 @@ func NewHead(r prometheus.Registerer, l log.Logger, wal *wal.WAL, opts *HeadOpti opts.ChunkPool = chunkenc.NewPool() } - if opts.ChunkWriteQueueSize > 0 { - h.chunkDiskMapper, err = chunks.NewChunkDiskMapper( - r, - mmappedChunksDir(opts.ChunkDirRoot), - opts.ChunkPool, - opts.ChunkWriteBufferSize, - opts.ChunkWriteQueueSize, - ) - } else { - h.chunkDiskMapper, err = chunks.NewOldChunkDiskMapper( - mmappedChunksDir(opts.ChunkDirRoot), - opts.ChunkPool, - opts.ChunkWriteBufferSize, - ) - } + h.chunkDiskMapper, err = chunks.NewChunkDiskMapper( + r, + mmappedChunksDir(opts.ChunkDirRoot), + opts.ChunkPool, + opts.ChunkWriteBufferSize, + opts.ChunkWriteQueueSize, + ) if err != nil { return nil, err } diff --git a/vendor/github.com/prometheus/prometheus/tsdb/head_append.go b/vendor/github.com/prometheus/prometheus/tsdb/head_append.go index 7247afa3f52..011904c4ca8 100644 --- a/vendor/github.com/prometheus/prometheus/tsdb/head_append.go +++ b/vendor/github.com/prometheus/prometheus/tsdb/head_append.go @@ -481,7 +481,7 @@ func (a *headAppender) Commit() (err error) { // the appendID for isolation. (The appendID can be zero, which results in no // isolation for this append.) // It is unsafe to call this concurrently with s.iterator(...) without holding the series lock. -func (s *memSeries) append(t int64, v float64, appendID uint64, chunkDiskMapper chunkDiskMapper) (delta int64, sampleInOrder, chunkCreated bool) { +func (s *memSeries) append(t int64, v float64, appendID uint64, chunkDiskMapper *chunks.ChunkDiskMapper) (delta int64, sampleInOrder, chunkCreated bool) { // Based on Gorilla white papers this offers near-optimal compression ratio // so anything bigger that this has diminishing returns and increases // the time range within which we have to decompress all samples. @@ -579,7 +579,7 @@ func addJitterToChunkEndTime(seriesHash uint64, chunkMinTime, nextAt, maxNextAt return min(maxNextAt, nextAt+chunkDurationVariance-(chunkDurationMaxVariance/2)) } -func (s *memSeries) cutNewHeadChunk(mint int64, chunkDiskMapper chunkDiskMapper) *memChunk { +func (s *memSeries) cutNewHeadChunk(mint int64, chunkDiskMapper *chunks.ChunkDiskMapper) *memChunk { s.mmapCurrentHeadChunk(chunkDiskMapper) s.headChunk = &memChunk{ @@ -600,11 +600,12 @@ func (s *memSeries) cutNewHeadChunk(mint int64, chunkDiskMapper chunkDiskMapper) return s.headChunk } -func (s *memSeries) mmapCurrentHeadChunk(chunkDiskMapper chunkDiskMapper) { +func (s *memSeries) mmapCurrentHeadChunk(chunkDiskMapper *chunks.ChunkDiskMapper) { if s.headChunk == nil { // There is no head chunk, so nothing to m-map here. return } + chunkRef := chunkDiskMapper.WriteChunk(s.ref, s.headChunk.minTime, s.headChunk.maxTime, s.headChunk.chunk, handleChunkWriteError) s.mmappedChunks = append(s.mmappedChunks, &mmappedChunk{ ref: chunkRef, diff --git a/vendor/github.com/prometheus/prometheus/tsdb/head_read.go b/vendor/github.com/prometheus/prometheus/tsdb/head_read.go index 0209a6a15c8..fcbd08ca1ee 100644 --- a/vendor/github.com/prometheus/prometheus/tsdb/head_read.go +++ b/vendor/github.com/prometheus/prometheus/tsdb/head_read.go @@ -329,7 +329,7 @@ func (h *headChunkReader) Chunk(ref chunks.ChunkRef) (chunkenc.Chunk, error) { // chunk returns the chunk for the HeadChunkID from memory or by m-mapping it from the disk. // If garbageCollect is true, it means that the returned *memChunk // (and not the chunkenc.Chunk inside it) can be garbage collected after its usage. -func (s *memSeries) chunk(id chunks.HeadChunkID, cdm chunkDiskMapper) (chunk *memChunk, garbageCollect bool, err error) { +func (s *memSeries) chunk(id chunks.HeadChunkID, cdm *chunks.ChunkDiskMapper) (chunk *memChunk, garbageCollect bool, err error) { // ix represents the index of chunk in the s.mmappedChunks slice. The chunk id's are // incremented by 1 when new chunk is created, hence (id - firstChunkID) gives the slice index. // The max index for the s.mmappedChunks slice can be len(s.mmappedChunks)-1, hence if the ix @@ -363,7 +363,7 @@ type safeChunk struct { s *memSeries cid chunks.HeadChunkID isoState *isolationState - chunkDiskMapper chunkDiskMapper + chunkDiskMapper *chunks.ChunkDiskMapper } func (c *safeChunk) Iterator(reuseIter chunkenc.Iterator) chunkenc.Iterator { @@ -375,7 +375,7 @@ func (c *safeChunk) Iterator(reuseIter chunkenc.Iterator) chunkenc.Iterator { // iterator returns a chunk iterator for the requested chunkID, or a NopIterator if the requested ID is out of range. // It is unsafe to call this concurrently with s.append(...) without holding the series lock. -func (s *memSeries) iterator(id chunks.HeadChunkID, isoState *isolationState, cdm chunkDiskMapper, it chunkenc.Iterator) chunkenc.Iterator { +func (s *memSeries) iterator(id chunks.HeadChunkID, isoState *isolationState, cdm *chunks.ChunkDiskMapper, it chunkenc.Iterator) chunkenc.Iterator { c, garbageCollect, err := s.chunk(id, cdm) // TODO(fabxc): Work around! An error will be returns when a querier have retrieved a pointer to a // series's chunk, which got then garbage collected before it got diff --git a/vendor/modules.txt b/vendor/modules.txt index 78d084aa364..c08729cb424 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -614,7 +614,7 @@ github.com/prometheus/node_exporter/https github.com/prometheus/procfs github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/util -# github.com/prometheus/prometheus v1.8.2-0.20211217191541-41f1a8125e66 => github.com/grafana/mimir-prometheus v0.0.0-20220107153801-049c5e44352c +# github.com/prometheus/prometheus v1.8.2-0.20211217191541-41f1a8125e66 => github.com/grafana/mimir-prometheus v0.0.0-20220124124958-644605deb599 ## explicit; go 1.16 github.com/prometheus/prometheus/config github.com/prometheus/prometheus/discovery @@ -1072,7 +1072,7 @@ gopkg.in/yaml.v3 sigs.k8s.io/yaml # git.apache.org/thrift.git => github.com/apache/thrift v0.0.0-20180902110319-2566ecd5d999 # github.com/bradfitz/gomemcache => github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab -# github.com/prometheus/prometheus => github.com/grafana/mimir-prometheus v0.0.0-20220107153801-049c5e44352c +# github.com/prometheus/prometheus => github.com/grafana/mimir-prometheus v0.0.0-20220124124958-644605deb599 # github.com/hashicorp/go-immutable-radix => github.com/hashicorp/go-immutable-radix v1.2.0 # github.com/hashicorp/go-hclog => github.com/hashicorp/go-hclog v0.12.2 # github.com/hashicorp/memberlist v0.2.4 => github.com/grafana/memberlist v0.2.5-0.20211201083710-c7bc8e9df94b From 25ad3d0b5d7ac162efa9e57a6646326e6f3ac023 Mon Sep 17 00:00:00 2001 From: Christian Simon Date: Fri, 28 Jan 2022 14:12:06 +0000 Subject: [PATCH 037/168] Push images to docker hub (#946) --- .github/workflows/test-build-deploy.yml | 5 +++++ push-images | 25 +++++++++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test-build-deploy.yml b/.github/workflows/test-build-deploy.yml index 477376458a6..d73c62708c5 100644 --- a/.github/workflows/test-build-deploy.yml +++ b/.github/workflows/test-build-deploy.yml @@ -261,8 +261,13 @@ jobs: if [ -n "$GCR_REGISTRY_PASSWORD" ]; then printenv GCR_REGISTRY_PASSWORD | docker login -u "$GCR_REGISTRY_USER" --password-stdin us.gcr.io fi + if [ -n "$DOCKER_PASSWORD" ]; then + printenv DOCKER_PASSWORD | docker login -u "$DOCKER_USERNAME" --password-stdin + fi export IMAGE_TAG=$(make image-tag) ./push-images env: GCR_REGISTRY_USER: _json_key GCR_REGISTRY_PASSWORD: ${{ secrets.gcr_json_key }} + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} diff --git a/push-images b/push-images index 5334ce9ef17..52281128887 100755 --- a/push-images +++ b/push-images @@ -4,9 +4,6 @@ set -o errexit set -o nounset set -o pipefail -# Filter images to only push query-tee for now -# TODO: Remove once mimir is becoming a public project -IMAGES=$(make DOCKER_IMAGE_DIRS=./cmd/query-tee images) IMAGE_TAG=${IMAGE_TAG:-$(./tools/image-tag)} usage() { @@ -26,12 +23,24 @@ done push_image() { local image="$1" echo "Pushing ${image}:${IMAGE_TAG}" - docker push ${image}:${IMAGE_TAG} + docker push "${image}:${IMAGE_TAG}" + + # TODO: Check if it is a tag `v[0-9].[0-9].[0-9]` and if it is the latest release push a latest tag } -for image in ${IMAGES}; do - if [[ "$image" == *"build"* ]]; then - continue - fi +# Push images +for image in $(make images ); do + image_name=$(basename "$image") + case "$image_name" in + mimir-build-image) + # skip mimir-build-image + continue + ;; + mimir|mimirtool) + old_image="$image" + image="docker.io/grafana/${image_name}" + docker tag "${old_image}:${IMAGE_TAG}" "${image}:${IMAGE_TAG}" + ;; + esac push_image "${image}" done From 76da7c643acc3b012d9fba747fea52286aaac094 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Fri, 28 Jan 2022 15:21:37 +0100 Subject: [PATCH 038/168] distributor: Tag advanced config parameters (#948) Signed-off-by: Arve Knudsen --- cmd/mimir/help.txt.tmpl | 22 ---------------------- pkg/distributor/distributor.go | 12 ++++++------ pkg/distributor/ha_tracker.go | 6 +++--- pkg/distributor/ingester_client_pool.go | 4 ++-- 4 files changed, 11 insertions(+), 33 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index d8588e4a224..b71079f649c 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -627,16 +627,10 @@ Usage of ./cmd/mimir/mimir: Fraction of goroutine blocking events that are reported in the blocking profile. 1 to include every blocking event in the profile, 0 to disable. -debug.mutex-profile-fraction int Fraction of mutex contention events that are reported in the mutex profile. On average 1/rate events are reported. 0 to disable. - -distributor.client-cleanup-period duration - How frequently to clean up clients for ingesters that have gone away. (default 15s) -distributor.drop-label value This flag can be used to specify label names that to drop during sample ingestion within the distributor and can be repeated in order to drop multiple labels. -distributor.excluded-zones value Comma-separated list of zones to exclude from the ring. Instances in excluded zones will be filtered out from the ring. - -distributor.extend-writes - Try writing to an additional ingester in the presence of an ingester not in the ACTIVE state. It is useful to disable this along with -ingester.unregister-on-shutdown=false in order to not spread samples to extra ingesters during rolling restarts with consistent naming. (default true) - -distributor.extra-query-delay duration - Time to wait before sending more than the minimum successful query requests. -distributor.ha-tracker.cluster string Prometheus label to look for in samples to identify a Prometheus HA cluster. (default "cluster") -distributor.ha-tracker.consul.acl-token string @@ -677,8 +671,6 @@ Usage of ./cmd/mimir/mimir: Override the expected name on the server certificate. -distributor.ha-tracker.etcd.username string Etcd username. - -distributor.ha-tracker.failover-timeout duration - If we don't receive any samples from the accepted replica for a cluster in this amount of time we will failover to the next replica we receive a sample from. This value must be greater than the update timeout (default 30s) -distributor.ha-tracker.max-clusters int Maximum number of clusters that HA tracker will keep track of for single user. 0 to disable the limit. -distributor.ha-tracker.multi.mirror-enabled @@ -695,26 +687,12 @@ Usage of ./cmd/mimir/mimir: Prometheus label to look for in samples to identify a Prometheus HA replica. (default "__replica__") -distributor.ha-tracker.store string Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") - -distributor.ha-tracker.update-timeout duration - Update the timestamp in the KV store for a given cluster/replica only after this amount of time has passed since the current stored timestamp. (default 15s) - -distributor.ha-tracker.update-timeout-jitter-max duration - Maximum jitter applied to the update timeout, in order to spread the HA heartbeats over time. (default 5s) - -distributor.health-check-ingesters - Run a health check on each ingester client during periodic cleanup. (default true) -distributor.ingestion-burst-size int Per-user allowed ingestion burst size (in number of samples). (default 200000) -distributor.ingestion-rate-limit float Per-user ingestion rate limit in samples per second. (default 10000) -distributor.ingestion-tenant-shard-size int The tenant's shard size used by shuffle-sharding. Must be set both on ingesters and distributors. 0 disables shuffle sharding. - -distributor.instance-limits.max-inflight-push-requests int - Max inflight push requests that this distributor can handle. This limit is per-distributor, not per-tenant. Additional requests will be rejected. 0 = unlimited. - -distributor.instance-limits.max-ingestion-rate float - Max ingestion rate (samples/sec) that this distributor will accept. This limit is per-distributor, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited. - -distributor.max-recv-msg-size int - remote_write API max receive message size (bytes). (default 104857600) - -distributor.remote-timeout duration - Timeout for downstream ingesters. (default 2s) -distributor.replication-factor int The number of ingesters to write to and read from. (default 3) -distributor.ring.consul.acl-token string diff --git a/pkg/distributor/distributor.go b/pkg/distributor/distributor.go index 4b4d664461f..49ab955dca3 100644 --- a/pkg/distributor/distributor.go +++ b/pkg/distributor/distributor.go @@ -125,11 +125,11 @@ type Config struct { HATrackerConfig HATrackerConfig `yaml:"ha_tracker"` - MaxRecvMsgSize int `yaml:"max_recv_msg_size"` - RemoteTimeout time.Duration `yaml:"remote_timeout"` - ExtraQueryDelay time.Duration `yaml:"extra_queue_delay"` + MaxRecvMsgSize int `yaml:"max_recv_msg_size" category:"advanced"` + RemoteTimeout time.Duration `yaml:"remote_timeout" category:"advanced"` + ExtraQueryDelay time.Duration `yaml:"extra_queue_delay" category:"advanced"` - ExtendWrites bool `yaml:"extend_writes"` + ExtendWrites bool `yaml:"extend_writes" category:"advanced"` // Distributors ring DistributorRing RingConfig `yaml:"ring"` @@ -149,8 +149,8 @@ type Config struct { } type InstanceLimits struct { - MaxIngestionRate float64 `yaml:"max_ingestion_rate"` - MaxInflightPushRequests int `yaml:"max_inflight_push_requests"` + MaxIngestionRate float64 `yaml:"max_ingestion_rate" category:"advanced"` + MaxInflightPushRequests int `yaml:"max_inflight_push_requests" category:"advanced"` } // RegisterFlags adds the flags required to config this to the given FlagSet diff --git a/pkg/distributor/ha_tracker.go b/pkg/distributor/ha_tracker.go index db5443df529..54d8cc83767 100644 --- a/pkg/distributor/ha_tracker.go +++ b/pkg/distributor/ha_tracker.go @@ -57,13 +57,13 @@ type HATrackerConfig struct { // We should only update the timestamp if the difference // between the stored timestamp and the time we received a sample at // is more than this duration. - UpdateTimeout time.Duration `yaml:"ha_tracker_update_timeout"` - UpdateTimeoutJitterMax time.Duration `yaml:"ha_tracker_update_timeout_jitter_max"` + UpdateTimeout time.Duration `yaml:"ha_tracker_update_timeout" category:"advanced"` + UpdateTimeoutJitterMax time.Duration `yaml:"ha_tracker_update_timeout_jitter_max" category:"advanced"` // We should only failover to accepting samples from a replica // other than the replica written in the KVStore if the difference // between the stored timestamp and the time we received a sample is // more than this duration - FailoverTimeout time.Duration `yaml:"ha_tracker_failover_timeout"` + FailoverTimeout time.Duration `yaml:"ha_tracker_failover_timeout" category:"advanced"` KVStore kv.Config `yaml:"kvstore" doc:"description=Backend storage to use for the ring. Please be aware that memberlist is not supported by the HA tracker since gossip propagation is too slow for HA purposes."` } diff --git a/pkg/distributor/ingester_client_pool.go b/pkg/distributor/ingester_client_pool.go index 588f2cdd2ee..88fa8980361 100644 --- a/pkg/distributor/ingester_client_pool.go +++ b/pkg/distributor/ingester_client_pool.go @@ -24,8 +24,8 @@ var clients = promauto.NewGauge(prometheus.GaugeOpts{ // PoolConfig is config for creating a Pool. type PoolConfig struct { - ClientCleanupPeriod time.Duration `yaml:"client_cleanup_period"` - HealthCheckIngesters bool `yaml:"health_check_ingesters"` + ClientCleanupPeriod time.Duration `yaml:"client_cleanup_period" category:"advanced"` + HealthCheckIngesters bool `yaml:"health_check_ingesters" category:"advanced"` RemoteTimeout time.Duration `yaml:"-"` } From e81c3391da93b400d61f8bf41974815198f8e1c0 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Fri, 28 Jan 2022 15:23:28 +0100 Subject: [PATCH 039/168] compactor: Tag advanced config parameters (#947) Signed-off-by: Arve Knudsen --- cmd/mimir/help.txt.tmpl | 34 ---------------------------------- pkg/compactor/compactor.go | 34 +++++++++++++++++----------------- 2 files changed, 17 insertions(+), 51 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index b71079f649c..b839274418c 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -497,42 +497,12 @@ Usage of ./cmd/mimir/mimir: True to enable TSDB WAL compression. -blocks-storage.tsdb.wal-segment-size-bytes int TSDB WAL segments files max size (bytes). (default 134217728) - -compactor.block-sync-concurrency int - Number of Go routines to use when downloading blocks for compaction and uploading resulting blocks. (default 8) -compactor.blocks-retention-period value Delete blocks containing samples older than the specified retention period. 0 to disable. - -compactor.cleanup-concurrency int - Max number of tenants for which blocks cleanup and maintenance should run concurrently. (default 20) - -compactor.cleanup-interval duration - How frequently compactor should run blocks cleanup and maintenance, as well as update the bucket index. (default 15m0s) - -compactor.compaction-concurrency int - Max number of concurrent compactions running. (default 1) - -compactor.compaction-interval duration - The frequency at which the compaction runs (default 1h0m0s) - -compactor.compaction-jobs-order string - The sorting to use when deciding which compaction jobs should run first for a given tenant. Supported values are: smallest-range-oldest-blocks-first, newest-blocks-first. (default "smallest-range-oldest-blocks-first") - -compactor.compaction-retries int - How many times to retry a failed compaction within a single compaction run. (default 3) -compactor.compactor-tenant-shard-size int Max number of compactors that can compact blocks for single tenant. 0 to disable the limit and use all compactors. - -compactor.consistency-delay duration - Minimum age of fresh (non-compacted) blocks before they are being processed. Malformed blocks older than the maximum of consistency-delay and 48h0m0s will be removed. -compactor.data-dir string Data directory in which to cache blocks and process compactions (default "./data") - -compactor.deletion-delay duration - Time before a block marked for deletion is deleted from bucket. If not 0, blocks will be marked for deletion and compactor component will permanently delete blocks marked for deletion from the bucket. If 0, blocks will be deleted straight away. Note that deleting blocks immediately can cause query failures. (default 12h0m0s) - -compactor.disabled-tenants value - Comma separated list of tenants that cannot be compacted by this compactor. If specified, and compactor would normally pick given tenant for compaction (via -compactor.enabled-tenants or sharding), it will be ignored instead. - -compactor.enabled-tenants value - Comma separated list of tenants that can be compacted. If specified, only these tenants will be compacted by compactor, otherwise all tenants can be compacted. Subject to sharding. - -compactor.max-closing-blocks-concurrency int - Max number of blocks that can be closed concurrently during split compaction. Note that closing of newly compacted block uses a lot of memory for writing index. (default 1) - -compactor.max-compaction-time duration - Max time for starting compactions for a single tenant. After this time no new compactions for the tenant are started before next compaction cycle. This can help in multi-tenant environments to avoid single tenant using all compaction time, but also in single-tenant environments to force new discovery of blocks more often. 0 = disabled. - -compactor.max-opening-blocks-concurrency int - Number of goroutines opening blocks before compaction. (default 1) - -compactor.meta-sync-concurrency int - Number of Go routines to use when syncing block meta files from the long term storage. (default 20) -compactor.ring.consul.acl-token string ACL Token used to interact with Consul. -compactor.ring.consul.client-timeout duration @@ -603,10 +573,6 @@ Usage of ./cmd/mimir/mimir: The number of shards to use when splitting blocks. 0 to disable splitting. -compactor.split-groups int Number of groups that blocks for splitting should be grouped into. Each group of blocks is then split separately. Number of output split shards is controlled by -compactor.split-and-merge-shards. (default 1) - -compactor.symbols-flushers-concurrency int - Number of symbols flushers used when doing split compaction. (default 1) - -compactor.tenant-cleanup-delay duration - For tenants marked for deletion, this is time between deleting of last block, and doing final cleanup (marker files, debug files) of the tenant. (default 6h0m0s) -config.expand-env Expands ${var} or $var in config according to the values of the environment variables. -config.file value diff --git a/pkg/compactor/compactor.go b/pkg/compactor/compactor.go index 77cd8e19970..c8c9cf3e8df 100644 --- a/pkg/compactor/compactor.go +++ b/pkg/compactor/compactor.go @@ -81,32 +81,32 @@ type BlocksCompactorFactory func( // Config holds the MultitenantCompactor config. type Config struct { BlockRanges mimir_tsdb.DurationList `yaml:"block_ranges" category:"advanced"` - BlockSyncConcurrency int `yaml:"block_sync_concurrency"` - MetaSyncConcurrency int `yaml:"meta_sync_concurrency"` - ConsistencyDelay time.Duration `yaml:"consistency_delay"` + BlockSyncConcurrency int `yaml:"block_sync_concurrency" category:"advanced"` + MetaSyncConcurrency int `yaml:"meta_sync_concurrency" category:"advanced"` + ConsistencyDelay time.Duration `yaml:"consistency_delay" category:"advanced"` DataDir string `yaml:"data_dir"` - CompactionInterval time.Duration `yaml:"compaction_interval"` - CompactionRetries int `yaml:"compaction_retries"` - CompactionConcurrency int `yaml:"compaction_concurrency"` - CleanupInterval time.Duration `yaml:"cleanup_interval"` - CleanupConcurrency int `yaml:"cleanup_concurrency"` - DeletionDelay time.Duration `yaml:"deletion_delay"` - TenantCleanupDelay time.Duration `yaml:"tenant_cleanup_delay"` - MaxCompactionTime time.Duration `yaml:"max_compaction_time"` + CompactionInterval time.Duration `yaml:"compaction_interval" category:"advanced"` + CompactionRetries int `yaml:"compaction_retries" category:"advanced"` + CompactionConcurrency int `yaml:"compaction_concurrency" category:"advanced"` + CleanupInterval time.Duration `yaml:"cleanup_interval" category:"advanced"` + CleanupConcurrency int `yaml:"cleanup_concurrency" category:"advanced"` + DeletionDelay time.Duration `yaml:"deletion_delay" category:"advanced"` + TenantCleanupDelay time.Duration `yaml:"tenant_cleanup_delay" category:"advanced"` + MaxCompactionTime time.Duration `yaml:"max_compaction_time" category:"advanced"` // Compactor concurrency options - MaxOpeningBlocksConcurrency int `yaml:"max_opening_blocks_concurrency"` // Number of goroutines opening blocks before compaction. - MaxClosingBlocksConcurrency int `yaml:"max_closing_blocks_concurrency"` // Max number of blocks that can be closed concurrently during split compaction. Note that closing of newly compacted block uses a lot of memory for writing index. - SymbolsFlushersConcurrency int `yaml:"symbols_flushers_concurrency"` // Number of symbols flushers used when doing split compaction. + MaxOpeningBlocksConcurrency int `yaml:"max_opening_blocks_concurrency" category:"advanced"` // Number of goroutines opening blocks before compaction. + MaxClosingBlocksConcurrency int `yaml:"max_closing_blocks_concurrency" category:"advanced"` // Max number of blocks that can be closed concurrently during split compaction. Note that closing of newly compacted block uses a lot of memory for writing index. + SymbolsFlushersConcurrency int `yaml:"symbols_flushers_concurrency" category:"advanced"` // Number of symbols flushers used when doing split compaction. - EnabledTenants flagext.StringSliceCSV `yaml:"enabled_tenants"` - DisabledTenants flagext.StringSliceCSV `yaml:"disabled_tenants"` + EnabledTenants flagext.StringSliceCSV `yaml:"enabled_tenants" category:"advanced"` + DisabledTenants flagext.StringSliceCSV `yaml:"disabled_tenants" category:"advanced"` // Compactors sharding. ShardingEnabled bool `yaml:"sharding_enabled"` ShardingRing RingConfig `yaml:"sharding_ring"` - CompactionJobsOrder string `yaml:"compaction_jobs_order"` + CompactionJobsOrder string `yaml:"compaction_jobs_order" category:"advanced"` // No need to add options to customize the retry backoff, // given the defaults should be fine, but allow to override From 64713e08122afc91e471550647dd272652807421 Mon Sep 17 00:00:00 2001 From: Christian Simon Date: Fri, 28 Jan 2022 14:28:24 +0000 Subject: [PATCH 040/168] Build mimirtool binaries for different architectures (#884) * Build mimirtool binaries for different architectures * Ensure we use POSIX compatible comparisons * Missed a comparison --- Makefile | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 5abb9388144..e1400314bdd 100644 --- a/Makefile +++ b/Makefile @@ -477,14 +477,30 @@ dist: dist/$(UPTODATE) dist/$(UPTODATE): rm -fr ./dist mkdir -p ./dist - for os in linux darwin; do \ - for arch in amd64 arm64; do \ + # Build binaries for various architectures and operating systems. Only + # mimirtool supports Windows for now. Also darwin/386 is not a valid + # architecture. + for os in linux darwin windows; do \ + for arch in 386 amd64 arm64; do \ + suffix="" ; \ + if [ "$$os" = "windows" ]; then \ + suffix=".exe" ; \ + fi; \ + if [ "$$os" = "darwin" ] && [ "$$arch" = "386" ]; then \ + continue; \ + fi; \ + echo "Building mimirtool for $$os/$$arch"; \ + GOOS=$$os GOARCH=$$arch CGO_ENABLED=0 go build $(GO_FLAGS) -o ./dist/mimirtool-$$os-$$arch$$suffix ./cmd/mimirtool; \ + sha256sum ./dist/mimirtool-$$os-$$arch$$suffix | cut -d ' ' -f 1 > ./dist/mimirtool-$$os-$$arch$$suffix-sha-256; \ + if [ "$$os" = "windows" ]; then \ + continue; \ + fi; \ echo "Building Mimir for $$os/$$arch"; \ - GOOS=$$os GOARCH=$$arch CGO_ENABLED=0 go build $(GO_FLAGS) -o ./dist/mimir-$$os-$$arch ./cmd/mimir; \ - sha256sum ./dist/mimir-$$os-$$arch | cut -d ' ' -f 1 > ./dist/mimir-$$os-$$arch-sha-256; \ + GOOS=$$os GOARCH=$$arch CGO_ENABLED=0 go build $(GO_FLAGS) -o ./dist/mimir-$$os-$$arch$$suffix ./cmd/mimir; \ + sha256sum ./dist/mimir-$$os-$$arch$$suffix | cut -d ' ' -f 1 > ./dist/mimir-$$os-$$arch$$suffix-sha-256; \ echo "Building query-tee for $$os/$$arch"; \ - GOOS=$$os GOARCH=$$arch CGO_ENABLED=0 go build $(GO_FLAGS) -o ./dist/query-tee-$$os-$$arch ./cmd/query-tee; \ - sha256sum ./dist/query-tee-$$os-$$arch | cut -d ' ' -f 1 > ./dist/query-tee-$$os-$$arch-sha-256; \ + GOOS=$$os GOARCH=$$arch CGO_ENABLED=0 go build $(GO_FLAGS) -o ./dist/query-tee-$$os-$$arch$$suffix ./cmd/query-tee; \ + sha256sum ./dist/query-tee-$$os-$$arch$$suffix | cut -d ' ' -f 1 > ./dist/query-tee-$$os-$$arch$$suffix-sha-256; \ done; \ done; \ touch $@ From 3142120b5ea55415c4604b9ab1792b0a5006a526 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Fri, 28 Jan 2022 15:43:35 +0100 Subject: [PATCH 041/168] frontend: Tag advanced config parameters (#949) Signed-off-by: Arve Knudsen --- cmd/mimir/help.txt.tmpl | 26 ------------------- .../configuration/config-file-reference.md | 10 +++++++ pkg/frontend/config.go | 2 +- pkg/frontend/transport/handler.go | 4 +-- pkg/frontend/v1/frontend.go | 4 +-- pkg/frontend/v2/frontend.go | 10 +++---- pkg/querier/worker/worker.go | 6 ++--- 7 files changed, 23 insertions(+), 39 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index b839274418c..018cae582e5 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -753,8 +753,6 @@ Usage of ./cmd/mimir/mimir: Cache query results. -frontend.cache-unaligned-requests Cache requests that are not step-aligned. - -frontend.downstream-url string - URL of downstream Prometheus. -frontend.grpc-client-config.backoff-max-period duration Maximum delay when backing off. (default 10s) -frontend.grpc-client-config.backoff-min-period duration @@ -785,16 +783,8 @@ Usage of ./cmd/mimir/mimir: Path to the key file for the client certificate. Also requires the client certificate to be configured. -frontend.grpc-client-config.tls-server-name string Override the expected name on the server certificate. - -frontend.instance-addr string - IP address to advertise to querier (via scheduler) (resolved via interfaces by default). - -frontend.instance-interface-names value - Name of network interface to read address from. This address is sent to query-scheduler and querier, which uses it to send the query response back to query-frontend. (default [eth0 en0]) - -frontend.instance-port int - Port to advertise to querier (via scheduler) (defaults to server.grpc-listen-port). -frontend.log-queries-longer-than duration Log queries that are slower than the specified duration. Set to 0 to disable. Set to < 0 to enable on all queries. - -frontend.max-body-size int - Max body size for downstream prometheus. (default 10485760) -frontend.max-cache-freshness value Most recent allowed cacheable result per-tenant, to prevent caching very recent results that might still be in flux. (default 1m) -frontend.max-queriers-per-tenant int @@ -807,8 +797,6 @@ Usage of ./cmd/mimir/mimir: The max number of sharded queries that can be run for a given received query. 0 to disable limit. (default 128) -frontend.query-sharding-total-shards int The amount of shards to use when doing parallelisation via query sharding by tenant. 0 to disable query sharding for tenant. Query sharding implementation will adjust the number of query shards based on compactor shards. This allows querier to not search the blocks which cannot possibly have the series for given query shard. (default 16) - -frontend.query-stats-enabled - False to disable query statistics tracking. When enabled, a message with some statistics is logged for every query. (default true) -frontend.results-cache.backend string Backend for query-frontend results cache, if not empty. Supported values: [memcached]. -frontend.results-cache.compression string @@ -831,10 +819,6 @@ Usage of ./cmd/mimir/mimir: The socket read/write timeout. (default 100ms) -frontend.scheduler-address string DNS hostname used for finding query-schedulers. - -frontend.scheduler-dns-lookup-period duration - How often to resolve the scheduler-address, in order to look for new query-scheduler instances. (default 10s) - -frontend.scheduler-worker-concurrency int - Number of concurrent workers forwarding queries to single query-scheduler. (default 5) -frontend.split-queries-by-interval duration Split queries by an interval and execute in parallel, 0 disables it. You should use an a multiple of 24 hours (same as the storage bucketing scheme), to avoid queriers downloading and processing the same chunks. This also determines how cache keys are chosen when result caching is enabled. -h @@ -1019,8 +1003,6 @@ Usage of ./cmd/mimir/mimir: Enables endpoints used for cardinality analysis. -querier.default-evaluation-interval duration The default evaluation interval or step size for subqueries. This config option should be set on query-frontend too when query sharding is enabled. (default 1m0s) - -querier.dns-lookup-period duration - How often to query DNS for query-frontend or query-scheduler address. (default 10s) -querier.frontend-address string Address of query frontend service, in host:port format. If -querier.scheduler-address is set as well, querier will use scheduler instead. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint. -querier.frontend-client.backoff-max-period duration @@ -1053,8 +1035,6 @@ Usage of ./cmd/mimir/mimir: Path to the key file for the client certificate. Also requires the client certificate to be configured. -querier.frontend-client.tls-server-name string Override the expected name on the server certificate. - -querier.id string - Querier ID, sent to frontend service to identify requests from the same querier. Defaults to hostname. -querier.iterators Use iterators to execute query, as opposed to fully materialising the series in memory. -querier.label-names-and-values-results-max-size-bytes int @@ -1071,8 +1051,6 @@ Usage of ./cmd/mimir/mimir: Maximum number of chunks that can be fetched in a single query from ingesters and long-term storage. This limit is enforced in the querier, ruler and store-gateway. 0 to disable. (default 2000000) -querier.max-fetched-series-per-query int The maximum number of unique series for which a query can fetch samples from each ingesters and storage. This limit is enforced in the querier and ruler. 0 to disable - -querier.max-outstanding-requests-per-tenant int - Maximum number of outstanding requests per tenant per frontend; requests beyond this error with HTTP 429. (default 100) -querier.max-query-into-future duration Maximum duration into the future you can query. 0 to disable. (default 10m0s) -querier.max-query-lookback value @@ -1111,10 +1089,6 @@ Usage of ./cmd/mimir/mimir: The timeout for a query. This config option should be set on query-frontend too when query sharding is enabled. (default 2m0s) -querier.worker-match-max-concurrent Force worker concurrency to match the -querier.max-concurrent option. Overrides querier.worker-parallelism. - -querier.worker-parallelism int - Number of simultaneous queries to process per query-frontend or query-scheduler. (default 10) - -query-frontend.querier-forget-delay duration - If a querier disconnects without sending notification about graceful shutdown, the query-frontend will keep the querier in the tenant's shard until the forget delay has passed. This feature is useful to reduce the blast radius when shuffle-sharding is enabled. -query-scheduler.grpc-client-config.backoff-max-period duration Maximum delay when backing off. (default 10s) -query-scheduler.grpc-client-config.backoff-min-period duration diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 612b209cf26..489f6cc9c80 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -1000,6 +1000,16 @@ grpc_client_config: # CLI flag: -frontend.instance-interface-names [instance_interface_names: | default = [eth0 en0]] +# IP address to advertise to querier (via scheduler) (resolved via interfaces by +# default). +# CLI flag: -frontend.instance-addr +[address: | default = ""] + +# Port to advertise to querier (via scheduler) (defaults to +# server.grpc-listen-port). +# CLI flag: -frontend.instance-port +[port: | default = 0] + # Split queries by an interval and execute in parallel, 0 disables it. You # should use an a multiple of 24 hours (same as the storage bucketing scheme), # to avoid queriers downloading and processing the same chunks. This also diff --git a/pkg/frontend/config.go b/pkg/frontend/config.go index b487084d703..3d021bf777b 100644 --- a/pkg/frontend/config.go +++ b/pkg/frontend/config.go @@ -28,7 +28,7 @@ type CombinedFrontendConfig struct { QueryMiddleware querymiddleware.Config `yaml:",inline"` - DownstreamURL string `yaml:"downstream_url"` + DownstreamURL string `yaml:"downstream_url" category:"advanced"` } func (cfg *CombinedFrontendConfig) RegisterFlags(f *flag.FlagSet) { diff --git a/pkg/frontend/transport/handler.go b/pkg/frontend/transport/handler.go index 7a029f0f72f..fda8a6726a2 100644 --- a/pkg/frontend/transport/handler.go +++ b/pkg/frontend/transport/handler.go @@ -47,8 +47,8 @@ var ( // Config for a Handler. type HandlerConfig struct { LogQueriesLongerThan time.Duration `yaml:"log_queries_longer_than"` - MaxBodySize int64 `yaml:"max_body_size"` - QueryStatsEnabled bool `yaml:"query_stats_enabled"` + MaxBodySize int64 `yaml:"max_body_size" category:"advanced"` + QueryStatsEnabled bool `yaml:"query_stats_enabled" category:"advanced"` } func (cfg *HandlerConfig) RegisterFlags(f *flag.FlagSet) { diff --git a/pkg/frontend/v1/frontend.go b/pkg/frontend/v1/frontend.go index 620b6126d32..0314f1d8b41 100644 --- a/pkg/frontend/v1/frontend.go +++ b/pkg/frontend/v1/frontend.go @@ -36,8 +36,8 @@ var ( // Config for a Frontend. type Config struct { - MaxOutstandingPerTenant int `yaml:"max_outstanding_per_tenant"` - QuerierForgetDelay time.Duration `yaml:"querier_forget_delay"` + MaxOutstandingPerTenant int `yaml:"max_outstanding_per_tenant" category:"advanced"` + QuerierForgetDelay time.Duration `yaml:"querier_forget_delay" category:"advanced"` } // RegisterFlags adds the flags required to config this to the given FlagSet. diff --git a/pkg/frontend/v2/frontend.go b/pkg/frontend/v2/frontend.go index 82e325939ae..449d5d5dcd2 100644 --- a/pkg/frontend/v2/frontend.go +++ b/pkg/frontend/v2/frontend.go @@ -35,16 +35,16 @@ import ( // Config for a Frontend. type Config struct { SchedulerAddress string `yaml:"scheduler_address"` - DNSLookupPeriod time.Duration `yaml:"scheduler_dns_lookup_period"` - WorkerConcurrency int `yaml:"scheduler_worker_concurrency"` + DNSLookupPeriod time.Duration `yaml:"scheduler_dns_lookup_period" category:"advanced"` + WorkerConcurrency int `yaml:"scheduler_worker_concurrency" category:"advanced"` GRPCClientConfig grpcclient.Config `yaml:"grpc_client_config"` // Used to find local IP address, that is sent to scheduler and querier-worker. - InfNames []string `yaml:"instance_interface_names"` + InfNames []string `yaml:"instance_interface_names" category:"advanced"` // If set, address is not computed from interfaces. - Addr string `yaml:"address" doc:"hidden"` - Port int `doc:"hidden"` + Addr string `yaml:"address" category:"advanced"` + Port int `category:"advanced"` } func (cfg *Config) RegisterFlags(f *flag.FlagSet) { diff --git a/pkg/querier/worker/worker.go b/pkg/querier/worker/worker.go index 116e0abbd88..33f226db31f 100644 --- a/pkg/querier/worker/worker.go +++ b/pkg/querier/worker/worker.go @@ -27,13 +27,13 @@ import ( type Config struct { FrontendAddress string `yaml:"frontend_address"` SchedulerAddress string `yaml:"scheduler_address"` - DNSLookupPeriod time.Duration `yaml:"dns_lookup_duration"` + DNSLookupPeriod time.Duration `yaml:"dns_lookup_duration" category:"advanced"` - Parallelism int `yaml:"parallelism"` + Parallelism int `yaml:"parallelism" category:"advanced"` MatchMaxConcurrency bool `yaml:"match_max_concurrent"` MaxConcurrentRequests int `yaml:"-"` // Must be same as passed to PromQL Engine. - QuerierID string `yaml:"id"` + QuerierID string `yaml:"id" category:"advanced"` GRPCClientConfig grpcclient.Config `yaml:"grpc_client_config"` } From a5c5158a94d6d411938fde01193a6384232ba3c7 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Fri, 28 Jan 2022 16:08:05 +0100 Subject: [PATCH 042/168] distributor: Make MaxIngestionRate and MaxInflightPushRequests basic (#955) Signed-off-by: Arve Knudsen --- cmd/mimir/help.txt.tmpl | 4 ++++ pkg/distributor/distributor.go | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 018cae582e5..7e5a59deb57 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -659,6 +659,10 @@ Usage of ./cmd/mimir/mimir: Per-user ingestion rate limit in samples per second. (default 10000) -distributor.ingestion-tenant-shard-size int The tenant's shard size used by shuffle-sharding. Must be set both on ingesters and distributors. 0 disables shuffle sharding. + -distributor.instance-limits.max-inflight-push-requests int + Max inflight push requests that this distributor can handle. This limit is per-distributor, not per-tenant. Additional requests will be rejected. 0 = unlimited. + -distributor.instance-limits.max-ingestion-rate float + Max ingestion rate (samples/sec) that this distributor will accept. This limit is per-distributor, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited. -distributor.replication-factor int The number of ingesters to write to and read from. (default 3) -distributor.ring.consul.acl-token string diff --git a/pkg/distributor/distributor.go b/pkg/distributor/distributor.go index 49ab955dca3..c1b1d73aa21 100644 --- a/pkg/distributor/distributor.go +++ b/pkg/distributor/distributor.go @@ -149,8 +149,8 @@ type Config struct { } type InstanceLimits struct { - MaxIngestionRate float64 `yaml:"max_ingestion_rate" category:"advanced"` - MaxInflightPushRequests int `yaml:"max_inflight_push_requests" category:"advanced"` + MaxIngestionRate float64 `yaml:"max_ingestion_rate"` + MaxInflightPushRequests int `yaml:"max_inflight_push_requests"` } // RegisterFlags adds the flags required to config this to the given FlagSet From 679e14ec4c31b047bdbdeed0392cf0ab98e5d339 Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Fri, 28 Jan 2022 15:16:11 +0000 Subject: [PATCH 043/168] Docs: Write Getting started with Mimir guide (#877) * Add dev.yaml configuration Minimal configuration required to run Mimir as part of a "Getting started" guide. Signed-off-by: Jack Baldry * Refactor "Getting started" guide to focus on minimal dev experience Similar to Hashicorp's getting started documentation, this guide focuses on instaling and running Mimir with minimal configuration and performing basic write and query operations on that running server. Signed-off-by: Jack Baldry * Remove unnecessary name from remote_write config for Prometheus Signed-off-by: Jack Baldry * Use table for data source configuration Signed-off-by: Jack Baldry * Note that Prometheus/Grafana Agent is a prerequisite for the guide Signed-off-by: Jack Baldry * Add missing space resulting from typo Signed-off-by: Jack Baldry * Replace console code blocks with bash code blocks Signed-off-by: Jack Baldry * Replace build from source with Docker run documentation Signed-off-by: Jack Baldry * Fix Prometheus data source query URL Signed-off-by: Jack Baldry * Fix remote-write URL Signed-off-by: Jack Baldry * Use long flags and host networking Host networking makes the same Grafana instructions work for both Docker and locally running Mimir. Long flags are more descriptive Signed-off-by: Jack Baldry * Linting Signed-off-by: Jack Baldry * Remove dev.yaml file Signed-off-by: Jack Baldry * Always refer to the project as Grafana Mimir Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio * Use complete sentences Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio * Clarify process for using Grafana to configure a data source Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio * Use "make it executable" which is more common than "mark as executable" Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio * Use colon to indicate that the following code block is a continuation of the sentence Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio * Fix tense Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio * Use plain language and explain path through configuration file in parentheses Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio * Use relref links Signed-off-by: Jack Baldry * Make URLs render as links Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio * Avoid complexity value judgement Signed-off-by: Jack Baldry Co-authored-by: Fiona Artiaga <89225282+GrafanaWriter@users.noreply.github.com> * Add prerequisites to a "Before you begin" section Signed-off-by: Jack Baldry Co-authored-by: Fiona Artiaga <89225282+GrafanaWriter@users.noreply.github.com> Co-authored-by: Ursula Kallio * Reword configuration file header Signed-off-by: Jack Baldry Co-authored-by: Fiona Artiaga <89225282+GrafanaWriter@users.noreply.github.com> Co-authored-by: Ursula Kallio * Reword the results of following the guide Signed-off-by: Jack Baldry Co-authored-by: Fiona Artiaga <89225282+GrafanaWriter@users.noreply.github.com> Co-authored-by: Ursula Kallio * Clarify options; rm bg jobs; use Docker latest. * Change * to - for the linter. * Fix push path Co-authored-by: Marco Pracucci * Clarify alternatives for getting Grafana Mimir Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio Co-authored-by: Fiona Artiaga <89225282+GrafanaWriter@users.noreply.github.com> Co-authored-by: Marco Pracucci --- docs/sources/getting-started/_index.md | 278 +++++++++++-------------- 1 file changed, 126 insertions(+), 152 deletions(-) diff --git a/docs/sources/getting-started/_index.md b/docs/sources/getting-started/_index.md index d75b1b358c0..fc164667cd2 100644 --- a/docs/sources/getting-started/_index.md +++ b/docs/sources/getting-started/_index.md @@ -1,211 +1,185 @@ --- -title: "Getting Started" -linkTitle: "Getting Started" +title: "Getting started with Grafana Mimir" +linkTitle: "Getting started with Grafana Mimir" weight: 1 no_section_index_title: true -slug: "getting-started" +slug: "getting-started-with-grafana-mimir" --- -Mimir can be run as a single binary or as multiple independent microservices. -The single-binary mode is easier to deploy and is aimed mainly at users wanting to try out Mimir or develop on it. -The microservices mode is intended for production usage, as it allows you to independently scale different services and isolate failures. +# Getting started with Grafana Mimir -This document will focus on single-binary Mimir with the blocks storage. -See [the architecture doc](../architecture.md) for more information about the microservices and [blocks operation](../blocks-storage/_index.md) -for more information about the blocks storage. +Grafana Mimir runs as either a single process or as multiple microservice processes. +The single process mode is useful for users who want to try or develop on Grafana Mimir. +The microservices mode allows you to independently scale different services and isolate failures. -Separately from single-binary vs microservices decision, Mimir can be configured to use local storage or cloud storage (S3, GCS and Azure). -Mimir can also make use of external Memcacheds and Redis for caching. +These instructions focus on deploying Grafana Mimir as a single process. +For more information about the microservices, refer to [Architecture]({{}}). -## Single instance running in single-binary mode +## Before you begin -For simplicity and to get started, we'll run it as a [single process](../configuration/single-process-config-blocks.yaml) with no dependencies. -You can reconfigure the config to use GCS, Azure storage or local storage as shown in the file's comments. +Verify that you have installed either a [Prometheus server](https://prometheus.io/docs/prometheus/latest/installation/) +or the [Grafana Agent](https://github.com/grafana/agent/releases/latest). +Verify that you have installed [Docker](https://docs.docker.com/engine/install/). -> **Note:** The `filesystem` backend only works for a single instance running in -> single-binary mode. Highly available deployments (both single-binary and -> microservices modes) must use an external object store. +## Download Grafana Mimir -```sh -$ go build ./cmd/mimir -$ ./mimir -config.file=./docs/sources/configuration/single-process-config-blocks.yaml -``` +- Using Docker: -Unless reconfigured this starts a single Mimir node storing blocks to S3 in bucket `mimir`. -It is not intended for production use. +```bash +docker pull "grafana/mimir:latest" +``` -Clone and build prometheus +- Using a local binary: -```sh -$ git clone https://github.com/prometheus/prometheus -$ cd prometheus -$ go build ./cmd/prometheus +```bash +curl -LO https://github.com/grafana/mimir/releases/latest/download/mimir +chmod +x mimir ``` -Add the following to your Prometheus config (documentation/examples/prometheus.yml in Prometheus repo): +## Start Grafana Mimir + +To run Grafana Mimir in a single process and with local filesystem storage, write the following configuration YAML to a file called `dev.yaml`: ```yaml -remote_write: - - url: http://localhost:9009/api/v1/push -``` +# Do not use this configuration in production. +# Its purpose is for you to get started within a development environment. +auth_enabled: false -And start Prometheus with that config file: +blocks_storage: + backend: filesystem + bucket_store: + sync_dir: /tmp/mimir/tsdb-sync + filesystem: + dir: /tmp/mimir/data/tsdb + tsdb: + dir: /tmp/mimir/tsdb -```sh -$ ./prometheus --config.file=./documentation/examples/prometheus.yml -``` +compactor: + data_dir: /tmp/mimir/compactor + sharding_ring: + kvstore: + store: memberlist -Your Prometheus instance will now start pushing data to Mimir. To query that data, start a Grafana instance: +distributor: + ring: + instance_addr: 127.0.0.1 + kvstore: + store: memberlist -```sh -$ docker run --rm -d --name=grafana -p 3000:3000 grafana/grafana -``` +ingester: + lifecycler: + address: 127.0.0.1 + ring: + kvstore: + store: memberlist + replication_factor: 1 -In [the Grafana UI](http://localhost:3000) (username/password admin/admin), add a Prometheus datasource for Mimir (`http://host.docker.internal:9009/prometheus`). +ruler: + enable_api: true + enable_sharding: false -**To clean up:** press CTRL-C in both terminals (for Mimir and Prometheus). +ruler_storage: + backend: local + local: + directory: /tmp/mimir/rules -## Horizontally scale out +server: + http_listen_port: 9009 + log_level: error -Next we're going to show how you can run a scale out Mimir cluster using Docker. We'll need: +store_gateway: + sharding_ring: + replication_factor: 1 +``` -- A built Mimir image. -- A Docker network to put these containers on so they can resolve each other by name. -- A single node Consul instance to coordinate the Mimir cluster. +## Run Grafana Mimir -> **Note:** In order to horizontally scale mimir, you must use an external -> object store. See the [blocks storage documentation]({{< relref "../blocks-storage/_index.md" >}}) -> for information on supported backends. +In a terminal, run one of the following commands: -```sh -$ make ./cmd/mimir/.uptodate -$ docker network create mimir -$ docker run -d --name=consul --network=mimir -e CONSUL_BIND_INTERFACE=eth0 consul -``` +- Using Docker: -Next we'll run a couple of Mimir instances pointed at that Consul. You'll note the Mimir configuration can be specified in either a config file or overridden on the command line. See [the arguments documentation](../configuration/arguments.md) for more information about Mimir configuration options. - -```sh -$ docker run -d --name=mimir1 --network=mimir \ - -v $(pwd)/docs/sources/configuration/single-process-config-blocks.yaml:/etc/single-process-config-blocks.yaml \ - -p 9001:9009 \ - us.gcr.io/kubernetes-dev/mimir \ - -config.file=/etc/single-process-config-blocks.yaml \ - -ring.store=consul \ - -consul.hostname=consul:8500 \ - -compactor.ring.store=consul \ - -compactor.ring.consul.hostname=consul:8500 - -$ docker run -d --name=mimir2 --network=mimir \ - -v $(pwd)/docs/sources/configuration/single-process-config-blocks.yaml:/etc/single-process-config-blocks.yaml \ - -p 9002:9009 \ - us.gcr.io/kubernetes-dev/mimir \ - -config.file=/etc/single-process-config-blocks.yaml \ - -ring.store=consul \ - -consul.hostname=consul:8500 \ - -compactor.ring.store=consul \ - -compactor.ring.consul.hostname=consul:8500 -``` + ```bash + docker run --rm --name mimir --publish 9009:9009 --volume "$(pwd)"/dev.yaml:/etc/mimir/dev.yaml "grafana/mimir:${MIMIR_LATEST}" --config.file=/etc/mimir/dev.yaml + ``` + +- Using a local binary: + + ```bash + ./mimir --config.file=./dev.yaml + ``` -If you go to http://localhost:9001/ring (or http://localhost:9002/ring) you should see both Mimir nodes join the ring. +Grafana Mimir listens on port `9009`. -To demonstrate the correct operation of Mimir clustering, we'll send samples -to one of the instances and queries to another. In production, you'd want to -load balance both pushes and queries evenly among all the nodes. +## Configure Prometheus to write to Grafana Mimir -Point Prometheus at the first: +Add the following YAML snippet to your Prometheus configuration file and restart the Prometheus server: ```yaml remote_write: - - url: http://localhost:9001/api/v1/push + - url: http://localhost:9009/api/v1/push ``` -```sh -$ ./prometheus --config.file=./documentation/examples/prometheus.yml -``` +The configuration for a Prometheus server that scrapes itself and writes those metrics to Grafana Mimir looks similar to this: -And Grafana at the second: +```yaml +remote_write: + - url: http://localhost:9009/api/v1/push -```sh -$ docker run -d --name=grafana --network=mimir -p 3000:3000 grafana/grafana +scrape_configs: + - job_name: prometheus + honor_labels: true + static_configs: + - targets: ["localhost:9090"] ``` -In [the Grafana UI](http://localhost:3000) (username/password admin/admin), add a Prometheus datasource for Mimir (`http://mimir2:9009/prometheus`). +## Configure the Grafana Agent to write to Grafana Mimir -**To clean up:** CTRL-C the Prometheus process and run: +Add the following YAML snippet to one of your Agent metrics configurations (`metrics.configs`) in your Agent configuration file and restart the Grafana Agent: +```yaml +remote_write: + - url: http://localhost:9009/api/v1/push ``` -$ docker rm -f mimir1 mimir2 consul grafana -$ docker network remove mimir -``` - -## High availability with replication -In this last demo we'll show how Mimir can replicate data among three nodes, -and demonstrate Mimir can tolerate a node failure without affecting reads and writes. +The configuration for an Agent that scrapes itself for metrics and writes those metrics to Grafana Mimir looks similar to this: -First, create a network and run a new Consul and Grafana: - -```sh -$ docker network create mimir -$ docker run -d --name=consul --network=mimir -e CONSUL_BIND_INTERFACE=eth0 consul -$ docker run -d --name=grafana --network=mimir -p 3000:3000 grafana/grafana -``` +```yaml +server: + http_listen_port: 12345 -Then, launch 3 Mimir nodes with replication factor 3: - -```sh -$ docker run -d --name=mimir1 --network=mimir \ - -v $(pwd)/docs/sources/configuration/single-process-config-blocks.yaml:/etc/single-process-config-blocks.yaml \ - -p 9001:9009 \ - us.gcr.io/kubernetes-dev/mimir \ - -config.file=/etc/single-process-config-blocks.yaml \ - -ring.store=consul \ - -consul.hostname=consul:8500 \ - -distributor.replication-factor=3 -$ docker run -d --name=mimir2 --network=mimir \ - -v $(pwd)/docs/sources/configuration/single-process-config-blocks.yaml:/etc/single-process-config-blocks.yaml \ - -p 9002:9009 \ - us.gcr.io/kubernetes-dev/mimir \ - -config.file=/etc/single-process-config-blocks.yaml \ - -ring.store=consul \ - -consul.hostname=consul:8500 \ - -distributor.replication-factor=3 -$ docker run -d --name=mimir3 --network=mimir \ - -v $(pwd)/docs/sources/configuration/single-process-config-blocks.yaml:/etc/single-process-config-blocks.yaml \ - -p 9003:9009 \ - us.gcr.io/kubernetes-dev/mimir \ - -config.file=/etc/single-process-config-blocks.yaml \ - -ring.store=consul \ - -consul.hostname=consul:8500 \ - -distributor.replication-factor=3 +metrics: + configs: + - name: agent + scrape_configs: + - job_name: agent + static_configs: + - targets: ["127.0.0.1:12345"] + remote_write: + - url: http://localhost:9009/prometheus/api/v1/push ``` -Configure Prometheus to send data to the first replica: +## Query data in Grafana -```yaml -remote_write: - - url: http://localhost:9001/api/v1/push -``` +In a new terminal, run a local Grafana server using Docker: -```sh -$ ./prometheus --config.file=./documentation/examples/prometheus.yml +```bash +docker run --rm --name=grafana --network=host grafana/grafana ``` -In Grafana, add a datasource for the 3rd Mimir replica (`http://mimir3:9009/prometheus`) -and verify the same data appears in both Prometheus and Mimir. +### Add Grafana Mimir as a Prometheus data source -To show that Mimir can tolerate a node failure, hard kill one of the Mimir replicas: +1. In a browser, go to the Grafana server at [http://localhost:3000/datasources](http://localhost:3000/datasources). +1. Sign in using the default username `admin` and password `admin`. +1. Configure a new Prometheus data source to query the local Grafana Mimir server using the following settings: -``` -$ docker rm -f mimir2 -``` +| Field | Value | +| ----- | -------------------------------------------------------------------- | +| Name | Mimir | +| URL | [http://localhost:9009/prometheus](http://localhost:9009/prometheus) | -You should see writes and queries continue to work without error. +To add a data source, refer to [Add a data source](https://grafana.com/docs/grafana/latest/datasources/add-a-data-source/). -**To clean up:** CTRL-C the Prometheus process and run: +## Verify success -``` -$ docker rm -f mimir1 mimir2 mimir3 consul grafana -$ docker network remove mimir -``` +When you have completed the tasks in this getting started guide, you can query metrics in [Grafana Explore](https://grafana.com/docs/grafana/latest/explore/) +as well as create dashboard panels using the newly configured Grafana Mimir data source. From 61667962ea04a14e5bca41dd42b63d0cd19afe94 Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Fri, 28 Jan 2022 17:09:19 +0100 Subject: [PATCH 044/168] Set `ruler.alertmanager-use-v2` default to `true` (#954) * Set ruler.alertmanager-use-v2 default to true Signed-off-by: Dimitar Dimitrov * Update CHANGELOG.md Signed-off-by: Dimitar Dimitrov * Generate docs Signed-off-by: Dimitar Dimitrov * Format CHANGELOG.md Signed-off-by: Dimitar Dimitrov * Update help.txt Signed-off-by: Dimitar Dimitrov * Update CHANGELOG.md --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 2 +- cmd/mimir/help.txt.tmpl | 2 +- docs/sources/configuration/config-file-reference.md | 2 +- pkg/ruler/notifier.go | 2 +- pkg/ruler/ruler.go | 4 ++-- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bde54334fb..a12271f7056 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -221,6 +221,7 @@ * [CHANGE] Server: `-server.http-listen-port` (yaml: `server.http_listen_port`) now defaults to `8080` (previously `80`). #871 * [CHANGE] Changed the default value of `blocks-storage.bucket-store.ignore-deletion-marks-delay` from 6h to 1h. #892 * [CHANGE] Querier/ruler/query-frontend: the experimental `-querier.at-modifier-enabled` CLI flag has been removed and the PromQL `@` modifier is always enabled. #941 +* [CHANGE] Ruler: `-ruler.alertmanager-use-v2` now defaults to `true`. #954 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index f65481700ed..6cf7e598d81 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -1352,7 +1352,7 @@ Usage of ./cmd/mimir/mimir: -ruler.alertmanager-url string Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each Alertmanager URL is treated as a separate group in the configuration. Multiple Alertmanagers in HA per group can be supported by using DNS resolution via -ruler.alertmanager-discovery. -ruler.alertmanager-use-v2 - If enabled requests to Alertmanager will utilize the V2 API. + If enabled requests to Alertmanager will utilize the V2 API. (default true) -ruler.client.backoff-max-period duration Maximum delay when backing off. (default 10s) -ruler.client.backoff-min-period duration diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 7e5a59deb57..1717354a4a5 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -1250,7 +1250,7 @@ Usage of ./cmd/mimir/mimir: -ruler.alertmanager-url string Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each Alertmanager URL is treated as a separate group in the configuration. Multiple Alertmanagers in HA per group can be supported by using DNS resolution via -ruler.alertmanager-discovery. -ruler.alertmanager-use-v2 - If enabled requests to Alertmanager will utilize the V2 API. + If enabled requests to Alertmanager will utilize the V2 API. (default true) -ruler.client.backoff-max-period duration Maximum delay when backing off. (default 10s) -ruler.client.backoff-min-period duration diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 489f6cc9c80..4f42b55981d 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -1163,7 +1163,7 @@ ruler_client: # If enabled requests to Alertmanager will utilize the V2 API. # CLI flag: -ruler.alertmanager-use-v2 -[enable_alertmanager_v2: | default = false] +[enable_alertmanager_v2: | default = true] # Capacity of the queue for notifications to be sent to the Alertmanager. # CLI flag: -ruler.notification-queue-capacity diff --git a/pkg/ruler/notifier.go b/pkg/ruler/notifier.go index 95f26fbd3f9..bac61b6e809 100644 --- a/pkg/ruler/notifier.go +++ b/pkg/ruler/notifier.go @@ -123,7 +123,7 @@ func buildNotifierConfig(rulerConfig *Config) (*config.Config, error) { } apiVersion := config.AlertmanagerAPIVersionV1 - if rulerConfig.AlertmanangerEnableV2API { + if rulerConfig.AlertmanagerEnableV2API { apiVersion = config.AlertmanagerAPIVersionV2 } diff --git a/pkg/ruler/ruler.go b/pkg/ruler/ruler.go index caad132d88d..f1c545f3e30 100644 --- a/pkg/ruler/ruler.go +++ b/pkg/ruler/ruler.go @@ -90,7 +90,7 @@ type Config struct { // How long to wait between refreshing the list of Alertmanager based on DNS service discovery. AlertmanagerRefreshInterval time.Duration `yaml:"alertmanager_refresh_interval"` // Enables the ruler notifier to use the Alertmananger V2 API. - AlertmanangerEnableV2API bool `yaml:"enable_alertmanager_v2"` + AlertmanagerEnableV2API bool `yaml:"enable_alertmanager_v2"` // Capacity of the queue for notifications to be sent to the Alertmanager. NotificationQueueCapacity int `yaml:"notification_queue_capacity"` // HTTP timeout duration when sending notifications to the Alertmanager. @@ -150,7 +150,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.StringVar(&cfg.AlertmanagerURL, "ruler.alertmanager-url", "", "Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each Alertmanager URL is treated as a separate group in the configuration. Multiple Alertmanagers in HA per group can be supported by using DNS resolution via -ruler.alertmanager-discovery.") f.BoolVar(&cfg.AlertmanagerDiscovery, "ruler.alertmanager-discovery", false, "Use DNS SRV records to discover Alertmanager hosts.") f.DurationVar(&cfg.AlertmanagerRefreshInterval, "ruler.alertmanager-refresh-interval", 1*time.Minute, "How long to wait between refreshing DNS resolutions of Alertmanager hosts.") - f.BoolVar(&cfg.AlertmanangerEnableV2API, "ruler.alertmanager-use-v2", false, "If enabled requests to Alertmanager will utilize the V2 API.") + f.BoolVar(&cfg.AlertmanagerEnableV2API, "ruler.alertmanager-use-v2", true, "If enabled requests to Alertmanager will utilize the V2 API.") f.IntVar(&cfg.NotificationQueueCapacity, "ruler.notification-queue-capacity", 10000, "Capacity of the queue for notifications to be sent to the Alertmanager.") f.DurationVar(&cfg.NotificationTimeout, "ruler.notification-timeout", 10*time.Second, "HTTP timeout duration when sending notifications to the Alertmanager.") From bc66a33dc54deaf3b4b651d931b0bff8365a2fea Mon Sep 17 00:00:00 2001 From: Oleg Zaytsev Date: Fri, 28 Jan 2022 17:11:07 +0100 Subject: [PATCH 045/168] Expose `listblocks` as store-gateway http endpoint (#911) * Extract listblocks business logic to a package So we can reuse it in store-gateway. Signed-off-by: Oleg Zaytsev * Add store-gateway users and blocks list Signed-off-by: Oleg Zaytsev * Make links Signed-off-by: Oleg Zaytsev * Rename minTime to ulidMinTime Signed-off-by: Oleg Zaytsev * Properly sort by shard label Signed-off-by: Oleg Zaytsev * Add JSON tags to the response Signed-off-by: Oleg Zaytsev * make BUILD_IN_CONTAINER=false license Signed-off-by: Oleg Zaytsev * Simplify users json Signed-off-by: Oleg Zaytsev * Improve listblocks comment Signed-off-by: Oleg Zaytsev * Fix to not omit zero split count Signed-off-by: Oleg Zaytsev * Machine readable json output Signed-off-by: Oleg Zaytsev * Remove information that isn't needed in JSON Signed-off-by: Oleg Zaytsev * Remove omitempties that can lead to error Signed-off-by: Oleg Zaytsev * Use form instead of query values Signed-off-by: Oleg Zaytsev * Add padding to the table Signed-off-by: Oleg Zaytsev * Render rich metas, not rendered blocks Signed-off-by: Oleg Zaytsev * s/SortedBlocks/SortBlocks/ Signed-off-by: Oleg Zaytsev * Drop duration from metas Signed-off-by: Oleg Zaytsev * Add padding to users table too Signed-off-by: Oleg Zaytsev * Update CHANGELOG.md Signed-off-by: Oleg Zaytsev * Accept Peter's suggestion on border-collapse Signed-off-by: Oleg Zaytsev * Update docs with new endpoints Signed-off-by: Oleg Zaytsev * Format zero deletion time as empty string Signed-off-by: Oleg Zaytsev * Add index link Signed-off-by: Oleg Zaytsev * s/user/tenant/ Signed-off-by: Oleg Zaytsev * Monospace tbody font-families Signed-off-by: Oleg Zaytsev * Revert table header Signed-off-by: Oleg Zaytsev --- CHANGELOG.md | 1 + docs/sources/api/_index.md | 18 ++ pkg/api/api.go | 3 + pkg/storegateway/gateway_blocks_http.go | 259 ++++++++++++++++++ .../{gateway_http.go => gateway_ring_http.go} | 0 pkg/storegateway/gateway_tenants_http.go | 57 ++++ pkg/util/listblocks/listblocks.go | 200 ++++++++++++++ tools/listblocks/main.go | 168 +----------- 8 files changed, 542 insertions(+), 164 deletions(-) create mode 100644 pkg/storegateway/gateway_blocks_http.go rename pkg/storegateway/{gateway_http.go => gateway_ring_http.go} (100%) create mode 100644 pkg/storegateway/gateway_tenants_http.go create mode 100644 pkg/util/listblocks/listblocks.go diff --git a/CHANGELOG.md b/CHANGELOG.md index a12271f7056..978a2af066d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -270,6 +270,7 @@ * Added support for `source_tenants` field on rule groups. * [FEATURE] Mimir: Added "Activity tracker" feature which can log ongoing activities from previous Mimir run in case of the crash. It is enabled by default and controlled by the `-activity-tracker.filepath` flag. It can be disabled by setting this path to an empty string. Currently, the Store-gateway, Ruler, Querier, and Query-frontend components uses this feature. #631 #782 #822 * [FEATURE] Mimir: Divide configuration parameters into categories "basic", "advanced", and "experimental". Only flags in the basic category are shown when invoking `-help`, whereas `-help-all` will include flags in all categories (basic, advanced, experimental). #840 +* [FEATURE] Store-gateway: Added `/store-gateway/tenants` and `/store-gateway/tenant/{tenant}/blocks` endpoints that provide functionality that was provided by `tools/listblocks`. #911 * [ENHANCEMENT] Query-frontend: added `cortex_query_frontend_workers_enqueued_requests_total` metric to track the number of requests enqueued in each query-scheduler. #384 * [ENHANCEMENT] Add a flag (`--proxy.compare-use-relative-error`) in the query-tee to compare floating point values using relative error. #208 * [ENHANCEMENT] Add a flag (`--proxy.compare-skip-recent-samples`) in the query-tee to skip comparing recent samples. By default samples not older than 1 minute are skipped. #234 diff --git a/docs/sources/api/_index.md b/docs/sources/api/_index.md index f5a956e13bd..e3afdafcd51 100644 --- a/docs/sources/api/_index.md +++ b/docs/sources/api/_index.md @@ -65,6 +65,8 @@ For the sake of clarity, in this document we have grouped API endpoints by servi | [Tenant delete request](#tenant-delete-request) | Purger | `POST /purger/delete_tenant` | | [Tenant delete status](#tenant-delete-status) | Purger | `GET /purger/delete_tenant_status` | | [Store-gateway ring status](#store-gateway-ring-status) | Store-gateway | `GET /store-gateway/ring` | +| [Store-gateway tenants](#store-gateway-tenants) | Store-gateway | `GET /store-gateway/tenants` | +| [Store-gateway tenant blocks](#store-gateway-tenant-blocks) | Store-gateway | `GET /store-gateway/tenant/{tenant}/blocks` | | [Compactor ring status](#compactor-ring-status) | Compactor | `GET /compactor/ring` | ### Path prefixes @@ -947,6 +949,22 @@ GET /store-gateway/ring Displays a web page with the store-gateway hash ring status, including the state, healthy and last heartbeat time of each store-gateway. +### Store-gateway tenants + +``` +GET /store-gateway/tenants +``` + +Displays a web page with the list of tenants with blocks in the storage configured for store-gateway. + +### Store-gateway tenant blocks + +``` +GET /store-gateway/tenant/{tenant}/blocks +``` + +Displays a web page listing the blocks for a given tenant. + ## Compactor ### Compactor ring status diff --git a/pkg/api/api.go b/pkg/api/api.go index f5e4bd05667..c5384ce30f6 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -331,7 +331,10 @@ func (a *API) RegisterStoreGateway(s *storegateway.StoreGateway) { storegatewaypb.RegisterStoreGatewayServer(a.server.GRPC, s) a.indexPage.AddLink(SectionAdminEndpoints, "/store-gateway/ring", "Store Gateway Ring") + a.indexPage.AddLink(SectionAdminEndpoints, "/store-gateway/tenants", "Store Gateway Tenants & Blocks") a.RegisterRoute("/store-gateway/ring", http.HandlerFunc(s.RingHandler), false, "GET", "POST") + a.RegisterRoute("/store-gateway/tenants", http.HandlerFunc(s.TenantsHandler), false, "GET") + a.RegisterRoute("/store-gateway/tenant/{tenant}/blocks", http.HandlerFunc(s.BlocksHandler), false, "GET") } // RegisterCompactor registers the ring UI page associated with the compactor. diff --git a/pkg/storegateway/gateway_blocks_http.go b/pkg/storegateway/gateway_blocks_http.go new file mode 100644 index 00000000000..cc7ed686b67 --- /dev/null +++ b/pkg/storegateway/gateway_blocks_http.go @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package storegateway + +import ( + "fmt" + "html/template" + "net/http" + "net/url" + "strconv" + "time" + + "github.com/gorilla/mux" + "github.com/prometheus/prometheus/model/labels" + "github.com/thanos-io/thanos/pkg/block/metadata" + + "github.com/grafana/mimir/pkg/storage/tsdb" + "github.com/grafana/mimir/pkg/util" + "github.com/grafana/mimir/pkg/util/listblocks" +) + +const blocksPageTemplate = ` + + + + + Store-gateway: bucket tenant blocks + + + +

Store-gateway: bucket tenant blocks

+

Current time: {{ .Now }}

+

Showing blocks for tenant: {{ .Tenant }}

+

+ {{ if not .ShowDeleted }} + Show Deleted + {{ end }} + {{ if not .ShowSources }} + Show Sources + {{ end }} + {{ if not .ShowParents }} + Show Parents + {{ end }} +

+

+ Use ?split_count= query param to show split compactor count preview. +

+ + + + + {{ if .ShowSplitCount }}{{ end }} + + + + + {{ if .ShowDeleted }}{{ end }} + + + + {{ if .ShowSources }}{{ end }} + {{ if .ShowParents }}{{ end }} + + + + {{ $page := . }} + {{ range .FormattedBlocks }} + + + {{ if $page.ShowSplitCount }}{{ end }} + + + + + {{ if $page.ShowDeleted }}{{ end }} + + + + {{ if $page.ShowSources }} + + {{ end }} + {{ if $page.ShowParents }} + + {{ end }} + + {{ end }} + +
Block IDSplit IDULID TimeMin TimeMax TimeDurationDeletion TimeLvlSizeLabels (excl. {{ .TSDBTenantIDExternalLabel }})SourcesParents
{{ .ULID }}{{ .SplitCount }}{{ .ULIDTime }}{{ .MinTime }}{{ .MaxTime }}{{ .Duration }}{{ .DeletedTime }}{{ .CompactionLevel }}{{ .BlockSize }}{{ .Labels }} + {{ range $i, $source := .Sources }} + {{ if $i }}
{{ end }} + {{ . }} + {{ end }} +
+ {{ range $i, $source := .Parents }} + {{ if $i }}
{{ end }} + {{ . }} + {{ end }} +
+ +` + +var blocksTemplate = template.Must(template.New("webpage").Parse(blocksPageTemplate)) + +func (s *StoreGateway) BlocksHandler(w http.ResponseWriter, req *http.Request) { + vars := mux.Vars(req) + tenantID := vars["tenant"] + if tenantID == "" { + util.WriteTextResponse(w, "Tenant ID can't be empty") + return + } + + if err := req.ParseForm(); err != nil { + util.WriteTextResponse(w, fmt.Sprintf("Can't parse form: %s", err)) + return + } + + showDeleted := req.Form.Get("show_deleted") == "true" + showSources := req.Form.Get("show_sources") == "true" + showParents := req.Form.Get("show_parents") == "true" + var splitCount int + if sc := req.Form.Get("split_count"); sc != "" { + var err error + splitCount, err = strconv.Atoi(sc) + if err != nil { + util.WriteTextResponse(w, fmt.Sprintf("Bad split_count param: %s", err)) + return + } + } + + metasMap, deletedTimes, err := listblocks.LoadMetaFilesAndDeletionMarkers(req.Context(), s.stores.bucket, tenantID, showDeleted, time.Time{}) + if err != nil { + util.WriteTextResponse(w, fmt.Sprintf("Failed to read block metadata: %s", err)) + return + } + metas := listblocks.SortBlocks(metasMap) + + type formattedBlockData struct { + ULID string + ULIDTime string + SplitCount *uint32 + MinTime string + MaxTime string + Duration string + DeletedTime string + CompactionLevel int + BlockSize string + Labels string + Sources []string + Parents []string + } + + type richMeta struct { + *metadata.Meta + DeletedTime *int64 `json:"deletedTime,omitempty"` + SplitID *uint32 `json:"splitId,omitempty"` + } + + formattedBlocks := make([]formattedBlockData, 0, len(metas)) + richMetas := make([]richMeta, 0, len(metas)) + + for _, m := range metas { + if !showDeleted && !deletedTimes[m.ULID].IsZero() { + continue + } + var parents []string + for _, pb := range m.Compaction.Parents { + parents = append(parents, pb.ULID.String()) + } + var sources []string + for _, pb := range m.Compaction.Sources { + sources = append(parents, pb.String()) + } + var blockSplitID *uint32 + if splitCount > 0 { + bsc := tsdb.HashBlockID(m.ULID) % uint32(splitCount) + blockSplitID = &bsc + } + lbls := labels.FromMap(m.Thanos.Labels) + formattedBlocks = append(formattedBlocks, formattedBlockData{ + ULID: m.ULID.String(), + ULIDTime: util.TimeFromMillis(int64(m.ULID.Time())).UTC().Format(time.RFC3339), + SplitCount: blockSplitID, + MinTime: util.TimeFromMillis(m.MinTime).UTC().Format(time.RFC3339), + MaxTime: util.TimeFromMillis(m.MaxTime).UTC().Format(time.RFC3339), + Duration: util.TimeFromMillis(m.MaxTime).Sub(util.TimeFromMillis(m.MinTime)).String(), + DeletedTime: formatTimeIfNotZero(deletedTimes[m.ULID].UTC(), time.RFC3339), + CompactionLevel: m.Compaction.Level, + BlockSize: listblocks.GetFormattedBlockSize(m), + Labels: lbls.WithoutLabels(tsdb.TenantIDExternalLabel).String(), + Sources: sources, + Parents: parents, + }) + var deletedAt *int64 + if dt, ok := deletedTimes[m.ULID]; ok { + deletedAtTime := dt.UnixMilli() + deletedAt = &deletedAtTime + } + richMetas = append(richMetas, richMeta{ + Meta: m, + DeletedTime: deletedAt, + SplitID: blockSplitID, + }) + } + + util.RenderHTTPResponse(w, struct { + Now time.Time `json:"now"` + Tenant string `json:"tenant,omitempty"` + RichMetas []richMeta `json:"metas"` + FormattedBlocks []formattedBlockData `json:"-"` + ShowDeleted bool `json:"-"` + ShowSplitCount bool `json:"-"` + ShowSources bool `json:"-"` + ShowParents bool `json:"-"` + + ShowDeletedURI string `json:"-"` + ShowSourcesURI string `json:"-"` + ShowParentsURI string `json:"-"` + + TSDBTenantIDExternalLabel string `json:"-"` + }{ + Now: time.Now(), + Tenant: tenantID, + RichMetas: richMetas, + FormattedBlocks: formattedBlocks, + + ShowSplitCount: splitCount > 0, + ShowDeleted: showDeleted, + ShowSources: showSources, + ShowParents: showParents, + + ShowDeletedURI: uriWithTrueBoolParam(*req.URL, req.Form, "show_deleted"), + ShowSourcesURI: uriWithTrueBoolParam(*req.URL, req.Form, "show_sources"), + ShowParentsURI: uriWithTrueBoolParam(*req.URL, req.Form, "show_parents"), + + TSDBTenantIDExternalLabel: tsdb.TenantIDExternalLabel, + }, blocksTemplate, req) +} + +func uriWithTrueBoolParam(u url.URL, form url.Values, boolParam string) string { + q := u.Query() + for k, vs := range form { + for _, val := range vs { + // Yes, we set only the last value, but otherwise the logic just gets too complicated. + q.Set(k, val) + } + } + q.Set(boolParam, "true") + u.RawQuery = q.Encode() + + return u.RequestURI() +} + +func formatTimeIfNotZero(t time.Time, format string) string { + if t.IsZero() { + return "" + } + + return t.Format(format) +} diff --git a/pkg/storegateway/gateway_http.go b/pkg/storegateway/gateway_ring_http.go similarity index 100% rename from pkg/storegateway/gateway_http.go rename to pkg/storegateway/gateway_ring_http.go diff --git a/pkg/storegateway/gateway_tenants_http.go b/pkg/storegateway/gateway_tenants_http.go new file mode 100644 index 00000000000..40e3811a82d --- /dev/null +++ b/pkg/storegateway/gateway_tenants_http.go @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package storegateway + +import ( + "fmt" + "html/template" + "net/http" + "time" + + "github.com/grafana/mimir/pkg/util" +) + +const tenantsPageTemplate = ` + + + + + Store-gateway: bucket tenants + + +

Store-gateway: bucket tenants

+

Current time: {{ .Now }}

+ + + + + + + + {{ range .Tenants }} + + + + {{ end }} + +
Tenant
{{ . }}
+ +` + +var tenantsTemplate = template.Must(template.New("webpage").Parse(tenantsPageTemplate)) + +func (s *StoreGateway) TenantsHandler(w http.ResponseWriter, req *http.Request) { + tenantIDs, err := s.stores.scanUsers(req.Context()) + if err != nil { + util.WriteTextResponse(w, fmt.Sprintf("Can't read tenants: %s", err)) + return + } + + util.RenderHTTPResponse(w, struct { + Now time.Time `json:"now"` + Tenants []string `json:"tenants,omitempty"` + }{ + Now: time.Now(), + Tenants: tenantIDs, + }, tenantsTemplate, req) +} diff --git a/pkg/util/listblocks/listblocks.go b/pkg/util/listblocks/listblocks.go new file mode 100644 index 00000000000..33d18b9d5b5 --- /dev/null +++ b/pkg/util/listblocks/listblocks.go @@ -0,0 +1,200 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package listblocks + +import ( + "context" + "encoding/json" + "path" + "sort" + "sync" + "time" + + "github.com/dustin/go-humanize" + "github.com/grafana/dskit/concurrency" + "github.com/oklog/ulid" + "github.com/thanos-io/thanos/pkg/block" + "github.com/thanos-io/thanos/pkg/block/metadata" + "github.com/thanos-io/thanos/pkg/objstore" + + "github.com/grafana/mimir/pkg/storage/sharding" + "github.com/grafana/mimir/pkg/storage/tsdb" + "github.com/grafana/mimir/pkg/storage/tsdb/bucketindex" +) + +// LoadMetaFilesAndDeletionMarkers reads the bucket and loads the meta files for the provided user. +// If showDeleted is true, then deletion marker files are also read and returned. +// If ulidMinTime is non-zero, then only blocks with ULID time higher than that are read, +// this is useful to filter the results for users with high amount of blocks without reading the metas +// (but it can be inexact since ULID time can differ from block min/max times range). +func LoadMetaFilesAndDeletionMarkers(ctx context.Context, bkt objstore.BucketReader, user string, showDeleted bool, ulidMinTime time.Time) (metas map[ulid.ULID]*metadata.Meta, deletionTimes map[ulid.ULID]time.Time, _ error) { + deletedBlocks := map[ulid.ULID]bool{} + deletionMarkerFiles := []string(nil) + + // Find blocks marked for deletion + err := bkt.Iter(ctx, path.Join(user, bucketindex.MarkersPathname), func(s string) error { + if id, ok := bucketindex.IsBlockDeletionMarkFilename(path.Base(s)); ok { + deletedBlocks[id] = true + deletionMarkerFiles = append(deletionMarkerFiles, s) + } + return nil + }) + if err != nil { + return nil, nil, err + } + + metaPaths := []string(nil) + err = bkt.Iter(ctx, user, func(s string) error { + if id, ok := block.IsBlockDir(s); ok { + if !showDeleted && deletedBlocks[id] { + return nil + } + + // Block's ULID is typically higher than min/max time of the block, + // unless somebody was ingesting data with timestamps in the future. + if !ulidMinTime.IsZero() && ulid.Time(id.Time()).Before(ulidMinTime) { + return nil + } + + metaPaths = append(metaPaths, path.Join(s, "meta.json")) + } + return nil + }) + + if err != nil { + return nil, nil, err + } + + if showDeleted { + deletionTimes, err = fetchDeletionTimes(ctx, bkt, deletionMarkerFiles) + if err != nil { + return nil, nil, err + } + } + + metas, err = fetchMetas(ctx, bkt, metaPaths) + return metas, deletionTimes, err +} + +const concurrencyLimit = 32 + +func fetchDeletionTimes(ctx context.Context, bkt objstore.BucketReader, deletionMarkers []string) (map[ulid.ULID]time.Time, error) { + mu := sync.Mutex{} + times := map[ulid.ULID]time.Time{} + + return times, concurrency.ForEachJob(ctx, len(deletionMarkers), concurrencyLimit, func(ctx context.Context, idx int) error { + r, err := bkt.Get(ctx, deletionMarkers[idx]) + if err != nil { + if bkt.IsObjNotFoundErr(err) { + return nil + } + + return err + } + defer r.Close() + + dec := json.NewDecoder(r) + + m := metadata.DeletionMark{} + if err := dec.Decode(&m); err != nil { + return err + } + + mu.Lock() + times[m.ID] = time.Unix(m.DeletionTime, 0) + mu.Unlock() + + return nil + }) +} + +func fetchMetas(ctx context.Context, bkt objstore.BucketReader, metaFiles []string) (map[ulid.ULID]*metadata.Meta, error) { + mu := sync.Mutex{} + metas := map[ulid.ULID]*metadata.Meta{} + + return metas, concurrency.ForEachJob(ctx, len(metaFiles), concurrencyLimit, func(ctx context.Context, idx int) error { + r, err := bkt.Get(ctx, metaFiles[idx]) + if err != nil { + if bkt.IsObjNotFoundErr(err) { + return nil + } + + return err + } + defer r.Close() + + m, err := metadata.Read(r) + if err != nil { + return err + } + + mu.Lock() + metas[m.ULID] = m + mu.Unlock() + + return nil + }) +} + +func SortBlocks(metas map[ulid.ULID]*metadata.Meta) []*metadata.Meta { + var blocks []*metadata.Meta + + for _, b := range metas { + blocks = append(blocks, b) + } + + sort.Slice(blocks, func(i, j int) bool { + // By min-time + if blocks[i].MinTime != blocks[j].MinTime { + return blocks[i].MinTime < blocks[j].MinTime + } + + // Duration + duri := blocks[i].MaxTime - blocks[i].MinTime + durj := blocks[j].MaxTime - blocks[j].MinTime + if duri != durj { + return duri < durj + } + + // Compactor shard + shardi := blocks[i].Thanos.Labels[tsdb.CompactorShardIDExternalLabel] + shardj := blocks[j].Thanos.Labels[tsdb.CompactorShardIDExternalLabel] + + if shardi != "" && shardj != "" && shardi != shardj { + shardiIndex, shardiCount, erri := sharding.ParseShardIDLabelValue(shardi) + shardjIndex, shardjCount, errj := sharding.ParseShardIDLabelValue(shardj) + if erri != nil || errj != nil { + // Ff failed parsing any of labels, fallback to lexicographical sort. + return shardi < shardj + } else if shardiCount != shardjCount { + // If parsed but shard count differs, first sort by shard count. + return shardiCount < shardjCount + } + + // Otherwise, sort by shard count, this should be the happy path when there are sharded blocks. + return shardiIndex < shardjIndex + } + + // ULID time. + return blocks[i].ULID.Time() < blocks[j].ULID.Time() + }) + return blocks +} + +func GetFormattedBlockSize(b *metadata.Meta) string { + if len(b.Thanos.Files) == 0 { + return "" + } + + size := GetBlockSizeBytes(b) + + return humanize.IBytes(size) +} + +func GetBlockSizeBytes(b *metadata.Meta) uint64 { + size := uint64(0) + for _, f := range b.Thanos.Files { + size += uint64(f.SizeBytes) + } + return size +} diff --git a/tools/listblocks/main.go b/tools/listblocks/main.go index 6a538364387..3c03cba72c5 100644 --- a/tools/listblocks/main.go +++ b/tools/listblocks/main.go @@ -4,33 +4,25 @@ package main import ( "context" - "encoding/json" "flag" "fmt" "log" "os" "os/signal" - "path" - "sort" - "sync" "syscall" "text/tabwriter" "time" - "github.com/dustin/go-humanize" gokitlog "github.com/go-kit/log" - "github.com/grafana/dskit/concurrency" "github.com/grafana/dskit/flagext" "github.com/oklog/ulid" "github.com/prometheus/prometheus/model/labels" - "github.com/thanos-io/thanos/pkg/block" "github.com/thanos-io/thanos/pkg/block/metadata" - "github.com/thanos-io/thanos/pkg/objstore" "github.com/grafana/mimir/pkg/storage/bucket" "github.com/grafana/mimir/pkg/storage/tsdb" - "github.com/grafana/mimir/pkg/storage/tsdb/bucketindex" "github.com/grafana/mimir/pkg/util" + "github.com/grafana/mimir/pkg/util/listblocks" ) type config struct { @@ -85,7 +77,7 @@ func main() { loadMetasMinTime = time.Time(cfg.minTime) } - metas, deletedTimes, err := loadMetaFilesAndDeletionMarkers(ctx, bkt, cfg.userID, cfg.showDeleted, loadMetasMinTime) + metas, deletedTimes, err := listblocks.LoadMetaFilesAndDeletionMarkers(ctx, bkt, cfg.userID, cfg.showDeleted, loadMetasMinTime) if err != nil { log.Fatalln("failed to read block metadata:", err) } @@ -93,149 +85,10 @@ func main() { printMetas(metas, deletedTimes, cfg) } -func loadMetaFilesAndDeletionMarkers(ctx context.Context, bkt objstore.Bucket, user string, showDeleted bool, minTime time.Time) (map[ulid.ULID]*metadata.Meta, map[ulid.ULID]time.Time, error) { - deletedBlocks := map[ulid.ULID]bool{} - deletionMarkerFiles := []string(nil) - - // Find blocks marked for deletion - err := bkt.Iter(ctx, path.Join(user, bucketindex.MarkersPathname), func(s string) error { - if id, ok := bucketindex.IsBlockDeletionMarkFilename(path.Base(s)); ok { - deletedBlocks[id] = true - deletionMarkerFiles = append(deletionMarkerFiles, s) - } - return nil - }) - if err != nil { - return nil, nil, err - } - - metaPaths := []string(nil) - err = bkt.Iter(ctx, user, func(s string) error { - if id, ok := block.IsBlockDir(s); ok { - if !showDeleted && deletedBlocks[id] { - return nil - } - - // Block's ULID is typically higher than min/max time of the block, - // unless somebody was ingesting data with timestamps in the future. - if !minTime.IsZero() && ulid.Time(id.Time()).Before(minTime) { - return nil - } - - metaPaths = append(metaPaths, path.Join(s, "meta.json")) - } - return nil - }) - - if err != nil { - return nil, nil, err - } - - var deletionTimes map[ulid.ULID]time.Time - if showDeleted { - deletionTimes, err = fetchDeletionTimes(ctx, bkt, deletionMarkerFiles) - if err != nil { - return nil, nil, err - } - } - - metas, err := fetchMetas(ctx, bkt, metaPaths) - return metas, deletionTimes, err -} - -const concurrencyLimit = 32 - -func fetchDeletionTimes(ctx context.Context, bkt objstore.Bucket, deletionMarkers []string) (map[ulid.ULID]time.Time, error) { - mu := sync.Mutex{} - times := map[ulid.ULID]time.Time{} - - return times, concurrency.ForEachJob(ctx, len(deletionMarkers), concurrencyLimit, func(ctx context.Context, idx int) error { - r, err := bkt.Get(ctx, deletionMarkers[idx]) - if err != nil { - if bkt.IsObjNotFoundErr(err) { - return nil - } - - return err - } - defer r.Close() - - dec := json.NewDecoder(r) - - m := metadata.DeletionMark{} - if err := dec.Decode(&m); err != nil { - return err - } - - mu.Lock() - times[m.ID] = time.Unix(m.DeletionTime, 0) - mu.Unlock() - - return nil - }) -} - -func fetchMetas(ctx context.Context, bkt objstore.Bucket, metaFiles []string) (map[ulid.ULID]*metadata.Meta, error) { - mu := sync.Mutex{} - metas := map[ulid.ULID]*metadata.Meta{} - - return metas, concurrency.ForEachJob(ctx, len(metaFiles), concurrencyLimit, func(ctx context.Context, idx int) error { - r, err := bkt.Get(ctx, metaFiles[idx]) - if err != nil { - if bkt.IsObjNotFoundErr(err) { - return nil - } - - return err - } - defer r.Close() - - m, err := metadata.Read(r) - if err != nil { - return err - } - - mu.Lock() - metas[m.ULID] = m - mu.Unlock() - - return nil - }) -} - // nolint:errcheck //goland:noinspection GoUnhandledErrorResult func printMetas(metas map[ulid.ULID]*metadata.Meta, deletedTimes map[ulid.ULID]time.Time, cfg config) { - var blocks []*metadata.Meta - - for _, b := range metas { - blocks = append(blocks, b) - } - - sort.Slice(blocks, func(i, j int) bool { - // By min-time - if blocks[i].MinTime != blocks[j].MinTime { - return blocks[i].MinTime < blocks[j].MinTime - } - - // Duration - duri := blocks[i].MaxTime - blocks[i].MinTime - durj := blocks[j].MaxTime - blocks[j].MinTime - if duri != durj { - return duri < durj - } - - // Compactor shard - shardi := blocks[i].Thanos.Labels[tsdb.CompactorShardIDExternalLabel] - shardj := blocks[j].Thanos.Labels[tsdb.CompactorShardIDExternalLabel] - - if shardi != "" && shardj != "" && shardi != shardj { - return shardi < shardj - } - - // ULID time. - return blocks[i].ULID.Time() < blocks[j].ULID.Time() - }) + blocks := listblocks.SortBlocks(metas) tabber := tabwriter.NewWriter(os.Stdout, 1, 4, 3, ' ', 0) defer tabber.Flush() @@ -307,7 +160,7 @@ func printMetas(metas map[ulid.ULID]*metadata.Meta, deletedTimes map[ulid.ULID]t } if cfg.showBlockSize { - fmt.Fprintf(tabber, "%s\t", getFormattedBlockSize(b)) + fmt.Fprintf(tabber, "%s\t", listblocks.GetFormattedBlockSize(b)) } if cfg.showLabels { @@ -335,16 +188,3 @@ func printMetas(metas map[ulid.ULID]*metadata.Meta, deletedTimes map[ulid.ULID]t fmt.Fprintln(tabber) } } - -func getFormattedBlockSize(b *metadata.Meta) string { - if len(b.Thanos.Files) == 0 { - return "" - } - - size := uint64(0) - for _, f := range b.Thanos.Files { - size += uint64(f.SizeBytes) - } - - return humanize.IBytes(size) -} From ef835a9d5b67bc8afc33ea5293640618618aca6a Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Mon, 31 Jan 2022 10:01:34 +0100 Subject: [PATCH 046/168] Change default settings for memcached client (#959) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 16 +++++++++++++ cmd/mimir/help-all.txt.tmpl | 24 +++++++++---------- cmd/mimir/help.txt.tmpl | 24 +++++++++---------- .../configuration/config-file-reference.md | 6 ++--- .../mimir-tests/test-defaults-generated.yaml | 8 ------- ...est-disable-chunk-streaming-generated.yaml | 10 -------- .../test-query-sharding-generated.yaml | 10 -------- .../test-shuffle-sharding-generated.yaml | 10 -------- .../test-storage-azure-generated.yaml | 10 -------- .../test-storage-gcs-generated.yaml | 10 -------- .../test-storage-s3-generated.yaml | 10 -------- operations/mimir/config.libsonnet | 6 ----- pkg/cache/memcache_config.go | 6 ++--- 13 files changed, 46 insertions(+), 104 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 978a2af066d..4506232f2bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -222,6 +222,22 @@ * [CHANGE] Changed the default value of `blocks-storage.bucket-store.ignore-deletion-marks-delay` from 6h to 1h. #892 * [CHANGE] Querier/ruler/query-frontend: the experimental `-querier.at-modifier-enabled` CLI flag has been removed and the PromQL `@` modifier is always enabled. #941 * [CHANGE] Ruler: `-ruler.alertmanager-use-v2` now defaults to `true`. #954 +* [CHANGE] Changed default settings for memcached clients: #959 + * The default value for the following config options has changed from `10000` to `25000`: + * `-blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size` + * `-blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size` + * `-blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size` + * `-frontend.results-cache.memcached.max-async-buffer-size` + * The default value for the following config options has changed from `0` (unlimited) to `100`: + * `-blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size` + * `-blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size` + * `-blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size` + * `-frontend.results-cache.memcached.max-get-multi-batch-size` + * The default value for the following config options has changed from `16` to `100`: + * `-blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections` + * `-blocks-storage.bucket-store.index-cache.memcached.max-idle-connections` + * `-blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections` + * `-frontend.results-cache.memcached.max-idle-connections` * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 6cf7e598d81..6286cf6dedb 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -274,15 +274,15 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.chunks-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 10000) + The maximum number of enqueued asynchronous operations allowed. (default 25000) -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency int The maximum number of concurrent asynchronous operations can occur. (default 50) -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency int The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 16) + The maximum number of idle connections that will be maintained per address. (default 100) -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.chunks-cache.memcached.timeout duration @@ -304,15 +304,15 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.index-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 10000) + The maximum number of enqueued asynchronous operations allowed. (default 25000) -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency int The maximum number of concurrent asynchronous operations can occur. (default 50) -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency int The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 16) + The maximum number of idle connections that will be maintained per address. (default 100) -blocks-storage.bucket-store.index-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.index-cache.memcached.timeout duration @@ -340,15 +340,15 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.metadata-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 10000) + The maximum number of enqueued asynchronous operations allowed. (default 25000) -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency int The maximum number of concurrent asynchronous operations can occur. (default 50) -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency int The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 16) + The maximum number of idle connections that will be maintained per address. (default 100) -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.metadata-cache.memcached.timeout duration @@ -876,15 +876,15 @@ Usage of ./cmd/mimir/mimir: -frontend.results-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -frontend.results-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 10000) + The maximum number of enqueued asynchronous operations allowed. (default 25000) -frontend.results-cache.memcached.max-async-concurrency int The maximum number of concurrent asynchronous operations can occur. (default 50) -frontend.results-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) -frontend.results-cache.memcached.max-get-multi-concurrency int The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) -frontend.results-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 16) + The maximum number of idle connections that will be maintained per address. (default 100) -frontend.results-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -frontend.results-cache.memcached.timeout duration diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 1717354a4a5..7379d2d8e33 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -274,15 +274,15 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.chunks-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 10000) + The maximum number of enqueued asynchronous operations allowed. (default 25000) -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency int The maximum number of concurrent asynchronous operations can occur. (default 50) -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency int The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 16) + The maximum number of idle connections that will be maintained per address. (default 100) -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.chunks-cache.memcached.timeout duration @@ -304,15 +304,15 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.index-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 10000) + The maximum number of enqueued asynchronous operations allowed. (default 25000) -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency int The maximum number of concurrent asynchronous operations can occur. (default 50) -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency int The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 16) + The maximum number of idle connections that will be maintained per address. (default 100) -blocks-storage.bucket-store.index-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.index-cache.memcached.timeout duration @@ -340,15 +340,15 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.metadata-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 10000) + The maximum number of enqueued asynchronous operations allowed. (default 25000) -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency int The maximum number of concurrent asynchronous operations can occur. (default 50) -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency int The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 16) + The maximum number of idle connections that will be maintained per address. (default 100) -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.metadata-cache.memcached.timeout duration @@ -808,15 +808,15 @@ Usage of ./cmd/mimir/mimir: -frontend.results-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -frontend.results-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 10000) + The maximum number of enqueued asynchronous operations allowed. (default 25000) -frontend.results-cache.memcached.max-async-concurrency int The maximum number of concurrent asynchronous operations can occur. (default 50) -frontend.results-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. + The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) -frontend.results-cache.memcached.max-get-multi-concurrency int The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) -frontend.results-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 16) + The maximum number of idle connections that will be maintained per address. (default 100) -frontend.results-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -frontend.results-cache.memcached.timeout duration diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 4f42b55981d..754228d8791 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -3529,7 +3529,7 @@ The `memcached_config` configures the Memcached-based caching backend. The suppo # The maximum number of idle connections that will be maintained per address. # CLI flag: -.memcached.max-idle-connections -[max_idle_connections: | default = 16] +[max_idle_connections: | default = 100] # The maximum number of concurrent asynchronous operations can occur. # CLI flag: -.memcached.max-async-concurrency @@ -3537,7 +3537,7 @@ The `memcached_config` configures the Memcached-based caching backend. The suppo # The maximum number of enqueued asynchronous operations allowed. # CLI flag: -.memcached.max-async-buffer-size -[max_async_buffer_size: | default = 10000] +[max_async_buffer_size: | default = 25000] # The maximum number of concurrent connections running get operations. If set to # 0, concurrency is unlimited. @@ -3549,7 +3549,7 @@ The `memcached_config` configures the Memcached-based caching backend. The suppo # fetched concurrently, honoring the max concurrency. If set to 0, the max batch # size is unlimited. # CLI flag: -.memcached.max-get-multi-batch-size -[max_get_multi_batch_size: | default = 0] +[max_get_multi_batch_size: | default = 100] # The maximum size of an item stored in memcached. Bigger items are not stored. # If set to 0, no maximum size is enforced. diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml index 5abe80d4707..4ab341bafaa 100644 --- a/operations/mimir-tests/test-defaults-generated.yaml +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -747,9 +747,7 @@ spec: - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1317,9 +1315,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 @@ -1327,9 +1323,7 @@ spec: - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 @@ -1339,9 +1333,7 @@ spec: - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index 7db1745d000..83ac9e35bf3 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -824,9 +824,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1062,9 +1060,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1646,9 +1642,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 @@ -1656,9 +1650,7 @@ spec: - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 @@ -1668,9 +1660,7 @@ spec: - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index 28ed7ee185b..2d4c69b64b1 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -823,9 +823,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1065,9 +1063,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1649,9 +1645,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 @@ -1659,9 +1653,7 @@ spec: - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 @@ -1671,9 +1663,7 @@ spec: - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index be949ffad16..7da2e128857 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -824,9 +824,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1067,9 +1065,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1656,9 +1652,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 @@ -1666,9 +1660,7 @@ spec: - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 @@ -1678,9 +1670,7 @@ spec: - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index a24dd4d237e..e0ce04a4a66 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -826,9 +826,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1066,9 +1064,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1660,9 +1656,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 @@ -1670,9 +1664,7 @@ spec: - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 @@ -1682,9 +1674,7 @@ spec: - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index ae8cbd31647..c7f5bc233d9 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -823,9 +823,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1061,9 +1059,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1645,9 +1641,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 @@ -1655,9 +1649,7 @@ spec: - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 @@ -1667,9 +1659,7 @@ spec: - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index 3e9d44f8d3e..77b141382f5 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -823,9 +823,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1062,9 +1060,7 @@ spec: - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb @@ -1652,9 +1648,7 @@ spec: - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 - -blocks-storage.bucket-store.chunks-cache.backend=memcached - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 @@ -1662,9 +1656,7 @@ spec: - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 @@ -1674,9 +1666,7 @@ spec: - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 - -blocks-storage.bucket-store.metadata-cache.backend=memcached - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size=25000 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index edabcfbbcd9..e4cb43ab93b 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -408,9 +408,7 @@ 'blocks-storage.bucket-store.index-cache.memcached.addresses': 'dnssrvnoa+memcached-index-queries.%(namespace)s.svc.cluster.local:11211' % $._config, 'blocks-storage.bucket-store.index-cache.memcached.timeout': '200ms', 'blocks-storage.bucket-store.index-cache.memcached.max-item-size': $._config.memcached_index_queries_max_item_size_mb * 1024 * 1024, - 'blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size': '25000', 'blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency': '50', - 'blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size': '100', } else {} ) + ( if $._config.memcached_chunks_enabled then { @@ -418,9 +416,7 @@ 'blocks-storage.bucket-store.chunks-cache.memcached.addresses': 'dnssrvnoa+memcached.%(namespace)s.svc.cluster.local:11211' % $._config, 'blocks-storage.bucket-store.chunks-cache.memcached.timeout': '200ms', 'blocks-storage.bucket-store.chunks-cache.memcached.max-item-size': $._config.memcached_chunks_max_item_size_mb * 1024 * 1024, - 'blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size': '25000', 'blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency': '50', - 'blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size': '100', } else {} ), @@ -429,9 +425,7 @@ 'blocks-storage.bucket-store.metadata-cache.memcached.addresses': 'dnssrvnoa+memcached-metadata.%(namespace)s.svc.cluster.local:11211' % $._config, 'blocks-storage.bucket-store.metadata-cache.memcached.timeout': '200ms', 'blocks-storage.bucket-store.metadata-cache.memcached.max-item-size': $._config.memcached_metadata_max_item_size_mb * 1024 * 1024, - 'blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size': '25000', 'blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency': '50', - 'blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size': '100', } else {}, bucket_index_config:: if $._config.bucket_index_enabled then { diff --git a/pkg/cache/memcache_config.go b/pkg/cache/memcache_config.go index b4f3dbdcf89..92e00fffbea 100644 --- a/pkg/cache/memcache_config.go +++ b/pkg/cache/memcache_config.go @@ -33,11 +33,11 @@ type MemcachedConfig struct { func (cfg *MemcachedConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { f.StringVar(&cfg.Addresses, prefix+"addresses", "", "Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that).") f.DurationVar(&cfg.Timeout, prefix+"timeout", 100*time.Millisecond, "The socket read/write timeout.") - f.IntVar(&cfg.MaxIdleConnections, prefix+"max-idle-connections", 16, "The maximum number of idle connections that will be maintained per address.") + f.IntVar(&cfg.MaxIdleConnections, prefix+"max-idle-connections", 100, "The maximum number of idle connections that will be maintained per address.") f.IntVar(&cfg.MaxAsyncConcurrency, prefix+"max-async-concurrency", 50, "The maximum number of concurrent asynchronous operations can occur.") - f.IntVar(&cfg.MaxAsyncBufferSize, prefix+"max-async-buffer-size", 10000, "The maximum number of enqueued asynchronous operations allowed.") + f.IntVar(&cfg.MaxAsyncBufferSize, prefix+"max-async-buffer-size", 25000, "The maximum number of enqueued asynchronous operations allowed.") f.IntVar(&cfg.MaxGetMultiConcurrency, prefix+"max-get-multi-concurrency", 100, "The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited.") - f.IntVar(&cfg.MaxGetMultiBatchSize, prefix+"max-get-multi-batch-size", 0, "The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited.") + f.IntVar(&cfg.MaxGetMultiBatchSize, prefix+"max-get-multi-batch-size", 100, "The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited.") f.IntVar(&cfg.MaxItemSize, prefix+"max-item-size", 1024*1024, "The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced.") } From e4f0e0928adcfbcc67f2519af913899b7c7764b0 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Mon, 31 Jan 2022 10:22:53 +0100 Subject: [PATCH 047/168] Removed -querier.worker-match-max-concurrent and -querier.worker-parallelism (#958) * Removed -querier.worker-match-max-concurrent and -querier.worker-parallelism in favour of -querier.max-concurrent Signed-off-by: Marco Pracucci * Removed references to match_max_concurrent too Signed-off-by: Marco Pracucci * Fixed typo in playbooks Signed-off-by: Marco Pracucci --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 4 -- cmd/mimir/help.txt.tmpl | 2 - .../tsdb-blocks-storage-s3/config/mimir.yaml | 1 - docs/sources/configuration/arguments.md | 12 +---- .../configuration/config-file-reference.md | 10 ---- ...single-process-config-blocks-gossip-1.yaml | 3 -- ...single-process-config-blocks-gossip-2.yaml | 3 -- .../single-process-config-blocks-tls.yaml | 1 - .../single-process-config-blocks.yaml | 3 -- .../operations/scalable-query-frontend.md | 6 --- integration/e2emimir/services.go | 4 +- operations/mimir-mixin/docs/playbooks.md | 2 +- .../mimir-tests/test-defaults-generated.yaml | 1 - ...est-disable-chunk-streaming-generated.yaml | 1 - .../test-query-sharding-generated.yaml | 1 - .../test-shuffle-sharding-generated.yaml | 1 - .../test-storage-azure-generated.yaml | 1 - .../test-storage-gcs-generated.yaml | 1 - .../test-storage-s3-generated.yaml | 1 - operations/mimir/querier.libsonnet | 2 - operations/mimir/query-scheduler.libsonnet | 2 - pkg/frontend/frontend_test.go | 11 ++-- pkg/frontend/v1/frontend_test.go | 52 ++++++++----------- pkg/querier/worker/worker.go | 40 +++++--------- pkg/querier/worker/worker_test.go | 26 ++-------- 26 files changed, 47 insertions(+), 145 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4506232f2bc..0a3372de5c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -238,6 +238,7 @@ * `-blocks-storage.bucket-store.index-cache.memcached.max-idle-connections` * `-blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections` * `-frontend.results-cache.memcached.max-idle-connections` +* [CHANGE] Querier: removed `-querier.worker-match-max-concurrent` and `-querier.worker-parallelism` CLI flags (and their respective YAML config options). Mimir now behaves like if `-querier.worker-match-max-concurrent` is always enabled and you should configure the max concurrency per querier process using `-querier.max-concurrent` instead. #958 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 6286cf6dedb..3a6c2abedf7 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -1189,10 +1189,6 @@ Usage of ./cmd/mimir/mimir: Override the expected name on the server certificate. -querier.timeout duration The timeout for a query. This config option should be set on query-frontend too when query sharding is enabled. (default 2m0s) - -querier.worker-match-max-concurrent - Force worker concurrency to match the -querier.max-concurrent option. Overrides querier.worker-parallelism. - -querier.worker-parallelism int - Number of simultaneous queries to process per query-frontend or query-scheduler. (default 10) -query-frontend.querier-forget-delay duration If a querier disconnects without sending notification about graceful shutdown, the query-frontend will keep the querier in the tenant's shard until the forget delay has passed. This feature is useful to reduce the blast radius when shuffle-sharding is enabled. -query-scheduler.grpc-client-config.backoff-max-period duration diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 7379d2d8e33..f8f516e1668 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -1091,8 +1091,6 @@ Usage of ./cmd/mimir/mimir: Override the expected name on the server certificate. -querier.timeout duration The timeout for a query. This config option should be set on query-frontend too when query sharding is enabled. (default 2m0s) - -querier.worker-match-max-concurrent - Force worker concurrency to match the -querier.max-concurrent option. Overrides querier.worker-parallelism. -query-scheduler.grpc-client-config.backoff-max-period duration Maximum delay when backing off. (default 10s) -query-scheduler.grpc-client-config.backoff-min-period duration diff --git a/development/tsdb-blocks-storage-s3/config/mimir.yaml b/development/tsdb-blocks-storage-s3/config/mimir.yaml index 314c7c27dd4..a67fc875b1c 100644 --- a/development/tsdb-blocks-storage-s3/config/mimir.yaml +++ b/development/tsdb-blocks-storage-s3/config/mimir.yaml @@ -147,7 +147,6 @@ frontend: frontend_worker: frontend_address: "query-frontend:9007" - match_max_concurrent: true # By setting scheduler_address, querier worker would use scheduler instead of frontend. # scheduler_address: "query-scheduler:9012" diff --git a/docs/sources/configuration/arguments.md b/docs/sources/configuration/arguments.md index 6b3589527b8..fac6ec0b379 100644 --- a/docs/sources/configuration/arguments.md +++ b/docs/sources/configuration/arguments.md @@ -16,7 +16,7 @@ Duration arguments should be specified with a unit like `5s` or `3h`. Valid time - `-querier.max-concurrent` The maximum number of top-level PromQL queries that will execute at the same time, per querier process. - If using the query frontend, this should be set to at least (`-querier.worker-parallelism` \* number of query frontend replicas). Otherwise queries may queue in the queriers and not the frontend, which will affect QoS. Alternatively, consider using `-querier.worker-match-max-concurrent` to force worker parallelism to match `-querier.max-concurrent`. + If using the query-frontend or query-scheduler, this also set the number of query execution workers (running inside the a querier process) which will connect respectively to the query-frontend or query-scheduler. - `-querier.timeout` @@ -40,16 +40,6 @@ The next three options only apply when the querier is used together with the Que How often the workers will query DNS to re-check where the query frontend or query scheduler is. -- `-querier.worker-parallelism` - - Number of simultaneous queries to process, per query frontend or scheduler. - See note on `-querier.max-concurrent` - -- `-querier.worker-match-max-concurrent` - - Force worker concurrency to match the -querier.max-concurrent option. Overrides `-querier.worker-parallelism`. - See note on `-querier.max-concurrent` - ## Querier and Ruler The ingester query API was improved over time, but defaults to the old behaviour for backwards-compatibility. For best results both of these next two flags should be set to `true`: diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 754228d8791..1fa4ac05546 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -2042,16 +2042,6 @@ The `frontend_worker_config` configures the worker - running within the querier # CLI flag: -querier.dns-lookup-period [dns_lookup_duration: | default = 10s] -# Number of simultaneous queries to process per query-frontend or -# query-scheduler. -# CLI flag: -querier.worker-parallelism -[parallelism: | default = 10] - -# Force worker concurrency to match the -querier.max-concurrent option. -# Overrides querier.worker-parallelism. -# CLI flag: -querier.worker-match-max-concurrent -[match_max_concurrent: | default = false] - # Querier ID, sent to frontend service to identify requests from the same # querier. Defaults to hostname. # CLI flag: -querier.id diff --git a/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml b/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml index 805062cc1d0..5ef990078d0 100644 --- a/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml +++ b/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml @@ -83,9 +83,6 @@ store_gateway: kvstore: store: memberlist -frontend_worker: - match_max_concurrent: true - ruler: enable_api: true enable_sharding: true diff --git a/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml b/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml index 1291a41433e..203a0483f01 100644 --- a/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml +++ b/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml @@ -82,9 +82,6 @@ store_gateway: kvstore: store: memberlist -frontend_worker: - match_max_concurrent: true - ruler: enable_api: true enable_sharding: true diff --git a/docs/sources/configuration/single-process-config-blocks-tls.yaml b/docs/sources/configuration/single-process-config-blocks-tls.yaml index 884f8fa36a9..d4298222c0c 100644 --- a/docs/sources/configuration/single-process-config-blocks-tls.yaml +++ b/docs/sources/configuration/single-process-config-blocks-tls.yaml @@ -89,7 +89,6 @@ compactor: store: inmemory frontend_worker: - match_max_concurrent: true grpc_client_config: tls_cert_path: "client.crt" tls_key_path: "client.key" diff --git a/docs/sources/configuration/single-process-config-blocks.yaml b/docs/sources/configuration/single-process-config-blocks.yaml index dee71846357..fef1b645e90 100644 --- a/docs/sources/configuration/single-process-config-blocks.yaml +++ b/docs/sources/configuration/single-process-config-blocks.yaml @@ -81,9 +81,6 @@ compactor: kvstore: store: inmemory -frontend_worker: - match_max_concurrent: true - ruler: enable_api: true enable_sharding: false diff --git a/docs/sources/operations/scalable-query-frontend.md b/docs/sources/operations/scalable-query-frontend.md index 628e44afce2..963ddc9e0a9 100644 --- a/docs/sources/operations/scalable-query-frontend.md +++ b/docs/sources/operations/scalable-query-frontend.md @@ -23,12 +23,6 @@ For similar reasons scaling down the query frontend may cause a querier to not u This will lower effective resource utilization. Also, because individual queriers will be doing less work, this may cause increased queueing in the query frontends. -### Querier Max Concurrency - -To guarantee that querier doesn't receive more queries that it can handle at the same time, make sure to configure the querier to match its PromQL concurrency with number of connections. -This can be done by using `-querier.worker-match-max-concurrent=true` option, or `match_max_concurrent: true` field in `frontend_worker` section of YAML config file. -This allows the operator to freely scale the frontend or scheduler up and down without impacting the amount of work an individual querier is attempting to perform. - ### Query Scheduler Query scheduler is a service that moves the in-memory queue from query frontend to a separate component. diff --git a/integration/e2emimir/services.go b/integration/e2emimir/services.go index aee51eeb7c6..3e37966f4e4 100644 --- a/integration/e2emimir/services.go +++ b/integration/e2emimir/services.go @@ -109,7 +109,7 @@ func NewQuerierWithConfigFile(name, consulAddress, configFile string, flags map[ "-querier.frontend-client.backoff-min-period": "100ms", "-querier.frontend-client.backoff-max-period": "100ms", "-querier.frontend-client.backoff-retries": "1", - "-querier.worker-parallelism": "1", + "-querier.max-concurrent": "1", // Quickly detect query-frontend and query-scheduler when running it. "-querier.dns-lookup-period": "1s", // Store-gateway ring backend. @@ -312,7 +312,7 @@ func NewSingleBinary(name string, flags map[string]string, image string, otherPo "-querier.frontend-client.backoff-min-period": "100ms", "-querier.frontend-client.backoff-max-period": "100ms", "-querier.frontend-client.backoff-retries": "1", - "-querier.worker-parallelism": "1", + "-querier.max-concurrent": "1", // Distributor. "-distributor.replication-factor": "1", "-distributor.ring.store": "memberlist", diff --git a/operations/mimir-mixin/docs/playbooks.md b/operations/mimir-mixin/docs/playbooks.md index 2642bc05201..17996e1d302 100644 --- a/operations/mimir-mixin/docs/playbooks.md +++ b/operations/mimir-mixin/docs/playbooks.md @@ -194,7 +194,7 @@ How to **investigate**: - The cortex-gw may need to be scaled up. Use the `Mimir / Scaling` dashboard to check for CPU usage vs requests. - There could be a problem with authentication (eg. slow to run auth layer) - **`query-frontend`** - - The query-frontend may beed to be scaled up. If the Mimir cluster is running with the query-scheduler, the query-frontend can be scaled up with no side effects, otherwise the maximum number of query-frontend replicas should be the configured `-querier.worker-parallelism`. + - The query-frontend may need to be scaled up. If the Mimir cluster is running with the query-scheduler, the query-frontend can be scaled up with no side effects, otherwise the maximum number of query-frontend replicas should be the configured `-querier.max-concurrent`. - **`querier`** - Look at slow queries traces to find out where it's slow. - Typically, slowness either comes from running PromQL engine (`innerEval`) or fetching chunks from ingesters and/or store-gateways. diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml index 4ab341bafaa..149c547885c 100644 --- a/operations/mimir-tests/test-defaults-generated.yaml +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -763,7 +763,6 @@ spec: - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h - -querier.query-store-for-labels-enabled=true - - -querier.worker-parallelism=4 - -ring.heartbeat-timeout=10m - -ring.prefix= - -runtime-config.file=/etc/mimir/overrides.yaml diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index 83ac9e35bf3..d9ed7c8ad1a 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -841,7 +841,6 @@ spec: - -querier.query-store-after=12h - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - -runtime-config.file=/etc/mimir/overrides.yaml diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index 2d4c69b64b1..7fadb4ec090 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -840,7 +840,6 @@ spec: - -querier.query-store-after=12h - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - -runtime-config.file=/etc/mimir/overrides.yaml diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index 7da2e128857..42280f82566 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -843,7 +843,6 @@ spec: - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - -querier.shuffle-sharding-ingesters-lookback-period=13h - - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - -runtime-config.file=/etc/mimir/overrides.yaml diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index e0ce04a4a66..823bde61b0b 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -842,7 +842,6 @@ spec: - -querier.query-store-after=12h - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - -runtime-config.file=/etc/mimir/overrides.yaml diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index c7f5bc233d9..fc39b2d1345 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -840,7 +840,6 @@ spec: - -querier.query-store-after=12h - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - -runtime-config.file=/etc/mimir/overrides.yaml diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index 77b141382f5..a1bca3cb48b 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -841,7 +841,6 @@ spec: - -querier.query-store-after=12h - -querier.query-store-for-labels-enabled=true - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 - - -querier.worker-match-max-concurrent=true - -ring.heartbeat-timeout=10m - -ring.prefix= - -runtime-config.file=/etc/mimir/overrides.yaml diff --git a/operations/mimir/querier.libsonnet b/operations/mimir/querier.libsonnet index 44ff9c9aa11..5cd1a9b5d30 100644 --- a/operations/mimir/querier.libsonnet +++ b/operations/mimir/querier.libsonnet @@ -24,8 +24,6 @@ // Limit query concurrency to prevent multi large queries causing an OOM. 'querier.max-concurrent': $._config.querier.concurrency, - // Limit to N/2 worker threads per frontend, as we have two frontends. - 'querier.worker-parallelism': $._config.querier.concurrency / $._config.queryFrontend.replicas, 'querier.frontend-address': 'query-frontend-discovery.%(namespace)s.svc.cluster.local:9095' % $._config, 'querier.frontend-client.grpc-max-send-msg-size': 100 << 20, diff --git a/operations/mimir/query-scheduler.libsonnet b/operations/mimir/query-scheduler.libsonnet index f9e89c0a3c3..9db417875a8 100644 --- a/operations/mimir/query-scheduler.libsonnet +++ b/operations/mimir/query-scheduler.libsonnet @@ -45,8 +45,6 @@ // Reconfigure querier and query-frontend to use scheduler. querier_args+:: if !$._config.query_scheduler_enabled then {} else { - 'querier.worker-match-max-concurrent': 'true', - 'querier.worker-parallelism': null, // Disabled since we set worker-match-max-concurrent. 'querier.frontend-address': null, 'querier.scheduler-address': 'query-scheduler-discovery.%(namespace)s.svc.cluster.local:9095' % $._config, }, diff --git a/pkg/frontend/frontend_test.go b/pkg/frontend/frontend_test.go index 4ccfc0c8536..34ac6b50bce 100644 --- a/pkg/frontend/frontend_test.go +++ b/pkg/frontend/frontend_test.go @@ -94,8 +94,7 @@ func TestFrontend_RequestHostHeaderWhenDownstreamURLIsConfigured(t *testing.T) { assert.NotEqual(t, downstreamReqHost, addr) } - testFrontend(t, config, nil, test, false, nil) - testFrontend(t, config, nil, test, true, nil) + testFrontend(t, config, nil, test, nil) } func TestFrontend_LogsSlowQueriesFormValues(t *testing.T) { @@ -157,7 +156,7 @@ func TestFrontend_LogsSlowQueriesFormValues(t *testing.T) { assert.Contains(t, logs, "param_foo=bar") } - testFrontend(t, config, nil, test, false, l) + testFrontend(t, config, nil, test, l) } func TestFrontend_ReturnsRequestBodyTooLargeError(t *testing.T) { @@ -208,10 +207,10 @@ func TestFrontend_ReturnsRequestBodyTooLargeError(t *testing.T) { assert.Equal(t, http.StatusRequestEntityTooLarge, resp.StatusCode, string(b)) } - testFrontend(t, config, nil, test, false, nil) + testFrontend(t, config, nil, test, nil) } -func testFrontend(t *testing.T, config CombinedFrontendConfig, handler http.Handler, test func(addr string), matchMaxConcurrency bool, l log.Logger) { +func testFrontend(t *testing.T, config CombinedFrontendConfig, handler http.Handler, test func(addr string), l log.Logger) { logger := log.NewNopLogger() if l != nil { logger = l @@ -219,8 +218,6 @@ func testFrontend(t *testing.T, config CombinedFrontendConfig, handler http.Hand var workerConfig querier_worker.Config flagext.DefaultValues(&workerConfig) - workerConfig.Parallelism = 1 - workerConfig.MatchMaxConcurrency = matchMaxConcurrency workerConfig.MaxConcurrentRequests = 1 // localhost:0 prevents firewall warnings on Mac OS X. diff --git a/pkg/frontend/v1/frontend_test.go b/pkg/frontend/v1/frontend_test.go index 4696303089e..da8b9e42e39 100644 --- a/pkg/frontend/v1/frontend_test.go +++ b/pkg/frontend/v1/frontend_test.go @@ -66,8 +66,7 @@ func TestFrontend(t *testing.T) { assert.Equal(t, "Hello World", string(body)) } - testFrontend(t, defaultFrontendConfig(), handler, test, false, nil, nil) - testFrontend(t, defaultFrontendConfig(), handler, test, true, nil, nil) + testFrontend(t, defaultFrontendConfig(), handler, test, nil, nil) } func TestFrontendPropagateTrace(t *testing.T) { @@ -116,8 +115,7 @@ func TestFrontendPropagateTrace(t *testing.T) { // Query should do one call. assert.Equal(t, traceID, <-observedTraceID) } - testFrontend(t, defaultFrontendConfig(), handler, test, false, nil, nil) - testFrontend(t, defaultFrontendConfig(), handler, test, true, nil, nil) + testFrontend(t, defaultFrontendConfig(), handler, test, nil, nil) } func TestFrontendCheckReady(t *testing.T) { @@ -181,9 +179,7 @@ func TestFrontendCancel(t *testing.T) { time.Sleep(100 * time.Millisecond) assert.Equal(t, int32(1), tries.Load()) } - testFrontend(t, defaultFrontendConfig(), handler, test, false, nil, nil) - tries.Store(0) - testFrontend(t, defaultFrontendConfig(), handler, test, true, nil, nil) + testFrontend(t, defaultFrontendConfig(), handler, test, nil, nil) } func TestFrontendMetricsCleanup(t *testing.T) { @@ -192,44 +188,42 @@ func TestFrontendMetricsCleanup(t *testing.T) { require.NoError(t, err) }) - for _, matchMaxConcurrency := range []bool{false, true} { - reg := prometheus.NewPedanticRegistry() + reg := prometheus.NewPedanticRegistry() - test := func(addr string, fr *Frontend) { - req, err := http.NewRequest("GET", fmt.Sprintf("http://%s/", addr), nil) - require.NoError(t, err) - err = user.InjectOrgIDIntoHTTPRequest(user.InjectOrgID(context.Background(), "1"), req) - require.NoError(t, err) + test := func(addr string, fr *Frontend) { + req, err := http.NewRequest("GET", fmt.Sprintf("http://%s/", addr), nil) + require.NoError(t, err) + err = user.InjectOrgIDIntoHTTPRequest(user.InjectOrgID(context.Background(), "1"), req) + require.NoError(t, err) - resp, err := http.DefaultClient.Do(req) - require.NoError(t, err) - require.Equal(t, 200, resp.StatusCode) - defer resp.Body.Close() + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, 200, resp.StatusCode) + defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - require.NoError(t, err) + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) - assert.Equal(t, "Hello World", string(body)) + assert.Equal(t, "Hello World", string(body)) - require.NoError(t, testutil.GatherAndCompare(reg, strings.NewReader(` + require.NoError(t, testutil.GatherAndCompare(reg, strings.NewReader(` # HELP cortex_query_frontend_queue_length Number of queries in the queue. # TYPE cortex_query_frontend_queue_length gauge cortex_query_frontend_queue_length{user="1"} 0 `), "cortex_query_frontend_queue_length")) - fr.cleanupInactiveUserMetrics("1") + fr.cleanupInactiveUserMetrics("1") - require.NoError(t, testutil.GatherAndCompare(reg, strings.NewReader(` + require.NoError(t, testutil.GatherAndCompare(reg, strings.NewReader(` # HELP cortex_query_frontend_queue_length Number of queries in the queue. # TYPE cortex_query_frontend_queue_length gauge `), "cortex_query_frontend_queue_length")) - } - - testFrontend(t, defaultFrontendConfig(), handler, test, matchMaxConcurrency, nil, reg) } + + testFrontend(t, defaultFrontendConfig(), handler, test, nil, reg) } -func testFrontend(t *testing.T, config Config, handler http.Handler, test func(addr string, frontend *Frontend), matchMaxConcurrency bool, l log.Logger, reg prometheus.Registerer) { +func testFrontend(t *testing.T, config Config, handler http.Handler, test func(addr string, frontend *Frontend), l log.Logger, reg prometheus.Registerer) { logger := log.NewNopLogger() if l != nil { logger = l @@ -237,8 +231,6 @@ func testFrontend(t *testing.T, config Config, handler http.Handler, test func(a var workerConfig querier_worker.Config flagext.DefaultValues(&workerConfig) - workerConfig.Parallelism = 1 - workerConfig.MatchMaxConcurrency = matchMaxConcurrency workerConfig.MaxConcurrentRequests = 1 // localhost:0 prevents firewall warnings on Mac OS X. diff --git a/pkg/querier/worker/worker.go b/pkg/querier/worker/worker.go index 33f226db31f..a93ad93dee7 100644 --- a/pkg/querier/worker/worker.go +++ b/pkg/querier/worker/worker.go @@ -25,15 +25,11 @@ import ( ) type Config struct { - FrontendAddress string `yaml:"frontend_address"` - SchedulerAddress string `yaml:"scheduler_address"` - DNSLookupPeriod time.Duration `yaml:"dns_lookup_duration" category:"advanced"` - - Parallelism int `yaml:"parallelism" category:"advanced"` - MatchMaxConcurrency bool `yaml:"match_max_concurrent"` - MaxConcurrentRequests int `yaml:"-"` // Must be same as passed to PromQL Engine. - - QuerierID string `yaml:"id" category:"advanced"` + FrontendAddress string `yaml:"frontend_address"` + SchedulerAddress string `yaml:"scheduler_address"` + DNSLookupPeriod time.Duration `yaml:"dns_lookup_duration" category:"advanced"` + MaxConcurrentRequests int `yaml:"-"` // Must be same as passed to PromQL Engine. + QuerierID string `yaml:"id" category:"advanced"` GRPCClientConfig grpcclient.Config `yaml:"grpc_client_config"` } @@ -41,11 +37,7 @@ type Config struct { func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.StringVar(&cfg.SchedulerAddress, "querier.scheduler-address", "", "Hostname (and port) of scheduler that querier will periodically resolve, connect to and receive queries from. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint.") f.StringVar(&cfg.FrontendAddress, "querier.frontend-address", "", "Address of query frontend service, in host:port format. If -querier.scheduler-address is set as well, querier will use scheduler instead. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint.") - f.DurationVar(&cfg.DNSLookupPeriod, "querier.dns-lookup-period", 10*time.Second, "How often to query DNS for query-frontend or query-scheduler address.") - - f.IntVar(&cfg.Parallelism, "querier.worker-parallelism", 10, "Number of simultaneous queries to process per query-frontend or query-scheduler.") - f.BoolVar(&cfg.MatchMaxConcurrency, "querier.worker-match-max-concurrent", false, "Force worker concurrency to match the -querier.max-concurrent option. Overrides querier.worker-parallelism.") f.StringVar(&cfg.QuerierID, "querier.id", "", "Querier ID, sent to frontend service to identify requests from the same querier. Defaults to hostname.") cfg.GRPCClientConfig.RegisterFlagsWithPrefix("querier.frontend-client", f) @@ -226,20 +218,14 @@ func (w *querierWorker) resetConcurrency() { index := 0 for _, m := range w.managers { - concurrency := 0 - - if w.cfg.MatchMaxConcurrency { - concurrency = w.cfg.MaxConcurrentRequests / len(w.managers) - - // If max concurrency does not evenly divide into our frontends a subset will be chosen - // to receive an extra connection. Frontend addresses were shuffled above so this will be a - // random selection of frontends. - if index < w.cfg.MaxConcurrentRequests%len(w.managers) { - level.Warn(w.log).Log("msg", "max concurrency is not evenly divisible across targets, adding an extra connection", "addr", m.address) - concurrency++ - } - } else { - concurrency = w.cfg.Parallelism + concurrency := w.cfg.MaxConcurrentRequests / len(w.managers) + + // If max concurrency does not evenly divide into our frontends a subset will be chosen + // to receive an extra connection. Frontend addresses were shuffled above so this will be a + // random selection of frontends. + if index < w.cfg.MaxConcurrentRequests%len(w.managers) { + level.Warn(w.log).Log("msg", "max concurrency is not evenly divisible across targets, adding an extra connection", "addr", m.address) + concurrency++ } // If concurrency is 0 then MaxConcurrentRequests is less than the total number of diff --git a/pkg/querier/worker/worker_test.go b/pkg/querier/worker/worker_test.go index feabb2aa2a1..6f82851d591 100644 --- a/pkg/querier/worker/worker_test.go +++ b/pkg/querier/worker/worker_test.go @@ -22,53 +22,33 @@ import ( func TestResetConcurrency(t *testing.T) { tests := []struct { name string - parallelism int maxConcurrent int numTargets int expectedConcurrency int }{ { - name: "Test create at least one processor per target", - parallelism: 0, + name: "Test create at least one processor per target if max concurrent = 0", maxConcurrent: 0, numTargets: 2, expectedConcurrency: 2, }, { - name: "Test parallelism per target", - parallelism: 4, - maxConcurrent: 0, - numTargets: 2, - expectedConcurrency: 8, - }, - { - name: "Test Total Parallelism with a remainder", - parallelism: 1, + name: "Test max concurrent dividing with a remainder", maxConcurrent: 7, numTargets: 4, expectedConcurrency: 7, }, { - name: "Test Total Parallelism dividing evenly", - parallelism: 1, + name: "Test max concurrent dividing evenly", maxConcurrent: 6, numTargets: 2, expectedConcurrency: 6, }, - { - name: "Test Total Parallelism at least one worker per target", - parallelism: 1, - maxConcurrent: 3, - numTargets: 6, - expectedConcurrency: 6, - }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cfg := Config{ - Parallelism: tt.parallelism, - MatchMaxConcurrency: tt.maxConcurrent > 0, MaxConcurrentRequests: tt.maxConcurrent, } From 775097d409d1033091e37097deeaebabd0ad68d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Mon, 31 Jan 2022 10:31:16 +0100 Subject: [PATCH 048/168] Removed `-compactor.sharding-enabled`, changed default backend for compactor ring to memberlist. (#956) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Removed `-compactor.sharding-enabled`, changed default backend for compactor ring to memberlist. Signed-off-by: Peter Štibraný Co-authored-by: Marco Pracucci --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 6 +- cmd/mimir/help.txt.tmpl | 6 +- .../tsdb-blocks-storage-s3/config/mimir.yaml | 1 - docs/sources/blocks-storage/compactor.md | 11 +- .../configuration/config-file-reference.md | 11 +- ...single-process-config-blocks-gossip-1.yaml | 3 - ...single-process-config-blocks-gossip-2.yaml | 3 - .../single-process-config-blocks.yaml | 3 - integration/e2emimir/services.go | 1 - ...tegration_memberlist_single_binary_test.go | 37 ++--- integration/querier_test.go | 11 +- .../mimir-tests/test-defaults-generated.yaml | 2 +- ...est-disable-chunk-streaming-generated.yaml | 2 +- .../test-query-sharding-generated.yaml | 2 +- .../test-shuffle-sharding-generated.yaml | 2 +- .../test-storage-azure-generated.yaml | 2 +- .../test-storage-gcs-generated.yaml | 2 +- .../test-storage-s3-generated.yaml | 2 +- operations/mimir/compactor.libsonnet | 4 +- pkg/compactor/compactor.go | 131 +++++++----------- pkg/compactor/compactor_http.go | 5 - pkg/compactor/compactor_ring.go | 3 +- pkg/compactor/compactor_ring_test.go | 2 + pkg/compactor/compactor_test.go | 91 +++++------- pkg/compactor/split_merge_compactor_test.go | 2 +- 26 files changed, 134 insertions(+), 212 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a3372de5c0..233ff497495 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -222,6 +222,7 @@ * [CHANGE] Changed the default value of `blocks-storage.bucket-store.ignore-deletion-marks-delay` from 6h to 1h. #892 * [CHANGE] Querier/ruler/query-frontend: the experimental `-querier.at-modifier-enabled` CLI flag has been removed and the PromQL `@` modifier is always enabled. #941 * [CHANGE] Ruler: `-ruler.alertmanager-use-v2` now defaults to `true`. #954 +* [CHANGE] Compactor: Removed `-compactor.sharding-enabled` option. Sharding in compactor is now always enabled. Default value of `-compactor.ring.store` has changed from `consul` to `memberlist`. Default value of `-compactor.ring.wait-stability-min-duration` is now 0, which disables the feature. #956 * [CHANGE] Changed default settings for memcached clients: #959 * The default value for the following config options has changed from `10000` to `25000`: * `-blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size` diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 3a6c2abedf7..b251f9efc4a 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -592,15 +592,13 @@ Usage of ./cmd/mimir/mimir: -compactor.ring.prefix string The prefix for the keys in the store. Should end with a /. (default "collectors/") -compactor.ring.store string - Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "memberlist") -compactor.ring.wait-active-instance-timeout duration Timeout for waiting on compactor to become ACTIVE in the ring. (default 10m0s) -compactor.ring.wait-stability-max-duration duration Maximum time to wait for ring stability at startup. If the compactor ring keeps changing after this period of time, the compactor will start anyway. (default 5m0s) -compactor.ring.wait-stability-min-duration duration - Minimum time to wait for ring stability at startup. 0 to disable. (default 1m0s) - -compactor.sharding-enabled - Shard workload across multiple compactor instances. Sharding is required if you run multiple compactor instances, in order to coordinate compactions and avoid race conditions leading to the same tenant blocks simultaneously compacted by different instances. + Minimum time to wait for ring stability at startup. 0 to disable. -compactor.split-and-merge-shards int The number of shards to use when splitting blocks. 0 to disable splitting. -compactor.split-groups int diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index f8f516e1668..2e730e46283 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -560,15 +560,13 @@ Usage of ./cmd/mimir/mimir: -compactor.ring.prefix string The prefix for the keys in the store. Should end with a /. (default "collectors/") -compactor.ring.store string - Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "memberlist") -compactor.ring.wait-active-instance-timeout duration Timeout for waiting on compactor to become ACTIVE in the ring. (default 10m0s) -compactor.ring.wait-stability-max-duration duration Maximum time to wait for ring stability at startup. If the compactor ring keeps changing after this period of time, the compactor will start anyway. (default 5m0s) -compactor.ring.wait-stability-min-duration duration - Minimum time to wait for ring stability at startup. 0 to disable. (default 1m0s) - -compactor.sharding-enabled - Shard workload across multiple compactor instances. Sharding is required if you run multiple compactor instances, in order to coordinate compactions and avoid race conditions leading to the same tenant blocks simultaneously compacted by different instances. + Minimum time to wait for ring stability at startup. 0 to disable. -compactor.split-and-merge-shards int The number of shards to use when splitting blocks. 0 to disable splitting. -compactor.split-groups int diff --git a/development/tsdb-blocks-storage-s3/config/mimir.yaml b/development/tsdb-blocks-storage-s3/config/mimir.yaml index a67fc875b1c..ea196fbff22 100644 --- a/development/tsdb-blocks-storage-s3/config/mimir.yaml +++ b/development/tsdb-blocks-storage-s3/config/mimir.yaml @@ -121,7 +121,6 @@ compactor: compaction_interval: 30s data_dir: /tmp/mimir-compactor consistency_delay: 1m - sharding_enabled: true cleanup_interval: 1m tenant_cleanup_delay: 1m sharding_ring: diff --git a/docs/sources/blocks-storage/compactor.md b/docs/sources/blocks-storage/compactor.md index 06d0ca562fc..f0a4d66c9b1 100644 --- a/docs/sources/blocks-storage/compactor.md +++ b/docs/sources/blocks-storage/compactor.md @@ -233,19 +233,12 @@ compactor: # CLI flag: -compactor.disabled-tenants [disabled_tenants: | default = ""] - # Shard workload across multiple compactor instances. Sharding is required if - # you run multiple compactor instances, in order to coordinate compactions and - # avoid race conditions leading to the same tenant blocks simultaneously - # compacted by different instances. - # CLI flag: -compactor.sharding-enabled - [sharding_enabled: | default = false] - sharding_ring: kvstore: # Backend storage to use for the ring. Supported values are: consul, etcd, # inmemory, memberlist, multi. # CLI flag: -compactor.ring.store - [store: | default = "consul"] + [store: | default = "memberlist"] # The prefix for the keys in the store. Should end with a /. # CLI flag: -compactor.ring.prefix @@ -287,7 +280,7 @@ compactor: # Minimum time to wait for ring stability at startup. 0 to disable. # CLI flag: -compactor.ring.wait-stability-min-duration - [wait_stability_min_duration: | default = 1m] + [wait_stability_min_duration: | default = 0s] # Maximum time to wait for ring stability at startup. If the compactor ring # keeps changing after this period of time, the compactor will start anyway. diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 1fa4ac05546..a59ee7896be 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -3294,19 +3294,12 @@ The `compactor_config` configures the compactor service. # CLI flag: -compactor.disabled-tenants [disabled_tenants: | default = ""] -# Shard workload across multiple compactor instances. Sharding is required if -# you run multiple compactor instances, in order to coordinate compactions and -# avoid race conditions leading to the same tenant blocks simultaneously -# compacted by different instances. -# CLI flag: -compactor.sharding-enabled -[sharding_enabled: | default = false] - sharding_ring: kvstore: # Backend storage to use for the ring. Supported values are: consul, etcd, # inmemory, memberlist, multi. # CLI flag: -compactor.ring.store - [store: | default = "consul"] + [store: | default = "memberlist"] # The prefix for the keys in the store. Should end with a /. # CLI flag: -compactor.ring.prefix @@ -3348,7 +3341,7 @@ sharding_ring: # Minimum time to wait for ring stability at startup. 0 to disable. # CLI flag: -compactor.ring.wait-stability-min-duration - [wait_stability_min_duration: | default = 1m] + [wait_stability_min_duration: | default = 0s] # Maximum time to wait for ring stability at startup. If the compactor ring # keeps changing after this period of time, the compactor will start anyway. diff --git a/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml b/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml index 5ef990078d0..6ca08ba508b 100644 --- a/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml +++ b/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml @@ -98,6 +98,3 @@ ruler_storage: compactor: data_dir: /tmp/mimir/compactor - sharding_ring: - kvstore: - store: memberlist diff --git a/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml b/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml index 203a0483f01..a58b1cb0dc9 100644 --- a/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml +++ b/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml @@ -97,6 +97,3 @@ ruler_storage: compactor: data_dir: /tmp/mimir/compactor - sharding_ring: - kvstore: - store: memberlist diff --git a/docs/sources/configuration/single-process-config-blocks.yaml b/docs/sources/configuration/single-process-config-blocks.yaml index fef1b645e90..ba090b9abd0 100644 --- a/docs/sources/configuration/single-process-config-blocks.yaml +++ b/docs/sources/configuration/single-process-config-blocks.yaml @@ -77,9 +77,6 @@ blocks_storage: compactor: data_dir: /tmp/mimir/compactor - sharding_ring: - kvstore: - store: inmemory ruler: enable_api: true diff --git a/integration/e2emimir/services.go b/integration/e2emimir/services.go index 3e37966f4e4..5a9f83bca1e 100644 --- a/integration/e2emimir/services.go +++ b/integration/e2emimir/services.go @@ -285,7 +285,6 @@ func NewCompactorWithConfigFile(name, consulAddress, configFile string, flags ma "-target": "compactor", "-log.level": "warn", // Store-gateway ring backend. - "-compactor.sharding-enabled": "true", "-compactor.ring.store": "consul", "-compactor.ring.consul.hostname": consulAddress, // Startup quickly. diff --git a/integration/integration_memberlist_single_binary_test.go b/integration/integration_memberlist_single_binary_test.go index 52a429534df..e1b41ec64ee 100644 --- a/integration/integration_memberlist_single_binary_test.go +++ b/integration/integration_memberlist_single_binary_test.go @@ -2,6 +2,7 @@ // Provenance-includes-location: https://github.com/cortexproject/cortex/blob/master/integration/integration_memberlist_single_binary_test.go // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Cortex Authors. +//go:build requires_docker // +build requires_docker package integration @@ -91,29 +92,31 @@ func testSingleBinaryEnv(t *testing.T, tlsEnabled bool, flags map[string]string) require.NoError(t, mimir2.WaitSumMetrics(e2e.Equals(3), "memberlist_client_cluster_members_count")) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(3), "memberlist_client_cluster_members_count")) - // All Mimir servers should have 512+1 tokens, altogether 3 instances * (512 ingester tokens + 1 distributor token). - require.NoError(t, mimir1.WaitSumMetrics(e2e.Equals(3*(512+1)), "cortex_ring_tokens_total")) - require.NoError(t, mimir2.WaitSumMetrics(e2e.Equals(3*(512+1)), "cortex_ring_tokens_total")) - require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(3*(512+1)), "cortex_ring_tokens_total")) + // Each Mimir instance will use (512 ingester tokens + 1 distributor token + 512 compactor tokens). + tokensPerInstance := float64(512 + 1 + 512) + // 3 = number of instances. + require.NoError(t, mimir1.WaitSumMetrics(e2e.Equals(3*tokensPerInstance), "cortex_ring_tokens_total")) + require.NoError(t, mimir2.WaitSumMetrics(e2e.Equals(3*tokensPerInstance), "cortex_ring_tokens_total")) + require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(3*tokensPerInstance), "cortex_ring_tokens_total")) // All Mimir servers should initially have no tombstones; nobody has left yet. require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(0), "memberlist_client_kv_store_value_tombstones")) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(0), "memberlist_client_kv_store_value_tombstones")) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(0), "memberlist_client_kv_store_value_tombstones")) - // Tombstones should increase by two for each server that leaves (once for distributor and once for ingester) + // Tombstones should increase by three for each server that leaves (once for distributor, ingester and compactor ring) require.NoError(t, s.Stop(mimir1)) - require.NoError(t, mimir2.WaitSumMetrics(e2e.Equals(2*(512+1)), "cortex_ring_tokens_total")) + require.NoError(t, mimir2.WaitSumMetrics(e2e.Equals(2*tokensPerInstance), "cortex_ring_tokens_total")) require.NoError(t, mimir2.WaitSumMetrics(e2e.Equals(2), "memberlist_client_cluster_members_count")) - require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(2), "memberlist_client_kv_store_value_tombstones")) - require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(2*(512+1)), "cortex_ring_tokens_total")) + require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(3), "memberlist_client_kv_store_value_tombstones")) + require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(2*tokensPerInstance), "cortex_ring_tokens_total")) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(2), "memberlist_client_cluster_members_count")) - require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(2), "memberlist_client_kv_store_value_tombstones")) + require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(3), "memberlist_client_kv_store_value_tombstones")) require.NoError(t, s.Stop(mimir2)) - require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(1*(512+1)), "cortex_ring_tokens_total")) + require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(1*tokensPerInstance), "cortex_ring_tokens_total")) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(1), "memberlist_client_cluster_members_count")) - require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(4), "memberlist_client_kv_store_value_tombstones")) + require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(6), "memberlist_client_kv_store_value_tombstones")) require.NoError(t, s.Stop(mimir3)) } @@ -192,8 +195,8 @@ func TestSingleBinaryWithMemberlistScaling(t *testing.T) { // Sanity check the ring membership and give each instance time to see every other instance. for _, c := range instances { - // we expect 2*maxMimir to account for both the ingester and distributor rings - require.NoError(t, c.WaitSumMetrics(e2e.Equals(float64(maxMimir*2)), "cortex_ring_members")) + // we expect 3*maxMimir to account for both the ingester, distributor and compactor rings + require.NoError(t, c.WaitSumMetrics(e2e.Equals(float64(maxMimir*3)), "cortex_ring_members")) require.NoError(t, c.WaitSumMetrics(e2e.Equals(0), "memberlist_client_kv_store_value_tombstones")) } @@ -219,10 +222,10 @@ func TestSingleBinaryWithMemberlistScaling(t *testing.T) { // The logging is mildly spammy, but it has proven extremely useful for debugging convergence cases. // We don't use WaitSumMetrics [over all instances] here so we can log the per-instance metrics. - // These values are multiplied by two to account for the fact that both the - // ingester and distributor component make use of a ring - expectedRingMembers := float64(minMimir) * 2 - expectedTombstones := float64(maxMimir-minMimir) * 2 + // These values are multiplied by three to account for the fact that ingester + // distributor and compactor components use a ring. + expectedRingMembers := float64(minMimir) * 3 + expectedTombstones := float64(maxMimir-minMimir) * 3 require.Eventually(t, func() bool { ok := true diff --git a/integration/querier_test.go b/integration/querier_test.go index 6c5d4bc4280..1ef8c6ccd7c 100644 --- a/integration/querier_test.go +++ b/integration/querier_test.go @@ -378,6 +378,9 @@ func TestQuerierWithBlocksStorageRunningInSingleBinaryMode(t *testing.T) { "-store-gateway.sharding-ring.store": "consul", "-store-gateway.sharding-ring.consul.hostname": consul.NetworkHTTPEndpoint(), "-store-gateway.sharding-ring.replication-factor": "1", + "-compactor.ring.store": "consul", + "-compactor.ring.consul.hostname": consul.NetworkHTTPEndpoint(), + "-compactor.cleanup-interval": "2s", // Update bucket index often. }) // Start Mimir replicas. @@ -390,6 +393,7 @@ func TestQuerierWithBlocksStorageRunningInSingleBinaryMode(t *testing.T) { for _, replica := range cluster.Instances() { numTokensPerInstance := 512 // Ingesters ring. numTokensPerInstance++ // Distributors ring + numTokensPerInstance += 512 // Compactor ring. if testCfg.blocksShardingEnabled { numTokensPerInstance += 512 * 2 // Store-gateway ring (read both by the querier and store-gateway). } @@ -435,12 +439,7 @@ func TestQuerierWithBlocksStorageRunningInSingleBinaryMode(t *testing.T) { require.NoError(t, cluster.WaitSumMetrics(e2e.Equals(float64(3*cluster.NumInstances())), "cortex_ingester_memory_series_created_total")) require.NoError(t, cluster.WaitSumMetrics(e2e.Equals(float64(2*cluster.NumInstances())), "cortex_ingester_memory_series_removed_total")) - if testCfg.bucketIndexEnabled { - // Start the compactor to have the bucket index created before querying. We need to run the compactor - // as a separate service because it's currently not part of the single binary. - compactor := e2emimir.NewCompactor("compactor", consul.NetworkHTTPEndpoint(), flags, "") - require.NoError(t, s.StartAndWaitReady(compactor)) - } else { + if !testCfg.bucketIndexEnabled { // Wait until the querier has discovered the uploaded blocks (discovered both by the querier and store-gateway). require.NoError(t, cluster.WaitSumMetricsWithOptions(e2e.Equals(float64(2*cluster.NumInstances()*2)), []string{"cortex_blocks_meta_synced"}, e2e.WithLabelMatchers( labels.MustNewMatcher(labels.MatchEqual, "component", "querier")))) diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml index 149c547885c..ace2ef4aa61 100644 --- a/operations/mimir-tests/test-defaults-generated.yaml +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -918,7 +918,7 @@ spec: - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -compactor.ring.prefix= - -compactor.ring.store=consul - - -compactor.sharding-enabled=true + - -compactor.ring.wait-stability-min-duration=1m - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index d9ed7c8ad1a..71964d320bf 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -1244,7 +1244,7 @@ spec: - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -compactor.ring.prefix= - -compactor.ring.store=consul - - -compactor.sharding-enabled=true + - -compactor.ring.wait-stability-min-duration=1m - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index 7fadb4ec090..10538e97d0d 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -1247,7 +1247,7 @@ spec: - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -compactor.ring.prefix= - -compactor.ring.store=consul - - -compactor.sharding-enabled=true + - -compactor.ring.wait-stability-min-duration=1m - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index 42280f82566..b317ab0189d 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -1253,7 +1253,7 @@ spec: - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -compactor.ring.prefix= - -compactor.ring.store=consul - - -compactor.sharding-enabled=true + - -compactor.ring.wait-stability-min-duration=1m - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index 823bde61b0b..b55a372032c 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -1253,7 +1253,7 @@ spec: - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -compactor.ring.prefix= - -compactor.ring.store=consul - - -compactor.sharding-enabled=true + - -compactor.ring.wait-stability-min-duration=1m - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index fc39b2d1345..6977efa19f1 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -1243,7 +1243,7 @@ spec: - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -compactor.ring.prefix= - -compactor.ring.store=consul - - -compactor.sharding-enabled=true + - -compactor.ring.wait-stability-min-duration=1m - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index a1bca3cb48b..586d18bdcae 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -1249,7 +1249,7 @@ spec: - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -compactor.ring.prefix= - -compactor.ring.store=consul - - -compactor.sharding-enabled=true + - -compactor.ring.wait-stability-min-duration=1m - -compactor.split-and-merge-shards=0 - -compactor.split-groups=1 - -compactor.symbols-flushers-concurrency=4 diff --git a/operations/mimir/compactor.libsonnet b/operations/mimir/compactor.libsonnet index 632160009f7..1fca6eb79ac 100644 --- a/operations/mimir/compactor.libsonnet +++ b/operations/mimir/compactor.libsonnet @@ -53,11 +53,11 @@ 'compactor.max-closing-blocks-concurrency': '2', // Closing of blocks means writing index, which uses extra memory, hence only 2. 'compactor.symbols-flushers-concurrency': '4', - // Enable sharding. - 'compactor.sharding-enabled': true, + // Configure sharding. 'compactor.ring.store': 'consul', 'compactor.ring.consul.hostname': 'consul.%s.svc.cluster.local:8500' % $._config.namespace, 'compactor.ring.prefix': '', + 'compactor.ring.wait-stability-min-duration': '1m', // Wait until ring is stable before switching to ACTIVE. // Delete blocks sooner in order to keep the number of live blocks lower in the storage. 'compactor.deletion-delay': formatDuration( diff --git a/pkg/compactor/compactor.go b/pkg/compactor/compactor.go index c8c9cf3e8df..29980e8c801 100644 --- a/pkg/compactor/compactor.go +++ b/pkg/compactor/compactor.go @@ -103,8 +103,7 @@ type Config struct { DisabledTenants flagext.StringSliceCSV `yaml:"disabled_tenants" category:"advanced"` // Compactors sharding. - ShardingEnabled bool `yaml:"sharding_enabled"` - ShardingRing RingConfig `yaml:"sharding_ring"` + ShardingRing RingConfig `yaml:"sharding_ring"` CompactionJobsOrder string `yaml:"compaction_jobs_order" category:"advanced"` @@ -138,7 +137,6 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.IntVar(&cfg.CompactionConcurrency, "compactor.compaction-concurrency", 1, "Max number of concurrent compactions running.") f.DurationVar(&cfg.CleanupInterval, "compactor.cleanup-interval", 15*time.Minute, "How frequently compactor should run blocks cleanup and maintenance, as well as update the bucket index.") f.IntVar(&cfg.CleanupConcurrency, "compactor.cleanup-concurrency", 20, "Max number of tenants for which blocks cleanup and maintenance should run concurrently.") - f.BoolVar(&cfg.ShardingEnabled, "compactor.sharding-enabled", false, "Shard workload across multiple compactor instances. Sharding is required if you run multiple compactor instances, in order to coordinate compactions and avoid race conditions leading to the same tenant blocks simultaneously compacted by different instances.") f.StringVar(&cfg.CompactionJobsOrder, "compactor.compaction-jobs-order", CompactionOrderOldestFirst, fmt.Sprintf("The sorting to use when deciding which compaction jobs should run first for a given tenant. Supported values are: %s.", strings.Join(CompactionOrders, ", "))) f.DurationVar(&cfg.DeletionDelay, "compactor.deletion-delay", 12*time.Hour, "Time before a block marked for deletion is deleted from bucket. "+ "If not 0, blocks will be marked for deletion and compactor component will permanently delete blocks marked for deletion from the bucket. "+ @@ -387,70 +385,62 @@ func (c *MultitenantCompactor) starting(ctx context.Context) error { c.bucketClient = bucketindex.BucketWithGlobalMarkers(c.bucketClient) // Initialize the compactors ring if sharding is enabled. - if c.compactorCfg.ShardingEnabled { - lifecyclerCfg := c.compactorCfg.ShardingRing.ToLifecyclerConfig() - c.ringLifecycler, err = ring.NewLifecycler(lifecyclerCfg, ring.NewNoopFlushTransferer(), "compactor", CompactorRingKey, false, c.logger, prometheus.WrapRegistererWithPrefix("cortex_", c.registerer)) - if err != nil { - return errors.Wrap(err, "unable to initialize compactor ring lifecycler") - } + lifecyclerCfg := c.compactorCfg.ShardingRing.ToLifecyclerConfig() + c.ringLifecycler, err = ring.NewLifecycler(lifecyclerCfg, ring.NewNoopFlushTransferer(), "compactor", CompactorRingKey, false, c.logger, prometheus.WrapRegistererWithPrefix("cortex_", c.registerer)) + if err != nil { + return errors.Wrap(err, "unable to initialize compactor ring lifecycler") + } - c.ring, err = ring.New(lifecyclerCfg.RingConfig, "compactor", CompactorRingKey, c.logger, prometheus.WrapRegistererWithPrefix("cortex_", c.registerer)) - if err != nil { - return errors.Wrap(err, "unable to initialize compactor ring") - } + c.ring, err = ring.New(lifecyclerCfg.RingConfig, "compactor", CompactorRingKey, c.logger, prometheus.WrapRegistererWithPrefix("cortex_", c.registerer)) + if err != nil { + return errors.Wrap(err, "unable to initialize compactor ring") + } - c.ringSubservices, err = services.NewManager(c.ringLifecycler, c.ring) - if err == nil { - c.ringSubservicesWatcher = services.NewFailureWatcher() - c.ringSubservicesWatcher.WatchManager(c.ringSubservices) + c.ringSubservices, err = services.NewManager(c.ringLifecycler, c.ring) + if err == nil { + c.ringSubservicesWatcher = services.NewFailureWatcher() + c.ringSubservicesWatcher.WatchManager(c.ringSubservices) - err = services.StartManagerAndAwaitHealthy(ctx, c.ringSubservices) - } + err = services.StartManagerAndAwaitHealthy(ctx, c.ringSubservices) + } - if err != nil { - return errors.Wrap(err, "unable to start compactor ring dependencies") - } + if err != nil { + return errors.Wrap(err, "unable to start compactor ring dependencies") + } - // If sharding is enabled we should wait until this instance is - // ACTIVE within the ring. This MUST be done before starting the - // any other component depending on the users scanner, because the - // users scanner depends on the ring (to check whether an user belongs - // to this shard or not). - level.Info(c.logger).Log("msg", "waiting until compactor is ACTIVE in the ring") - - ctxWithTimeout, cancel := context.WithTimeout(ctx, c.compactorCfg.ShardingRing.WaitActiveInstanceTimeout) - defer cancel() - if err := ring.WaitInstanceState(ctxWithTimeout, c.ring, c.ringLifecycler.ID, ring.ACTIVE); err != nil { - level.Error(c.logger).Log("msg", "compactor failed to become ACTIVE in the ring", "err", err) - return err - } - level.Info(c.logger).Log("msg", "compactor is ACTIVE in the ring") - - // In the event of a cluster cold start or scale up of 2+ compactor instances at the same - // time, we may end up in a situation where each new compactor instance starts at a slightly - // different time and thus each one starts with a different state of the ring. It's better - // to just wait the ring stability for a short time. - if c.compactorCfg.ShardingRing.WaitStabilityMinDuration > 0 { - minWaiting := c.compactorCfg.ShardingRing.WaitStabilityMinDuration - maxWaiting := c.compactorCfg.ShardingRing.WaitStabilityMaxDuration - - level.Info(c.logger).Log("msg", "waiting until compactor ring topology is stable", "min_waiting", minWaiting.String(), "max_waiting", maxWaiting.String()) - if err := ring.WaitRingStability(ctx, c.ring, RingOp, minWaiting, maxWaiting); err != nil { - level.Warn(c.logger).Log("msg", "compactor ring topology is not stable after the max waiting time, proceeding anyway") - } else { - level.Info(c.logger).Log("msg", "compactor ring topology is stable") - } + // If sharding is enabled we should wait until this instance is + // ACTIVE within the ring. This MUST be done before starting the + // any other component depending on the users scanner, because the + // users scanner depends on the ring (to check whether an user belongs + // to this shard or not). + level.Info(c.logger).Log("msg", "waiting until compactor is ACTIVE in the ring") + + ctxWithTimeout, cancel := context.WithTimeout(ctx, c.compactorCfg.ShardingRing.WaitActiveInstanceTimeout) + defer cancel() + if err := ring.WaitInstanceState(ctxWithTimeout, c.ring, c.ringLifecycler.ID, ring.ACTIVE); err != nil { + level.Error(c.logger).Log("msg", "compactor failed to become ACTIVE in the ring", "err", err) + return err + } + level.Info(c.logger).Log("msg", "compactor is ACTIVE in the ring") + + // In the event of a cluster cold start or scale up of 2+ compactor instances at the same + // time, we may end up in a situation where each new compactor instance starts at a slightly + // different time and thus each one starts with a different state of the ring. It's better + // to just wait the ring stability for a short time. + if c.compactorCfg.ShardingRing.WaitStabilityMinDuration > 0 { + minWaiting := c.compactorCfg.ShardingRing.WaitStabilityMinDuration + maxWaiting := c.compactorCfg.ShardingRing.WaitStabilityMaxDuration + + level.Info(c.logger).Log("msg", "waiting until compactor ring topology is stable", "min_waiting", minWaiting.String(), "max_waiting", maxWaiting.String()) + if err := ring.WaitRingStability(ctx, c.ring, RingOp, minWaiting, maxWaiting); err != nil { + level.Warn(c.logger).Log("msg", "compactor ring topology is not stable after the max waiting time, proceeding anyway") + } else { + level.Info(c.logger).Log("msg", "compactor ring topology is stable") } - } else { - level.Warn(c.logger).Log("msg", "Compactor sharding is disabled. Please don't run more than one compactor in this mode.") } allowedTenants := util.NewAllowedTenants(c.compactorCfg.EnabledTenants, c.compactorCfg.DisabledTenants) - if !c.compactorCfg.ShardingEnabled { - c.shardingStrategy = newNoShardingStrategy(allowedTenants) - } else { - c.shardingStrategy = newSplitAndMergeShardingStrategy(allowedTenants, c.ring, c.ringLifecycler, c.cfgProvider) - } + c.shardingStrategy = newSplitAndMergeShardingStrategy(allowedTenants, c.ring, c.ringLifecycler, c.cfgProvider) // Create the blocks cleaner (service). c.blocksCleaner = NewBlocksCleaner(BlocksCleanerConfig{ @@ -753,31 +743,6 @@ type shardingStrategy interface { ownJob(job *Job) (bool, error) } -// No sharding of users. Each compactor will process any user. -type noShardingStrategy struct { - allowedTenants *util.AllowedTenants -} - -func newNoShardingStrategy(allowedTenants *util.AllowedTenants) *noShardingStrategy { - return &noShardingStrategy{allowedTenants: allowedTenants} -} - -func (n *noShardingStrategy) ownUser(userID string) bool { - return n.allowedTenants.IsAllowed(userID) -} - -func (n *noShardingStrategy) blocksCleanerOwnUser(userID string) (bool, error) { - return n.ownUser(userID), nil -} - -func (n *noShardingStrategy) compactorOwnUser(userID string) (bool, error) { - return n.ownUser(userID), nil -} - -func (n *noShardingStrategy) ownJob(job *Job) (bool, error) { - return n.ownUser(job.UserID()), nil -} - // splitAndMergeShardingStrategy is used by split-and-merge compactor when configured with sharding. // All compactors from user's shard own the user for compaction purposes, and plan jobs. // Each job is only owned and executed by single compactor. diff --git a/pkg/compactor/compactor_http.go b/pkg/compactor/compactor_http.go index 27cf9115cb2..a6c9e568a15 100644 --- a/pkg/compactor/compactor_http.go +++ b/pkg/compactor/compactor_http.go @@ -42,11 +42,6 @@ func writeMessage(w http.ResponseWriter, message string) { } func (c *MultitenantCompactor) RingHandler(w http.ResponseWriter, req *http.Request) { - if !c.compactorCfg.ShardingEnabled { - writeMessage(w, "Compactor has no ring because sharding is disabled.") - return - } - if c.State() != services.Running { // we cannot read the ring before MultitenantCompactor is in Running state, // because that would lead to race condition. diff --git a/pkg/compactor/compactor_ring.go b/pkg/compactor/compactor_ring.go index c7a9959855c..cbcdf1a1030 100644 --- a/pkg/compactor/compactor_ring.go +++ b/pkg/compactor/compactor_ring.go @@ -54,12 +54,13 @@ func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet) { } // Ring flags + cfg.KVStore.Store = "memberlist" // Override default value. cfg.KVStore.RegisterFlagsWithPrefix("compactor.ring.", "collectors/", f) f.DurationVar(&cfg.HeartbeatPeriod, "compactor.ring.heartbeat-period", 5*time.Second, "Period at which to heartbeat to the ring. 0 = disabled.") f.DurationVar(&cfg.HeartbeatTimeout, "compactor.ring.heartbeat-timeout", time.Minute, "The heartbeat timeout after which compactors are considered unhealthy within the ring. 0 = never (timeout disabled).") // Wait stability flags. - f.DurationVar(&cfg.WaitStabilityMinDuration, "compactor.ring.wait-stability-min-duration", time.Minute, "Minimum time to wait for ring stability at startup. 0 to disable.") + f.DurationVar(&cfg.WaitStabilityMinDuration, "compactor.ring.wait-stability-min-duration", 0, "Minimum time to wait for ring stability at startup. 0 to disable.") f.DurationVar(&cfg.WaitStabilityMaxDuration, "compactor.ring.wait-stability-max-duration", 5*time.Minute, "Maximum time to wait for ring stability at startup. If the compactor ring keeps changing after this period of time, the compactor will start anyway.") // Instance flags diff --git a/pkg/compactor/compactor_ring_test.go b/pkg/compactor/compactor_ring_test.go index 08085e668a1..edfa1f90a93 100644 --- a/pkg/compactor/compactor_ring_test.go +++ b/pkg/compactor/compactor_ring_test.go @@ -25,6 +25,7 @@ func TestRingConfig_DefaultConfigToLifecyclerConfig(t *testing.T) { expected.ListenPort = cfg.ListenPort expected.RingConfig.ReplicationFactor = 1 expected.RingConfig.SubringCacheDisabled = true + expected.RingConfig.KVStore.Store = "memberlist" expected.NumTokens = 512 expected.MinReadyDuration = 0 expected.FinalSleep = 0 @@ -51,6 +52,7 @@ func TestRingConfig_CustomConfigToLifecyclerConfig(t *testing.T) { expected.HeartbeatPeriod = cfg.HeartbeatPeriod expected.RingConfig.HeartbeatTimeout = cfg.HeartbeatTimeout expected.RingConfig.SubringCacheDisabled = true + expected.RingConfig.KVStore.Store = "memberlist" expected.ID = cfg.InstanceID expected.InfNames = cfg.InstanceInterfaceNames expected.Port = cfg.InstancePort diff --git a/pkg/compactor/compactor_test.go b/pkg/compactor/compactor_test.go index 7c620fb442d..59b151471db 100644 --- a/pkg/compactor/compactor_test.go +++ b/pkg/compactor/compactor_test.go @@ -155,7 +155,7 @@ func TestMultitenantCompactor_ShouldDoNothingOnNoUserBlocks(t *testing.T) { // No user blocks stored in the bucket. bucketClient := &bucket.ClientMock{} bucketClient.MockIter("", []string{}, nil) - cfg := prepareConfig() + cfg := prepareConfig(t) c, _, _, logs, registry := prepare(t, cfg, bucketClient) require.NoError(t, services.StartAndAwaitRunning(context.Background(), c)) @@ -172,10 +172,11 @@ func TestMultitenantCompactor_ShouldDoNothingOnNoUserBlocks(t *testing.T) { assert.Equal(t, prom_testutil.ToFloat64(c.compactionRunInterval), cfg.CompactionInterval.Seconds()) assert.Equal(t, []string{ - `level=warn component=compactor msg="Compactor sharding is disabled. Please don't run more than one compactor in this mode."`, + `level=info component=compactor msg="waiting until compactor is ACTIVE in the ring"`, + `level=info component=compactor msg="compactor is ACTIVE in the ring"`, `level=info component=compactor msg="discovering users from bucket"`, `level=info component=compactor msg="discovered users from bucket" users=0`, - }, strings.Split(strings.TrimSpace(logs.String()), "\n")) + }, removeIgnoredLogs(strings.Split(strings.TrimSpace(logs.String()), "\n"))) assert.NoError(t, prom_testutil.GatherAndCompare(registry, strings.NewReader(` # TYPE cortex_compactor_runs_started_total counter @@ -298,7 +299,7 @@ func TestMultitenantCompactor_ShouldRetryCompactionOnFailureWhileDiscoveringUser bucketClient := &bucket.ClientMock{} bucketClient.MockIter("", nil, errors.New("failed to iterate the bucket")) - c, _, _, logs, registry := prepare(t, prepareConfig(), bucketClient) + c, _, _, logs, registry := prepare(t, prepareConfig(t), bucketClient) require.NoError(t, services.StartAndAwaitRunning(context.Background(), c)) // Compactor doesn't wait for blocks cleaner to finish, but our test checks for cleaner metrics. @@ -315,10 +316,11 @@ func TestMultitenantCompactor_ShouldRetryCompactionOnFailureWhileDiscoveringUser bucketClient.AssertNumberOfCalls(t, "Iter", 1+3) assert.Equal(t, []string{ - `level=warn component=compactor msg="Compactor sharding is disabled. Please don't run more than one compactor in this mode."`, + `level=info component=compactor msg="waiting until compactor is ACTIVE in the ring"`, + `level=info component=compactor msg="compactor is ACTIVE in the ring"`, `level=info component=compactor msg="discovering users from bucket"`, `level=error component=compactor msg="failed to discover users from bucket" err="failed to iterate the bucket"`, - }, strings.Split(strings.TrimSpace(logs.String()), "\n")) + }, removeIgnoredLogs(strings.Split(strings.TrimSpace(logs.String()), "\n"))) assert.NoError(t, prom_testutil.GatherAndCompare(registry, strings.NewReader(` # TYPE cortex_compactor_runs_started_total counter @@ -452,7 +454,7 @@ func TestMultitenantCompactor_ShouldIncrementCompactionErrorIfFailedToCompactASi bucketClient.MockGet(userID+"/bucket-index.json.gz", "", nil) bucketClient.MockUpload(userID+"/bucket-index.json.gz", nil) - c, _, tsdbPlannerMock, _, registry := prepare(t, prepareConfig(), bucketClient) + c, _, tsdbPlannerMock, _, registry := prepare(t, prepareConfig(t), bucketClient) tsdbPlannerMock.On("Plan", mock.Anything, mock.Anything).Return([]*metadata.Meta{}, errors.New("Failed to plan")) require.NoError(t, services.StartAndAwaitRunning(context.Background(), c)) @@ -512,7 +514,7 @@ func TestMultitenantCompactor_ShouldIterateOverUsersAndRunCompaction(t *testing. bucketClient.MockUpload("user-1/bucket-index.json.gz", nil) bucketClient.MockUpload("user-2/bucket-index.json.gz", nil) - c, _, tsdbPlanner, logs, registry := prepare(t, prepareConfig(), bucketClient) + c, _, tsdbPlanner, logs, registry := prepare(t, prepareConfig(t), bucketClient) // Mock the planner as if there's no compaction to do, // in order to simplify tests (all in all, we just want to @@ -536,7 +538,8 @@ func TestMultitenantCompactor_ShouldIterateOverUsersAndRunCompaction(t *testing. tsdbPlanner.AssertNumberOfCalls(t, "Plan", 2) assert.ElementsMatch(t, []string{ - `level=warn component=compactor msg="Compactor sharding is disabled. Please don't run more than one compactor in this mode."`, + `level=info component=compactor msg="waiting until compactor is ACTIVE in the ring"`, + `level=info component=compactor msg="compactor is ACTIVE in the ring"`, `level=info component=compactor msg="discovering users from bucket"`, `level=info component=compactor msg="discovered users from bucket" users=2`, `level=info component=compactor msg="starting compaction of user blocks" user=user-1`, @@ -647,7 +650,7 @@ func TestMultitenantCompactor_ShouldStopCompactingTenantOnReachingMaxCompactionT bucketClient.MockIter("user-1/markers/", nil, nil) bucketClient.MockUpload("user-1/bucket-index.json.gz", nil) - cfg := prepareConfig() + cfg := prepareConfig(t) cfg.MaxCompactionTime = 500 * time.Millisecond // Enough time to start one compaction. We will make it last longer than this. cfg.CompactionConcurrency = 1 @@ -673,7 +676,8 @@ func TestMultitenantCompactor_ShouldStopCompactingTenantOnReachingMaxCompactionT tsdbPlanner.AssertNumberOfCalls(t, "Plan", 1) assert.Equal(t, []string{ - `level=warn component=compactor msg="Compactor sharding is disabled. Please don't run more than one compactor in this mode."`, + `level=info component=compactor msg="waiting until compactor is ACTIVE in the ring"`, + `level=info component=compactor msg="compactor is ACTIVE in the ring"`, `level=info component=compactor msg="discovering users from bucket"`, `level=info component=compactor msg="discovered users from bucket" users=1`, `level=info component=compactor msg="starting compaction of user blocks" user=user-1`, @@ -692,7 +696,7 @@ func TestMultitenantCompactor_ShouldStopCompactingTenantOnReachingMaxCompactionT func TestMultitenantCompactor_ShouldNotCompactBlocksMarkedForDeletion(t *testing.T) { t.Parallel() - cfg := prepareConfig() + cfg := prepareConfig(t) cfg.DeletionDelay = 10 * time.Minute // Delete block after 10 minutes // Mock the bucket to contain two users, each one with one block. @@ -746,7 +750,8 @@ func TestMultitenantCompactor_ShouldNotCompactBlocksMarkedForDeletion(t *testing tsdbPlanner.AssertNumberOfCalls(t, "Plan", 0) assert.ElementsMatch(t, []string{ - `level=warn component=compactor msg="Compactor sharding is disabled. Please don't run more than one compactor in this mode."`, + `level=info component=compactor msg="waiting until compactor is ACTIVE in the ring"`, + `level=info component=compactor msg="compactor is ACTIVE in the ring"`, `level=info component=compactor msg="discovering users from bucket"`, `level=info component=compactor msg="discovered users from bucket" users=1`, `level=info component=compactor msg="starting compaction of user blocks" user=user-1`, @@ -807,7 +812,7 @@ func TestMultitenantCompactor_ShouldNotCompactBlocksMarkedForDeletion(t *testing func TestMultitenantCompactor_ShouldNotCompactBlocksMarkedForNoCompaction(t *testing.T) { t.Parallel() - cfg := prepareConfig() + cfg := prepareConfig(t) cfg.DeletionDelay = 10 * time.Minute // Delete block after 10 minutes // Mock the bucket to contain one user with a block marked for no-compaction. @@ -844,7 +849,8 @@ func TestMultitenantCompactor_ShouldNotCompactBlocksMarkedForNoCompaction(t *tes tsdbPlanner.AssertNumberOfCalls(t, "Plan", 0) assert.ElementsMatch(t, []string{ - `level=warn component=compactor msg="Compactor sharding is disabled. Please don't run more than one compactor in this mode."`, + `level=info component=compactor msg="waiting until compactor is ACTIVE in the ring"`, + `level=info component=compactor msg="compactor is ACTIVE in the ring"`, `level=info component=compactor msg="discovering users from bucket"`, `level=info component=compactor msg="discovered users from bucket" users=1`, `level=info component=compactor msg="starting compaction of user blocks" user=user-1`, @@ -859,7 +865,7 @@ func TestMultitenantCompactor_ShouldNotCompactBlocksMarkedForNoCompaction(t *tes func TestMultitenantCompactor_ShouldNotCompactBlocksForUsersMarkedForDeletion(t *testing.T) { t.Parallel() - cfg := prepareConfig() + cfg := prepareConfig(t) cfg.DeletionDelay = 10 * time.Minute // Delete block after 10 minutes cfg.TenantCleanupDelay = 10 * time.Minute // To make sure it's not 0. @@ -903,7 +909,8 @@ func TestMultitenantCompactor_ShouldNotCompactBlocksForUsersMarkedForDeletion(t tsdbPlanner.AssertNumberOfCalls(t, "Plan", 0) assert.ElementsMatch(t, []string{ - `level=warn component=compactor msg="Compactor sharding is disabled. Please don't run more than one compactor in this mode."`, + `level=info component=compactor msg="waiting until compactor is ACTIVE in the ring"`, + `level=info component=compactor msg="compactor is ACTIVE in the ring"`, `level=info component=compactor msg="discovering users from bucket"`, `level=info component=compactor msg="discovered users from bucket" users=1`, `level=debug component=compactor msg="skipping user because it is marked for deletion" user=user-1`, @@ -989,8 +996,7 @@ func TestMultitenantCompactor_ShouldCompactAllUsersOnShardingEnabledButOnlyOneIn ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) t.Cleanup(func() { assert.NoError(t, closer.Close()) }) - cfg := prepareConfig() - cfg.ShardingEnabled = true + cfg := prepareConfig(t) cfg.ShardingRing.InstanceID = "compactor-1" cfg.ShardingRing.InstanceAddr = "1.2.3.4" cfg.ShardingRing.KVStore.Mock = ringStore @@ -1119,8 +1125,7 @@ func TestMultitenantCompactor_ShouldCompactOnlyUsersOwnedByTheInstanceOnSharding var logs []*concurrency.SyncBuffer for i := 1; i <= 2; i++ { - cfg := prepareConfig() - cfg.ShardingEnabled = true + cfg := prepareConfig(t) cfg.ShardingRing.InstanceID = fmt.Sprintf("compactor-%d", i) cfg.ShardingRing.InstanceAddr = fmt.Sprintf("127.0.0.%d", i) cfg.ShardingRing.WaitStabilityMinDuration = 3 * time.Second @@ -1191,9 +1196,8 @@ func TestMultitenantCompactor_ShouldSkipCompactionForJobsNoMoreOwnedAfterPlannin ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) t.Cleanup(func() { assert.NoError(t, closer.Close()) }) - cfg := prepareConfig() + cfg := prepareConfig(t) cfg.CompactionConcurrency = 1 - cfg.ShardingEnabled = true cfg.ShardingRing.InstanceID = "compactor-1" cfg.ShardingRing.InstanceAddr = "1.2.3.4" cfg.ShardingRing.KVStore.Mock = ringStore @@ -1463,7 +1467,7 @@ func removeIgnoredLogs(input []string) []string { return out } -func prepareConfig() Config { +func prepareConfig(t *testing.T) Config { compactorCfg := Config{} flagext.DefaultValues(&compactorCfg) @@ -1477,6 +1481,12 @@ func prepareConfig() Config { // Set lower timeout for waiting on compactor to become ACTIVE in the ring for unit tests compactorCfg.ShardingRing.WaitActiveInstanceTimeout = 5 * time.Second + // Inject default KV store. Must be overridden if "real" sharding is required. + inmem, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) + t.Cleanup(func() { _ = closer.Close() }) + compactorCfg.ShardingRing.KVStore.Mock = inmem + compactorCfg.ShardingRing.InstanceAddr = "localhost" + return compactorCfg } @@ -1670,10 +1680,9 @@ func TestMultitenantCompactor_DeleteLocalSyncFiles(t *testing.T) { var compactors []*MultitenantCompactor for i := 1; i <= 2; i++ { - cfg := prepareConfig() + cfg := prepareConfig(t) cfg.CompactionInterval = 10 * time.Minute // We will only call compaction manually. - cfg.ShardingEnabled = true cfg.ShardingRing.InstanceID = fmt.Sprintf("compactor-%d", i) cfg.ShardingRing.InstanceAddr = fmt.Sprintf("127.0.0.%d", i) cfg.ShardingRing.WaitStabilityMinDuration = 3 * time.Second @@ -1747,8 +1756,7 @@ func TestMultitenantCompactor_ShouldFailCompactionOnTimeout(t *testing.T) { ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) t.Cleanup(func() { assert.NoError(t, closer.Close()) }) - cfg := prepareConfig() - cfg.ShardingEnabled = true + cfg := prepareConfig(t) cfg.ShardingRing.InstanceID = "compactor-1" cfg.ShardingRing.InstanceAddr = "1.2.3.4" cfg.ShardingRing.KVStore.Mock = ringStore @@ -1780,7 +1788,6 @@ const ( func TestOwnUser(t *testing.T) { type testCase struct { compactors int - sharding bool enabledUsers []string disabledUsers []string compactorShards map[string]int @@ -1792,23 +1799,8 @@ func TestOwnUser(t *testing.T) { const user2 = "another-user" testCases := map[string]testCase{ - "5 compactors, no sharding": { - compactors: 5, - sharding: false, - compactorShards: map[string]int{user1: 2}, // Not used when sharding is disabled. - - check: func(t *testing.T, comps []*MultitenantCompactor) { - require.Len(t, owningCompactors(t, comps, user1, ownUserReasonCompactor), 5) - require.Len(t, owningCompactors(t, comps, user1, ownUserReasonBlocksCleaner), 5) - - require.Len(t, owningCompactors(t, comps, user2, ownUserReasonCompactor), 5) - require.Len(t, owningCompactors(t, comps, user2, ownUserReasonBlocksCleaner), 5) - }, - }, - "5 compactors, sharding enabled, no compactor shard size": { compactors: 5, - sharding: true, compactorShards: nil, // no limits check: func(t *testing.T, comps []*MultitenantCompactor) { @@ -1822,7 +1814,6 @@ func TestOwnUser(t *testing.T) { "10 compactors, sharding enabled, with non-zero shard sizes": { compactors: 10, - sharding: true, compactorShards: map[string]int{user1: 2, user2: 3}, check: func(t *testing.T, comps []*MultitenantCompactor) { @@ -1840,7 +1831,6 @@ func TestOwnUser(t *testing.T) { "10 compactors, sharding enabled, with zero shard size": { compactors: 10, - sharding: true, compactorShards: map[string]int{user2: 0}, check: func(t *testing.T, comps []*MultitenantCompactor) { @@ -1862,13 +1852,12 @@ func TestOwnUser(t *testing.T) { compactors := []*MultitenantCompactor(nil) for i := 0; i < tc.compactors; i++ { - cfg := prepareConfig() + cfg := prepareConfig(t) cfg.CompactionInterval = 10 * time.Minute // We will only call compaction manually. cfg.EnabledTenants = tc.enabledUsers cfg.DisabledTenants = tc.disabledUsers - cfg.ShardingEnabled = tc.sharding cfg.ShardingRing.InstanceID = fmt.Sprintf("compactor-%d", i) cfg.ShardingRing.InstanceAddr = fmt.Sprintf("127.0.0.%d", i) // No need to wait. All compactors are started before we do any tests, and we wait for all of them @@ -1889,10 +1878,6 @@ func TestOwnUser(t *testing.T) { // Make sure all compactors see all other compactors in the ring before running tests. test.Poll(t, 2*time.Second, true, func() interface{} { - if !tc.sharding { - return true - } - for _, c := range compactors { rs, err := c.ring.GetAllHealthy(RingOp) if err != nil { @@ -1962,7 +1947,7 @@ func TestMultitenantCompactor_OutOfOrderCompaction(t *testing.T) { bkt, err := filesystem.NewBucketClient(filesystem.Config{Directory: storageDir}) require.NoError(t, err) - cfg := prepareConfig() + cfg := prepareConfig(t) c, _, tsdbPlanner, logs, registry := prepare(t, cfg, bkt) tsdbPlanner.On("Plan", mock.Anything, mock.Anything).Return([]*metadata.Meta{meta1, meta2}, nil) diff --git a/pkg/compactor/split_merge_compactor_test.go b/pkg/compactor/split_merge_compactor_test.go index 9bffd5665a1..51b39b0aa49 100644 --- a/pkg/compactor/split_merge_compactor_test.go +++ b/pkg/compactor/split_merge_compactor_test.go @@ -562,7 +562,7 @@ func TestMultitenantCompactor_ShouldSupportSplitAndMergeCompactor(t *testing.T) storageCfg.Bucket.Backend = bucket.Filesystem storageCfg.Bucket.Filesystem.Directory = storageDir - compactorCfg := prepareConfig() + compactorCfg := prepareConfig(t) compactorCfg.DataDir = workDir compactorCfg.BlockRanges = compactionRanges From ddb0e68310e725dffed483d7c39e34337d6f2955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Mon, 31 Jan 2022 10:51:06 +0100 Subject: [PATCH 049/168] Removed -ruler.enable-sharding and made memberlist the default value -ruler.ring.store. (#943) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Removed -ruler.enable-sharding and made memberlist the default value for -ruler.ring.store. Signed-off-by: Peter Štibraný * Remove references to -ruler.enable-sharding. Signed-off-by: Peter Štibraný * CHANGELOG.md Signed-off-by: Peter Štibraný * Fix integration tests. Signed-off-by: Peter Štibraný * Fix help messages. Signed-off-by: Peter Štibraný * Fix test. Signed-off-by: Peter Štibraný * Fix comment. Signed-off-by: Peter Štibraný * Updated jsonnet. Signed-off-by: Peter Štibraný --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 4 +- cmd/mimir/help.txt.tmpl | 4 +- .../config/mimir.yaml | 1 - .../tsdb-blocks-storage-s3/config/mimir.yaml | 10 +- .../configuration/config-file-reference.md | 6 +- ...single-process-config-blocks-gossip-1.yaml | 1 - ...single-process-config-blocks-gossip-2.yaml | 1 - .../single-process-config-blocks-tls.yaml | 1 - .../single-process-config-blocks.yaml | 1 - integration/configs.go | 2 - integration/ruler_test.go | 6 +- ...est-disable-chunk-streaming-generated.yaml | 2 +- .../test-query-sharding-generated.yaml | 2 +- .../test-shuffle-sharding-generated.yaml | 2 +- .../test-storage-azure-generated.yaml | 2 +- .../test-storage-gcs-generated.yaml | 2 +- .../test-storage-s3-generated.yaml | 2 +- operations/mimir/ruler.libsonnet | 2 +- pkg/mimir/mimir_test.go | 9 + pkg/ruler/api_test.go | 65 +++++- pkg/ruler/lifecycle_test.go | 35 +-- pkg/ruler/ruler.go | 214 +++++++----------- pkg/ruler/ruler_ring.go | 1 + pkg/ruler/ruler_test.go | 141 ++++-------- .../rulestore/bucketclient/bucket_client.go | 29 --- .../bucketclient/bucket_client_test.go | 38 ++-- pkg/ruler/rulestore/local/local.go | 20 -- pkg/ruler/rulestore/local/local_test.go | 9 +- pkg/ruler/rulestore/store.go | 5 - pkg/ruler/store_mock_test.go | 61 +---- 31 files changed, 258 insertions(+), 421 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 233ff497495..d03697f729a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -221,6 +221,7 @@ * [CHANGE] Server: `-server.http-listen-port` (yaml: `server.http_listen_port`) now defaults to `8080` (previously `80`). #871 * [CHANGE] Changed the default value of `blocks-storage.bucket-store.ignore-deletion-marks-delay` from 6h to 1h. #892 * [CHANGE] Querier/ruler/query-frontend: the experimental `-querier.at-modifier-enabled` CLI flag has been removed and the PromQL `@` modifier is always enabled. #941 +* [CHANGE] Ruler: removed `-ruler.enable-sharding` option, and change default value of `-ruler.ring.store` to `memberlist`. #943 * [CHANGE] Ruler: `-ruler.alertmanager-use-v2` now defaults to `true`. #954 * [CHANGE] Compactor: Removed `-compactor.sharding-enabled` option. Sharding in compactor is now always enabled. Default value of `-compactor.ring.store` has changed from `consul` to `memberlist`. Default value of `-compactor.ring.wait-stability-min-duration` is now 0, which disables the feature. #956 * [CHANGE] Changed default settings for memcached clients: #959 diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index b251f9efc4a..e0c00da72be 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -1379,8 +1379,6 @@ Usage of ./cmd/mimir/mimir: Override the expected name on the server certificate. -ruler.disabled-tenants value Comma separated list of tenants whose rules this ruler cannot evaluate. If specified, a ruler that would normally pick the specified tenant(s) for processing will ignore them instead. Subject to sharding. - -ruler.enable-sharding - Distribute rule evaluation using ring backend -ruler.enabled-tenants value Comma separated list of tenants whose rules this ruler can evaluate. If specified, only these tenants will be handled by ruler, otherwise this ruler can process rules from all tenants. Subject to sharding. -ruler.evaluation-delay-duration value @@ -1468,7 +1466,7 @@ Usage of ./cmd/mimir/mimir: -ruler.ring.prefix string The prefix for the keys in the store. Should end with a /. (default "rulers/") -ruler.ring.store string - Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "memberlist") -ruler.rule-path string file path to store temporary rule files for the prometheus rule managers (default "/rules") -ruler.search-pending-for duration diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 2e730e46283..948f660be0c 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -1279,8 +1279,6 @@ Usage of ./cmd/mimir/mimir: Override the expected name on the server certificate. -ruler.disabled-tenants value Comma separated list of tenants whose rules this ruler cannot evaluate. If specified, a ruler that would normally pick the specified tenant(s) for processing will ignore them instead. Subject to sharding. - -ruler.enable-sharding - Distribute rule evaluation using ring backend -ruler.enabled-tenants value Comma separated list of tenants whose rules this ruler can evaluate. If specified, only these tenants will be handled by ruler, otherwise this ruler can process rules from all tenants. Subject to sharding. -ruler.evaluation-delay-duration value @@ -1368,7 +1366,7 @@ Usage of ./cmd/mimir/mimir: -ruler.ring.prefix string The prefix for the keys in the store. Should end with a /. (default "rulers/") -ruler.ring.store string - Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "memberlist") -ruler.rule-path string file path to store temporary rule files for the prometheus rule managers (default "/rules") -ruler.search-pending-for duration diff --git a/development/tsdb-blocks-storage-s3-single-binary/config/mimir.yaml b/development/tsdb-blocks-storage-s3-single-binary/config/mimir.yaml index 44ecd5161c5..c09a90f3829 100644 --- a/development/tsdb-blocks-storage-s3-single-binary/config/mimir.yaml +++ b/development/tsdb-blocks-storage-s3-single-binary/config/mimir.yaml @@ -58,7 +58,6 @@ blocks_storage: ruler: enable_api: true - enable_sharding: true poll_interval: 2s ring: kvstore: diff --git a/development/tsdb-blocks-storage-s3/config/mimir.yaml b/development/tsdb-blocks-storage-s3/config/mimir.yaml index ea196fbff22..62eec47b19c 100644 --- a/development/tsdb-blocks-storage-s3/config/mimir.yaml +++ b/development/tsdb-blocks-storage-s3/config/mimir.yaml @@ -75,7 +75,6 @@ blocks_storage: ruler: enable_api: true - enable_sharding: true ring: heartbeat_period: 5s heartbeat_timeout: 15s @@ -157,11 +156,18 @@ query_range: cache_results: true results_cache: - backend: "memcached" + backend: "memcached" memcached: addresses: "dns+memcached:11211" compression: snappy +frontend_worker: + frontend_address: "query-frontend:9007" + match_max_concurrent: true + + # By setting scheduler_address, querier worker would use scheduler instead of frontend. + # scheduler_address: "query-scheduler:9012" + limits: # Limit max query time range to 31d max_query_length: 744h diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index a59ee7896be..558b9c60f7d 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -1220,10 +1220,6 @@ alertmanager_client: # CLI flag: -ruler.resend-delay [resend_delay: | default = 1m] -# Distribute rule evaluation using ring backend -# CLI flag: -ruler.enable-sharding -[enable_sharding: | default = false] - # Time to spend searching for a pending ruler when shutting down. # CLI flag: -ruler.search-pending-for [search_pending_for: | default = 5m] @@ -1233,7 +1229,7 @@ ring: # Backend storage to use for the ring. Supported values are: consul, etcd, # inmemory, memberlist, multi. # CLI flag: -ruler.ring.store - [store: | default = "consul"] + [store: | default = "memberlist"] # The prefix for the keys in the store. Should end with a /. # CLI flag: -ruler.ring.prefix diff --git a/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml b/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml index 6ca08ba508b..7545a6b1538 100644 --- a/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml +++ b/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml @@ -85,7 +85,6 @@ store_gateway: ruler: enable_api: true - enable_sharding: true ring: num_tokens: 512 kvstore: diff --git a/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml b/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml index a58b1cb0dc9..d1583911807 100644 --- a/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml +++ b/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml @@ -84,7 +84,6 @@ store_gateway: ruler: enable_api: true - enable_sharding: true ring: num_tokens: 512 kvstore: diff --git a/docs/sources/configuration/single-process-config-blocks-tls.yaml b/docs/sources/configuration/single-process-config-blocks-tls.yaml index d4298222c0c..acb93122fac 100644 --- a/docs/sources/configuration/single-process-config-blocks-tls.yaml +++ b/docs/sources/configuration/single-process-config-blocks-tls.yaml @@ -96,7 +96,6 @@ frontend_worker: ruler: enable_api: true - enable_sharding: false ruler_storage: backend: local diff --git a/docs/sources/configuration/single-process-config-blocks.yaml b/docs/sources/configuration/single-process-config-blocks.yaml index ba090b9abd0..edfc8343109 100644 --- a/docs/sources/configuration/single-process-config-blocks.yaml +++ b/docs/sources/configuration/single-process-config-blocks.yaml @@ -80,7 +80,6 @@ compactor: ruler: enable_api: true - enable_sharding: false ruler_storage: backend: local diff --git a/integration/configs.go b/integration/configs.go index 1f073dd09ab..3aa3d27f29b 100644 --- a/integration/configs.go +++ b/integration/configs.go @@ -128,7 +128,6 @@ var ( RulerFlags = func() map[string]string { return map[string]string{ "-api.response-compression-enabled": "true", - "-ruler.enable-sharding": "false", "-ruler.poll-interval": "2s", "-experimental.ruler.enable-api": "true", "-ruler-storage.backend": "s3", @@ -142,7 +141,6 @@ var ( RulerShardingFlags = func(consulAddress string) map[string]string { return map[string]string{ - "-ruler.enable-sharding": "true", "-ruler.ring.store": "consul", "-ruler.ring.consul.hostname": consulAddress, } diff --git a/integration/ruler_test.go b/integration/ruler_test.go index 1fd9dbdc3d6..fd85bfce740 100644 --- a/integration/ruler_test.go +++ b/integration/ruler_test.go @@ -599,7 +599,8 @@ func TestRulerMetricsForInvalidQueries(t *testing.T) { // the store-gateway ring if blocks sharding is enabled. // The distributor should have 512 tokens for the ingester ring and 1 for the distributor ring require.NoError(t, distributor.WaitSumMetrics(e2e.Equals(512+1), "cortex_ring_tokens_total")) - require.NoError(t, ruler.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total")) + // Ruler will see 512 tokens for the ingester, and 128 for the ruler. + require.NoError(t, ruler.WaitSumMetrics(e2e.Equals(512+128), "cortex_ring_tokens_total")) c, err := e2emimir.NewClient(distributor.HTTPEndpoint(), "", "", ruler.HTTPEndpoint(), user) require.NoError(t, err) @@ -764,7 +765,8 @@ func TestRulerFederatedRules(t *testing.T) { // Wait until both the distributor and ruler are ready // The distributor should have 512 tokens for the ingester ring and 1 for the distributor rin require.NoError(t, distributor.WaitSumMetrics(e2e.Equals(512+1), "cortex_ring_tokens_total")) - require.NoError(t, ruler.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total")) + // Ruler will see 512 tokens from ingester, and 128 tokens from itself. + require.NoError(t, ruler.WaitSumMetrics(e2e.Equals(512+128), "cortex_ring_tokens_total")) // isolatedTestCase prefixes all the tenant IDs in the testCase with "run--" // so we can ensure that the tenants in different test cases don't overlap diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index 71964d320bf..3f06ca40250 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -1078,10 +1078,10 @@ spec: - -ruler-storage.backend=gcs - -ruler-storage.gcs.bucket-name=rules-bucket - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager - - -ruler.enable-sharding=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -ruler.ring.store=consul - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index 10538e97d0d..5f9c2a656b3 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -1081,10 +1081,10 @@ spec: - -ruler-storage.backend=gcs - -ruler-storage.gcs.bucket-name=rules-bucket - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager - - -ruler.enable-sharding=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -ruler.ring.store=consul - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index b317ab0189d..8e1cd87b7a7 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -1085,10 +1085,10 @@ spec: - -ruler-storage.backend=gcs - -ruler-storage.gcs.bucket-name=rules-bucket - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager - - -ruler.enable-sharding=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -ruler.ring.store=consul - -ruler.tenant-shard-size=2 - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index b55a372032c..87313508ae2 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -1083,10 +1083,10 @@ spec: - -ruler-storage.azure.container-name=rules-bucket - -ruler-storage.backend=azure - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager - - -ruler.enable-sharding=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -ruler.ring.store=consul - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 6977efa19f1..2098864af5f 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -1077,10 +1077,10 @@ spec: - -ruler-storage.backend=gcs - -ruler-storage.gcs.bucket-name=rules-bucket - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager - - -ruler.enable-sharding=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -ruler.ring.store=consul - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index 586d18bdcae..f8f71b24fb2 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -1081,10 +1081,10 @@ spec: - -ruler-storage.s3.endpoint=s3.dualstack.eu-west-1.amazonaws.com - -ruler-storage.s3.region=eu-west-1 - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager - - -ruler.enable-sharding=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -ruler.ring.store=consul - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc-max-recv-msg-size-bytes=10485760 - -server.grpc-max-send-msg-size-bytes=10485760 diff --git a/operations/mimir/ruler.libsonnet b/operations/mimir/ruler.libsonnet index 438700965ea..ad407e59f14 100644 --- a/operations/mimir/ruler.libsonnet +++ b/operations/mimir/ruler.libsonnet @@ -22,7 +22,7 @@ 'api.response-compression-enabled': true, // Ring Configs - 'ruler.enable-sharding': true, + 'ruler.ring.store': 'consul', 'ruler.ring.consul.hostname': 'consul.%s.svc.cluster.local:8500' % $._config.namespace, // Limits diff --git a/pkg/mimir/mimir_test.go b/pkg/mimir/mimir_test.go index bb0e90d50b9..b3774aca489 100644 --- a/pkg/mimir/mimir_test.go +++ b/pkg/mimir/mimir_test.go @@ -41,6 +41,7 @@ import ( "github.com/grafana/mimir/pkg/distributor" "github.com/grafana/mimir/pkg/frontend/v1/frontendv1pb" "github.com/grafana/mimir/pkg/ingester" + "github.com/grafana/mimir/pkg/ruler" "github.com/grafana/mimir/pkg/ruler/rulestore" "github.com/grafana/mimir/pkg/scheduler/schedulerpb" "github.com/grafana/mimir/pkg/storage/bucket" @@ -88,6 +89,14 @@ func TestMimir(t *testing.T) { }, }, }, + Ruler: ruler.Config{ + Ring: ruler.RingConfig{ + KVStore: kv.Config{ + Store: "memberlist", + }, + InstanceAddr: "test:8080", + }, + }, RulerStorage: rulestore.Config{ Config: bucket.Config{ Backend: "filesystem", diff --git a/pkg/ruler/api_test.go b/pkg/ruler/api_test.go index 4f5c390db67..7de8c0ea23f 100644 --- a/pkg/ruler/api_test.go +++ b/pkg/ruler/api_test.go @@ -156,9 +156,18 @@ func TestRuler(t *testing.T) { cfg := defaultRulerConfig(t) cfg.TenantFederation.Enabled = true - r := newTestRuler(t, cfg, newMockRuleStore(tc.mockRules)) + rulerAddrMap := map[string]*Ruler{} + + r := buildRuler(t, cfg, newMockRuleStore(tc.mockRules), rulerAddrMap) + require.NoError(t, services.StartAndAwaitRunning(context.Background(), r)) defer services.StopAndAwaitTerminated(context.Background(), r) //nolint:errcheck + // Make sure mock grpc client can find this instance, based on instance address registered in the ring. + rulerAddrMap[r.lifecycler.GetInstanceAddr()] = r + + // Ensure all rules are loaded before usage + r.syncRules(context.Background(), rulerSyncReasonInitial) + a := NewAPI(r, r.store, log.NewNopLogger()) req := requestFor(t, http.MethodGet, "https://localhost:8080/api/prom/api/v1/rules", nil, tc.userID) @@ -187,10 +196,17 @@ func TestRuler(t *testing.T) { func TestRuler_alerts(t *testing.T) { cfg := defaultRulerConfig(t) - r := newTestRuler(t, cfg, newMockRuleStore(mockRules)) - t.Cleanup(func() { - require.NoError(t, services.StopAndAwaitTerminated(context.Background(), r)) - }) + rulerAddrMap := map[string]*Ruler{} + + r := buildRuler(t, cfg, newMockRuleStore(mockRules), rulerAddrMap) + require.NoError(t, services.StartAndAwaitRunning(context.Background(), r)) + defer services.StopAndAwaitTerminated(context.Background(), r) //nolint:errcheck + + // Make sure mock grpc client can find this instance, based on instance address registered in the ring. + rulerAddrMap[r.lifecycler.GetInstanceAddr()] = r + + // Ensure all rules are loaded before usage + r.syncRules(context.Background(), rulerSyncReasonInitial) a := NewAPI(r, r.store, log.NewNopLogger()) @@ -312,6 +328,45 @@ rules: func TestRuler_DeleteNamespace(t *testing.T) { cfg := defaultRulerConfig(t) + // Keep this inside the test, not as global var, otherwise running tests with -count higher than 1 fails, + // as newMockRuleStore modifies the underlying map. + mockRulesNamespaces := map[string]rulespb.RuleGroupList{ + "user1": { + &rulespb.RuleGroupDesc{ + Name: "group1", + Namespace: "namespace1", + User: "user1", + Rules: []*rulespb.RuleDesc{ + { + Record: "UP_RULE", + Expr: "up", + }, + { + Alert: "UP_ALERT", + Expr: "up < 1", + }, + }, + Interval: interval, + }, + &rulespb.RuleGroupDesc{ + Name: "fail", + Namespace: "namespace2", + User: "user1", + Rules: []*rulespb.RuleDesc{ + { + Record: "UP2_RULE", + Expr: "up", + }, + { + Alert: "UP2_ALERT", + Expr: "up < 1", + }, + }, + Interval: interval, + }, + }, + } + r := newTestRuler(t, cfg, newMockRuleStore(mockRulesNamespaces)) defer services.StopAndAwaitTerminated(context.Background(), r) //nolint:errcheck diff --git a/pkg/ruler/lifecycle_test.go b/pkg/ruler/lifecycle_test.go index 33d658bee18..2b96fc3af18 100644 --- a/pkg/ruler/lifecycle_test.go +++ b/pkg/ruler/lifecycle_test.go @@ -11,13 +11,10 @@ import ( "testing" "time" - "github.com/go-kit/log" "github.com/grafana/dskit/kv" - "github.com/grafana/dskit/kv/consul" "github.com/grafana/dskit/ring" "github.com/grafana/dskit/services" "github.com/grafana/dskit/test" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -27,19 +24,15 @@ func TestRulerShutdown(t *testing.T) { config := defaultRulerConfig(t) r := buildRuler(t, config, newMockRuleStore(mockRules), nil) - r.cfg.EnableSharding = true - ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) - t.Cleanup(func() { assert.NoError(t, closer.Close()) }) - err := enableSharding(r, ringStore) - require.NoError(t, err) + kvStore := config.Ring.KVStore.Mock require.NoError(t, services.StartAndAwaitRunning(ctx, r)) defer services.StopAndAwaitTerminated(ctx, r) //nolint:errcheck // Wait until the tokens are registered in the ring test.Poll(t, 100*time.Millisecond, config.Ring.NumTokens, func() interface{} { - return numTokens(ringStore, "localhost", RulerRingKey) + return numTokens(kvStore, "localhost", RulerRingKey) }) require.Equal(t, ring.ACTIVE, r.lifecycler.GetState()) @@ -48,7 +41,7 @@ func TestRulerShutdown(t *testing.T) { // Wait until the tokens are unregistered from the ring test.Poll(t, 100*time.Millisecond, 0, func() interface{} { - return numTokens(ringStore, "localhost", RulerRingKey) + return numTokens(kvStore, "localhost", RulerRingKey) }) } @@ -57,26 +50,22 @@ func TestRuler_RingLifecyclerShouldAutoForgetUnhealthyInstances(t *testing.T) { const heartbeatTimeout = time.Minute ctx := context.Background() - config := defaultRulerConfig(t) - r := buildRuler(t, config, newMockRuleStore(mockRules), nil) - r.cfg.EnableSharding = true - r.cfg.Ring.HeartbeatPeriod = 100 * time.Millisecond - r.cfg.Ring.HeartbeatTimeout = heartbeatTimeout + cfg := defaultRulerConfig(t) + cfg.Ring.HeartbeatPeriod = 100 * time.Millisecond + cfg.Ring.HeartbeatTimeout = heartbeatTimeout - ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) - t.Cleanup(func() { assert.NoError(t, closer.Close()) }) - - err := enableSharding(r, ringStore) - require.NoError(t, err) + r := buildRuler(t, cfg, newMockRuleStore(mockRules), nil) require.NoError(t, services.StartAndAwaitRunning(ctx, r)) defer services.StopAndAwaitTerminated(ctx, r) //nolint:errcheck + ringClient := cfg.Ring.KVStore.Mock + // Add an unhealthy instance to the ring. - require.NoError(t, ringStore.CAS(ctx, RulerRingKey, func(in interface{}) (interface{}, bool, error) { + require.NoError(t, ringClient.CAS(ctx, RulerRingKey, func(in interface{}) (interface{}, bool, error) { ringDesc := ring.GetOrCreateRingDesc(in) - instance := ringDesc.AddIngester(unhealthyInstanceID, "1.1.1.1", "", generateSortedTokens(config.Ring.NumTokens), ring.ACTIVE, time.Now()) + instance := ringDesc.AddIngester(unhealthyInstanceID, "1.1.1.1", "", generateSortedTokens(cfg.Ring.NumTokens), ring.ACTIVE, time.Now()) instance.Timestamp = time.Now().Add(-(ringAutoForgetUnhealthyPeriods + 1) * heartbeatTimeout).Unix() ringDesc.Ingesters[unhealthyInstanceID] = instance @@ -85,7 +74,7 @@ func TestRuler_RingLifecyclerShouldAutoForgetUnhealthyInstances(t *testing.T) { // Ensure the unhealthy instance is removed from the ring. test.Poll(t, time.Second*5, false, func() interface{} { - d, err := ringStore.Get(ctx, RulerRingKey) + d, err := ringClient.Get(ctx, RulerRingKey) if err != nil { return err } diff --git a/pkg/ruler/ruler.go b/pkg/ruler/ruler.go index f1c545f3e30..7a53d44c3fc 100644 --- a/pkg/ruler/ruler.go +++ b/pkg/ruler/ruler.go @@ -106,7 +106,6 @@ type Config struct { ResendDelay time.Duration `yaml:"resend_delay"` // Enable sharding rule groups. - EnableSharding bool `yaml:"enable_sharding"` SearchPendingFor time.Duration `yaml:"search_pending_for"` Ring RingConfig `yaml:"ring"` FlushCheckPeriod time.Duration `yaml:"flush_period"` @@ -155,7 +154,6 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.NotificationTimeout, "ruler.notification-timeout", 10*time.Second, "HTTP timeout duration when sending notifications to the Alertmanager.") f.DurationVar(&cfg.SearchPendingFor, "ruler.search-pending-for", 5*time.Minute, "Time to spend searching for a pending ruler when shutting down.") - f.BoolVar(&cfg.EnableSharding, "ruler.enable-sharding", false, "Distribute rule evaluation using ring backend") f.DurationVar(&cfg.FlushCheckPeriod, "ruler.flush-period", 1*time.Minute, "Period with which to attempt to flush rule groups.") f.StringVar(&cfg.RulePath, "ruler.rule-path", "/rules", "file path to store temporary rule files for the prometheus rule managers") f.BoolVar(&cfg.EnableAPI, "experimental.ruler.enable-api", false, "Enable the ruler api") @@ -269,20 +267,18 @@ func newRuler(cfg Config, manager MultiTenantManager, reg prometheus.Registerer, level.Info(ruler.logger).Log("msg", "ruler using disabled users", "disabled", strings.Join(cfg.DisabledTenants, ", ")) } - if cfg.EnableSharding { - ringStore, err := kv.NewClient( - cfg.Ring.KVStore, - ring.GetCodec(), - kv.RegistererWithKVName(prometheus.WrapRegistererWithPrefix("cortex_", reg), "ruler"), - logger, - ) - if err != nil { - return nil, errors.Wrap(err, "create KV store client") - } + ringStore, err := kv.NewClient( + cfg.Ring.KVStore, + ring.GetCodec(), + kv.RegistererWithKVName(prometheus.WrapRegistererWithPrefix("cortex_", reg), "ruler"), + logger, + ) + if err != nil { + return nil, errors.Wrap(err, "create KV store client") + } - if err = enableSharding(ruler, ringStore); err != nil { - return nil, errors.Wrap(err, "setup ruler sharding ring") - } + if err = enableSharding(ruler, ringStore); err != nil { + return nil, errors.Wrap(err, "setup ruler sharding ring") } ruler.Service = services.NewBasicService(ruler.starting, ruler.run, ruler.stopping) @@ -316,20 +312,17 @@ func enableSharding(r *Ruler, ringStore kv.Client) error { } func (r *Ruler) starting(ctx context.Context) error { - // If sharding is enabled, start the used subservices. - if r.cfg.EnableSharding { - var err error + var err error - if r.subservices, err = services.NewManager(r.lifecycler, r.ring, r.clientsPool); err != nil { - return errors.Wrap(err, "unable to start ruler subservices") - } + if r.subservices, err = services.NewManager(r.lifecycler, r.ring, r.clientsPool); err != nil { + return errors.Wrap(err, "unable to start ruler subservices") + } - r.subservicesWatcher = services.NewFailureWatcher() - r.subservicesWatcher.WatchManager(r.subservices) + r.subservicesWatcher = services.NewFailureWatcher() + r.subservicesWatcher.WatchManager(r.subservices) - if err = services.StartManagerAndAwaitHealthy(ctx, r.subservices); err != nil { - return errors.Wrap(err, "unable to start ruler subservices") - } + if err = services.StartManagerAndAwaitHealthy(ctx, r.subservices); err != nil { + return errors.Wrap(err, "unable to start ruler subservices") } // TODO: ideally, ruler would wait until its queryable is finished starting. @@ -407,23 +400,7 @@ func instanceOwnsRuleGroup(r ring.ReadRing, g *rulespb.RuleGroupDesc, instanceAd } func (r *Ruler) ServeHTTP(w http.ResponseWriter, req *http.Request) { - if r.cfg.EnableSharding { - r.ring.ServeHTTP(w, req) - } else { - var unshardedPage = ` - - - - - Ruler Status - - -

Ruler Status

-

Ruler running with shards disabled

- - ` - util.WriteHTMLResponse(w, unshardedPage) - } + r.ring.ServeHTTP(w, req) } func (r *Ruler) run(ctx context.Context) error { @@ -432,15 +409,9 @@ func (r *Ruler) run(ctx context.Context) error { tick := time.NewTicker(r.cfg.PollInterval) defer tick.Stop() - var ringTickerChan <-chan time.Time - var ringLastState ring.ReplicationSet - - if r.cfg.EnableSharding { - ringLastState, _ = r.ring.GetAllHealthy(RingOp) - ringTicker := time.NewTicker(util.DurationWithJitter(r.cfg.RingCheckPeriod, 0.2)) - defer ringTicker.Stop() - ringTickerChan = ringTicker.C - } + ringLastState, _ := r.ring.GetAllHealthy(RingOp) + ringTicker := time.NewTicker(util.DurationWithJitter(r.cfg.RingCheckPeriod, 0.2)) + defer ringTicker.Stop() r.syncRules(ctx, rulerSyncReasonInitial) for { @@ -449,7 +420,7 @@ func (r *Ruler) run(ctx context.Context) error { return nil case <-tick.C: r.syncRules(ctx, rulerSyncReasonPeriodic) - case <-ringTickerChan: + case <-ringTicker.C: // We ignore the error because in case of error it will return an empty // replication set which we use to compare with the previous state. currRingState, _ := r.ring.GetAllHealthy(RingOp) @@ -485,11 +456,7 @@ func (r *Ruler) syncRules(ctx context.Context, reason string) { } func (r *Ruler) listRules(ctx context.Context) (result map[string]rulespb.RuleGroupList, err error) { - if r.cfg.EnableSharding { - result, err = r.listRulesSharded(ctx) - } else { - result, err = r.listRulesUnsharded(ctx) - } + result, err = r.listRulesSharded(ctx) if err != nil { return @@ -504,10 +471,6 @@ func (r *Ruler) listRules(ctx context.Context) (result map[string]rulespb.RuleGr return } -func (r *Ruler) listRulesUnsharded(ctx context.Context) (map[string]rulespb.RuleGroupList, error) { - return r.store.ListAllRuleGroups(ctx) -} - func (r *Ruler) listRulesSharded(ctx context.Context) (map[string]rulespb.RuleGroupList, error) { users, err := r.store.ListAllUsers(ctx) if err != nil { @@ -602,19 +565,73 @@ func filterRuleGroups(userID string, ruleGroups []*rulespb.RuleGroupDesc, ring r return result } -// GetRules retrieves the running rules from this ruler and all running rulers in the ring if -// sharding is enabled +// GetRules retrieves the running rules from this ruler and all running rulers in the ring. func (r *Ruler) GetRules(ctx context.Context) ([]*GroupStateDesc, error) { userID, err := tenant.TenantID(ctx) if err != nil { return nil, fmt.Errorf("no user id found in context") } - if r.cfg.EnableSharding { - return r.getShardedRules(ctx, userID) + ring := ring.ReadRing(r.ring) + + if shardSize := r.limits.RulerTenantShardSize(userID); shardSize > 0 { + ring = r.ring.ShuffleShard(userID, shardSize) + } + + rulers, err := ring.GetReplicationSetForOperation(RingOp) + if err != nil { + return nil, err } - return r.getLocalRules(userID) + ctx, err = user.InjectIntoGRPCRequest(ctx) + if err != nil { + return nil, fmt.Errorf("unable to inject user ID into grpc request, %v", err) + } + + var ( + mergedMx sync.Mutex + merged []*GroupStateDesc + ) + + // Concurrently fetch rules from all rulers. Since rules are not replicated, + // we need all requests to succeed. + addrs := rulers.GetAddresses() + err = concurrency.ForEachJob(ctx, len(addrs), len(addrs), func(ctx context.Context, idx int) error { + addr := addrs[idx] + + rulerClient, err := r.clientsPool.GetClientFor(addr) + if err != nil { + return errors.Wrapf(err, "unable to get client for ruler %s", addr) + } + + newGrps, err := rulerClient.Rules(ctx, &RulesRequest{}) + if err != nil { + return errors.Wrapf(err, "unable to retrieve rules from ruler %s", addr) + } + + mergedMx.Lock() + merged = append(merged, newGrps.Groups...) + mergedMx.Unlock() + + return nil + }) + + return merged, err +} + +// Rules implements the rules service +func (r *Ruler) Rules(ctx context.Context, in *RulesRequest) (*RulesResponse, error) { + userID, err := tenant.TenantID(ctx) + if err != nil { + return nil, fmt.Errorf("no user id found in context") + } + + groupDescs, err := r.getLocalRules(userID) + if err != nil { + return nil, err + } + + return &RulesResponse{Groups: groupDescs}, nil } func (r *Ruler) getLocalRules(userID string) ([]*GroupStateDesc, error) { @@ -705,69 +722,6 @@ func (r *Ruler) getLocalRules(userID string) ([]*GroupStateDesc, error) { return groupDescs, nil } -func (r *Ruler) getShardedRules(ctx context.Context, userID string) ([]*GroupStateDesc, error) { - ring := ring.ReadRing(r.ring) - - if shardSize := r.limits.RulerTenantShardSize(userID); shardSize > 0 { - ring = r.ring.ShuffleShard(userID, shardSize) - } - - rulers, err := ring.GetReplicationSetForOperation(RingOp) - if err != nil { - return nil, err - } - - ctx, err = user.InjectIntoGRPCRequest(ctx) - if err != nil { - return nil, fmt.Errorf("unable to inject user ID into grpc request, %v", err) - } - - var ( - mergedMx sync.Mutex - merged []*GroupStateDesc - ) - - // Concurrently fetch rules from all rulers. Since rules are not replicated, - // we need all requests to succeed. - addrs := rulers.GetAddresses() - err = concurrency.ForEachJob(ctx, len(addrs), len(addrs), func(ctx context.Context, idx int) error { - addr := addrs[idx] - - rulerClient, err := r.clientsPool.GetClientFor(addr) - if err != nil { - return errors.Wrapf(err, "unable to get client for ruler %s", addr) - } - - newGrps, err := rulerClient.Rules(ctx, &RulesRequest{}) - if err != nil { - return errors.Wrapf(err, "unable to retrieve rules from ruler %s", addr) - } - - mergedMx.Lock() - merged = append(merged, newGrps.Groups...) - mergedMx.Unlock() - - return nil - }) - - return merged, err -} - -// Rules implements the rules service -func (r *Ruler) Rules(ctx context.Context, in *RulesRequest) (*RulesResponse, error) { - userID, err := tenant.TenantID(ctx) - if err != nil { - return nil, fmt.Errorf("no user id found in context") - } - - groupDescs, err := r.getLocalRules(userID) - if err != nil { - return nil, err - } - - return &RulesResponse{Groups: groupDescs}, nil -} - // AssertMaxRuleGroups limit has not been reached compared to the current // number of total rule groups in input and returns an error if so. func (r *Ruler) AssertMaxRuleGroups(userID string, rg int) error { diff --git a/pkg/ruler/ruler_ring.go b/pkg/ruler/ruler_ring.go index 008f9ee4b73..ab64f88d943 100644 --- a/pkg/ruler/ruler_ring.go +++ b/pkg/ruler/ruler_ring.go @@ -61,6 +61,7 @@ func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet) { } // Ring flags + cfg.KVStore.Store = "memberlist" // Change default value to memberlist. cfg.KVStore.RegisterFlagsWithPrefix("ruler.ring.", "rulers/", f) f.DurationVar(&cfg.HeartbeatPeriod, "ruler.ring.heartbeat-period", 5*time.Second, "Period at which to heartbeat to the ring. 0 = disabled.") f.DurationVar(&cfg.HeartbeatTimeout, "ruler.ring.heartbeat-timeout", time.Minute, "The heartbeat timeout after which rulers are considered unhealthy within the ring. 0 = never (timeout disabled).") diff --git a/pkg/ruler/ruler_test.go b/pkg/ruler/ruler_test.go index cc0d0778eea..7a739d00ab2 100644 --- a/pkg/ruler/ruler_test.go +++ b/pkg/ruler/ruler_test.go @@ -310,11 +310,10 @@ func TestGetRules(t *testing.T) { type expectedRulesMap map[string]map[string]rulespb.RuleGroupList type testCase struct { - sharding bool shuffleShardSize int } - expectedRules := expectedRulesMap{ + expectedRulesByRuler := expectedRulesMap{ "ruler1": map[string]rulespb.RuleGroupList{ "user1": { &rulespb.RuleGroupDesc{User: "user1", Namespace: "namespace", Name: "first", Interval: 10 * time.Second}, @@ -345,15 +344,10 @@ func TestGetRules(t *testing.T) { } testCases := map[string]testCase{ - "No Sharding": { - sharding: false, - }, "Shuffle Shard Size 0": { - sharding: true, shuffleShardSize: 0, }, "Shuffle Shard Size 2": { - sharding: true, shuffleShardSize: 2, }, } @@ -370,7 +364,6 @@ func TestGetRules(t *testing.T) { createRuler := func(id string) *Ruler { cfg := defaultRulerConfig(t) - cfg.EnableSharding = tc.sharding cfg.Ring = RingConfig{ InstanceID: id, @@ -390,7 +383,7 @@ func TestGetRules(t *testing.T) { return r } - for rID, r := range expectedRules { + for rID, r := range expectedRulesByRuler { createRuler(rID) for user, rules := range r { allRulesByUser[user] = append(allRulesByUser[user], rules...) @@ -399,21 +392,19 @@ func TestGetRules(t *testing.T) { } } - if tc.sharding { - err := kvStore.CAS(context.Background(), RulerRingKey, func(in interface{}) (out interface{}, retry bool, err error) { - d, _ := in.(*ring.Desc) - if d == nil { - d = ring.NewDesc() - } - for rID, tokens := range allTokensByRuler { - d.AddIngester(rID, rulerAddrMap[rID].lifecycler.GetInstanceAddr(), "", tokens, ring.ACTIVE, time.Now()) - } - return d, true, nil - }) - require.NoError(t, err) - // Wait a bit to make sure ruler's ring is updated. - time.Sleep(100 * time.Millisecond) - } + err := kvStore.CAS(context.Background(), RulerRingKey, func(in interface{}) (out interface{}, retry bool, err error) { + d, _ := in.(*ring.Desc) + if d == nil { + d = ring.NewDesc() + } + for rID, tokens := range allTokensByRuler { + d.AddIngester(rID, rulerAddrMap[rID].lifecycler.GetInstanceAddr(), "", tokens, ring.ACTIVE, time.Now()) + } + return d, true, nil + }) + require.NoError(t, err) + // Wait a bit to make sure ruler's ring is updated. + time.Sleep(100 * time.Millisecond) forEachRuler := func(f func(rID string, r *Ruler)) { for rID, r := range rulerAddrMap { @@ -432,16 +423,14 @@ func TestGetRules(t *testing.T) { rules, err := r.GetRules(ctx) require.NoError(t, err) require.Equal(t, len(allRulesByUser[u]), len(rules)) - if tc.sharding { - mockPoolClient := r.clientsPool.(*mockRulerClientsPool) - - if tc.shuffleShardSize > 0 { - require.Equal(t, int32(tc.shuffleShardSize), mockPoolClient.numberOfCalls.Load()) - } else { - require.Equal(t, int32(len(rulerAddrMap)), mockPoolClient.numberOfCalls.Load()) - } - mockPoolClient.numberOfCalls.Store(0) + + mockPoolClient := r.clientsPool.(*mockRulerClientsPool) + if tc.shuffleShardSize > 0 { + require.Equal(t, int32(tc.shuffleShardSize), mockPoolClient.numberOfCalls.Load()) + } else { + require.Equal(t, int32(len(rulerAddrMap)), mockPoolClient.numberOfCalls.Load()) } + mockPoolClient.numberOfCalls.Store(0) }) } @@ -457,13 +446,7 @@ func TestGetRules(t *testing.T) { totalConfiguredRules += len(allRulesByRuler[rID]) }) - if tc.sharding { - require.Equal(t, totalConfiguredRules, totalLoadedRules) - } else { - // Not sharding means that all rules will be loaded on all rulers - numberOfRulers := len(rulerAddrMap) - require.Equal(t, totalConfiguredRules*numberOfRulers, totalLoadedRules) - } + require.Equal(t, totalConfiguredRules, totalLoadedRules) }) } } @@ -497,7 +480,6 @@ func TestSharding(t *testing.T) { type expectedRulesMap map[string]map[string]rulespb.RuleGroupList type testCase struct { - sharding bool shuffleShardSize int setupRing func(*ring.Desc) enabledUsers []string @@ -524,30 +506,7 @@ func TestSharding(t *testing.T) { ) testCases := map[string]testCase{ - "no sharding": { - sharding: false, - expectedRules: expectedRulesMap{ruler1: allRules}, - }, - - "no sharding, single user allowed": { - sharding: false, - enabledUsers: []string{user1}, - expectedRules: expectedRulesMap{ruler1: map[string]rulespb.RuleGroupList{ - user1: {user1Group1, user1Group2}, - }}, - }, - - "no sharding, single user disabled": { - sharding: false, - disabledUsers: []string{user1}, - expectedRules: expectedRulesMap{ruler1: map[string]rulespb.RuleGroupList{ - user2: {user2Group1}, - user3: {user3Group1}, - }}, - }, - - "default sharding, single ruler": { - sharding: true, + "single ruler, with ring setup": { shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", []uint32{0}, ring.ACTIVE, time.Now()) @@ -555,8 +514,7 @@ func TestSharding(t *testing.T) { expectedRules: expectedRulesMap{ruler1: allRules}, }, - "default sharding, single ruler, single enabled user": { - sharding: true, + "single ruler, with ring setup, single user enabled": { shuffleShardSize: 0, enabledUsers: []string{user1}, setupRing: func(desc *ring.Desc) { @@ -567,8 +525,7 @@ func TestSharding(t *testing.T) { }}, }, - "default sharding, single ruler, single disabled user": { - sharding: true, + "single ruler with ring setup, single user disabled": { shuffleShardSize: 0, disabledUsers: []string{user1}, setupRing: func(desc *ring.Desc) { @@ -580,8 +537,7 @@ func TestSharding(t *testing.T) { }}, }, - "default sharding, multiple ACTIVE rulers": { - sharding: true, + "shard size 0, multiple ACTIVE rulers": { shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { desc.AddIngester(ruler1, ruler1Addr, "", sortTokens([]uint32{user1Group1Token + 1, user2Group1Token + 1}), ring.ACTIVE, time.Now()) @@ -601,8 +557,7 @@ func TestSharding(t *testing.T) { }, }, - "default sharding, multiple ACTIVE rulers, single enabled user": { - sharding: true, + "shard size 0, multiple ACTIVE rulers, single enabled user": { shuffleShardSize: 0, enabledUsers: []string{user1}, setupRing: func(desc *ring.Desc) { @@ -621,8 +576,7 @@ func TestSharding(t *testing.T) { }, }, - "default sharding, multiple ACTIVE rulers, single disabled user": { - sharding: true, + "shard size 0, multiple ACTIVE rulers, single disabled user": { shuffleShardSize: 0, disabledUsers: []string{user1}, setupRing: func(desc *ring.Desc) { @@ -641,8 +595,7 @@ func TestSharding(t *testing.T) { }, }, - "default sharding, unhealthy ACTIVE ruler": { - sharding: true, + "shard size 0, unhealthy ACTIVE ruler": { shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { @@ -665,8 +618,7 @@ func TestSharding(t *testing.T) { }, }, - "default sharding, LEAVING ruler": { - sharding: true, + "shard size 0, LEAVING ruler": { shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { @@ -681,8 +633,7 @@ func TestSharding(t *testing.T) { }, }, - "default sharding, JOINING ruler": { - sharding: true, + "shard size 0, JOINING ruler": { shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { @@ -697,8 +648,7 @@ func TestSharding(t *testing.T) { }, }, - "shuffle sharding, single ruler": { - sharding: true, + "shard size 0, single ruler": { shuffleShardSize: 0, setupRing: func(desc *ring.Desc) { @@ -710,8 +660,7 @@ func TestSharding(t *testing.T) { }, }, - "shuffle sharding, multiple rulers, shard size 1": { - sharding: true, + "shard size 1, multiple rulers": { shuffleShardSize: 1, setupRing: func(desc *ring.Desc) { @@ -726,8 +675,7 @@ func TestSharding(t *testing.T) { }, // Same test as previous one, but with shard size=2. Second ruler gets all the rules. - "shuffle sharding, two rulers, shard size 2": { - sharding: true, + "shard size 2, two rulers": { shuffleShardSize: 2, setupRing: func(desc *ring.Desc) { @@ -742,8 +690,7 @@ func TestSharding(t *testing.T) { }, }, - "shuffle sharding, two rulers, shard size 1, distributed users": { - sharding: true, + "shard size 1, two rulers, distributed users": { shuffleShardSize: 1, setupRing: func(desc *ring.Desc) { @@ -761,8 +708,7 @@ func TestSharding(t *testing.T) { }, }, }, - "shuffle sharding, three rulers, shard size 2": { - sharding: true, + "shard size 2, three rulers": { shuffleShardSize: 2, setupRing: func(desc *ring.Desc) { @@ -784,8 +730,7 @@ func TestSharding(t *testing.T) { }, }, }, - "shuffle sharding, three rulers, shard size 2, ruler2 has no users": { - sharding: true, + "shard size 2, three rulers, ruler2 has no users": { shuffleShardSize: 2, setupRing: func(desc *ring.Desc) { @@ -806,8 +751,7 @@ func TestSharding(t *testing.T) { }, }, - "shuffle sharding, three rulers, shard size 2, single enabled user": { - sharding: true, + "shard size 2, three rulers, single enabled user": { shuffleShardSize: 2, enabledUsers: []string{user1}, @@ -828,8 +772,7 @@ func TestSharding(t *testing.T) { }, }, - "shuffle sharding, three rulers, shard size 2, single disabled user": { - sharding: true, + "shard size 2, three rulers, single disabled user": { shuffleShardSize: 2, disabledUsers: []string{user1}, @@ -857,7 +800,6 @@ func TestSharding(t *testing.T) { setupRuler := func(id string, host string, port int, forceRing *ring.Ring) *Ruler { cfg := Config{ - EnableSharding: tc.sharding, Ring: RingConfig{ InstanceID: id, InstanceAddr: host, @@ -978,7 +920,8 @@ func TestDeleteTenantRuleGroups(t *testing.T) { require.Equal(t, 3, len(obj.Objects())) - api, err := NewRuler(Config{}, nil, nil, log.NewNopLogger(), rs, nil) + cfg := defaultRulerConfig(t) + api, err := NewRuler(cfg, nil, nil, log.NewNopLogger(), rs, nil) require.NoError(t, err) { diff --git a/pkg/ruler/rulestore/bucketclient/bucket_client.go b/pkg/ruler/rulestore/bucketclient/bucket_client.go index df78c100e41..64c57d1889d 100644 --- a/pkg/ruler/rulestore/bucketclient/bucket_client.go +++ b/pkg/ruler/rulestore/bucketclient/bucket_client.go @@ -104,35 +104,6 @@ func (b *BucketRuleStore) ListAllUsers(ctx context.Context) ([]string, error) { return users, nil } -// ListAllRuleGroups implements rules.RuleStore. -func (b *BucketRuleStore) ListAllRuleGroups(ctx context.Context) (map[string]rulespb.RuleGroupList, error) { - out := map[string]rulespb.RuleGroupList{} - - // List rule groups for all tenants. - err := b.bucket.Iter(ctx, "", func(key string) error { - userID, namespace, group, err := parseRuleGroupObjectKeyWithUser(key) - if err != nil { - level.Warn(b.logger).Log("msg", "invalid rule group object key found while listing rule groups", "key", key, "err", err) - - // Do not fail just because of a spurious item in the bucket. - return nil - } - - out[userID] = append(out[userID], &rulespb.RuleGroupDesc{ - User: userID, - Namespace: namespace, - Name: group, - }) - return nil - }, objstore.WithRecursiveIter) - - if err != nil { - return nil, err - } - - return out, nil -} - // ListRuleGroupsForUserAndNamespace implements rules.RuleStore. func (b *BucketRuleStore) ListRuleGroupsForUserAndNamespace(ctx context.Context, userID string, namespace string) (rulespb.RuleGroupList, error) { userBucket := bucket.NewUserBucketClient(userID, b.bucket, b.cfgProvider) diff --git a/pkg/ruler/rulestore/bucketclient/bucket_client_test.go b/pkg/ruler/rulestore/bucketclient/bucket_client_test.go index ce93ecde612..31b69c66087 100644 --- a/pkg/ruler/rulestore/bucketclient/bucket_client_test.go +++ b/pkg/ruler/rulestore/bucketclient/bucket_client_test.go @@ -52,20 +52,6 @@ func TestListRules(t *testing.T) { require.ElementsMatch(t, []string{"user1", "user2"}, users) } - { - allGroupsMap, err := rs.ListAllRuleGroups(context.Background()) - require.NoError(t, err) - require.Len(t, allGroupsMap, 2) - require.ElementsMatch(t, []*rulespb.RuleGroupDesc{ - {User: "user1", Namespace: "hello", Name: "first testGroup"}, - {User: "user1", Namespace: "hello", Name: "second testGroup"}, - {User: "user1", Namespace: "world", Name: "another namespace testGroup"}, - }, allGroupsMap["user1"]) - require.ElementsMatch(t, []*rulespb.RuleGroupDesc{ - {User: "user2", Namespace: "+-!@#$%. ", Name: "different user"}, - }, allGroupsMap["user2"]) - } - { user1Groups, err := rs.ListRuleGroupsForUserAndNamespace(context.Background(), "user1", "") require.NoError(t, err) @@ -124,11 +110,15 @@ func TestLoadRules(t *testing.T) { require.NoError(t, rs.SetRuleGroup(context.Background(), g.user, g.namespace, desc)) } - allGroupsMap, err := rs.ListAllRuleGroups(context.Background()) + allGroupsMap := map[string]rulespb.RuleGroupList{} + for _, u := range []string{"user1", "user2", "user3"} { + rgl, err := rs.ListRuleGroupsForUserAndNamespace(context.Background(), u, "") + require.NoError(t, err) + allGroupsMap[u] = rgl + } // Before load, rules are not loaded { - require.NoError(t, err) require.Len(t, allGroupsMap, 3) require.ElementsMatch(t, []*rulespb.RuleGroupDesc{ {User: "user1", Namespace: "hello", Name: "first testGroup"}, @@ -140,7 +130,7 @@ func TestLoadRules(t *testing.T) { }, allGroupsMap["user2"]) } - err = rs.LoadRuleGroups(context.Background(), allGroupsMap) + err := rs.LoadRuleGroups(context.Background(), allGroupsMap) require.NoError(t, err) // After load, rules are loaded. @@ -388,12 +378,18 @@ func TestListAllRuleGroupsWithNoNamespaceOrGroup(t *testing.T) { } s := NewBucketRuleStore(obj, nil, log.NewNopLogger()) - out, err := s.ListAllRuleGroups(context.Background()) + out, err := s.ListRuleGroupsForUserAndNamespace(context.Background(), "user1", "") + require.NoError(t, err) + require.Equal(t, 0, len(out)) + + out, err = s.ListRuleGroupsForUserAndNamespace(context.Background(), "user2", "") require.NoError(t, err) + require.Equal(t, 0, len(out)) - require.Equal(t, 1, len(out)) // one user - require.Equal(t, 1, len(out["user3"])) // one group - require.Equal(t, "group1", out["user3"][0].Name) // one group + out, err = s.ListRuleGroupsForUserAndNamespace(context.Background(), "user3", "") + require.NoError(t, err) + require.Equal(t, 1, len(out)) // one group + require.Equal(t, "group1", out[0].Name) // also verify its name } type mockBucket struct { diff --git a/pkg/ruler/rulestore/local/local.go b/pkg/ruler/rulestore/local/local.go index 69842b1f095..9e575b89df4 100644 --- a/pkg/ruler/rulestore/local/local.go +++ b/pkg/ruler/rulestore/local/local.go @@ -77,26 +77,6 @@ func (l *Client) ListAllUsers(ctx context.Context) ([]string, error) { return result, nil } -// ListAllRuleGroups implements rules.RuleStore. This method also loads the rules. -func (l *Client) ListAllRuleGroups(ctx context.Context) (map[string]rulespb.RuleGroupList, error) { - users, err := l.ListAllUsers(ctx) - if err != nil { - return nil, err - } - - lists := make(map[string]rulespb.RuleGroupList) - for _, user := range users { - list, err := l.loadAllRulesGroupsForUser(ctx, user) - if err != nil { - return nil, errors.Wrapf(err, "failed to list rule groups for user %s", user) - } - - lists[user] = list - } - - return lists, nil -} - // ListRuleGroupsForUserAndNamespace implements rules.RuleStore. This method also loads the rules. func (l *Client) ListRuleGroupsForUserAndNamespace(ctx context.Context, userID string, namespace string) (rulespb.RuleGroupList, error) { if namespace != "" { diff --git a/pkg/ruler/rulestore/local/local_test.go b/pkg/ruler/rulestore/local/local_test.go index 14dc85eac40..23bf18e201a 100644 --- a/pkg/ruler/rulestore/local/local_test.go +++ b/pkg/ruler/rulestore/local/local_test.go @@ -78,8 +78,13 @@ func TestClient_LoadAllRuleGroups(t *testing.T) { require.NoError(t, err) ctx := context.Background() - userMap, err := client.ListAllRuleGroups(ctx) // Client loads rules in its List method. - require.NoError(t, err) + userMap := map[string]rulespb.RuleGroupList{} + + for _, u := range []string{user1, user2} { + rgl, err := client.ListRuleGroupsForUserAndNamespace(ctx, u, "") // Client loads rules in its List method. + require.NoError(t, err) + userMap[u] = rgl + } for _, u := range []string{user1, user2} { actual, found := userMap[u] diff --git a/pkg/ruler/rulestore/store.go b/pkg/ruler/rulestore/store.go index 57cbd6d35be..5955f928a34 100644 --- a/pkg/ruler/rulestore/store.go +++ b/pkg/ruler/rulestore/store.go @@ -28,11 +28,6 @@ type RuleStore interface { // ListAllUsers returns all users with rule groups configured. ListAllUsers(ctx context.Context) ([]string, error) - // ListAllRuleGroups returns all rule groups for all users. - // It *MUST* populate fields User, Namespace, Name of all rule groups. - // It *MAY* populate the actual rules. - ListAllRuleGroups(ctx context.Context) (map[string]rulespb.RuleGroupList, error) - // ListRuleGroupsForUserAndNamespace returns all the active rule groups for a user from given namespace. // It *MUST* populate fields User, Namespace, Name of all rule groups. // It *MAY* populate the actual rules. diff --git a/pkg/ruler/store_mock_test.go b/pkg/ruler/store_mock_test.go index daa66a221a0..3a1b72f51a1 100644 --- a/pkg/ruler/store_mock_test.go +++ b/pkg/ruler/store_mock_test.go @@ -22,45 +22,9 @@ type mockRuleStore struct { } var ( - delim = "/" - interval, _ = time.ParseDuration("1m") - mockRulesNamespaces = map[string]rulespb.RuleGroupList{ - "user1": { - &rulespb.RuleGroupDesc{ - Name: "group1", - Namespace: "namespace1", - User: "user1", - Rules: []*rulespb.RuleDesc{ - { - Record: "UP_RULE", - Expr: "up", - }, - { - Alert: "UP_ALERT", - Expr: "up < 1", - }, - }, - Interval: interval, - }, - &rulespb.RuleGroupDesc{ - Name: "fail", - Namespace: "namespace2", - User: "user1", - Rules: []*rulespb.RuleDesc{ - { - Record: "UP2_RULE", - Expr: "up", - }, - { - Alert: "UP2_ALERT", - Expr: "up < 1", - }, - }, - Interval: interval, - }, - }, - } - mockRules = map[string]rulespb.RuleGroupList{ + delim = "/" + interval, _ = time.ParseDuration("1m") + mockRules = map[string]rulespb.RuleGroupList{ "user1": { &rulespb.RuleGroupDesc{ Name: "group1", @@ -134,25 +98,6 @@ func (m *mockRuleStore) ListAllUsers(_ context.Context) ([]string, error) { return result, nil } -func (m *mockRuleStore) ListAllRuleGroups(_ context.Context) (map[string]rulespb.RuleGroupList, error) { - m.mtx.Lock() - defer m.mtx.Unlock() - - result := make(map[string]rulespb.RuleGroupList) - for k, v := range m.rules { - for _, r := range v { - result[k] = append(result[k], &rulespb.RuleGroupDesc{ - Namespace: r.Namespace, - Name: r.Name, - User: k, - Interval: r.Interval, - }) - } - } - - return result, nil -} - func (m *mockRuleStore) ListRuleGroupsForUserAndNamespace(_ context.Context, userID, namespace string) (rulespb.RuleGroupList, error) { m.mtx.Lock() defer m.mtx.Unlock() From 0fde0faa9591cafec371e7f8d6a4dfbaa9824cd6 Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Mon, 31 Jan 2022 11:40:01 +0100 Subject: [PATCH 050/168] Change default of distributor max-inflight-push-requests to 2000 (#964) * Change default of distributor max-inflight-push-requests to 2000 Default value of -distributor.instance-limits.max-inflight-push-requests set to 2000. 2000 should be the right value for a distributor running in a relatively small cluster, and with around 3GB of memory. Signed-off-by: Dimitar Dimitrov * Update docs Signed-off-by: Dimitar Dimitrov * Update CHANGELOG.md Signed-off-by: Dimitar Dimitrov * Update help.txt Signed-off-by: Dimitar Dimitrov --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 2 +- cmd/mimir/help.txt.tmpl | 2 +- docs/sources/configuration/config-file-reference.md | 2 +- pkg/distributor/distributor.go | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d03697f729a..0445baf01eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -241,6 +241,7 @@ * `-blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections` * `-frontend.results-cache.memcached.max-idle-connections` * [CHANGE] Querier: removed `-querier.worker-match-max-concurrent` and `-querier.worker-parallelism` CLI flags (and their respective YAML config options). Mimir now behaves like if `-querier.worker-match-max-concurrent` is always enabled and you should configure the max concurrency per querier process using `-querier.max-concurrent` instead. #958 +* [CHANGE] Distributor: change default value of `-distributor.instance-limits.max-inflight-push-requests` to `2000`. #964 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index e0c00da72be..220225ac988 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -708,7 +708,7 @@ Usage of ./cmd/mimir/mimir: -distributor.ingestion-tenant-shard-size int The tenant's shard size used by shuffle-sharding. Must be set both on ingesters and distributors. 0 disables shuffle sharding. -distributor.instance-limits.max-inflight-push-requests int - Max inflight push requests that this distributor can handle. This limit is per-distributor, not per-tenant. Additional requests will be rejected. 0 = unlimited. + Max inflight push requests that this distributor can handle. This limit is per-distributor, not per-tenant. Additional requests will be rejected. 0 = unlimited. (default 2000) -distributor.instance-limits.max-ingestion-rate float Max ingestion rate (samples/sec) that this distributor will accept. This limit is per-distributor, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited. -distributor.max-recv-msg-size int diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 948f660be0c..fb4e8067859 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -658,7 +658,7 @@ Usage of ./cmd/mimir/mimir: -distributor.ingestion-tenant-shard-size int The tenant's shard size used by shuffle-sharding. Must be set both on ingesters and distributors. 0 disables shuffle sharding. -distributor.instance-limits.max-inflight-push-requests int - Max inflight push requests that this distributor can handle. This limit is per-distributor, not per-tenant. Additional requests will be rejected. 0 = unlimited. + Max inflight push requests that this distributor can handle. This limit is per-distributor, not per-tenant. Additional requests will be rejected. 0 = unlimited. (default 2000) -distributor.instance-limits.max-ingestion-rate float Max ingestion rate (samples/sec) that this distributor will accept. This limit is per-distributor, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited. -distributor.replication-factor int diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 558b9c60f7d..f8aa5263ddd 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -582,7 +582,7 @@ instance_limits: # per-distributor, not per-tenant. Additional requests will be rejected. 0 = # unlimited. # CLI flag: -distributor.instance-limits.max-inflight-push-requests - [max_inflight_push_requests: | default = 0] + [max_inflight_push_requests: | default = 2000] ``` ### `ingester_config` diff --git a/pkg/distributor/distributor.go b/pkg/distributor/distributor.go index c1b1d73aa21..acf41965038 100644 --- a/pkg/distributor/distributor.go +++ b/pkg/distributor/distributor.go @@ -165,7 +165,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.BoolVar(&cfg.ExtendWrites, "distributor.extend-writes", true, "Try writing to an additional ingester in the presence of an ingester not in the ACTIVE state. It is useful to disable this along with -ingester.unregister-on-shutdown=false in order to not spread samples to extra ingesters during rolling restarts with consistent naming.") f.Float64Var(&cfg.InstanceLimits.MaxIngestionRate, "distributor.instance-limits.max-ingestion-rate", 0, "Max ingestion rate (samples/sec) that this distributor will accept. This limit is per-distributor, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited.") - f.IntVar(&cfg.InstanceLimits.MaxInflightPushRequests, "distributor.instance-limits.max-inflight-push-requests", 0, "Max inflight push requests that this distributor can handle. This limit is per-distributor, not per-tenant. Additional requests will be rejected. 0 = unlimited.") + f.IntVar(&cfg.InstanceLimits.MaxInflightPushRequests, "distributor.instance-limits.max-inflight-push-requests", 2000, "Max inflight push requests that this distributor can handle. This limit is per-distributor, not per-tenant. Additional requests will be rejected. 0 = unlimited.") } // Validate config and returns error on failure From 1788e41065de12e89f21a71408a4547fced93300 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Mon, 31 Jan 2022 12:03:59 +0100 Subject: [PATCH 051/168] Use sentence case in dashboards (#944) * Renamed alertmanager-resources.json to mimir-alertmanager-resources.json so that it's consistent with other dashboards Signed-off-by: Marco Pracucci * Convert dashboards to sentence case Signed-off-by: Marco Pracucci * Addressed some review comments Signed-off-by: Marco Pracucci --- ...json => mimir-alertmanager-resources.json} | 12 ++-- .../dashboards/mimir-alertmanager.json | 38 ++++++------ .../dashboards/mimir-compactor-resources.json | 14 ++--- .../dashboards/mimir-compactor.json | 22 +++---- .../dashboards/mimir-config.json | 2 +- .../dashboards/mimir-object-store.json | 2 +- .../dashboards/mimir-overrides.json | 4 +- .../dashboards/mimir-queries.json | 52 ++++++++--------- .../dashboards/mimir-reads-networking.json | 52 ++++++++--------- .../dashboards/mimir-reads-resources.json | 14 ++--- .../dashboards/mimir-reads.json | 58 +++++++++---------- .../dashboards/mimir-rollout-progress.json | 8 +-- .../dashboards/mimir-ruler.json | 50 ++++++++-------- .../dashboards/mimir-scaling.json | 4 +- .../dashboards/mimir-slow-queries.json | 4 +- .../dashboards/mimir-tenants.json | 6 +- .../dashboards/mimir-top-tenants.json | 2 +- .../dashboards/mimir-writes-networking.json | 28 ++++----- .../dashboards/mimir-writes-resources.json | 10 ++-- .../dashboards/mimir-writes.json | 18 +++--- .../alertmanager-resources.libsonnet | 8 +-- .../dashboards/alertmanager.libsonnet | 24 ++++---- .../dashboards/compactor-resources.libsonnet | 8 +-- .../dashboards/compactor.libsonnet | 8 +-- .../dashboards/dashboard-utils.libsonnet | 22 +++---- .../dashboards/overrides.libsonnet | 2 +- .../mimir-mixin/dashboards/queries.libsonnet | 58 +++++++++---------- .../dashboards/reads-networking.libsonnet | 2 +- .../dashboards/reads-resources.libsonnet | 12 ++-- .../mimir-mixin/dashboards/reads.libsonnet | 32 +++++----- .../dashboards/rollout-progress.libsonnet | 6 +- .../mimir-mixin/dashboards/ruler.libsonnet | 36 ++++++------ .../mimir-mixin/dashboards/scaling.libsonnet | 2 +- .../dashboards/slow-queries.libsonnet | 2 +- .../mimir-mixin/dashboards/tenants.libsonnet | 4 +- .../dashboards/writes-networking.libsonnet | 2 +- .../dashboards/writes-resources.libsonnet | 8 +-- .../mimir-mixin/dashboards/writes.libsonnet | 16 ++--- 38 files changed, 326 insertions(+), 326 deletions(-) rename operations/mimir-mixin-compiled/dashboards/{alertmanager-resources.json => mimir-alertmanager-resources.json} (99%) diff --git a/operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json b/operations/mimir-mixin-compiled/dashboards/mimir-alertmanager-resources.json similarity index 99% rename from operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json rename to operations/mimir-mixin-compiled/dashboards/mimir-alertmanager-resources.json index 7cd6553a7f6..d7d747deff2 100644 --- a/operations/mimir-mixin-compiled/dashboards/alertmanager-resources.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-alertmanager-resources.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -820,7 +820,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Instance Mapper", + "title": "Instance mapper", "titleSize": "h6" }, { @@ -871,7 +871,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -948,7 +948,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -1203,7 +1203,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Disk Space Utilization", + "title": "Disk space utilization", "tooltip": { "shared": false, "sort": 0, @@ -1344,7 +1344,7 @@ ] }, "timezone": "utc", - "title": "Mimir / Alertmanager Resources", + "title": "Mimir / Alertmanager resources", "uid": "68b66aed90ccab448009089544a8d6c6", "version": 0 } \ No newline at end of file diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-alertmanager.json b/operations/mimir-mixin-compiled/dashboards/mimir-alertmanager.json index 51d2f0453cc..fd8121867b1 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-alertmanager.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-alertmanager.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -69,7 +69,7 @@ "thresholds": "70,80", "timeFrom": null, "timeShift": null, - "title": "Total Alerts", + "title": "Total alerts", "tooltip": { "shared": false, "sort": 0, @@ -145,7 +145,7 @@ "thresholds": "70,80", "timeFrom": null, "timeShift": null, - "title": "Total Silences", + "title": "Total silences", "tooltip": { "shared": false, "sort": 0, @@ -357,7 +357,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Alerts Received", + "title": "Alerts received", "titleSize": "h6" }, { @@ -636,7 +636,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Alert Notifications", + "title": "Alert notifications", "titleSize": "h6" }, { @@ -1048,7 +1048,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Attributes", + "title": "Latency of op: Attributes", "tooltip": { "shared": false, "sort": 0, @@ -1143,7 +1143,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Exists", + "title": "Latency of op: Exists", "tooltip": { "shared": false, "sort": 0, @@ -1250,7 +1250,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Get", + "title": "Latency of op: Get", "tooltip": { "shared": false, "sort": 0, @@ -1345,7 +1345,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: GetRange", + "title": "Latency of op: GetRange", "tooltip": { "shared": false, "sort": 0, @@ -1440,7 +1440,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Upload", + "title": "Latency of op: Upload", "tooltip": { "shared": false, "sort": 0, @@ -1535,7 +1535,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Delete", + "title": "Latency of op: Delete", "tooltip": { "shared": false, "sort": 0, @@ -1624,7 +1624,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod Tenants", + "title": "Per pod tenants", "tooltip": { "shared": false, "sort": 0, @@ -1701,7 +1701,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod Alerts", + "title": "Per pod alerts", "tooltip": { "shared": false, "sort": 0, @@ -1778,7 +1778,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod Silences", + "title": "Per pod silences", "tooltip": { "shared": false, "sort": 0, @@ -1953,7 +1953,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Syncs/sec (By Reason)", + "title": "Syncs/sec (by reason)", "tooltip": { "shared": false, "sort": 0, @@ -2030,7 +2030,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Ring Check Errors/sec", + "title": "Ring check errors/sec", "tooltip": { "shared": false, "sort": 0, @@ -2068,7 +2068,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Tenant Configuration Sync", + "title": "Tenant configuration sync", "titleSize": "h6" }, { @@ -2338,7 +2338,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Sharding Initial State Sync", + "title": "Sharding initial state sync", "titleSize": "h6" }, { @@ -2608,7 +2608,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Sharding Runtime State Sync", + "title": "Sharding runtime state sync", "titleSize": "h6" } ], diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-compactor-resources.json b/operations/mimir-mixin-compiled/dashboards/mimir-compactor-resources.json index ebbf4c0a2a1..7644ce14e4e 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-compactor-resources.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-compactor-resources.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -286,7 +286,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "CPU and Memory", + "title": "CPU and memory", "titleSize": "h6" }, { @@ -337,7 +337,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -414,7 +414,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -503,7 +503,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Disk Writes", + "title": "Disk writes", "tooltip": { "shared": false, "sort": 0, @@ -580,7 +580,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Disk Reads", + "title": "Disk reads", "tooltip": { "shared": false, "sort": 0, @@ -657,7 +657,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Disk Space Utilization", + "title": "Disk space utilization", "tooltip": { "shared": false, "sort": 0, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-compactor.json b/operations/mimir-mixin-compiled/dashboards/mimir-compactor.json index a8008d39933..d05d07db3da 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-compactor.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-compactor.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -740,7 +740,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Garbage Collector", + "title": "Garbage collector", "titleSize": "h6" }, { @@ -803,7 +803,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Metadata Syncs / sec", + "title": "Metadata syncs / sec", "tooltip": { "shared": false, "sort": 0, @@ -898,7 +898,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Metadata Sync Duration", + "title": "Metadata sync duration", "tooltip": { "shared": false, "sort": 0, @@ -936,7 +936,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Metadata Sync", + "title": "Metadata sync", "titleSize": "h6" }, { @@ -1159,7 +1159,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Attributes", + "title": "Latency of op: Attributes", "tooltip": { "shared": false, "sort": 0, @@ -1254,7 +1254,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Exists", + "title": "Latency of op: Exists", "tooltip": { "shared": false, "sort": 0, @@ -1361,7 +1361,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Get", + "title": "Latency of op: Get", "tooltip": { "shared": false, "sort": 0, @@ -1456,7 +1456,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: GetRange", + "title": "Latency of op: GetRange", "tooltip": { "shared": false, "sort": 0, @@ -1551,7 +1551,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Upload", + "title": "Latency of op: Upload", "tooltip": { "shared": false, "sort": 0, @@ -1646,7 +1646,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Delete", + "title": "Latency of op: Delete", "tooltip": { "shared": false, "sort": 0, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-config.json b/operations/mimir-mixin-compiled/dashboards/mimir-config.json index 6f81ccf442e..233a64da209 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-config.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-config.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-object-store.json b/operations/mimir-mixin-compiled/dashboards/mimir-object-store.json index fd36a8a7de4..26fb077351c 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-object-store.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-object-store.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-overrides.json b/operations/mimir-mixin-compiled/dashboards/mimir-overrides.json index 3e11dc73523..73d2ea3d1db 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-overrides.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-overrides.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -98,7 +98,7 @@ "refId": "A" } ], - "title": "Per-Tenant Overrides", + "title": "Per-tenant overrides", "transformations": [ { "id": "labelsToFields", diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-queries.json b/operations/mimir-mixin-compiled/dashboards/mimir-queries.json index 5d44330f585..1072fe163c9 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-queries.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-queries.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -88,7 +88,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Queue Duration", + "title": "Queue duration", "tooltip": { "shared": false, "sort": 0, @@ -260,7 +260,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Queue Length (per pod)", + "title": "Queue length (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -337,7 +337,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Queue Length (per user)", + "title": "Queue length (per user)", "tooltip": { "shared": false, "sort": 0, @@ -375,7 +375,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Query Frontend", + "title": "Query-frontend", "titleSize": "h6" }, { @@ -444,7 +444,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Queue Duration", + "title": "Queue duration", "tooltip": { "shared": false, "sort": 0, @@ -521,7 +521,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Queue Length (per pod)", + "title": "Queue length (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -598,7 +598,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Queue Length (per user)", + "title": "Queue length (per user)", "tooltip": { "shared": false, "sort": 0, @@ -636,7 +636,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Query Scheduler", + "title": "Query-scheduler", "titleSize": "h6" }, { @@ -649,7 +649,7 @@ "dashLength": 10, "dashes": false, "datasource": "$datasource", - "description": "### Intervals per Query\nThe average number of splitted queries (partitioned by time) executed a single input query.\n\n", + "description": "### Intervals per query\nThe average number of split queries (partitioned by time) executed a single input query.\n\n", "fill": 1, "id": 8, "legend": { @@ -757,7 +757,7 @@ "format": "time_series", "interval": "15s", "intervalFactor": 2, - "legendFormat": "Hit Rate", + "legendFormat": "Hit rate", "legendLink": null, "step": 10 } @@ -765,7 +765,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Results Cache Hit %", + "title": "Results cache hit %", "tooltip": { "shared": false, "sort": 0, @@ -834,7 +834,7 @@ "format": "time_series", "interval": "15s", "intervalFactor": 2, - "legendFormat": "Miss Rate", + "legendFormat": "Miss rate", "legendLink": null, "step": 10 } @@ -842,7 +842,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Results Cache misses", + "title": "Results cache misses", "tooltip": { "shared": false, "sort": 0, @@ -880,7 +880,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Query Frontend - Query Splitting and Results Cache", + "title": "Query-frontend - query splitting and results cache", "titleSize": "h6" }, { @@ -893,7 +893,7 @@ "dashLength": 10, "dashes": false, "datasource": "$datasource", - "description": "### Sharded Queries Ratio\nThe % of queries that have been successfully rewritten and executed in a shardable way.\nThis panel takes in account only type of queries which are supported by query sharding (eg. range queries).\n\n", + "description": "### Sharded queries ratio\nThe % of queries that have been successfully rewritten and executed in a shardable way.\nThis panel only takes into account the type of queries that are supported by query sharding (eg. range queries).\n\n", "fill": 1, "id": 11, "legend": { @@ -932,7 +932,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Sharded Queries Ratio", + "title": "Sharded queries ratio", "tooltip": { "shared": false, "sort": 0, @@ -971,7 +971,7 @@ "dashLength": 10, "dashes": false, "datasource": "$datasource", - "description": "### Number of Sharded Queries per Query\nHow many sharded queries have been executed for a single input query. It tracks only queries which have\nbeen successfully rewritten in a shardable way.\n\n", + "description": "### Number of sharded queries per query\nThe number of sharded queries that have been executed for a single input query. It only tracks queries that\nhave been successfully rewritten in a shardable way.\n\n", "fill": 1, "id": 12, "legend": { @@ -1028,7 +1028,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Number of Sharded Queries per Query", + "title": "Number of sharded queries per query", "tooltip": { "shared": false, "sort": 0, @@ -1066,7 +1066,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Query Frontend - Query sharding", + "title": "Query-frontend - query sharding", "titleSize": "h6" }, { @@ -1221,7 +1221,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Series per Query", + "title": "Series per query", "tooltip": { "shared": false, "sort": 0, @@ -1313,7 +1313,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Chunks per Query", + "title": "Chunks per query", "tooltip": { "shared": false, "sort": 0, @@ -1405,7 +1405,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Samples per Query", + "title": "Samples per query", "tooltip": { "shared": false, "sort": 0, @@ -1497,7 +1497,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Exemplars per Query", + "title": "Exemplars per query", "tooltip": { "shared": false, "sort": 0, @@ -1604,7 +1604,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Number of store-gateways hit per Query", + "title": "Number of store-gateways hit per query", "tooltip": { "shared": false, "sort": 0, @@ -1699,7 +1699,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Refetches of missing blocks per Query", + "title": "Refetches of missing blocks per query", "tooltip": { "shared": false, "sort": 0, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json b/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json index 9a662f4690d..966e7f312f1 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-reads-networking.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -70,7 +70,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -147,7 +147,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -233,7 +233,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Inflight Requests (per pod)", + "title": "Inflight requests (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -328,7 +328,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "TCP Connections (per pod)", + "title": "TCP connections (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -417,7 +417,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -494,7 +494,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -580,7 +580,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Inflight Requests (per pod)", + "title": "Inflight requests (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -675,7 +675,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "TCP Connections (per pod)", + "title": "TCP connections (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -764,7 +764,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -841,7 +841,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -927,7 +927,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Inflight Requests (per pod)", + "title": "Inflight requests (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -1022,7 +1022,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "TCP Connections (per pod)", + "title": "TCP connections (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -1111,7 +1111,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -1188,7 +1188,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -1274,7 +1274,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Inflight Requests (per pod)", + "title": "Inflight requests (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -1369,7 +1369,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "TCP Connections (per pod)", + "title": "TCP connections (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -1458,7 +1458,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -1535,7 +1535,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -1621,7 +1621,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Inflight Requests (per pod)", + "title": "Inflight requests (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -1716,7 +1716,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "TCP Connections (per pod)", + "title": "TCP connections (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -1805,7 +1805,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -1882,7 +1882,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -1968,7 +1968,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Inflight Requests (per pod)", + "title": "Inflight requests (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -2063,7 +2063,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "TCP Connections (per pod)", + "title": "TCP connections (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -2204,7 +2204,7 @@ ] }, "timezone": "utc", - "title": "Mimir / Reads Networking", + "title": "Mimir / Reads networking", "uid": "c0464f0d8bd026f776c9006b05910000", "version": 0 } \ No newline at end of file diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json b/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json index 534b9b948b0..c07952884a2 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-reads-resources.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -553,7 +553,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Query Frontend", + "title": "Query-frontend", "titleSize": "h6" }, { @@ -820,7 +820,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Query Scheduler", + "title": "Query-scheduler", "titleSize": "h6" }, { @@ -2028,7 +2028,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Disk Writes", + "title": "Disk writes", "tooltip": { "shared": false, "sort": 0, @@ -2105,7 +2105,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Disk Reads", + "title": "Disk reads", "tooltip": { "shared": false, "sort": 0, @@ -2182,7 +2182,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Disk Space Utilization", + "title": "Disk space utilization", "tooltip": { "shared": false, "sort": 0, @@ -2323,7 +2323,7 @@ ] }, "timezone": "utc", - "title": "Mimir / Reads Resources", + "title": "Mimir / Reads resources", "uid": "2fd2cda9eea8d8af9fbc0a5960425120", "version": 0 } \ No newline at end of file diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-reads.json b/operations/mimir-mixin-compiled/dashboards/mimir-reads.json index 706a70619c4..67478633ca3 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-reads.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-reads.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -430,7 +430,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod p99 Latency", + "title": "Per pod p99 latency", "tooltip": { "sort": 2 }, @@ -688,7 +688,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod p99 Latency", + "title": "Per pod p99 latency", "tooltip": { "sort": 2 }, @@ -724,7 +724,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Query Frontend", + "title": "Query-frontend", "titleSize": "h6" }, { @@ -927,7 +927,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Query Scheduler", + "title": "Query-scheduler", "titleSize": "h6" }, { @@ -1203,7 +1203,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Cache - Query Results", + "title": "Cache – query results", "titleSize": "h6" }, { @@ -1425,7 +1425,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod p99 Latency", + "title": "Per pod p99 latency", "tooltip": { "sort": 2 }, @@ -1683,7 +1683,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod p99 Latency", + "title": "Per pod p99 latency", "tooltip": { "sort": 2 }, @@ -1941,7 +1941,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod p99 Latency", + "title": "Per pod p99 latency", "tooltip": { "sort": 2 }, @@ -2169,7 +2169,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Store-gateway - Key-value store for store-gateways ring", + "title": "Store-gateway – key-value store for store-gateways ring", "titleSize": "h6" }, { @@ -2354,7 +2354,7 @@ "dashLength": 10, "dashes": false, "datasource": "$datasource", - "description": "### Hit Ratio\nEven if you do not set up memcached for the blocks index cache, you will still see data in this panel because the store-gateway by default has an\nin-memory blocks index cache.\n\n", + "description": "### Hit ratio\nEven if you do not set up memcached for the blocks index cache, you will still see data in this panel because the store-gateway by default has an\nin-memory blocks index cache.\n\n", "fill": 1, "id": 29, "legend": { @@ -2431,7 +2431,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Memcached – Block index cache (store-gateway accesses)", + "title": "Memcached – block index cache (store-gateway accesses)", "titleSize": "h6" }, { @@ -2692,7 +2692,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Memcached – Chunks cache (store-gateway accesses)", + "title": "Memcached – chunks cache (store-gateway accesses)", "titleSize": "h6" }, { @@ -2953,7 +2953,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Memcached – Metadata cache (store-gateway accesses)", + "title": "Memcached – metadata cache (store-gateway accesses)", "titleSize": "h6" }, { @@ -3214,7 +3214,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Memcached – Metadata cache (querier accesses)", + "title": "Memcached – metadata cache (querier accesses)", "titleSize": "h6" }, { @@ -3437,7 +3437,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Attributes", + "title": "Latency of op: Attributes", "tooltip": { "shared": false, "sort": 0, @@ -3532,7 +3532,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Exists", + "title": "Latency of op: Exists", "tooltip": { "shared": false, "sort": 0, @@ -3570,7 +3570,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Blocks Object Store (Store-gateway accesses)", + "title": "Blocks object store (store-gateway accesses)", "titleSize": "h6" }, { @@ -3639,7 +3639,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Get", + "title": "Latency of op: Get", "tooltip": { "shared": false, "sort": 0, @@ -3734,7 +3734,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: GetRange", + "title": "Latency of op: GetRange", "tooltip": { "shared": false, "sort": 0, @@ -3829,7 +3829,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Upload", + "title": "Latency of op: Upload", "tooltip": { "shared": false, "sort": 0, @@ -3924,7 +3924,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Delete", + "title": "Latency of op: Delete", "tooltip": { "shared": false, "sort": 0, @@ -4185,7 +4185,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Attributes", + "title": "Latency of op: Attributes", "tooltip": { "shared": false, "sort": 0, @@ -4280,7 +4280,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Exists", + "title": "Latency of op: Exists", "tooltip": { "shared": false, "sort": 0, @@ -4318,7 +4318,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Blocks Object Store (Querier accesses)", + "title": "Blocks object store (querier accesses)", "titleSize": "h6" }, { @@ -4387,7 +4387,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Get", + "title": "Latency of op: Get", "tooltip": { "shared": false, "sort": 0, @@ -4482,7 +4482,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: GetRange", + "title": "Latency of op: GetRange", "tooltip": { "shared": false, "sort": 0, @@ -4577,7 +4577,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Upload", + "title": "Latency of op: Upload", "tooltip": { "shared": false, "sort": 0, @@ -4672,7 +4672,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Delete", + "title": "Latency of op: Delete", "tooltip": { "shared": false, "sort": 0, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-rollout-progress.json b/operations/mimir-mixin-compiled/dashboards/mimir-rollout-progress.json index 56b91e2215e..50887116de9 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-rollout-progress.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-rollout-progress.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -553,7 +553,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Writes 99th Latency", + "title": "Writes 99th latency", "tooltip": { "shared": false, "sort": 0, @@ -989,7 +989,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Reads 99th Latency", + "title": "Reads 99th latency", "tooltip": { "shared": false, "sort": 0, @@ -1183,7 +1183,7 @@ "refId": "A" } ], - "title": "Pods count per Version", + "title": "Pods count per version", "transformations": [ { "id": "labelsToFields", diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-ruler.json b/operations/mimir-mixin-compiled/dashboards/mimir-ruler.json index 6efb200c9e8..04376c150ca 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-ruler.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-ruler.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -69,7 +69,7 @@ "thresholds": "70,80", "timeFrom": null, "timeShift": null, - "title": "Active Configurations", + "title": "Active configurations", "tooltip": { "shared": false, "sort": 0, @@ -145,7 +145,7 @@ "thresholds": "70,80", "timeFrom": null, "timeShift": null, - "title": "Total Rules", + "title": "Total rules", "tooltip": { "shared": false, "sort": 0, @@ -221,7 +221,7 @@ "thresholds": "70,80", "timeFrom": null, "timeShift": null, - "title": "Read from Ingesters - QPS", + "title": "Read from ingesters - QPS", "tooltip": { "shared": false, "sort": 0, @@ -297,7 +297,7 @@ "thresholds": "70,80", "timeFrom": null, "timeShift": null, - "title": "Write to Ingesters - QPS", + "title": "Write to ingesters - QPS", "tooltip": { "shared": false, "sort": 0, @@ -510,7 +510,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Rule Evaluations Global", + "title": "Rule evaluations global", "titleSize": "h6" }, { @@ -738,7 +738,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per route p99 Latency", + "title": "Per route p99 latency", "tooltip": { "shared": false, "sort": 0, @@ -968,7 +968,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Writes (Ingesters)", + "title": "Writes (ingesters)", "titleSize": "h6" }, { @@ -1160,7 +1160,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Reads (Ingesters)", + "title": "Reads (ingesters)", "titleSize": "h6" }, { @@ -1352,7 +1352,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Ruler - Key-value store for rulers ring", + "title": "Ruler - key-value store for rulers ring", "titleSize": "h6" }, { @@ -1421,7 +1421,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Number of store-gateways hit per Query", + "title": "Number of store-gateways hit per query", "tooltip": { "shared": false, "sort": 0, @@ -1516,7 +1516,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Refetches of missing blocks per Query", + "title": "Refetches of missing blocks per query", "tooltip": { "shared": false, "sort": 0, @@ -1631,7 +1631,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Ruler - Blocks storage", + "title": "Ruler - blocks storage", "titleSize": "h6" }, { @@ -1682,7 +1682,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Delivery Errors", + "title": "Delivery errors", "tooltip": { "shared": false, "sort": 0, @@ -1759,7 +1759,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Queue Length", + "title": "Queue length", "tooltip": { "shared": false, "sort": 0, @@ -1925,7 +1925,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Missed Iterations", + "title": "Missed iterations", "tooltip": { "shared": false, "sort": 0, @@ -2117,7 +2117,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Group Evaluations", + "title": "Group evaluations", "titleSize": "h6" }, { @@ -2206,7 +2206,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Rule Evaluation per User", + "title": "Rule evaluation per user", "titleSize": "h6" }, { @@ -2429,7 +2429,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Attributes", + "title": "Latency of op: Attributes", "tooltip": { "shared": false, "sort": 0, @@ -2524,7 +2524,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Exists", + "title": "Latency of op: Exists", "tooltip": { "shared": false, "sort": 0, @@ -2562,7 +2562,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Ruler Configuration Object Store (Ruler accesses)", + "title": "Ruler configuration object store (ruler accesses)", "titleSize": "h6" }, { @@ -2631,7 +2631,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Get", + "title": "Latency of op: Get", "tooltip": { "shared": false, "sort": 0, @@ -2726,7 +2726,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: GetRange", + "title": "Latency of op: GetRange", "tooltip": { "shared": false, "sort": 0, @@ -2821,7 +2821,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Upload", + "title": "Latency of op: Upload", "tooltip": { "shared": false, "sort": 0, @@ -2916,7 +2916,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Latency of Op: Delete", + "title": "Latency of op: Delete", "tooltip": { "shared": false, "sort": 0, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-scaling.json b/operations/mimir-mixin-compiled/dashboards/mimir-scaling.json index 4e34c80e51b..fe5cf808da0 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-scaling.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-scaling.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -41,7 +41,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Service Scaling", + "title": "Service scaling", "titleSize": "h6" }, { diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-slow-queries.json b/operations/mimir-mixin-compiled/dashboards/mimir-slow-queries.json index 690b7838567..3ec7bf49386 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-slow-queries.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-slow-queries.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -304,7 +304,7 @@ ] }, "timezone": "utc", - "title": "Mimir / Slow Queries", + "title": "Mimir / Slow queries", "uid": "e6f3091e29d2636e3b8393447e925668", "version": 0 } \ No newline at end of file diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-tenants.json b/operations/mimir-mixin-compiled/dashboards/mimir-tenants.json index d2a2f138516..c0628c9fada 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-tenants.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-tenants.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -631,7 +631,7 @@ "dashLength": 10, "dashes": false, "datasource": "$datasource", - "description": "### Distributor/Ingester discarded samples rate\nThe rate of each samples' discarding reason.\n\n", + "description": "### Distributor and ingester discarded samples rate\nThe rate of each sample's discarding reason.\n\n", "fill": 1, "id": 9, "legend": { @@ -679,7 +679,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Distributor/Ingester discarded samples rate", + "title": "Distributor and ingester discarded samples rate", "tooltip": { "shared": false, "sort": 0, diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-top-tenants.json b/operations/mimir-mixin-compiled/dashboards/mimir-top-tenants.json index 0b7d78ed4f0..ad790058e93 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-top-tenants.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-top-tenants.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json b/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json index c2eb454d95f..124b7aaa18d 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-writes-networking.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -70,7 +70,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -147,7 +147,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -233,7 +233,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Inflight Requests (per pod)", + "title": "Inflight requests (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -328,7 +328,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "TCP Connections (per pod)", + "title": "TCP connections (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -417,7 +417,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -494,7 +494,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -580,7 +580,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Inflight Requests (per pod)", + "title": "Inflight requests (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -675,7 +675,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "TCP Connections (per pod)", + "title": "TCP connections (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -764,7 +764,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Receive Bandwidth", + "title": "Receive bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -841,7 +841,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Transmit Bandwidth", + "title": "Transmit bandwidth", "tooltip": { "shared": false, "sort": 0, @@ -927,7 +927,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Inflight Requests (per pod)", + "title": "Inflight requests (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -1022,7 +1022,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "TCP Connections (per pod)", + "title": "TCP connections (per pod)", "tooltip": { "shared": false, "sort": 0, @@ -1163,7 +1163,7 @@ ] }, "timezone": "utc", - "title": "Mimir / Writes Networking", + "title": "Mimir / Writes networking", "uid": "681cd62b680b7154811fe73af55dcfd4", "version": 0 } \ No newline at end of file diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json b/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json index 0cb25d0c81d..cbb6f187590 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-writes-resources.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -958,7 +958,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Disk Writes", + "title": "Disk writes", "tooltip": { "shared": false, "sort": 0, @@ -1035,7 +1035,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Disk Reads", + "title": "Disk reads", "tooltip": { "shared": false, "sort": 0, @@ -1112,7 +1112,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Disk Space Utilization", + "title": "Disk space utilization", "tooltip": { "shared": false, "sort": 0, @@ -1253,7 +1253,7 @@ ] }, "timezone": "utc", - "title": "Mimir / Writes Resources", + "title": "Mimir / Writes resources", "uid": "c0464f0d8bd026f776c9006b0591bb0b", "version": 0 } \ No newline at end of file diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-writes.json b/operations/mimir-mixin-compiled/dashboards/mimir-writes.json index e5a8c8e9241..da76955b2b5 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-writes.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-writes.json @@ -16,7 +16,7 @@ "mimir" ], "targetBlank": false, - "title": "Mimir Dashboards", + "title": "Mimir dashboards", "type": "dashboards" } ], @@ -735,7 +735,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod p99 Latency", + "title": "Per pod p99 latency", "tooltip": { "sort": 2 }, @@ -993,7 +993,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod p99 Latency", + "title": "Per pod p99 latency", "tooltip": { "sort": 2 }, @@ -1251,7 +1251,7 @@ "thresholds": [ ], "timeFrom": null, "timeShift": null, - "title": "Per pod p99 Latency", + "title": "Per pod p99 latency", "tooltip": { "sort": 2 }, @@ -1479,7 +1479,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Distributor - Key-value store for high-availability (HA) deduplication", + "title": "Distributor - key-value store for high-availability (HA) deduplication", "titleSize": "h6" }, { @@ -1671,7 +1671,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Distributor - Key-value store for distributors ring", + "title": "Distributor - key-value store for distributors ring", "titleSize": "h6" }, { @@ -1863,7 +1863,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Ingester - Key-value store for the ingesters ring", + "title": "Ingester - key-value store for the ingesters ring", "titleSize": "h6" }, { @@ -2061,7 +2061,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Ingester - Shipper", + "title": "Ingester - shipper", "titleSize": "h6" }, { @@ -2259,7 +2259,7 @@ "repeatIteration": null, "repeatRowId": null, "showTitle": true, - "title": "Ingester - TSDB Head", + "title": "Ingester - TSDB head", "titleSize": "h6" }, { diff --git a/operations/mimir-mixin/dashboards/alertmanager-resources.libsonnet b/operations/mimir-mixin/dashboards/alertmanager-resources.libsonnet index 31b638e900e..20385bf1e5c 100644 --- a/operations/mimir-mixin/dashboards/alertmanager-resources.libsonnet +++ b/operations/mimir-mixin/dashboards/alertmanager-resources.libsonnet @@ -1,8 +1,8 @@ local utils = import 'mixin-utils/utils.libsonnet'; (import 'dashboard-utils.libsonnet') { - 'alertmanager-resources.json': - ($.dashboard('Alertmanager Resources') + { uid: '68b66aed90ccab448009089544a8d6c6' }) + 'mimir-alertmanager-resources.json': + ($.dashboard('Alertmanager resources') + { uid: '68b66aed90ccab448009089544a8d6c6' }) .addClusterSelectorTemplates(false) .addRow( $.row('Gateway') @@ -29,7 +29,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Instance Mapper') + $.row('Instance mapper') .addPanel( $.containerCPUUsagePanel('CPU', 'alertmanager-im'), ) @@ -61,7 +61,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; .addRow( $.row('') .addPanel( - $.containerDiskSpaceUtilization('Disk Space Utilization', 'alertmanager'), + $.containerDiskSpaceUtilization('Disk space utilization', 'alertmanager'), ) ), } diff --git a/operations/mimir-mixin/dashboards/alertmanager.libsonnet b/operations/mimir-mixin/dashboards/alertmanager.libsonnet index c78dc530839..2c84ff11190 100644 --- a/operations/mimir-mixin/dashboards/alertmanager.libsonnet +++ b/operations/mimir-mixin/dashboards/alertmanager.libsonnet @@ -10,11 +10,11 @@ local utils = import 'mixin-utils/utils.libsonnet'; showTitle: false, }) .addPanel( - $.panel('Total Alerts') + + $.panel('Total alerts') + $.statPanel('sum(cluster_job_%s:cortex_alertmanager_alerts:sum{%s})' % [$._config.per_instance_label, $.jobMatcher('alertmanager')], format='short') ) .addPanel( - $.panel('Total Silences') + + $.panel('Total silences') + $.statPanel('sum(cluster_job_%s:cortex_alertmanager_silences:sum{%s})' % [$._config.per_instance_label, $.jobMatcher('alertmanager')], format='short') ) .addPanel( @@ -23,7 +23,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Alerts Received') + $.row('Alerts received') .addPanel( $.panel('APS') + $.queryPanel( @@ -40,7 +40,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Alert Notifications') + $.row('Alert notifications') .addPanel( $.panel('NPS') + $.queryPanel( @@ -94,7 +94,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; .addRow( $.row('Replication') .addPanel( - $.panel('Per %s Tenants' % $._config.per_instance_label) + + $.panel('Per %s tenants' % $._config.per_instance_label) + $.queryPanel( 'max by(%s) (cortex_alertmanager_tenants_owned{%s})' % [$._config.per_instance_label, $.jobMatcher('alertmanager')], '{{%s}}' % $._config.per_instance_label @@ -102,7 +102,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; $.stack ) .addPanel( - $.panel('Per %s Alerts' % $._config.per_instance_label) + + $.panel('Per %s alerts' % $._config.per_instance_label) + $.queryPanel( 'sum by(%s) (cluster_job_%s:cortex_alertmanager_alerts:sum{%s})' % [$._config.per_instance_label, $._config.per_instance_label, $.jobMatcher('alertmanager')], '{{%s}}' % $._config.per_instance_label @@ -110,7 +110,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; $.stack ) .addPanel( - $.panel('Per %s Silences' % $._config.per_instance_label) + + $.panel('Per %s silences' % $._config.per_instance_label) + $.queryPanel( 'sum by(%s) (cluster_job_%s:cortex_alertmanager_silences:sum{%s})' % [$._config.per_instance_label, $._config.per_instance_label, $.jobMatcher('alertmanager')], '{{%s}}' % $._config.per_instance_label @@ -119,7 +119,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Tenant Configuration Sync') + $.row('Tenant configuration sync') .addPanel( $.panel('Syncs/sec') + $.queryPanel( @@ -135,14 +135,14 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addPanel( - $.panel('Syncs/sec (By Reason)') + + $.panel('Syncs/sec (by reason)') + $.queryPanel( 'sum by(reason) (rate(cortex_alertmanager_sync_configs_total{%s}[$__rate_interval]))' % $.jobMatcher('alertmanager'), '{{reason}}' ) ) .addPanel( - $.panel('Ring Check Errors/sec') + + $.panel('Ring check errors/sec') + $.queryPanel( 'sum (rate(cortex_alertmanager_ring_check_errors_total{%s}[$__rate_interval]))' % $.jobMatcher('alertmanager'), 'errors' @@ -150,7 +150,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Sharding Initial State Sync') + $.row('Sharding initial state sync') .addPanel( $.panel('Initial syncs /sec') + $.queryPanel( @@ -199,7 +199,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Sharding Runtime State Sync') + $.row('Sharding runtime state sync') .addPanel( $.panel('Replicate state to other alertmanagers /sec') + $.queryPanel( diff --git a/operations/mimir-mixin/dashboards/compactor-resources.libsonnet b/operations/mimir-mixin/dashboards/compactor-resources.libsonnet index a81b4f8a70d..9358276fa7e 100644 --- a/operations/mimir-mixin/dashboards/compactor-resources.libsonnet +++ b/operations/mimir-mixin/dashboards/compactor-resources.libsonnet @@ -5,7 +5,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ($.dashboard('Compactor Resources') + { uid: 'df9added6f1f4332f95848cca48ebd99' }) .addClusterSelectorTemplates() .addRow( - $.row('CPU and Memory') + $.row('CPU and memory') .addPanel( $.containerCPUUsagePanel('CPU', 'compactor'), ) @@ -28,13 +28,13 @@ local utils = import 'mixin-utils/utils.libsonnet'; .addRow( $.row('Disk') .addPanel( - $.containerDiskWritesPanel('Disk Writes', 'compactor'), + $.containerDiskWritesPanel('Disk writes', 'compactor'), ) .addPanel( - $.containerDiskReadsPanel('Disk Reads', 'compactor'), + $.containerDiskReadsPanel('Disk reads', 'compactor'), ) .addPanel( - $.containerDiskSpaceUtilization('Disk Space Utilization', 'compactor'), + $.containerDiskSpaceUtilization('Disk space utilization', 'compactor'), ) ) + { templating+: { diff --git a/operations/mimir-mixin/dashboards/compactor.libsonnet b/operations/mimir-mixin/dashboards/compactor.libsonnet index 7e46c17b8a8..e3046225658 100644 --- a/operations/mimir-mixin/dashboards/compactor.libsonnet +++ b/operations/mimir-mixin/dashboards/compactor.libsonnet @@ -83,7 +83,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Garbage Collector') + $.row('Garbage collector') .addPanel( $.panel('Blocks marked for deletion / sec') + $.queryPanel('sum(rate(cortex_compactor_blocks_marked_for_deletion_total{%s}[$__rate_interval]))' % $.jobMatcher($._config.job_names.compactor), 'blocks') + @@ -100,10 +100,10 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Metadata Sync') + $.row('Metadata sync') .addPanel( $.successFailurePanel( - 'Metadata Syncs / sec', + 'Metadata syncs / sec', // The cortex_compactor_meta_syncs_total metric is incremented each time a per-tenant // metadata sync is triggered. 'sum(rate(cortex_compactor_meta_syncs_total{%s}[$__rate_interval])) - sum(rate(cortex_compactor_meta_sync_failures_total{%s}[$__rate_interval]))' % [$.jobMatcher($._config.job_names.compactor), $.jobMatcher($._config.job_names.compactor)], @@ -111,7 +111,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) + { yaxes: $.yaxes('ops') } ) .addPanel( - $.panel('Metadata Sync Duration') + + $.panel('Metadata sync duration') + // This metric tracks the duration of a per-tenant metadata sync. $.latencyPanel('cortex_compactor_meta_sync_duration_seconds', '{%s}' % $.jobMatcher($._config.job_names.compactor)), ) diff --git a/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet b/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet index cfe2942e453..8f60b8e2ab6 100644 --- a/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet +++ b/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet @@ -44,7 +44,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; keepTime: true, tags: $._config.tags, targetBlank: false, - title: '%(product)s Dashboards' % $._config, + title: '%(product)s dashboards' % $._config, type: 'dashboards', }, ], @@ -224,10 +224,10 @@ local utils = import 'mixin-utils/utils.libsonnet'; { yaxes: $.yaxes('Bps') }, containerNetworkReceiveBytesPanel(instanceName):: - $.containerNetworkPanel('Receive Bandwidth', 'container_network_receive_bytes_total', instanceName), + $.containerNetworkPanel('Receive bandwidth', 'container_network_receive_bytes_total', instanceName), containerNetworkTransmitBytesPanel(instanceName):: - $.containerNetworkPanel('Transmit Bandwidth', 'container_network_transmit_bytes_total', instanceName), + $.containerNetworkPanel('Transmit bandwidth', 'container_network_transmit_bytes_total', instanceName), containerDiskWritesPanel(title, containerName):: $.panel(title) + @@ -301,7 +301,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; .addPanel($.containerNetworkReceiveBytesPanel($._config.instance_names[name])) .addPanel($.containerNetworkTransmitBytesPanel($._config.instance_names[name])) .addPanel( - $.panel('Inflight Requests (per pod)') + + $.panel('Inflight requests (per pod)') + $.queryPanel([ 'avg(cortex_inflight_requests{%s})' % $.jobMatcher($._config.job_names[name]), 'max(cortex_inflight_requests{%s})' % $.jobMatcher($._config.job_names[name]), @@ -309,7 +309,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; { fill: 0 } ) .addPanel( - $.panel('TCP Connections (per pod)') + + $.panel('TCP connections (per pod)') + $.queryPanel([ 'avg(sum by(pod) (cortex_tcp_connections{%s}))' % $.jobMatcher($._config.job_names[name]), 'max(sum by(pod) (cortex_tcp_connections{%s}))' % $.jobMatcher($._config.job_names[name]), @@ -436,28 +436,28 @@ local utils = import 'mixin-utils/utils.libsonnet'; { yaxes: $.yaxes('percentunit') }, ) .addPanel( - $.panel('Latency of Op: Attributes') + + $.panel('Latency of op: Attributes') + $.latencyPanel('thanos_objstore_bucket_operation_duration_seconds', '{%s,component="%s",operation="attributes"}' % [$.namespaceMatcher(), component]), ) .addPanel( - $.panel('Latency of Op: Exists') + + $.panel('Latency of op: Exists') + $.latencyPanel('thanos_objstore_bucket_operation_duration_seconds', '{%s,component="%s",operation="exists"}' % [$.namespaceMatcher(), component]), ), $.row('') .addPanel( - $.panel('Latency of Op: Get') + + $.panel('Latency of op: Get') + $.latencyPanel('thanos_objstore_bucket_operation_duration_seconds', '{%s,component="%s",operation="get"}' % [$.namespaceMatcher(), component]), ) .addPanel( - $.panel('Latency of Op: GetRange') + + $.panel('Latency of op: GetRange') + $.latencyPanel('thanos_objstore_bucket_operation_duration_seconds', '{%s,component="%s",operation="get_range"}' % [$.namespaceMatcher(), component]), ) .addPanel( - $.panel('Latency of Op: Upload') + + $.panel('Latency of op: Upload') + $.latencyPanel('thanos_objstore_bucket_operation_duration_seconds', '{%s,component="%s",operation="upload"}' % [$.namespaceMatcher(), component]), ) .addPanel( - $.panel('Latency of Op: Delete') + + $.panel('Latency of op: Delete') + $.latencyPanel('thanos_objstore_bucket_operation_duration_seconds', '{%s,component="%s",operation="delete"}' % [$.namespaceMatcher(), component]), ), ], diff --git a/operations/mimir-mixin/dashboards/overrides.libsonnet b/operations/mimir-mixin/dashboards/overrides.libsonnet index dcdaf63a989..29fb3749812 100644 --- a/operations/mimir-mixin/dashboards/overrides.libsonnet +++ b/operations/mimir-mixin/dashboards/overrides.libsonnet @@ -64,7 +64,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; $.row('') .addPanel( { - title: 'Per-Tenant Overrides', + title: 'Per-tenant overrides', type: 'table', datasource: '${datasource}', targets: [ diff --git a/operations/mimir-mixin/dashboards/queries.libsonnet b/operations/mimir-mixin/dashboards/queries.libsonnet index c9af642a107..67aceaa0c81 100644 --- a/operations/mimir-mixin/dashboards/queries.libsonnet +++ b/operations/mimir-mixin/dashboards/queries.libsonnet @@ -5,9 +5,9 @@ local utils = import 'mixin-utils/utils.libsonnet'; ($.dashboard('Queries') + { uid: 'd9931b1054053c8b972d320774bb8f1d' }) .addClusterSelectorTemplates() .addRow( - $.row('Query Frontend') + $.row('Query-frontend') .addPanel( - $.panel('Queue Duration') + + $.panel('Queue duration') + $.latencyPanel('cortex_query_frontend_queue_duration_seconds', '{%s}' % $.jobMatcher($._config.job_names.query_frontend)), ) .addPanel( @@ -16,14 +16,14 @@ local utils = import 'mixin-utils/utils.libsonnet'; { yaxes: $.yaxes('short') }, ) .addPanel( - $.panel('Queue Length (per %s)' % $._config.per_instance_label) + + $.panel('Queue length (per %s)' % $._config.per_instance_label) + $.queryPanel( 'sum by(%s) (cortex_query_frontend_queue_length{%s})' % [$._config.per_instance_label, $.jobMatcher($._config.job_names.query_frontend)], '{{%s}}' % $._config.per_instance_label ), ) .addPanel( - $.panel('Queue Length (per user)') + + $.panel('Queue length (per user)') + $.queryPanel( 'sum by(user) (cortex_query_frontend_queue_length{%s}) > 0' % [$.jobMatcher($._config.job_names.query_frontend)], '{{user}}' @@ -31,20 +31,20 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Query Scheduler') + $.row('Query-scheduler') .addPanel( - $.panel('Queue Duration') + + $.panel('Queue duration') + $.latencyPanel('cortex_query_scheduler_queue_duration_seconds', '{%s}' % $.jobMatcher($._config.job_names.query_scheduler)), ) .addPanel( - $.panel('Queue Length (per %s)' % $._config.per_instance_label) + + $.panel('Queue length (per %s)' % $._config.per_instance_label) + $.queryPanel( 'sum by(%s) (cortex_query_scheduler_queue_length{%s})' % [$._config.per_instance_label, $.jobMatcher($._config.job_names.query_scheduler)], '{{%s}}' % $._config.per_instance_label ), ) .addPanel( - $.panel('Queue Length (per user)') + + $.panel('Queue length (per user)') + $.queryPanel( 'sum by(user) (cortex_query_scheduler_queue_length{%s}) > 0' % [$.jobMatcher($._config.job_names.query_scheduler)], '{{user}}' @@ -52,19 +52,19 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Query Frontend - Query Splitting and Results Cache') + $.row('Query-frontend - query splitting and results cache') .addPanel( $.panel('Intervals per Query') + $.queryPanel('sum(rate(cortex_frontend_split_queries_total{%s}[1m])) / sum(rate(cortex_frontend_query_range_duration_seconds_count{%s, method="split_by_interval"}[1m]))' % [$.jobMatcher($._config.job_names.query_frontend), $.jobMatcher($._config.job_names.query_frontend)], 'splitting rate') + $.panelDescription( - 'Intervals per Query', + 'Intervals per query', ||| - The average number of splitted queries (partitioned by time) executed a single input query. + The average number of split queries (partitioned by time) executed a single input query. ||| ), ) .addPanel( - $.panel('Results Cache Hit %') + + $.panel('Results cache hit %') + $.queryPanel( ||| # Query metrics before and after migration to new memcached backend. @@ -82,12 +82,12 @@ local utils = import 'mixin-utils/utils.libsonnet'; ||| % { frontend: $.jobMatcher($._config.job_names.query_frontend), }, - 'Hit Rate', + 'Hit rate', ) + { yaxes: $.yaxes({ format: 'percentunit', max: 1 }) }, ) .addPanel( - $.panel('Results Cache misses') + + $.panel('Results cache misses') + $.queryPanel( ||| # Query metrics before and after migration to new memcached backend. @@ -105,36 +105,36 @@ local utils = import 'mixin-utils/utils.libsonnet'; ||| % { frontend: $.jobMatcher($._config.job_names.query_frontend), }, - 'Miss Rate' + 'Miss rate' ), ) ) .addRow( - $.row('Query Frontend - Query sharding') + $.row('Query-frontend - query sharding') .addPanel( - $.panel('Sharded Queries Ratio') + + $.panel('Sharded queries ratio') + $.queryPanel(||| sum(rate(cortex_frontend_query_sharding_rewrites_succeeded_total{%s}[$__rate_interval])) / sum(rate(cortex_frontend_query_sharding_rewrites_attempted_total{%s}[$__rate_interval])) ||| % [$.jobMatcher($._config.job_names.query_frontend), $.jobMatcher($._config.job_names.query_frontend)], 'sharded queries ratio') + { yaxes: $.yaxes({ format: 'percentunit', max: 1 }) } + $.panelDescription( - 'Sharded Queries Ratio', + 'Sharded queries ratio', ||| The % of queries that have been successfully rewritten and executed in a shardable way. - This panel takes in account only type of queries which are supported by query sharding (eg. range queries). + This panel only takes into account the type of queries that are supported by query sharding (eg. range queries). ||| ), ) .addPanel( - $.panel('Number of Sharded Queries per Query') + + $.panel('Number of sharded queries per query') + $.latencyPanel('cortex_frontend_sharded_queries_per_query', '{%s}' % $.jobMatcher($._config.job_names.query_frontend), multiplier=1) + { yaxes: $.yaxes('short') } + $.panelDescription( - 'Number of Sharded Queries per Query', + 'Number of sharded queries per query', ||| - How many sharded queries have been executed for a single input query. It tracks only queries which have - been successfully rewritten in a shardable way. + The number of sharded queries that have been executed for a single input query. It only tracks queries that + have been successfully rewritten in a shardable way. ||| ), ) @@ -151,22 +151,22 @@ local utils = import 'mixin-utils/utils.libsonnet'; .addRow( $.row('Ingester') .addPanel( - $.panel('Series per Query') + + $.panel('Series per query') + utils.latencyRecordingRulePanel('cortex_ingester_queried_series', $.jobSelector($._config.job_names.ingester), multiplier=1) + { yaxes: $.yaxes('short') }, ) .addPanel( - $.panel('Chunks per Query') + + $.panel('Chunks per query') + utils.latencyRecordingRulePanel('cortex_ingester_queried_chunks', $.jobSelector($._config.job_names.ingester), multiplier=1) + { yaxes: $.yaxes('short') }, ) .addPanel( - $.panel('Samples per Query') + + $.panel('Samples per query') + utils.latencyRecordingRulePanel('cortex_ingester_queried_samples', $.jobSelector($._config.job_names.ingester), multiplier=1) + { yaxes: $.yaxes('short') }, ) .addPanel( - $.panel('Exemplars per Query') + + $.panel('Exemplars per query') + utils.latencyRecordingRulePanel('cortex_ingester_queried_exemplars', $.jobSelector($._config.job_names.ingester), multiplier=1) + { yaxes: $.yaxes('short') }, ) @@ -174,12 +174,12 @@ local utils = import 'mixin-utils/utils.libsonnet'; .addRow( $.row('Querier') .addPanel( - $.panel('Number of store-gateways hit per Query') + + $.panel('Number of store-gateways hit per query') + $.latencyPanel('cortex_querier_storegateway_instances_hit_per_query', '{%s}' % $.jobMatcher($._config.job_names.querier), multiplier=1) + { yaxes: $.yaxes('short') }, ) .addPanel( - $.panel('Refetches of missing blocks per Query') + + $.panel('Refetches of missing blocks per query') + $.latencyPanel('cortex_querier_storegateway_refetches_per_query', '{%s}' % $.jobMatcher($._config.job_names.querier), multiplier=1) + { yaxes: $.yaxes('short') }, ) diff --git a/operations/mimir-mixin/dashboards/reads-networking.libsonnet b/operations/mimir-mixin/dashboards/reads-networking.libsonnet index 226b58e89d3..f8e9cfcd969 100644 --- a/operations/mimir-mixin/dashboards/reads-networking.libsonnet +++ b/operations/mimir-mixin/dashboards/reads-networking.libsonnet @@ -2,7 +2,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; (import 'dashboard-utils.libsonnet') { 'mimir-reads-networking.json': - ($.dashboard('Reads Networking') + { uid: 'c0464f0d8bd026f776c9006b05910000' }) + ($.dashboard('Reads networking') + { uid: 'c0464f0d8bd026f776c9006b05910000' }) .addClusterSelectorTemplates(false) .addRow($.jobNetworkingRow('Gateway', 'gateway')) .addRow($.jobNetworkingRow('Query-frontend', 'query_frontend')) diff --git a/operations/mimir-mixin/dashboards/reads-resources.libsonnet b/operations/mimir-mixin/dashboards/reads-resources.libsonnet index d493db309f8..7661df45aac 100644 --- a/operations/mimir-mixin/dashboards/reads-resources.libsonnet +++ b/operations/mimir-mixin/dashboards/reads-resources.libsonnet @@ -2,7 +2,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; (import 'dashboard-utils.libsonnet') { 'mimir-reads-resources.json': - ($.dashboard('Reads Resources') + { uid: '2fd2cda9eea8d8af9fbc0a5960425120' }) + ($.dashboard('Reads resources') + { uid: '2fd2cda9eea8d8af9fbc0a5960425120' }) .addClusterSelectorTemplates(false) .addRow( $.row('Gateway') @@ -17,7 +17,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Query Frontend') + $.row('Query-frontend') .addPanel( $.containerCPUUsagePanel('CPU', 'query-frontend'), ) @@ -29,7 +29,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Query Scheduler') + $.row('Query-scheduler') .addPanel( $.containerCPUUsagePanel('CPU', 'query-scheduler'), ) @@ -101,13 +101,13 @@ local utils = import 'mixin-utils/utils.libsonnet'; .addRow( $.row('') .addPanel( - $.containerDiskWritesPanel('Disk Writes', 'store-gateway'), + $.containerDiskWritesPanel('Disk writes', 'store-gateway'), ) .addPanel( - $.containerDiskReadsPanel('Disk Reads', 'store-gateway'), + $.containerDiskReadsPanel('Disk reads', 'store-gateway'), ) .addPanel( - $.containerDiskSpaceUtilization('Disk Space Utilization', 'store-gateway'), + $.containerDiskSpaceUtilization('Disk space utilization', 'store-gateway'), ) ) + { templating+: { diff --git a/operations/mimir-mixin/dashboards/reads.libsonnet b/operations/mimir-mixin/dashboards/reads.libsonnet index 1edff50d30f..d24a6a1ad51 100644 --- a/operations/mimir-mixin/dashboards/reads.libsonnet +++ b/operations/mimir-mixin/dashboards/reads.libsonnet @@ -99,7 +99,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; utils.latencyRecordingRulePanel('cortex_request_duration_seconds', $.jobSelector($._config.job_names.gateway) + [utils.selector.re('route', '(prometheus|api_prom)_api_v1_.+')]) ) .addPanel( - $.panel('Per %s p99 Latency' % $._config.per_instance_label) + + $.panel('Per %s p99 latency' % $._config.per_instance_label) + $.hiddenLegendQueryPanel( 'histogram_quantile(0.99, sum by(le, %s) (rate(cortex_request_duration_seconds_bucket{%s, route=~"(prometheus|api_prom)_api_v1_.+"}[$__rate_interval])))' % [$._config.per_instance_label, $.jobMatcher($._config.job_names.gateway)], '' ) + @@ -107,7 +107,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Query Frontend') + $.row('Query-frontend') .addPanel( $.panel('Requests / sec') + $.qpsPanel('cortex_request_duration_seconds_count{%s, route=~"(prometheus|api_prom)_api_v1_.+"}' % $.jobMatcher($._config.job_names.query_frontend)) @@ -117,7 +117,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; utils.latencyRecordingRulePanel('cortex_request_duration_seconds', $.jobSelector($._config.job_names.query_frontend) + [utils.selector.re('route', '(prometheus|api_prom)_api_v1_.+')]) ) .addPanel( - $.panel('Per %s p99 Latency' % $._config.per_instance_label) + + $.panel('Per %s p99 latency' % $._config.per_instance_label) + $.hiddenLegendQueryPanel( 'histogram_quantile(0.99, sum by(le, %s) (rate(cortex_request_duration_seconds_bucket{%s, route=~"(prometheus|api_prom)_api_v1_.+"}[$__rate_interval])))' % [$._config.per_instance_label, $.jobMatcher($._config.job_names.query_frontend)], '' ) + @@ -125,7 +125,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Query Scheduler') + $.row('Query-scheduler') .addPanel( $.textPanel( '', @@ -150,7 +150,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Cache - Query Results') + $.row('Cache – query results') .addPanel( $.panel('Requests / sec') + $.queryPanel( @@ -191,7 +191,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; utils.latencyRecordingRulePanel('cortex_querier_request_duration_seconds', $.jobSelector($._config.job_names.querier) + [utils.selector.re('route', '(prometheus|api_prom)_api_v1_.+')]) ) .addPanel( - $.panel('Per %s p99 Latency' % $._config.per_instance_label) + + $.panel('Per %s p99 latency' % $._config.per_instance_label) + $.hiddenLegendQueryPanel( 'histogram_quantile(0.99, sum by(le, %s) (rate(cortex_querier_request_duration_seconds_bucket{%s, route=~"(prometheus|api_prom)_api_v1_.+"}[$__rate_interval])))' % [$._config.per_instance_label, $.jobMatcher($._config.job_names.querier)], '' ) + @@ -209,7 +209,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; utils.latencyRecordingRulePanel('cortex_request_duration_seconds', $.jobSelector($._config.job_names.ingester) + [utils.selector.re('route', '/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata')]) ) .addPanel( - $.panel('Per %s p99 Latency' % $._config.per_instance_label) + + $.panel('Per %s p99 latency' % $._config.per_instance_label) + $.hiddenLegendQueryPanel( 'histogram_quantile(0.99, sum by(le, %s) (rate(cortex_request_duration_seconds_bucket{%s, route=~"/cortex.Ingester/Query(Stream)?|/cortex.Ingester/MetricsForLabelMatchers|/cortex.Ingester/LabelValues|/cortex.Ingester/MetricsMetadata"}[$__rate_interval])))' % [$._config.per_instance_label, $.jobMatcher($._config.job_names.ingester)], '' ) + @@ -227,7 +227,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; utils.latencyRecordingRulePanel('cortex_request_duration_seconds', $.jobSelector($._config.job_names.store_gateway) + [utils.selector.re('route', '/gatewaypb.StoreGateway/.*')]) ) .addPanel( - $.panel('Per %s p99 Latency' % $._config.per_instance_label) + + $.panel('Per %s p99 latency' % $._config.per_instance_label) + $.hiddenLegendQueryPanel( 'histogram_quantile(0.99, sum by(le, %s) (rate(cortex_request_duration_seconds_bucket{%s, route=~"/gatewaypb.StoreGateway/.*"}[$__rate_interval])))' % [$._config.per_instance_label, $.jobMatcher($._config.job_names.store_gateway)], '' ) + @@ -235,10 +235,10 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.kvStoreRow('Store-gateway - Key-value store for store-gateways ring', 'store_gateway', 'store-gateway') + $.kvStoreRow('Store-gateway – key-value store for store-gateways ring', 'store_gateway', 'store-gateway') ) .addRow( - $.row('Memcached – Block index cache (store-gateway accesses)') // Resembles thanosMemcachedCache + $.row('Memcached – block index cache (store-gateway accesses)') // Resembles thanosMemcachedCache .addPanel( $.panel('Requests / sec') + $.queryPanel( @@ -300,7 +300,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) + { yaxes: $.yaxes('percentunit') } + $.panelDescription( - 'Hit Ratio', + 'Hit ratio', ||| Even if you do not set up memcached for the blocks index cache, you will still see data in this panel because the store-gateway by default has an in-memory blocks index cache. @@ -310,7 +310,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) .addRow( $.thanosMemcachedCache( - 'Memcached – Chunks cache (store-gateway accesses)', + 'Memcached – chunks cache (store-gateway accesses)', $._config.job_names.store_gateway, 'store-gateway', 'chunks-cache' @@ -318,7 +318,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) .addRow( $.thanosMemcachedCache( - 'Memcached – Metadata cache (store-gateway accesses)', + 'Memcached – metadata cache (store-gateway accesses)', $._config.job_names.store_gateway, 'store-gateway', 'metadata-cache' @@ -326,7 +326,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) .addRow( $.thanosMemcachedCache( - 'Memcached – Metadata cache (querier accesses)', + 'Memcached – metadata cache (querier accesses)', $._config.job_names.querier, 'querier', 'metadata-cache' @@ -334,10 +334,10 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) // Object store metrics for the store-gateway. .addRows( - $.getObjectStoreRows('Blocks Object Store (Store-gateway accesses)', 'store-gateway') + $.getObjectStoreRows('Blocks object store (store-gateway accesses)', 'store-gateway') ) // Object store metrics for the querier. .addRows( - $.getObjectStoreRows('Blocks Object Store (Querier accesses)', 'querier') + $.getObjectStoreRows('Blocks object store (querier accesses)', 'querier') ), } diff --git a/operations/mimir-mixin/dashboards/rollout-progress.libsonnet b/operations/mimir-mixin/dashboards/rollout-progress.libsonnet index 0991ced93f3..fcefd096f38 100644 --- a/operations/mimir-mixin/dashboards/rollout-progress.libsonnet +++ b/operations/mimir-mixin/dashboards/rollout-progress.libsonnet @@ -125,7 +125,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; gridPos: { h: 4, w: 2, x: 14, y: 0 }, }, - $.panel('Writes 99th Latency') + + $.panel('Writes 99th latency') + $.newStatPanel(||| histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{%(gateway_job_matcher)s, route=~"%(gateway_write_routes_regex)s"})) ||| % config, unit='s', thresholds=[ @@ -176,7 +176,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; gridPos: { h: 4, w: 2, x: 14, y: 4 }, }, - $.panel('Reads 99th Latency') + + $.panel('Reads 99th latency') + $.newStatPanel(||| histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{%(gateway_job_matcher)s, route=~"%(gateway_read_routes_regex)s"})) ||| % config, unit='s', thresholds=[ @@ -225,7 +225,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; // Versions // { - title: 'Pods count per Version', + title: 'Pods count per version', type: 'table', datasource: '$datasource', diff --git a/operations/mimir-mixin/dashboards/ruler.libsonnet b/operations/mimir-mixin/dashboards/ruler.libsonnet index 0ba2ce16b4c..0131750ddc5 100644 --- a/operations/mimir-mixin/dashboards/ruler.libsonnet +++ b/operations/mimir-mixin/dashboards/ruler.libsonnet @@ -67,24 +67,24 @@ local utils = import 'mixin-utils/utils.libsonnet'; showTitle: false, }) .addPanel( - $.panel('Active Configurations') + + $.panel('Active configurations') + $.statPanel('sum(cortex_ruler_managers_total{%s})' % $.jobMatcher('ruler'), format='short') ) .addPanel( - $.panel('Total Rules') + + $.panel('Total rules') + $.statPanel('sum(cortex_prometheus_rule_group_rules{%s})' % $.jobMatcher('ruler'), format='short') ) .addPanel( - $.panel('Read from Ingesters - QPS') + + $.panel('Read from ingesters - QPS') + $.statPanel('sum(rate(cortex_ingester_client_request_duration_seconds_count{%s, operation="/cortex.Ingester/QueryStream"}[5m]))' % $.jobMatcher('ruler'), format='reqps') ) .addPanel( - $.panel('Write to Ingesters - QPS') + + $.panel('Write to ingesters - QPS') + $.statPanel('sum(rate(cortex_ingester_client_request_duration_seconds_count{%s, operation="/cortex.Ingester/Push"}[5m]))' % $.jobMatcher('ruler'), format='reqps') ) ) .addRow( - $.row('Rule Evaluations Global') + $.row('Rule evaluations global') .addPanel( $.panel('EPS') + $.queryPanel( @@ -114,7 +114,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; utils.latencyRecordingRulePanel('cortex_request_duration_seconds', $.jobSelector($._config.job_names.gateway) + [utils.selector.re('route', ruler_config_api_routes_re)]) ) .addPanel( - $.panel('Per route p99 Latency') + + $.panel('Per route p99 latency') + $.queryPanel( 'histogram_quantile(0.99, sum by (route, le) (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{%s, route=~"%s"}))' % [$.jobMatcher($._config.job_names.gateway), ruler_config_api_routes_re], '{{ route }}' @@ -123,7 +123,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Writes (Ingesters)') + $.row('Writes (ingesters)') .addPanel( $.panel('QPS') + $.qpsPanel('cortex_ingester_client_request_duration_seconds_count{%s, operation="/cortex.Ingester/Push"}' % $.jobMatcher('ruler')) @@ -134,7 +134,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Reads (Ingesters)') + $.row('Reads (ingesters)') .addPanel( $.panel('QPS') + $.qpsPanel('cortex_ingester_client_request_duration_seconds_count{%s, operation="/cortex.Ingester/QueryStream"}' % $.jobMatcher('ruler')) @@ -145,17 +145,17 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.kvStoreRow('Ruler - Key-value store for rulers ring', 'ruler', 'ruler') + $.kvStoreRow('Ruler - key-value store for rulers ring', 'ruler', 'ruler') ) .addRow( - $.row('Ruler - Blocks storage') + $.row('Ruler - blocks storage') .addPanel( - $.panel('Number of store-gateways hit per Query') + + $.panel('Number of store-gateways hit per query') + $.latencyPanel('cortex_querier_storegateway_instances_hit_per_query', '{%s}' % $.jobMatcher($._config.job_names.ruler), multiplier=1) + { yaxes: $.yaxes('short') }, ) .addPanel( - $.panel('Refetches of missing blocks per Query') + + $.panel('Refetches of missing blocks per query') + $.latencyPanel('cortex_querier_storegateway_refetches_per_query', '{%s}' % $.jobMatcher($._config.job_names.ruler), multiplier=1) + { yaxes: $.yaxes('short') }, ) @@ -168,11 +168,11 @@ local utils = import 'mixin-utils/utils.libsonnet'; .addRow( $.row('Notifications') .addPanel( - $.panel('Delivery Errors') + + $.panel('Delivery errors') + $.queryPanel($.rulerQueries.notifications.failure % [$.jobMatcher('ruler'), $.jobMatcher('ruler')], '{{ user }}') ) .addPanel( - $.panel('Queue Length') + + $.panel('Queue length') + $.queryPanel($.rulerQueries.notifications.queue % [$.jobMatcher('ruler'), $.jobMatcher('ruler')], '{{ user }}') ) .addPanel( @@ -181,9 +181,9 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - ($.row('Group Evaluations') + { collapse: true }) + ($.row('Group evaluations') + { collapse: true }) .addPanel( - $.panel('Missed Iterations') + + $.panel('Missed iterations') + $.queryPanel($.rulerQueries.groupEvaluations.missedIterations % $.jobMatcher('ruler'), '{{ user }}'), ) .addPanel( @@ -201,7 +201,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - ($.row('Rule Evaluation per User') + { collapse: true }) + ($.row('Rule evaluation per user') + { collapse: true }) .addPanel( $.panel('Latency') + $.queryPanel( @@ -211,6 +211,6 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRows( - $.getObjectStoreRows('Ruler Configuration Object Store (Ruler accesses)', 'ruler-storage') + $.getObjectStoreRows('Ruler configuration object store (ruler accesses)', 'ruler-storage') ), } diff --git a/operations/mimir-mixin/dashboards/scaling.libsonnet b/operations/mimir-mixin/dashboards/scaling.libsonnet index 19e833b82b7..36dead45cf6 100644 --- a/operations/mimir-mixin/dashboards/scaling.libsonnet +++ b/operations/mimir-mixin/dashboards/scaling.libsonnet @@ -5,7 +5,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ($.dashboard('Scaling') + { uid: '88c041017b96856c9176e07cf557bdcf' }) .addClusterSelectorTemplates() .addRow( - ($.row('Service Scaling') + { height: '200px' }) + ($.row('Service scaling') + { height: '200px' }) .addPanel({ type: 'text', title: '', diff --git a/operations/mimir-mixin/dashboards/slow-queries.libsonnet b/operations/mimir-mixin/dashboards/slow-queries.libsonnet index 49cb36732db..f28805b8960 100644 --- a/operations/mimir-mixin/dashboards/slow-queries.libsonnet +++ b/operations/mimir-mixin/dashboards/slow-queries.libsonnet @@ -2,7 +2,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; (import 'dashboard-utils.libsonnet') { 'mimir-slow-queries.json': - ($.dashboard('Slow Queries') + { uid: 'e6f3091e29d2636e3b8393447e925668' }) + ($.dashboard('Slow queries') + { uid: 'e6f3091e29d2636e3b8393447e925668' }) .addClusterSelectorTemplates(false) .addRow( $.row('') diff --git a/operations/mimir-mixin/dashboards/tenants.libsonnet b/operations/mimir-mixin/dashboards/tenants.libsonnet index bd094ccf7b6..d680598e959 100644 --- a/operations/mimir-mixin/dashboards/tenants.libsonnet +++ b/operations/mimir-mixin/dashboards/tenants.libsonnet @@ -177,7 +177,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ), ) .addPanel( - local title = 'Distributor/Ingester discarded samples rate'; + local title = 'Distributor and ingester discarded samples rate'; $.panel(title) + $.queryPanel( [ @@ -194,7 +194,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; $.panelDescription( title, ||| - The rate of each samples' discarding reason. + The rate of each sample's discarding reason. ||| ), ), diff --git a/operations/mimir-mixin/dashboards/writes-networking.libsonnet b/operations/mimir-mixin/dashboards/writes-networking.libsonnet index 38395b67d4b..2deca121fa8 100644 --- a/operations/mimir-mixin/dashboards/writes-networking.libsonnet +++ b/operations/mimir-mixin/dashboards/writes-networking.libsonnet @@ -2,7 +2,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; (import 'dashboard-utils.libsonnet') { 'mimir-writes-networking.json': - ($.dashboard('Writes Networking') + { uid: '681cd62b680b7154811fe73af55dcfd4' }) + ($.dashboard('Writes networking') + { uid: '681cd62b680b7154811fe73af55dcfd4' }) .addClusterSelectorTemplates(false) .addRow($.jobNetworkingRow('Gateway', 'gateway')) .addRow($.jobNetworkingRow('Distributor', 'distributor')) diff --git a/operations/mimir-mixin/dashboards/writes-resources.libsonnet b/operations/mimir-mixin/dashboards/writes-resources.libsonnet index 1a5a6679570..f2df3f84f96 100644 --- a/operations/mimir-mixin/dashboards/writes-resources.libsonnet +++ b/operations/mimir-mixin/dashboards/writes-resources.libsonnet @@ -2,7 +2,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; (import 'dashboard-utils.libsonnet') { 'mimir-writes-resources.json': - ($.dashboard('Writes Resources') + { uid: 'c0464f0d8bd026f776c9006b0591bb0b' }) + ($.dashboard('Writes resources') + { uid: 'c0464f0d8bd026f776c9006b0591bb0b' }) .addClusterSelectorTemplates(false) .addRow( $.row('Gateway') @@ -56,13 +56,13 @@ local utils = import 'mixin-utils/utils.libsonnet'; .addRow( $.row('') .addPanel( - $.containerDiskWritesPanel('Disk Writes', 'ingester') + $.containerDiskWritesPanel('Disk writes', 'ingester') ) .addPanel( - $.containerDiskReadsPanel('Disk Reads', 'ingester') + $.containerDiskReadsPanel('Disk reads', 'ingester') ) .addPanel( - $.containerDiskSpaceUtilization('Disk Space Utilization', 'ingester'), + $.containerDiskSpaceUtilization('Disk space utilization', 'ingester'), ) ) + { diff --git a/operations/mimir-mixin/dashboards/writes.libsonnet b/operations/mimir-mixin/dashboards/writes.libsonnet index 0d8f5e4313e..9a112540cd3 100644 --- a/operations/mimir-mixin/dashboards/writes.libsonnet +++ b/operations/mimir-mixin/dashboards/writes.libsonnet @@ -118,7 +118,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; utils.latencyRecordingRulePanel('cortex_request_duration_seconds', $.jobSelector($._config.job_names.gateway) + [utils.selector.re('route', 'api_(v1|prom)_push')]) ) .addPanel( - $.panel('Per %s p99 Latency' % $._config.per_instance_label) + + $.panel('Per %s p99 latency' % $._config.per_instance_label) + $.hiddenLegendQueryPanel( 'histogram_quantile(0.99, sum by(le, %s) (rate(cortex_request_duration_seconds_bucket{%s, route=~"api_(v1|prom)_push"}[$__rate_interval])))' % [$._config.per_instance_label, $.jobMatcher($._config.job_names.gateway)], '' ) + @@ -136,7 +136,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; utils.latencyRecordingRulePanel('cortex_request_duration_seconds', $.jobSelector($._config.job_names.distributor) + [utils.selector.re('route', '/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push')]) ) .addPanel( - $.panel('Per %s p99 Latency' % $._config.per_instance_label) + + $.panel('Per %s p99 latency' % $._config.per_instance_label) + $.hiddenLegendQueryPanel( 'histogram_quantile(0.99, sum by(le, %s) (rate(cortex_request_duration_seconds_bucket{%s, route=~"/distributor.Distributor/Push|/httpgrpc.*|api_(v1|prom)_push"}[$__rate_interval])))' % [$._config.per_instance_label, $.jobMatcher($._config.job_names.distributor)], '' ) + @@ -154,7 +154,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; utils.latencyRecordingRulePanel('cortex_request_duration_seconds', $.jobSelector($._config.job_names.ingester) + [utils.selector.eq('route', '/cortex.Ingester/Push')]) ) .addPanel( - $.panel('Per %s p99 Latency' % $._config.per_instance_label) + + $.panel('Per %s p99 latency' % $._config.per_instance_label) + $.hiddenLegendQueryPanel( 'histogram_quantile(0.99, sum by(le, %s) (rate(cortex_request_duration_seconds_bucket{%s, route="/cortex.Ingester/Push"}[$__rate_interval])))' % [$._config.per_instance_label, $.jobMatcher($._config.job_names.ingester)], '' ) + @@ -162,16 +162,16 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.kvStoreRow('Distributor - Key-value store for high-availability (HA) deduplication', 'distributor', 'distributor-hatracker') + $.kvStoreRow('Distributor - key-value store for high-availability (HA) deduplication', 'distributor', 'distributor-hatracker') ) .addRow( - $.kvStoreRow('Distributor - Key-value store for distributors ring', 'distributor', 'distributor-(lifecycler|ring)') + $.kvStoreRow('Distributor - key-value store for distributors ring', 'distributor', 'distributor-(lifecycler|ring)') ) .addRow( - $.kvStoreRow('Ingester - Key-value store for the ingesters ring', 'ingester', 'ingester-.*') + $.kvStoreRow('Ingester - key-value store for the ingesters ring', 'ingester', 'ingester-.*') ) .addRow( - $.row('Ingester - Shipper') + $.row('Ingester - shipper') .addPanel( $.successFailurePanel( 'Uploaded blocks / sec', @@ -199,7 +199,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; ) ) .addRow( - $.row('Ingester - TSDB Head') + $.row('Ingester - TSDB head') .addPanel( $.successFailurePanel( 'Compactions / sec', From 0cdd91f4649b1679b2abfbda5a23ee7aaf334870 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Mon, 31 Jan 2022 16:18:25 +0100 Subject: [PATCH 052/168] Categorize TLS configuration parameters as advanced (#972) Signed-off-by: Arve Knudsen --- cmd/mimir/help.txt.tmpl | 16 ---------------- pkg/alertmanager/alertmanager_client.go | 2 +- pkg/querier/store_gateway_client.go | 2 +- pkg/storage/bucket/s3/config.go | 4 ++-- 4 files changed, 4 insertions(+), 20 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index fb4e8067859..cfb4c372a59 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -37,8 +37,6 @@ Usage of ./cmd/mimir/mimir: The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) -alertmanager-storage.s3.http.idle-conn-timeout duration The time an idle connection will remain idle before closing. (default 1m30s) - -alertmanager-storage.s3.http.insecure-skip-verify - If the client connects to S3 via HTTPS and this option is enabled, the client will accept any certificate and hostname. -alertmanager-storage.s3.http.response-header-timeout duration The amount of time the client will wait for a servers response headers. (default 2m0s) -alertmanager-storage.s3.insecure @@ -61,8 +59,6 @@ Usage of ./cmd/mimir/mimir: KMS Key ID used to encrypt objects in S3 -alertmanager-storage.s3.sse.type string Enable AWS Server Side Encryption. Supported values: SSE-KMS, SSE-S3. - -alertmanager-storage.s3.tls-handshake-timeout duration - Maximum time to wait for a TLS handshake. 0 means no limit. (default 10s) -alertmanager-storage.swift.auth-url string OpenStack Swift authentication URL -alertmanager-storage.swift.auth-version int @@ -105,8 +101,6 @@ Usage of ./cmd/mimir/mimir: Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. -alertmanager.alertmanager-client.tls-cert-path string Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -alertmanager.alertmanager-client.tls-enabled - Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. -alertmanager.alertmanager-client.tls-insecure-skip-verify Skip validating server certificate. -alertmanager.alertmanager-client.tls-key-path string @@ -395,8 +389,6 @@ Usage of ./cmd/mimir/mimir: The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) -blocks-storage.s3.http.idle-conn-timeout duration The time an idle connection will remain idle before closing. (default 1m30s) - -blocks-storage.s3.http.insecure-skip-verify - If the client connects to S3 via HTTPS and this option is enabled, the client will accept any certificate and hostname. -blocks-storage.s3.http.response-header-timeout duration The amount of time the client will wait for a servers response headers. (default 2m0s) -blocks-storage.s3.insecure @@ -419,8 +411,6 @@ Usage of ./cmd/mimir/mimir: KMS Key ID used to encrypt objects in S3 -blocks-storage.s3.sse.type string Enable AWS Server Side Encryption. Supported values: SSE-KMS, SSE-S3. - -blocks-storage.s3.tls-handshake-timeout duration - Maximum time to wait for a TLS handshake. 0 means no limit. (default 10s) -blocks-storage.swift.auth-url string OpenStack Swift authentication URL -blocks-storage.swift.auth-version int @@ -1079,8 +1069,6 @@ Usage of ./cmd/mimir/mimir: Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. -querier.store-gateway-client.tls-cert-path string Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -querier.store-gateway-client.tls-enabled - Enable TLS for gRPC client connecting to store-gateway. -querier.store-gateway-client.tls-insecure-skip-verify Skip validating server certificate. -querier.store-gateway-client.tls-key-path string @@ -1163,8 +1151,6 @@ Usage of ./cmd/mimir/mimir: The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) -ruler-storage.s3.http.idle-conn-timeout duration The time an idle connection will remain idle before closing. (default 1m30s) - -ruler-storage.s3.http.insecure-skip-verify - If the client connects to S3 via HTTPS and this option is enabled, the client will accept any certificate and hostname. -ruler-storage.s3.http.response-header-timeout duration The amount of time the client will wait for a servers response headers. (default 2m0s) -ruler-storage.s3.insecure @@ -1187,8 +1173,6 @@ Usage of ./cmd/mimir/mimir: KMS Key ID used to encrypt objects in S3 -ruler-storage.s3.sse.type string Enable AWS Server Side Encryption. Supported values: SSE-KMS, SSE-S3. - -ruler-storage.s3.tls-handshake-timeout duration - Maximum time to wait for a TLS handshake. 0 means no limit. (default 10s) -ruler-storage.swift.auth-url string OpenStack Swift authentication URL -ruler-storage.swift.auth-version int diff --git a/pkg/alertmanager/alertmanager_client.go b/pkg/alertmanager/alertmanager_client.go index d16c3ecc90c..3ef8b60c54f 100644 --- a/pkg/alertmanager/alertmanager_client.go +++ b/pkg/alertmanager/alertmanager_client.go @@ -40,7 +40,7 @@ type Client interface { // ClientConfig is the configuration struct for the alertmanager client. type ClientConfig struct { RemoteTimeout time.Duration `yaml:"remote_timeout"` - TLSEnabled bool `yaml:"tls_enabled"` + TLSEnabled bool `yaml:"tls_enabled" category:"advanced"` TLS tls.ClientConfig `yaml:",inline"` } diff --git a/pkg/querier/store_gateway_client.go b/pkg/querier/store_gateway_client.go index f435bafee05..cc2292f2ab0 100644 --- a/pkg/querier/store_gateway_client.go +++ b/pkg/querier/store_gateway_client.go @@ -101,7 +101,7 @@ func newStoreGatewayClientPool(discovery client.PoolServiceDiscovery, clientConf } type ClientConfig struct { - TLSEnabled bool `yaml:"tls_enabled"` + TLSEnabled bool `yaml:"tls_enabled" category:"advanced"` TLS tls.ClientConfig `yaml:",inline"` } diff --git a/pkg/storage/bucket/s3/config.go b/pkg/storage/bucket/s3/config.go index 89168c21874..5405fe5cf14 100644 --- a/pkg/storage/bucket/s3/config.go +++ b/pkg/storage/bucket/s3/config.go @@ -46,8 +46,8 @@ var ( type HTTPConfig struct { IdleConnTimeout time.Duration `yaml:"idle_conn_timeout"` ResponseHeaderTimeout time.Duration `yaml:"response_header_timeout"` - InsecureSkipVerify bool `yaml:"insecure_skip_verify"` - TLSHandshakeTimeout time.Duration `yaml:"tls_handshake_timeout"` + InsecureSkipVerify bool `yaml:"insecure_skip_verify" category:"advanced"` + TLSHandshakeTimeout time.Duration `yaml:"tls_handshake_timeout" category:"advanced"` ExpectContinueTimeout time.Duration `yaml:"expect_continue_timeout"` MaxIdleConns int `yaml:"max_idle_connections"` MaxIdleConnsPerHost int `yaml:"max_idle_connections_per_host"` From f2109c32e87442625b9434210eec81bac564632a Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Mon, 31 Jan 2022 16:28:31 +0100 Subject: [PATCH 053/168] Change default value of -distributor.remote-timeout from 2s to 20s (#970) * Change default value of -distributor.remote-timeout from 2s to 20s Signed-off-by: Marco Pracucci * Fail fast in integration tests Signed-off-by: Marco Pracucci * Fixed PR number Signed-off-by: Marco Pracucci --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 2 +- docs/sources/configuration/config-file-reference.md | 2 +- integration/e2emimir/services.go | 1 + operations/mimir-tests/test-defaults-generated.yaml | 1 - .../mimir-tests/test-disable-chunk-streaming-generated.yaml | 1 - operations/mimir-tests/test-query-sharding-generated.yaml | 1 - operations/mimir-tests/test-shuffle-sharding-generated.yaml | 1 - operations/mimir-tests/test-storage-azure-generated.yaml | 1 - operations/mimir-tests/test-storage-gcs-generated.yaml | 1 - operations/mimir-tests/test-storage-s3-generated.yaml | 1 - operations/mimir/distributor.libsonnet | 1 - pkg/distributor/distributor.go | 2 +- 13 files changed, 5 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0445baf01eb..99dc7094816 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -242,6 +242,7 @@ * `-frontend.results-cache.memcached.max-idle-connections` * [CHANGE] Querier: removed `-querier.worker-match-max-concurrent` and `-querier.worker-parallelism` CLI flags (and their respective YAML config options). Mimir now behaves like if `-querier.worker-match-max-concurrent` is always enabled and you should configure the max concurrency per querier process using `-querier.max-concurrent` instead. #958 * [CHANGE] Distributor: change default value of `-distributor.instance-limits.max-inflight-push-requests` to `2000`. #964 +* [CHANGE] Distributor: change default value of `-distributor.remote-timeout` from `2s` to `20s`. #970 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 220225ac988..439780a31de 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -714,7 +714,7 @@ Usage of ./cmd/mimir/mimir: -distributor.max-recv-msg-size int remote_write API max receive message size (bytes). (default 104857600) -distributor.remote-timeout duration - Timeout for downstream ingesters. (default 2s) + Timeout for downstream ingesters. (default 20s) -distributor.replication-factor int The number of ingesters to write to and read from. (default 3) -distributor.ring.consul.acl-token string diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index f8aa5263ddd..fd9f346be1c 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -508,7 +508,7 @@ ha_tracker: # Timeout for downstream ingesters. # CLI flag: -distributor.remote-timeout -[remote_timeout: | default = 2s] +[remote_timeout: | default = 20s] # Time to wait before sending more than the minimum successful query requests. # CLI flag: -distributor.extra-query-delay diff --git a/integration/e2emimir/services.go b/integration/e2emimir/services.go index 5a9f83bca1e..a8c1c5e6c96 100644 --- a/integration/e2emimir/services.go +++ b/integration/e2emimir/services.go @@ -73,6 +73,7 @@ func NewDistributorWithConfigFile(name, consulAddress, configFile string, flags "-log.level": "warn", "-auth.enabled": "true", "-distributor.replication-factor": "1", + "-distributor.remote-timeout": "2s", // Fail fast in integration tests. // Configure the ingesters ring backend "-ring.store": "consul", "-consul.hostname": consulAddress, diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml index ace2ef4aa61..bd441465eaa 100644 --- a/operations/mimir-tests/test-defaults-generated.yaml +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -671,7 +671,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.ingestion-burst-size=200000 - -distributor.ingestion-rate-limit=10000 - - -distributor.remote-timeout=20s - -distributor.replication-factor=3 - -distributor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.ring.prefix= diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index 3f06ca40250..7b574265245 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -747,7 +747,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.ingestion-burst-size=200000 - -distributor.ingestion-rate-limit=10000 - - -distributor.remote-timeout=20s - -distributor.replication-factor=3 - -distributor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.ring.prefix= diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index 5f9c2a656b3..653cd80c4ab 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -746,7 +746,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.ingestion-burst-size=200000 - -distributor.ingestion-rate-limit=10000 - - -distributor.remote-timeout=20s - -distributor.replication-factor=3 - -distributor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.ring.prefix= diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index 8e1cd87b7a7..72b3a4a1694 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -747,7 +747,6 @@ spec: - -distributor.ingestion-burst-size=200000 - -distributor.ingestion-rate-limit=10000 - -distributor.ingestion-tenant-shard-size=3 - - -distributor.remote-timeout=20s - -distributor.replication-factor=3 - -distributor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.ring.prefix= diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index 87313508ae2..aea36dec52d 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -746,7 +746,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.ingestion-burst-size=200000 - -distributor.ingestion-rate-limit=10000 - - -distributor.remote-timeout=20s - -distributor.replication-factor=3 - -distributor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.ring.prefix= diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 2098864af5f..ab96be02175 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -746,7 +746,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.ingestion-burst-size=200000 - -distributor.ingestion-rate-limit=10000 - - -distributor.remote-timeout=20s - -distributor.replication-factor=3 - -distributor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.ring.prefix= diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index f8f71b24fb2..ec8bac1a345 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -746,7 +746,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.ingestion-burst-size=200000 - -distributor.ingestion-rate-limit=10000 - - -distributor.remote-timeout=20s - -distributor.replication-factor=3 - -distributor.ring.consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.ring.prefix= diff --git a/operations/mimir/distributor.libsonnet b/operations/mimir/distributor.libsonnet index a85d2d1ff1f..d1a6ebd59bb 100644 --- a/operations/mimir/distributor.libsonnet +++ b/operations/mimir/distributor.libsonnet @@ -11,7 +11,6 @@ target: 'distributor', 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, - 'distributor.remote-timeout': '20s', 'distributor.ha-tracker.enable': true, 'distributor.ha-tracker.enable-for-all-users': true, diff --git a/pkg/distributor/distributor.go b/pkg/distributor/distributor.go index acf41965038..fe8458e660c 100644 --- a/pkg/distributor/distributor.go +++ b/pkg/distributor/distributor.go @@ -160,7 +160,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { cfg.DistributorRing.RegisterFlags(f) f.IntVar(&cfg.MaxRecvMsgSize, "distributor.max-recv-msg-size", 100<<20, "remote_write API max receive message size (bytes).") - f.DurationVar(&cfg.RemoteTimeout, "distributor.remote-timeout", 2*time.Second, "Timeout for downstream ingesters.") + f.DurationVar(&cfg.RemoteTimeout, "distributor.remote-timeout", 20*time.Second, "Timeout for downstream ingesters.") f.DurationVar(&cfg.ExtraQueryDelay, "distributor.extra-query-delay", 0, "Time to wait before sending more than the minimum successful query requests.") f.BoolVar(&cfg.ExtendWrites, "distributor.extend-writes", true, "Try writing to an additional ingester in the presence of an ingester not in the ACTIVE state. It is useful to disable this along with -ingester.unregister-on-shutdown=false in order to not spread samples to extra ingesters during rolling restarts with consistent naming.") From 3e4e533a186b912ac415a4996bfccda3a8046435 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Mon, 31 Jan 2022 16:59:59 +0100 Subject: [PATCH 054/168] Upgrade to latest dskit (#974) Signed-off-by: Arve Knudsen --- cmd/mimir/help.txt.tmpl | 354 ------------------ go.mod | 2 +- go.sum | 4 +- .../grafana/dskit/crypto/tls/tls.go | 10 +- .../grafana/dskit/grpcclient/grpcclient.go | 2 +- vendor/github.com/grafana/dskit/kv/client.go | 2 +- .../grafana/dskit/kv/consul/client.go | 10 +- .../github.com/grafana/dskit/kv/etcd/etcd.go | 6 +- .../dskit/kv/memberlist/tcp_transport.go | 2 +- vendor/github.com/grafana/dskit/kv/multi.go | 8 +- .../grafana/dskit/ring/replication_set.go | 3 +- vendor/modules.txt | 2 +- 12 files changed, 26 insertions(+), 379 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index cfb4c372a59..7bff9ac015e 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -97,16 +97,6 @@ Usage of ./cmd/mimir/mimir: OpenStack Swift username. -alertmanager.alertmanager-client.remote-timeout duration Timeout for downstream alertmanagers. (default 2s) - -alertmanager.alertmanager-client.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -alertmanager.alertmanager-client.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -alertmanager.alertmanager-client.tls-insecure-skip-verify - Skip validating server certificate. - -alertmanager.alertmanager-client.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -alertmanager.alertmanager-client.tls-server-name string - Override the expected name on the server certificate. -alertmanager.cluster.advertise-address string Explicit address or hostname to advertise in cluster. -alertmanager.cluster.gossip-interval duration @@ -151,38 +141,12 @@ Usage of ./cmd/mimir/mimir: True to block private and local addresses in Alertmanager receiver integrations. It blocks private addresses defined by RFC 1918 (IPv4 addresses) and RFC 4193 (IPv6 addresses), as well as loopback, local unicast and local multicast addresses. -alertmanager.sharding-enabled Shard tenants across multiple alertmanager instances. - -alertmanager.sharding-ring.consul.acl-token string - ACL Token used to interact with Consul. - -alertmanager.sharding-ring.consul.client-timeout duration - HTTP timeout when talking to Consul (default 20s) - -alertmanager.sharding-ring.consul.consistent-reads - Enable consistent reads to Consul. -alertmanager.sharding-ring.consul.hostname string Hostname and port of Consul. (default "localhost:8500") - -alertmanager.sharding-ring.consul.watch-burst-size int - Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) - -alertmanager.sharding-ring.consul.watch-rate-limit float - Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) - -alertmanager.sharding-ring.etcd.dial-timeout duration - The dial timeout for the etcd connection. (default 10s) -alertmanager.sharding-ring.etcd.endpoints value The etcd endpoints to connect to. - -alertmanager.sharding-ring.etcd.max-retries int - The maximum number of retries to do for failed ops. (default 10) -alertmanager.sharding-ring.etcd.password string Etcd password. - -alertmanager.sharding-ring.etcd.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -alertmanager.sharding-ring.etcd.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -alertmanager.sharding-ring.etcd.tls-enabled - Enable TLS. - -alertmanager.sharding-ring.etcd.tls-insecure-skip-verify - Skip validating server certificate. - -alertmanager.sharding-ring.etcd.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -alertmanager.sharding-ring.etcd.tls-server-name string - Override the expected name on the server certificate. -alertmanager.sharding-ring.etcd.username string Etcd username. -alertmanager.sharding-ring.heartbeat-period duration @@ -199,16 +163,6 @@ Usage of ./cmd/mimir/mimir: Name of network interface to read address from. (default [eth0 en0]) -alertmanager.sharding-ring.instance-port int Port to advertise in the ring (defaults to server.grpc-listen-port). - -alertmanager.sharding-ring.multi.mirror-enabled - Mirror writes to secondary store. - -alertmanager.sharding-ring.multi.mirror-timeout duration - Timeout for storing value to secondary store. (default 2s) - -alertmanager.sharding-ring.multi.primary string - Primary backend storage used by multi-client. - -alertmanager.sharding-ring.multi.secondary string - Secondary backend storage used by multi-client. - -alertmanager.sharding-ring.prefix string - The prefix for the keys in the store. Should end with a /. (default "alertmanagers/") -alertmanager.sharding-ring.replication-factor int The replication factor to use when sharding the alertmanager. (default 3) -alertmanager.sharding-ring.store string @@ -493,38 +447,12 @@ Usage of ./cmd/mimir/mimir: Max number of compactors that can compact blocks for single tenant. 0 to disable the limit and use all compactors. -compactor.data-dir string Data directory in which to cache blocks and process compactions (default "./data") - -compactor.ring.consul.acl-token string - ACL Token used to interact with Consul. - -compactor.ring.consul.client-timeout duration - HTTP timeout when talking to Consul (default 20s) - -compactor.ring.consul.consistent-reads - Enable consistent reads to Consul. -compactor.ring.consul.hostname string Hostname and port of Consul. (default "localhost:8500") - -compactor.ring.consul.watch-burst-size int - Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) - -compactor.ring.consul.watch-rate-limit float - Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) - -compactor.ring.etcd.dial-timeout duration - The dial timeout for the etcd connection. (default 10s) -compactor.ring.etcd.endpoints value The etcd endpoints to connect to. - -compactor.ring.etcd.max-retries int - The maximum number of retries to do for failed ops. (default 10) -compactor.ring.etcd.password string Etcd password. - -compactor.ring.etcd.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -compactor.ring.etcd.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -compactor.ring.etcd.tls-enabled - Enable TLS. - -compactor.ring.etcd.tls-insecure-skip-verify - Skip validating server certificate. - -compactor.ring.etcd.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -compactor.ring.etcd.tls-server-name string - Override the expected name on the server certificate. -compactor.ring.etcd.username string Etcd username. -compactor.ring.heartbeat-period duration @@ -539,16 +467,6 @@ Usage of ./cmd/mimir/mimir: Name of network interface to read address from. (default [eth0 en0]) -compactor.ring.instance-port int Port to advertise in the ring (defaults to server.grpc-listen-port). - -compactor.ring.multi.mirror-enabled - Mirror writes to secondary store. - -compactor.ring.multi.mirror-timeout duration - Timeout for storing value to secondary store. (default 2s) - -compactor.ring.multi.primary string - Primary backend storage used by multi-client. - -compactor.ring.multi.secondary string - Secondary backend storage used by multi-client. - -compactor.ring.prefix string - The prefix for the keys in the store. Should end with a /. (default "collectors/") -compactor.ring.store string Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "memberlist") -compactor.ring.wait-active-instance-timeout duration @@ -565,18 +483,8 @@ Usage of ./cmd/mimir/mimir: Expands ${var} or $var in config according to the values of the environment variables. -config.file value Configuration file to load. - -consul.acl-token string - ACL Token used to interact with Consul. - -consul.client-timeout duration - HTTP timeout when talking to Consul (default 20s) - -consul.consistent-reads - Enable consistent reads to Consul. -consul.hostname string Hostname and port of Consul. (default "localhost:8500") - -consul.watch-burst-size int - Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) - -consul.watch-rate-limit float - Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) -debug.block-profile-rate int Fraction of goroutine blocking events that are reported in the blocking profile. 1 to include every blocking event in the profile, 0 to disable. -debug.mutex-profile-fraction int @@ -587,56 +495,20 @@ Usage of ./cmd/mimir/mimir: Comma-separated list of zones to exclude from the ring. Instances in excluded zones will be filtered out from the ring. -distributor.ha-tracker.cluster string Prometheus label to look for in samples to identify a Prometheus HA cluster. (default "cluster") - -distributor.ha-tracker.consul.acl-token string - ACL Token used to interact with Consul. - -distributor.ha-tracker.consul.client-timeout duration - HTTP timeout when talking to Consul (default 20s) - -distributor.ha-tracker.consul.consistent-reads - Enable consistent reads to Consul. -distributor.ha-tracker.consul.hostname string Hostname and port of Consul. (default "localhost:8500") - -distributor.ha-tracker.consul.watch-burst-size int - Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) - -distributor.ha-tracker.consul.watch-rate-limit float - Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) -distributor.ha-tracker.enable Enable the distributors HA tracker so that it can accept samples from Prometheus HA replicas gracefully (requires labels). -distributor.ha-tracker.enable-for-all-users Flag to enable, for all users, handling of samples with external labels identifying replicas in an HA Prometheus setup. - -distributor.ha-tracker.etcd.dial-timeout duration - The dial timeout for the etcd connection. (default 10s) -distributor.ha-tracker.etcd.endpoints value The etcd endpoints to connect to. - -distributor.ha-tracker.etcd.max-retries int - The maximum number of retries to do for failed ops. (default 10) -distributor.ha-tracker.etcd.password string Etcd password. - -distributor.ha-tracker.etcd.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -distributor.ha-tracker.etcd.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -distributor.ha-tracker.etcd.tls-enabled - Enable TLS. - -distributor.ha-tracker.etcd.tls-insecure-skip-verify - Skip validating server certificate. - -distributor.ha-tracker.etcd.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -distributor.ha-tracker.etcd.tls-server-name string - Override the expected name on the server certificate. -distributor.ha-tracker.etcd.username string Etcd username. -distributor.ha-tracker.max-clusters int Maximum number of clusters that HA tracker will keep track of for single user. 0 to disable the limit. - -distributor.ha-tracker.multi.mirror-enabled - Mirror writes to secondary store. - -distributor.ha-tracker.multi.mirror-timeout duration - Timeout for storing value to secondary store. (default 2s) - -distributor.ha-tracker.multi.primary string - Primary backend storage used by multi-client. - -distributor.ha-tracker.multi.secondary string - Secondary backend storage used by multi-client. - -distributor.ha-tracker.prefix string - The prefix for the keys in the store. Should end with a /. (default "ha-tracker/") -distributor.ha-tracker.replica string Prometheus label to look for in samples to identify a Prometheus HA replica. (default "__replica__") -distributor.ha-tracker.store string @@ -653,38 +525,12 @@ Usage of ./cmd/mimir/mimir: Max ingestion rate (samples/sec) that this distributor will accept. This limit is per-distributor, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited. -distributor.replication-factor int The number of ingesters to write to and read from. (default 3) - -distributor.ring.consul.acl-token string - ACL Token used to interact with Consul. - -distributor.ring.consul.client-timeout duration - HTTP timeout when talking to Consul (default 20s) - -distributor.ring.consul.consistent-reads - Enable consistent reads to Consul. -distributor.ring.consul.hostname string Hostname and port of Consul. (default "localhost:8500") - -distributor.ring.consul.watch-burst-size int - Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) - -distributor.ring.consul.watch-rate-limit float - Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) - -distributor.ring.etcd.dial-timeout duration - The dial timeout for the etcd connection. (default 10s) -distributor.ring.etcd.endpoints value The etcd endpoints to connect to. - -distributor.ring.etcd.max-retries int - The maximum number of retries to do for failed ops. (default 10) -distributor.ring.etcd.password string Etcd password. - -distributor.ring.etcd.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -distributor.ring.etcd.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -distributor.ring.etcd.tls-enabled - Enable TLS. - -distributor.ring.etcd.tls-insecure-skip-verify - Skip validating server certificate. - -distributor.ring.etcd.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -distributor.ring.etcd.tls-server-name string - Override the expected name on the server certificate. -distributor.ring.etcd.username string Etcd username. -distributor.ring.heartbeat-period duration @@ -699,40 +545,14 @@ Usage of ./cmd/mimir/mimir: Name of network interface to read address from. (default [eth0 en0]) -distributor.ring.instance-port int Port to advertise in the ring (defaults to server.grpc-listen-port). - -distributor.ring.multi.mirror-enabled - Mirror writes to secondary store. - -distributor.ring.multi.mirror-timeout duration - Timeout for storing value to secondary store. (default 2s) - -distributor.ring.multi.primary string - Primary backend storage used by multi-client. - -distributor.ring.multi.secondary string - Secondary backend storage used by multi-client. - -distributor.ring.prefix string - The prefix for the keys in the store. Should end with a /. (default "collectors/") -distributor.ring.store string Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") -distributor.zone-awareness-enabled True to enable the zone-awareness and replicate ingested samples across different availability zones. - -etcd.dial-timeout duration - The dial timeout for the etcd connection. (default 10s) -etcd.endpoints value The etcd endpoints to connect to. - -etcd.max-retries int - The maximum number of retries to do for failed ops. (default 10) -etcd.password string Etcd password. - -etcd.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -etcd.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -etcd.tls-enabled - Enable TLS. - -etcd.tls-insecure-skip-verify - Skip validating server certificate. - -etcd.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -etcd.tls-server-name string - Override the expected name on the server certificate. -etcd.username string Etcd username. -experimental.alertmanager.enable-api @@ -763,18 +583,6 @@ Usage of ./cmd/mimir/mimir: gRPC client max receive message size (bytes). (default 104857600) -frontend.grpc-client-config.grpc-max-send-msg-size int gRPC client max send message size (bytes). (default 16777216) - -frontend.grpc-client-config.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -frontend.grpc-client-config.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -frontend.grpc-client-config.tls-enabled - Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. - -frontend.grpc-client-config.tls-insecure-skip-verify - Skip validating server certificate. - -frontend.grpc-client-config.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -frontend.grpc-client-config.tls-server-name string - Override the expected name on the server certificate. -frontend.log-queries-longer-than duration Log queries that are slower than the specified duration. Set to 0 to disable. Set to < 0 to enable on all queries. -frontend.max-cache-freshness value @@ -855,18 +663,6 @@ Usage of ./cmd/mimir/mimir: gRPC client max receive message size (bytes). (default 104857600) -ingester.client.grpc-max-send-msg-size int gRPC client max send message size (bytes). (default 16777216) - -ingester.client.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -ingester.client.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -ingester.client.tls-enabled - Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. - -ingester.client.tls-insecure-skip-verify - Skip validating server certificate. - -ingester.client.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -ingester.client.tls-server-name string - Override the expected name on the server certificate. -ingester.final-sleep duration Duration to sleep for before exiting, to ensure metrics are scraped. (default 30s) -ingester.heartbeat-period duration @@ -963,30 +759,10 @@ Usage of ./cmd/mimir/mimir: Multiplication factor used when sending out messages (factor * log(N+1)). (default 4) -memberlist.stream-timeout duration The timeout for establishing a connection with a remote node, and for read/write operations. (default 10s) - -memberlist.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -memberlist.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -memberlist.tls-enabled - Enable TLS on the memberlist transport layer. - -memberlist.tls-insecure-skip-verify - Skip validating server certificate. - -memberlist.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -memberlist.tls-server-name string - Override the expected name on the server certificate. -memberlist.transport-debug Log debug transport messages. Note: global log.level must be at debug level as well. -modules List available values that can be used as target. - -multi.mirror-enabled - Mirror writes to secondary store. - -multi.mirror-timeout duration - Timeout for storing value to secondary store. (default 2s) - -multi.primary string - Primary backend storage used by multi-client. - -multi.secondary string - Secondary backend storage used by multi-client. -print.config Print the config and exit. -querier.batch-iterators @@ -1015,18 +791,6 @@ Usage of ./cmd/mimir/mimir: gRPC client max receive message size (bytes). (default 104857600) -querier.frontend-client.grpc-max-send-msg-size int gRPC client max send message size (bytes). (default 16777216) - -querier.frontend-client.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -querier.frontend-client.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -querier.frontend-client.tls-enabled - Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. - -querier.frontend-client.tls-insecure-skip-verify - Skip validating server certificate. - -querier.frontend-client.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -querier.frontend-client.tls-server-name string - Override the expected name on the server certificate. -querier.iterators Use iterators to execute query, as opposed to fully materialising the series in memory. -querier.label-names-and-values-results-max-size-bytes int @@ -1065,16 +829,6 @@ Usage of ./cmd/mimir/mimir: When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured 'query store after' and 'query ingesters within'. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled). -querier.store-gateway-addresses string Comma separated list of store-gateway addresses in DNS Service Discovery format. This option should be set when the store-gateway sharding is disabled (when enabled, the store-gateway instances form a ring and addresses are picked from the ring). - -querier.store-gateway-client.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -querier.store-gateway-client.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -querier.store-gateway-client.tls-insecure-skip-verify - Skip validating server certificate. - -querier.store-gateway-client.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -querier.store-gateway-client.tls-server-name string - Override the expected name on the server certificate. -querier.timeout duration The timeout for a query. This config option should be set on query-frontend too when query sharding is enabled. (default 2m0s) -query-scheduler.grpc-client-config.backoff-max-period duration @@ -1095,26 +849,12 @@ Usage of ./cmd/mimir/mimir: gRPC client max receive message size (bytes). (default 104857600) -query-scheduler.grpc-client-config.grpc-max-send-msg-size int gRPC client max send message size (bytes). (default 16777216) - -query-scheduler.grpc-client-config.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -query-scheduler.grpc-client-config.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -query-scheduler.grpc-client-config.tls-enabled - Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. - -query-scheduler.grpc-client-config.tls-insecure-skip-verify - Skip validating server certificate. - -query-scheduler.grpc-client-config.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -query-scheduler.grpc-client-config.tls-server-name string - Override the expected name on the server certificate. -query-scheduler.max-outstanding-requests-per-tenant int Maximum number of outstanding requests per tenant per query-scheduler. In-flight requests above this limit will fail with HTTP response status code 429. (default 100) -query-scheduler.querier-forget-delay duration If a querier disconnects without sending notification about graceful shutdown, the query-scheduler will keep the querier in the tenant's shard until the forget delay has passed. This feature is useful to reduce the blast radius when shuffle-sharding is enabled. -ring.heartbeat-timeout duration The heartbeat timeout after which ingesters are skipped for reads/writes. 0 = never (timeout disabled). (default 1m0s) - -ring.prefix string - The prefix for the keys in the store. Should end with a /. (default "collectors/") -ring.store string Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") -ruler-storage.azure.account-key value @@ -1213,16 +953,6 @@ Usage of ./cmd/mimir/mimir: HTTP Basic authentication password. It overrides the password set in the URL (if any). -ruler.alertmanager-client.basic-auth-username string HTTP Basic authentication username. It overrides the username set in the URL (if any). - -ruler.alertmanager-client.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -ruler.alertmanager-client.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -ruler.alertmanager-client.tls-insecure-skip-verify - Skip validating server certificate. - -ruler.alertmanager-client.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -ruler.alertmanager-client.tls-server-name string - Override the expected name on the server certificate. -ruler.alertmanager-discovery Use DNS SRV records to discover Alertmanager hosts. -ruler.alertmanager-refresh-interval duration @@ -1249,18 +979,6 @@ Usage of ./cmd/mimir/mimir: gRPC client max receive message size (bytes). (default 104857600) -ruler.client.grpc-max-send-msg-size int gRPC client max send message size (bytes). (default 16777216) - -ruler.client.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -ruler.client.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -ruler.client.tls-enabled - Enable TLS in the GRPC client. This flag needs to be enabled when any other TLS flag is set. If set to false, insecure connection to gRPC server will be used. - -ruler.client.tls-insecure-skip-verify - Skip validating server certificate. - -ruler.client.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -ruler.client.tls-server-name string - Override the expected name on the server certificate. -ruler.disabled-tenants value Comma separated list of tenants whose rules this ruler cannot evaluate. If specified, a ruler that would normally pick the specified tenant(s) for processing will ignore them instead. Subject to sharding. -ruler.enabled-tenants value @@ -1291,38 +1009,12 @@ Usage of ./cmd/mimir/mimir: Report the wall time for ruler queries to complete as a per user metric and as an info level log message. -ruler.resend-delay duration Minimum amount of time to wait before resending an alert to Alertmanager. (default 1m0s) - -ruler.ring.consul.acl-token string - ACL Token used to interact with Consul. - -ruler.ring.consul.client-timeout duration - HTTP timeout when talking to Consul (default 20s) - -ruler.ring.consul.consistent-reads - Enable consistent reads to Consul. -ruler.ring.consul.hostname string Hostname and port of Consul. (default "localhost:8500") - -ruler.ring.consul.watch-burst-size int - Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) - -ruler.ring.consul.watch-rate-limit float - Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) - -ruler.ring.etcd.dial-timeout duration - The dial timeout for the etcd connection. (default 10s) -ruler.ring.etcd.endpoints value The etcd endpoints to connect to. - -ruler.ring.etcd.max-retries int - The maximum number of retries to do for failed ops. (default 10) -ruler.ring.etcd.password string Etcd password. - -ruler.ring.etcd.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -ruler.ring.etcd.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -ruler.ring.etcd.tls-enabled - Enable TLS. - -ruler.ring.etcd.tls-insecure-skip-verify - Skip validating server certificate. - -ruler.ring.etcd.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -ruler.ring.etcd.tls-server-name string - Override the expected name on the server certificate. -ruler.ring.etcd.username string Etcd username. -ruler.ring.heartbeat-period duration @@ -1337,18 +1029,8 @@ Usage of ./cmd/mimir/mimir: Name of network interface to read address from. (default [eth0 en0]) -ruler.ring.instance-port int Port to advertise in the ring (defaults to server.grpc-listen-port). - -ruler.ring.multi.mirror-enabled - Mirror writes to secondary store. - -ruler.ring.multi.mirror-timeout duration - Timeout for storing value to secondary store. (default 2s) - -ruler.ring.multi.primary string - Primary backend storage used by multi-client. - -ruler.ring.multi.secondary string - Secondary backend storage used by multi-client. -ruler.ring.num-tokens int Number of tokens for each ruler. (default 128) - -ruler.ring.prefix string - The prefix for the keys in the store. Should end with a /. (default "rulers/") -ruler.ring.store string Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "memberlist") -ruler.rule-path string @@ -1435,38 +1117,12 @@ Usage of ./cmd/mimir/mimir: Register the intrumentation handlers (/metrics etc). (default true) -store-gateway.sharding-enabled Shard blocks across multiple store gateway instances. This option needs be set both on the store-gateway and querier when running in microservices mode. - -store-gateway.sharding-ring.consul.acl-token string - ACL Token used to interact with Consul. - -store-gateway.sharding-ring.consul.client-timeout duration - HTTP timeout when talking to Consul (default 20s) - -store-gateway.sharding-ring.consul.consistent-reads - Enable consistent reads to Consul. -store-gateway.sharding-ring.consul.hostname string Hostname and port of Consul. (default "localhost:8500") - -store-gateway.sharding-ring.consul.watch-burst-size int - Burst size used in rate limit. Values less than 1 are treated as 1. (default 1) - -store-gateway.sharding-ring.consul.watch-rate-limit float - Rate limit when watching key or prefix in Consul, in requests per second. 0 disables the rate limit. (default 1) - -store-gateway.sharding-ring.etcd.dial-timeout duration - The dial timeout for the etcd connection. (default 10s) -store-gateway.sharding-ring.etcd.endpoints value The etcd endpoints to connect to. - -store-gateway.sharding-ring.etcd.max-retries int - The maximum number of retries to do for failed ops. (default 10) -store-gateway.sharding-ring.etcd.password string Etcd password. - -store-gateway.sharding-ring.etcd.tls-ca-path string - Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. - -store-gateway.sharding-ring.etcd.tls-cert-path string - Path to the client certificate file, which will be used for authenticating with the server. Also requires the key path to be configured. - -store-gateway.sharding-ring.etcd.tls-enabled - Enable TLS. - -store-gateway.sharding-ring.etcd.tls-insecure-skip-verify - Skip validating server certificate. - -store-gateway.sharding-ring.etcd.tls-key-path string - Path to the key file for the client certificate. Also requires the client certificate to be configured. - -store-gateway.sharding-ring.etcd.tls-server-name string - Override the expected name on the server certificate. -store-gateway.sharding-ring.etcd.username string Etcd username. -store-gateway.sharding-ring.heartbeat-period duration @@ -1483,16 +1139,6 @@ Usage of ./cmd/mimir/mimir: Name of network interface to read address from. (default [eth0 en0]) -store-gateway.sharding-ring.instance-port int Port to advertise in the ring (defaults to server.grpc-listen-port). - -store-gateway.sharding-ring.multi.mirror-enabled - Mirror writes to secondary store. - -store-gateway.sharding-ring.multi.mirror-timeout duration - Timeout for storing value to secondary store. (default 2s) - -store-gateway.sharding-ring.multi.primary string - Primary backend storage used by multi-client. - -store-gateway.sharding-ring.multi.secondary string - Secondary backend storage used by multi-client. - -store-gateway.sharding-ring.prefix string - The prefix for the keys in the store. Should end with a /. (default "collectors/") -store-gateway.sharding-ring.replication-factor int The replication factor to use when sharding blocks. This option needs be set both on the store-gateway and querier when running in microservices mode. (default 3) -store-gateway.sharding-ring.store string diff --git a/go.mod b/go.mod index 24171db8e65..7e3417e41df 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.4 github.com/gorilla/mux v1.8.0 - github.com/grafana/dskit v0.0.0-20220128074435-7436a77cd54e + github.com/grafana/dskit v0.0.0-20220131151558-555f434c1a2d github.com/grafana/e2e v0.1.0 github.com/hashicorp/golang-lru v0.5.4 github.com/json-iterator/go v1.1.12 diff --git a/go.sum b/go.sum index 70e2abe4794..3a767fc3e71 100644 --- a/go.sum +++ b/go.sum @@ -971,8 +971,8 @@ github.com/grafana-tools/sdk v0.0.0-20211220201350-966b3088eec9 h1:LQAhgcUPnzdjU github.com/grafana-tools/sdk v0.0.0-20211220201350-966b3088eec9/go.mod h1:AHHlOEv1+GGQ3ktHMlhuTUwo3zljV3QJbC0+8o2kn+4= github.com/grafana/dskit v0.0.0-20211021180445-3bd016e9d7f1/go.mod h1:uPG2nyK4CtgNDmWv7qyzYcdI+S90kHHRWvHnBtEMBXM= github.com/grafana/dskit v0.0.0-20220112093026-95274ccc858d/go.mod h1:M0/dlftwBvH7+hdNNpjMa/CUXD7gsew67mbkCuDlFXE= -github.com/grafana/dskit v0.0.0-20220128074435-7436a77cd54e h1:ObGEDlygoLXjcXINVlDpYjvpMT86q8r8KxEdG1sCagM= -github.com/grafana/dskit v0.0.0-20220128074435-7436a77cd54e/go.mod h1:Q9WmQ9cVkrHx6g4KSl6TN+N3vEOkDZd9RtyXCHd5OPQ= +github.com/grafana/dskit v0.0.0-20220131151558-555f434c1a2d h1:pTt0UWDr6RQ9oRPltpAl5oluO9wrjfFmWlaNOE465yA= +github.com/grafana/dskit v0.0.0-20220131151558-555f434c1a2d/go.mod h1:Q9WmQ9cVkrHx6g4KSl6TN+N3vEOkDZd9RtyXCHd5OPQ= github.com/grafana/e2e v0.1.0 h1:nThd0U0TjUqyOOupSb+qDd4BOdhqwhR/oYbjoqiMlZk= github.com/grafana/e2e v0.1.0/go.mod h1:+26VJWpczg2OU3D0537acnHSHzhJORpxOs6F+M27tZo= github.com/grafana/memberlist v0.2.5-0.20211201083710-c7bc8e9df94b/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= diff --git a/vendor/github.com/grafana/dskit/crypto/tls/tls.go b/vendor/github.com/grafana/dskit/crypto/tls/tls.go index a6fa46f0732..1588edc8939 100644 --- a/vendor/github.com/grafana/dskit/crypto/tls/tls.go +++ b/vendor/github.com/grafana/dskit/crypto/tls/tls.go @@ -13,11 +13,11 @@ import ( // ClientConfig is the config for client TLS. type ClientConfig struct { - CertPath string `yaml:"tls_cert_path"` - KeyPath string `yaml:"tls_key_path"` - CAPath string `yaml:"tls_ca_path"` - ServerName string `yaml:"tls_server_name"` - InsecureSkipVerify bool `yaml:"tls_insecure_skip_verify"` + CertPath string `yaml:"tls_cert_path" category:"advanced"` + KeyPath string `yaml:"tls_key_path" category:"advanced"` + CAPath string `yaml:"tls_ca_path" category:"advanced"` + ServerName string `yaml:"tls_server_name" category:"advanced"` + InsecureSkipVerify bool `yaml:"tls_insecure_skip_verify" category:"advanced"` } var ( diff --git a/vendor/github.com/grafana/dskit/grpcclient/grpcclient.go b/vendor/github.com/grafana/dskit/grpcclient/grpcclient.go index 094337f5d2c..ba7b74cfdcb 100644 --- a/vendor/github.com/grafana/dskit/grpcclient/grpcclient.go +++ b/vendor/github.com/grafana/dskit/grpcclient/grpcclient.go @@ -27,7 +27,7 @@ type Config struct { BackoffOnRatelimits bool `yaml:"backoff_on_ratelimits"` BackoffConfig backoff.Config `yaml:"backoff_config"` - TLSEnabled bool `yaml:"tls_enabled"` + TLSEnabled bool `yaml:"tls_enabled" category:"advanced"` TLS tls.ClientConfig `yaml:",inline"` } diff --git a/vendor/github.com/grafana/dskit/kv/client.go b/vendor/github.com/grafana/dskit/kv/client.go index e8f0c6b5970..7131975ee04 100644 --- a/vendor/github.com/grafana/dskit/kv/client.go +++ b/vendor/github.com/grafana/dskit/kv/client.go @@ -53,7 +53,7 @@ type StoreConfig struct { // where store can be consul or inmemory. type Config struct { Store string `yaml:"store"` - Prefix string `yaml:"prefix"` + Prefix string `yaml:"prefix" category:"advanced"` StoreConfig `yaml:",inline"` Mock Client `yaml:"-"` diff --git a/vendor/github.com/grafana/dskit/kv/consul/client.go b/vendor/github.com/grafana/dskit/kv/consul/client.go index 69219cf7488..d278d8c9e6f 100644 --- a/vendor/github.com/grafana/dskit/kv/consul/client.go +++ b/vendor/github.com/grafana/dskit/kv/consul/client.go @@ -40,11 +40,11 @@ var ( // Config to create a ConsulClient type Config struct { Host string `yaml:"host"` - ACLToken string `yaml:"acl_token"` - HTTPClientTimeout time.Duration `yaml:"http_client_timeout"` - ConsistentReads bool `yaml:"consistent_reads"` - WatchKeyRateLimit float64 `yaml:"watch_rate_limit"` // Zero disables rate limit - WatchKeyBurstSize int `yaml:"watch_burst_size"` // Burst when doing rate-limit, defaults to 1 + ACLToken string `yaml:"acl_token" category:"advanced"` + HTTPClientTimeout time.Duration `yaml:"http_client_timeout" category:"advanced"` + ConsistentReads bool `yaml:"consistent_reads" category:"advanced"` + WatchKeyRateLimit float64 `yaml:"watch_rate_limit" category:"advanced"` // Zero disables rate limit + WatchKeyBurstSize int `yaml:"watch_burst_size" category:"advanced"` // Burst when doing rate-limit, defaults to 1 // Used in tests only. MaxCasRetries int `yaml:"-"` diff --git a/vendor/github.com/grafana/dskit/kv/etcd/etcd.go b/vendor/github.com/grafana/dskit/kv/etcd/etcd.go index fa6944d4f52..0661fc5daa1 100644 --- a/vendor/github.com/grafana/dskit/kv/etcd/etcd.go +++ b/vendor/github.com/grafana/dskit/kv/etcd/etcd.go @@ -22,9 +22,9 @@ import ( // Config for a new etcd.Client. type Config struct { Endpoints []string `yaml:"endpoints"` - DialTimeout time.Duration `yaml:"dial_timeout"` - MaxRetries int `yaml:"max_retries"` - EnableTLS bool `yaml:"tls_enabled"` + DialTimeout time.Duration `yaml:"dial_timeout" category:"advanced"` + MaxRetries int `yaml:"max_retries" category:"advanced"` + EnableTLS bool `yaml:"tls_enabled" category:"advanced"` TLS dstls.ClientConfig `yaml:",inline"` UserName string `yaml:"username"` 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 4265a3b2232..b367b1358d3 100644 --- a/vendor/github.com/grafana/dskit/kv/memberlist/tcp_transport.go +++ b/vendor/github.com/grafana/dskit/kv/memberlist/tcp_transport.go @@ -57,7 +57,7 @@ type TCPTransportConfig struct { MetricsRegisterer prometheus.Registerer `yaml:"-"` MetricsNamespace string `yaml:"-"` - TLSEnabled bool `yaml:"tls_enabled"` + TLSEnabled bool `yaml:"tls_enabled" category:"advanced"` TLS dstls.ClientConfig `yaml:",inline"` } diff --git a/vendor/github.com/grafana/dskit/kv/multi.go b/vendor/github.com/grafana/dskit/kv/multi.go index 8a3382e9859..9a9c24bb834 100644 --- a/vendor/github.com/grafana/dskit/kv/multi.go +++ b/vendor/github.com/grafana/dskit/kv/multi.go @@ -16,11 +16,11 @@ import ( // MultiConfig is a configuration for MultiClient. type MultiConfig struct { - Primary string `yaml:"primary"` - Secondary string `yaml:"secondary"` + Primary string `yaml:"primary" category:"advanced"` + Secondary string `yaml:"secondary" category:"advanced"` - MirrorEnabled bool `yaml:"mirror_enabled"` - MirrorTimeout time.Duration `yaml:"mirror_timeout"` + MirrorEnabled bool `yaml:"mirror_enabled" category:"advanced"` + MirrorTimeout time.Duration `yaml:"mirror_timeout" category:"advanced"` // ConfigProvider returns channel with MultiRuntimeConfig updates. ConfigProvider func() <-chan MultiRuntimeConfig `yaml:"-"` diff --git a/vendor/github.com/grafana/dskit/ring/replication_set.go b/vendor/github.com/grafana/dskit/ring/replication_set.go index 461429d6fa8..b73227136d3 100644 --- a/vendor/github.com/grafana/dskit/ring/replication_set.go +++ b/vendor/github.com/grafana/dskit/ring/replication_set.go @@ -20,8 +20,9 @@ type ReplicationSet struct { MaxUnavailableZones int } -// Do function f in parallel for all replicas in the set, erroring is we exceed +// Do function f in parallel for all replicas in the set, erroring if we exceed // MaxErrors and returning early otherwise. +// Return a slice of all results from f, or nil if an error occurred. func (r ReplicationSet) Do(ctx context.Context, delay time.Duration, f func(context.Context, *InstanceDesc) (interface{}, error)) ([]interface{}, error) { type instanceResult struct { res interface{} diff --git a/vendor/modules.txt b/vendor/modules.txt index c08729cb424..1781d93c64e 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -338,7 +338,7 @@ github.com/gosimple/slug # github.com/grafana-tools/sdk v0.0.0-20211220201350-966b3088eec9 ## explicit; go 1.13 github.com/grafana-tools/sdk -# github.com/grafana/dskit v0.0.0-20220128074435-7436a77cd54e +# github.com/grafana/dskit v0.0.0-20220131151558-555f434c1a2d ## explicit; go 1.16 github.com/grafana/dskit/backoff github.com/grafana/dskit/concurrency From 0afeb6e999a1b57f427c40bcaad9d925853c2405 Mon Sep 17 00:00:00 2001 From: Christian Simon Date: Mon, 31 Jan 2022 16:09:11 +0000 Subject: [PATCH 055/168] Ensure a latest docker tag is pushed when on latest git tag (#975) This will make sure to push an extra docker image tag `:latest`, whenever the git tag contains the latest stable version. --- push-images | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/push-images b/push-images index 52281128887..5275bb7302a 100755 --- a/push-images +++ b/push-images @@ -25,7 +25,11 @@ push_image() { echo "Pushing ${image}:${IMAGE_TAG}" docker push "${image}:${IMAGE_TAG}" - # TODO: Check if it is a tag `v[0-9].[0-9].[0-9]` and if it is the latest release push a latest tag + # If image is the latest stable git tag, update the latest docker image tag + if [[ "$(git tag | grep -E '^v?[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -n 1)" == "${IMAGE_TAG}" ]]; then + docker tag "${image}:${IMAGE_TAG}" "${image}:latest" + docker push "${image}:latest" + fi } # Push images From 599c6d43a8a0afc9afadd23b3cc6159c0d703a3c Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Mon, 31 Jan 2022 17:20:19 +0100 Subject: [PATCH 056/168] Make env var prefix configurable in mimirtool (#945) * Make env var prefix configurable in mimirtool Signed-off-by: Dimitar Dimitrov * Add forgotten UseLegacyRoutes to env_vars.go Signed-off-by: Dimitar Dimitrov * Add license Signed-off-by: Dimitar Dimitrov * Add a test for env_vars.go Signed-off-by: Dimitar Dimitrov * Fix prefixing in env_vars.go Signed-off-by: Dimitar Dimitrov * Order fields alphabetically Signed-off-by: Dimitar Dimitrov * Add license Signed-off-by: Dimitar Dimitrov --- cmd/mimirtool/main.go | 22 ++++++----- pkg/mimirtool/commands/access_control.go | 4 +- pkg/mimirtool/commands/alerts.go | 28 +++++++------- pkg/mimirtool/commands/analyse.go | 26 ++++++------- pkg/mimirtool/commands/bucket_validation.go | 2 +- pkg/mimirtool/commands/env_var.go | 42 +++++++++++++++++++++ pkg/mimirtool/commands/env_var_test.go | 42 +++++++++++++++++++++ pkg/mimirtool/commands/loadgen.go | 2 +- pkg/mimirtool/commands/logger.go | 2 +- pkg/mimirtool/commands/push_gateway.go | 2 +- pkg/mimirtool/commands/remote_read.go | 14 +++---- pkg/mimirtool/commands/rules.go | 30 +++++++-------- 12 files changed, 151 insertions(+), 65 deletions(-) create mode 100644 pkg/mimirtool/commands/env_var.go create mode 100644 pkg/mimirtool/commands/env_var_test.go diff --git a/cmd/mimirtool/main.go b/cmd/mimirtool/main.go index a192a66d876..0942c45dc9a 100644 --- a/cmd/mimirtool/main.go +++ b/cmd/mimirtool/main.go @@ -30,16 +30,18 @@ var ( func main() { app := kingpin.New("mimirtool", "A command-line tool to manage mimir and GEM.") - logConfig.Register(app) - alertCommand.Register(app) - alertmanagerCommand.Register(app) - ruleCommand.Register(app) - pushGateway.Register(app) - loadgenCommand.Register(app) - remoteReadCommand.Register(app) - aclCommand.Register(app) - analyseCommand.Register(app) - bucketValidateCommand.Register(app) + + envVars := commands.NewEnvVarsWithPrefix("MIMIR") + logConfig.Register(app, envVars) + alertCommand.Register(app, envVars) + alertmanagerCommand.Register(app, envVars) + ruleCommand.Register(app, envVars) + pushGateway.Register(app, envVars) + loadgenCommand.Register(app, envVars) + remoteReadCommand.Register(app, envVars) + aclCommand.Register(app, envVars) + analyseCommand.Register(app, envVars) + bucketValidateCommand.Register(app, envVars) app.Command("version", "Get the version of the mimirtool CLI").Action(func(k *kingpin.ParseContext) error { fmt.Print(version.Template) diff --git a/pkg/mimirtool/commands/access_control.go b/pkg/mimirtool/commands/access_control.go index 070c058ec20..36536eacdb5 100644 --- a/pkg/mimirtool/commands/access_control.go +++ b/pkg/mimirtool/commands/access_control.go @@ -22,11 +22,11 @@ type AccessControlCommand struct { } // Register is used to register the command to a parent command. -func (a *AccessControlCommand) Register(app *kingpin.Application) { +func (a *AccessControlCommand) Register(app *kingpin.Application, envVars EnvVarNames) { aclCmd := app.Command("acl", "Generate and view ACL options in GrafanaCloud.") generateHeaderCmd := aclCmd.Command("generate-header", "Generate the header that needs to be passed to the datasource for setting ACLs.").Action(a.generateHeader) - generateHeaderCmd.Flag("id", "Cortex tenant ID, alternatively set MIMIR_TENANT_ID.").Envar("MIMIR_TENANT_ID").Required().StringVar(&a.InstanceID) + generateHeaderCmd.Flag("id", "Cortex tenant ID, alternatively set "+envVars.TenantID+".").Envar(envVars.TenantID).Required().StringVar(&a.InstanceID) generateHeaderCmd.Flag("rule", "The access control rules (Prometheus selectors). Set it multiple times to set multiple rules.").Required().StringsVar(&a.ACLs) } diff --git a/pkg/mimirtool/commands/alerts.go b/pkg/mimirtool/commands/alerts.go index e14a7cd3dee..dffb119255b 100644 --- a/pkg/mimirtool/commands/alerts.go +++ b/pkg/mimirtool/commands/alerts.go @@ -63,15 +63,15 @@ type AlertCommand struct { } // Register rule related commands and flags with the kingpin application -func (a *AlertmanagerCommand) Register(app *kingpin.Application) { +func (a *AlertmanagerCommand) Register(app *kingpin.Application, envVars EnvVarNames) { alertCmd := app.Command("alertmanager", "View & edit alertmanager configs stored in cortex.").PreAction(a.setup) - alertCmd.Flag("address", "Address of the cortex cluster, alternatively set MIMIR_ADDRESS.").Envar("MIMIR_ADDRESS").Required().StringVar(&a.ClientConfig.Address) - alertCmd.Flag("id", "Cortex tenant id, alternatively set MIMIR_TENANT_ID.").Envar("MIMIR_TENANT_ID").Required().StringVar(&a.ClientConfig.ID) - alertCmd.Flag("user", "API user to use when contacting cortex, alternatively set MIMIR_API_USER. If empty, MIMIR_TENANT_ID will be used instead.").Default("").Envar("MIMIR_API_USER").StringVar(&a.ClientConfig.User) - alertCmd.Flag("key", "API key to use when contacting cortex, alternatively set MIMIR_API_KEY.").Default("").Envar("MIMIR_API_KEY").StringVar(&a.ClientConfig.Key) - alertCmd.Flag("tls-ca-path", "TLS CA certificate to verify cortex API as part of mTLS, alternatively set MIMIR_TLS_CA_PATH.").Default("").Envar("MIMIR_TLS_CA_PATH").StringVar(&a.ClientConfig.TLS.CAPath) - alertCmd.Flag("tls-cert-path", "TLS client certificate to authenticate with cortex API as part of mTLS, alternatively set MIMIR_TLS_CERT_PATH.").Default("").Envar("MIMIR_TLS_CERT_PATH").StringVar(&a.ClientConfig.TLS.CertPath) - alertCmd.Flag("tls-key-path", "TLS client certificate private key to authenticate with cortex API as part of mTLS, alternatively set MIMIR_TLS_KEY_PATH.").Default("").Envar("MIMIR_TLS_KEY_PATH").StringVar(&a.ClientConfig.TLS.KeyPath) + alertCmd.Flag("address", "Address of the cortex cluster, alternatively set "+envVars.Address+".").Envar(envVars.Address).Required().StringVar(&a.ClientConfig.Address) + alertCmd.Flag("id", "Cortex tenant id, alternatively set "+envVars.TenantID+".").Envar(envVars.TenantID).Required().StringVar(&a.ClientConfig.ID) + alertCmd.Flag("user", fmt.Sprintf("API user to use when contacting cortex, alternatively set %s. If empty, %s will be used instead.", envVars.APIUser, envVars.TenantID)).Default("").Envar(envVars.APIUser).StringVar(&a.ClientConfig.User) + alertCmd.Flag("key", "API key to use when contacting cortex, alternatively set "+envVars.APIKey+".").Default("").Envar(envVars.APIKey).StringVar(&a.ClientConfig.Key) + alertCmd.Flag("tls-ca-path", "TLS CA certificate to verify cortex API as part of mTLS, alternatively set "+envVars.TLSCAPath+".").Default("").Envar(envVars.TLSCAPath).StringVar(&a.ClientConfig.TLS.CAPath) + alertCmd.Flag("tls-cert-path", "TLS client certificate to authenticate with cortex API as part of mTLS, alternatively set "+envVars.TLSCertPath+".").Default("").Envar(envVars.TLSCertPath).StringVar(&a.ClientConfig.TLS.CertPath) + alertCmd.Flag("tls-key-path", "TLS client certificate private key to authenticate with cortex API as part of mTLS, alternatively set "+envVars.TLSKeyPath+".").Default("").Envar(envVars.TLSKeyPath).StringVar(&a.ClientConfig.TLS.KeyPath) // Get Alertmanager Configs Command getAlertsCmd := alertCmd.Command("get", "Get the alertmanager config currently in the cortex alertmanager.").Action(a.getConfig) @@ -141,16 +141,16 @@ func (a *AlertmanagerCommand) deleteConfig(k *kingpin.ParseContext) error { return nil } -func (a *AlertCommand) Register(app *kingpin.Application) { +func (a *AlertCommand) Register(app *kingpin.Application, envVars EnvVarNames) { alertCmd := app.Command("alerts", "View active alerts in alertmanager.").PreAction(a.setup) - alertCmd.Flag("address", "Address of the cortex cluster, alternatively set MIMIR_ADDRESS.").Envar("MIMIR_ADDRESS").Required().StringVar(&a.ClientConfig.Address) - alertCmd.Flag("id", "Cortex tenant id, alternatively set MIMIR_TENANT_ID.").Envar("MIMIR_TENANT_ID").Required().StringVar(&a.ClientConfig.ID) - alertCmd.Flag("user", "API user to use when contacting cortex, alternatively set MIMIR_API_USER. If empty, MIMIR_TENANT_ID will be used instead.").Default("").Envar("MIMIR_API_USER").StringVar(&a.ClientConfig.User) - alertCmd.Flag("key", "API key to use when contacting cortex, alternatively set MIMIR_API_KEY.").Default("").Envar("MIMIR_API_KEY").StringVar(&a.ClientConfig.Key) + alertCmd.Flag("address", "Address of the cortex cluster, alternatively set "+envVars.Address+".").Envar(envVars.Address).Required().StringVar(&a.ClientConfig.Address) + alertCmd.Flag("id", "Cortex tenant id, alternatively set "+envVars.TenantID+".").Envar(envVars.TenantID).Required().StringVar(&a.ClientConfig.ID) + alertCmd.Flag("user", fmt.Sprintf("API user to use when contacting cortex, alternatively set %s. If empty, %s will be used instead.", envVars.APIUser, envVars.TenantID)).Default("").Envar(envVars.APIUser).StringVar(&a.ClientConfig.User) + alertCmd.Flag("key", "API key to use when contacting cortex, alternatively set "+envVars.APIKey+".").Default("").Envar(envVars.APIKey).StringVar(&a.ClientConfig.Key) verifyAlertsCmd := alertCmd.Command("verify", "Verifies alerts in an alertmanager cluster are deduplicated; useful for verifying correct configuration when transferring from Prometheus to Cortex alert evaluation.").Action(a.verifyConfig) verifyAlertsCmd.Flag("ignore-alerts", "A comma separated list of Alert names to ignore in deduplication checks.").StringVar(&a.IgnoreString) - verifyAlertsCmd.Flag("source-label", "Label to look for when deciding if two alerts are duplicates of eachother from separate sources.").Default("prometheus").StringVar(&a.SourceLabel) + verifyAlertsCmd.Flag("source-label", "Label to look for when deciding if two alerts are duplicates of each other from separate sources.").Default("prometheus").StringVar(&a.SourceLabel) verifyAlertsCmd.Flag("grace-period", "Grace period, don't consider alert groups with the incorrect amount of alert replicas erroneous unless the alerts have existed for more than this amount of time, in minutes.").Default("2").IntVar(&a.GracePeriod) verifyAlertsCmd.Flag("frequency", "Setting this value will turn mimirtool into a long-running process, running the alerts verify check every # of minutes specified").IntVar(&a.CheckFrequency) } diff --git a/pkg/mimirtool/commands/analyse.go b/pkg/mimirtool/commands/analyse.go index 9781a3943c1..6cdc055adb1 100644 --- a/pkg/mimirtool/commands/analyse.go +++ b/pkg/mimirtool/commands/analyse.go @@ -12,21 +12,21 @@ import ( type AnalyseCommand struct { } -func (cmd *AnalyseCommand) Register(app *kingpin.Application) { +func (cmd *AnalyseCommand) Register(app *kingpin.Application, envVars EnvVarNames) { analyseCmd := app.Command("analyse", "Run analysis against your Prometheus, Grafana and Cortex to see which metrics being used and exported.") paCmd := &PrometheusAnalyseCommand{} prometheusAnalyseCmd := analyseCmd.Command("prometheus", "Take the metrics being used in Grafana and get the cardinality from a Prometheus.").Action(paCmd.run) - prometheusAnalyseCmd.Flag("address", "Address of the Prometheus/Cortex instance, alternatively set $MIMIR_ADDRESS."). - Envar("MIMIR_ADDRESS"). + prometheusAnalyseCmd.Flag("address", "Address of the Prometheus/Cortex instance, alternatively set "+envVars.Address+"."). + Envar(envVars.Address). Required(). StringVar(&paCmd.address) - prometheusAnalyseCmd.Flag("id", "Username to use when contacting Prometheus/Cortex, alternatively set $MIMIR_TENANT_ID."). - Envar("MIMIR_TENANT_ID"). + prometheusAnalyseCmd.Flag("id", "Username to use when contacting Prometheus/Cortex, alternatively set "+envVars.TenantID+"."). + Envar(envVars.TenantID). Default(""). StringVar(&paCmd.username) - prometheusAnalyseCmd.Flag("key", "Password to use when contacting Prometheus/Cortex, alternatively set $MIMIR_API_KEY."). - Envar("MIMIR_API_KEY"). + prometheusAnalyseCmd.Flag("key", "Password to use when contacting Prometheus/Cortex, alternatively set "+envVars.APIKey+"."). + Envar(envVars.APIKey). Default(""). StringVar(&paCmd.password) prometheusAnalyseCmd.Flag("read-timeout", "timeout for read requests"). @@ -63,16 +63,16 @@ func (cmd *AnalyseCommand) Register(app *kingpin.Application) { raCmd := &RulerAnalyseCommand{} rulerAnalyseCmd := analyseCmd.Command("ruler", "Analyse and extract the metrics used in Cortex rules"). Action(raCmd.run) - rulerAnalyseCmd.Flag("address", "Address of the Prometheus/Cortex instance, alternatively set $MIMIR_ADDRESS."). - Envar("MIMIR_ADDRESS"). + rulerAnalyseCmd.Flag("address", "Address of the Prometheus/Cortex instance, alternatively set "+envVars.Address+"."). + Envar(envVars.Address). Required(). StringVar(&raCmd.ClientConfig.Address) - rulerAnalyseCmd.Flag("id", "Username to use when contacting Prometheus/Cortex, alternatively set $MIMIR_TENANT_ID."). - Envar("MIMIR_TENANT_ID"). + rulerAnalyseCmd.Flag("id", "Username to use when contacting Prometheus/Cortex, alternatively set "+envVars.TenantID+"."). + Envar(envVars.TenantID). Default(""). StringVar(&raCmd.ClientConfig.ID) - rulerAnalyseCmd.Flag("key", "Password to use when contacting Prometheus/Cortex, alternatively set $MIMIR_API_KEY."). - Envar("MIMIR_API_KEY"). + rulerAnalyseCmd.Flag("key", "Password to use when contacting Prometheus/Cortex, alternatively set "+envVars.APIKey+"."). + Envar(envVars.APIKey). Default(""). StringVar(&raCmd.ClientConfig.Key) rulerAnalyseCmd.Flag("output", "The path for the output file"). diff --git a/pkg/mimirtool/commands/bucket_validation.go b/pkg/mimirtool/commands/bucket_validation.go index 9007b3e8107..56adc258da1 100644 --- a/pkg/mimirtool/commands/bucket_validation.go +++ b/pkg/mimirtool/commands/bucket_validation.go @@ -94,7 +94,7 @@ func (c *retryingBucketClient) Delete(ctx context.Context, name string) error { } // Register is used to register the command to a parent command. -func (b *BucketValidationCommand) Register(app *kingpin.Application) { +func (b *BucketValidationCommand) Register(app *kingpin.Application, _ EnvVarNames) { bvCmd := app.Command("bucket-validation", "Validate that object store bucket works correctly.").Action(b.validate) bvCmd.Flag("object-count", "Number of objects to create & delete").Default("2000").IntVar(&b.objectCount) diff --git a/pkg/mimirtool/commands/env_var.go b/pkg/mimirtool/commands/env_var.go new file mode 100644 index 00000000000..36b0fc4174e --- /dev/null +++ b/pkg/mimirtool/commands/env_var.go @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package commands + +type EnvVarNames struct { + Address string + APIKey string + APIUser string + TLSCAPath string + TLSCertPath string + TLSKeyPath string + TenantID string + UseLegacyRoutes string +} + +func NewEnvVarsWithPrefix(prefix string) EnvVarNames { + const ( + address = "ADDRESS" + apiKey = "API_KEY" + apiUser = "API_USER" + tenantID = "TENANT_ID" + tlsCAPath = "TLS_CA_PATH" + tlsCertPath = "TLS_CERT_PATH" + tlsKeyPath = "TLS_KEY_PATH" + useLegacyRoutes = "USE_LEGACY_ROUTES" + ) + + if len(prefix) > 0 && prefix[len(prefix)-1] != '_' { + prefix = prefix + "_" + } + + return EnvVarNames{ + Address: prefix + address, + APIKey: prefix + apiKey, + APIUser: prefix + apiUser, + TLSCAPath: prefix + tlsCAPath, + TLSCertPath: prefix + tlsCertPath, + TLSKeyPath: prefix + tlsKeyPath, + TenantID: prefix + tenantID, + UseLegacyRoutes: prefix + useLegacyRoutes, + } +} diff --git a/pkg/mimirtool/commands/env_var_test.go b/pkg/mimirtool/commands/env_var_test.go new file mode 100644 index 00000000000..66b324e44e2 --- /dev/null +++ b/pkg/mimirtool/commands/env_var_test.go @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package commands + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewEnvVarsWithPrefix(t *testing.T) { + testCases := []struct { + prefix string + fieldsShouldMatchRegex string + }{ + { + prefix: "PREFIX", + fieldsShouldMatchRegex: "^PREFIX_[A-Z].+", + }, + { + prefix: "PREFIX_", + fieldsShouldMatchRegex: "^PREFIX_[A-Z].+", + }, + { + prefix: "", + fieldsShouldMatchRegex: "^[A-Z].+", + }, + } + + for _, tc := range testCases { + t.Run(tc.prefix, func(t *testing.T) { + vars := reflect.ValueOf(NewEnvVarsWithPrefix(tc.prefix)) + for i := 0; i < vars.NumField(); i++ { + t.Run(vars.Type().Field(i).Name, func(t *testing.T) { + assert.Regexp(t, tc.fieldsShouldMatchRegex, vars.Field(i).Interface().(string)) + }) + } + }) + } + +} diff --git a/pkg/mimirtool/commands/loadgen.go b/pkg/mimirtool/commands/loadgen.go index cdae4858bf0..bf65d2f2f89 100644 --- a/pkg/mimirtool/commands/loadgen.go +++ b/pkg/mimirtool/commands/loadgen.go @@ -72,7 +72,7 @@ type LoadgenCommand struct { queryClient v1.API } -func (c *LoadgenCommand) Register(app *kingpin.Application) { +func (c *LoadgenCommand) Register(app *kingpin.Application, _ EnvVarNames) { loadgenCommand := &LoadgenCommand{} cmd := app.Command("loadgen", "Simple load generator for Cortex.").Action(loadgenCommand.run) cmd.Flag("write-url", ""). diff --git a/pkg/mimirtool/commands/logger.go b/pkg/mimirtool/commands/logger.go index f16edeb440d..9258f10d6bc 100644 --- a/pkg/mimirtool/commands/logger.go +++ b/pkg/mimirtool/commands/logger.go @@ -38,6 +38,6 @@ func (l *LoggerConfig) registerLogLevel(pc *kingpin.ParseContext) error { } // Register configures log related flags -func (l *LoggerConfig) Register(app *kingpin.Application) { +func (l *LoggerConfig) Register(app *kingpin.Application, _ EnvVarNames) { app.Flag("log.level", "set level of the logger").Default("info").PreAction(l.registerLogLevel).StringVar(&l.Level) } diff --git a/pkg/mimirtool/commands/push_gateway.go b/pkg/mimirtool/commands/push_gateway.go index b7f6d2872ed..ddc79154091 100644 --- a/pkg/mimirtool/commands/push_gateway.go +++ b/pkg/mimirtool/commands/push_gateway.go @@ -27,7 +27,7 @@ type PushGatewayConfig struct { } // Register configures log related flags -func (l *PushGatewayConfig) Register(app *kingpin.Application) { +func (l *PushGatewayConfig) Register(app *kingpin.Application, _ EnvVarNames) { app.PreAction(l.setup) app.Flag("push-gateway.endpoint", "url for the push-gateway to register metrics").URLVar(&l.Endpoint) app.Flag("push-gateway.job", "job name to register metrics").StringVar(&l.JobName) diff --git a/pkg/mimirtool/commands/remote_read.go b/pkg/mimirtool/commands/remote_read.go index e078fd2e302..3c1f88b18e1 100644 --- a/pkg/mimirtool/commands/remote_read.go +++ b/pkg/mimirtool/commands/remote_read.go @@ -49,7 +49,7 @@ type RemoteReadCommand struct { to string } -func (c *RemoteReadCommand) Register(app *kingpin.Application) { +func (c *RemoteReadCommand) Register(app *kingpin.Application, envVars EnvVarNames) { remoteReadCmd := app.Command("remote-read", "Inspect stored series in Cortex using the remote read API.") exportCmd := remoteReadCmd.Command("export", "Export metrics remote read series into a local TSDB.").Action(c.export) dumpCmd := remoteReadCmd.Command("dump", "Dump remote read series.").Action(c.dump) @@ -57,19 +57,19 @@ func (c *RemoteReadCommand) Register(app *kingpin.Application) { now := time.Now() for _, cmd := range []*kingpin.CmdClause{exportCmd, dumpCmd, statsCmd} { - cmd.Flag("address", "Address of the cortex cluster, alternatively set $MIMIR_ADDRESS."). - Envar("MIMIR_ADDRESS"). + cmd.Flag("address", "Address of the cortex cluster, alternatively set "+envVars.Address+"."). + Envar(envVars.Address). Required(). StringVar(&c.address) cmd.Flag("remote-read-path", "Path of the remote read endpoint."). Default("/prometheus/api/v1/read"). StringVar(&c.remoteReadPath) - cmd.Flag("id", "Cortex tenant id, alternatively set $MIMIR_TENANT_ID."). - Envar("MIMIR_TENANT_ID"). + cmd.Flag("id", "Cortex tenant id, alternatively set "+envVars.TenantID+"."). + Envar(envVars.TenantID). Default(""). StringVar(&c.tenantID) - cmd.Flag("key", "Api key to use when contacting cortex, alternatively set $MIMIR_API_KEY."). - Envar("MIMIR_API_KEY"). + cmd.Flag("key", "Api key to use when contacting cortex, alternatively set "+envVars.APIKey+"."). + Envar(envVars.APIKey). Default(""). StringVar(&c.apiKey) cmd.Flag("read-timeout", "timeout for read requests"). diff --git a/pkg/mimirtool/commands/rules.go b/pkg/mimirtool/commands/rules.go index fbe16fa4dd2..ccad90fe99d 100644 --- a/pkg/mimirtool/commands/rules.go +++ b/pkg/mimirtool/commands/rules.go @@ -93,10 +93,10 @@ type RuleCommand struct { } // Register rule related commands and flags with the kingpin application -func (r *RuleCommand) Register(app *kingpin.Application) { +func (r *RuleCommand) Register(app *kingpin.Application, envVars EnvVarNames) { rulesCmd := app.Command("rules", "View & edit rules stored in cortex.").PreAction(r.setup) - rulesCmd.Flag("user", "API user to use when contacting cortex, alternatively set MIMIR_API_USER. If empty, MIMIR_TENANT_ID will be used instead.").Default("").Envar("MIMIR_API_USER").StringVar(&r.ClientConfig.User) - rulesCmd.Flag("key", "API key to use when contacting cortex, alternatively set MIMIR_API_KEY.").Default("").Envar("MIMIR_API_KEY").StringVar(&r.ClientConfig.Key) + rulesCmd.Flag("user", fmt.Sprintf("API user to use when contacting cortex, alternatively set %s. If empty, %s will be used instead.", envVars.APIUser, envVars.TenantID)).Default("").Envar(envVars.APIUser).StringVar(&r.ClientConfig.User) + rulesCmd.Flag("key", "API key to use when contacting cortex, alternatively set "+envVars.APIKey+".").Default("").Envar(envVars.APIKey).StringVar(&r.ClientConfig.Key) rulesCmd.Flag("backend", "Backend type to interact with: ").Default("cortex").EnumVar(&r.Backend, backends...) // Register rule commands @@ -133,34 +133,34 @@ func (r *RuleCommand) Register(app *kingpin.Application) { // Require Mimir cluster address and tentant ID on all these commands for _, c := range []*kingpin.CmdClause{listCmd, printRulesCmd, getRuleGroupCmd, deleteRuleGroupCmd, loadRulesCmd, diffRulesCmd, syncRulesCmd} { - c.Flag("address", "Address of the cortex cluster, alternatively set MIMIR_ADDRESS."). - Envar("MIMIR_ADDRESS"). + c.Flag("address", "Address of the cortex cluster, alternatively set "+envVars.Address+"."). + Envar(envVars.Address). Required(). StringVar(&r.ClientConfig.Address) - c.Flag("id", "Cortex tenant id, alternatively set MIMIR_TENANT_ID."). - Envar("MIMIR_TENANT_ID"). + c.Flag("id", "Cortex tenant id, alternatively set "+envVars.TenantID+"."). + Envar(envVars.TenantID). Required(). StringVar(&r.ClientConfig.ID) - c.Flag("use-legacy-routes", "If set, API requests to cortex will use the legacy /api/prom/ routes, alternatively set CORTEX_USE_LEGACY_ROUTES."). + c.Flag("use-legacy-routes", "If set, API requests to cortex will use the legacy /api/prom/ routes, alternatively set "+envVars.UseLegacyRoutes+"."). Default("false"). - Envar("CORTEX_USE_LEGACY_ROUTES"). + Envar(envVars.UseLegacyRoutes). BoolVar(&r.ClientConfig.UseLegacyRoutes) - c.Flag("tls-ca-path", "TLS CA certificate to verify cortex API as part of mTLS, alternatively set MIMIR_TLS_CA_PATH."). + c.Flag("tls-ca-path", "TLS CA certificate to verify cortex API as part of mTLS, alternatively set "+envVars.TLSCAPath+"."). Default(""). - Envar("MIMIR_TLS_CA_PATH"). + Envar(envVars.TLSCAPath). StringVar(&r.ClientConfig.TLS.CAPath) - c.Flag("tls-cert-path", "TLS client certificate to authenticate with cortex API as part of mTLS, alternatively set MIMIR_TLS_CERT_PATH."). + c.Flag("tls-cert-path", "TLS client certificate to authenticate with cortex API as part of mTLS, alternatively set "+envVars.TLSCertPath+"."). Default(""). - Envar("MIMIR_TLS_CERT_PATH"). + Envar(envVars.TLSCertPath). StringVar(&r.ClientConfig.TLS.CertPath) - c.Flag("tls-key-path", "TLS client certificate private key to authenticate with cortex API as part of mTLS, alternatively set MIMIR_TLS_KEY_PATH."). + c.Flag("tls-key-path", "TLS client certificate private key to authenticate with cortex API as part of mTLS, alternatively set "+envVars.TLSKeyPath+"."). Default(""). - Envar("MIMIR_TLS_KEY_PATH"). + Envar(envVars.TLSKeyPath). StringVar(&r.ClientConfig.TLS.KeyPath) } From 30d8407ce3ad9f44c5c7b7887b1549972e8fcbf5 Mon Sep 17 00:00:00 2001 From: Oleg Zaytsev Date: Mon, 31 Jan 2022 18:05:45 +0100 Subject: [PATCH 057/168] Fix links in store-gateway list blocks page (#973) * Fix links in store-gateway list blocks page It was unnecessarily over-engineered and broken, since when running behind a reverse-proxy, the RequestURI might not be the one coming from the browser. Thanks @pstibrany for the suggestion. Signed-off-by: Oleg Zaytsev * Provide old params too Signed-off-by: Oleg Zaytsev --- pkg/storegateway/gateway_blocks_http.go | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/pkg/storegateway/gateway_blocks_http.go b/pkg/storegateway/gateway_blocks_http.go index cc7ed686b67..d777412e7d0 100644 --- a/pkg/storegateway/gateway_blocks_http.go +++ b/pkg/storegateway/gateway_blocks_http.go @@ -33,13 +33,13 @@ const blocksPageTemplate = `

Showing blocks for tenant: {{ .Tenant }}

{{ if not .ShowDeleted }} - Show Deleted + Show Deleted {{ end }} {{ if not .ShowSources }} - Show Sources + Show Sources {{ end }} {{ if not .ShowParents }} - Show Parents + Show Parents {{ end }}

@@ -212,9 +212,9 @@ func (s *StoreGateway) BlocksHandler(w http.ResponseWriter, req *http.Request) { ShowSources bool `json:"-"` ShowParents bool `json:"-"` - ShowDeletedURI string `json:"-"` - ShowSourcesURI string `json:"-"` - ShowParentsURI string `json:"-"` + ShowDeletedQuery string `json:"-"` + ShowSourcesQuery string `json:"-"` + ShowParentsQuery string `json:"-"` TSDBTenantIDExternalLabel string `json:"-"` }{ @@ -228,15 +228,15 @@ func (s *StoreGateway) BlocksHandler(w http.ResponseWriter, req *http.Request) { ShowSources: showSources, ShowParents: showParents, - ShowDeletedURI: uriWithTrueBoolParam(*req.URL, req.Form, "show_deleted"), - ShowSourcesURI: uriWithTrueBoolParam(*req.URL, req.Form, "show_sources"), - ShowParentsURI: uriWithTrueBoolParam(*req.URL, req.Form, "show_parents"), + ShowDeletedQuery: queryWithTrueBoolParam(*req.URL, req.Form, "show_deleted"), + ShowSourcesQuery: queryWithTrueBoolParam(*req.URL, req.Form, "show_sources"), + ShowParentsQuery: queryWithTrueBoolParam(*req.URL, req.Form, "show_parents"), TSDBTenantIDExternalLabel: tsdb.TenantIDExternalLabel, }, blocksTemplate, req) } -func uriWithTrueBoolParam(u url.URL, form url.Values, boolParam string) string { +func queryWithTrueBoolParam(u url.URL, form url.Values, boolParam string) string { q := u.Query() for k, vs := range form { for _, val := range vs { @@ -245,9 +245,7 @@ func uriWithTrueBoolParam(u url.URL, form url.Values, boolParam string) string { } } q.Set(boolParam, "true") - u.RawQuery = q.Encode() - - return u.RequestURI() + return "?" + q.Encode() } func formatTimeIfNotZero(t time.Time, format string) string { From 844dc6dbd0e8c8d768a0826fd6216f40c3c1d041 Mon Sep 17 00:00:00 2001 From: Timur Olzhabayev Date: Tue, 1 Feb 2022 08:59:28 +0100 Subject: [PATCH 058/168] Docs/auto assign pr only to project (#978) * add issue commands worfklow and rename commands config * Support PRs without issues to trigger workflow --- .github/{issue_commands.json => issue_and_pr_commands.json} | 0 .../{issue_commands.yml => issue_and_pr_commands.yml} | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) rename .github/{issue_commands.json => issue_and_pr_commands.json} (100%) rename .github/workflows/{issue_commands.yml => issue_and_pr_commands.yml} (78%) diff --git a/.github/issue_commands.json b/.github/issue_and_pr_commands.json similarity index 100% rename from .github/issue_commands.json rename to .github/issue_and_pr_commands.json diff --git a/.github/workflows/issue_commands.yml b/.github/workflows/issue_and_pr_commands.yml similarity index 78% rename from .github/workflows/issue_commands.yml rename to .github/workflows/issue_and_pr_commands.yml index 57a05f677cc..cefd3762110 100644 --- a/.github/workflows/issue_commands.yml +++ b/.github/workflows/issue_and_pr_commands.yml @@ -1,7 +1,9 @@ -name: Run commands when issues are labeled +name: Run commands when issues or PRs are labeled on: issues: types: [labeled] + pull_request: + types: [labeled] jobs: main: runs-on: ubuntu-latest @@ -18,4 +20,4 @@ jobs: uses: ./actions/commands with: token: ${{secrets.GH_BOT_ACCESS_TOKEN}} - configPath: issue_commands \ No newline at end of file + configPath: issue_and_pr_commands \ No newline at end of file From 1dd5a34ed789be248a0b256474e3697a05c2b222 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Tue, 1 Feb 2022 09:03:17 +0100 Subject: [PATCH 059/168] Document dashboards and alerts offered by the mixin (#925) * Document dashboards and alerts offered by the mixin Signed-off-by: Marco Pracucci * Fix typo Signed-off-by: Marco Pracucci --- .../operations/observability/_index.md | 17 +++ .../observability/dashboards-overview.md | 123 ++++++++++++++++++ .../install-dashboards-and-alerts.md | 62 +++++++++ .../operations/observability/requirements.md | 41 ++++++ operations/mimir-mixin/README.md | 18 --- operations/mimir-mixin/config.libsonnet | 2 + 6 files changed, 245 insertions(+), 18 deletions(-) create mode 100644 docs/sources/operations/observability/_index.md create mode 100644 docs/sources/operations/observability/dashboards-overview.md create mode 100644 docs/sources/operations/observability/install-dashboards-and-alerts.md create mode 100644 docs/sources/operations/observability/requirements.md delete mode 100644 operations/mimir-mixin/README.md diff --git a/docs/sources/operations/observability/_index.md b/docs/sources/operations/observability/_index.md new file mode 100644 index 00000000000..c5af7bcb35f --- /dev/null +++ b/docs/sources/operations/observability/_index.md @@ -0,0 +1,17 @@ ++++ +title = "Observability" ++++ + +# Observability + +Grafana Mimir exposes a `/metrics` endpoint returning Prometheus metrics. The endpoint is exposed on the Mimir HTTP server address / port which can be customized through `-server.http-listen-address` and `-server.http-listen-port` CLI flags or their respective YAML [config options]({{< relref "../../configuration/config-file-reference.md" >}}). + +## Dashboards and alerts + +Grafana Mimir is shipped with a comprehensive set of production-ready Grafana dashboards and alerts to monitor the state and health of a Mimir cluster. + +Dashboards both provide an high-level and in-depth view over every aspect of a Grafana Mimir cluster. You can take a look at all the available dashboards in [this overview]({{< relref "./dashboards-overview.md" >}}). + +Alerts allow you to monitor the health of a Mimir cluster. For each alert, we provide detailed [playbooks](https://github.com/grafana/mimir/blob/main/operations/mimir-mixin/docs/playbooks.md) to further investigate and fix the issue. + +The [installation instructions]({{< relref "install-dashboards-and-alerts.md" >}}) show available options to install Grafana Mimir dashboards and alerts. diff --git a/docs/sources/operations/observability/dashboards-overview.md b/docs/sources/operations/observability/dashboards-overview.md new file mode 100644 index 00000000000..4e0dc6b59a4 --- /dev/null +++ b/docs/sources/operations/observability/dashboards-overview.md @@ -0,0 +1,123 @@ ++++ +title = "Dashboards overview" +weight = 1 ++++ + +# Grafana Mimir dashboards overview + +Grafana Mimir provides the following production-ready dashboards. + +## Mimir / Writes + +This dashboard shows various health metrics for the write path. +It includes object storage metrics for operations triggered by the read path. +It is broken into sections for each service on the write path, +and organized by the order in which the write request flows. + +## Mimir / Writes Resources + +This dashboard shows CPU, memory, disk and other resources utilization metrics. +It is broken into sections for each service on the write path, +and organized by the order in which the write request flows. + +_Requires Kubernetes resources metrics._ + +## Mimir / Writes Networking + +This dashboard shows receive/transmit bandwidth, inflight requests and TCP connections. +It is broken into sections for each service on the write path, +and organized by the order in which the write request flows. + +_Requires Kubernetes networking metrics._ + +## Mimir / Reads + +This dashboard shows health metrics for the read path. +It includes object storage metrics for operations triggered by the read path. +It is broken into sections for each service on the read path, +and organized by the order in which the read request flows. + +## Mimir / Reads Resources + +This dashboard shows CPU, memory, disk and other resources utilization metrics. +It is broken into sections for each service on the read path, +and organized by the order in which the read request flows. + +_Requires Kubernetes resources metrics._ + +## Mimir / Reads Networking + +This dashboard shows receive/transmit bandwidth, inflight requests and TCP connections. +It is broken into sections for each service on the read path, +and organized by the order in which the read request flows. + +_Requires Kubernetes networking metrics._ + +## Mimir / Queries + +This dashboard shows a drill-down into queries execution. + +## Mimir / Compactor + +This dashboard shows health and activity metrics for the compactor. +It includes object storage metrics for operations triggered by the compactor. + +## Mimir / Compactor Resources + +This dashboard shows CPU, memory, disk and networking metrics for the compactor. + +_Requires Kubernetes resources metrics._ + +## Mimir / Ruler + +This dashboard shows health and activity metrics for the ruler. +It includes object storage metrics for operations triggered by the ruler. + +## Mimir / Alertmanager + +This dashboard shows health and activity metrics for the alermanager. +It includes object storage metrics for operations triggered by the ruler. + +## Mimir / Alertmanager Resources + +This dashboard shows CPU, memory, disk and networking metrics for the alertmanager. + +_Requires Kubernetes resources metrics._ + +## Mimir / Tenants + +This dashboard shows various metrics for the selected tenant/user. + +## Mimir / Top Tenants + +This dashboard shows the top tenants based on multiple selection criteria. + +## Mimir / Object Store + +This dashboard shows an overview on all the activity / operations on the object storage, +run by any Mimir service. + +## Mimir / Rollout progress + +This dashboard shows the progress of a rollout across Mimir cluster. +It also shows some key metrics to monitor during rollouts, like failures rate and latency. + +## Mimir / Slow Queries + +This dashboard shows details about the slowest queries for a given time range. +It also allows to filter by a specific tenant/user. +If [Grafana Tempo](https://grafana.com/oss/tempo/) tracing is enabled, it also displays a link to the trace of each query. + +_Requires Loki to fetch detailed query statistics from logs._ + +## Mimir / Config + +This dashboard shows details about the runtime config currently loaded by each Mimir instance/replica. + +## Mimir / Overrides + +This dashboard shows global limits and per-tenant overrides. + +## Mimir / Scaling + +This dashboards shows any services which are not scaled correctly. diff --git a/docs/sources/operations/observability/install-dashboards-and-alerts.md b/docs/sources/operations/observability/install-dashboards-and-alerts.md new file mode 100644 index 00000000000..acffbb8b7a1 --- /dev/null +++ b/docs/sources/operations/observability/install-dashboards-and-alerts.md @@ -0,0 +1,62 @@ ++++ +title = "Install dashboards and alerts" +weight = 2 ++++ + +# Install Grafana Mimir dashboards and alerts + +Grafana Mimir is shipped with a comprehensive set of production-ready Grafana [dashboards]({{< relref "./dashboards-overview.md" >}}) and alerts to monitor the state and health of a Mimir cluster. + +## Requirements + +- Grafana Mimir dashboards and alerts [require some labels]({{< relref "./requirements.md" >}}) to be set by Prometheus or Grafana Agent when scraping your Mimir cluster metrics +- Some dashboards require recording rules that you should install in your Prometheus + +## Install from package + +Grafana Mimir provides ready to use Grafana dashboards in the `.json` format and Prometheus alerts in the `.yaml` format, that you can directly import into your Grafana installation and Prometheus config. + +The packaged dashboards and alerts have been compiled from the sources using a default configuration and don't allow to customize the [required metrics label names]({{< relref "./requirements.md" >}}). If you need to customize the config please choose one of the other installation options. + +1. Download [dashboards](https://github.com/grafana/mimir/tree/main/operations/mimir-mixin-compiled/dashboards), [recording rules](https://github.com/grafana/mimir/blob/main/operations/mimir-mixin-compiled/rules.yaml) and [alerts](https://github.com/grafana/mimir/blob/main/operations/mimir-mixin-compiled/alerts.yaml) from Grafana Mimir repository +2. [Import dashboards in Grafana](https://grafana.com/docs/grafana/latest/dashboards/export-import/#import-dashboard) +3. Install recording rules and alerts in your Prometheus + +## Install from sources + +Grafana Mimir dashboards and alerts are built using [Jsonnet](https://jsonnet.org) language and you can compile them from sources. If you choose this option, you can change the configuration to match your deployment, like customizing the [required label names]({{< relref "./requirements.md" >}}). + +1. Checkout Mimir source code + ```bash + git clone https://github.com/grafana/mimir.git + ``` +2. Install dependencies + ```bash + GO111MODULE=on go get github.com/monitoring-mixins/mixtool/cmd/mixtool + GO111MODULE=on go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb + ``` +3. Review the mixin configuration at `operations/mimir-mixin/config.libsonnet` and apply your changes if required +4. Compile the mixin + ```bash + make build-mixin + ``` +5. Import the dashboards saved at `operations/mimir-mixin-compiled/dashboards/` in [Grafana](https://grafana.com/docs/grafana/latest/dashboards/export-import/#import-dashboard) +6. Install the recording rules saved at `operations/mimir-mixin-compiled/rules.yaml` in your Prometheus +7. Install the alerts saved at `operations/mimir-mixin-compiled/alerts.yaml` in your Prometheus + +## Install dashboards from Jsonnet mixin + +In case you're already using Jsonnet to define your infrastructure as a code, you can vendor the Grafana Mimir mixin directly into your infrastructure repository and configure it overriding the `_config` fields. Given the exact setup really depends on a case-by-case basis, the following instructions are not meant to be prescriptive but just show the main steps required to vendor the mixin. + +1. Install Grafana Mimir mixin + ```bash + jb install github.com/grafana/mimir/operations/mimir + ``` +2. Import and configure it + ```jsonnet + (import 'github.com/grafana/mimir/operations/mimir-mixin/mixin.libsonnet') + { + _config+:: { + // Override the Grafana Mimir mixin config here. + }, + } + ``` diff --git a/docs/sources/operations/observability/requirements.md b/docs/sources/operations/observability/requirements.md new file mode 100644 index 00000000000..50b4c8d6742 --- /dev/null +++ b/docs/sources/operations/observability/requirements.md @@ -0,0 +1,41 @@ ++++ +title = "Requirements" +weight = 100 ++++ + +# Grafana Mimir dashboards and alerts requirements + +Grafana Mimir dashboards and alerts require your Prometheus or Grafana Agent to be configured to add some labels to metrics scraped by Grafana Mimir. The following table shows the required labels and whether they can be customized when [compiling dashboards or alerts from sources]({{< relref "./install-dashboards-and-alerts.md" >}}). + +| Label name | Configurable | Description | +| :---------- | :----------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `cluster` | No | The Kubernetes cluster or datacenter where the Mimir cluster is running. | +| `namespace` | No | The Kubernetes namespace where the Mimir cluster is running. | +| `job` | Partially | The Mimir deployment in the format `/`. When running in single-binary mode the `` should be `mimir`, while when running in microservices mode the `` should be the name of the specific Mimir service (singular), like `distributor`, `ingester` or `store-gateway`. The label name can't be configured, while the regular expressions used to match deployments can be configured with the `job_names` field in the mixin config. | +| `pod` | Yes | The unique identifier of a Mimir replica (eg. Pod ID when running on Kubernetes). The label name can be configured with the `per_instance_label` field in the mixin config. | +| `instance` | Yes | The unique identifier of the node or machine where the Mimir replica is running (eg. the node when running on Kubernetes). The label name can be configured with the `per_node_label` field in the mixin config. | + +## Job selection + +A metric could be exposed by multiple Grafana Mimir services, or even different applications running in the same namespace. To provide you accurate dashboards and alerts, we're used to select a metric from specific jobs. A job is a combination of namespace and deployment, for example `/ingester`. + +Pre-compiled dashboards and alerts are shipped with a default configuration, while if you compile them from source you have the option to customize the regular expression used to select each Mimir service through the `job_names` field in the mixin config. + +### Default `job` selection in single-binary mode + +When running Grafana Mimir in single-binary mode and using the pre-compiled dashboards and alerts, the Grafana Mimir deployment should be named `mimir`. + +### Default `job` selection in microservices mode + +When running Grafana Mimir in microservices mode and using the pre-compiled dashboards and alerts, the Grafana Mimir deployments should be named according to the following table. + +| Mimir service | Expected deployment name | +| :-------------- | :----------------------- | +| Distributor | `distributor` | +| Ingester | `ingester` | +| Querier | `querier` | +| Ruler | `ruler` | +| Query-frontend | `query-frontend` | +| Query-scheduler | `query-frontend` | +| Store-gateway | `store-gateway` | +| Compactor | `compactor` | diff --git a/operations/mimir-mixin/README.md b/operations/mimir-mixin/README.md deleted file mode 100644 index 768fad9c5c5..00000000000 --- a/operations/mimir-mixin/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Monitoring for Mimir - -To generate the Grafana dashboards and Prometheus alerts for Mimir: - -## Usage - -```console -$ GO111MODULE=on go get github.com/monitoring-mixins/mixtool/cmd/mixtool -$ GO111MODULE=on go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb -$ git clone https://github.com/grafana/mimir.git -$ make build-mixin -``` - -This will leave all the alerts and dashboards in jsonnet/mimir-mixin/mimir-mixin.zip (or jsonnet/mimir-mixin/out). - -## Known Problems - -If you get an error like `cannot use cli.StringSliceFlag literal (type cli.StringSliceFlag) as type cli.Flag in slice literal` when installing [mixtool](https://github.com/monitoring-mixins/mixtool/issues/27), make sure you set `GO111MODULE=on` before `go get`. diff --git a/operations/mimir-mixin/config.libsonnet b/operations/mimir-mixin/config.libsonnet index 51574ce56ae..ca218465be2 100644 --- a/operations/mimir-mixin/config.libsonnet +++ b/operations/mimir-mixin/config.libsonnet @@ -15,6 +15,8 @@ // These are used by the dashboards and allow for the simultaneous display of // microservice and single binary Mimir clusters. + // Whenever you do any change here, please reflect it in the doc at: + // docs/sources/operations/observability/requirements.md job_names: { ingester: '(ingester.*|cortex|mimir)', // Match also custom and per-zone ingester deployments. distributor: '(distributor|cortex|mimir)', From 73b94ed2eb22438ec6373ea5ab3694f380d0aa87 Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Tue, 1 Feb 2022 09:04:34 +0100 Subject: [PATCH 060/168] Vendor latest dskit with ingester flag changes (#981) * Vendor latest dskit with ingester flag changes Signed-off-by: Dimitar Dimitrov * Update CHANGELOG.md Signed-off-by: Dimitar Dimitrov * Tidy up go mod * Clean white noise Signed-off-by: Dimitar Dimitrov --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 2 +- cmd/mimir/help.txt.tmpl | 2 +- .../configuration/config-file-reference.md | 2 +- go.mod | 2 +- go.sum | 4 ++-- .../grafana/dskit/ring/lifecycler.go | 21 ++++++++++++------- vendor/modules.txt | 2 +- 8 files changed, 21 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99dc7094816..340c267f1c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -243,6 +243,7 @@ * [CHANGE] Querier: removed `-querier.worker-match-max-concurrent` and `-querier.worker-parallelism` CLI flags (and their respective YAML config options). Mimir now behaves like if `-querier.worker-match-max-concurrent` is always enabled and you should configure the max concurrency per querier process using `-querier.max-concurrent` instead. #958 * [CHANGE] Distributor: change default value of `-distributor.instance-limits.max-inflight-push-requests` to `2000`. #964 * [CHANGE] Distributor: change default value of `-distributor.remote-timeout` from `2s` to `20s`. #970 +* [CHANGE] Ingester: change default value of `-ingester.final-sleep` from `30s` to `0s`. #981 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 439780a31de..dc490d5665f 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -956,7 +956,7 @@ Usage of ./cmd/mimir/mimir: -ingester.exemplars-update-period duration Period with which to update per-user max exemplars. (default 15s) -ingester.final-sleep duration - Duration to sleep for before exiting, to ensure metrics are scraped. (default 30s) + Duration to sleep for before exiting, to ensure metrics are scraped. -ingester.heartbeat-period duration Period at which to heartbeat to consul. 0 = disabled. (default 5s) -ingester.ignore-series-limit-for-metric-names string diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 7bff9ac015e..f58f77553a6 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -664,7 +664,7 @@ Usage of ./cmd/mimir/mimir: -ingester.client.grpc-max-send-msg-size int gRPC client max send message size (bytes). (default 16777216) -ingester.final-sleep duration - Duration to sleep for before exiting, to ensure metrics are scraped. (default 30s) + Duration to sleep for before exiting, to ensure metrics are scraped. -ingester.heartbeat-period duration Period at which to heartbeat to consul. 0 = disabled. (default 5s) -ingester.join-after duration diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index fd9f346be1c..786e08566b2 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -676,7 +676,7 @@ lifecycler: # Duration to sleep for before exiting, to ensure metrics are scraped. # CLI flag: -ingester.final-sleep - [final_sleep: | default = 30s] + [final_sleep: | default = 0s] # File path where tokens are stored. If empty, tokens are not stored at # shutdown and restored at startup. diff --git a/go.mod b/go.mod index 7e3417e41df..f617f2333b8 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.4 github.com/gorilla/mux v1.8.0 - github.com/grafana/dskit v0.0.0-20220131151558-555f434c1a2d + github.com/grafana/dskit v0.0.0-20220131162925-09047fe4cc11 github.com/grafana/e2e v0.1.0 github.com/hashicorp/golang-lru v0.5.4 github.com/json-iterator/go v1.1.12 diff --git a/go.sum b/go.sum index 3a767fc3e71..4424a9e521b 100644 --- a/go.sum +++ b/go.sum @@ -971,8 +971,8 @@ github.com/grafana-tools/sdk v0.0.0-20211220201350-966b3088eec9 h1:LQAhgcUPnzdjU github.com/grafana-tools/sdk v0.0.0-20211220201350-966b3088eec9/go.mod h1:AHHlOEv1+GGQ3ktHMlhuTUwo3zljV3QJbC0+8o2kn+4= github.com/grafana/dskit v0.0.0-20211021180445-3bd016e9d7f1/go.mod h1:uPG2nyK4CtgNDmWv7qyzYcdI+S90kHHRWvHnBtEMBXM= github.com/grafana/dskit v0.0.0-20220112093026-95274ccc858d/go.mod h1:M0/dlftwBvH7+hdNNpjMa/CUXD7gsew67mbkCuDlFXE= -github.com/grafana/dskit v0.0.0-20220131151558-555f434c1a2d h1:pTt0UWDr6RQ9oRPltpAl5oluO9wrjfFmWlaNOE465yA= -github.com/grafana/dskit v0.0.0-20220131151558-555f434c1a2d/go.mod h1:Q9WmQ9cVkrHx6g4KSl6TN+N3vEOkDZd9RtyXCHd5OPQ= +github.com/grafana/dskit v0.0.0-20220131162925-09047fe4cc11 h1:/vvoOHWR6aEkhqBf2+xSpMMlHdLFgLJFoQ+6HG0jmBY= +github.com/grafana/dskit v0.0.0-20220131162925-09047fe4cc11/go.mod h1:Q9WmQ9cVkrHx6g4KSl6TN+N3vEOkDZd9RtyXCHd5OPQ= github.com/grafana/e2e v0.1.0 h1:nThd0U0TjUqyOOupSb+qDd4BOdhqwhR/oYbjoqiMlZk= github.com/grafana/e2e v0.1.0/go.mod h1:+26VJWpczg2OU3D0537acnHSHzhJORpxOs6F+M27tZo= github.com/grafana/memberlist v0.2.5-0.20211201083710-c7bc8e9df94b/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= diff --git a/vendor/github.com/grafana/dskit/ring/lifecycler.go b/vendor/github.com/grafana/dskit/ring/lifecycler.go index e8d1655e7a9..1b2af3494c3 100644 --- a/vendor/github.com/grafana/dskit/ring/lifecycler.go +++ b/vendor/github.com/grafana/dskit/ring/lifecycler.go @@ -27,12 +27,15 @@ type LifecyclerConfig struct { RingConfig Config `yaml:"ring"` // Config for the ingester lifecycle control - NumTokens int `yaml:"num_tokens"` - HeartbeatPeriod time.Duration `yaml:"heartbeat_period"` - ObservePeriod time.Duration `yaml:"observe_period"` - JoinAfter time.Duration `yaml:"join_after"` - MinReadyDuration time.Duration `yaml:"min_ready_duration"` - InfNames []string `yaml:"interface_names"` + NumTokens int `yaml:"num_tokens"` + HeartbeatPeriod time.Duration `yaml:"heartbeat_period"` + ObservePeriod time.Duration `yaml:"observe_period"` + JoinAfter time.Duration `yaml:"join_after"` + MinReadyDuration time.Duration `yaml:"min_ready_duration"` + InfNames []string `yaml:"interface_names"` + + // FinalSleep's default value can be overridden by + // setting it before calling RegisterFlags or RegisterFlagsWithPrefix. FinalSleep time.Duration `yaml:"final_sleep"` TokensFilePath string `yaml:"tokens_file_path"` Zone string `yaml:"availability_zone"` @@ -48,12 +51,14 @@ type LifecyclerConfig struct { ListenPort int `yaml:"-"` } -// RegisterFlags adds the flags required to config this to the given FlagSet +// RegisterFlags adds the flags required to config this to the given FlagSet. +// The default values of some flags can be changed; see docs of LifecyclerConfig. func (cfg *LifecyclerConfig) RegisterFlags(f *flag.FlagSet) { cfg.RegisterFlagsWithPrefix("", f) } // RegisterFlagsWithPrefix adds the flags required to config this to the given FlagSet. +// The default values of some flags can be changed; see docs of LifecyclerConfig. func (cfg *LifecyclerConfig) RegisterFlagsWithPrefix(prefix string, f *flag.FlagSet) { cfg.RingConfig.RegisterFlagsWithPrefix(prefix, f) @@ -68,7 +73,7 @@ func (cfg *LifecyclerConfig) RegisterFlagsWithPrefix(prefix string, f *flag.Flag f.DurationVar(&cfg.JoinAfter, prefix+"join-after", 0*time.Second, "Period to wait for a claim from another member; will join automatically after this.") f.DurationVar(&cfg.ObservePeriod, prefix+"observe-period", 0*time.Second, "Observe tokens after generating to resolve collisions. Useful when using gossiping ring.") f.DurationVar(&cfg.MinReadyDuration, prefix+"min-ready-duration", 15*time.Second, "Minimum duration to wait after the internal readiness checks have passed but before succeeding the readiness endpoint. This is used to slowdown deployment controllers (eg. Kubernetes) after an instance is ready and before they proceed with a rolling update, to give the rest of the cluster instances enough time to receive ring updates.") - f.DurationVar(&cfg.FinalSleep, prefix+"final-sleep", 30*time.Second, "Duration to sleep for before exiting, to ensure metrics are scraped.") + f.DurationVar(&cfg.FinalSleep, prefix+"final-sleep", cfg.FinalSleep, "Duration to sleep for before exiting, to ensure metrics are scraped.") f.StringVar(&cfg.TokensFilePath, prefix+"tokens-file-path", "", "File path where tokens are stored. If empty, tokens are not stored at shutdown and restored at startup.") hostname, err := os.Hostname() diff --git a/vendor/modules.txt b/vendor/modules.txt index 1781d93c64e..85b7d6dd734 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -338,7 +338,7 @@ github.com/gosimple/slug # github.com/grafana-tools/sdk v0.0.0-20211220201350-966b3088eec9 ## explicit; go 1.13 github.com/grafana-tools/sdk -# github.com/grafana/dskit v0.0.0-20220131151558-555f434c1a2d +# github.com/grafana/dskit v0.0.0-20220131162925-09047fe4cc11 ## explicit; go 1.16 github.com/grafana/dskit/backoff github.com/grafana/dskit/concurrency From 78275bf5da70bb4917bcde362f7a1da13fab53d5 Mon Sep 17 00:00:00 2001 From: Patrick Oyarzun Date: Tue, 1 Feb 2022 03:14:25 -0500 Subject: [PATCH 061/168] Remove `-alertmanager.configs.auto-webhook-root` (#977) * Remove `-alertmanager.configs.auto-webhook-root` * Update config reference * Reference PR in CHANGELOG --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 2 -- cmd/mimir/help.txt.tmpl | 2 -- .../configuration/config-file-reference.md | 4 ---- pkg/alertmanager/multitenant.go | 23 ------------------- 5 files changed, 1 insertion(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 340c267f1c4..b766bd05127 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Mimir - main / unreleased +* [CHANGE] Remove `-alertmanager.configs.auto-webhook-root` #977 * [CHANGE] Removed deprecated limits for rejecting old samples #799 This removes the following flags: * `-validation.reject-old-samples` diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index dc490d5665f..5faf4b6782f 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -125,8 +125,6 @@ Usage of ./cmd/mimir/mimir: Comma-separated list of initial peers. -alertmanager.cluster.push-pull-interval duration The interval between gossip state syncs. Setting this interval lower (more frequent) will increase convergence speeds across larger clusters at the expense of increased bandwidth usage. (default 1m0s) - -alertmanager.configs.auto-webhook-root string - Root of URL to generate if config is http://internal.monitor -alertmanager.configs.fallback string Filename of fallback config to use if none specified for instance. -alertmanager.configs.poll-interval duration diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index f58f77553a6..7139d23ead3 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -109,8 +109,6 @@ Usage of ./cmd/mimir/mimir: Comma-separated list of initial peers. -alertmanager.cluster.push-pull-interval duration The interval between gossip state syncs. Setting this interval lower (more frequent) will increase convergence speeds across larger clusters at the expense of increased bandwidth usage. (default 1m0s) - -alertmanager.configs.auto-webhook-root string - Root of URL to generate if config is http://internal.monitor -alertmanager.configs.fallback string Filename of fallback config to use if none specified for instance. -alertmanager.configs.poll-interval duration diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 786e08566b2..aa39c5bc894 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -1630,10 +1630,6 @@ sharding_ring: # CLI flag: -alertmanager.configs.fallback [fallback_config_file: | default = ""] -# Root of URL to generate if config is http://internal.monitor -# CLI flag: -alertmanager.configs.auto-webhook-root -[auto_webhook_root: | default = ""] - cluster: # Listen address and port for the cluster. Not specifying this flag disables # high-availability mode. diff --git a/pkg/alertmanager/multitenant.go b/pkg/alertmanager/multitenant.go index 92c0b057cc9..6e4afd8f5a2 100644 --- a/pkg/alertmanager/multitenant.go +++ b/pkg/alertmanager/multitenant.go @@ -11,7 +11,6 @@ import ( "fmt" "io/ioutil" "net/http" - "net/url" "os" "path/filepath" "strings" @@ -47,10 +46,6 @@ import ( ) const ( - // If a config sets the webhook URL to this, it will be rewritten to - // a URL derived from Config.AutoWebhookRoot - autoWebhookURL = "http://internal.monitor" - // Reasons for (re)syncing alertmanager configurations from object storage. reasonPeriodic = "periodic" reasonInitial = "initial" @@ -82,7 +77,6 @@ type MultitenantAlertmanagerConfig struct { ShardingRing RingConfig `yaml:"sharding_ring"` FallbackConfigFile string `yaml:"fallback_config_file"` - AutoWebhookRoot string `yaml:"auto_webhook_root"` Cluster ClusterConfig `yaml:"cluster"` @@ -119,7 +113,6 @@ func (cfg *MultitenantAlertmanagerConfig) RegisterFlags(f *flag.FlagSet) { f.Var(&cfg.ExternalURL, "alertmanager.web.external-url", "The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself. If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Alertmanager.") f.StringVar(&cfg.FallbackConfigFile, "alertmanager.configs.fallback", "", "Filename of fallback config to use if none specified for instance.") - f.StringVar(&cfg.AutoWebhookRoot, "alertmanager.configs.auto-webhook-root", "", "Root of URL to generate if config is "+autoWebhookURL) f.DurationVar(&cfg.PollInterval, "alertmanager.configs.poll-interval", 15*time.Second, "How frequently to poll Alertmanager configs.") f.BoolVar(&cfg.EnableAPI, "experimental.alertmanager.enable-api", false, "Enable the experimental alertmanager config api.") @@ -890,22 +883,6 @@ func (am *MultitenantAlertmanager) setConfig(cfg alertspb.AlertConfigDesc) error return fmt.Errorf("no usable Alertmanager configuration for %v", cfg.User) } - // Transform webhook configs URLs to the per tenant monitor - if am.cfg.AutoWebhookRoot != "" { - for i, r := range userAmConfig.Receivers { - for j, w := range r.WebhookConfigs { - if w.URL.String() == autoWebhookURL { - u, err := url.Parse(am.cfg.AutoWebhookRoot + "/" + cfg.User + "/monitor") - if err != nil { - return err - } - - userAmConfig.Receivers[i].WebhookConfigs[j].URL = &amconfig.URL{URL: u} - } - } - } - } - // If no Alertmanager instance exists for this user yet, start one. if !hasExisting { level.Debug(am.logger).Log("msg", "initializing new per-tenant alertmanager", "user", cfg.User) From f672f9634701ded651492d256e41d80e05066fe2 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Tue, 1 Feb 2022 09:33:52 +0100 Subject: [PATCH 062/168] Refresh experimental features (#913) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 31 + Makefile | 1 + cmd/mimir/help-all.txt.tmpl | 22 +- cmd/mimir/help.txt.tmpl | 22 +- docs/sources/api/_index.md | 26 +- docs/sources/architecture.md | 2 +- docs/sources/blocks-storage/_index.md | 2 +- docs/sources/blocks-storage/compactor.md | 91 +-- docs/sources/blocks-storage/querier.md | 49 +- docs/sources/blocks-storage/store-gateway.md | 40 +- .../configuration/config-file-reference.md | 555 +++++++++--------- .../configuration/prometheus-frontend.md | 40 +- docs/sources/configuration/v1-guarantees.md | 68 +-- integration/configs.go | 2 +- integration/e2emimir/services.go | 12 +- ...est-disable-chunk-streaming-generated.yaml | 4 +- .../test-query-sharding-generated.yaml | 4 +- .../test-shuffle-sharding-generated.yaml | 4 +- .../test-storage-azure-generated.yaml | 4 +- .../test-storage-gcs-generated.yaml | 4 +- .../test-storage-s3-generated.yaml | 4 +- operations/mimir/alertmanager.libsonnet | 2 +- operations/mimir/ruler.libsonnet | 2 +- pkg/alertmanager/multitenant.go | 5 +- pkg/api/api.go | 2 +- pkg/distributor/distributor.go | 5 - pkg/ingester/ingester.go | 13 +- .../tenantfederation/tenant_federation.go | 4 +- pkg/ruler/ruler.go | 2 +- pkg/storage/tsdb/config.go | 11 +- pkg/util/validation/limits.go | 4 +- tools/doc-generator/parser.go | 127 ++-- tools/doc-generator/writer.go | 2 +- 33 files changed, 612 insertions(+), 554 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b766bd05127..8c4990b341c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -245,6 +245,8 @@ * [CHANGE] Distributor: change default value of `-distributor.instance-limits.max-inflight-push-requests` to `2000`. #964 * [CHANGE] Distributor: change default value of `-distributor.remote-timeout` from `2s` to `20s`. #970 * [CHANGE] Ingester: change default value of `-ingester.final-sleep` from `30s` to `0s`. #981 +* [CHANGE] Ruler: `-experimental.ruler.enable-api` flag has been renamed to `-ruler.enable-api` and is now stable. #913 +* [CHANGE] Alertmanager: `-experimental.alertmanager.enable-api` flag has been renamed to `-alertmanager.enable-api` and is now stable. #913 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: @@ -294,6 +296,35 @@ * [FEATURE] Mimir: Added "Activity tracker" feature which can log ongoing activities from previous Mimir run in case of the crash. It is enabled by default and controlled by the `-activity-tracker.filepath` flag. It can be disabled by setting this path to an empty string. Currently, the Store-gateway, Ruler, Querier, and Query-frontend components uses this feature. #631 #782 #822 * [FEATURE] Mimir: Divide configuration parameters into categories "basic", "advanced", and "experimental". Only flags in the basic category are shown when invoking `-help`, whereas `-help-all` will include flags in all categories (basic, advanced, experimental). #840 * [FEATURE] Store-gateway: Added `/store-gateway/tenants` and `/store-gateway/tenant/{tenant}/blocks` endpoints that provide functionality that was provided by `tools/listblocks`. #911 +* [FEATURE] The following features have been moved from experimental to stable: #913 + * Alertmanager API + * Alertmanager receiver firewall + * Alertmanager sharding + * Azure blob storage support + * Blocks storage bucket index + * Disable the ring health check in the readiness endpoint (`-ingester.readiness-check-ring-health=false`) + * Distributor: do not extend writes on unhealthy ingesters + * Do not unregister ingesters from ring on shutdown (`-ingester.unregister-on-shutdown=false`) + * HA Tracker: cleanup of old replicas from KV Store + * Instance limits in ingester and distributor + * OpenStack Swift storage support + * Query-frontend: query stats tracking + * Query-scheduler + * Ruler API + * S3 Server Side Encryption (SSE) using KMS + * TLS configuration for gRPC, HTTP and etcd clients + * Zone-aware replication + * `/labels` API using matchers (`-querier.query-label-names-with-matchers-enabled`) + * The following querier limits: + * `-querier.max-fetched-chunks-per-query` + * `-querier.max-fetched-chunk-bytes-per-query` + * `-querier.max-fetched-series-per-query` + * The following alertmanager limits: + * Notification rate (`-alertmanager.notification-rate-limit` and `-alertmanager.notification-rate-limit-per-integration`) + * Dispatcher groups (`-alertmanager.max-dispatcher-aggregation-groups`) + * User config size (`-alertmanager.max-config-size-bytes`) + * Templates count in user config (`-alertmanager.max-templates-count`) + * Max template size (`-alertmanager.max-template-size-bytes`) * [ENHANCEMENT] Query-frontend: added `cortex_query_frontend_workers_enqueued_requests_total` metric to track the number of requests enqueued in each query-scheduler. #384 * [ENHANCEMENT] Add a flag (`--proxy.compare-use-relative-error`) in the query-tee to compare floating point values using relative error. #208 * [ENHANCEMENT] Add a flag (`--proxy.compare-skip-recent-samples`) in the query-tee to skip comparing recent samples. By default samples not older than 1 minute are skipped. #234 diff --git a/Makefile b/Makefile index e1400314bdd..d01bf7dde05 100644 --- a/Makefile +++ b/Makefile @@ -317,6 +317,7 @@ doc: clean-doc go run ./tools/doc-generator ./docs/sources/blocks-storage/store-gateway.template > ./docs/sources/blocks-storage/store-gateway.md go run ./tools/doc-generator ./docs/sources/blocks-storage/querier.template > ./docs/sources/blocks-storage/querier.md go run ./tools/doc-generator ./docs/sources/guides/encryption-at-rest.template > ./docs/sources/guides/encryption-at-rest.md + embedmd -w docs/sources/configuration/prometheus-frontend.md embedmd -w docs/sources/operations/requests-mirroring-to-secondary-cluster.md embedmd -w docs/sources/guides/overrides-exporter.md embedmd -w operations/mimir/README.md diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 5faf4b6782f..abd0d14260f 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -129,6 +129,8 @@ Usage of ./cmd/mimir/mimir: Filename of fallback config to use if none specified for instance. -alertmanager.configs.poll-interval duration How frequently to poll Alertmanager configs. (default 15s) + -alertmanager.enable-api + Enable the alertmanager config api. -alertmanager.max-alerts-count int Maximum number of alerts that a single user can have. Inserting more alerts will fail with a log message and metric increment. 0 = no limit. -alertmanager.max-alerts-size-bytes int @@ -464,7 +466,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.tsdb.flush-blocks-on-shutdown True to flush blocks to storage on shutdown. If false, incomplete blocks will be reused after restart. -blocks-storage.tsdb.head-chunks-end-time-variance float - How much variance (as percentage between 0 and 1) should be applied to the chunk end time, to spread chunks writing across time. Doesn't apply to the last chunk of the chunk range. 0 means no variance. + [experimental] How much variance (as percentage between 0 and 1) should be applied to the chunk end time, to spread chunks writing across time. Doesn't apply to the last chunk of the chunk range. 0 means no variance. -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes int The write buffer size used by the head chunks mapper. Lower values reduce memory utilisation on clusters with a large number of tenants at the cost of increased disk I/O operations. (default 4194304) -blocks-storage.tsdb.head-chunks-write-queue-size int @@ -797,10 +799,6 @@ Usage of ./cmd/mimir/mimir: Override the expected name on the server certificate. -etcd.username string Etcd username. - -experimental.alertmanager.enable-api - Enable the experimental alertmanager config api. - -experimental.ruler.enable-api - Enable the ruler api -flusher.exit-after-flush Stop after flush has finished. If false, process will keep running, doing nothing. (default true) -frontend.align-querier-with-step @@ -952,7 +950,7 @@ Usage of ./cmd/mimir/mimir: -ingester.client.tls-server-name string Override the expected name on the server certificate. -ingester.exemplars-update-period duration - Period with which to update per-user max exemplars. (default 15s) + [experimental] Period with which to update per-user max exemplars. (default 15s) -ingester.final-sleep duration Duration to sleep for before exiting, to ensure metrics are scraped. -ingester.heartbeat-period duration @@ -962,11 +960,11 @@ Usage of ./cmd/mimir/mimir: -ingester.instance-limits.max-inflight-push-requests int Max inflight push requests that this ingester can handle (across all tenants). Additional requests will be rejected. 0 = unlimited. (default 30000) -ingester.instance-limits.max-ingestion-rate float - Max ingestion rate (samples/sec) that ingester will accept. This limit is per-ingester, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. This limit only works when using blocks engine. 0 = unlimited. + Max ingestion rate (samples/sec) that ingester will accept. This limit is per-ingester, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited. -ingester.instance-limits.max-series int - Max series that this ingester can hold (across all tenants). Requests to create additional series will be rejected. This limit only works when using blocks engine. 0 = unlimited. + Max series that this ingester can hold (across all tenants). Requests to create additional series will be rejected. 0 = unlimited. -ingester.instance-limits.max-tenants int - Max users that this ingester can hold. Requests from additional users will be rejected. This limit only works when using blocks engine. 0 = unlimited. + Max users (also referred to as 'tenants') that this ingester can hold. Requests from additional users will be rejected. 0 = unlimited. -ingester.join-after duration Period to wait for a claim from another member; will join automatically after this. -ingester.lifecycler.ID string @@ -978,7 +976,7 @@ Usage of ./cmd/mimir/mimir: -ingester.lifecycler.port int port to advertise in consul (defaults to server.grpc-listen-port). -ingester.max-global-exemplars-per-user int - The maximum number of exemplars in memory, across the cluster. 0 to disable exemplars ingestion. + [experimental] The maximum number of exemplars in memory, across the cluster. 0 to disable exemplars ingestion. -ingester.max-global-metadata-per-metric int The maximum number of metadata per metric, across the cluster. 0 to disable. -ingester.max-global-metadata-per-user int @@ -1377,6 +1375,8 @@ Usage of ./cmd/mimir/mimir: Override the expected name on the server certificate. -ruler.disabled-tenants value Comma separated list of tenants whose rules this ruler cannot evaluate. If specified, a ruler that would normally pick the specified tenant(s) for processing will ignore them instead. Subject to sharding. + -ruler.enable-api + Enable the ruler api -ruler.enabled-tenants value Comma separated list of tenants whose rules this ruler can evaluate. If specified, only these tenants will be handled by ruler, otherwise this ruler can process rules from all tenants. Subject to sharding. -ruler.evaluation-delay-duration value @@ -1630,7 +1630,7 @@ Usage of ./cmd/mimir/mimir: -target value Comma-separated list of modules to load. The alias 'all' can be used in the list to load a number of core modules and will enable single-binary mode. Use '-modules' command line flag to get a list of available modules, and to see which modules are included in 'all'. (default all) -tenant-federation.enabled - If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header (experimental). + [experimental] If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header. -validation.create-grace-period value Duration which table will be created/deleted before/after it's needed; we won't accept sample from before this time. (default 10m) -validation.enforce-metadata-metric-name diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 7139d23ead3..8c2bce53a1e 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -113,6 +113,8 @@ Usage of ./cmd/mimir/mimir: Filename of fallback config to use if none specified for instance. -alertmanager.configs.poll-interval duration How frequently to poll Alertmanager configs. (default 15s) + -alertmanager.enable-api + Enable the alertmanager config api. -alertmanager.max-alerts-count int Maximum number of alerts that a single user can have. Inserting more alerts will fail with a log message and metric increment. 0 = no limit. -alertmanager.max-alerts-size-bytes int @@ -205,10 +207,6 @@ Usage of ./cmd/mimir/mimir: The maximum allowed age of a bucket index (last updated) before queries start failing because the bucket index is too old. The bucket index is periodically updated by the compactor, while this check is enforced in the querier (at query time). (default 1h0m0s) -blocks-storage.bucket-store.bucket-index.update-on-error-interval duration How frequently a bucket index, which previously failed to load, should be tried to load again. This option is used only by querier. (default 1m0s) - -blocks-storage.bucket-store.chunk-pool-max-bucket-size-bytes int - Size - in bytes - of the largest chunks pool bucket. (default 50000000) - -blocks-storage.bucket-store.chunk-pool-min-bucket-size-bytes int - Size - in bytes - of the smallest chunks pool bucket. (default 16000) -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items int Maximum number of object attribute items to keep in a first level in-memory LRU cache. Metadata will be stored and fetched in-memory before hitting the cache backend. 0 to disable the in-memory cache. -blocks-storage.bucket-store.chunks-cache.attributes-ttl duration @@ -313,10 +311,6 @@ Usage of ./cmd/mimir/mimir: How long to cache list of blocks for each tenant. (default 5m0s) -blocks-storage.bucket-store.metadata-cache.tenants-list-ttl duration How long to cache list of tenants in the bucket. (default 15m0s) - -blocks-storage.bucket-store.partitioner-max-gap-bytes uint - Max size - in bytes - of a gap for which the partitioner aggregates together two bucket GET object requests. (default 524288) - -blocks-storage.bucket-store.posting-offsets-in-mem-sampling int - Controls what is the ratio of postings offsets that the store will hold in memory. (default 32) -blocks-storage.bucket-store.series-hash-cache-max-size-bytes uint Max size - in bytes - of the in-memory series hash cache. The cache is shared across all tenants and it's used only when query sharding is enabled. (default 1073741824) -blocks-storage.bucket-store.sync-dir string @@ -407,8 +401,6 @@ Usage of ./cmd/mimir/mimir: Local directory to store TSDBs in the ingesters. (default "tsdb") -blocks-storage.tsdb.flush-blocks-on-shutdown True to flush blocks to storage on shutdown. If false, incomplete blocks will be reused after restart. - -blocks-storage.tsdb.head-chunks-end-time-variance float - How much variance (as percentage between 0 and 1) should be applied to the chunk end time, to spread chunks writing across time. Doesn't apply to the last chunk of the chunk range. 0 means no variance. -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes int The write buffer size used by the head chunks mapper. Lower values reduce memory utilisation on clusters with a large number of tenants at the cost of increased disk I/O operations. (default 4194304) -blocks-storage.tsdb.head-chunks-write-queue-size int @@ -553,10 +545,6 @@ Usage of ./cmd/mimir/mimir: Etcd password. -etcd.username string Etcd username. - -experimental.alertmanager.enable-api - Enable the experimental alertmanager config api. - -experimental.ruler.enable-api - Enable the ruler api -frontend.align-querier-with-step Mutate incoming queries to align their start and end with their step. -frontend.cache-results @@ -675,8 +663,6 @@ Usage of ./cmd/mimir/mimir: Name of network interface to read address from. (default [eth0 en0]) -ingester.lifecycler.port int port to advertise in consul (defaults to server.grpc-listen-port). - -ingester.max-global-exemplars-per-user int - The maximum number of exemplars in memory, across the cluster. 0 to disable exemplars ingestion. -ingester.max-global-metadata-per-metric int The maximum number of metadata per metric, across the cluster. 0 to disable. -ingester.max-global-metadata-per-user int @@ -979,6 +965,8 @@ Usage of ./cmd/mimir/mimir: gRPC client max send message size (bytes). (default 16777216) -ruler.disabled-tenants value Comma separated list of tenants whose rules this ruler cannot evaluate. If specified, a ruler that would normally pick the specified tenant(s) for processing will ignore them instead. Subject to sharding. + -ruler.enable-api + Enable the ruler api -ruler.enabled-tenants value Comma separated list of tenants whose rules this ruler can evaluate. If specified, only these tenants will be handled by ruler, otherwise this ruler can process rules from all tenants. Subject to sharding. -ruler.evaluation-delay-duration value @@ -1159,8 +1147,6 @@ Usage of ./cmd/mimir/mimir: Limit the query time range (end - start time). This limit is enforced in the query-frontend (on the received query), in the querier (on the query possibly split by the query-frontend) and ruler. 0 to disable. -target value Comma-separated list of modules to load. The alias 'all' can be used in the list to load a number of core modules and will enable single-binary mode. Use '-modules' command line flag to get a list of available modules, and to see which modules are included in 'all'. (default all) - -tenant-federation.enabled - If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header (experimental). -validation.create-grace-period value Duration which table will be created/deleted before/after it's needed; we won't accept sample from before this time. (default 10m) -validation.enforce-metadata-metric-name diff --git a/docs/sources/api/_index.md b/docs/sources/api/_index.md index e3afdafcd51..8bf21298b64 100644 --- a/docs/sources/api/_index.md +++ b/docs/sources/api/_index.md @@ -548,7 +548,7 @@ Prometheus-compatible rules endpoint to list alerting and recording rules that a _For more information, please check out the Prometheus [rules](https://prometheus.io/docs/prometheus/latest/querying/api/#rules) documentation._ -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.ruler.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-ruler.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ @@ -565,7 +565,7 @@ Prometheus-compatible rules endpoint to list of all active alerts. _For more information, please check out the Prometheus [alerts](https://prometheus.io/docs/prometheus/latest/querying/api/#alerts) documentation._ -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.ruler.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-ruler.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ @@ -580,7 +580,7 @@ GET /rules List all rules configured for the authenticated tenant. This endpoint returns a YAML dictionary with all the rule groups for each namespace and `200` status code on success. -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.ruler.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-ruler.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ @@ -645,7 +645,7 @@ GET /rules/{namespace} Returns the rule groups defined for a given namespace. -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.ruler.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-ruler.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ @@ -679,7 +679,7 @@ GET /rules/{namespace}/{groupName} Returns the rule group matching the request namespace and group name. -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.ruler.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-ruler.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ @@ -695,7 +695,7 @@ POST /rules/{namespace} Creates or updates a rule group. This endpoint expects a request with `Content-Type: application/yaml` header and the rules **YAML** definition in the request body, and returns `202` on success. -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.ruler.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-ruler.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ @@ -764,7 +764,7 @@ DELETE /rules/{namespace}/{groupName} Deletes a rule group by namespace and group name. This endpoints returns `202` on success. -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.ruler.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-ruler.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ @@ -779,7 +779,7 @@ DELETE /rules/{namespace} Deletes all the rule groups in a namespace (including the namespace itself). This endpoint returns `202` on success. -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.ruler.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-ruler.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ @@ -791,7 +791,7 @@ POST /ruler/delete_tenant_config This deletes all rule groups for tenant, and returns `200` on success. Calling endpoint when no rule groups exist for user returns `200`. Authentication is only to identify the tenant. -This is intended as internal API, and not to be exposed to users. This endpoint is enabled regardless of whether `-experimental.ruler.enable-api` is enabled or not. +This is intended as internal API, and not to be exposed to users. This endpoint is enabled regardless of whether `-ruler.enable-api` is enabled or not. _Requires [authentication](#authentication)._ @@ -844,7 +844,7 @@ POST /multitenant_alertmanager/delete_tenant_config ``` This endpoint deletes configuration for a tenant identified by `X-Scope-OrgID` header. -It is internal, available even if Alertmanager API is not enabled by using `-experimental.alertmanager.enable-api`. +It is internal, available even if Alertmanager API is not enabled by using `-alertmanager.enable-api`. The endpoint returns a status code of `200` if the user's configuration has been deleted, or it didn't exist in the first place. _Requires [authentication](#authentication)._ @@ -859,7 +859,7 @@ Get the current Alertmanager configuration for the authenticated tenant, reading This endpoint doesn't accept any URL query parameter and returns `200` on success. -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.alertmanager.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-alertmanager.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ @@ -873,7 +873,7 @@ Stores or updates the Alertmanager configuration for the authenticated tenant. T This endpoint expects the Alertmanager **YAML** configuration in the request body and returns `201` on success. -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.alertmanager.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-alertmanager.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ @@ -911,7 +911,7 @@ Deletes the Alertmanager configuration for the authenticated tenant. This endpoint doesn't accept any URL query parameter and returns `200` on success. -_This experimental endpoint is disabled by default and can be enabled via the `-experimental.alertmanager.enable-api` CLI flag (or its respective YAML config option)._ +_This endpoint is disabled by default and can be enabled via the `-alertmanager.enable-api` CLI flag (or its respective YAML config option)._ _Requires [authentication](#authentication)._ diff --git a/docs/sources/architecture.md b/docs/sources/architecture.md index 2903af8b365..b28d20b0774 100644 --- a/docs/sources/architecture.md +++ b/docs/sources/architecture.md @@ -28,7 +28,7 @@ Mimir requires an object store for the block files, which can be: - [Amazon S3](https://aws.amazon.com/s3) - [Google Cloud Storage](https://cloud.google.com/storage/) - [Microsoft Azure Storage](https://azure.microsoft.com/en-us/services/storage/) -- [OpenStack Swift](https://wiki.openstack.org/wiki/Swift) (experimental) +- [OpenStack Swift](https://wiki.openstack.org/wiki/Swift) - [Local Filesystem](https://thanos.io/storage.md/#filesystem) (single node only) For more information, see [Blocks storage](./blocks-storage/_index.md). diff --git a/docs/sources/blocks-storage/_index.md b/docs/sources/blocks-storage/_index.md index a183d223193..e99d6fdfd10 100644 --- a/docs/sources/blocks-storage/_index.md +++ b/docs/sources/blocks-storage/_index.md @@ -12,7 +12,7 @@ The supported backends for the blocks storage are: - [Amazon S3](https://aws.amazon.com/s3) - [Google Cloud Storage](https://cloud.google.com/storage/) - [Microsoft Azure Storage](https://azure.microsoft.com/en-us/services/storage/) -- [OpenStack Swift](https://wiki.openstack.org/wiki/Swift) (experimental) +- [OpenStack Swift](https://wiki.openstack.org/wiki/Swift) - [Local Filesystem](https://thanos.io/storage.md/#filesystem) (single node only) _Internally, some components are based on [Thanos](https://thanos.io), but no Thanos knowledge is required in order to run it._ diff --git a/docs/sources/blocks-storage/compactor.md b/docs/sources/blocks-storage/compactor.md index f0a4d66c9b1..4b9870ae300 100644 --- a/docs/sources/blocks-storage/compactor.md +++ b/docs/sources/blocks-storage/compactor.md @@ -140,23 +140,23 @@ The `compactor_config` configures the compactor service. ```yaml compactor: - # List of compaction time ranges. + # [advanced] List of compaction time ranges. # CLI flag: -compactor.block-ranges [block_ranges: | default = 2h0m0s,12h0m0s,24h0m0s] - # Number of Go routines to use when downloading blocks for compaction and - # uploading resulting blocks. + # [advanced] Number of Go routines to use when downloading blocks for + # compaction and uploading resulting blocks. # CLI flag: -compactor.block-sync-concurrency [block_sync_concurrency: | default = 8] - # Number of Go routines to use when syncing block meta files from the long - # term storage. + # [advanced] Number of Go routines to use when syncing block meta files from + # the long term storage. # CLI flag: -compactor.meta-sync-concurrency [meta_sync_concurrency: | default = 20] - # Minimum age of fresh (non-compacted) blocks before they are being processed. - # Malformed blocks older than the maximum of consistency-delay and 48h0m0s - # will be removed. + # [advanced] Minimum age of fresh (non-compacted) blocks before they are being + # processed. Malformed blocks older than the maximum of consistency-delay and + # 48h0m0s will be removed. # CLI flag: -compactor.consistency-delay [consistency_delay: | default = 0s] @@ -164,72 +164,75 @@ compactor: # CLI flag: -compactor.data-dir [data_dir: | default = "./data"] - # The frequency at which the compaction runs + # [advanced] The frequency at which the compaction runs # CLI flag: -compactor.compaction-interval [compaction_interval: | default = 1h] - # How many times to retry a failed compaction within a single compaction run. + # [advanced] How many times to retry a failed compaction within a single + # compaction run. # CLI flag: -compactor.compaction-retries [compaction_retries: | default = 3] - # Max number of concurrent compactions running. + # [advanced] Max number of concurrent compactions running. # CLI flag: -compactor.compaction-concurrency [compaction_concurrency: | default = 1] - # How frequently compactor should run blocks cleanup and maintenance, as well - # as update the bucket index. + # [advanced] How frequently compactor should run blocks cleanup and + # maintenance, as well as update the bucket index. # CLI flag: -compactor.cleanup-interval [cleanup_interval: | default = 15m] - # Max number of tenants for which blocks cleanup and maintenance should run - # concurrently. + # [advanced] Max number of tenants for which blocks cleanup and maintenance + # should run concurrently. # CLI flag: -compactor.cleanup-concurrency [cleanup_concurrency: | default = 20] - # Time before a block marked for deletion is deleted from bucket. If not 0, - # blocks will be marked for deletion and compactor component will permanently - # delete blocks marked for deletion from the bucket. If 0, blocks will be - # deleted straight away. Note that deleting blocks immediately can cause query - # failures. + # [advanced] Time before a block marked for deletion is deleted from bucket. + # If not 0, blocks will be marked for deletion and compactor component will + # permanently delete blocks marked for deletion from the bucket. If 0, blocks + # will be deleted straight away. Note that deleting blocks immediately can + # cause query failures. # CLI flag: -compactor.deletion-delay [deletion_delay: | default = 12h] - # For tenants marked for deletion, this is time between deleting of last - # block, and doing final cleanup (marker files, debug files) of the tenant. + # [advanced] For tenants marked for deletion, this is time between deleting of + # last block, and doing final cleanup (marker files, debug files) of the + # tenant. # CLI flag: -compactor.tenant-cleanup-delay [tenant_cleanup_delay: | default = 6h] - # Max time for starting compactions for a single tenant. After this time no - # new compactions for the tenant are started before next compaction cycle. - # This can help in multi-tenant environments to avoid single tenant using all - # compaction time, but also in single-tenant environments to force new - # discovery of blocks more often. 0 = disabled. + # [advanced] Max time for starting compactions for a single tenant. After this + # time no new compactions for the tenant are started before next compaction + # cycle. This can help in multi-tenant environments to avoid single tenant + # using all compaction time, but also in single-tenant environments to force + # new discovery of blocks more often. 0 = disabled. # CLI flag: -compactor.max-compaction-time [max_compaction_time: | default = 0s] - # Number of goroutines opening blocks before compaction. + # [advanced] Number of goroutines opening blocks before compaction. # CLI flag: -compactor.max-opening-blocks-concurrency [max_opening_blocks_concurrency: | default = 1] - # Max number of blocks that can be closed concurrently during split + # [advanced] Max number of blocks that can be closed concurrently during split # compaction. Note that closing of newly compacted block uses a lot of memory # for writing index. # CLI flag: -compactor.max-closing-blocks-concurrency [max_closing_blocks_concurrency: | default = 1] - # Number of symbols flushers used when doing split compaction. + # [advanced] Number of symbols flushers used when doing split compaction. # CLI flag: -compactor.symbols-flushers-concurrency [symbols_flushers_concurrency: | default = 1] - # Comma separated list of tenants that can be compacted. If specified, only - # these tenants will be compacted by compactor, otherwise all tenants can be - # compacted. Subject to sharding. + # [advanced] Comma separated list of tenants that can be compacted. If + # specified, only these tenants will be compacted by compactor, otherwise all + # tenants can be compacted. Subject to sharding. # CLI flag: -compactor.enabled-tenants [enabled_tenants: | default = ""] - # Comma separated list of tenants that cannot be compacted by this compactor. - # If specified, and compactor would normally pick given tenant for compaction - # (via -compactor.enabled-tenants or sharding), it will be ignored instead. + # [advanced] Comma separated list of tenants that cannot be compacted by this + # compactor. If specified, and compactor would normally pick given tenant for + # compaction (via -compactor.enabled-tenants or sharding), it will be ignored + # instead. # CLI flag: -compactor.disabled-tenants [disabled_tenants: | default = ""] @@ -240,7 +243,7 @@ compactor: # CLI flag: -compactor.ring.store [store: | default = "memberlist"] - # The prefix for the keys in the store. Should end with a /. + # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -compactor.ring.prefix [prefix: | default = "collectors/"] @@ -253,19 +256,19 @@ compactor: [etcd: ] multi: - # Primary backend storage used by multi-client. + # [advanced] Primary backend storage used by multi-client. # CLI flag: -compactor.ring.multi.primary [primary: | default = ""] - # Secondary backend storage used by multi-client. + # [advanced] Secondary backend storage used by multi-client. # CLI flag: -compactor.ring.multi.secondary [secondary: | default = ""] - # Mirror writes to secondary store. + # [advanced] Mirror writes to secondary store. # CLI flag: -compactor.ring.multi.mirror-enabled [mirror_enabled: | default = false] - # Timeout for storing value to secondary store. + # [advanced] Timeout for storing value to secondary store. # CLI flag: -compactor.ring.multi.mirror-timeout [mirror_timeout: | default = 2s] @@ -295,9 +298,9 @@ compactor: # CLI flag: -compactor.ring.wait-active-instance-timeout [wait_active_instance_timeout: | default = 10m] - # The sorting to use when deciding which compaction jobs should run first for - # a given tenant. Supported values are: smallest-range-oldest-blocks-first, - # newest-blocks-first. + # [advanced] The sorting to use when deciding which compaction jobs should run + # first for a given tenant. Supported values are: + # smallest-range-oldest-blocks-first, newest-blocks-first. # CLI flag: -compactor.compaction-jobs-order [compaction_jobs_order: | default = "smallest-range-oldest-blocks-first"] ``` diff --git a/docs/sources/blocks-storage/querier.md b/docs/sources/blocks-storage/querier.md index 1fd3afef35b..b735dd2bcb7 100644 --- a/docs/sources/blocks-storage/querier.md +++ b/docs/sources/blocks-storage/querier.md @@ -137,30 +137,31 @@ querier: [store_gateway_addresses: | default = ""] store_gateway_client: - # Enable TLS for gRPC client connecting to store-gateway. + # [advanced] Enable TLS for gRPC client connecting to store-gateway. # CLI flag: -querier.store-gateway-client.tls-enabled [tls_enabled: | default = false] - # Path to the client certificate file, which will be used for authenticating - # with the server. Also requires the key path to be configured. + # [advanced] Path to the client certificate file, which will be used for + # authenticating with the server. Also requires the key path to be + # configured. # CLI flag: -querier.store-gateway-client.tls-cert-path [tls_cert_path: | default = ""] - # Path to the key file for the client certificate. Also requires the client - # certificate to be configured. + # [advanced] Path to the key file for the client certificate. Also requires + # the client certificate to be configured. # CLI flag: -querier.store-gateway-client.tls-key-path [tls_key_path: | default = ""] - # Path to the CA certificates file to validate server certificate against. - # If not set, the host's root CA certificates are used. + # [advanced] Path to the CA certificates file to validate server certificate + # against. If not set, the host's root CA certificates are used. # CLI flag: -querier.store-gateway-client.tls-ca-path [tls_ca_path: | default = ""] - # Override the expected name on the server certificate. + # [advanced] Override the expected name on the server certificate. # CLI flag: -querier.store-gateway-client.tls-server-name [tls_server_name: | default = ""] - # Skip validating server certificate. + # [advanced] Skip validating server certificate. # CLI flag: -querier.store-gateway-client.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] @@ -260,12 +261,12 @@ blocks_storage: # CLI flag: -blocks-storage.s3.http.response-header-timeout [response_header_timeout: | default = 2m] - # If the client connects to S3 via HTTPS and this option is enabled, the - # client will accept any certificate and hostname. + # [advanced] If the client connects to S3 via HTTPS and this option is + # enabled, the client will accept any certificate and hostname. # CLI flag: -blocks-storage.s3.http.insecure-skip-verify [insecure_skip_verify: | default = false] - # Maximum time to wait for a TLS handshake. 0 means no limit. + # [advanced] Maximum time to wait for a TLS handshake. 0 means no limit. # CLI flag: -blocks-storage.s3.tls-handshake-timeout [tls_handshake_timeout: | default = 10s] @@ -614,6 +615,14 @@ blocks_storage: # CLI flag: -blocks-storage.bucket-store.max-chunk-pool-bytes [max_chunk_pool_bytes: | default = 2147483648] + # [advanced] Size - in bytes - of the smallest chunks pool bucket. + # CLI flag: -blocks-storage.bucket-store.chunk-pool-min-bucket-size-bytes + [chunk_pool_min_bucket_size_bytes: | default = 16000] + + # [advanced] Size - in bytes - of the largest chunks pool bucket. + # CLI flag: -blocks-storage.bucket-store.chunk-pool-max-bucket-size-bytes + [chunk_pool_max_bucket_size_bytes: | default = 50000000] + # Max size - in bytes - of the in-memory series hash cache. The cache is # shared across all tenants and it's used only when query sharding is # enabled. @@ -631,6 +640,16 @@ blocks_storage: # CLI flag: -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout [index_header_lazy_loading_idle_timeout: | default = 1h] + # [advanced] Max size - in bytes - of a gap for which the partitioner + # aggregates together two bucket GET object requests. + # CLI flag: -blocks-storage.bucket-store.partitioner-max-gap-bytes + [partitioner_max_gap_bytes: | default = 524288] + + # [advanced] Controls what is the ratio of postings offsets that the store + # will hold in memory. + # CLI flag: -blocks-storage.bucket-store.posting-offsets-in-mem-sampling + [postings_offsets_in_mem_sampling: | default = 32] + tsdb: # Local directory to store TSDBs in the ingesters. # CLI flag: -blocks-storage.tsdb.dir @@ -678,6 +697,12 @@ blocks_storage: # CLI flag: -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes [head_chunks_write_buffer_size_bytes: | default = 4194304] + # [experimental] How much variance (as percentage between 0 and 1) should be + # applied to the chunk end time, to spread chunks writing across time. + # Doesn't apply to the last chunk of the chunk range. 0 means no variance. + # CLI flag: -blocks-storage.tsdb.head-chunks-end-time-variance + [head_chunks_end_time_variance: | default = 0] + # The number of shards of series to use in TSDB (must be a power of 2). # Reducing this will decrease memory footprint, but can negatively impact # performance. diff --git a/docs/sources/blocks-storage/store-gateway.md b/docs/sources/blocks-storage/store-gateway.md index 606024758cc..3d82005d144 100644 --- a/docs/sources/blocks-storage/store-gateway.md +++ b/docs/sources/blocks-storage/store-gateway.md @@ -196,7 +196,7 @@ store_gateway: # CLI flag: -store-gateway.sharding-ring.store [store: | default = "consul"] - # The prefix for the keys in the store. Should end with a /. + # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -store-gateway.sharding-ring.prefix [prefix: | default = "collectors/"] @@ -211,19 +211,19 @@ store_gateway: [etcd: ] multi: - # Primary backend storage used by multi-client. + # [advanced] Primary backend storage used by multi-client. # CLI flag: -store-gateway.sharding-ring.multi.primary [primary: | default = ""] - # Secondary backend storage used by multi-client. + # [advanced] Secondary backend storage used by multi-client. # CLI flag: -store-gateway.sharding-ring.multi.secondary [secondary: | default = ""] - # Mirror writes to secondary store. + # [advanced] Mirror writes to secondary store. # CLI flag: -store-gateway.sharding-ring.multi.mirror-enabled [mirror_enabled: | default = false] - # Timeout for storing value to secondary store. + # [advanced] Timeout for storing value to secondary store. # CLI flag: -store-gateway.sharding-ring.multi.mirror-timeout [mirror_timeout: | default = 2s] @@ -336,12 +336,12 @@ blocks_storage: # CLI flag: -blocks-storage.s3.http.response-header-timeout [response_header_timeout: | default = 2m] - # If the client connects to S3 via HTTPS and this option is enabled, the - # client will accept any certificate and hostname. + # [advanced] If the client connects to S3 via HTTPS and this option is + # enabled, the client will accept any certificate and hostname. # CLI flag: -blocks-storage.s3.http.insecure-skip-verify [insecure_skip_verify: | default = false] - # Maximum time to wait for a TLS handshake. 0 means no limit. + # [advanced] Maximum time to wait for a TLS handshake. 0 means no limit. # CLI flag: -blocks-storage.s3.tls-handshake-timeout [tls_handshake_timeout: | default = 10s] @@ -690,6 +690,14 @@ blocks_storage: # CLI flag: -blocks-storage.bucket-store.max-chunk-pool-bytes [max_chunk_pool_bytes: | default = 2147483648] + # [advanced] Size - in bytes - of the smallest chunks pool bucket. + # CLI flag: -blocks-storage.bucket-store.chunk-pool-min-bucket-size-bytes + [chunk_pool_min_bucket_size_bytes: | default = 16000] + + # [advanced] Size - in bytes - of the largest chunks pool bucket. + # CLI flag: -blocks-storage.bucket-store.chunk-pool-max-bucket-size-bytes + [chunk_pool_max_bucket_size_bytes: | default = 50000000] + # Max size - in bytes - of the in-memory series hash cache. The cache is # shared across all tenants and it's used only when query sharding is # enabled. @@ -707,6 +715,16 @@ blocks_storage: # CLI flag: -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout [index_header_lazy_loading_idle_timeout: | default = 1h] + # [advanced] Max size - in bytes - of a gap for which the partitioner + # aggregates together two bucket GET object requests. + # CLI flag: -blocks-storage.bucket-store.partitioner-max-gap-bytes + [partitioner_max_gap_bytes: | default = 524288] + + # [advanced] Controls what is the ratio of postings offsets that the store + # will hold in memory. + # CLI flag: -blocks-storage.bucket-store.posting-offsets-in-mem-sampling + [postings_offsets_in_mem_sampling: | default = 32] + tsdb: # Local directory to store TSDBs in the ingesters. # CLI flag: -blocks-storage.tsdb.dir @@ -754,6 +772,12 @@ blocks_storage: # CLI flag: -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes [head_chunks_write_buffer_size_bytes: | default = 4194304] + # [experimental] How much variance (as percentage between 0 and 1) should be + # applied to the chunk end time, to spread chunks writing across time. + # Doesn't apply to the last chunk of the chunk range. 0 means no variance. + # CLI flag: -blocks-storage.tsdb.head-chunks-end-time-variance + [head_chunks_end_time_variance: | default = 0] + # The number of shards of series to use in TSDB (must be a power of 2). # Reducing this will decrease memory footprint, but can negatively impact # performance. diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index aa39c5bc894..4fd5c61b3b9 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -132,9 +132,9 @@ api: [store_gateway: ] tenant_federation: - # If enabled on all services, queries can be federated across multiple - # tenants. The tenant IDs involved need to be specified separated by a '|' - # character in the 'X-Scope-OrgID' header (experimental). + # [experimental] If enabled on all services, queries can be federated across + # multiple tenants. The tenant IDs involved need to be specified separated by + # a '|' character in the 'X-Scope-OrgID' header. # CLI flag: -tenant-federation.enabled [enabled: | default = false] @@ -228,32 +228,33 @@ query_scheduler: # CLI flag: -query-scheduler.grpc-client-config.backoff-retries [max_retries: | default = 10] - # Enable TLS in the GRPC client. This flag needs to be enabled when any - # other TLS flag is set. If set to false, insecure connection to gRPC server - # will be used. + # [advanced] Enable TLS in the GRPC client. This flag needs to be enabled + # when any other TLS flag is set. If set to false, insecure connection to + # gRPC server will be used. # CLI flag: -query-scheduler.grpc-client-config.tls-enabled [tls_enabled: | default = false] - # Path to the client certificate file, which will be used for authenticating - # with the server. Also requires the key path to be configured. + # [advanced] Path to the client certificate file, which will be used for + # authenticating with the server. Also requires the key path to be + # configured. # CLI flag: -query-scheduler.grpc-client-config.tls-cert-path [tls_cert_path: | default = ""] - # Path to the key file for the client certificate. Also requires the client - # certificate to be configured. + # [advanced] Path to the key file for the client certificate. Also requires + # the client certificate to be configured. # CLI flag: -query-scheduler.grpc-client-config.tls-key-path [tls_key_path: | default = ""] - # Path to the CA certificates file to validate server certificate against. - # If not set, the host's root CA certificates are used. + # [advanced] Path to the CA certificates file to validate server certificate + # against. If not set, the host's root CA certificates are used. # CLI flag: -query-scheduler.grpc-client-config.tls-ca-path [tls_ca_path: | default = ""] - # Override the expected name on the server certificate. + # [advanced] Override the expected name on the server certificate. # CLI flag: -query-scheduler.grpc-client-config.tls-server-name [tls_server_name: | default = ""] - # Skip validating server certificate. + # [advanced] Skip validating server certificate. # CLI flag: -query-scheduler.grpc-client-config.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] ``` @@ -434,11 +435,13 @@ The `distributor_config` configures the distributor. ```yaml pool: - # How frequently to clean up clients for ingesters that have gone away. + # [advanced] How frequently to clean up clients for ingesters that have gone + # away. # CLI flag: -distributor.client-cleanup-period [client_cleanup_period: | default = 15s] - # Run a health check on each ingester client during periodic cleanup. + # [advanced] Run a health check on each ingester client during periodic + # cleanup. # CLI flag: -distributor.health-check-ingesters [health_check_ingesters: | default = true] @@ -448,19 +451,20 @@ ha_tracker: # CLI flag: -distributor.ha-tracker.enable [enable_ha_tracker: | default = false] - # Update the timestamp in the KV store for a given cluster/replica only after - # this amount of time has passed since the current stored timestamp. + # [advanced] Update the timestamp in the KV store for a given cluster/replica + # only after this amount of time has passed since the current stored + # timestamp. # CLI flag: -distributor.ha-tracker.update-timeout [ha_tracker_update_timeout: | default = 15s] - # Maximum jitter applied to the update timeout, in order to spread the HA - # heartbeats over time. + # [advanced] Maximum jitter applied to the update timeout, in order to spread + # the HA heartbeats over time. # CLI flag: -distributor.ha-tracker.update-timeout-jitter-max [ha_tracker_update_timeout_jitter_max: | default = 5s] - # If we don't receive any samples from the accepted replica for a cluster in - # this amount of time we will failover to the next replica we receive a sample - # from. This value must be greater than the update timeout + # [advanced] If we don't receive any samples from the accepted replica for a + # cluster in this amount of time we will failover to the next replica we + # receive a sample from. This value must be greater than the update timeout # CLI flag: -distributor.ha-tracker.failover-timeout [ha_tracker_failover_timeout: | default = 30s] @@ -473,7 +477,7 @@ ha_tracker: # CLI flag: -distributor.ha-tracker.store [store: | default = "consul"] - # The prefix for the keys in the store. Should end with a /. + # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -distributor.ha-tracker.prefix [prefix: | default = "ha-tracker/"] @@ -486,36 +490,37 @@ ha_tracker: [etcd: ] multi: - # Primary backend storage used by multi-client. + # [advanced] Primary backend storage used by multi-client. # CLI flag: -distributor.ha-tracker.multi.primary [primary: | default = ""] - # Secondary backend storage used by multi-client. + # [advanced] Secondary backend storage used by multi-client. # CLI flag: -distributor.ha-tracker.multi.secondary [secondary: | default = ""] - # Mirror writes to secondary store. + # [advanced] Mirror writes to secondary store. # CLI flag: -distributor.ha-tracker.multi.mirror-enabled [mirror_enabled: | default = false] - # Timeout for storing value to secondary store. + # [advanced] Timeout for storing value to secondary store. # CLI flag: -distributor.ha-tracker.multi.mirror-timeout [mirror_timeout: | default = 2s] -# remote_write API max receive message size (bytes). +# [advanced] remote_write API max receive message size (bytes). # CLI flag: -distributor.max-recv-msg-size [max_recv_msg_size: | default = 104857600] -# Timeout for downstream ingesters. +# [advanced] Timeout for downstream ingesters. # CLI flag: -distributor.remote-timeout [remote_timeout: | default = 20s] -# Time to wait before sending more than the minimum successful query requests. +# [advanced] Time to wait before sending more than the minimum successful query +# requests. # CLI flag: -distributor.extra-query-delay [extra_queue_delay: | default = 0s] -# Try writing to an additional ingester in the presence of an ingester not in -# the ACTIVE state. It is useful to disable this along with +# [advanced] Try writing to an additional ingester in the presence of an +# ingester not in the ACTIVE state. It is useful to disable this along with # -ingester.unregister-on-shutdown=false in order to not spread samples to extra # ingesters during rolling restarts with consistent naming. # CLI flag: -distributor.extend-writes @@ -528,7 +533,7 @@ ring: # CLI flag: -distributor.ring.store [store: | default = "consul"] - # The prefix for the keys in the store. Should end with a /. + # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -distributor.ring.prefix [prefix: | default = "collectors/"] @@ -541,19 +546,19 @@ ring: [etcd: ] multi: - # Primary backend storage used by multi-client. + # [advanced] Primary backend storage used by multi-client. # CLI flag: -distributor.ring.multi.primary [primary: | default = ""] - # Secondary backend storage used by multi-client. + # [advanced] Secondary backend storage used by multi-client. # CLI flag: -distributor.ring.multi.secondary [secondary: | default = ""] - # Mirror writes to secondary store. + # [advanced] Mirror writes to secondary store. # CLI flag: -distributor.ring.multi.mirror-enabled [mirror_enabled: | default = false] - # Timeout for storing value to secondary store. + # [advanced] Timeout for storing value to secondary store. # CLI flag: -distributor.ring.multi.mirror-timeout [mirror_timeout: | default = 2s] @@ -598,7 +603,7 @@ lifecycler: # CLI flag: -ring.store [store: | default = "consul"] - # The prefix for the keys in the store. Should end with a /. + # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -ring.prefix [prefix: | default = "collectors/"] @@ -609,19 +614,19 @@ lifecycler: [etcd: ] multi: - # Primary backend storage used by multi-client. + # [advanced] Primary backend storage used by multi-client. # CLI flag: -multi.primary [primary: | default = ""] - # Secondary backend storage used by multi-client. + # [advanced] Secondary backend storage used by multi-client. # CLI flag: -multi.secondary [secondary: | default = ""] - # Mirror writes to secondary store. + # [advanced] Mirror writes to secondary store. # CLI flag: -multi.mirror-enabled [mirror_enabled: | default = false] - # Timeout for storing value to secondary store. + # [advanced] Timeout for storing value to secondary store. # CLI flag: -multi.mirror-timeout [mirror_timeout: | default = 2s] @@ -701,12 +706,12 @@ lifecycler: # CLI flag: -ingester.readiness-check-ring-health [readiness_check_ring_health: | default = true] -# Period at which metadata we have not seen will remain in memory before being -# deleted. +# [advanced] Period at which metadata we have not seen will remain in memory +# before being deleted. # CLI flag: -ingester.metadata-retain-period [metadata_retain_period: | default = 10m] -# Period with which to update the per-user ingestion rates. +# [advanced] Period with which to update the per-user ingestion rates. # CLI flag: -ingester.rate-update-period [rate_update_period: | default = 15s] @@ -714,11 +719,11 @@ lifecycler: # CLI flag: -ingester.active-series-metrics-enabled [active_series_metrics_enabled: | default = true] -# How often to update active series metrics. +# [advanced] How often to update active series metrics. # CLI flag: -ingester.active-series-metrics-update-period [active_series_metrics_update_period: | default = 1m] -# After what time a series is considered to be inactive. +# [advanced] After what time a series is considered to be inactive. # CLI flag: -ingester.active-series-metrics-idle-timeout [active_series_metrics_idle_timeout: | default = 10m] @@ -736,36 +741,34 @@ lifecycler: # CLI flag: -ingester.active-series-custom-trackers [active_series_custom_trackers: | default = ] -# Period with which to update per-user max exemplars. +# [experimental] Period with which to update per-user max exemplars. # CLI flag: -ingester.exemplars-update-period [exemplars_update_period: | default = 15s] instance_limits: - # Max ingestion rate (samples/sec) that ingester will accept. This limit is - # per-ingester, not per-tenant. Additional push requests will be rejected. - # Current ingestion rate is computed as exponentially weighted moving average, - # updated every second. This limit only works when using blocks engine. 0 = - # unlimited. + # [advanced] Max ingestion rate (samples/sec) that ingester will accept. This + # limit is per-ingester, not per-tenant. Additional push requests will be + # rejected. Current ingestion rate is computed as exponentially weighted + # moving average, updated every second. 0 = unlimited. # CLI flag: -ingester.instance-limits.max-ingestion-rate [max_ingestion_rate: | default = 0] - # Max users that this ingester can hold. Requests from additional users will - # be rejected. This limit only works when using blocks engine. 0 = unlimited. + # [advanced] Max users (also referred to as 'tenants') that this ingester can + # hold. Requests from additional users will be rejected. 0 = unlimited. # CLI flag: -ingester.instance-limits.max-tenants [max_tenants: | default = 0] - # Max series that this ingester can hold (across all tenants). Requests to - # create additional series will be rejected. This limit only works when using - # blocks engine. 0 = unlimited. + # [advanced] Max series that this ingester can hold (across all tenants). + # Requests to create additional series will be rejected. 0 = unlimited. # CLI flag: -ingester.instance-limits.max-series [max_series: | default = 0] - # Max inflight push requests that this ingester can handle (across all - # tenants). Additional requests will be rejected. 0 = unlimited. + # [advanced] Max inflight push requests that this ingester can handle (across + # all tenants). Additional requests will be rejected. 0 = unlimited. # CLI flag: -ingester.instance-limits.max-inflight-push-requests [max_inflight_push_requests: | default = 30000] -# Comma-separated list of metric names, for which the +# [advanced] Comma-separated list of metric names, for which the # -ingester.max-global-series-per-metric limit will be ignored. Does not affect # the -ingester.max-global-series-per-user limit. # CLI flag: -ingester.ignore-series-limit-for-metric-names @@ -818,30 +821,30 @@ The `querier_config` configures the querier. [store_gateway_addresses: | default = ""] store_gateway_client: - # Enable TLS for gRPC client connecting to store-gateway. + # [advanced] Enable TLS for gRPC client connecting to store-gateway. # CLI flag: -querier.store-gateway-client.tls-enabled [tls_enabled: | default = false] - # Path to the client certificate file, which will be used for authenticating - # with the server. Also requires the key path to be configured. + # [advanced] Path to the client certificate file, which will be used for + # authenticating with the server. Also requires the key path to be configured. # CLI flag: -querier.store-gateway-client.tls-cert-path [tls_cert_path: | default = ""] - # Path to the key file for the client certificate. Also requires the client - # certificate to be configured. + # [advanced] Path to the key file for the client certificate. Also requires + # the client certificate to be configured. # CLI flag: -querier.store-gateway-client.tls-key-path [tls_key_path: | default = ""] - # Path to the CA certificates file to validate server certificate against. If - # not set, the host's root CA certificates are used. + # [advanced] Path to the CA certificates file to validate server certificate + # against. If not set, the host's root CA certificates are used. # CLI flag: -querier.store-gateway-client.tls-ca-path [tls_ca_path: | default = ""] - # Override the expected name on the server certificate. + # [advanced] Override the expected name on the server certificate. # CLI flag: -querier.store-gateway-client.tls-server-name [tls_server_name: | default = ""] - # Skip validating server certificate. + # [advanced] Skip validating server certificate. # CLI flag: -querier.store-gateway-client.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] @@ -892,24 +895,24 @@ The `query_frontend_config` configures the query-frontend. # CLI flag: -frontend.log-queries-longer-than [log_queries_longer_than: | default = 0s] -# Max body size for downstream prometheus. +# [advanced] Max body size for downstream prometheus. # CLI flag: -frontend.max-body-size [max_body_size: | default = 10485760] -# False to disable query statistics tracking. When enabled, a message with some -# statistics is logged for every query. +# [advanced] False to disable query statistics tracking. When enabled, a message +# with some statistics is logged for every query. # CLI flag: -frontend.query-stats-enabled [query_stats_enabled: | default = true] -# Maximum number of outstanding requests per tenant per frontend; requests -# beyond this error with HTTP 429. +# [advanced] Maximum number of outstanding requests per tenant per frontend; +# requests beyond this error with HTTP 429. # CLI flag: -querier.max-outstanding-requests-per-tenant [max_outstanding_per_tenant: | default = 100] -# If a querier disconnects without sending notification about graceful shutdown, -# the query-frontend will keep the querier in the tenant's shard until the -# forget delay has passed. This feature is useful to reduce the blast radius -# when shuffle-sharding is enabled. +# [advanced] If a querier disconnects without sending notification about +# graceful shutdown, the query-frontend will keep the querier in the tenant's +# shard until the forget delay has passed. This feature is useful to reduce the +# blast radius when shuffle-sharding is enabled. # CLI flag: -query-frontend.querier-forget-delay [querier_forget_delay: | default = 0s] @@ -917,12 +920,13 @@ The `query_frontend_config` configures the query-frontend. # CLI flag: -frontend.scheduler-address [scheduler_address: | default = ""] -# How often to resolve the scheduler-address, in order to look for new -# query-scheduler instances. +# [advanced] How often to resolve the scheduler-address, in order to look for +# new query-scheduler instances. # CLI flag: -frontend.scheduler-dns-lookup-period [scheduler_dns_lookup_period: | default = 10s] -# Number of concurrent workers forwarding queries to single query-scheduler. +# [advanced] Number of concurrent workers forwarding queries to single +# query-scheduler. # CLI flag: -frontend.scheduler-worker-concurrency [scheduler_worker_concurrency: | default = 5] @@ -965,47 +969,47 @@ grpc_client_config: # CLI flag: -frontend.grpc-client-config.backoff-retries [max_retries: | default = 10] - # Enable TLS in the GRPC client. This flag needs to be enabled when any other - # TLS flag is set. If set to false, insecure connection to gRPC server will be - # used. + # [advanced] Enable TLS in the GRPC client. This flag needs to be enabled when + # any other TLS flag is set. If set to false, insecure connection to gRPC + # server will be used. # CLI flag: -frontend.grpc-client-config.tls-enabled [tls_enabled: | default = false] - # Path to the client certificate file, which will be used for authenticating - # with the server. Also requires the key path to be configured. + # [advanced] Path to the client certificate file, which will be used for + # authenticating with the server. Also requires the key path to be configured. # CLI flag: -frontend.grpc-client-config.tls-cert-path [tls_cert_path: | default = ""] - # Path to the key file for the client certificate. Also requires the client - # certificate to be configured. + # [advanced] Path to the key file for the client certificate. Also requires + # the client certificate to be configured. # CLI flag: -frontend.grpc-client-config.tls-key-path [tls_key_path: | default = ""] - # Path to the CA certificates file to validate server certificate against. If - # not set, the host's root CA certificates are used. + # [advanced] Path to the CA certificates file to validate server certificate + # against. If not set, the host's root CA certificates are used. # CLI flag: -frontend.grpc-client-config.tls-ca-path [tls_ca_path: | default = ""] - # Override the expected name on the server certificate. + # [advanced] Override the expected name on the server certificate. # CLI flag: -frontend.grpc-client-config.tls-server-name [tls_server_name: | default = ""] - # Skip validating server certificate. + # [advanced] Skip validating server certificate. # CLI flag: -frontend.grpc-client-config.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] -# Name of network interface to read address from. This address is sent to -# query-scheduler and querier, which uses it to send the query response back to -# query-frontend. +# [advanced] Name of network interface to read address from. This address is +# sent to query-scheduler and querier, which uses it to send the query response +# back to query-frontend. # CLI flag: -frontend.instance-interface-names [instance_interface_names: | default = [eth0 en0]] -# IP address to advertise to querier (via scheduler) (resolved via interfaces by -# default). +# [advanced] IP address to advertise to querier (via scheduler) (resolved via +# interfaces by default). # CLI flag: -frontend.instance-addr [address: | default = ""] -# Port to advertise to querier (via scheduler) (defaults to +# [advanced] Port to advertise to querier (via scheduler) (defaults to # server.grpc-listen-port). # CLI flag: -frontend.instance-port [port: | default = 0] @@ -1052,7 +1056,7 @@ results_cache: # CLI flag: -frontend.cache-unaligned-requests [cache_unaligned_requests: | default = false] -# URL of downstream Prometheus. +# [advanced] URL of downstream Prometheus. # CLI flag: -frontend.downstream-url [downstream_url: | default = ""] ``` @@ -1105,32 +1109,32 @@ ruler_client: # CLI flag: -ruler.client.backoff-retries [max_retries: | default = 10] - # Enable TLS in the GRPC client. This flag needs to be enabled when any other - # TLS flag is set. If set to false, insecure connection to gRPC server will be - # used. + # [advanced] Enable TLS in the GRPC client. This flag needs to be enabled when + # any other TLS flag is set. If set to false, insecure connection to gRPC + # server will be used. # CLI flag: -ruler.client.tls-enabled [tls_enabled: | default = false] - # Path to the client certificate file, which will be used for authenticating - # with the server. Also requires the key path to be configured. + # [advanced] Path to the client certificate file, which will be used for + # authenticating with the server. Also requires the key path to be configured. # CLI flag: -ruler.client.tls-cert-path [tls_cert_path: | default = ""] - # Path to the key file for the client certificate. Also requires the client - # certificate to be configured. + # [advanced] Path to the key file for the client certificate. Also requires + # the client certificate to be configured. # CLI flag: -ruler.client.tls-key-path [tls_key_path: | default = ""] - # Path to the CA certificates file to validate server certificate against. If - # not set, the host's root CA certificates are used. + # [advanced] Path to the CA certificates file to validate server certificate + # against. If not set, the host's root CA certificates are used. # CLI flag: -ruler.client.tls-ca-path [tls_ca_path: | default = ""] - # Override the expected name on the server certificate. + # [advanced] Override the expected name on the server certificate. # CLI flag: -ruler.client.tls-server-name [tls_server_name: | default = ""] - # Skip validating server certificate. + # [advanced] Skip validating server certificate. # CLI flag: -ruler.client.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] @@ -1174,26 +1178,26 @@ ruler_client: [notification_timeout: | default = 10s] alertmanager_client: - # Path to the client certificate file, which will be used for authenticating - # with the server. Also requires the key path to be configured. + # [advanced] Path to the client certificate file, which will be used for + # authenticating with the server. Also requires the key path to be configured. # CLI flag: -ruler.alertmanager-client.tls-cert-path [tls_cert_path: | default = ""] - # Path to the key file for the client certificate. Also requires the client - # certificate to be configured. + # [advanced] Path to the key file for the client certificate. Also requires + # the client certificate to be configured. # CLI flag: -ruler.alertmanager-client.tls-key-path [tls_key_path: | default = ""] - # Path to the CA certificates file to validate server certificate against. If - # not set, the host's root CA certificates are used. + # [advanced] Path to the CA certificates file to validate server certificate + # against. If not set, the host's root CA certificates are used. # CLI flag: -ruler.alertmanager-client.tls-ca-path [tls_ca_path: | default = ""] - # Override the expected name on the server certificate. + # [advanced] Override the expected name on the server certificate. # CLI flag: -ruler.alertmanager-client.tls-server-name [tls_server_name: | default = ""] - # Skip validating server certificate. + # [advanced] Skip validating server certificate. # CLI flag: -ruler.alertmanager-client.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] @@ -1231,7 +1235,7 @@ ring: # CLI flag: -ruler.ring.store [store: | default = "memberlist"] - # The prefix for the keys in the store. Should end with a /. + # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -ruler.ring.prefix [prefix: | default = "rulers/"] @@ -1244,19 +1248,19 @@ ring: [etcd: ] multi: - # Primary backend storage used by multi-client. + # [advanced] Primary backend storage used by multi-client. # CLI flag: -ruler.ring.multi.primary [primary: | default = ""] - # Secondary backend storage used by multi-client. + # [advanced] Secondary backend storage used by multi-client. # CLI flag: -ruler.ring.multi.secondary [secondary: | default = ""] - # Mirror writes to secondary store. + # [advanced] Mirror writes to secondary store. # CLI flag: -ruler.ring.multi.mirror-enabled [mirror_enabled: | default = false] - # Timeout for storing value to secondary store. + # [advanced] Timeout for storing value to secondary store. # CLI flag: -ruler.ring.multi.mirror-timeout [mirror_timeout: | default = 2s] @@ -1282,7 +1286,7 @@ ring: [flush_period: | default = 1m] # Enable the ruler api -# CLI flag: -experimental.ruler.enable-api +# CLI flag: -ruler.enable-api [enable_api: | default = false] # Comma separated list of tenants whose rules this ruler can evaluate. If @@ -1369,12 +1373,12 @@ s3: # CLI flag: -ruler-storage.s3.http.response-header-timeout [response_header_timeout: | default = 2m] - # If the client connects to S3 via HTTPS and this option is enabled, the - # client will accept any certificate and hostname. + # [advanced] If the client connects to S3 via HTTPS and this option is + # enabled, the client will accept any certificate and hostname. # CLI flag: -ruler-storage.s3.http.insecure-skip-verify [insecure_skip_verify: | default = false] - # Maximum time to wait for a TLS handshake. 0 means no limit. + # [advanced] Maximum time to wait for a TLS handshake. 0 means no limit. # CLI flag: -ruler-storage.s3.tls-handshake-timeout [tls_handshake_timeout: | default = 10s] @@ -1570,7 +1574,7 @@ sharding_ring: # CLI flag: -alertmanager.sharding-ring.store [store: | default = "consul"] - # The prefix for the keys in the store. Should end with a /. + # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -alertmanager.sharding-ring.prefix [prefix: | default = "alertmanagers/"] @@ -1583,19 +1587,19 @@ sharding_ring: [etcd: ] multi: - # Primary backend storage used by multi-client. + # [advanced] Primary backend storage used by multi-client. # CLI flag: -alertmanager.sharding-ring.multi.primary [primary: | default = ""] - # Secondary backend storage used by multi-client. + # [advanced] Secondary backend storage used by multi-client. # CLI flag: -alertmanager.sharding-ring.multi.secondary [secondary: | default = ""] - # Mirror writes to secondary store. + # [advanced] Mirror writes to secondary store. # CLI flag: -alertmanager.sharding-ring.multi.mirror-enabled [mirror_enabled: | default = false] - # Timeout for storing value to secondary store. + # [advanced] Timeout for storing value to secondary store. # CLI flag: -alertmanager.sharding-ring.multi.mirror-timeout [mirror_timeout: | default = 2s] @@ -1660,8 +1664,8 @@ cluster: # CLI flag: -alertmanager.cluster.push-pull-interval [push_pull_interval: | default = 1m] -# Enable the experimental alertmanager config api. -# CLI flag: -experimental.alertmanager.enable-api +# Enable the alertmanager config api. +# CLI flag: -alertmanager.enable-api [enable_api: | default = false] alertmanager_client: @@ -1669,32 +1673,32 @@ alertmanager_client: # CLI flag: -alertmanager.alertmanager-client.remote-timeout [remote_timeout: | default = 2s] - # Enable TLS in the GRPC client. This flag needs to be enabled when any other - # TLS flag is set. If set to false, insecure connection to gRPC server will be - # used. + # [advanced] Enable TLS in the GRPC client. This flag needs to be enabled when + # any other TLS flag is set. If set to false, insecure connection to gRPC + # server will be used. # CLI flag: -alertmanager.alertmanager-client.tls-enabled [tls_enabled: | default = false] - # Path to the client certificate file, which will be used for authenticating - # with the server. Also requires the key path to be configured. + # [advanced] Path to the client certificate file, which will be used for + # authenticating with the server. Also requires the key path to be configured. # CLI flag: -alertmanager.alertmanager-client.tls-cert-path [tls_cert_path: | default = ""] - # Path to the key file for the client certificate. Also requires the client - # certificate to be configured. + # [advanced] Path to the key file for the client certificate. Also requires + # the client certificate to be configured. # CLI flag: -alertmanager.alertmanager-client.tls-key-path [tls_key_path: | default = ""] - # Path to the CA certificates file to validate server certificate against. If - # not set, the host's root CA certificates are used. + # [advanced] Path to the CA certificates file to validate server certificate + # against. If not set, the host's root CA certificates are used. # CLI flag: -alertmanager.alertmanager-client.tls-ca-path [tls_ca_path: | default = ""] - # Override the expected name on the server certificate. + # [advanced] Override the expected name on the server certificate. # CLI flag: -alertmanager.alertmanager-client.tls-server-name [tls_server_name: | default = ""] - # Skip validating server certificate. + # [advanced] Skip validating server certificate. # CLI flag: -alertmanager.alertmanager-client.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] @@ -1765,12 +1769,12 @@ s3: # CLI flag: -alertmanager-storage.s3.http.response-header-timeout [response_header_timeout: | default = 2m] - # If the client connects to S3 via HTTPS and this option is enabled, the - # client will accept any certificate and hostname. + # [advanced] If the client connects to S3 via HTTPS and this option is + # enabled, the client will accept any certificate and hostname. # CLI flag: -alertmanager-storage.s3.http.insecure-skip-verify [insecure_skip_verify: | default = false] - # Maximum time to wait for a TLS handshake. 0 means no limit. + # [advanced] Maximum time to wait for a TLS handshake. 0 means no limit. # CLI flag: -alertmanager-storage.s3.tls-handshake-timeout [tls_handshake_timeout: | default = 10s] @@ -1931,8 +1935,8 @@ local: The `flusher_config` configures the WAL flusher target, used to manually run one-time flushes when scaling down ingesters. ```yaml -# Stop after flush has finished. If false, process will keep running, doing -# nothing. +# [advanced] Stop after flush has finished. If false, process will keep running, +# doing nothing. # CLI flag: -flusher.exit-after-flush [exit_after_flush: | default = true] ``` @@ -1981,32 +1985,32 @@ grpc_client_config: # CLI flag: -ingester.client.backoff-retries [max_retries: | default = 10] - # Enable TLS in the GRPC client. This flag needs to be enabled when any other - # TLS flag is set. If set to false, insecure connection to gRPC server will be - # used. + # [advanced] Enable TLS in the GRPC client. This flag needs to be enabled when + # any other TLS flag is set. If set to false, insecure connection to gRPC + # server will be used. # CLI flag: -ingester.client.tls-enabled [tls_enabled: | default = false] - # Path to the client certificate file, which will be used for authenticating - # with the server. Also requires the key path to be configured. + # [advanced] Path to the client certificate file, which will be used for + # authenticating with the server. Also requires the key path to be configured. # CLI flag: -ingester.client.tls-cert-path [tls_cert_path: | default = ""] - # Path to the key file for the client certificate. Also requires the client - # certificate to be configured. + # [advanced] Path to the key file for the client certificate. Also requires + # the client certificate to be configured. # CLI flag: -ingester.client.tls-key-path [tls_key_path: | default = ""] - # Path to the CA certificates file to validate server certificate against. If - # not set, the host's root CA certificates are used. + # [advanced] Path to the CA certificates file to validate server certificate + # against. If not set, the host's root CA certificates are used. # CLI flag: -ingester.client.tls-ca-path [tls_ca_path: | default = ""] - # Override the expected name on the server certificate. + # [advanced] Override the expected name on the server certificate. # CLI flag: -ingester.client.tls-server-name [tls_server_name: | default = ""] - # Skip validating server certificate. + # [advanced] Skip validating server certificate. # CLI flag: -ingester.client.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] ``` @@ -2030,12 +2034,13 @@ The `frontend_worker_config` configures the worker - running within the querier # CLI flag: -querier.scheduler-address [scheduler_address: | default = ""] -# How often to query DNS for query-frontend or query-scheduler address. +# [advanced] How often to query DNS for query-frontend or query-scheduler +# address. # CLI flag: -querier.dns-lookup-period [dns_lookup_duration: | default = 10s] -# Querier ID, sent to frontend service to identify requests from the same -# querier. Defaults to hostname. +# [advanced] Querier ID, sent to frontend service to identify requests from the +# same querier. Defaults to hostname. # CLI flag: -querier.id [id: | default = ""] @@ -2078,32 +2083,32 @@ grpc_client_config: # CLI flag: -querier.frontend-client.backoff-retries [max_retries: | default = 10] - # Enable TLS in the GRPC client. This flag needs to be enabled when any other - # TLS flag is set. If set to false, insecure connection to gRPC server will be - # used. + # [advanced] Enable TLS in the GRPC client. This flag needs to be enabled when + # any other TLS flag is set. If set to false, insecure connection to gRPC + # server will be used. # CLI flag: -querier.frontend-client.tls-enabled [tls_enabled: | default = false] - # Path to the client certificate file, which will be used for authenticating - # with the server. Also requires the key path to be configured. + # [advanced] Path to the client certificate file, which will be used for + # authenticating with the server. Also requires the key path to be configured. # CLI flag: -querier.frontend-client.tls-cert-path [tls_cert_path: | default = ""] - # Path to the key file for the client certificate. Also requires the client - # certificate to be configured. + # [advanced] Path to the key file for the client certificate. Also requires + # the client certificate to be configured. # CLI flag: -querier.frontend-client.tls-key-path [tls_key_path: | default = ""] - # Path to the CA certificates file to validate server certificate against. If - # not set, the host's root CA certificates are used. + # [advanced] Path to the CA certificates file to validate server certificate + # against. If not set, the host's root CA certificates are used. # CLI flag: -querier.frontend-client.tls-ca-path [tls_ca_path: | default = ""] - # Override the expected name on the server certificate. + # [advanced] Override the expected name on the server certificate. # CLI flag: -querier.frontend-client.tls-server-name [tls_server_name: | default = ""] - # Skip validating server certificate. + # [advanced] Skip validating server certificate. # CLI flag: -querier.frontend-client.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] ``` @@ -2127,38 +2132,38 @@ The `etcd_config` configures the etcd client. The supported CLI flags `` # CLI flag: -.etcd.endpoints [endpoints: | default = []] -# The dial timeout for the etcd connection. +# [advanced] The dial timeout for the etcd connection. # CLI flag: -.etcd.dial-timeout [dial_timeout: | default = 10s] -# The maximum number of retries to do for failed ops. +# [advanced] The maximum number of retries to do for failed ops. # CLI flag: -.etcd.max-retries [max_retries: | default = 10] -# Enable TLS. +# [advanced] Enable TLS. # CLI flag: -.etcd.tls-enabled [tls_enabled: | default = false] -# Path to the client certificate file, which will be used for authenticating -# with the server. Also requires the key path to be configured. +# [advanced] Path to the client certificate file, which will be used for +# authenticating with the server. Also requires the key path to be configured. # CLI flag: -.etcd.tls-cert-path [tls_cert_path: | default = ""] -# Path to the key file for the client certificate. Also requires the client -# certificate to be configured. +# [advanced] Path to the key file for the client certificate. Also requires the +# client certificate to be configured. # CLI flag: -.etcd.tls-key-path [tls_key_path: | default = ""] -# Path to the CA certificates file to validate server certificate against. If -# not set, the host's root CA certificates are used. +# [advanced] Path to the CA certificates file to validate server certificate +# against. If not set, the host's root CA certificates are used. # CLI flag: -.etcd.tls-ca-path [tls_ca_path: | default = ""] -# Override the expected name on the server certificate. +# [advanced] Override the expected name on the server certificate. # CLI flag: -.etcd.tls-server-name [tls_server_name: | default = ""] -# Skip validating server certificate. +# [advanced] Skip validating server certificate. # CLI flag: -.etcd.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] @@ -2190,24 +2195,24 @@ The `consul_config` configures the consul client. The supported CLI flags `.consul.hostname [host: | default = "localhost:8500"] -# ACL Token used to interact with Consul. +# [advanced] ACL Token used to interact with Consul. # CLI flag: -.consul.acl-token [acl_token: | default = ""] -# HTTP timeout when talking to Consul +# [advanced] HTTP timeout when talking to Consul # CLI flag: -.consul.client-timeout [http_client_timeout: | default = 20s] -# Enable consistent reads to Consul. +# [advanced] Enable consistent reads to Consul. # CLI flag: -.consul.consistent-reads [consistent_reads: | default = false] -# Rate limit when watching key or prefix in Consul, in requests per second. 0 -# disables the rate limit. +# [advanced] Rate limit when watching key or prefix in Consul, in requests per +# second. 0 disables the rate limit. # CLI flag: -.consul.watch-rate-limit [watch_rate_limit: | default = 1] -# Burst size used in rate limit. Values less than 1 are treated as 1. +# [advanced] Burst size used in rate limit. Values less than 1 are treated as 1. # CLI flag: -.consul.watch-burst-size [watch_burst_size: | default = 1] ``` @@ -2330,30 +2335,30 @@ The `memberlist_config` configures the Gossip memberlist. # CLI flag: -memberlist.packet-write-timeout [packet_write_timeout: | default = 5s] -# Enable TLS on the memberlist transport layer. +# [advanced] Enable TLS on the memberlist transport layer. # CLI flag: -memberlist.tls-enabled [tls_enabled: | default = false] -# Path to the client certificate file, which will be used for authenticating -# with the server. Also requires the key path to be configured. +# [advanced] Path to the client certificate file, which will be used for +# authenticating with the server. Also requires the key path to be configured. # CLI flag: -memberlist.tls-cert-path [tls_cert_path: | default = ""] -# Path to the key file for the client certificate. Also requires the client -# certificate to be configured. +# [advanced] Path to the key file for the client certificate. Also requires the +# client certificate to be configured. # CLI flag: -memberlist.tls-key-path [tls_key_path: | default = ""] -# Path to the CA certificates file to validate server certificate against. If -# not set, the host's root CA certificates are used. +# [advanced] Path to the CA certificates file to validate server certificate +# against. If not set, the host's root CA certificates are used. # CLI flag: -memberlist.tls-ca-path [tls_ca_path: | default = ""] -# Override the expected name on the server certificate. +# [advanced] Override the expected name on the server certificate. # CLI flag: -memberlist.tls-server-name [tls_server_name: | default = ""] -# Skip validating server certificate. +# [advanced] Skip validating server certificate. # CLI flag: -memberlist.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] ``` @@ -2427,9 +2432,9 @@ The `limits_config` configures default and per-tenant limits imposed by services # CLI flag: -distributor.ingestion-tenant-shard-size [ingestion_tenant_shard_size: | default = 0] -# List of metric relabel configurations. Note that in most situations, it is -# more effective to use metrics relabeling directly in the Prometheus server, -# e.g. remote_write.write_relabel_configs. +# [experimental] List of metric relabel configurations. Note that in most +# situations, it is more effective to use metrics relabeling directly in the +# Prometheus server, e.g. remote_write.write_relabel_configs. [metric_relabel_configs: | default = ] # The maximum number of active series per user, across the cluster before @@ -2451,8 +2456,8 @@ The `limits_config` configures default and per-tenant limits imposed by services # CLI flag: -ingester.max-global-metadata-per-metric [max_global_metadata_per_metric: | default = 0] -# The maximum number of exemplars in memory, across the cluster. 0 to disable -# exemplars ingestion. +# [experimental] The maximum number of exemplars in memory, across the cluster. +# 0 to disable exemplars ingestion. # CLI flag: -ingester.max-global-exemplars-per-user [max_global_exemplars_per_user: | default = 0] @@ -2722,12 +2727,12 @@ s3: # CLI flag: -blocks-storage.s3.http.response-header-timeout [response_header_timeout: | default = 2m] - # If the client connects to S3 via HTTPS and this option is enabled, the - # client will accept any certificate and hostname. + # [advanced] If the client connects to S3 via HTTPS and this option is + # enabled, the client will accept any certificate and hostname. # CLI flag: -blocks-storage.s3.http.insecure-skip-verify [insecure_skip_verify: | default = false] - # Maximum time to wait for a TLS handshake. 0 means no limit. + # [advanced] Maximum time to wait for a TLS handshake. 0 means no limit. # CLI flag: -blocks-storage.s3.tls-handshake-timeout [tls_handshake_timeout: | default = 10s] @@ -3075,6 +3080,14 @@ bucket_store: # CLI flag: -blocks-storage.bucket-store.max-chunk-pool-bytes [max_chunk_pool_bytes: | default = 2147483648] + # [advanced] Size - in bytes - of the smallest chunks pool bucket. + # CLI flag: -blocks-storage.bucket-store.chunk-pool-min-bucket-size-bytes + [chunk_pool_min_bucket_size_bytes: | default = 16000] + + # [advanced] Size - in bytes - of the largest chunks pool bucket. + # CLI flag: -blocks-storage.bucket-store.chunk-pool-max-bucket-size-bytes + [chunk_pool_max_bucket_size_bytes: | default = 50000000] + # Max size - in bytes - of the in-memory series hash cache. The cache is # shared across all tenants and it's used only when query sharding is enabled. # CLI flag: -blocks-storage.bucket-store.series-hash-cache-max-size-bytes @@ -3091,6 +3104,16 @@ bucket_store: # CLI flag: -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout [index_header_lazy_loading_idle_timeout: | default = 1h] + # [advanced] Max size - in bytes - of a gap for which the partitioner + # aggregates together two bucket GET object requests. + # CLI flag: -blocks-storage.bucket-store.partitioner-max-gap-bytes + [partitioner_max_gap_bytes: | default = 524288] + + # [advanced] Controls what is the ratio of postings offsets that the store + # will hold in memory. + # CLI flag: -blocks-storage.bucket-store.posting-offsets-in-mem-sampling + [postings_offsets_in_mem_sampling: | default = 32] + tsdb: # Local directory to store TSDBs in the ingesters. # CLI flag: -blocks-storage.tsdb.dir @@ -3136,6 +3159,12 @@ tsdb: # CLI flag: -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes [head_chunks_write_buffer_size_bytes: | default = 4194304] + # [experimental] How much variance (as percentage between 0 and 1) should be + # applied to the chunk end time, to spread chunks writing across time. Doesn't + # apply to the last chunk of the chunk range. 0 means no variance. + # CLI flag: -blocks-storage.tsdb.head-chunks-end-time-variance + [head_chunks_end_time_variance: | default = 0] + # The number of shards of series to use in TSDB (must be a power of 2). # Reducing this will decrease memory footprint, but can negatively impact # performance. @@ -3193,23 +3222,23 @@ tsdb: The `compactor_config` configures the compactor service. ```yaml -# List of compaction time ranges. +# [advanced] List of compaction time ranges. # CLI flag: -compactor.block-ranges [block_ranges: | default = 2h0m0s,12h0m0s,24h0m0s] -# Number of Go routines to use when downloading blocks for compaction and -# uploading resulting blocks. +# [advanced] Number of Go routines to use when downloading blocks for compaction +# and uploading resulting blocks. # CLI flag: -compactor.block-sync-concurrency [block_sync_concurrency: | default = 8] -# Number of Go routines to use when syncing block meta files from the long term -# storage. +# [advanced] Number of Go routines to use when syncing block meta files from the +# long term storage. # CLI flag: -compactor.meta-sync-concurrency [meta_sync_concurrency: | default = 20] -# Minimum age of fresh (non-compacted) blocks before they are being processed. -# Malformed blocks older than the maximum of consistency-delay and 48h0m0s will -# be removed. +# [advanced] Minimum age of fresh (non-compacted) blocks before they are being +# processed. Malformed blocks older than the maximum of consistency-delay and +# 48h0m0s will be removed. # CLI flag: -compactor.consistency-delay [consistency_delay: | default = 0s] @@ -3217,72 +3246,74 @@ The `compactor_config` configures the compactor service. # CLI flag: -compactor.data-dir [data_dir: | default = "./data"] -# The frequency at which the compaction runs +# [advanced] The frequency at which the compaction runs # CLI flag: -compactor.compaction-interval [compaction_interval: | default = 1h] -# How many times to retry a failed compaction within a single compaction run. +# [advanced] How many times to retry a failed compaction within a single +# compaction run. # CLI flag: -compactor.compaction-retries [compaction_retries: | default = 3] -# Max number of concurrent compactions running. +# [advanced] Max number of concurrent compactions running. # CLI flag: -compactor.compaction-concurrency [compaction_concurrency: | default = 1] -# How frequently compactor should run blocks cleanup and maintenance, as well as -# update the bucket index. +# [advanced] How frequently compactor should run blocks cleanup and maintenance, +# as well as update the bucket index. # CLI flag: -compactor.cleanup-interval [cleanup_interval: | default = 15m] -# Max number of tenants for which blocks cleanup and maintenance should run -# concurrently. +# [advanced] Max number of tenants for which blocks cleanup and maintenance +# should run concurrently. # CLI flag: -compactor.cleanup-concurrency [cleanup_concurrency: | default = 20] -# Time before a block marked for deletion is deleted from bucket. If not 0, -# blocks will be marked for deletion and compactor component will permanently -# delete blocks marked for deletion from the bucket. If 0, blocks will be -# deleted straight away. Note that deleting blocks immediately can cause query -# failures. +# [advanced] Time before a block marked for deletion is deleted from bucket. If +# not 0, blocks will be marked for deletion and compactor component will +# permanently delete blocks marked for deletion from the bucket. If 0, blocks +# will be deleted straight away. Note that deleting blocks immediately can cause +# query failures. # CLI flag: -compactor.deletion-delay [deletion_delay: | default = 12h] -# For tenants marked for deletion, this is time between deleting of last block, -# and doing final cleanup (marker files, debug files) of the tenant. +# [advanced] For tenants marked for deletion, this is time between deleting of +# last block, and doing final cleanup (marker files, debug files) of the tenant. # CLI flag: -compactor.tenant-cleanup-delay [tenant_cleanup_delay: | default = 6h] -# Max time for starting compactions for a single tenant. After this time no new -# compactions for the tenant are started before next compaction cycle. This can -# help in multi-tenant environments to avoid single tenant using all compaction -# time, but also in single-tenant environments to force new discovery of blocks -# more often. 0 = disabled. +# [advanced] Max time for starting compactions for a single tenant. After this +# time no new compactions for the tenant are started before next compaction +# cycle. This can help in multi-tenant environments to avoid single tenant using +# all compaction time, but also in single-tenant environments to force new +# discovery of blocks more often. 0 = disabled. # CLI flag: -compactor.max-compaction-time [max_compaction_time: | default = 0s] -# Number of goroutines opening blocks before compaction. +# [advanced] Number of goroutines opening blocks before compaction. # CLI flag: -compactor.max-opening-blocks-concurrency [max_opening_blocks_concurrency: | default = 1] -# Max number of blocks that can be closed concurrently during split compaction. -# Note that closing of newly compacted block uses a lot of memory for writing -# index. +# [advanced] Max number of blocks that can be closed concurrently during split +# compaction. Note that closing of newly compacted block uses a lot of memory +# for writing index. # CLI flag: -compactor.max-closing-blocks-concurrency [max_closing_blocks_concurrency: | default = 1] -# Number of symbols flushers used when doing split compaction. +# [advanced] Number of symbols flushers used when doing split compaction. # CLI flag: -compactor.symbols-flushers-concurrency [symbols_flushers_concurrency: | default = 1] -# Comma separated list of tenants that can be compacted. If specified, only -# these tenants will be compacted by compactor, otherwise all tenants can be -# compacted. Subject to sharding. +# [advanced] Comma separated list of tenants that can be compacted. If +# specified, only these tenants will be compacted by compactor, otherwise all +# tenants can be compacted. Subject to sharding. # CLI flag: -compactor.enabled-tenants [enabled_tenants: | default = ""] -# Comma separated list of tenants that cannot be compacted by this compactor. If -# specified, and compactor would normally pick given tenant for compaction (via -# -compactor.enabled-tenants or sharding), it will be ignored instead. +# [advanced] Comma separated list of tenants that cannot be compacted by this +# compactor. If specified, and compactor would normally pick given tenant for +# compaction (via -compactor.enabled-tenants or sharding), it will be ignored +# instead. # CLI flag: -compactor.disabled-tenants [disabled_tenants: | default = ""] @@ -3293,7 +3324,7 @@ sharding_ring: # CLI flag: -compactor.ring.store [store: | default = "memberlist"] - # The prefix for the keys in the store. Should end with a /. + # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -compactor.ring.prefix [prefix: | default = "collectors/"] @@ -3306,19 +3337,19 @@ sharding_ring: [etcd: ] multi: - # Primary backend storage used by multi-client. + # [advanced] Primary backend storage used by multi-client. # CLI flag: -compactor.ring.multi.primary [primary: | default = ""] - # Secondary backend storage used by multi-client. + # [advanced] Secondary backend storage used by multi-client. # CLI flag: -compactor.ring.multi.secondary [secondary: | default = ""] - # Mirror writes to secondary store. + # [advanced] Mirror writes to secondary store. # CLI flag: -compactor.ring.multi.mirror-enabled [mirror_enabled: | default = false] - # Timeout for storing value to secondary store. + # [advanced] Timeout for storing value to secondary store. # CLI flag: -compactor.ring.multi.mirror-timeout [mirror_timeout: | default = 2s] @@ -3348,9 +3379,9 @@ sharding_ring: # CLI flag: -compactor.ring.wait-active-instance-timeout [wait_active_instance_timeout: | default = 10m] -# The sorting to use when deciding which compaction jobs should run first for a -# given tenant. Supported values are: smallest-range-oldest-blocks-first, -# newest-blocks-first. +# [advanced] The sorting to use when deciding which compaction jobs should run +# first for a given tenant. Supported values are: +# smallest-range-oldest-blocks-first, newest-blocks-first. # CLI flag: -compactor.compaction-jobs-order [compaction_jobs_order: | default = "smallest-range-oldest-blocks-first"] ``` @@ -3377,7 +3408,7 @@ sharding_ring: # CLI flag: -store-gateway.sharding-ring.store [store: | default = "consul"] - # The prefix for the keys in the store. Should end with a /. + # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -store-gateway.sharding-ring.prefix [prefix: | default = "collectors/"] @@ -3390,19 +3421,19 @@ sharding_ring: [etcd: ] multi: - # Primary backend storage used by multi-client. + # [advanced] Primary backend storage used by multi-client. # CLI flag: -store-gateway.sharding-ring.multi.primary [primary: | default = ""] - # Secondary backend storage used by multi-client. + # [advanced] Secondary backend storage used by multi-client. # CLI flag: -store-gateway.sharding-ring.multi.secondary [secondary: | default = ""] - # Mirror writes to secondary store. + # [advanced] Mirror writes to secondary store. # CLI flag: -store-gateway.sharding-ring.multi.mirror-enabled [mirror_enabled: | default = false] - # Timeout for storing value to secondary store. + # [advanced] Timeout for storing value to secondary store. # CLI flag: -store-gateway.sharding-ring.multi.mirror-timeout [mirror_timeout: | default = 2s] diff --git a/docs/sources/configuration/prometheus-frontend.md b/docs/sources/configuration/prometheus-frontend.md index f32f0407efb..35c5ae77acf 100644 --- a/docs/sources/configuration/prometheus-frontend.md +++ b/docs/sources/configuration/prometheus-frontend.md @@ -9,7 +9,13 @@ You can use the Cortex query frontend with any Prometheus-API compatible service, including Prometheus and Thanos. Use this config file to get the benefits of query parallelisation and caching. -```yaml + +[embedmd]:# (./prometheus-frontend.yml) +```yml +# You can use the Cortex query frontend with any Prometheus-API compatible +# service, including Prometheus and Thanos. Use this config file to get +# the benefits of query parallelisation and caching. + # Disable the requirement that every request to Cortex has a # X-Scope-OrgID header. `fake` will be substituted in instead. auth_enabled: false @@ -29,33 +35,12 @@ query_range: cache_results: true results_cache: - cache: - # We're going to use the in-process "FIFO" cache, but you can enable - # memcached below. - enable_fifocache: true - fifocache: - size: 1024 - validity: 24h - - # If you want to use a memcached cluster, you can either configure a - # headless service in Kubernetes and Cortex will discover the individual - # instances using a SRV DNS query (host) or list comma separated - # memcached addresses. - # host + service: this is the config you should set when you use the - # SRV DNS (this is considered stable) - # addresses: this is experimental and supports service discovery - # (https://cortexmetrics.io/docs/configuration/arguments/#dns-service-discovery) - # so it could either be a list of single addresses, or a SRV record - # prefixed with dnssrvnoa+. Cortex will then do client-side hashing to - # spread the load evenly. + backend: "memcached" - # memcached: - # expiration : 24h - # memcached_client: - # host: memcached.default.svc.cluster.local - # service: memcached - # addresses: "" - # consistent_hash: true + memcached: + # You can either configure a headless service in Kubernetes and Mimir will discover the individual + # instances using a SRV DNS query (host) or list comma separated memcached addresses. + addresses: "dnssrvnoa+memcached.mimir.svc.cluster.local:11211" frontend: log_queries_longer_than: 1s @@ -64,3 +49,4 @@ frontend: # The Prometheus URL to which the query-frontend should connect to. downstream_url: http://prometheus.mydomain.com ``` + diff --git a/docs/sources/configuration/v1-guarantees.md b/docs/sources/configuration/v1-guarantees.md index 89807c89e04..5f6dea38fed 100644 --- a/docs/sources/configuration/v1-guarantees.md +++ b/docs/sources/configuration/v1-guarantees.md @@ -9,73 +9,40 @@ For the v1.0 release, we want to provide the following guarantees: ## Flags, Config and minor version upgrades -Upgrading cortex from one minor version to the next should "just work"; that being said, we don't want to bump the major version every time we remove a flag, so we will will keep deprecated flags around for 2 minor release. There is a metric (`cortex_deprecated_flags_used_total`) you can alert on to find out if you're using a deprecated flag. - -Similarly to flags, minor version upgrades using config files should "just work". If we do need to change config, we will keep the old way working for two minor version. There will be a metric you can alert on for this too. +Upgrading Grafana Mimir from one minor version to the next should "just work"; that being said, we don't want to bump the major version every time we remove a configuration parameter, so we will keep deprecated flags and YAML config parameters around for 2 minor releases. There is a metric (`deprecated_flags_inuse_total`) you can alert on to find out if you're using a deprecated flag. These guarantees don't apply for [experimental features](#experimental-features). ## Reading old data -The Cortex maintainers commit to ensuring future version of Cortex can read data written by versions up to two years old. In practice we expect to be able to read more, but this is our guarantee. +The Grafana Mimir maintainers commit to ensuring future versions can read data written by versions up to two years old. In practice we expect to be able to read more, but this is our guarantee. ## API Compatibility -Cortex strives to be 100% API compatible with Prometheus (under `/prometheus/*` and `/api/prom/*`); any deviation from this is considered a bug, except: +Grafana Mimir strives to be 100% API compatible with Prometheus (under `/prometheus/*`); any deviation from this is considered a bug, except: - Additional API endpoints for creating, removing and modifying alerts and recording rules. -- Additional API around pushing metrics (under `/api/push`). -- Additional API endpoints for management of Cortex itself, such as the ring. These APIs are not part of the any compatibility guarantees. +- Additional API around pushing metrics (under `/prometheus/api/push`). +- Additional API endpoints for management of Grafana Mimir itself, such as the ring. These APIs are not part of the any compatibility guarantees. _For more information, please refer to the [limitations](../guides/limitations.md) doc._ ## Experimental features -Cortex is an actively developed project and we want to encourage the introduction of new features and capability. As such, not everything in each release of Cortex is considered "production-ready". We don't provide any backwards compatibility guarantees on these and the config and flags might break. +Grafana Mimir is an actively developed project and we want to encourage the introduction of new features and capabilities. As such, not everything in each release of Grafana Mimir is considered "production-ready". Features not considered "production-ready" and the flags used to enable and/or configure these features will be marked "Experimental". There are no backwards compatibility guarantees on anything marked experimental. Configuration and flags are subject to change. Currently experimental features are: -- S3 Server Side Encryption (SSE) using KMS (including per-tenant KMS config overrides). -- Azure blob storage. -- Zone awareness based replication. -- Ruler API (to PUT rules). -- Alertmanager: - - API (enabled via `-experimental.alertmanager.enable-api`) - - Sharding of tenants across multiple instances (enabled via `-alertmanager.sharding-enabled`) - - Receiver integrations firewall (configured via `-alertmanager.receivers-firewall.*`) -- Memcached client DNS-based service discovery. -- Delete series APIs. -- In-memory (FIFO) and Redis cache. -- gRPC Store. -- TLS configuration in gRPC and HTTP clients. -- TLS configuration in Etcd client. -- OpenStack Swift storage support. -- Metric relabeling in the distributor. -- Scalable query-frontend (when using query-scheduler) -- Distributor: do not extend writes on unhealthy ingesters (`-distributor.extend-writes=false`) -- Tenant Deletion in Purger, for blocks storage. -- Query-frontend: query stats tracking (`-frontend.query-stats-enabled`) -- Blocks storage bucket index - - The bucket index support in the querier and store-gateway (enabled via `-blocks-storage.bucket-store.bucket-index.enabled=true`) is experimental - - The block deletion marks migration support in the compactor (`-compactor.block-deletion-marks-migration-enabled`) is temporarily and will be removed in future versions -- Querier: tenant federation -- The thanosconvert tool for converting Thanos block metadata to Cortex -- HA Tracker: cleanup of old replicas from KV Store. -- Instance limits in ingester and distributor -- Exemplar storage, currently in-memory only within the Ingester based on Prometheus exemplar storage (`-blocks-storage.tsdb.max-exemplars`) -- Querier limits: - - `-querier.max-fetched-chunks-per-query` - - `-querier.max-fetched-chunk-bytes-per-query` - - `-querier.max-fetched-series-per-query` -- Alertmanager limits - - notification rate (`-alertmanager.notification-rate-limit` and `-alertmanager.notification-rate-limit-per-integration`) - - dispatcher groups (`-alertmanager.max-dispatcher-aggregation-groups`) - - user config size (`-alertmanager.max-config-size-bytes`) - - templates count in user config (`-alertmanager.max-templates-count`) - - max template size (`-alertmanager.max-template-size-bytes`) +- Querier: tenant federation. +- Ruler: tenant federation. +- Distributor: metrics relabeling. +- Purger: tenant deletion API. +- `thanosconvert` tool for converting Thanos block metadata to Grafana Mimir metadata. +- Exemplar storage + - `-ingester.max-global-exemplars-per-user` + - `-ingester.exemplars-update-period` + - API endpoint `/api/v1/query_exemplars` - Hash ring - - Do not unregister ingesters from ring on shutdown (`-ingester.unregister-on-shutdown=false`) - - Disable the ring health check in the readiness endpoint (`-ingester.readiness-check-ring-health=false`) - Disabling ring heartbeat timeouts - `-distributor.ring.heartbeat-timeout=0` - `-ring.heartbeat-timeout=0` @@ -90,6 +57,5 @@ Currently experimental features are: - `-alertmanager.sharding-ring.heartbeat-period=0` - `-compactor.ring.heartbeat-period=0` - `-store-gateway.sharding-ring.heartbeat-period=0` -- `LabelNames` calls using matchers - - `-querier.query-label-names-with-matchers-enabled` -- Exclude ingesters running in specific zones (`-distributor.excluded-zones`) + - Exclude ingesters running in specific zones (`-distributor.excluded-zones`) +- Ingester: Add variance to chunks end time to spread writing across time (`-blocks-storage.tsdb.head-chunks-end-time-variance`) diff --git a/integration/configs.go b/integration/configs.go index 3aa3d27f29b..f4adedbb953 100644 --- a/integration/configs.go +++ b/integration/configs.go @@ -129,7 +129,7 @@ var ( return map[string]string{ "-api.response-compression-enabled": "true", "-ruler.poll-interval": "2s", - "-experimental.ruler.enable-api": "true", + "-ruler.enable-api": "true", "-ruler-storage.backend": "s3", "-ruler-storage.s3.access-key-id": e2edb.MinioAccessKey, "-ruler-storage.s3.secret-access-key": e2edb.MinioSecretKey, diff --git a/integration/e2emimir/services.go b/integration/e2emimir/services.go index a8c1c5e6c96..a4e6340e6d0 100644 --- a/integration/e2emimir/services.go +++ b/integration/e2emimir/services.go @@ -371,9 +371,9 @@ func NewAlertmanager(name string, flags map[string]string, image string) *MimirS name, image, e2e.NewCommandWithoutEntrypoint(binaryName, buildArgsWithExtra(e2e.BuildArgs(e2e.MergeFlags(map[string]string{ - "-target": "alertmanager", - "-log.level": "warn", - "-experimental.alertmanager.enable-api": "true", + "-target": "alertmanager", + "-log.level": "warn", + "-alertmanager.enable-api": "true", }, flags)))...), e2e.NewHTTPReadinessProbe(httpPort, "/ready", 200, 299), httpPort, @@ -391,9 +391,9 @@ func NewAlertmanagerWithTLS(name string, flags map[string]string, image string) name, image, e2e.NewCommandWithoutEntrypoint(binaryName, buildArgsWithExtra(e2e.BuildArgs(e2e.MergeFlags(map[string]string{ - "-target": "alertmanager", - "-log.level": "warn", - "-experimental.alertmanager.enable-api": "true", + "-target": "alertmanager", + "-log.level": "warn", + "-alertmanager.enable-api": "true", }, flags)))...), e2e.NewTCPReadinessProbe(httpPort), httpPort, diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index 7b574265245..24a5d69d850 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -1068,7 +1068,6 @@ spec: - -distributor.extend-writes=true - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - - -experimental.ruler.enable-api=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h @@ -1077,6 +1076,7 @@ spec: - -ruler-storage.backend=gcs - -ruler-storage.gcs.bucket-name=rules-bucket - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager + - -ruler.enable-api=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -1146,13 +1146,13 @@ spec: - args: - -alertmanager-storage.backend=gcs - -alertmanager-storage.gcs.bucket-name=alerts-bucket + - -alertmanager.enable-api=true - -alertmanager.sharding-enabled=true - -alertmanager.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -alertmanager.sharding-ring.replication-factor=3 - -alertmanager.sharding-ring.store=consul - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - - -experimental.alertmanager.enable-api=true - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index 653cd80c4ab..87c5408eb07 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -1071,7 +1071,6 @@ spec: - -distributor.extend-writes=true - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - - -experimental.ruler.enable-api=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h @@ -1080,6 +1079,7 @@ spec: - -ruler-storage.backend=gcs - -ruler-storage.gcs.bucket-name=rules-bucket - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager + - -ruler.enable-api=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -1149,13 +1149,13 @@ spec: - args: - -alertmanager-storage.backend=gcs - -alertmanager-storage.gcs.bucket-name=alerts-bucket + - -alertmanager.enable-api=true - -alertmanager.sharding-enabled=true - -alertmanager.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -alertmanager.sharding-ring.replication-factor=3 - -alertmanager.sharding-ring.store=consul - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - - -experimental.alertmanager.enable-api=true - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index 72b3a4a1694..fe1152c886f 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -1074,7 +1074,6 @@ spec: - -distributor.health-check-ingesters=true - -distributor.ingestion-tenant-shard-size=3 - -distributor.replication-factor=3 - - -experimental.ruler.enable-api=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h @@ -1084,6 +1083,7 @@ spec: - -ruler-storage.backend=gcs - -ruler-storage.gcs.bucket-name=rules-bucket - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager + - -ruler.enable-api=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -1155,13 +1155,13 @@ spec: - args: - -alertmanager-storage.backend=gcs - -alertmanager-storage.gcs.bucket-name=alerts-bucket + - -alertmanager.enable-api=true - -alertmanager.sharding-enabled=true - -alertmanager.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -alertmanager.sharding-ring.replication-factor=3 - -alertmanager.sharding-ring.store=consul - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - - -experimental.alertmanager.enable-api=true - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index aea36dec52d..dc00da161fd 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -1071,7 +1071,6 @@ spec: - -distributor.extend-writes=true - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - - -experimental.ruler.enable-api=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h @@ -1082,6 +1081,7 @@ spec: - -ruler-storage.azure.container-name=rules-bucket - -ruler-storage.backend=azure - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager + - -ruler.enable-api=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -1153,13 +1153,13 @@ spec: - -alertmanager-storage.azure.account-name=alerts-account-name - -alertmanager-storage.azure.container-name=alerts-bucket - -alertmanager-storage.backend=azure + - -alertmanager.enable-api=true - -alertmanager.sharding-enabled=true - -alertmanager.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -alertmanager.sharding-ring.replication-factor=3 - -alertmanager.sharding-ring.store=consul - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - - -experimental.alertmanager.enable-api=true - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index ab96be02175..8670a73e6b8 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -1067,7 +1067,6 @@ spec: - -distributor.extend-writes=true - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - - -experimental.ruler.enable-api=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h @@ -1076,6 +1075,7 @@ spec: - -ruler-storage.backend=gcs - -ruler-storage.gcs.bucket-name=rules-bucket - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager + - -ruler.enable-api=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -1145,13 +1145,13 @@ spec: - args: - -alertmanager-storage.backend=gcs - -alertmanager-storage.gcs.bucket-name=alerts-bucket + - -alertmanager.enable-api=true - -alertmanager.sharding-enabled=true - -alertmanager.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -alertmanager.sharding-ring.replication-factor=3 - -alertmanager.sharding-ring.store=consul - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - - -experimental.alertmanager.enable-api=true - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index ec8bac1a345..3094012a8d0 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -1069,7 +1069,6 @@ spec: - -distributor.extend-writes=true - -distributor.health-check-ingesters=true - -distributor.replication-factor=3 - - -experimental.ruler.enable-api=true - -querier.query-ingesters-within=13h - -querier.query-label-names-with-matchers-enabled=true - -querier.query-store-after=12h @@ -1080,6 +1079,7 @@ spec: - -ruler-storage.s3.endpoint=s3.dualstack.eu-west-1.amazonaws.com - -ruler-storage.s3.region=eu-west-1 - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager + - -ruler.enable-api=true - -ruler.max-rule-groups-per-tenant=35 - -ruler.max-rules-per-rule-group=20 - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 @@ -1150,13 +1150,13 @@ spec: - -alertmanager-storage.backend=s3 - -alertmanager-storage.s3.bucket-name=alerts-bucket - -alertmanager-storage.s3.region=eu-west-1 + - -alertmanager.enable-api=true - -alertmanager.sharding-enabled=true - -alertmanager.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -alertmanager.sharding-ring.replication-factor=3 - -alertmanager.sharding-ring.store=consul - -alertmanager.storage.path=/data - -alertmanager.web.external-url=http://test/alertmanager - - -experimental.alertmanager.enable-api=true - -runtime-config.file=/etc/mimir/overrides.yaml - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true diff --git a/operations/mimir/alertmanager.libsonnet b/operations/mimir/alertmanager.libsonnet index c2820334cfd..604bf325c19 100644 --- a/operations/mimir/alertmanager.libsonnet +++ b/operations/mimir/alertmanager.libsonnet @@ -66,7 +66,7 @@ { target: 'alertmanager', 'runtime-config.file': '%s/overrides.yaml' % $._config.overrides_configmap_mountpoint, - 'experimental.alertmanager.enable-api': 'true', + 'alertmanager.enable-api': 'true', 'alertmanager.storage.path': '/data', 'alertmanager.web.external-url': '%s/alertmanager' % $._config.external_url, 'server.http-listen-port': $._config.server_http_port, diff --git a/operations/mimir/ruler.libsonnet b/operations/mimir/ruler.libsonnet index ad407e59f14..c18c965ed6c 100644 --- a/operations/mimir/ruler.libsonnet +++ b/operations/mimir/ruler.libsonnet @@ -18,7 +18,7 @@ target: 'ruler', // Alertmanager configs 'ruler.alertmanager-url': 'http://alertmanager.%s.svc.cluster.local/alertmanager' % $._config.namespace, - 'experimental.ruler.enable-api': true, + 'ruler.enable-api': true, 'api.response-compression-enabled': true, // Ring Configs diff --git a/pkg/alertmanager/multitenant.go b/pkg/alertmanager/multitenant.go index 6e4afd8f5a2..f61319c8585 100644 --- a/pkg/alertmanager/multitenant.go +++ b/pkg/alertmanager/multitenant.go @@ -42,7 +42,6 @@ import ( "github.com/grafana/mimir/pkg/alertmanager/alertstore" "github.com/grafana/mimir/pkg/tenant" "github.com/grafana/mimir/pkg/util" - util_log "github.com/grafana/mimir/pkg/util/log" ) const ( @@ -115,7 +114,7 @@ func (cfg *MultitenantAlertmanagerConfig) RegisterFlags(f *flag.FlagSet) { f.StringVar(&cfg.FallbackConfigFile, "alertmanager.configs.fallback", "", "Filename of fallback config to use if none specified for instance.") f.DurationVar(&cfg.PollInterval, "alertmanager.configs.poll-interval", 15*time.Second, "How frequently to poll Alertmanager configs.") - f.BoolVar(&cfg.EnableAPI, "experimental.alertmanager.enable-api", false, "Enable the experimental alertmanager config api.") + f.BoolVar(&cfg.EnableAPI, "alertmanager.enable-api", false, "Enable the alertmanager config api.") f.BoolVar(&cfg.ShardingEnabled, "alertmanager.sharding-enabled", false, "Shard tenants across multiple alertmanager instances.") @@ -331,8 +330,6 @@ func NewMultitenantAlertmanager(cfg *MultitenantAlertmanagerConfig, store alerts var ringStore kv.Client if cfg.ShardingEnabled { - util_log.WarnExperimentalUse("Alertmanager sharding") - ringStore, err = kv.NewClient( cfg.ShardingRing.KVStore, ring.GetCodec(), diff --git a/pkg/api/api.go b/pkg/api/api.go index c5384ce30f6..1cb0d66650e 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -188,7 +188,7 @@ func (a *API) RegisterAlertmanager(am *alertmanager.MultitenantAlertmanager, tar a.RegisterRoutesWithPrefix(a.cfg.AlertmanagerHTTPPrefix, am, true) level.Debug(a.logger).Log("msg", "api: registering alertmanager", "path_prefix", a.cfg.AlertmanagerHTTPPrefix) - // MultiTenant Alertmanager Experimental API routes + // MultiTenant Alertmanager API routes if apiEnabled { a.RegisterRoute("/api/v1/alerts", http.HandlerFunc(am.GetUserConfig), true, "GET") a.RegisterRoute("/api/v1/alerts", http.HandlerFunc(am.SetUserConfig), true, "POST") diff --git a/pkg/distributor/distributor.go b/pkg/distributor/distributor.go index fe8458e660c..446665d7b6b 100644 --- a/pkg/distributor/distributor.go +++ b/pkg/distributor/distributor.go @@ -41,7 +41,6 @@ import ( "github.com/grafana/mimir/pkg/mimirpb" "github.com/grafana/mimir/pkg/tenant" "github.com/grafana/mimir/pkg/util" - util_log "github.com/grafana/mimir/pkg/util/log" util_math "github.com/grafana/mimir/pkg/util/math" "github.com/grafana/mimir/pkg/util/validation" ) @@ -379,10 +378,6 @@ func New(cfg Config, clientConfig ingester_client.Config, limits *validation.Ove } func (d *Distributor) starting(ctx context.Context) error { - if d.cfg.InstanceLimits != (InstanceLimits{}) { - util_log.WarnExperimentalUse("distributor instance limits") - } - // Only report success if all sub-services start properly return services.StartManagerAndAwaitHealthy(ctx, d.subservices) } diff --git a/pkg/ingester/ingester.go b/pkg/ingester/ingester.go index f2c6469359f..948852e4f1f 100644 --- a/pkg/ingester/ingester.go +++ b/pkg/ingester/ingester.go @@ -126,7 +126,7 @@ type Config struct { ActiveSeriesMetricsIdleTimeout time.Duration `yaml:"active_series_metrics_idle_timeout" category:"advanced"` ActiveSeriesCustomTrackers ActiveSeriesCustomTrackersConfig `yaml:"active_series_custom_trackers" doc:"description=Additional custom trackers for active metrics. If there are active series matching a provided matcher (map value), the count will be exposed in the custom trackers metric labeled using the tracker name (map key). Zero valued counts are not exposed (and removed when they go back to zero)."` - ExemplarsUpdatePeriod time.Duration `yaml:"exemplars_update_period" category:"advanced"` + ExemplarsUpdatePeriod time.Duration `yaml:"exemplars_update_period" category:"experimental"` BlocksStorageConfig mimir_tsdb.BlocksStorageConfig `yaml:"-"` StreamChunksWhenUsingBlocks bool `yaml:"-"` @@ -157,9 +157,9 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.BoolVar(&cfg.StreamChunksWhenUsingBlocks, "ingester.stream-chunks-when-using-blocks", true, "Stream chunks from ingesters to queriers.") f.DurationVar(&cfg.ExemplarsUpdatePeriod, "ingester.exemplars-update-period", 15*time.Second, "Period with which to update per-user max exemplars.") - f.Float64Var(&cfg.DefaultLimits.MaxIngestionRate, "ingester.instance-limits.max-ingestion-rate", 0, "Max ingestion rate (samples/sec) that ingester will accept. This limit is per-ingester, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. This limit only works when using blocks engine. 0 = unlimited.") - f.Int64Var(&cfg.DefaultLimits.MaxInMemoryTenants, "ingester.instance-limits.max-tenants", 0, "Max users that this ingester can hold. Requests from additional users will be rejected. This limit only works when using blocks engine. 0 = unlimited.") - f.Int64Var(&cfg.DefaultLimits.MaxInMemorySeries, "ingester.instance-limits.max-series", 0, "Max series that this ingester can hold (across all tenants). Requests to create additional series will be rejected. This limit only works when using blocks engine. 0 = unlimited.") + f.Float64Var(&cfg.DefaultLimits.MaxIngestionRate, "ingester.instance-limits.max-ingestion-rate", 0, "Max ingestion rate (samples/sec) that ingester will accept. This limit is per-ingester, not per-tenant. Additional push requests will be rejected. Current ingestion rate is computed as exponentially weighted moving average, updated every second. 0 = unlimited.") + f.Int64Var(&cfg.DefaultLimits.MaxInMemoryTenants, "ingester.instance-limits.max-tenants", 0, "Max users (also referred to as 'tenants') that this ingester can hold. Requests from additional users will be rejected. 0 = unlimited.") + f.Int64Var(&cfg.DefaultLimits.MaxInMemorySeries, "ingester.instance-limits.max-series", 0, "Max series that this ingester can hold (across all tenants). Requests to create additional series will be rejected. 0 = unlimited.") f.Int64Var(&cfg.DefaultLimits.MaxInflightPushRequests, "ingester.instance-limits.max-inflight-push-requests", 30000, "Max inflight push requests that this ingester can handle (across all tenants). Additional requests will be rejected. 0 = unlimited.") f.StringVar(&cfg.IgnoreSeriesLimitForMetricNames, "ingester.ignore-series-limit-for-metric-names", "", "Comma-separated list of metric names, for which the -ingester.max-global-series-per-metric limit will be ignored. Does not affect the -ingester.max-global-series-per-user limit.") @@ -426,11 +426,6 @@ func (i *Ingester) stopping(_ error) error { } func (i *Ingester) updateLoop(ctx context.Context) error { - if limits := i.getInstanceLimits(); limits != nil && *limits != (InstanceLimits{}) { - // This check will not cover enabling instance limits in runtime, but it will do for now. - util_log.WarnExperimentalUse("ingester instance limits") - } - rateUpdateTicker := time.NewTicker(i.cfg.RateUpdatePeriod) defer rateUpdateTicker.Stop() diff --git a/pkg/querier/tenantfederation/tenant_federation.go b/pkg/querier/tenantfederation/tenant_federation.go index b7fe3480d7e..c35c4856577 100644 --- a/pkg/querier/tenantfederation/tenant_federation.go +++ b/pkg/querier/tenantfederation/tenant_federation.go @@ -11,9 +11,9 @@ import ( type Config struct { // Enabled switches on support for multi tenant query federation - Enabled bool `yaml:"enabled"` + Enabled bool `yaml:"enabled" category:"experimental"` } func (cfg *Config) RegisterFlags(f *flag.FlagSet) { - f.BoolVar(&cfg.Enabled, "tenant-federation.enabled", false, "If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header (experimental).") + f.BoolVar(&cfg.Enabled, "tenant-federation.enabled", false, "If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header.") } diff --git a/pkg/ruler/ruler.go b/pkg/ruler/ruler.go index 7a53d44c3fc..0589de1db29 100644 --- a/pkg/ruler/ruler.go +++ b/pkg/ruler/ruler.go @@ -156,7 +156,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.SearchPendingFor, "ruler.search-pending-for", 5*time.Minute, "Time to spend searching for a pending ruler when shutting down.") f.DurationVar(&cfg.FlushCheckPeriod, "ruler.flush-period", 1*time.Minute, "Period with which to attempt to flush rule groups.") f.StringVar(&cfg.RulePath, "ruler.rule-path", "/rules", "file path to store temporary rule files for the prometheus rule managers") - f.BoolVar(&cfg.EnableAPI, "experimental.ruler.enable-api", false, "Enable the ruler api") + f.BoolVar(&cfg.EnableAPI, "ruler.enable-api", false, "Enable the ruler api") f.DurationVar(&cfg.OutageTolerance, "ruler.for-outage-tolerance", time.Hour, `Max time to tolerate outage for restoring "for" state of alert.`) f.DurationVar(&cfg.ForGracePeriod, "ruler.for-grace-period", 10*time.Minute, `Minimum duration between alert and restored "for" state. This is maintained only for alerts with configured "for" time greater than grace period.`) f.DurationVar(&cfg.ResendDelay, "ruler.resend-delay", time.Minute, `Minimum amount of time to wait before resending an alert to Alertmanager.`) diff --git a/pkg/storage/tsdb/config.go b/pkg/storage/tsdb/config.go index 2221474e015..777b3324f12 100644 --- a/pkg/storage/tsdb/config.go +++ b/pkg/storage/tsdb/config.go @@ -149,7 +149,7 @@ type TSDBConfig struct { HeadCompactionConcurrency int `yaml:"head_compaction_concurrency"` HeadCompactionIdleTimeout time.Duration `yaml:"head_compaction_idle_timeout"` HeadChunksWriteBufferSize int `yaml:"head_chunks_write_buffer_size_bytes"` - HeadChunksEndTimeVariance float64 `yaml:"head_chunks_end_time_variance" doc:"hidden"` + HeadChunksEndTimeVariance float64 `yaml:"head_chunks_end_time_variance" category:"experimental"` StripeSize int `yaml:"stripe_size"` WALCompressionEnabled bool `yaml:"wal_compression_enabled"` WALSegmentSizeBytes int `yaml:"wal_segment_size_bytes"` @@ -267,8 +267,8 @@ type BucketStoreConfig struct { // Chunk pool. MaxChunkPoolBytes uint64 `yaml:"max_chunk_pool_bytes"` - ChunkPoolMinBucketSizeBytes int `yaml:"chunk_pool_min_bucket_size_bytes" doc:"hidden"` - ChunkPoolMaxBucketSizeBytes int `yaml:"chunk_pool_max_bucket_size_bytes" doc:"hidden"` + ChunkPoolMinBucketSizeBytes int `yaml:"chunk_pool_min_bucket_size_bytes" category:"advanced"` + ChunkPoolMaxBucketSizeBytes int `yaml:"chunk_pool_max_bucket_size_bytes" category:"advanced"` // Series hash cache. SeriesHashCacheMaxBytes uint64 `yaml:"series_hash_cache_max_size_bytes"` @@ -278,15 +278,14 @@ type BucketStoreConfig struct { IndexHeaderLazyLoadingIdleTimeout time.Duration `yaml:"index_header_lazy_loading_idle_timeout"` // Controls the partitioner, used to aggregate multiple GET object API requests. - // The config option is hidden until experimental. - PartitionerMaxGapBytes uint64 `yaml:"partitioner_max_gap_bytes" doc:"hidden"` + PartitionerMaxGapBytes uint64 `yaml:"partitioner_max_gap_bytes" category:"advanced"` // Controls what is the ratio of postings offsets store will hold in memory. // Larger value will keep less offsets, which will increase CPU cycles needed for query touching those postings. // It's meant for setups that want low baseline memory pressure and where less traffic is expected. // On the contrary, smaller value will increase baseline memory usage, but improve latency slightly. // 1 will keep all in memory. Default value is the same as in Prometheus which gives a good balance. - PostingOffsetsInMemSampling int `yaml:"postings_offsets_in_mem_sampling" doc:"hidden"` + PostingOffsetsInMemSampling int `yaml:"postings_offsets_in_mem_sampling" category:"advanced"` } // RegisterFlags registers the BucketStore flags diff --git a/pkg/util/validation/limits.go b/pkg/util/validation/limits.go index fa6ae8eae30..8246339fded 100644 --- a/pkg/util/validation/limits.go +++ b/pkg/util/validation/limits.go @@ -46,7 +46,7 @@ type Limits struct { CreationGracePeriod model.Duration `yaml:"creation_grace_period" json:"creation_grace_period"` EnforceMetadataMetricName bool `yaml:"enforce_metadata_metric_name" json:"enforce_metadata_metric_name"` IngestionTenantShardSize int `yaml:"ingestion_tenant_shard_size" json:"ingestion_tenant_shard_size"` - MetricRelabelConfigs []*relabel.Config `yaml:"metric_relabel_configs,omitempty" json:"metric_relabel_configs,omitempty" doc:"nocli|description=List of metric relabel configurations. Note that in most situations, it is more effective to use metrics relabeling directly in the Prometheus server, e.g. remote_write.write_relabel_configs."` + MetricRelabelConfigs []*relabel.Config `yaml:"metric_relabel_configs,omitempty" json:"metric_relabel_configs,omitempty" doc:"nocli|description=List of metric relabel configurations. Note that in most situations, it is more effective to use metrics relabeling directly in the Prometheus server, e.g. remote_write.write_relabel_configs." category:"experimental"` // Ingester enforced limits. // Series @@ -56,7 +56,7 @@ type Limits struct { MaxGlobalMetricsWithMetadataPerUser int `yaml:"max_global_metadata_per_user" json:"max_global_metadata_per_user"` MaxGlobalMetadataPerMetric int `yaml:"max_global_metadata_per_metric" json:"max_global_metadata_per_metric"` // Exemplars - MaxGlobalExemplarsPerUser int `yaml:"max_global_exemplars_per_user" json:"max_global_exemplars_per_user"` + MaxGlobalExemplarsPerUser int `yaml:"max_global_exemplars_per_user" json:"max_global_exemplars_per_user" category:"experimental"` // Querier enforced limits. MaxChunksPerQuery int `yaml:"max_fetched_chunks_per_query" json:"max_fetched_chunks_per_query"` diff --git a/tools/doc-generator/parser.go b/tools/doc-generator/parser.go index 03b1e6f7aa8..70dd936a132 100644 --- a/tools/doc-generator/parser.go +++ b/tools/doc-generator/parser.go @@ -65,11 +65,20 @@ type configEntry struct { root bool // In case the kind is "field" - fieldFlag string - fieldDesc string - fieldType string - fieldDefault string - fieldExample *fieldExample + fieldFlag string + fieldDesc string + fieldType string + fieldDefault string + fieldExample *fieldExample + fieldCategory string +} + +func (e configEntry) description() string { + if e.fieldCategory == "" || e.fieldCategory == "basic" { + return e.fieldDesc + } + + return fmt.Sprintf("[%s] %s", e.fieldCategory, e.fieldDesc) } type rootBlock struct { @@ -218,25 +227,27 @@ func parseConfig(block *configBlock, cfg interface{}, flags map[uintptr]*flag.Fl } if fieldFlag == nil { block.Add(&configEntry{ - kind: "field", - name: fieldName, - required: isFieldRequired(field), - fieldDesc: getFieldDescription(field, ""), - fieldType: fieldType, - fieldExample: getFieldExample(fieldName, field.Type), + kind: "field", + name: fieldName, + required: isFieldRequired(field), + fieldDesc: getFieldDescription(field, ""), + fieldType: fieldType, + fieldExample: getFieldExample(fieldName, field.Type), + fieldCategory: getFieldCategory(field), }) continue } block.Add(&configEntry{ - kind: "field", - name: fieldName, - required: isFieldRequired(field), - fieldFlag: fieldFlag.Name, - fieldDesc: getFieldDescription(field, fieldFlag.Usage), - fieldType: fieldType, - fieldDefault: fieldFlag.DefValue, - fieldExample: getFieldExample(fieldName, field.Type), + kind: "field", + name: fieldName, + required: isFieldRequired(field), + fieldFlag: fieldFlag.Name, + fieldDesc: getFieldDescription(field, fieldFlag.Usage), + fieldType: fieldType, + fieldDefault: fieldFlag.DefValue, + fieldExample: getFieldExample(fieldName, field.Type), + fieldCategory: getFieldCategory(field), }) } @@ -368,13 +379,14 @@ func getCustomFieldEntry(field reflect.StructField, fieldValue reflect.Value, fl } return &configEntry{ - kind: "field", - name: getFieldName(field), - required: isFieldRequired(field), - fieldFlag: fieldFlag.Name, - fieldDesc: fieldFlag.Usage, - fieldType: "string", - fieldDefault: fieldFlag.DefValue, + kind: "field", + name: getFieldName(field), + required: isFieldRequired(field), + fieldFlag: fieldFlag.Name, + fieldDesc: fieldFlag.Usage, + fieldType: "string", + fieldDefault: fieldFlag.DefValue, + fieldCategory: getFieldCategory(field), }, nil } if field.Type == reflect.TypeOf(flagext.URLValue{}) { @@ -384,13 +396,14 @@ func getCustomFieldEntry(field reflect.StructField, fieldValue reflect.Value, fl } return &configEntry{ - kind: "field", - name: getFieldName(field), - required: isFieldRequired(field), - fieldFlag: fieldFlag.Name, - fieldDesc: fieldFlag.Usage, - fieldType: "url", - fieldDefault: fieldFlag.DefValue, + kind: "field", + name: getFieldName(field), + required: isFieldRequired(field), + fieldFlag: fieldFlag.Name, + fieldDesc: fieldFlag.Usage, + fieldType: "url", + fieldDefault: fieldFlag.DefValue, + fieldCategory: getFieldCategory(field), }, nil } if field.Type == reflect.TypeOf(flagext.Secret{}) { @@ -400,13 +413,14 @@ func getCustomFieldEntry(field reflect.StructField, fieldValue reflect.Value, fl } return &configEntry{ - kind: "field", - name: getFieldName(field), - required: isFieldRequired(field), - fieldFlag: fieldFlag.Name, - fieldDesc: fieldFlag.Usage, - fieldType: "string", - fieldDefault: fieldFlag.DefValue, + kind: "field", + name: getFieldName(field), + required: isFieldRequired(field), + fieldFlag: fieldFlag.Name, + fieldDesc: fieldFlag.Usage, + fieldType: "string", + fieldDefault: fieldFlag.DefValue, + fieldCategory: getFieldCategory(field), }, nil } if field.Type == reflect.TypeOf(model.Duration(0)) { @@ -416,13 +430,14 @@ func getCustomFieldEntry(field reflect.StructField, fieldValue reflect.Value, fl } return &configEntry{ - kind: "field", - name: getFieldName(field), - required: isFieldRequired(field), - fieldFlag: fieldFlag.Name, - fieldDesc: fieldFlag.Usage, - fieldType: "duration", - fieldDefault: fieldFlag.DefValue, + kind: "field", + name: getFieldName(field), + required: isFieldRequired(field), + fieldFlag: fieldFlag.Name, + fieldDesc: fieldFlag.Usage, + fieldType: "duration", + fieldDefault: fieldFlag.DefValue, + fieldCategory: getFieldCategory(field), }, nil } if field.Type == reflect.TypeOf(flagext.Time{}) { @@ -432,19 +447,23 @@ func getCustomFieldEntry(field reflect.StructField, fieldValue reflect.Value, fl } return &configEntry{ - kind: "field", - name: getFieldName(field), - required: isFieldRequired(field), - fieldFlag: fieldFlag.Name, - fieldDesc: fieldFlag.Usage, - fieldType: "time", - fieldDefault: fieldFlag.DefValue, + kind: "field", + name: getFieldName(field), + required: isFieldRequired(field), + fieldFlag: fieldFlag.Name, + fieldDesc: fieldFlag.Usage, + fieldType: "time", + fieldDefault: fieldFlag.DefValue, + fieldCategory: getFieldCategory(field), }, nil } return nil, nil } +func getFieldCategory(field reflect.StructField) string { + return field.Tag.Get("category") +} func isFieldHidden(f reflect.StructField) bool { return getDocTagFlag(f, "hidden") } diff --git a/tools/doc-generator/writer.go b/tools/doc-generator/writer.go index 769f1466e72..5a1c49e3783 100644 --- a/tools/doc-generator/writer.go +++ b/tools/doc-generator/writer.go @@ -63,7 +63,7 @@ func (w *specWriter) writeConfigEntry(e *configEntry, indent int) { if e.kind == "field" { // Description - w.writeComment(e.fieldDesc, indent, 0) + w.writeComment(e.description(), indent, 0) w.writeExample(e.fieldExample, indent) w.writeFlag(e.fieldFlag, indent) From f99dcea657fb50f7a7d394efedcca85314479920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Tue, 1 Feb 2022 10:42:52 +0100 Subject: [PATCH 063/168] Update shuffle sharding documentation. (#903) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update shuffle sharding documentation. Signed-off-by: Peter Štibraný * Apply suggestions from code review Co-authored-by: Mauro Stettler * Apply suggestions from code review Co-authored-by: Ursula Kallio <73951760+osg-grafana@users.noreply.github.com> * Update docs/sources/guides/shuffle-sharding.md Co-authored-by: Ursula Kallio <73951760+osg-grafana@users.noreply.github.com> * Fix list syntax. Signed-off-by: Peter Štibraný * Apply suggestions from code review Co-authored-by: Ursula Kallio <73951760+osg-grafana@users.noreply.github.com> Co-authored-by: Mauro Stettler Co-authored-by: Ursula Kallio <73951760+osg-grafana@users.noreply.github.com> --- docs/sources/guides/shuffle-sharding.md | 48 ++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/sources/guides/shuffle-sharding.md b/docs/sources/guides/shuffle-sharding.md index 42d0d2f17a5..4bee3b3339b 100644 --- a/docs/sources/guides/shuffle-sharding.md +++ b/docs/sources/guides/shuffle-sharding.md @@ -5,35 +5,33 @@ weight: 10 slug: shuffle-sharding --- -Cortex leverages on sharding techniques to horizontally scale both single and multi-tenant clusters beyond the capacity of a single node. +Grafana Mimir leverages sharding techniques to horizontally scale both single- and multi-tenant clusters beyond the capacity of a single node. ## Background -The **default sharding strategy** employed by Cortex distributes the workload across the entire pool of instances running a given service (eg. ingesters). For example, on the write path each tenant's series are sharded across all ingesters, regardless how many active series the tenant has or how many different tenants are in the cluster. +Grafana Mimir uses a sharding strategy that distributes the workload across a subset of the instances that run a given service, such as the ingesters. For example, on the write path, each tenant's series are sharded across a subset of the ingesters. The size of this subset, which is the number of instances, is configured using the `shard size` parameter, whose default value is `0`. This default value means that each tenant uses **all** available instances, in order to fairly balance resources, such as CPU and memory usage, to maximize the usage of these resources across the cluster. -The default strategy allows to have a fair balance on the resources consumed by each instance (ie. CPU and memory) and to maximise these resources across the cluster. +> **Note:** In a multi-tenant cluster this default (`0`) value introduces some downsides: -However, in a **multi-tenant** cluster this approach also introduces some **downsides**: +- An outage affects all tenants +- A misbehaving tenant, which for example causes an out-of-memory error, could negatively affect all other tenants. -1. An outage affects all tenants -1. A misbehaving tenant (eg. causing out of memory) could affect all other tenants - -The goal of **shuffle sharding** is to provide an alternative sharding strategy to reduce the blast radius of an outage and better isolate tenants. +Configuring a shard size value higher than zero enables **shuffle sharding**. The goal of **shuffle sharding** is to reduce the blast radius of an outage and better isolate tenants. ## What is shuffle sharding -Shuffle sharding is a technique used to isolate different tenant's workloads and to give each tenant a single-tenant experience even if they're running in a shared cluster. This technique has been publicly shared and clearly explained by AWS in their [builders' library](https://aws.amazon.com/builders-library/workload-isolation-using-shuffle-sharding/) and a reference implementation has been shown in the [Route53 Infima library](https://github.com/awslabs/route53-infima/blob/master/src/main/java/com/amazonaws/services/route53/infima/SimpleSignatureShuffleSharder.java). +Shuffle sharding is a technique that isolates different tenant's workloads and gives each tenant a single-tenant experience even if they're running in a shared cluster. For details, see how AWS answers the question [What is shuffle sharding?](https://aws.amazon.com/builders-library/workload-isolation-using-shuffle-sharding/) and a reference implementation within the [Route53 Infima library](https://github.com/awslabs/route53-infima/blob/master/src/main/java/com/amazonaws/services/route53/infima/SimpleSignatureShuffleSharder.java). -The idea is to assign each tenant a shard composed by a subset of the Cortex service instances, aiming to minimize the overlapping instances between two different tenants. Shuffle sharding brings the following **benefits** over the default sharding strategy: +The idea is to assign each tenant a shard that is composed of a subset of the Grafana Mimir service instances, which minimizes the number of overlapping instances between two different tenants. Shuffle sharding has the following benefits: -- An outage on some Cortex cluster instances/nodes will only affect a subset of tenants. -- A misbehaving tenant will affect only its shard instances. Due to the low overlap of instances between different tenants, it's statistically quite likely that any other tenant will run on different instances or only a subset of instances will match the affected ones. +- An outage on some Grafana Mimir cluster instances or nodes will only affect a subset of tenants. +- A misbehaving tenant only affects its shard instances. Due to the low overlap of instances between different tenants, it’s statistically likely that any other tenant will run on different instances or that only a subset of instances will match the affected ones. -Shuffle sharding requires no more resources than the default sharding strategy but instances may be less evenly balanced from time to time. +Using shuffle sharding doesn’t require more resources, but instances will not be evenly balanced. ### Low overlapping instances probability -For example, given a Cortex cluster running **50 ingesters** and assigning **each tenant 4** out of 50 ingesters, shuffling instances between each tenant, we get **230K possible combinations**. +For example, given that a Grafana Mimir cluster that is running 50 ingesters and assigning each tenant 4 out of 50 ingesters, by shuffling instances between each tenant, there are 230K possible combinations. Randomly picking two different tenants we have the: @@ -47,20 +45,22 @@ Randomly picking two different tenants we have the: -## Cortex shuffle sharding +## Grafana Mimir shuffle sharding -Cortex currently supports shuffle sharding in the following services: +Grafana Mimir supports shuffle sharding in the following services: - [Ingesters](#ingesters-shuffle-sharding) - [Query-frontend / Query-scheduler](#query-frontend-and-query-scheduler-shuffle-sharding) - [Store-gateway](#store-gateway-shuffle-sharding) - [Ruler](#ruler-shuffle-sharding) -Shuffle sharding is **disabled by default** and needs to be explicitly enabled in the configuration. +If the default value of the shard size is `0`, shuffle sharding is disabled and you need to explicitly enable by increasing the shard size either globally or for a given tenant. + +> **Note:** If the shard-size value is higher than the number of available instances, for example where `-distributor.ingestion-tenant-shard-size` is higher than the number of ingesters, then shuffle-sharding is disabled and all instances are used again. ### Guaranteed properties -The Cortex shuffle sharding implementation guarantees the following properties: +The Grafana Mimir shuffle sharding implementation provides the following benefits: - **Stability**
Given a consistent state of the hash ring, the shuffle sharding algorithm always selects the same instances for a given tenant, even across different machines. @@ -73,7 +73,7 @@ The Cortex shuffle sharding implementation guarantees the following properties: ### Ingesters shuffle sharding -By default the Cortex distributor spreads the received series across all running ingesters. +By default, the Grafana Mimir distributor spreads the received series across all running ingesters. When shuffle sharding is **enabled** for the ingesters, the distributor and ruler on the **write path** spread each tenant series across `-distributor.ingestion-tenant-shard-size` number of ingesters, while on the **read path** the querier and ruler queries only the subset of ingesters holding the series for a given tenant. @@ -84,7 +84,7 @@ _The shard size can be overridden on a per-tenant basis in the limits overrides To enable shuffle-sharding for ingesters on the write path you need to configure the following CLI flags (or their respective YAML config options) to **distributor**, **ingester** and **ruler**: - `-distributor.ingestion-tenant-shard-size=`
- `` set to the number of ingesters each tenant series should be sharded to. If `` is zero or greater than the number of available ingesters in the Cortex cluster, the tenant series are sharded across all ingesters. + `` set to the number of ingesters each tenant series should be sharded to. If `` is zero or greater than the number of available ingesters in the Grafana Mimir cluster, the tenant series are sharded across all ingesters. #### Ingesters read path @@ -96,7 +96,7 @@ Assuming shuffle-sharding has been enabled for the write path, to enable shuffle #### Rollout strategy -If you're running a Cortex cluster with shuffle-sharding disabled and you want to enable it for ingesters, the following rollout strategy should be used to avoid missing querying any time-series in the ingesters memory: +If you’re running a Grafana Mimir cluster with shuffle sharding disabled, and you want to enable it for ingesters, use the following rollout strategy to avoid missing querying any time-series in the ingesters memory: 1. Enable ingesters shuffle-sharding on the **write path** 2. **Wait** at least `-querier.shuffle-sharding-ingesters-lookback-period` time @@ -104,7 +104,7 @@ If you're running a Cortex cluster with shuffle-sharding disabled and you want t #### Limitation: decreasing the tenant shard size -The current shuffle-sharding implementation in Cortex has a limitation which prevents to safely decrease the tenant shard size if the ingesters shuffle-sharding is enabled on the read path. +The current shuffle-sharding implementation in Grafana Mimir has a limitation that prevents you from safely decreasing the tenant shard size if the ingesters’ shuffle-sharding is enabled on the read path. The problem is that if a tenant’s subring decreases in size, there is currently no way for the queriers and rulers to know how big the tenant subring was previously, and hence they will potentially miss an ingester with data for that tenant. In other words, the lookback mechanism to select the ingesters which may have received series since 'now - lookback period' doesn't work correctly if the tenant shard size is decreased. @@ -117,7 +117,7 @@ This is deemed an infrequent operation that we considered banning, but a workaro ### Query-frontend and Query-scheduler shuffle sharding -By default all Cortex queriers can execute received queries for given tenant. +By default, all Grafana Mimir queriers can execute received queries for a given tenant. When shuffle sharding is **enabled** by setting `-frontend.max-queriers-per-tenant` (or its respective YAML config option) to a value higher than 0 and lower than the number of available queriers, only specified number of queriers will execute queries for single tenant. @@ -129,7 +129,7 @@ _The maximum number of queriers can be overridden on a per-tenant basis in the l In the event a tenant is repeatedly sending a "query of death" which leads the querier to crash or getting killed because of out-of-memory, the crashed querier will get disconnected from the query-frontend or query-scheduler and a new querier will be immediately assigned to the tenant's shard. This practically invalidates the assumption that shuffle-sharding can be used to contain the blast radius in case of a query of death. -To mitigate it, Cortex allows to configure a delay between when a querier disconnects because of a crash and when the crashed querier is actually removed from the tenant's shard (and another healthy querier is added as replacement). A delay of 1 minute may be a reasonable trade-off: +To mitigate it, Grafana Mimir allows you to configure a delay between when a querier disconnects because of a crash and when the crashed querier is actually removed from the tenant’s shard (and another healthy querier is added as a replacement). A delay of 1 minute might be a reasonable trade-off: - Query-frontend: `-query-frontend.querier-forget-delay=1m` - Query-scheduler: `-query-scheduler.querier-forget-delay=1m` From 56dccbf78525a5aedee2ea83181af8072f7eec30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Tue, 1 Feb 2022 11:53:50 +0100 Subject: [PATCH 064/168] Removed optional sharding from store gateway. (#976) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Removed -store-gateway.sharding-enabled, -querier.store-gateway-addresses and changed -store-gateway.sharding-ring.store default value to memberlist, and -store-gateway.sharding-ring.wait-stability-min-duration to 0. Signed-off-by: Peter Štibraný * Added CHANGELOG.md --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 8 +- cmd/mimir/help.txt.tmpl | 8 +- .../config/mimir.yaml | 1 - .../tsdb-blocks-storage-s3/config/mimir.yaml | 13 -- .../config/mimir.yaml | 1 - docs/sources/blocks-storage/querier.md | 7 - docs/sources/blocks-storage/store-gateway.md | 16 +- .../configuration/config-file-reference.md | 22 +-- ...single-process-config-blocks-gossip-1.yaml | 1 - ...single-process-config-blocks-gossip-2.yaml | 1 - integration/backward_compatibility.go | 1 + integration/backward_compatibility_test.go | 3 +- integration/e2emimir/services.go | 8 - ...getting_started_with_gossiped_ring_test.go | 20 +- ...tegration_memberlist_single_binary_test.go | 23 +-- integration/querier_test.go | 51 ++--- integration/ruler_test.go | 23 +-- .../mimir-tests/test-defaults-generated.yaml | 3 +- ...est-disable-chunk-streaming-generated.yaml | 4 +- .../test-query-sharding-generated.yaml | 4 +- .../test-shuffle-sharding-generated.yaml | 4 +- .../test-storage-azure-generated.yaml | 4 +- .../test-storage-gcs-generated.yaml | 4 +- .../test-storage-s3-generated.yaml | 4 +- operations/mimir/config.libsonnet | 1 - operations/mimir/store-gateway.libsonnet | 1 + pkg/mimir/mimir_test.go | 6 + pkg/mimir/modules.go | 6 - pkg/querier/blocks_store_balanced_set.go | 108 ----------- pkg/querier/blocks_store_balanced_set_test.go | 152 --------------- pkg/querier/blocks_store_queryable.go | 43 ++--- pkg/querier/querier.go | 13 +- .../bucket_index_metadata_fetcher_test.go | 22 ++- pkg/storegateway/bucket_stores_test.go | 12 +- pkg/storegateway/gateway.go | 177 ++++++++---------- pkg/storegateway/gateway_ring.go | 3 +- pkg/storegateway/gateway_ring_http.go | 5 - pkg/storegateway/gateway_test.go | 56 ++---- pkg/storegateway/sharding_strategy.go | 15 -- 40 files changed, 207 insertions(+), 648 deletions(-) delete mode 100644 pkg/querier/blocks_store_balanced_set.go delete mode 100644 pkg/querier/blocks_store_balanced_set_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c4990b341c..796098cc3d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -244,6 +244,7 @@ * [CHANGE] Querier: removed `-querier.worker-match-max-concurrent` and `-querier.worker-parallelism` CLI flags (and their respective YAML config options). Mimir now behaves like if `-querier.worker-match-max-concurrent` is always enabled and you should configure the max concurrency per querier process using `-querier.max-concurrent` instead. #958 * [CHANGE] Distributor: change default value of `-distributor.instance-limits.max-inflight-push-requests` to `2000`. #964 * [CHANGE] Distributor: change default value of `-distributor.remote-timeout` from `2s` to `20s`. #970 +* [CHANGE] Store-gateway: options `-store-gateway.sharding-enabled` and `-querier.store-gateway-addresses` were removed. Default value of `-store-gateway.sharding-ring.store` is now `memberlist` and default value for `-store-gateway.sharding-ring.wait-stability-min-duration` changed from `1m` to `0` (disabled). #976 * [CHANGE] Ingester: change default value of `-ingester.final-sleep` from `30s` to `0s`. #981 * [CHANGE] Ruler: `-experimental.ruler.enable-api` flag has been renamed to `-ruler.enable-api` and is now stable. #913 * [CHANGE] Alertmanager: `-experimental.alertmanager.enable-api` flag has been renamed to `-alertmanager.enable-api` and is now stable. #913 diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index abd0d14260f..1577fee237e 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -1167,8 +1167,6 @@ Usage of ./cmd/mimir/mimir: Hostname (and port) of scheduler that querier will periodically resolve, connect to and receive queries from. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint. -querier.shuffle-sharding-ingesters-lookback-period duration When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured 'query store after' and 'query ingesters within'. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled). - -querier.store-gateway-addresses string - Comma separated list of store-gateway addresses in DNS Service Discovery format. This option should be set when the store-gateway sharding is disabled (when enabled, the store-gateway instances form a ring and addresses are picked from the ring). -querier.store-gateway-client.tls-ca-path string Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. -querier.store-gateway-client.tls-cert-path string @@ -1547,8 +1545,6 @@ Usage of ./cmd/mimir/mimir: Base path to serve all API routes from (e.g. /v1/) -server.register-instrumentation Register the intrumentation handlers (/metrics etc). (default true) - -store-gateway.sharding-enabled - Shard blocks across multiple store gateway instances. This option needs be set both on the store-gateway and querier when running in microservices mode. -store-gateway.sharding-ring.consul.acl-token string ACL Token used to interact with Consul. -store-gateway.sharding-ring.consul.client-timeout duration @@ -1610,7 +1606,7 @@ Usage of ./cmd/mimir/mimir: -store-gateway.sharding-ring.replication-factor int The replication factor to use when sharding blocks. This option needs be set both on the store-gateway and querier when running in microservices mode. (default 3) -store-gateway.sharding-ring.store string - Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "memberlist") -store-gateway.sharding-ring.tokens-file-path string File path where tokens are stored. If empty, tokens are not stored at shutdown and restored at startup. -store-gateway.sharding-ring.unregister-on-shutdown @@ -1618,7 +1614,7 @@ Usage of ./cmd/mimir/mimir: -store-gateway.sharding-ring.wait-stability-max-duration duration Maximum time to wait for ring stability at startup. If the store-gateway ring keeps changing after this period of time, the store-gateway will start anyway. (default 5m0s) -store-gateway.sharding-ring.wait-stability-min-duration duration - Minimum time to wait for ring stability at startup. 0 to disable. (default 1m0s) + Minimum time to wait for ring stability at startup, if set to positive value. -store-gateway.sharding-ring.zone-awareness-enabled True to enable zone-awareness and replicate blocks across different availability zones. -store-gateway.tenant-shard-size int diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 8c2bce53a1e..c6c03cc7422 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -811,8 +811,6 @@ Usage of ./cmd/mimir/mimir: Hostname (and port) of scheduler that querier will periodically resolve, connect to and receive queries from. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint. -querier.shuffle-sharding-ingesters-lookback-period duration When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured 'query store after' and 'query ingesters within'. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled). - -querier.store-gateway-addresses string - Comma separated list of store-gateway addresses in DNS Service Discovery format. This option should be set when the store-gateway sharding is disabled (when enabled, the store-gateway instances form a ring and addresses are picked from the ring). -querier.timeout duration The timeout for a query. This config option should be set on query-frontend too when query sharding is enabled. (default 2m0s) -query-scheduler.grpc-client-config.backoff-max-period duration @@ -1101,8 +1099,6 @@ Usage of ./cmd/mimir/mimir: Base path to serve all API routes from (e.g. /v1/) -server.register-instrumentation Register the intrumentation handlers (/metrics etc). (default true) - -store-gateway.sharding-enabled - Shard blocks across multiple store gateway instances. This option needs be set both on the store-gateway and querier when running in microservices mode. -store-gateway.sharding-ring.consul.hostname string Hostname and port of Consul. (default "localhost:8500") -store-gateway.sharding-ring.etcd.endpoints value @@ -1128,7 +1124,7 @@ Usage of ./cmd/mimir/mimir: -store-gateway.sharding-ring.replication-factor int The replication factor to use when sharding blocks. This option needs be set both on the store-gateway and querier when running in microservices mode. (default 3) -store-gateway.sharding-ring.store string - Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") + Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "memberlist") -store-gateway.sharding-ring.tokens-file-path string File path where tokens are stored. If empty, tokens are not stored at shutdown and restored at startup. -store-gateway.sharding-ring.unregister-on-shutdown @@ -1136,7 +1132,7 @@ Usage of ./cmd/mimir/mimir: -store-gateway.sharding-ring.wait-stability-max-duration duration Maximum time to wait for ring stability at startup. If the store-gateway ring keeps changing after this period of time, the store-gateway will start anyway. (default 5m0s) -store-gateway.sharding-ring.wait-stability-min-duration duration - Minimum time to wait for ring stability at startup. 0 to disable. (default 1m0s) + Minimum time to wait for ring stability at startup, if set to positive value. -store-gateway.sharding-ring.zone-awareness-enabled True to enable zone-awareness and replicate blocks across different availability zones. -store-gateway.tenant-shard-size int diff --git a/development/tsdb-blocks-storage-s3-single-binary/config/mimir.yaml b/development/tsdb-blocks-storage-s3-single-binary/config/mimir.yaml index c09a90f3829..e28b7c1643b 100644 --- a/development/tsdb-blocks-storage-s3-single-binary/config/mimir.yaml +++ b/development/tsdb-blocks-storage-s3-single-binary/config/mimir.yaml @@ -29,7 +29,6 @@ querier: query_ingesters_within: 3h store_gateway: - sharding_enabled: true sharding_ring: replication_factor: 1 kvstore: diff --git a/development/tsdb-blocks-storage-s3/config/mimir.yaml b/development/tsdb-blocks-storage-s3/config/mimir.yaml index 62eec47b19c..f343119d2aa 100644 --- a/development/tsdb-blocks-storage-s3/config/mimir.yaml +++ b/development/tsdb-blocks-storage-s3/config/mimir.yaml @@ -34,9 +34,6 @@ memberlist: querier: query_ingesters_within: 3h - # Used when the blocks sharding is disabled. - store_gateway_addresses: store-gateway-1:9008,store-gateway-2:9009 - blocks_storage: backend: s3 @@ -129,7 +126,6 @@ compactor: host: consul:8500 store_gateway: - sharding_enabled: true sharding_ring: replication_factor: 1 heartbeat_period: 5s @@ -142,14 +138,6 @@ store_gateway: frontend: query_stats_enabled: true - -frontend_worker: - frontend_address: "query-frontend:9007" - - # By setting scheduler_address, querier worker would use scheduler instead of frontend. - # scheduler_address: "query-scheduler:9012" - -query_range: split_queries_by_interval: 24h parallelize_shardable_queries: true align_queries_with_step: true @@ -163,7 +151,6 @@ query_range: frontend_worker: frontend_address: "query-frontend:9007" - match_max_concurrent: true # By setting scheduler_address, querier worker would use scheduler instead of frontend. # scheduler_address: "query-scheduler:9012" diff --git a/development/tsdb-blocks-storage-swift-single-binary/config/mimir.yaml b/development/tsdb-blocks-storage-swift-single-binary/config/mimir.yaml index 25cbd242f95..9474182a175 100644 --- a/development/tsdb-blocks-storage-swift-single-binary/config/mimir.yaml +++ b/development/tsdb-blocks-storage-swift-single-binary/config/mimir.yaml @@ -29,7 +29,6 @@ querier: query_ingesters_within: 3h store_gateway: - sharding_enabled: true sharding_ring: replication_factor: 1 kvstore: diff --git a/docs/sources/blocks-storage/querier.md b/docs/sources/blocks-storage/querier.md index b735dd2bcb7..c809ddfdd51 100644 --- a/docs/sources/blocks-storage/querier.md +++ b/docs/sources/blocks-storage/querier.md @@ -129,13 +129,6 @@ querier: # CLI flag: -querier.max-query-into-future [max_query_into_future: | default = 10m] - # Comma separated list of store-gateway addresses in DNS Service Discovery - # format. This option should be set when the store-gateway sharding is - # disabled (when enabled, the store-gateway instances form a ring and - # addresses are picked from the ring). - # CLI flag: -querier.store-gateway-addresses - [store_gateway_addresses: | default = ""] - store_gateway_client: # [advanced] Enable TLS for gRPC client connecting to store-gateway. # CLI flag: -querier.store-gateway-client.tls-enabled diff --git a/docs/sources/blocks-storage/store-gateway.md b/docs/sources/blocks-storage/store-gateway.md index 3d82005d144..99338e2447d 100644 --- a/docs/sources/blocks-storage/store-gateway.md +++ b/docs/sources/blocks-storage/store-gateway.md @@ -178,14 +178,7 @@ The `store_gateway_config` configures the store-gateway service. ```yaml store_gateway: - # Shard blocks across multiple store gateway instances. This option needs be - # set both on the store-gateway and querier when running in microservices - # mode. - # CLI flag: -store-gateway.sharding-enabled - [sharding_enabled: | default = false] - - # The hash ring configuration. This option is required only if blocks sharding - # is enabled. + # The hash ring configuration. sharding_ring: # The key-value store used to share the hash ring across multiple instances. # This option needs be set both on the store-gateway and querier when @@ -194,7 +187,7 @@ store_gateway: # Backend storage to use for the ring. Supported values are: consul, etcd, # inmemory, memberlist, multi. # CLI flag: -store-gateway.sharding-ring.store - [store: | default = "consul"] + [store: | default = "memberlist"] # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -store-gateway.sharding-ring.prefix @@ -253,9 +246,10 @@ store_gateway: # CLI flag: -store-gateway.sharding-ring.zone-awareness-enabled [zone_awareness_enabled: | default = false] - # Minimum time to wait for ring stability at startup. 0 to disable. + # Minimum time to wait for ring stability at startup, if set to positive + # value. # CLI flag: -store-gateway.sharding-ring.wait-stability-min-duration - [wait_stability_min_duration: | default = 1m] + [wait_stability_min_duration: | default = 0s] # Maximum time to wait for ring stability at startup. If the store-gateway # ring keeps changing after this period of time, the store-gateway will diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 4fd5c61b3b9..f76995b64cd 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -813,13 +813,6 @@ The `querier_config` configures the querier. # CLI flag: -querier.max-query-into-future [max_query_into_future: | default = 10m] -# Comma separated list of store-gateway addresses in DNS Service Discovery -# format. This option should be set when the store-gateway sharding is disabled -# (when enabled, the store-gateway instances form a ring and addresses are -# picked from the ring). -# CLI flag: -querier.store-gateway-addresses -[store_gateway_addresses: | default = ""] - store_gateway_client: # [advanced] Enable TLS for gRPC client connecting to store-gateway. # CLI flag: -querier.store-gateway-client.tls-enabled @@ -3391,13 +3384,7 @@ sharding_ring: The `store_gateway_config` configures the store-gateway service. ```yaml -# Shard blocks across multiple store gateway instances. This option needs be set -# both on the store-gateway and querier when running in microservices mode. -# CLI flag: -store-gateway.sharding-enabled -[sharding_enabled: | default = false] - -# The hash ring configuration. This option is required only if blocks sharding -# is enabled. +# The hash ring configuration. sharding_ring: # The key-value store used to share the hash ring across multiple instances. # This option needs be set both on the store-gateway and querier when running @@ -3406,7 +3393,7 @@ sharding_ring: # Backend storage to use for the ring. Supported values are: consul, etcd, # inmemory, memberlist, multi. # CLI flag: -store-gateway.sharding-ring.store - [store: | default = "consul"] + [store: | default = "memberlist"] # [advanced] The prefix for the keys in the store. Should end with a /. # CLI flag: -store-gateway.sharding-ring.prefix @@ -3462,9 +3449,10 @@ sharding_ring: # CLI flag: -store-gateway.sharding-ring.zone-awareness-enabled [zone_awareness_enabled: | default = false] - # Minimum time to wait for ring stability at startup. 0 to disable. + # Minimum time to wait for ring stability at startup, if set to positive + # value. # CLI flag: -store-gateway.sharding-ring.wait-stability-min-duration - [wait_stability_min_duration: | default = 1m] + [wait_stability_min_duration: | default = 0s] # Maximum time to wait for ring stability at startup. If the store-gateway # ring keeps changing after this period of time, the store-gateway will start diff --git a/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml b/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml index 7545a6b1538..6fb761583a4 100644 --- a/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml +++ b/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml @@ -78,7 +78,6 @@ blocks_storage: dir: /tmp/mimir/storage store_gateway: - sharding_enabled: true sharding_ring: kvstore: store: memberlist diff --git a/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml b/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml index d1583911807..57b467d01eb 100644 --- a/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml +++ b/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml @@ -77,7 +77,6 @@ blocks_storage: dir: /tmp/mimir/storage store_gateway: - sharding_enabled: true sharding_ring: kvstore: store: memberlist diff --git a/integration/backward_compatibility.go b/integration/backward_compatibility.go index 2bce150f132..a328cf5f4e9 100644 --- a/integration/backward_compatibility.go +++ b/integration/backward_compatibility.go @@ -8,6 +8,7 @@ var DefaultPreviousVersionImages = map[string]func(map[string]string) map[string "quay.io/cortexproject/cortex:v1.11.0": func(flags map[string]string) map[string]string { flags["-store.engine"] = "blocks" flags["-server.http-listen-port"] = "8080" + flags["-store-gateway.sharding-enabled"] = "true" return flags }, } diff --git a/integration/backward_compatibility_test.go b/integration/backward_compatibility_test.go index 6eda2ea033f..9e6bf1bc54d 100644 --- a/integration/backward_compatibility_test.go +++ b/integration/backward_compatibility_test.go @@ -24,7 +24,7 @@ import ( ) // previousVersionImages returns a list of previous image version to test backwards -// compatibility against. If MIMIR_PREVIOIS_IMAGES is set to a comma separted list of image versions, +// compatibility against. If MIMIR_PREVIOUS_IMAGES is set to a comma separted list of image versions, // then those will be used instead of the default versions. Note that the overriding of flags // is not currently possible when overriding the previous image versions via the environment variable. func previousVersionImages() map[string]func(map[string]string) map[string]string { @@ -38,6 +38,7 @@ func previousVersionImages() map[string]func(map[string]string) map[string]strin previousVersionImages[image] = func(flags map[string]string) map[string]string { flags["-store.engine"] = "blocks" flags["-server.http-listen-port"] = "8080" + flags["-store-gateway.sharding-enabled"] = "true" return flags } } diff --git a/integration/e2emimir/services.go b/integration/e2emimir/services.go index a4e6340e6d0..47c83c8104f 100644 --- a/integration/e2emimir/services.go +++ b/integration/e2emimir/services.go @@ -114,7 +114,6 @@ func NewQuerierWithConfigFile(name, consulAddress, configFile string, flags map[ // Quickly detect query-frontend and query-scheduler when running it. "-querier.dns-lookup-period": "1s", // Store-gateway ring backend. - "-store-gateway.sharding-enabled": "true", "-store-gateway.sharding-ring.store": "consul", "-store-gateway.sharding-ring.consul.hostname": consulAddress, "-store-gateway.sharding-ring.replication-factor": "1", @@ -148,13 +147,9 @@ func NewStoreGatewayWithConfigFile(name, consulAddress, configFile string, flags "-target": "store-gateway", "-log.level": "warn", // Store-gateway ring backend. - "-store-gateway.sharding-enabled": "true", "-store-gateway.sharding-ring.store": "consul", "-store-gateway.sharding-ring.consul.hostname": consulAddress, "-store-gateway.sharding-ring.replication-factor": "1", - // Startup quickly. - "-store-gateway.sharding-ring.wait-stability-min-duration": "0", - "-store-gateway.sharding-ring.wait-stability-max-duration": "0", } return NewMimirService( @@ -321,9 +316,6 @@ func NewSingleBinary(name string, flags map[string]string, image string, otherPo "-ingester.join-after": "0s", "-ingester.min-ready-duration": "0s", "-ingester.num-tokens": "512", - // Startup quickly. - "-store-gateway.sharding-ring.wait-stability-min-duration": "0", - "-store-gateway.sharding-ring.wait-stability-max-duration": "0", } return NewMimirService( diff --git a/integration/getting_started_with_gossiped_ring_test.go b/integration/getting_started_with_gossiped_ring_test.go index ec6b8bee58e..6062136ecea 100644 --- a/integration/getting_started_with_gossiped_ring_test.go +++ b/integration/getting_started_with_gossiped_ring_test.go @@ -38,17 +38,15 @@ func TestGettingStartedWithGossipedRing(t *testing.T) { // We don't care for storage part too much here. Both Mimir instances will write new blocks to /tmp, but that's fine. flags := map[string]string{ // decrease timeouts to make test faster. should still be fine with two instances only - "-ingester.join-after": "0s", // join quickly - "-ingester.observe-period": "5s", // to avoid conflicts in tokens - "-blocks-storage.bucket-store.sync-interval": "1s", // sync continuously - "-blocks-storage.backend": "s3", - "-blocks-storage.s3.bucket-name": bucketName, - "-blocks-storage.s3.access-key-id": e2edb.MinioAccessKey, - "-blocks-storage.s3.secret-access-key": e2edb.MinioSecretKey, - "-blocks-storage.s3.endpoint": fmt.Sprintf("%s-minio-9000:9000", networkName), - "-blocks-storage.s3.insecure": "true", - "-store-gateway.sharding-ring.wait-stability-min-duration": "0", // start quickly - "-store-gateway.sharding-ring.wait-stability-max-duration": "0", // start quickly + "-ingester.join-after": "0s", // join quickly + "-ingester.observe-period": "5s", // to avoid conflicts in tokens + "-blocks-storage.bucket-store.sync-interval": "1s", // sync continuously + "-blocks-storage.backend": "s3", + "-blocks-storage.s3.bucket-name": bucketName, + "-blocks-storage.s3.access-key-id": e2edb.MinioAccessKey, + "-blocks-storage.s3.secret-access-key": e2edb.MinioSecretKey, + "-blocks-storage.s3.endpoint": fmt.Sprintf("%s-minio-9000:9000", networkName), + "-blocks-storage.s3.insecure": "true", } // This mimir will fail to join the cluster configured in yaml file. That's fine. diff --git a/integration/integration_memberlist_single_binary_test.go b/integration/integration_memberlist_single_binary_test.go index e1b41ec64ee..868b88c81be 100644 --- a/integration/integration_memberlist_single_binary_test.go +++ b/integration/integration_memberlist_single_binary_test.go @@ -92,8 +92,8 @@ func testSingleBinaryEnv(t *testing.T, tlsEnabled bool, flags map[string]string) require.NoError(t, mimir2.WaitSumMetrics(e2e.Equals(3), "memberlist_client_cluster_members_count")) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(3), "memberlist_client_cluster_members_count")) - // Each Mimir instance will use (512 ingester tokens + 1 distributor token + 512 compactor tokens). - tokensPerInstance := float64(512 + 1 + 512) + // Each Mimir instance will use (512 ingester tokens + 1 distributor token + 512 compactor tokens + 512 store gateway tokens + 512 tokens seen by store-gateway client). + tokensPerInstance := float64(512 + 1 + 512 + 512 + 512) // 3 = number of instances. require.NoError(t, mimir1.WaitSumMetrics(e2e.Equals(3*tokensPerInstance), "cortex_ring_tokens_total")) require.NoError(t, mimir2.WaitSumMetrics(e2e.Equals(3*tokensPerInstance), "cortex_ring_tokens_total")) @@ -104,19 +104,20 @@ func testSingleBinaryEnv(t *testing.T, tlsEnabled bool, flags map[string]string) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(0), "memberlist_client_kv_store_value_tombstones")) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(0), "memberlist_client_kv_store_value_tombstones")) - // Tombstones should increase by three for each server that leaves (once for distributor, ingester and compactor ring) + // Tombstones should increase by four for each server that leaves (once for distributor, ingester, compactor and store-gateway ring) + tombstonesPerRemovedInstance := 4.0 require.NoError(t, s.Stop(mimir1)) require.NoError(t, mimir2.WaitSumMetrics(e2e.Equals(2*tokensPerInstance), "cortex_ring_tokens_total")) require.NoError(t, mimir2.WaitSumMetrics(e2e.Equals(2), "memberlist_client_cluster_members_count")) - require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(3), "memberlist_client_kv_store_value_tombstones")) + require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(tombstonesPerRemovedInstance), "memberlist_client_kv_store_value_tombstones")) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(2*tokensPerInstance), "cortex_ring_tokens_total")) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(2), "memberlist_client_cluster_members_count")) - require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(3), "memberlist_client_kv_store_value_tombstones")) + require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(tombstonesPerRemovedInstance), "memberlist_client_kv_store_value_tombstones")) require.NoError(t, s.Stop(mimir2)) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(1*tokensPerInstance), "cortex_ring_tokens_total")) require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(1), "memberlist_client_cluster_members_count")) - require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(6), "memberlist_client_kv_store_value_tombstones")) + require.NoError(t, mimir3.WaitSumMetrics(e2e.Equals(2*tombstonesPerRemovedInstance), "memberlist_client_kv_store_value_tombstones")) require.NoError(t, s.Stop(mimir3)) } @@ -195,8 +196,8 @@ func TestSingleBinaryWithMemberlistScaling(t *testing.T) { // Sanity check the ring membership and give each instance time to see every other instance. for _, c := range instances { - // we expect 3*maxMimir to account for both the ingester, distributor and compactor rings - require.NoError(t, c.WaitSumMetrics(e2e.Equals(float64(maxMimir*3)), "cortex_ring_members")) + // we expect 5*maxMimir to account for ingester, distributor, compactor, store-gateway and store-gateway-client rings + require.NoError(t, c.WaitSumMetrics(e2e.Equals(float64(maxMimir*5)), "cortex_ring_members")) require.NoError(t, c.WaitSumMetrics(e2e.Equals(0), "memberlist_client_kv_store_value_tombstones")) } @@ -223,9 +224,9 @@ func TestSingleBinaryWithMemberlistScaling(t *testing.T) { // We don't use WaitSumMetrics [over all instances] here so we can log the per-instance metrics. // These values are multiplied by three to account for the fact that ingester - // distributor and compactor components use a ring. - expectedRingMembers := float64(minMimir) * 3 - expectedTombstones := float64(maxMimir-minMimir) * 3 + // distributor, compactor, store-gateway components use a ring. + expectedRingMembers := float64(minMimir) * 5 // One extra, because store-gateway-client uses ring too. But it's the same ring as store-gateway. + expectedTombstones := float64(maxMimir-minMimir) * 4 require.Eventually(t, func() bool { ok := true diff --git a/integration/querier_test.go b/integration/querier_test.go index 1ef8c6ccd7c..d7378a5485a 100644 --- a/integration/querier_test.go +++ b/integration/querier_test.go @@ -10,7 +10,6 @@ package integration import ( "fmt" "strconv" - "strings" "testing" "time" @@ -149,7 +148,6 @@ func TestQuerierWithBlocksStorageRunningInMicroservicesMode(t *testing.T) { "-blocks-storage.bucket-store.sync-interval": "1s", "-blocks-storage.bucket-store.index-cache.backend": testCfg.indexCacheBackend, "-blocks-storage.bucket-store.bucket-index.enabled": strconv.FormatBool(testCfg.bucketIndexEnabled), - "-store-gateway.sharding-enabled": strconv.FormatBool(true), "-store-gateway.tenant-shard-size": fmt.Sprintf("%d", testCfg.tenantShardSize), "-querier.query-store-for-labels-enabled": "true", "-frontend.query-stats-enabled": "true", @@ -310,29 +308,18 @@ func TestQuerierWithBlocksStorageRunningInMicroservicesMode(t *testing.T) { func TestQuerierWithBlocksStorageRunningInSingleBinaryMode(t *testing.T) { tests := map[string]struct { - blocksShardingEnabled bool - indexCacheBackend string - bucketIndexEnabled bool + indexCacheBackend string + bucketIndexEnabled bool }{ - "blocks sharding enabled, inmemory index cache": { - blocksShardingEnabled: true, - indexCacheBackend: tsdb.IndexCacheBackendInMemory, + "inmemory index cache": { + indexCacheBackend: tsdb.IndexCacheBackendInMemory, }, - "blocks sharding disabled, memcached index cache": { - blocksShardingEnabled: false, - // Memcached index cache is required to avoid flaky tests when the blocks sharding is disabled - // because two different requests may hit two different store-gateways, so if the cache is not - // shared there's no guarantee we'll have a cache hit. + "memcached index cache": { indexCacheBackend: tsdb.IndexCacheBackendMemcached, }, - "blocks sharding enabled, memcached index cache": { - blocksShardingEnabled: true, - indexCacheBackend: tsdb.IndexCacheBackendMemcached, - }, - "blocks sharding enabled, memcached index cache, bucket index enabled": { - blocksShardingEnabled: true, - indexCacheBackend: tsdb.IndexCacheBackendMemcached, - bucketIndexEnabled: true, + "memcached index cache, bucket index enabled": { + indexCacheBackend: tsdb.IndexCacheBackendMemcached, + bucketIndexEnabled: true, }, } @@ -374,7 +361,6 @@ func TestQuerierWithBlocksStorageRunningInSingleBinaryMode(t *testing.T) { "-distributor.ring.store": "consul", "-distributor.ring.consul.hostname": consul.NetworkHTTPEndpoint(), // Store-gateway. - "-store-gateway.sharding-enabled": strconv.FormatBool(testCfg.blocksShardingEnabled), "-store-gateway.sharding-ring.store": "consul", "-store-gateway.sharding-ring.consul.hostname": consul.NetworkHTTPEndpoint(), "-store-gateway.sharding-ring.replication-factor": "1", @@ -391,12 +377,10 @@ func TestQuerierWithBlocksStorageRunningInSingleBinaryMode(t *testing.T) { // Wait until Mimir replicas have updated the ring state. for _, replica := range cluster.Instances() { - numTokensPerInstance := 512 // Ingesters ring. - numTokensPerInstance++ // Distributors ring - numTokensPerInstance += 512 // Compactor ring. - if testCfg.blocksShardingEnabled { - numTokensPerInstance += 512 * 2 // Store-gateway ring (read both by the querier and store-gateway). - } + numTokensPerInstance := 512 // Ingesters ring. + numTokensPerInstance++ // Distributors ring + numTokensPerInstance += 512 // Compactor ring. + numTokensPerInstance += 512 * 2 // Store-gateway ring (read both by the querier and store-gateway). require.NoError(t, replica.WaitSumMetrics(e2e.Equals(float64(numTokensPerInstance*cluster.NumInstances())), "cortex_ring_tokens_total")) } @@ -448,11 +432,7 @@ func TestQuerierWithBlocksStorageRunningInSingleBinaryMode(t *testing.T) { // Wait until the store-gateway has synched the new uploaded blocks. The number of blocks loaded // may be greater than expected if the compactor is running (there may have been compacted). const shippedBlocks = 2 - if testCfg.blocksShardingEnabled { - require.NoError(t, cluster.WaitSumMetrics(e2e.GreaterOrEqual(float64(shippedBlocks*seriesReplicationFactor)), "cortex_bucket_store_blocks_loaded")) - } else { - require.NoError(t, cluster.WaitSumMetrics(e2e.GreaterOrEqual(float64(shippedBlocks*seriesReplicationFactor*cluster.NumInstances())), "cortex_bucket_store_blocks_loaded")) - } + require.NoError(t, cluster.WaitSumMetrics(e2e.GreaterOrEqual(float64(shippedBlocks*seriesReplicationFactor)), "cortex_bucket_store_blocks_loaded")) // Query back the series (1 only in the storage, 1 only in the ingesters, 1 on both). result, err := c.Query("series_1", series1Timestamp) @@ -847,11 +827,6 @@ func TestQueryLimitsWithBlocksStorageRunningInMicroServices(t *testing.T) { storeGateway := e2emimir.NewStoreGateway("store-gateway", consul.NetworkHTTPEndpoint(), flags, "") require.NoError(t, s.StartAndWaitReady(distributor, ingester, storeGateway)) - // Start the querier with configuring store-gateway addresses if sharding is disabled. - flags = mergeFlags(flags, map[string]string{ - "-querier.store-gateway-addresses": strings.Join([]string{storeGateway.NetworkGRPCEndpoint()}, ","), - }) - querier := e2emimir.NewQuerier("querier", consul.NetworkHTTPEndpoint(), flags, "") require.NoError(t, s.StartAndWaitReady(querier)) diff --git a/integration/ruler_test.go b/integration/ruler_test.go index fd85bfce740..0a84b9fd4da 100644 --- a/integration/ruler_test.go +++ b/integration/ruler_test.go @@ -53,14 +53,7 @@ func TestRulerAPI(t *testing.T) { require.NoError(t, s.StartAndWaitReady(consul, minio)) // Configure the ruler. - rulerFlags := mergeFlags( - BlocksStorageFlags(), - RulerFlags(), - map[string]string{ - // set store-gateway to an invalid address, as there is no store-gateway ring configured this flag is mandatory. - "-querier.store-gateway-addresses": "localhost:12345", - }, - ) + rulerFlags := mergeFlags(BlocksStorageFlags(), RulerFlags()) // Start Mimir components. ruler := e2emimir.NewRuler("ruler", consul.NetworkHTTPEndpoint(), rulerFlags, "") @@ -367,9 +360,6 @@ func TestRulerSharding(t *testing.T) { RulerFlags(), RulerShardingFlags(consul.NetworkHTTPEndpoint()), map[string]string{ - // Since we're not going to run any rule, we don't need the - // store-gateway to be configured to a valid address. - "-querier.store-gateway-addresses": "localhost:12345", // Enable the bucket index so we can skip the initial bucket scan. "-blocks-storage.bucket-store.bucket-index.enabled": "true", // Disable rule group limit @@ -440,9 +430,6 @@ func TestRulerAlertmanager(t *testing.T) { BlocksStorageFlags(), RulerFlags(), map[string]string{ - // set store-gateway to an invalid address, as there is no store-gateway ring configured this flag is mandatory. - "-querier.store-gateway-addresses": "localhost:12345", - // Connect the ruler to Alertmanagers "-ruler.alertmanager-url": strings.Join([]string{am1URL, am2URL}, ","), }, @@ -523,9 +510,6 @@ func TestRulerAlertmanagerTLS(t *testing.T) { BlocksStorageFlags(), RulerFlags(), map[string]string{ - // set store-gateway to an invalid address, as there is no store-gateway ring configured this flag is mandatory. - "-querier.store-gateway-addresses": "localhost:12345", - // Connect the ruler to the Alertmanager "-ruler.alertmanager-url": "https://" + am1.HTTPEndpoint(), }, @@ -564,9 +548,6 @@ func TestRulerMetricsForInvalidQueries(t *testing.T) { BlocksStorageFlags(), RulerFlags(), map[string]string{ - // Since we're not going to run any rule (our only rule is invalid), we don't need the - // store-gateway to be configured to a valid address. - "-querier.store-gateway-addresses": "localhost:12345", // Enable the bucket index so we can skip the initial bucket scan. "-blocks-storage.bucket-store.bucket-index.enabled": "true", // Evaluate rules often, so that we don't need to wait for metrics to show up. @@ -750,8 +731,6 @@ func TestRulerFederatedRules(t *testing.T) { "-ruler.tenant-federation.enabled": "true", "-tenant-federation.enabled": "true", "-distributor.replication-factor": "1", - // Set store-gateway to an invalid address. As there is no store-gateway ring configured, this flag is mandatory. - "-querier.store-gateway-addresses": "localhost:12345", }, ) diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml index bd441465eaa..b3b303ac3db 100644 --- a/operations/mimir-tests/test-defaults-generated.yaml +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -769,7 +769,6 @@ spec: - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - -server.http-write-timeout=1m - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1342,12 +1341,12 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 - -store-gateway.sharding-ring.store=consul - -store-gateway.sharding-ring.tokens-file-path=/data/tokens + - -store-gateway.sharding-ring.wait-stability-min-duration=1m - -target=store-gateway image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index 24a5d69d850..9a9b7e59bd3 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -847,7 +847,6 @@ spec: - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - -server.http-write-timeout=1m - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1087,7 +1086,6 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1670,12 +1668,12 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 - -store-gateway.sharding-ring.store=consul - -store-gateway.sharding-ring.tokens-file-path=/data/tokens + - -store-gateway.sharding-ring.wait-stability-min-duration=1m - -target=store-gateway image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index 87c5408eb07..b177ac11600 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -846,7 +846,6 @@ spec: - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - -server.http-write-timeout=1m - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1090,7 +1089,6 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1673,12 +1671,12 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 - -store-gateway.sharding-ring.store=consul - -store-gateway.sharding-ring.tokens-file-path=/data/tokens + - -store-gateway.sharding-ring.wait-stability-min-duration=1m - -target=store-gateway image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index fe1152c886f..3ba56f2030d 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -849,7 +849,6 @@ spec: - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - -server.http-write-timeout=1m - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1095,7 +1094,6 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1680,12 +1678,12 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 - -store-gateway.sharding-ring.store=consul - -store-gateway.sharding-ring.tokens-file-path=/data/tokens + - -store-gateway.sharding-ring.wait-stability-min-duration=1m - -store-gateway.tenant-shard-size=3 - -target=store-gateway image: cortexproject/cortex:v1.9.0 diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index dc00da161fd..ca0b04930eb 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -848,7 +848,6 @@ spec: - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - -server.http-write-timeout=1m - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1092,7 +1091,6 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1683,12 +1681,12 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 - -store-gateway.sharding-ring.store=consul - -store-gateway.sharding-ring.tokens-file-path=/data/tokens + - -store-gateway.sharding-ring.wait-stability-min-duration=1m - -target=store-gateway image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 8670a73e6b8..39a6bd6e850 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -846,7 +846,6 @@ spec: - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - -server.http-write-timeout=1m - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1086,7 +1085,6 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1669,12 +1667,12 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 - -store-gateway.sharding-ring.store=consul - -store-gateway.sharding-ring.tokens-file-path=/data/tokens + - -store-gateway.sharding-ring.wait-stability-min-duration=1m - -target=store-gateway image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index 3094012a8d0..fca38ecb501 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -847,7 +847,6 @@ spec: - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - -server.http-write-timeout=1m - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1090,7 +1089,6 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 @@ -1677,12 +1675,12 @@ spec: - -server.grpc.keepalive.min-time-between-pings=10s - -server.grpc.keepalive.ping-without-stream-allowed=true - -server.http-listen-port=8080 - - -store-gateway.sharding-enabled=true - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 - -store-gateway.sharding-ring.prefix= - -store-gateway.sharding-ring.replication-factor=3 - -store-gateway.sharding-ring.store=consul - -store-gateway.sharding-ring.tokens-file-path=/data/tokens + - -store-gateway.sharding-ring.wait-stability-min-duration=1m - -target=store-gateway image: cortexproject/cortex:v1.9.0 imagePullPolicy: IfNotPresent diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index e4cb43ab93b..5b802667537 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -90,7 +90,6 @@ queryBlocksStorageConfig:: { 'blocks-storage.bucket-store.sync-dir': '/data/tsdb', - 'store-gateway.sharding-enabled': true, 'store-gateway.sharding-ring.store': 'consul', 'store-gateway.sharding-ring.consul.hostname': 'consul.%s.svc.cluster.local:8500' % $._config.namespace, 'store-gateway.sharding-ring.prefix': '', diff --git a/operations/mimir/store-gateway.libsonnet b/operations/mimir/store-gateway.libsonnet index c8ab7ca24b4..f40c32abba0 100644 --- a/operations/mimir/store-gateway.libsonnet +++ b/operations/mimir/store-gateway.libsonnet @@ -28,6 +28,7 @@ // Persist ring tokens so that when the store-gateway will be restarted // it will pick the same tokens 'store-gateway.sharding-ring.tokens-file-path': '/data/tokens', + 'store-gateway.sharding-ring.wait-stability-min-duration': '1m', // Block index-headers are pre-downloaded but lazy mmaped and loaded at query time. 'blocks-storage.bucket-store.index-header-lazy-loading-enabled': 'true', diff --git a/pkg/mimir/mimir_test.go b/pkg/mimir/mimir_test.go index b3774aca489..958c28e3c8a 100644 --- a/pkg/mimir/mimir_test.go +++ b/pkg/mimir/mimir_test.go @@ -48,6 +48,7 @@ import ( "github.com/grafana/mimir/pkg/storage/bucket/filesystem" "github.com/grafana/mimir/pkg/storage/bucket/s3" "github.com/grafana/mimir/pkg/storage/tsdb" + "github.com/grafana/mimir/pkg/storegateway" util_log "github.com/grafana/mimir/pkg/util/log" ) @@ -125,6 +126,11 @@ func TestMimir(t *testing.T) { InstanceInterfaceNames: []string{"en0", "eth0", "lo0", "lo"}, }, }, + StoreGateway: storegateway.Config{ShardingRing: storegateway.RingConfig{ + KVStore: kv.Config{Store: "memberlist"}, + ReplicationFactor: 1, + InstanceInterfaceNames: []string{"en0", "eth0", "lo0", "lo"}, + }}, Target: []string{All, AlertManager}, } diff --git a/pkg/mimir/modules.go b/pkg/mimir/modules.go index 62222fccf2f..fc46e644bd5 100644 --- a/pkg/mimir/modules.go +++ b/pkg/mimir/modules.go @@ -394,12 +394,6 @@ func (t *Mimir) initQuerier() (serv services.Service, err error) { func (t *Mimir) initStoreQueryables() (services.Service, error) { var servs []services.Service - // When running in single binary, if the blocks sharding is disabled and no custom - // store-gateway address has been configured, we can set it to the running process. - if t.Cfg.isModuleEnabled(All) && !t.Cfg.StoreGateway.ShardingEnabled && t.Cfg.Querier.StoreGatewayAddresses == "" { - t.Cfg.Querier.StoreGatewayAddresses = fmt.Sprintf("127.0.0.1:%d", t.Cfg.Server.GRPCListenPort) - } - //nolint:golint // I prefer this form over removing 'else', because it allows q to have smaller scope. if q, err := querier.NewBlocksStoreQueryableFromConfig(t.Cfg.Querier, t.Cfg.StoreGateway, t.Cfg.BlocksStorage, t.Overrides, util_log.Logger, prometheus.DefaultRegisterer); err != nil { return nil, fmt.Errorf("failed to initialize querier: %v", err) diff --git a/pkg/querier/blocks_store_balanced_set.go b/pkg/querier/blocks_store_balanced_set.go deleted file mode 100644 index 883b2b678ce..00000000000 --- a/pkg/querier/blocks_store_balanced_set.go +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-only -// Provenance-includes-location: https://github.com/cortexproject/cortex/blob/master/pkg/querier/blocks_store_balanced_set.go -// Provenance-includes-license: Apache-2.0 -// Provenance-includes-copyright: The Cortex Authors. - -package querier - -import ( - "context" - "fmt" - "math/rand" - "strings" - "time" - - "github.com/go-kit/log" - "github.com/go-kit/log/level" - "github.com/grafana/dskit/ring/client" - "github.com/grafana/dskit/services" - "github.com/oklog/ulid" - "github.com/pkg/errors" - "github.com/prometheus/client_golang/prometheus" - "github.com/thanos-io/thanos/pkg/discovery/dns" - "github.com/thanos-io/thanos/pkg/extprom" - - "github.com/grafana/mimir/pkg/util" -) - -// BlocksStoreSet implementation used when the blocks are not sharded in the store-gateway -// and so requests are balanced across the set of store-gateway instances. -type blocksStoreBalancedSet struct { - services.Service - - serviceAddresses []string - clientsPool *client.Pool - dnsProvider *dns.Provider - - logger log.Logger -} - -func newBlocksStoreBalancedSet(serviceAddresses []string, clientConfig ClientConfig, logger log.Logger, reg prometheus.Registerer) *blocksStoreBalancedSet { - const dnsResolveInterval = 10 * time.Second - - dnsProviderReg := extprom.WrapRegistererWithPrefix("cortex_storegateway_client_", reg) - - s := &blocksStoreBalancedSet{ - serviceAddresses: serviceAddresses, - dnsProvider: dns.NewProvider(logger, dnsProviderReg, dns.GolangResolverType), - clientsPool: newStoreGatewayClientPool(nil, clientConfig, logger, reg), - logger: logger, - } - - s.Service = services.NewTimerService(dnsResolveInterval, s.starting, s.resolve, nil) - return s -} - -func (s *blocksStoreBalancedSet) starting(ctx context.Context) error { - // Initial DNS resolution. - return s.resolve(ctx) -} - -func (s *blocksStoreBalancedSet) resolve(ctx context.Context) error { - if err := s.dnsProvider.Resolve(ctx, s.serviceAddresses); err != nil { - level.Error(s.logger).Log("msg", "failed to resolve store-gateway addresses", "err", err, "addresses", s.serviceAddresses) - } - return nil -} - -func (s *blocksStoreBalancedSet) GetClientsFor(_ string, blockIDs []ulid.ULID, exclude map[ulid.ULID][]string) (map[BlocksStoreClient][]ulid.ULID, error) { - addresses := s.dnsProvider.Addresses() - if len(addresses) == 0 { - return nil, fmt.Errorf("no address resolved for the store-gateway service addresses %s", strings.Join(s.serviceAddresses, ",")) - } - - // Randomize the list of addresses to not always query the same address. - rand.Shuffle(len(addresses), func(i, j int) { - addresses[i], addresses[j] = addresses[j], addresses[i] - }) - - // Pick a non excluded client for each block. - clients := map[BlocksStoreClient][]ulid.ULID{} - - for _, blockID := range blockIDs { - // Pick the first non excluded store-gateway instance. - addr := getFirstNonExcludedAddr(addresses, exclude[blockID]) - if addr == "" { - return nil, fmt.Errorf("no store-gateway instance left after filtering out excluded instances for block %s", blockID.String()) - } - - c, err := s.clientsPool.GetClientFor(addr) - if err != nil { - return nil, errors.Wrapf(err, "failed to get store-gateway client for %s", addr) - } - - clients[c.(BlocksStoreClient)] = append(clients[c.(BlocksStoreClient)], blockID) - } - - return clients, nil -} - -func getFirstNonExcludedAddr(addresses, exclude []string) string { - for _, addr := range addresses { - if !util.StringsContain(exclude, addr) { - return addr - } - } - - return "" -} diff --git a/pkg/querier/blocks_store_balanced_set_test.go b/pkg/querier/blocks_store_balanced_set_test.go deleted file mode 100644 index 7f9b5ea5f0d..00000000000 --- a/pkg/querier/blocks_store_balanced_set_test.go +++ /dev/null @@ -1,152 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-only -// Provenance-includes-location: https://github.com/cortexproject/cortex/blob/master/pkg/querier/blocks_store_balanced_set_test.go -// Provenance-includes-license: Apache-2.0 -// Provenance-includes-copyright: The Cortex Authors. - -package querier - -import ( - "context" - "fmt" - "strings" - "testing" - - "github.com/go-kit/log" - "github.com/grafana/dskit/services" - "github.com/oklog/ulid" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/testutil" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestBlocksStoreBalancedSet_GetClientsFor(t *testing.T) { - const numGets = 1000 - serviceAddrs := []string{"127.0.0.1", "127.0.0.2"} - block1 := ulid.MustNew(1, nil) - - ctx := context.Background() - reg := prometheus.NewPedanticRegistry() - s := newBlocksStoreBalancedSet(serviceAddrs, ClientConfig{}, log.NewNopLogger(), reg) - require.NoError(t, services.StartAndAwaitRunning(ctx, s)) - defer services.StopAndAwaitTerminated(ctx, s) //nolint:errcheck - - // Call the GetClientsFor() many times to measure the distribution - // of returned clients (we expect an even distribution). - clientsCount := map[string]int{} - - for i := 0; i < numGets; i++ { - clients, err := s.GetClientsFor("", []ulid.ULID{block1}, map[ulid.ULID][]string{}) - require.NoError(t, err) - require.Len(t, clients, 1) - - var clientAddr string - for c := range clients { - clientAddr = c.RemoteAddress() - } - - clientsCount[clientAddr] = clientsCount[clientAddr] + 1 - } - - assert.Len(t, clientsCount, len(serviceAddrs)) - for addr, count := range clientsCount { - // Ensure that the number of times each client is returned is above - // the 80% of the perfect even distribution. - assert.Greaterf(t, count, int((float64(numGets)/float64(len(serviceAddrs)))*0.8), "service address: %s", addr) - } - - assert.NoError(t, testutil.GatherAndCompare(reg, strings.NewReader(` - # HELP cortex_storegateway_client_dns_failures_total The number of DNS lookup failures - # TYPE cortex_storegateway_client_dns_failures_total counter - cortex_storegateway_client_dns_failures_total 0 - # HELP cortex_storegateway_client_dns_lookups_total The number of DNS lookups resolutions attempts - # TYPE cortex_storegateway_client_dns_lookups_total counter - cortex_storegateway_client_dns_lookups_total 0 - # HELP cortex_storegateway_client_dns_provider_results The number of resolved endpoints for each configured address - # TYPE cortex_storegateway_client_dns_provider_results gauge - cortex_storegateway_client_dns_provider_results{addr="127.0.0.1"} 1 - cortex_storegateway_client_dns_provider_results{addr="127.0.0.2"} 1 - # HELP cortex_storegateway_clients The current number of store-gateway clients in the pool. - # TYPE cortex_storegateway_clients gauge - cortex_storegateway_clients{client="querier"} 2 - `))) -} - -func TestBlocksStoreBalancedSet_GetClientsFor_Exclude(t *testing.T) { - block1 := ulid.MustNew(1, nil) - block2 := ulid.MustNew(2, nil) - - tests := map[string]struct { - serviceAddrs []string - queryBlocks []ulid.ULID - exclude map[ulid.ULID][]string - expectedClients map[string][]ulid.ULID - expectedErr error - }{ - "no exclude": { - serviceAddrs: []string{"127.0.0.1"}, - queryBlocks: []ulid.ULID{block1, block2}, - expectedClients: map[string][]ulid.ULID{ - "127.0.0.1": {block1, block2}, - }, - }, - "single instance available and excluded for a non-queried block": { - serviceAddrs: []string{"127.0.0.1"}, - queryBlocks: []ulid.ULID{block1}, - exclude: map[ulid.ULID][]string{ - block2: {"127.0.0.1"}, - }, - expectedClients: map[string][]ulid.ULID{ - "127.0.0.1": {block1}, - }, - }, - "single instance available and excluded for the queried block": { - serviceAddrs: []string{"127.0.0.1"}, - queryBlocks: []ulid.ULID{block1}, - exclude: map[ulid.ULID][]string{ - block1: {"127.0.0.1"}, - }, - expectedErr: fmt.Errorf("no store-gateway instance left after filtering out excluded instances for block %s", block1.String()), - }, - "multiple instances available and one is excluded for the queried blocks": { - serviceAddrs: []string{"127.0.0.1", "127.0.0.2"}, - queryBlocks: []ulid.ULID{block1, block2}, - exclude: map[ulid.ULID][]string{ - block1: {"127.0.0.1"}, - block2: {"127.0.0.2"}, - }, - expectedClients: map[string][]ulid.ULID{ - "127.0.0.1": {block2}, - "127.0.0.2": {block1}, - }, - }, - "multiple instances available and all are excluded for the queried block": { - serviceAddrs: []string{"127.0.0.1", "127.0.0.2"}, - queryBlocks: []ulid.ULID{block1, block2}, - exclude: map[ulid.ULID][]string{ - block1: {"127.0.0.1", "127.0.0.2"}, - }, - expectedErr: fmt.Errorf("no store-gateway instance left after filtering out excluded instances for block %s", block1.String()), - }, - } - - for testName, testData := range tests { - testData := testData - - t.Run(testName, func(t *testing.T) { - t.Parallel() - - ctx := context.Background() - s := newBlocksStoreBalancedSet(testData.serviceAddrs, ClientConfig{}, log.NewNopLogger(), nil) - require.NoError(t, services.StartAndAwaitRunning(ctx, s)) - defer services.StopAndAwaitTerminated(ctx, s) //nolint:errcheck - - clients, err := s.GetClientsFor("", testData.queryBlocks, testData.exclude) - assert.Equal(t, testData.expectedErr, err) - - if testData.expectedErr == nil { - assert.Equal(t, testData.expectedClients, getStoreGatewayClientAddrs(clients)) - } - }) - } -} diff --git a/pkg/querier/blocks_store_queryable.go b/pkg/querier/blocks_store_queryable.go index bb1b804e0c2..683dc1c7ee5 100644 --- a/pkg/querier/blocks_store_queryable.go +++ b/pkg/querier/blocks_store_queryable.go @@ -62,7 +62,6 @@ const ( ) var ( - errNoStoreGatewayAddress = errors.New("no store-gateway address configured") errMaxChunksPerQueryLimit = "the query hit the max number of chunks limit while fetching chunks from store-gateways for %s (limit: %d)" ) @@ -230,33 +229,25 @@ func NewBlocksStoreQueryableFromConfig(querierCfg Config, gatewayCfg storegatewa }, bucketClient, limits, logger, reg) } - if gatewayCfg.ShardingEnabled { - storesRingCfg := gatewayCfg.ShardingRing.ToRingConfig() - storesRingBackend, err := kv.NewClient( - storesRingCfg.KVStore, - ring.GetCodec(), - kv.RegistererWithKVName(prometheus.WrapRegistererWithPrefix("cortex_", reg), "querier-store-gateway"), - logger, - ) - if err != nil { - return nil, errors.Wrap(err, "failed to create store-gateway ring backend") - } - - storesRing, err := ring.NewWithStoreClientAndStrategy(storesRingCfg, storegateway.RingNameForClient, storegateway.RingKey, storesRingBackend, ring.NewIgnoreUnhealthyInstancesReplicationStrategy(), prometheus.WrapRegistererWithPrefix("cortex_", reg), logger) - if err != nil { - return nil, errors.Wrap(err, "failed to create store-gateway ring client") - } + storesRingCfg := gatewayCfg.ShardingRing.ToRingConfig() + storesRingBackend, err := kv.NewClient( + storesRingCfg.KVStore, + ring.GetCodec(), + kv.RegistererWithKVName(prometheus.WrapRegistererWithPrefix("cortex_", reg), "querier-store-gateway"), + logger, + ) + if err != nil { + return nil, errors.Wrap(err, "failed to create store-gateway ring backend") + } - stores, err = newBlocksStoreReplicationSet(storesRing, randomLoadBalancing, limits, querierCfg.StoreGatewayClient, logger, reg) - if err != nil { - return nil, errors.Wrap(err, "failed to create store set") - } - } else { - if len(querierCfg.GetStoreGatewayAddresses()) == 0 { - return nil, errNoStoreGatewayAddress - } + storesRing, err := ring.NewWithStoreClientAndStrategy(storesRingCfg, storegateway.RingNameForClient, storegateway.RingKey, storesRingBackend, ring.NewIgnoreUnhealthyInstancesReplicationStrategy(), prometheus.WrapRegistererWithPrefix("cortex_", reg), logger) + if err != nil { + return nil, errors.Wrap(err, "failed to create store-gateway ring client") + } - stores = newBlocksStoreBalancedSet(querierCfg.GetStoreGatewayAddresses(), querierCfg.StoreGatewayClient, logger, reg) + stores, err = newBlocksStoreReplicationSet(storesRing, randomLoadBalancing, limits, querierCfg.StoreGatewayClient, logger, reg) + if err != nil { + return nil, errors.Wrap(err, "failed to create store set") } consistency := NewBlocksConsistencyChecker( diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index c075dfeee2c..d7bbd9e47b0 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -10,7 +10,6 @@ import ( "errors" "flag" "fmt" - "strings" "sync" "time" @@ -53,8 +52,7 @@ type Config struct { QueryStoreAfter time.Duration `yaml:"query_store_after"` MaxQueryIntoFuture time.Duration `yaml:"max_query_into_future"` - StoreGatewayAddresses string `yaml:"store_gateway_addresses"` - StoreGatewayClient ClientConfig `yaml:"store_gateway_client"` + StoreGatewayClient ClientConfig `yaml:"store_gateway_client"` ShuffleShardingIngestersLookbackPeriod time.Duration `yaml:"shuffle_sharding_ingesters_lookback_period"` @@ -78,7 +76,6 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet, logger log.Logger) { f.BoolVar(&cfg.QueryLabelNamesWithMatchers, "querier.query-label-names-with-matchers-enabled", false, "True to enable queriers to use an optimized implementation which passes down to ingesters the label matchers when running the label names API. Can be enabled once all ingesters run a version >= the one where this option has been introduced.") f.DurationVar(&cfg.MaxQueryIntoFuture, "querier.max-query-into-future", 10*time.Minute, "Maximum duration into the future you can query. 0 to disable.") f.DurationVar(&cfg.QueryStoreAfter, "querier.query-store-after", 0, "The time after which a metric should be queried from storage and not just ingesters. 0 means all queries are sent to store. If this option is enabled, the time range of the query sent to the store-gateway will be manipulated to ensure the query end is not more recent than 'now - query-store-after'.") - f.StringVar(&cfg.StoreGatewayAddresses, "querier.store-gateway-addresses", "", "Comma separated list of store-gateway addresses in DNS Service Discovery format. This option should be set when the store-gateway sharding is disabled (when enabled, the store-gateway instances form a ring and addresses are picked from the ring).") f.DurationVar(&cfg.ShuffleShardingIngestersLookbackPeriod, "querier.shuffle-sharding-ingesters-lookback-period", 0, "When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured 'query store after' and 'query ingesters within'. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled).") cfg.EngineConfig.RegisterFlags(f) @@ -102,14 +99,6 @@ func (cfg *Config) Validate() error { return nil } -func (cfg *Config) GetStoreGatewayAddresses() []string { - if cfg.StoreGatewayAddresses == "" { - return nil - } - - return strings.Split(cfg.StoreGatewayAddresses, ",") -} - func getChunksIteratorFunction(cfg Config) chunkIteratorFunc { if cfg.BatchIterators { return batch.NewChunkMergeIterator diff --git a/pkg/storegateway/bucket_index_metadata_fetcher_test.go b/pkg/storegateway/bucket_index_metadata_fetcher_test.go index 10dc2d23101..f93920498ef 100644 --- a/pkg/storegateway/bucket_index_metadata_fetcher_test.go +++ b/pkg/storegateway/bucket_index_metadata_fetcher_test.go @@ -24,6 +24,7 @@ import ( "github.com/stretchr/testify/require" "github.com/thanos-io/thanos/pkg/block" "github.com/thanos-io/thanos/pkg/block/metadata" + "github.com/thanos-io/thanos/pkg/extprom" "github.com/grafana/mimir/pkg/storage/bucket" "github.com/grafana/mimir/pkg/storage/tsdb/bucketindex" @@ -62,7 +63,7 @@ func TestBucketIndexMetadataFetcher_Fetch(t *testing.T) { newMinTimeMetaFilter(1 * time.Hour), } - fetcher := NewBucketIndexMetadataFetcher(userID, bkt, NewNoShardingStrategy(), nil, logger, reg, filters, nil) + fetcher := NewBucketIndexMetadataFetcher(userID, bkt, newNoShardingStrategy(), nil, logger, reg, filters, nil) metas, partials, err := fetcher.Fetch(ctx) require.NoError(t, err) assert.Equal(t, map[ulid.ULID]*metadata.Meta{ @@ -117,7 +118,7 @@ func TestBucketIndexMetadataFetcher_Fetch_NoBucketIndex(t *testing.T) { logs := &concurrency.SyncBuffer{} logger := log.NewLogfmtLogger(logs) - fetcher := NewBucketIndexMetadataFetcher(userID, bkt, NewNoShardingStrategy(), nil, logger, reg, nil, nil) + fetcher := NewBucketIndexMetadataFetcher(userID, bkt, newNoShardingStrategy(), nil, logger, reg, nil, nil) metas, partials, err := fetcher.Fetch(ctx) require.NoError(t, err) assert.Empty(t, metas) @@ -172,7 +173,7 @@ func TestBucketIndexMetadataFetcher_Fetch_CorruptedBucketIndex(t *testing.T) { // Upload a corrupted bucket index. require.NoError(t, bkt.Upload(ctx, path.Join(userID, bucketindex.IndexCompressedFilename), strings.NewReader("invalid}!"))) - fetcher := NewBucketIndexMetadataFetcher(userID, bkt, NewNoShardingStrategy(), nil, logger, reg, nil, nil) + fetcher := NewBucketIndexMetadataFetcher(userID, bkt, newNoShardingStrategy(), nil, logger, reg, nil, nil) metas, partials, err := fetcher.Fetch(ctx) require.NoError(t, err) assert.Empty(t, metas) @@ -337,3 +338,18 @@ func TestBucketIndexMetadataFetcher_Fetch_ShouldResetGaugeMetrics(t *testing.T) blocks_meta_synced{state="too-fresh"} 0 `), "blocks_meta_synced")) } + +// noShardingStrategy is a no-op strategy. When this strategy is used, no tenant/block is filtered out. +type noShardingStrategy struct{} + +func newNoShardingStrategy() *noShardingStrategy { + return &noShardingStrategy{} +} + +func (s *noShardingStrategy) FilterUsers(_ context.Context, userIDs []string) []string { + return userIDs +} + +func (s *noShardingStrategy) FilterBlocks(_ context.Context, _ string, _ map[ulid.ULID]*metadata.Meta, _ map[ulid.ULID]struct{}, _ *extprom.TxGaugeVec) error { + return nil +} diff --git a/pkg/storegateway/bucket_stores_test.go b/pkg/storegateway/bucket_stores_test.go index 16b823af0be..50235d26ce1 100644 --- a/pkg/storegateway/bucket_stores_test.go +++ b/pkg/storegateway/bucket_stores_test.go @@ -75,7 +75,7 @@ func TestBucketStores_InitialSync(t *testing.T) { require.NoError(t, err) reg := prometheus.NewPedanticRegistry() - stores, err := NewBucketStores(cfg, NewNoShardingStrategy(), bucket, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg) + stores, err := NewBucketStores(cfg, newNoShardingStrategy(), bucket, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg) require.NoError(t, err) // Query series before the initial sync. @@ -153,7 +153,7 @@ func TestBucketStores_InitialSyncShouldRetryOnFailure(t *testing.T) { bucket = &failFirstGetBucket{Bucket: bucket} reg := prometheus.NewPedanticRegistry() - stores, err := NewBucketStores(cfg, NewNoShardingStrategy(), bucket, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg) + stores, err := NewBucketStores(cfg, newNoShardingStrategy(), bucket, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg) require.NoError(t, err) // Initial sync should succeed even if a transient error occurs. @@ -215,7 +215,7 @@ func TestBucketStores_SyncBlocks(t *testing.T) { require.NoError(t, err) reg := prometheus.NewPedanticRegistry() - stores, err := NewBucketStores(cfg, NewNoShardingStrategy(), bucket, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg) + stores, err := NewBucketStores(cfg, newNoShardingStrategy(), bucket, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg) require.NoError(t, err) // Run an initial sync to discover 1 block. @@ -279,7 +279,7 @@ func TestBucketStores_syncUsersBlocks(t *testing.T) { expectedStores int32 }{ "when sharding is disabled all users should be synced": { - shardingStrategy: NewNoShardingStrategy(), + shardingStrategy: newNoShardingStrategy(), expectedStores: 3, }, "when sharding is enabled only stores for filtered users should be created": { @@ -346,7 +346,7 @@ func testBucketStoresSeriesShouldCorrectlyQuerySeriesSpanningMultipleChunks(t *t require.NoError(t, err) reg := prometheus.NewPedanticRegistry() - stores, err := NewBucketStores(cfg, NewNoShardingStrategy(), bucket, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg) + stores, err := NewBucketStores(cfg, newNoShardingStrategy(), bucket, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg) require.NoError(t, err) require.NoError(t, stores.InitialSync(ctx)) @@ -432,7 +432,7 @@ func TestBucketStore_Series_ShouldQueryBlockWithOutOfOrderChunks(t *testing.T) { require.NoError(t, err) reg := prometheus.NewPedanticRegistry() - stores, err := NewBucketStores(cfg, NewNoShardingStrategy(), bucket, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg) + stores, err := NewBucketStores(cfg, newNoShardingStrategy(), bucket, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), reg) require.NoError(t, err) require.NoError(t, stores.InitialSync(ctx)) diff --git a/pkg/storegateway/gateway.go b/pkg/storegateway/gateway.go index 294a3427837..2681748a927 100644 --- a/pkg/storegateway/gateway.go +++ b/pkg/storegateway/gateway.go @@ -54,20 +54,17 @@ var ( // Config holds the store gateway config. type Config struct { - ShardingEnabled bool `yaml:"sharding_enabled"` - ShardingRing RingConfig `yaml:"sharding_ring" doc:"description=The hash ring configuration. This option is required only if blocks sharding is enabled."` + ShardingRing RingConfig `yaml:"sharding_ring" doc:"description=The hash ring configuration."` } // RegisterFlags registers the Config flags. func (cfg *Config) RegisterFlags(f *flag.FlagSet) { cfg.ShardingRing.RegisterFlags(f) - - f.BoolVar(&cfg.ShardingEnabled, "store-gateway.sharding-enabled", false, "Shard blocks across multiple store gateway instances."+sharedOptionWithQuerier) } // Validate the Config. func (cfg *Config) Validate(limits validation.Limits) error { - if cfg.ShardingEnabled && limits.StoreGatewayTenantShardSize < 0 { + if limits.StoreGatewayTenantShardSize < 0 { return errInvalidTenantShardSize } @@ -105,16 +102,14 @@ func NewStoreGateway(gatewayCfg Config, storageCfg mimir_tsdb.BlocksStorageConfi return nil, err } - if gatewayCfg.ShardingEnabled { - ringStore, err = kv.NewClient( - gatewayCfg.ShardingRing.KVStore, - ring.GetCodec(), - kv.RegistererWithKVName(prometheus.WrapRegistererWithPrefix("cortex_", reg), "store-gateway"), - logger, - ) - if err != nil { - return nil, errors.Wrap(err, "create KV store client") - } + ringStore, err = kv.NewClient( + gatewayCfg.ShardingRing.KVStore, + ring.GetCodec(), + kv.RegistererWithKVName(prometheus.WrapRegistererWithPrefix("cortex_", reg), "store-gateway"), + logger, + ) + if err != nil { + return nil, errors.Wrap(err, "create KV store client") } return newStoreGateway(gatewayCfg, storageCfg, bucketClient, ringStore, limits, logLevel, logger, reg, tracker) @@ -142,35 +137,31 @@ func newStoreGateway(gatewayCfg Config, storageCfg mimir_tsdb.BlocksStorageConfi // Init sharding strategy. var shardingStrategy ShardingStrategy - if gatewayCfg.ShardingEnabled { - lifecyclerCfg, err := gatewayCfg.ShardingRing.ToLifecyclerConfig(logger) - if err != nil { - return nil, errors.Wrap(err, "invalid ring lifecycler config") - } + lifecyclerCfg, err := gatewayCfg.ShardingRing.ToLifecyclerConfig(logger) + if err != nil { + return nil, errors.Wrap(err, "invalid ring lifecycler config") + } - // Define lifecycler delegates in reverse order (last to be called defined first because they're - // chained via "next delegate"). - delegate := ring.BasicLifecyclerDelegate(g) - delegate = ring.NewLeaveOnStoppingDelegate(delegate, logger) - delegate = ring.NewTokensPersistencyDelegate(gatewayCfg.ShardingRing.TokensFilePath, ring.JOINING, delegate, logger) - delegate = ring.NewAutoForgetDelegate(ringAutoForgetUnhealthyPeriods*gatewayCfg.ShardingRing.HeartbeatTimeout, delegate, logger) + // Define lifecycler delegates in reverse order (last to be called defined first because they're + // chained via "next delegate"). + delegate := ring.BasicLifecyclerDelegate(g) + delegate = ring.NewLeaveOnStoppingDelegate(delegate, logger) + delegate = ring.NewTokensPersistencyDelegate(gatewayCfg.ShardingRing.TokensFilePath, ring.JOINING, delegate, logger) + delegate = ring.NewAutoForgetDelegate(ringAutoForgetUnhealthyPeriods*gatewayCfg.ShardingRing.HeartbeatTimeout, delegate, logger) - g.ringLifecycler, err = ring.NewBasicLifecycler(lifecyclerCfg, RingNameForServer, RingKey, ringStore, delegate, logger, prometheus.WrapRegistererWithPrefix("cortex_", reg)) - if err != nil { - return nil, errors.Wrap(err, "create ring lifecycler") - } - - ringCfg := gatewayCfg.ShardingRing.ToRingConfig() - g.ring, err = ring.NewWithStoreClientAndStrategy(ringCfg, RingNameForServer, RingKey, ringStore, ring.NewIgnoreUnhealthyInstancesReplicationStrategy(), prometheus.WrapRegistererWithPrefix("cortex_", reg), logger) - if err != nil { - return nil, errors.Wrap(err, "create ring client") - } + g.ringLifecycler, err = ring.NewBasicLifecycler(lifecyclerCfg, RingNameForServer, RingKey, ringStore, delegate, logger, prometheus.WrapRegistererWithPrefix("cortex_", reg)) + if err != nil { + return nil, errors.Wrap(err, "create ring lifecycler") + } - shardingStrategy = NewShuffleShardingStrategy(g.ring, lifecyclerCfg.ID, lifecyclerCfg.Addr, limits, logger) - } else { - shardingStrategy = NewNoShardingStrategy() + ringCfg := gatewayCfg.ShardingRing.ToRingConfig() + g.ring, err = ring.NewWithStoreClientAndStrategy(ringCfg, RingNameForServer, RingKey, ringStore, ring.NewIgnoreUnhealthyInstancesReplicationStrategy(), prometheus.WrapRegistererWithPrefix("cortex_", reg), logger) + if err != nil { + return nil, errors.Wrap(err, "create ring client") } + shardingStrategy = NewShuffleShardingStrategy(g.ring, lifecyclerCfg.ID, lifecyclerCfg.Addr, limits, logger) + g.stores, err = NewBucketStores(storageCfg, shardingStrategy, bucketClient, limits, logLevel, logger, extprom.WrapRegistererWith(prometheus.Labels{"component": "store-gateway"}, reg)) if err != nil { return nil, errors.Wrap(err, "create bucket stores") @@ -195,43 +186,41 @@ func (g *StoreGateway) starting(ctx context.Context) (err error) { } }() - if g.gatewayCfg.ShardingEnabled { - // First of all we register the instance in the ring and wait - // until the lifecycler successfully started. - if g.subservices, err = services.NewManager(g.ringLifecycler, g.ring); err != nil { - return errors.Wrap(err, "unable to start store-gateway dependencies") - } + // First of all we register the instance in the ring and wait + // until the lifecycler successfully started. + if g.subservices, err = services.NewManager(g.ringLifecycler, g.ring); err != nil { + return errors.Wrap(err, "unable to start store-gateway dependencies") + } - g.subservicesWatcher = services.NewFailureWatcher() - g.subservicesWatcher.WatchManager(g.subservices) + g.subservicesWatcher = services.NewFailureWatcher() + g.subservicesWatcher.WatchManager(g.subservices) - if err = services.StartManagerAndAwaitHealthy(ctx, g.subservices); err != nil { - return errors.Wrap(err, "unable to start store-gateway dependencies") - } + if err = services.StartManagerAndAwaitHealthy(ctx, g.subservices); err != nil { + return errors.Wrap(err, "unable to start store-gateway dependencies") + } - // Wait until the ring client detected this instance in the JOINING state to - // make sure that when we'll run the initial sync we already know the tokens - // assigned to this instance. - level.Info(g.logger).Log("msg", "waiting until store-gateway is JOINING in the ring") - if err := ring.WaitInstanceState(ctx, g.ring, g.ringLifecycler.GetInstanceID(), ring.JOINING); err != nil { - return err - } - level.Info(g.logger).Log("msg", "store-gateway is JOINING in the ring") - - // In the event of a cluster cold start or scale up of 2+ store-gateway instances at the same - // time, we may end up in a situation where each new store-gateway instance starts at a slightly - // different time and thus each one starts with a different state of the ring. It's better - // to just wait the ring tokens stability for a short time. - if g.gatewayCfg.ShardingRing.WaitStabilityMinDuration > 0 { - minWaiting := g.gatewayCfg.ShardingRing.WaitStabilityMinDuration - maxWaiting := g.gatewayCfg.ShardingRing.WaitStabilityMaxDuration - - level.Info(g.logger).Log("msg", "waiting until store-gateway ring topology is stable", "min_waiting", minWaiting.String(), "max_waiting", maxWaiting.String()) - if err := ring.WaitRingTokensStability(ctx, g.ring, BlocksOwnerSync, minWaiting, maxWaiting); err != nil { - level.Warn(g.logger).Log("msg", "store-gateway ring topology is not stable after the max waiting time, proceeding anyway") - } else { - level.Info(g.logger).Log("msg", "store-gateway ring topology is stable") - } + // Wait until the ring client detected this instance in the JOINING state to + // make sure that when we'll run the initial sync we already know the tokens + // assigned to this instance. + level.Info(g.logger).Log("msg", "waiting until store-gateway is JOINING in the ring") + if err := ring.WaitInstanceState(ctx, g.ring, g.ringLifecycler.GetInstanceID(), ring.JOINING); err != nil { + return err + } + level.Info(g.logger).Log("msg", "store-gateway is JOINING in the ring") + + // In the event of a cluster cold start or scale up of 2+ store-gateway instances at the same + // time, we may end up in a situation where each new store-gateway instance starts at a slightly + // different time and thus each one starts with a different state of the ring. It's better + // to just wait the ring tokens stability for a short time. + if g.gatewayCfg.ShardingRing.WaitStabilityMinDuration > 0 { + minWaiting := g.gatewayCfg.ShardingRing.WaitStabilityMinDuration + maxWaiting := g.gatewayCfg.ShardingRing.WaitStabilityMaxDuration + + level.Info(g.logger).Log("msg", "waiting until store-gateway ring topology is stable", "min_waiting", minWaiting.String(), "max_waiting", maxWaiting.String()) + if err := ring.WaitRingTokensStability(ctx, g.ring, BlocksOwnerSync, minWaiting, maxWaiting); err != nil { + level.Warn(g.logger).Log("msg", "store-gateway ring topology is not stable after the max waiting time, proceeding anyway") + } else { + level.Info(g.logger).Log("msg", "store-gateway ring topology is stable") } } @@ -242,48 +231,40 @@ func (g *StoreGateway) starting(ctx context.Context) (err error) { return errors.Wrap(err, "initial blocks synchronization") } - if g.gatewayCfg.ShardingEnabled { - // Now that the initial sync is done, we should have loaded all blocks - // assigned to our shard, so we can switch to ACTIVE and start serving - // requests. - if err = g.ringLifecycler.ChangeState(ctx, ring.ACTIVE); err != nil { - return errors.Wrapf(err, "switch instance to %s in the ring", ring.ACTIVE) - } + // Now that the initial sync is done, we should have loaded all blocks + // assigned to our shard, so we can switch to ACTIVE and start serving + // requests. + if err = g.ringLifecycler.ChangeState(ctx, ring.ACTIVE); err != nil { + return errors.Wrapf(err, "switch instance to %s in the ring", ring.ACTIVE) + } - // Wait until the ring client detected this instance in the ACTIVE state to - // make sure that when we'll run the loop it won't be detected as a ring - // topology change. - level.Info(g.logger).Log("msg", "waiting until store-gateway is ACTIVE in the ring") - if err := ring.WaitInstanceState(ctx, g.ring, g.ringLifecycler.GetInstanceID(), ring.ACTIVE); err != nil { - return err - } - level.Info(g.logger).Log("msg", "store-gateway is ACTIVE in the ring") + // Wait until the ring client detected this instance in the ACTIVE state to + // make sure that when we'll run the loop it won't be detected as a ring + // topology change. + level.Info(g.logger).Log("msg", "waiting until store-gateway is ACTIVE in the ring") + if err := ring.WaitInstanceState(ctx, g.ring, g.ringLifecycler.GetInstanceID(), ring.ACTIVE); err != nil { + return err } + level.Info(g.logger).Log("msg", "store-gateway is ACTIVE in the ring") return nil } func (g *StoreGateway) running(ctx context.Context) error { - var ringTickerChan <-chan time.Time - var ringLastState ring.ReplicationSet - // Apply a jitter to the sync frequency in order to increase the probability // of hitting the shared cache (if any). syncTicker := time.NewTicker(util.DurationWithJitter(g.storageCfg.BucketStore.SyncInterval, 0.2)) defer syncTicker.Stop() - if g.gatewayCfg.ShardingEnabled { - ringLastState, _ = g.ring.GetAllHealthy(BlocksOwnerSync) // nolint:errcheck - ringTicker := time.NewTicker(util.DurationWithJitter(g.gatewayCfg.ShardingRing.RingCheckPeriod, 0.2)) - defer ringTicker.Stop() - ringTickerChan = ringTicker.C - } + ringLastState, _ := g.ring.GetAllHealthy(BlocksOwnerSync) // nolint:errcheck + ringTicker := time.NewTicker(util.DurationWithJitter(g.gatewayCfg.ShardingRing.RingCheckPeriod, 0.2)) + defer ringTicker.Stop() for { select { case <-syncTicker.C: g.syncStores(ctx, syncReasonPeriodic) - case <-ringTickerChan: + case <-ringTicker.C: // We ignore the error because in case of error it will return an empty // replication set which we use to compare with the previous state. currRingState, _ := g.ring.GetAllHealthy(BlocksOwnerSync) // nolint:errcheck diff --git a/pkg/storegateway/gateway_ring.go b/pkg/storegateway/gateway_ring.go index a21237cfeab..5a8f798ae91 100644 --- a/pkg/storegateway/gateway_ring.go +++ b/pkg/storegateway/gateway_ring.go @@ -97,6 +97,7 @@ func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet) { ringFlagsPrefix := "store-gateway.sharding-ring." // Ring flags + cfg.KVStore.Store = "memberlist" cfg.KVStore.RegisterFlagsWithPrefix(ringFlagsPrefix, "collectors/", f) f.DurationVar(&cfg.HeartbeatPeriod, ringFlagsPrefix+"heartbeat-period", 15*time.Second, "Period at which to heartbeat to the ring. 0 = disabled.") f.DurationVar(&cfg.HeartbeatTimeout, ringFlagsPrefix+"heartbeat-timeout", time.Minute, "The heartbeat timeout after which store gateways are considered unhealthy within the ring. 0 = never (timeout disabled)."+sharedOptionWithQuerier) @@ -105,7 +106,7 @@ func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet) { f.BoolVar(&cfg.ZoneAwarenessEnabled, ringFlagsPrefix+"zone-awareness-enabled", false, "True to enable zone-awareness and replicate blocks across different availability zones.") // Wait stability flags. - f.DurationVar(&cfg.WaitStabilityMinDuration, ringFlagsPrefix+"wait-stability-min-duration", time.Minute, "Minimum time to wait for ring stability at startup. 0 to disable.") + f.DurationVar(&cfg.WaitStabilityMinDuration, ringFlagsPrefix+"wait-stability-min-duration", 0, "Minimum time to wait for ring stability at startup, if set to positive value.") f.DurationVar(&cfg.WaitStabilityMaxDuration, ringFlagsPrefix+"wait-stability-max-duration", 5*time.Minute, "Maximum time to wait for ring stability at startup. If the store-gateway ring keeps changing after this period of time, the store-gateway will start anyway.") // Instance flags diff --git a/pkg/storegateway/gateway_ring_http.go b/pkg/storegateway/gateway_ring_http.go index 369e0242f0a..c17bfad0cbe 100644 --- a/pkg/storegateway/gateway_ring_http.go +++ b/pkg/storegateway/gateway_ring_http.go @@ -42,11 +42,6 @@ func writeMessage(w http.ResponseWriter, message string) { } func (c *StoreGateway) RingHandler(w http.ResponseWriter, req *http.Request) { - if !c.gatewayCfg.ShardingEnabled { - writeMessage(w, "Store gateway has no ring because sharding is disabled.") - return - } - if c.State() != services.Running { // we cannot read the ring before the store gateway is in Running state, // because that would lead to race condition. diff --git a/pkg/storegateway/gateway_test.go b/pkg/storegateway/gateway_test.go index 9b5b2ee38e4..a10f27d5b64 100644 --- a/pkg/storegateway/gateway_test.go +++ b/pkg/storegateway/gateway_test.go @@ -67,14 +67,12 @@ func TestConfig_Validate(t *testing.T) { }, "should fail if shard size is negative": { setup: func(cfg *Config, limits *validation.Limits) { - cfg.ShardingEnabled = true limits.StoreGatewayTenantShardSize = -3 }, expected: errInvalidTenantShardSize, }, "should pass if shard size has been set": { setup: func(cfg *Config, limits *validation.Limits) { - cfg.ShardingEnabled = true limits.StoreGatewayTenantShardSize = 3 }, expected: nil, @@ -130,7 +128,6 @@ func TestStoreGateway_InitialSyncWithDefaultShardingEnabled(t *testing.T) { t.Run(testName, func(t *testing.T) { ctx := context.Background() gatewayCfg := mockGatewayConfig() - gatewayCfg.ShardingEnabled = true storageCfg := mockStorageConfig(t) ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) t.Cleanup(func() { assert.NoError(t, closer.Close()) }) @@ -177,35 +174,11 @@ func TestStoreGateway_InitialSyncWithDefaultShardingEnabled(t *testing.T) { } } -func TestStoreGateway_InitialSyncWithShardingDisabled(t *testing.T) { - test.VerifyNoLeak(t) - - ctx := context.Background() - gatewayCfg := mockGatewayConfig() - gatewayCfg.ShardingEnabled = false - storageCfg := mockStorageConfig(t) - bucketClient := &bucket.ClientMock{} - - g, err := newStoreGateway(gatewayCfg, storageCfg, bucketClient, nil, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), nil, nil) - require.NoError(t, err) - t.Cleanup(func() { assert.NoError(t, services.StopAndAwaitTerminated(ctx, g)) }) - - bucketClient.MockIter("", []string{"user-1", "user-2"}, nil) - bucketClient.MockIter("user-1/", []string{}, nil) - bucketClient.MockIter("user-2/", []string{}, nil) - - require.NoError(t, services.StartAndAwaitRunning(ctx, g)) - assert.NotNil(t, g.stores.getStore("user-1")) - assert.NotNil(t, g.stores.getStore("user-2")) - assert.Nil(t, g.stores.getStore("user-unknown")) -} - func TestStoreGateway_InitialSyncFailure(t *testing.T) { test.VerifyNoLeak(t) ctx := context.Background() gatewayCfg := mockGatewayConfig() - gatewayCfg.ShardingEnabled = true storageCfg := mockStorageConfig(t) ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) t.Cleanup(func() { assert.NoError(t, closer.Close()) }) @@ -352,7 +325,6 @@ func TestStoreGateway_InitialSyncWithWaitRingTokensStability(t *testing.T) { gatewayCfg.ShardingRing.RingCheckPeriod = time.Hour // Do not check the ring topology changes in this test. We want the initial sync only. gatewayCfg.ShardingRing.WaitStabilityMinDuration = 4 * time.Second gatewayCfg.ShardingRing.WaitStabilityMaxDuration = 30 * time.Second - gatewayCfg.ShardingEnabled = true limits.StoreGatewayTenantShardSize = testData.tenantShardSize overrides, err := validation.NewOverrides(limits, nil) @@ -453,7 +425,6 @@ func TestStoreGateway_BlocksSyncWithDefaultSharding_RingTopologyChangedAfterScal gatewayCfg.ShardingRing.RingCheckPeriod = 100 * time.Millisecond // Check it continuously. Topology will change on scale up. gatewayCfg.ShardingRing.WaitStabilityMinDuration = waitStabilityMin gatewayCfg.ShardingRing.WaitStabilityMaxDuration = 30 * time.Second - gatewayCfg.ShardingEnabled = true overrides, err := validation.NewOverrides(limits, nil) require.NoError(t, err) @@ -600,7 +571,6 @@ func TestStoreGateway_ShouldSupportLoadRingTokensFromFile(t *testing.T) { ctx := context.Background() gatewayCfg := mockGatewayConfig() - gatewayCfg.ShardingEnabled = true gatewayCfg.ShardingRing.TokensFilePath = tokensFile.Name() storageCfg := mockStorageConfig(t) @@ -726,7 +696,6 @@ func TestStoreGateway_SyncOnRingTopologyChanged(t *testing.T) { t.Run(testName, func(t *testing.T) { ctx := context.Background() gatewayCfg := mockGatewayConfig() - gatewayCfg.ShardingEnabled = true gatewayCfg.ShardingRing.RingCheckPeriod = 100 * time.Millisecond storageCfg := mockStorageConfig(t) @@ -790,7 +759,6 @@ func TestStoreGateway_RingLifecyclerShouldAutoForgetUnhealthyInstances(t *testin ctx := context.Background() gatewayCfg := mockGatewayConfig() - gatewayCfg.ShardingEnabled = true gatewayCfg.ShardingRing.HeartbeatPeriod = 100 * time.Millisecond gatewayCfg.ShardingRing.HeartbeatTimeout = heartbeatTimeout @@ -885,11 +853,13 @@ func TestStoreGateway_SeriesQueryingShouldRemoveExternalLabels(t *testing.T) { t.Run(fmt.Sprintf("bucket index enabled = %v", bucketIndexEnabled), func(t *testing.T) { // Create a store-gateway used to query back the series from the blocks. gatewayCfg := mockGatewayConfig() - gatewayCfg.ShardingEnabled = false storageCfg := mockStorageConfig(t) storageCfg.BucketStore.BucketIndex.Enabled = bucketIndexEnabled - g, err := newStoreGateway(gatewayCfg, storageCfg, bucketClient, nil, defaultLimitsOverrides(t), mockLoggingLevel(), logger, nil, nil) + ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) + t.Cleanup(func() { assert.NoError(t, closer.Close()) }) + + g, err := newStoreGateway(gatewayCfg, storageCfg, bucketClient, ringStore, defaultLimitsOverrides(t), mockLoggingLevel(), logger, nil, nil) require.NoError(t, err) require.NoError(t, services.StartAndAwaitRunning(ctx, g)) t.Cleanup(func() { assert.NoError(t, services.StopAndAwaitTerminated(ctx, g)) }) @@ -990,11 +960,13 @@ func TestStoreGateway_Series_QuerySharding(t *testing.T) { // Create a store-gateway. gatewayCfg := mockGatewayConfig() - gatewayCfg.ShardingEnabled = false storageCfg := mockStorageConfig(t) storageCfg.BucketStore.BucketIndex.Enabled = true - g, err := newStoreGateway(gatewayCfg, storageCfg, bucketClient, nil, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), nil, nil) + ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) + t.Cleanup(func() { assert.NoError(t, closer.Close()) }) + + g, err := newStoreGateway(gatewayCfg, storageCfg, bucketClient, ringStore, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), nil, nil) require.NoError(t, err) require.NoError(t, services.StartAndAwaitRunning(ctx, g)) t.Cleanup(func() { assert.NoError(t, services.StopAndAwaitTerminated(ctx, g)) }) @@ -1055,11 +1027,13 @@ func TestStoreGateway_Series_QueryShardingConcurrency(t *testing.T) { // Create a store-gateway. gatewayCfg := mockGatewayConfig() - gatewayCfg.ShardingEnabled = false storageCfg := mockStorageConfig(t) storageCfg.BucketStore.BucketIndex.Enabled = true - g, err := newStoreGateway(gatewayCfg, storageCfg, bucketClient, nil, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), nil, nil) + ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) + t.Cleanup(func() { assert.NoError(t, closer.Close()) }) + + g, err := newStoreGateway(gatewayCfg, storageCfg, bucketClient, ringStore, defaultLimitsOverrides(t), mockLoggingLevel(), log.NewNopLogger(), nil, nil) require.NoError(t, err) require.NoError(t, services.StartAndAwaitRunning(ctx, g)) t.Cleanup(func() { assert.NoError(t, services.StopAndAwaitTerminated(ctx, g)) }) @@ -1184,10 +1158,12 @@ func TestStoreGateway_SeriesQueryingShouldEnforceMaxChunksPerQueryLimit(t *testi // Create a store-gateway used to query back the series from the blocks. gatewayCfg := mockGatewayConfig() - gatewayCfg.ShardingEnabled = false storageCfg := mockStorageConfig(t) - g, err := newStoreGateway(gatewayCfg, storageCfg, bucketClient, nil, overrides, mockLoggingLevel(), logger, nil, nil) + ringStore, closer := consul.NewInMemoryClient(ring.GetCodec(), log.NewNopLogger(), nil) + t.Cleanup(func() { assert.NoError(t, closer.Close()) }) + + g, err := newStoreGateway(gatewayCfg, storageCfg, bucketClient, ringStore, overrides, mockLoggingLevel(), logger, nil, nil) require.NoError(t, err) require.NoError(t, services.StartAndAwaitRunning(ctx, g)) t.Cleanup(func() { assert.NoError(t, services.StopAndAwaitTerminated(ctx, g)) }) diff --git a/pkg/storegateway/sharding_strategy.go b/pkg/storegateway/sharding_strategy.go index 234a8941b61..261ef20b292 100644 --- a/pkg/storegateway/sharding_strategy.go +++ b/pkg/storegateway/sharding_strategy.go @@ -41,21 +41,6 @@ type ShardingLimits interface { StoreGatewayTenantShardSize(userID string) int } -// NoShardingStrategy is a no-op strategy. When this strategy is used, no tenant/block is filtered out. -type NoShardingStrategy struct{} - -func NewNoShardingStrategy() *NoShardingStrategy { - return &NoShardingStrategy{} -} - -func (s *NoShardingStrategy) FilterUsers(_ context.Context, userIDs []string) []string { - return userIDs -} - -func (s *NoShardingStrategy) FilterBlocks(_ context.Context, _ string, _ map[ulid.ULID]*metadata.Meta, _ map[ulid.ULID]struct{}, _ *extprom.TxGaugeVec) error { - return nil -} - // ShuffleShardingStrategy is a shuffle sharding strategy, based on the hash ring formed by store-gateways, // where each tenant blocks are sharded across a subset of store-gateway instances. type ShuffleShardingStrategy struct { From 3da17b61ca40ea1be71e12a5f45840ef73ce7db7 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Tue, 1 Feb 2022 14:37:00 +0100 Subject: [PATCH 065/168] Changed -querier.query-ingesters-within and -blocks-storage.tsdb.close-idle-tsdb-timeout defaults from 0 to 13h (#967) * Changed -querier.query-ingesters-within and -blocks-storage.tsdb.close-idle-tsdb-timeout defaults from 0 to 13h Signed-off-by: Marco Pracucci * Fixed unit tests Signed-off-by: Marco Pracucci * Increase -blocks-storage.tsdb.retention-period Signed-off-by: Marco Pracucci * Update comment Signed-off-by: Marco Pracucci --- CHANGELOG.md | 2 ++ cmd/mimir/help-all.txt.tmpl | 8 ++++---- cmd/mimir/help.txt.tmpl | 8 ++++---- docs/sources/blocks-storage/querier.md | 17 +++++++++-------- docs/sources/blocks-storage/store-gateway.md | 9 +++++---- .../configuration/config-file-reference.md | 17 +++++++++-------- .../proposals/blocks-storage-bucket-index.md | 2 +- .../mimir-tests/test-defaults-generated.yaml | 1 - .../test-disable-chunk-streaming-generated.yaml | 1 - .../test-query-sharding-generated.yaml | 1 - .../test-shuffle-sharding-generated.yaml | 1 - .../test-storage-azure-generated.yaml | 1 - .../mimir-tests/test-storage-gcs-generated.yaml | 1 - .../mimir-tests/test-storage-s3-generated.yaml | 1 - operations/mimir/ingester.libsonnet | 1 - pkg/ingester/ingester_test.go | 3 +++ pkg/querier/querier.go | 4 ++-- pkg/querier/querier_test.go | 6 ++++-- pkg/storage/tsdb/config.go | 4 ++-- 19 files changed, 45 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 796098cc3d6..55a79337d6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -248,6 +248,8 @@ * [CHANGE] Ingester: change default value of `-ingester.final-sleep` from `30s` to `0s`. #981 * [CHANGE] Ruler: `-experimental.ruler.enable-api` flag has been renamed to `-ruler.enable-api` and is now stable. #913 * [CHANGE] Alertmanager: `-experimental.alertmanager.enable-api` flag has been renamed to `-alertmanager.enable-api` and is now stable. #913 +* [CHANGE] Ingester: changed default value of `-blocks-storage.tsdb.retention-period` from `6h` to `24h`. #966 +* [CHANGE] Changed default value of `-querier.query-ingesters-within` and `-blocks-storage.tsdb.close-idle-tsdb-timeout` from `0` to `13h`. #966 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 1577fee237e..adac0691969 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -460,7 +460,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.tsdb.block-ranges-period value TSDB blocks range period. (default 2h0m0s) -blocks-storage.tsdb.close-idle-tsdb-timeout duration - If TSDB has not received any data for this duration, and all blocks from TSDB have been shipped, TSDB is closed and deleted from local disk. If set to positive value, this value should be equal or higher than -querier.query-ingesters-within flag to make sure that TSDB is not closed prematurely, which could cause partial query results. 0 or negative value disables closing of idle TSDB. + If TSDB has not received any data for this duration, and all blocks from TSDB have been shipped, TSDB is closed and deleted from local disk. If set to positive value, this value should be equal or higher than -querier.query-ingesters-within flag to make sure that TSDB is not closed prematurely, which could cause partial query results. 0 or negative value disables closing of idle TSDB. (default 13h0m0s) -blocks-storage.tsdb.dir string Local directory to store TSDBs in the ingesters. (default "tsdb") -blocks-storage.tsdb.flush-blocks-on-shutdown @@ -484,7 +484,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.tsdb.memory-snapshot-on-shutdown True to enable snapshotting of in-memory TSDB data on disk when shutting down. -blocks-storage.tsdb.retention-period duration - TSDB blocks retention in the ingester before a block is removed. This should be larger than the block_ranges_period and large enough to give store-gateways and queriers enough time to discover newly uploaded blocks. (default 6h0m0s) + TSDB blocks retention in the ingester before a block is removed. This should be larger than the -blocks-storage.tsdb.block-ranges-period, -querier.query-store-after and large enough to give store-gateways and queriers enough time to discover newly uploaded blocks. (default 24h0m0s) -blocks-storage.tsdb.series-hash-cache-max-size-bytes uint Max size - in bytes - of the in-memory series hash cache. The cache is shared across all tenants and it's used only when query sharding is enabled. (default 1073741824) -blocks-storage.tsdb.ship-concurrency int @@ -1156,7 +1156,7 @@ Usage of ./cmd/mimir/mimir: -querier.max-samples int Maximum number of samples a single query can load into memory. This config option should be set on query-frontend too when query sharding is enabled. (default 50000000) -querier.query-ingesters-within duration - Maximum lookback beyond which queries are not sent to ingester. 0 means all queries are sent to ingester. + Maximum lookback beyond which queries are not sent to ingester. 0 means all queries are sent to ingester. (default 13h0m0s) -querier.query-label-names-with-matchers-enabled True to enable queriers to use an optimized implementation which passes down to ingesters the label matchers when running the label names API. Can be enabled once all ingesters run a version >= the one where this option has been introduced. -querier.query-store-after duration @@ -1166,7 +1166,7 @@ Usage of ./cmd/mimir/mimir: -querier.scheduler-address string Hostname (and port) of scheduler that querier will periodically resolve, connect to and receive queries from. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint. -querier.shuffle-sharding-ingesters-lookback-period duration - When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured 'query store after' and 'query ingesters within'. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled). + When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured -querier.query-store-after and -querier.query-ingesters-within. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled). -querier.store-gateway-client.tls-ca-path string Path to the CA certificates file to validate server certificate against. If not set, the host's root CA certificates are used. -querier.store-gateway-client.tls-cert-path string diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index c6c03cc7422..cc05d406288 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -396,7 +396,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.tsdb.block-ranges-period value TSDB blocks range period. (default 2h0m0s) -blocks-storage.tsdb.close-idle-tsdb-timeout duration - If TSDB has not received any data for this duration, and all blocks from TSDB have been shipped, TSDB is closed and deleted from local disk. If set to positive value, this value should be equal or higher than -querier.query-ingesters-within flag to make sure that TSDB is not closed prematurely, which could cause partial query results. 0 or negative value disables closing of idle TSDB. + If TSDB has not received any data for this duration, and all blocks from TSDB have been shipped, TSDB is closed and deleted from local disk. If set to positive value, this value should be equal or higher than -querier.query-ingesters-within flag to make sure that TSDB is not closed prematurely, which could cause partial query results. 0 or negative value disables closing of idle TSDB. (default 13h0m0s) -blocks-storage.tsdb.dir string Local directory to store TSDBs in the ingesters. (default "tsdb") -blocks-storage.tsdb.flush-blocks-on-shutdown @@ -418,7 +418,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.tsdb.memory-snapshot-on-shutdown True to enable snapshotting of in-memory TSDB data on disk when shutting down. -blocks-storage.tsdb.retention-period duration - TSDB blocks retention in the ingester before a block is removed. This should be larger than the block_ranges_period and large enough to give store-gateways and queriers enough time to discover newly uploaded blocks. (default 6h0m0s) + TSDB blocks retention in the ingester before a block is removed. This should be larger than the -blocks-storage.tsdb.block-ranges-period, -querier.query-store-after and large enough to give store-gateways and queriers enough time to discover newly uploaded blocks. (default 24h0m0s) -blocks-storage.tsdb.series-hash-cache-max-size-bytes uint Max size - in bytes - of the in-memory series hash cache. The cache is shared across all tenants and it's used only when query sharding is enabled. (default 1073741824) -blocks-storage.tsdb.ship-concurrency int @@ -800,7 +800,7 @@ Usage of ./cmd/mimir/mimir: -querier.max-samples int Maximum number of samples a single query can load into memory. This config option should be set on query-frontend too when query sharding is enabled. (default 50000000) -querier.query-ingesters-within duration - Maximum lookback beyond which queries are not sent to ingester. 0 means all queries are sent to ingester. + Maximum lookback beyond which queries are not sent to ingester. 0 means all queries are sent to ingester. (default 13h0m0s) -querier.query-label-names-with-matchers-enabled True to enable queriers to use an optimized implementation which passes down to ingesters the label matchers when running the label names API. Can be enabled once all ingesters run a version >= the one where this option has been introduced. -querier.query-store-after duration @@ -810,7 +810,7 @@ Usage of ./cmd/mimir/mimir: -querier.scheduler-address string Hostname (and port) of scheduler that querier will periodically resolve, connect to and receive queries from. Only one of -querier.frontend-address or -querier.scheduler-address can be set. If neither is set, queries are only received via HTTP endpoint. -querier.shuffle-sharding-ingesters-lookback-period duration - When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured 'query store after' and 'query ingesters within'. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled). + When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured -querier.query-store-after and -querier.query-ingesters-within. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled). -querier.timeout duration The timeout for a query. This config option should be set on query-frontend too when query sharding is enabled. (default 2m0s) -query-scheduler.grpc-client-config.backoff-max-period duration diff --git a/docs/sources/blocks-storage/querier.md b/docs/sources/blocks-storage/querier.md index c809ddfdd51..f581936fd4f 100644 --- a/docs/sources/blocks-storage/querier.md +++ b/docs/sources/blocks-storage/querier.md @@ -109,7 +109,7 @@ querier: # Maximum lookback beyond which queries are not sent to ingester. 0 means all # queries are sent to ingester. # CLI flag: -querier.query-ingesters-within - [query_ingesters_within: | default = 0s] + [query_ingesters_within: | default = 13h] # True to enable queriers to use an optimized implementation which passes down # to ingesters the label matchers when running the label names API. Can be @@ -162,9 +162,9 @@ querier: # > 0, queriers fetch in-memory series from the minimum set of required # ingesters, selecting only ingesters which may have received series since # 'now - lookback period'. The lookback period should be greater or equal than - # the configured 'query store after' and 'query ingesters within'. If this - # setting is 0, queriers always query all ingesters (ingesters shuffle - # sharding on read path is disabled). + # the configured -querier.query-store-after and + # -querier.query-ingesters-within. If this setting is 0, queriers always query + # all ingesters (ingesters shuffle sharding on read path is disabled). # CLI flag: -querier.shuffle-sharding-ingesters-lookback-period [shuffle_sharding_ingesters_lookback_period: | default = 0s] @@ -653,10 +653,11 @@ blocks_storage: [block_ranges_period: | default = 2h0m0s] # TSDB blocks retention in the ingester before a block is removed. This - # should be larger than the block_ranges_period and large enough to give - # store-gateways and queriers enough time to discover newly uploaded blocks. + # should be larger than the -blocks-storage.tsdb.block-ranges-period, + # -querier.query-store-after and large enough to give store-gateways and + # queriers enough time to discover newly uploaded blocks. # CLI flag: -blocks-storage.tsdb.retention-period - [retention_period: | default = 6h] + [retention_period: | default = 24h] # How frequently the TSDB blocks are scanned and new ones are shipped to the # storage. 0 means shipping is disabled. @@ -722,7 +723,7 @@ blocks_storage: # prematurely, which could cause partial query results. 0 or negative value # disables closing of idle TSDB. # CLI flag: -blocks-storage.tsdb.close-idle-tsdb-timeout - [close_idle_tsdb_timeout: | default = 0s] + [close_idle_tsdb_timeout: | default = 13h] # True to enable snapshotting of in-memory TSDB data on disk when shutting # down. diff --git a/docs/sources/blocks-storage/store-gateway.md b/docs/sources/blocks-storage/store-gateway.md index 99338e2447d..09570e43a55 100644 --- a/docs/sources/blocks-storage/store-gateway.md +++ b/docs/sources/blocks-storage/store-gateway.md @@ -729,10 +729,11 @@ blocks_storage: [block_ranges_period: | default = 2h0m0s] # TSDB blocks retention in the ingester before a block is removed. This - # should be larger than the block_ranges_period and large enough to give - # store-gateways and queriers enough time to discover newly uploaded blocks. + # should be larger than the -blocks-storage.tsdb.block-ranges-period, + # -querier.query-store-after and large enough to give store-gateways and + # queriers enough time to discover newly uploaded blocks. # CLI flag: -blocks-storage.tsdb.retention-period - [retention_period: | default = 6h] + [retention_period: | default = 24h] # How frequently the TSDB blocks are scanned and new ones are shipped to the # storage. 0 means shipping is disabled. @@ -798,7 +799,7 @@ blocks_storage: # prematurely, which could cause partial query results. 0 or negative value # disables closing of idle TSDB. # CLI flag: -blocks-storage.tsdb.close-idle-tsdb-timeout - [close_idle_tsdb_timeout: | default = 0s] + [close_idle_tsdb_timeout: | default = 13h] # True to enable snapshotting of in-memory TSDB data on disk when shutting # down. diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index f76995b64cd..6fe22154bec 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -793,7 +793,7 @@ The `querier_config` configures the querier. # Maximum lookback beyond which queries are not sent to ingester. 0 means all # queries are sent to ingester. # CLI flag: -querier.query-ingesters-within -[query_ingesters_within: | default = 0s] +[query_ingesters_within: | default = 13h] # True to enable queriers to use an optimized implementation which passes down # to ingesters the label matchers when running the label names API. Can be @@ -845,9 +845,9 @@ store_gateway_client: # 0, queriers fetch in-memory series from the minimum set of required ingesters, # selecting only ingesters which may have received series since 'now - lookback # period'. The lookback period should be greater or equal than the configured -# 'query store after' and 'query ingesters within'. If this setting is 0, -# queriers always query all ingesters (ingesters shuffle sharding on read path -# is disabled). +# -querier.query-store-after and -querier.query-ingesters-within. If this +# setting is 0, queriers always query all ingesters (ingesters shuffle sharding +# on read path is disabled). # CLI flag: -querier.shuffle-sharding-ingesters-lookback-period [shuffle_sharding_ingesters_lookback_period: | default = 0s] @@ -3117,10 +3117,11 @@ tsdb: [block_ranges_period: | default = 2h0m0s] # TSDB blocks retention in the ingester before a block is removed. This should - # be larger than the block_ranges_period and large enough to give - # store-gateways and queriers enough time to discover newly uploaded blocks. + # be larger than the -blocks-storage.tsdb.block-ranges-period, + # -querier.query-store-after and large enough to give store-gateways and + # queriers enough time to discover newly uploaded blocks. # CLI flag: -blocks-storage.tsdb.retention-period - [retention_period: | default = 6h] + [retention_period: | default = 24h] # How frequently the TSDB blocks are scanned and new ones are shipped to the # storage. 0 means shipping is disabled. @@ -3184,7 +3185,7 @@ tsdb: # prematurely, which could cause partial query results. 0 or negative value # disables closing of idle TSDB. # CLI flag: -blocks-storage.tsdb.close-idle-tsdb-timeout - [close_idle_tsdb_timeout: | default = 0s] + [close_idle_tsdb_timeout: | default = 13h] # True to enable snapshotting of in-memory TSDB data on disk when shutting # down. diff --git a/docs/sources/proposals/blocks-storage-bucket-index.md b/docs/sources/proposals/blocks-storage-bucket-index.md index 459c352a4fb..0836e993639 100644 --- a/docs/sources/proposals/blocks-storage-bucket-index.md +++ b/docs/sources/proposals/blocks-storage-bucket-index.md @@ -93,7 +93,7 @@ Queriers and store-gateways don't need a strongly consistent view over the bucke The maximum delay between a change into the bucket is picked up by queriers and store-gateways depends on the configuration and is the minimum time between: - New blocks uploaded by ingester: - `min(-querier.query-ingesters-within, -blocks-storage.tsdb.retention-period)` (default: 6h) + `min(-querier.query-ingesters-within, -blocks-storage.tsdb.retention-period)` (default: 13h) - New blocks uploaded/deleted by compactor: `-compactor.deletion-delay` (default: 12h) diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml index b3b303ac3db..43fec80c637 100644 --- a/operations/mimir-tests/test-defaults-generated.yaml +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -1006,7 +1006,6 @@ spec: - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - -blocks-storage.tsdb.isolation-enabled=false - - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index 9a9b7e59bd3..8369f9c69e6 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -1331,7 +1331,6 @@ spec: - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - -blocks-storage.tsdb.isolation-enabled=false - - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index b177ac11600..9e5714c7975 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -1334,7 +1334,6 @@ spec: - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - -blocks-storage.tsdb.isolation-enabled=false - - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index 3ba56f2030d..e27b6fa55ee 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -1340,7 +1340,6 @@ spec: - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - -blocks-storage.tsdb.isolation-enabled=false - - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index ca0b04930eb..cf79ac1ff78 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -1342,7 +1342,6 @@ spec: - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - -blocks-storage.tsdb.isolation-enabled=false - - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 39a6bd6e850..0bbe0e3e962 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -1330,7 +1330,6 @@ spec: - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - -blocks-storage.tsdb.isolation-enabled=false - - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index fca38ecb501..24a3cfc1bda 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -1337,7 +1337,6 @@ spec: - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h - -blocks-storage.tsdb.dir=/data/tsdb - -blocks-storage.tsdb.isolation-enabled=false - - -blocks-storage.tsdb.retention-period=24h - -blocks-storage.tsdb.ship-interval=1m - -consul.hostname=consul.default.svc.cluster.local:8500 - -distributor.health-check-ingesters=true diff --git a/operations/mimir/ingester.libsonnet b/operations/mimir/ingester.libsonnet index 2dc7c32cba5..d379b1d7265 100644 --- a/operations/mimir/ingester.libsonnet +++ b/operations/mimir/ingester.libsonnet @@ -32,7 +32,6 @@ // Blocks storage. 'blocks-storage.tsdb.dir': '/data/tsdb', 'blocks-storage.tsdb.block-ranges-period': '2h', - 'blocks-storage.tsdb.retention-period': '24h', // 1 day protection against blocks not being uploaded from ingesters. 'blocks-storage.tsdb.ship-interval': '1m', // Close idle TSDBs. diff --git a/pkg/ingester/ingester_test.go b/pkg/ingester/ingester_test.go index 88a2ac2b21c..b46685a583c 100644 --- a/pkg/ingester/ingester_test.go +++ b/pkg/ingester/ingester_test.go @@ -3173,6 +3173,9 @@ func TestIngester_closeAndDeleteUserTSDBIfIdle_shouldNotCloseTSDBIfShippingIsInP cfg.LifecyclerConfig.JoinAfter = 0 cfg.BlocksStorageConfig.TSDB.ShipConcurrency = 2 + // We want it to be idle immediately (setting to 1ns because 0 means disabled). + cfg.BlocksStorageConfig.TSDB.CloseIdleTSDBTimeout = time.Nanosecond + // Create ingester i, err := prepareIngesterWithBlocksStorage(t, cfg, nil) require.NoError(t, err) diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index d7bbd9e47b0..c6af4e65896 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -71,12 +71,12 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet, logger log.Logger) { cfg.StoreGatewayClient.RegisterFlagsWithPrefix("querier.store-gateway-client", f) f.BoolVar(&cfg.Iterators, "querier.iterators", false, "Use iterators to execute query, as opposed to fully materialising the series in memory.") f.BoolVar(&cfg.BatchIterators, "querier.batch-iterators", true, "Use batch iterators to execute query, as opposed to fully materialising the series in memory. Takes precedent over the -querier.iterators flag.") - f.DurationVar(&cfg.QueryIngestersWithin, "querier.query-ingesters-within", 0, "Maximum lookback beyond which queries are not sent to ingester. 0 means all queries are sent to ingester.") + f.DurationVar(&cfg.QueryIngestersWithin, "querier.query-ingesters-within", 13*time.Hour, "Maximum lookback beyond which queries are not sent to ingester. 0 means all queries are sent to ingester.") flagext.DeprecatedFlag(f, "querier.query-store-for-labels-enabled", "This option is no longer used, and will be removed.", logger) f.BoolVar(&cfg.QueryLabelNamesWithMatchers, "querier.query-label-names-with-matchers-enabled", false, "True to enable queriers to use an optimized implementation which passes down to ingesters the label matchers when running the label names API. Can be enabled once all ingesters run a version >= the one where this option has been introduced.") f.DurationVar(&cfg.MaxQueryIntoFuture, "querier.max-query-into-future", 10*time.Minute, "Maximum duration into the future you can query. 0 to disable.") f.DurationVar(&cfg.QueryStoreAfter, "querier.query-store-after", 0, "The time after which a metric should be queried from storage and not just ingesters. 0 means all queries are sent to store. If this option is enabled, the time range of the query sent to the store-gateway will be manipulated to ensure the query end is not more recent than 'now - query-store-after'.") - f.DurationVar(&cfg.ShuffleShardingIngestersLookbackPeriod, "querier.shuffle-sharding-ingesters-lookback-period", 0, "When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured 'query store after' and 'query ingesters within'. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled).") + f.DurationVar(&cfg.ShuffleShardingIngestersLookbackPeriod, "querier.shuffle-sharding-ingesters-lookback-period", 0, "When distributor's sharding strategy is shuffle-sharding and this setting is > 0, queriers fetch in-memory series from the minimum set of required ingesters, selecting only ingesters which may have received series since 'now - lookback period'. The lookback period should be greater or equal than the configured -querier.query-store-after and -querier.query-ingesters-within. If this setting is 0, queriers always query all ingesters (ingesters shuffle sharding on read path is disabled).") cfg.EngineConfig.RegisterFlags(f) } diff --git a/pkg/querier/querier_test.go b/pkg/querier/querier_test.go index 8a46c63c58b..700e7abaf72 100644 --- a/pkg/querier/querier_test.go +++ b/pkg/querier/querier_test.go @@ -153,6 +153,7 @@ func TestQuerier_QueryableReturnsChunksOutsideQueriedRange(t *testing.T) { var cfg Config flagext.DefaultValues(&cfg) + cfg.QueryIngestersWithin = 0 // Always query ingesters in this test. // Mock distributor to return chunks containing samples outside the queried range. distributor := &mockDistributor{} @@ -611,6 +612,7 @@ func TestQuerier_ValidateQueryTimeRange_MaxQueryLookback(t *testing.T) { var cfg Config flagext.DefaultValues(&cfg) cfg.QueryLabelNamesWithMatchers = true + cfg.QueryIngestersWithin = 0 // Always query ingesters in this test. limits := defaultLimitsConfig() limits.MaxQueryLookback = testData.maxQueryLookback @@ -739,8 +741,7 @@ func TestQuerier_ValidateQueryTimeRange_MaxQueryLookback(t *testing.T) { // because the implementation of those makes it really hard to do in Querier. func TestQuerier_MaxLabelsQueryRange(t *testing.T) { const ( - engineLookbackDelta = 5 * time.Minute - thirtyDays = 30 * 24 * time.Hour + thirtyDays = 30 * 24 * time.Hour ) now := time.Now() @@ -768,6 +769,7 @@ func TestQuerier_MaxLabelsQueryRange(t *testing.T) { var cfg Config flagext.DefaultValues(&cfg) cfg.QueryLabelNamesWithMatchers = true + cfg.QueryIngestersWithin = 0 // Always query ingesters in this test. limits := defaultLimitsConfig() limits.MaxQueryLookback = model.Duration(thirtyDays * 2) diff --git a/pkg/storage/tsdb/config.go b/pkg/storage/tsdb/config.go index 777b3324f12..83d6f6aae31 100644 --- a/pkg/storage/tsdb/config.go +++ b/pkg/storage/tsdb/config.go @@ -181,7 +181,7 @@ func (cfg *TSDBConfig) RegisterFlags(f *flag.FlagSet) { f.StringVar(&cfg.Dir, "blocks-storage.tsdb.dir", "tsdb", "Local directory to store TSDBs in the ingesters.") f.Var(&cfg.BlockRanges, "blocks-storage.tsdb.block-ranges-period", "TSDB blocks range period.") - f.DurationVar(&cfg.Retention, "blocks-storage.tsdb.retention-period", 6*time.Hour, "TSDB blocks retention in the ingester before a block is removed. This should be larger than the block_ranges_period and large enough to give store-gateways and queriers enough time to discover newly uploaded blocks.") + f.DurationVar(&cfg.Retention, "blocks-storage.tsdb.retention-period", 24*time.Hour, "TSDB blocks retention in the ingester before a block is removed. This should be larger than the -blocks-storage.tsdb.block-ranges-period, -querier.query-store-after and large enough to give store-gateways and queriers enough time to discover newly uploaded blocks.") f.DurationVar(&cfg.ShipInterval, "blocks-storage.tsdb.ship-interval", 1*time.Minute, "How frequently the TSDB blocks are scanned and new ones are shipped to the storage. 0 means shipping is disabled.") f.IntVar(&cfg.ShipConcurrency, "blocks-storage.tsdb.ship-concurrency", 10, "Maximum number of tenants concurrently shipping blocks to the storage.") f.Uint64Var(&cfg.SeriesHashCacheMaxBytes, "blocks-storage.tsdb.series-hash-cache-max-size-bytes", uint64(1*units.Gibibyte), "Max size - in bytes - of the in-memory series hash cache. The cache is shared across all tenants and it's used only when query sharding is enabled.") @@ -195,7 +195,7 @@ func (cfg *TSDBConfig) RegisterFlags(f *flag.FlagSet) { f.BoolVar(&cfg.WALCompressionEnabled, "blocks-storage.tsdb.wal-compression-enabled", false, "True to enable TSDB WAL compression.") f.IntVar(&cfg.WALSegmentSizeBytes, "blocks-storage.tsdb.wal-segment-size-bytes", wal.DefaultSegmentSize, "TSDB WAL segments files max size (bytes).") f.BoolVar(&cfg.FlushBlocksOnShutdown, "blocks-storage.tsdb.flush-blocks-on-shutdown", false, "True to flush blocks to storage on shutdown. If false, incomplete blocks will be reused after restart.") - f.DurationVar(&cfg.CloseIdleTSDBTimeout, "blocks-storage.tsdb.close-idle-tsdb-timeout", 0, "If TSDB has not received any data for this duration, and all blocks from TSDB have been shipped, TSDB is closed and deleted from local disk. If set to positive value, this value should be equal or higher than -querier.query-ingesters-within flag to make sure that TSDB is not closed prematurely, which could cause partial query results. 0 or negative value disables closing of idle TSDB.") + f.DurationVar(&cfg.CloseIdleTSDBTimeout, "blocks-storage.tsdb.close-idle-tsdb-timeout", 13*time.Hour, "If TSDB has not received any data for this duration, and all blocks from TSDB have been shipped, TSDB is closed and deleted from local disk. If set to positive value, this value should be equal or higher than -querier.query-ingesters-within flag to make sure that TSDB is not closed prematurely, which could cause partial query results. 0 or negative value disables closing of idle TSDB.") f.BoolVar(&cfg.MemorySnapshotOnShutdown, "blocks-storage.tsdb.memory-snapshot-on-shutdown", false, "True to enable snapshotting of in-memory TSDB data on disk when shutting down.") f.IntVar(&cfg.HeadChunksWriteQueueSize, "blocks-storage.tsdb.head-chunks-write-queue-size", 1000000, "The size of the write queue used by the head chunks mapper. Lower values reduce memory utilisation at the cost of potentially higher ingest latency.") f.BoolVar(&cfg.IsolationEnabled, "blocks-storage.tsdb.isolation-enabled", true, "Enables TSDB isolation feature. Disabling may improve performance.") From d47c2302fe0630325cdf8b494dadfdffffa222ae Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Tue, 1 Feb 2022 15:05:52 +0100 Subject: [PATCH 066/168] Fix query sharding jsonnet if queriers are autoscaling (#988) Signed-off-by: Marco Pracucci --- operations/mimir/query-sharding.libsonnet | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/operations/mimir/query-sharding.libsonnet b/operations/mimir/query-sharding.libsonnet index 6cf2602048a..0924b16117b 100644 --- a/operations/mimir/query-sharding.libsonnet +++ b/operations/mimir/query-sharding.libsonnet @@ -26,7 +26,12 @@ // When sharding is enabled, scale the query-frontend to have at least 20% of the replicas of queriers. local ensure_replica_ratio_to_queriers = { - local min_replicas = std.max(std.floor(0.2 * $.querier_deployment.spec.replicas), 2), + // We check if replicas is set because it may be missing if queriers are autoscaling. + local min_replicas = if std.objectHas($.querier_deployment.spec, 'replicas') && $.querier_deployment.spec.replicas != null then + std.max(std.floor(0.2 * $.querier_deployment.spec.replicas), 2) + else + 2, + spec+: { replicas: std.max(super.replicas, min_replicas), }, From bee4cb05c7e436c52c4ba3fda74748c551120a6d Mon Sep 17 00:00:00 2001 From: Patrick Oyarzun Date: Tue, 1 Feb 2022 10:25:55 -0500 Subject: [PATCH 067/168] Categorize advanced api parameters (#986) * Categorize advanced api parameters * Categorize skip_label_name_validation_header_enabled as advanced * Update config reference --- cmd/mimir/help.txt.tmpl | 6 ------ .../sources/configuration/config-file-reference.md | 14 ++++++++------ pkg/api/api.go | 6 +++--- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index cc05d406288..fd286a868d4 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -177,8 +177,6 @@ Usage of ./cmd/mimir/mimir: The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself. If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Alertmanager. (default http://localhost) -api.response-compression-enabled Use GZIP compression for API responses. Some endpoints serve large YAML or JSON blobs which can benefit from compression. - -api.skip-label-name-validation-header-enabled - Allows to skip label name validation via header on the http write path. Use with caution as it breaks PromQL. Allowing this for external clients allows any client to send invalid label names. After enabling it, requests with a specific HTTP header set to true will not have label names validated. -auth.enabled Set to false to disable auth. (default true) -blocks-storage.azure.account-key value @@ -613,12 +611,8 @@ Usage of ./cmd/mimir/mimir: Print basic help. -help-all Print help, also including advanced and experimental parameters. - -http.alertmanager-http-prefix string - HTTP URL path under which the Alertmanager ui and api will be served. (default "/alertmanager") -http.prefix string HTTP path prefix for API. (default "/api/prom") - -http.prometheus-http-prefix string - HTTP URL path under which the Prometheus api will be served. (default "/prometheus") -ingester-client.expected-labels int Expected number of labels per timeseries, used for preallocations. (default 20) -ingester-client.expected-samples-per-series int diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 6fe22154bec..fd9e99f27f6 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -74,18 +74,20 @@ api: # CLI flag: -api.response-compression-enabled [response_compression_enabled: | default = false] - # Allows to skip label name validation via header on the http write path. Use - # with caution as it breaks PromQL. Allowing this for external clients allows - # any client to send invalid label names. After enabling it, requests with a - # specific HTTP header set to true will not have label names validated. + # [advanced] Allows to skip label name validation via header on the http write + # path. Use with caution as it breaks PromQL. Allowing this for external + # clients allows any client to send invalid label names. After enabling it, + # requests with a specific HTTP header set to true will not have label names + # validated. # CLI flag: -api.skip-label-name-validation-header-enabled [skip_label_name_validation_header_enabled: | default = false] - # HTTP URL path under which the Alertmanager ui and api will be served. + # [advanced] HTTP URL path under which the Alertmanager ui and api will be + # served. # CLI flag: -http.alertmanager-http-prefix [alertmanager_http_prefix: | default = "/alertmanager"] - # HTTP URL path under which the Prometheus api will be served. + # [advanced] HTTP URL path under which the Prometheus api will be served. # CLI flag: -http.prometheus-http-prefix [prometheus_http_prefix: | default = "/prometheus"] diff --git a/pkg/api/api.go b/pkg/api/api.go index 1cb0d66650e..569a306ef20 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -47,10 +47,10 @@ type ConfigHandler func(actualCfg interface{}, defaultCfg interface{}) http.Hand type Config struct { ResponseCompression bool `yaml:"response_compression_enabled"` - SkipLabelNameValidationHeader bool `yaml:"skip_label_name_validation_header_enabled"` + SkipLabelNameValidationHeader bool `yaml:"skip_label_name_validation_header_enabled" category:"advanced"` - AlertmanagerHTTPPrefix string `yaml:"alertmanager_http_prefix"` - PrometheusHTTPPrefix string `yaml:"prometheus_http_prefix"` + AlertmanagerHTTPPrefix string `yaml:"alertmanager_http_prefix" category:"advanced"` + PrometheusHTTPPrefix string `yaml:"prometheus_http_prefix" category:"advanced"` // The following configs are injected by the upstream caller. ServerPrefix string `yaml:"-"` From 744b75db3eecb36253f5284cd2be3ffa2837e5e6 Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Tue, 1 Feb 2022 15:26:45 +0000 Subject: [PATCH 068/168] Move YAML out of website sources (#982) The website cannot handle YAML files being in amongst the markdown files used in the Hugo build. Signed-off-by: Jack Baldry --- .../overrides-exporter-runtime.yaml | 0 .../prometheus-frontend.yml | 0 .../requests-mirroring-envoy.yaml | 0 .../single-process-config-blocks-gossip-1.yaml | 0 .../single-process-config-blocks-gossip-2.yaml | 0 .../single-process-config-blocks-tls.yaml | 0 .../single-process-config-blocks.yaml | 0 docs/sources/configuration/prometheus-frontend.md | 2 +- docs/sources/guides/gossip-ring-getting-started.md | 8 +++----- docs/sources/guides/overrides-exporter.md | 2 +- .../operations/requests-mirroring-to-secondary-cluster.md | 2 +- integration/api_endpoints_test.go | 3 ++- integration/getting_started_single_process_config_test.go | 3 ++- integration/getting_started_with_gossiped_ring_test.go | 4 ++-- integration/ingester_limits_test.go | 2 +- integration/ruler_test.go | 4 ++-- 16 files changed, 15 insertions(+), 15 deletions(-) rename docs/{sources/guides => configurations}/overrides-exporter-runtime.yaml (100%) rename docs/{sources/configuration => configurations}/prometheus-frontend.yml (100%) rename docs/{sources/operations => configurations}/requests-mirroring-envoy.yaml (100%) rename docs/{sources/configuration => configurations}/single-process-config-blocks-gossip-1.yaml (100%) rename docs/{sources/configuration => configurations}/single-process-config-blocks-gossip-2.yaml (100%) rename docs/{sources/configuration => configurations}/single-process-config-blocks-tls.yaml (100%) rename docs/{sources/configuration => configurations}/single-process-config-blocks.yaml (100%) diff --git a/docs/sources/guides/overrides-exporter-runtime.yaml b/docs/configurations/overrides-exporter-runtime.yaml similarity index 100% rename from docs/sources/guides/overrides-exporter-runtime.yaml rename to docs/configurations/overrides-exporter-runtime.yaml diff --git a/docs/sources/configuration/prometheus-frontend.yml b/docs/configurations/prometheus-frontend.yml similarity index 100% rename from docs/sources/configuration/prometheus-frontend.yml rename to docs/configurations/prometheus-frontend.yml diff --git a/docs/sources/operations/requests-mirroring-envoy.yaml b/docs/configurations/requests-mirroring-envoy.yaml similarity index 100% rename from docs/sources/operations/requests-mirroring-envoy.yaml rename to docs/configurations/requests-mirroring-envoy.yaml diff --git a/docs/sources/configuration/single-process-config-blocks-gossip-1.yaml b/docs/configurations/single-process-config-blocks-gossip-1.yaml similarity index 100% rename from docs/sources/configuration/single-process-config-blocks-gossip-1.yaml rename to docs/configurations/single-process-config-blocks-gossip-1.yaml diff --git a/docs/sources/configuration/single-process-config-blocks-gossip-2.yaml b/docs/configurations/single-process-config-blocks-gossip-2.yaml similarity index 100% rename from docs/sources/configuration/single-process-config-blocks-gossip-2.yaml rename to docs/configurations/single-process-config-blocks-gossip-2.yaml diff --git a/docs/sources/configuration/single-process-config-blocks-tls.yaml b/docs/configurations/single-process-config-blocks-tls.yaml similarity index 100% rename from docs/sources/configuration/single-process-config-blocks-tls.yaml rename to docs/configurations/single-process-config-blocks-tls.yaml diff --git a/docs/sources/configuration/single-process-config-blocks.yaml b/docs/configurations/single-process-config-blocks.yaml similarity index 100% rename from docs/sources/configuration/single-process-config-blocks.yaml rename to docs/configurations/single-process-config-blocks.yaml diff --git a/docs/sources/configuration/prometheus-frontend.md b/docs/sources/configuration/prometheus-frontend.md index 35c5ae77acf..8d0bcc2d34d 100644 --- a/docs/sources/configuration/prometheus-frontend.md +++ b/docs/sources/configuration/prometheus-frontend.md @@ -10,7 +10,7 @@ service, including Prometheus and Thanos. Use this config file to get the benefits of query parallelisation and caching. -[embedmd]:# (./prometheus-frontend.yml) +[embedmd]:# (../../configurations/prometheus-frontend.yml) ```yml # You can use the Cortex query frontend with any Prometheus-API compatible # service, including Prometheus and Thanos. Use this config file to get diff --git a/docs/sources/guides/gossip-ring-getting-started.md b/docs/sources/guides/gossip-ring-getting-started.md index 6d5d61bfb92..801e629ba8c 100644 --- a/docs/sources/guides/gossip-ring-getting-started.md +++ b/docs/sources/guides/gossip-ring-getting-started.md @@ -15,8 +15,6 @@ Storage engine and external storage configuration are not dependant on the ring ## Single-binary, two Cortex instances For simplicity and to get started, we'll run it as a two instances of Cortex on local computer. -We will use prepared configuration files ([file 1](../../configuration/single-process-config-blocks-gossip-1.yaml), [file 2](../../configuration/single-process-config-blocks-gossip-2.yaml)), with no external -dependencies. Build Cortex first: @@ -27,8 +25,8 @@ $ go build ./cmd/mimir Run two instances of Cortex, each one with its own dedicated config file: ``` -$ ./mimir -config.file docs/sources/configuration/single-process-config-blocks-gossip-1.yaml -$ ./mimir -config.file docs/sources/configuration/single-process-config-blocks-gossip-2.yaml +$ ./mimir -config.file docs/configurations/single-process-config-blocks-gossip-1.yaml +$ ./mimir -config.file docs/configurations/single-process-config-blocks-gossip-2.yaml ``` Download Prometheus and configure it to use our first Cortex instance for remote writes. @@ -77,7 +75,7 @@ being ACTIVE and ready to receive samples. ## How to add another instance? -To add another Cortex to the small cluster, copy `docs/sources/configuration/single-process-config-blocks-gossip-1.yaml` to a new file, +To add another Cortex to the small cluster, copy `docs/configurations/single-process-config-blocks-gossip-1.yaml` to a new file, and make following modifications. We assume that third Cortex will run on the same machine again, so we change node name and ingester ID as well. Here is annotated diff: diff --git a/docs/sources/guides/overrides-exporter.md b/docs/sources/guides/overrides-exporter.md index 88b1c576957..df023adbb04 100644 --- a/docs/sources/guides/overrides-exporter.md +++ b/docs/sources/guides/overrides-exporter.md @@ -25,7 +25,7 @@ emitted. With a `runtime.yaml` file given below -[embedmd]:# (./overrides-exporter-runtime.yaml) +[embedmd]:# (../../configurations/overrides-exporter-runtime.yaml) ```yaml # file: runtime.yaml # In this example, we're overriding ingestion limits for a single tenant. diff --git a/docs/sources/operations/requests-mirroring-to-secondary-cluster.md b/docs/sources/operations/requests-mirroring-to-secondary-cluster.md index 9387954f02e..d19a8dd7cca 100644 --- a/docs/sources/operations/requests-mirroring-to-secondary-cluster.md +++ b/docs/sources/operations/requests-mirroring-to-secondary-cluster.md @@ -18,7 +18,7 @@ For example, requests mirroring can be used when you need to setup a testing Cor The following Envoy configuration shows an example with two Cortex clusters. Envoy will listen on port `9900` and will proxies all requests to `cortex-primary:8080`, mirroring it to `cortex-secondary:8080` too. -[embedmd]:# (./requests-mirroring-envoy.yaml) +[embedmd]:# (../../configurations/requests-mirroring-envoy.yaml) ```yaml admin: # No access logs. diff --git a/integration/api_endpoints_test.go b/integration/api_endpoints_test.go index 0019f5e1808..b738bbe1a8c 100644 --- a/integration/api_endpoints_test.go +++ b/integration/api_endpoints_test.go @@ -2,6 +2,7 @@ // Provenance-includes-location: https://github.com/cortexproject/cortex/blob/master/integration/api_endpoints_test.go // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Cortex Authors. +//go:build requires_docker // +build requires_docker package integration @@ -25,7 +26,7 @@ func newMimirSingleBinaryWithLocalFilesytemBucket(t *testing.T, name string, fla require.NoError(t, err) // Start Mimir in single binary mode, reading the config from file. - require.NoError(t, copyFileToSharedDir(s, "docs/sources/configuration/single-process-config-blocks.yaml", mimirConfigFile)) + require.NoError(t, copyFileToSharedDir(s, "docs/configurations/single-process-config-blocks.yaml", mimirConfigFile)) if flags == nil { flags = map[string]string{} diff --git a/integration/getting_started_single_process_config_test.go b/integration/getting_started_single_process_config_test.go index 7fc8fe44705..5bc8100c55a 100644 --- a/integration/getting_started_single_process_config_test.go +++ b/integration/getting_started_single_process_config_test.go @@ -2,6 +2,7 @@ // Provenance-includes-location: https://github.com/cortexproject/cortex/blob/master/integration/getting_started_single_process_config_test.go // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Cortex Authors. +//go:build requires_docker // +build requires_docker package integration @@ -32,7 +33,7 @@ func TestGettingStartedSingleProcessConfigWithBlocksStorage(t *testing.T) { require.NoError(t, s.StartAndWaitReady(minio)) // Start Mimir components. - require.NoError(t, copyFileToSharedDir(s, "docs/sources/configuration/single-process-config-blocks.yaml", mimirConfigFile)) + require.NoError(t, copyFileToSharedDir(s, "docs/configurations/single-process-config-blocks.yaml", mimirConfigFile)) // Start Mimir in single binary mode, reading the config from file and overwriting // the backend config to make it work with Minio. diff --git a/integration/getting_started_with_gossiped_ring_test.go b/integration/getting_started_with_gossiped_ring_test.go index 6062136ecea..8a0c6dcacff 100644 --- a/integration/getting_started_with_gossiped_ring_test.go +++ b/integration/getting_started_with_gossiped_ring_test.go @@ -32,8 +32,8 @@ func TestGettingStartedWithGossipedRing(t *testing.T) { require.NoError(t, s.StartAndWaitReady(minio)) // Start Mimir components. - require.NoError(t, copyFileToSharedDir(s, "docs/sources/configuration/single-process-config-blocks-gossip-1.yaml", "config1.yaml")) - require.NoError(t, copyFileToSharedDir(s, "docs/sources/configuration/single-process-config-blocks-gossip-2.yaml", "config2.yaml")) + require.NoError(t, copyFileToSharedDir(s, "docs/configurations/single-process-config-blocks-gossip-1.yaml", "config1.yaml")) + require.NoError(t, copyFileToSharedDir(s, "docs/configurations/single-process-config-blocks-gossip-2.yaml", "config2.yaml")) // We don't care for storage part too much here. Both Mimir instances will write new blocks to /tmp, but that's fine. flags := map[string]string{ diff --git a/integration/ingester_limits_test.go b/integration/ingester_limits_test.go index 3005ade559b..1bd1d9b80df 100644 --- a/integration/ingester_limits_test.go +++ b/integration/ingester_limits_test.go @@ -171,7 +171,7 @@ overrides: require.NoError(t, writeFileToSharedDir(s, overridesFile, []byte{})) // Start Cortex in single binary mode, reading the config from file. - require.NoError(t, copyFileToSharedDir(s, "docs/sources/configuration/single-process-config-blocks.yaml", mimirConfigFile)) + require.NoError(t, copyFileToSharedDir(s, "docs/configurations/single-process-config-blocks.yaml", mimirConfigFile)) flags := map[string]string{ "-runtime-config.reload-period": "100ms", diff --git a/integration/ruler_test.go b/integration/ruler_test.go index 0a84b9fd4da..e36021191bb 100644 --- a/integration/ruler_test.go +++ b/integration/ruler_test.go @@ -159,7 +159,7 @@ func TestRulerAPISingleBinary(t *testing.T) { ) // Start Mimir components. - require.NoError(t, copyFileToSharedDir(s, "docs/sources/configuration/single-process-config-blocks.yaml", mimirConfigFile)) + require.NoError(t, copyFileToSharedDir(s, "docs/configurations/single-process-config-blocks.yaml", mimirConfigFile)) require.NoError(t, writeFileToSharedDir(s, filepath.Join("ruler_configs", user, namespace), []byte(mimirRulerUserConfigYaml))) mimir := e2emimir.NewSingleBinaryWithConfigFile("mimir", mimirConfigFile, flags, "", 9009, 9095) require.NoError(t, s.StartAndWaitReady(mimir)) @@ -225,7 +225,7 @@ func TestRulerEvaluationDelay(t *testing.T) { ) // Start Mimir components. - require.NoError(t, copyFileToSharedDir(s, "docs/sources/configuration/single-process-config-blocks.yaml", mimirConfigFile)) + require.NoError(t, copyFileToSharedDir(s, "docs/configurations/single-process-config-blocks.yaml", mimirConfigFile)) require.NoError(t, writeFileToSharedDir(s, filepath.Join("ruler_configs", user, namespace), []byte(mimirRulerEvalStaleNanConfigYaml))) mimir := e2emimir.NewSingleBinaryWithConfigFile("mimir", mimirConfigFile, flags, "", 9009, 9095) require.NoError(t, s.StartAndWaitReady(mimir)) From 2a8e3abf4a4d99c897e6fa254ab08a8e87aff5aa Mon Sep 17 00:00:00 2001 From: Patrick Oyarzun Date: Tue, 1 Feb 2022 10:56:00 -0500 Subject: [PATCH 069/168] Categorize alertmanager.* parameters (#984) * Categorize alertmanager.* parameters * Address PR feedback * Update config reference and help reference --- cmd/mimir/help.txt.tmpl | 44 ------------ .../configuration/config-file-reference.md | 70 +++++++++++-------- pkg/alertmanager/alertmanager_client.go | 2 +- pkg/alertmanager/alertmanager_ring.go | 18 ++--- pkg/alertmanager/multitenant.go | 22 +++--- pkg/alertmanager/state_persister.go | 2 +- 6 files changed, 62 insertions(+), 96 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index fd286a868d4..e7b107df362 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -95,26 +95,8 @@ Usage of ./cmd/mimir/mimir: OpenStack Swift user ID. -alertmanager-storage.swift.username string OpenStack Swift username. - -alertmanager.alertmanager-client.remote-timeout duration - Timeout for downstream alertmanagers. (default 2s) - -alertmanager.cluster.advertise-address string - Explicit address or hostname to advertise in cluster. - -alertmanager.cluster.gossip-interval duration - The interval between sending gossip messages. By lowering this value (more frequent) gossip messages are propagated across cluster more quickly at the expense of increased bandwidth usage. (default 200ms) - -alertmanager.cluster.listen-address string - Listen address and port for the cluster. Not specifying this flag disables high-availability mode. (default "0.0.0.0:9094") - -alertmanager.cluster.peer-timeout duration - Time to wait between peers to send notifications. (default 15s) - -alertmanager.cluster.peers value - Comma-separated list of initial peers. - -alertmanager.cluster.push-pull-interval duration - The interval between gossip state syncs. Setting this interval lower (more frequent) will increase convergence speeds across larger clusters at the expense of increased bandwidth usage. (default 1m0s) -alertmanager.configs.fallback string Filename of fallback config to use if none specified for instance. - -alertmanager.configs.poll-interval duration - How frequently to poll Alertmanager configs. (default 15s) - -alertmanager.enable-api - Enable the alertmanager config api. -alertmanager.max-alerts-count int Maximum number of alerts that a single user can have. Inserting more alerts will fail with a log message and metric increment. 0 = no limit. -alertmanager.max-alerts-size-bytes int @@ -123,8 +105,6 @@ Usage of ./cmd/mimir/mimir: Maximum size of configuration file for Alertmanager that tenant can upload via Alertmanager API. 0 = no limit. -alertmanager.max-dispatcher-aggregation-groups int Maximum number of aggregation groups in Alertmanager's dispatcher that a tenant can have. Each active aggregation group uses single goroutine. When the limit is reached, dispatcher will not dispatch alerts that belong to additional aggregation groups, but existing groups will keep working properly. 0 = no limit. - -alertmanager.max-recv-msg-size int - Maximum size (bytes) of an accepted HTTP request body. (default 16777216) -alertmanager.max-template-size-bytes int Maximum size of single template in tenant's Alertmanager configuration uploaded via Alertmanager API. 0 = no limit. -alertmanager.max-templates-count int @@ -133,14 +113,10 @@ Usage of ./cmd/mimir/mimir: Per-user rate limit for sending notifications from Alertmanager in notifications/sec. 0 = rate limit disabled. Negative value = no notifications are allowed. -alertmanager.notification-rate-limit-per-integration value Per-integration notification rate limits. Value is a map, where each key is integration name and value is a rate-limit (float). On command line, this map is given in JSON format. Rate limit has the same meaning as -alertmanager.notification-rate-limit, but only applies for specific integration. Allowed integration names: webhook, email, pagerduty, opsgenie, wechat, slack, victorops, pushover, sns. (default {}) - -alertmanager.persist-interval duration - The interval between persisting the current alertmanager state (notification log and silences) to object storage. This is only used when sharding is enabled. This state is read when all replicas for a shard can not be contacted. In this scenario, having persisted the state more frequently will result in potentially fewer lost silences, and fewer duplicate notifications. (default 15m0s) -alertmanager.receivers-firewall-block-cidr-networks value Comma-separated list of network CIDRs to block in Alertmanager receiver integrations. -alertmanager.receivers-firewall-block-private-addresses True to block private and local addresses in Alertmanager receiver integrations. It blocks private addresses defined by RFC 1918 (IPv4 addresses) and RFC 4193 (IPv6 addresses), as well as loopback, local unicast and local multicast addresses. - -alertmanager.sharding-enabled - Shard tenants across multiple alertmanager instances. -alertmanager.sharding-ring.consul.hostname string Hostname and port of Consul. (default "localhost:8500") -alertmanager.sharding-ring.etcd.endpoints value @@ -149,30 +125,10 @@ Usage of ./cmd/mimir/mimir: Etcd password. -alertmanager.sharding-ring.etcd.username string Etcd username. - -alertmanager.sharding-ring.heartbeat-period duration - Period at which to heartbeat to the ring. 0 = disabled. (default 15s) - -alertmanager.sharding-ring.heartbeat-timeout duration - The heartbeat timeout after which alertmanagers are considered unhealthy within the ring. 0 = never (timeout disabled). (default 1m0s) - -alertmanager.sharding-ring.instance-addr string - IP address to advertise in the ring. - -alertmanager.sharding-ring.instance-availability-zone string - The availability zone where this instance is running. Required if zone-awareness is enabled. - -alertmanager.sharding-ring.instance-id string - Instance ID to register in the ring. (default "{{.Hostname}}") - -alertmanager.sharding-ring.instance-interface-names value - Name of network interface to read address from. (default [eth0 en0]) - -alertmanager.sharding-ring.instance-port int - Port to advertise in the ring (defaults to server.grpc-listen-port). - -alertmanager.sharding-ring.replication-factor int - The replication factor to use when sharding the alertmanager. (default 3) -alertmanager.sharding-ring.store string Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "consul") - -alertmanager.sharding-ring.zone-awareness-enabled - True to enable zone-awareness and replicate alerts across different availability zones. -alertmanager.storage.path string Base path for data storage. (default "data/") - -alertmanager.storage.retention duration - How long to keep data for. (default 120h0m0s) -alertmanager.web.external-url value The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself. If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Alertmanager. (default http://localhost) -api.response-compression-enabled diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index fd9e99f27f6..1e5d0ead19c 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -1538,7 +1538,7 @@ The `alertmanager_config` configures the alertmanager. # CLI flag: -alertmanager.storage.path [data_dir: | default = "data/"] -# How long to keep data for. +# [advanced] How long to keep data for. # CLI flag: -alertmanager.storage.retention [retention: | default = 120h] @@ -1549,15 +1549,15 @@ The `alertmanager_config` configures the alertmanager. # CLI flag: -alertmanager.web.external-url [external_url: | default = http://localhost] -# How frequently to poll Alertmanager configs. +# [advanced] How frequently to poll Alertmanager configs. # CLI flag: -alertmanager.configs.poll-interval [poll_interval: | default = 15s] -# Maximum size (bytes) of an accepted HTTP request body. +# [advanced] Maximum size (bytes) of an accepted HTTP request body. # CLI flag: -alertmanager.max-recv-msg-size [max_recv_msg_size: | default = 16777216] -# Shard tenants across multiple alertmanager instances. +# [advanced] Shard tenants across multiple alertmanager instances. # CLI flag: -alertmanager.sharding-enabled [sharding_enabled: | default = false] @@ -1598,29 +1598,38 @@ sharding_ring: # CLI flag: -alertmanager.sharding-ring.multi.mirror-timeout [mirror_timeout: | default = 2s] - # Period at which to heartbeat to the ring. 0 = disabled. + # [advanced] Period at which to heartbeat to the ring. 0 = disabled. # CLI flag: -alertmanager.sharding-ring.heartbeat-period [heartbeat_period: | default = 15s] - # The heartbeat timeout after which alertmanagers are considered unhealthy - # within the ring. 0 = never (timeout disabled). + # [advanced] The heartbeat timeout after which alertmanagers are considered + # unhealthy within the ring. 0 = never (timeout disabled). # CLI flag: -alertmanager.sharding-ring.heartbeat-timeout [heartbeat_timeout: | default = 1m] - # The replication factor to use when sharding the alertmanager. + # [advanced] The replication factor to use when sharding the alertmanager. # CLI flag: -alertmanager.sharding-ring.replication-factor [replication_factor: | default = 3] - # True to enable zone-awareness and replicate alerts across different - # availability zones. + # [advanced] True to enable zone-awareness and replicate alerts across + # different availability zones. # CLI flag: -alertmanager.sharding-ring.zone-awareness-enabled [zone_awareness_enabled: | default = false] - # Name of network interface to read address from. + # [advanced] Name of network interface to read address from. # CLI flag: -alertmanager.sharding-ring.instance-interface-names [instance_interface_names: | default = [eth0 en0]] - # The availability zone where this instance is running. Required if + # [advanced] Port to advertise in the ring (defaults to + # server.grpc-listen-port). + # CLI flag: -alertmanager.sharding-ring.instance-port + [instance_port: | default = 0] + + # [advanced] IP address to advertise in the ring. + # CLI flag: -alertmanager.sharding-ring.instance-addr + [instance_addr: | default = ""] + + # [advanced] The availability zone where this instance is running. Required if # zone-awareness is enabled. # CLI flag: -alertmanager.sharding-ring.instance-availability-zone [instance_availability_zone: | default = ""] @@ -1630,41 +1639,41 @@ sharding_ring: [fallback_config_file: | default = ""] cluster: - # Listen address and port for the cluster. Not specifying this flag disables - # high-availability mode. + # [advanced] Listen address and port for the cluster. Not specifying this flag + # disables high-availability mode. # CLI flag: -alertmanager.cluster.listen-address [listen_address: | default = "0.0.0.0:9094"] - # Explicit address or hostname to advertise in cluster. + # [advanced] Explicit address or hostname to advertise in cluster. # CLI flag: -alertmanager.cluster.advertise-address [advertise_address: | default = ""] - # Comma-separated list of initial peers. + # [advanced] Comma-separated list of initial peers. # CLI flag: -alertmanager.cluster.peers [peers: | default = ""] - # Time to wait between peers to send notifications. + # [advanced] Time to wait between peers to send notifications. # CLI flag: -alertmanager.cluster.peer-timeout [peer_timeout: | default = 15s] - # The interval between sending gossip messages. By lowering this value (more - # frequent) gossip messages are propagated across cluster more quickly at the - # expense of increased bandwidth usage. + # [advanced] The interval between sending gossip messages. By lowering this + # value (more frequent) gossip messages are propagated across cluster more + # quickly at the expense of increased bandwidth usage. # CLI flag: -alertmanager.cluster.gossip-interval [gossip_interval: | default = 200ms] - # The interval between gossip state syncs. Setting this interval lower (more - # frequent) will increase convergence speeds across larger clusters at the - # expense of increased bandwidth usage. + # [advanced] The interval between gossip state syncs. Setting this interval + # lower (more frequent) will increase convergence speeds across larger + # clusters at the expense of increased bandwidth usage. # CLI flag: -alertmanager.cluster.push-pull-interval [push_pull_interval: | default = 1m] -# Enable the alertmanager config api. +# [advanced] Enable the alertmanager config api. # CLI flag: -alertmanager.enable-api [enable_api: | default = false] alertmanager_client: - # Timeout for downstream alertmanagers. + # [advanced] Timeout for downstream alertmanagers. # CLI flag: -alertmanager.alertmanager-client.remote-timeout [remote_timeout: | default = 2s] @@ -1697,11 +1706,12 @@ alertmanager_client: # CLI flag: -alertmanager.alertmanager-client.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] -# The interval between persisting the current alertmanager state (notification -# log and silences) to object storage. This is only used when sharding is -# enabled. This state is read when all replicas for a shard can not be -# contacted. In this scenario, having persisted the state more frequently will -# result in potentially fewer lost silences, and fewer duplicate notifications. +# [advanced] The interval between persisting the current alertmanager state +# (notification log and silences) to object storage. This is only used when +# sharding is enabled. This state is read when all replicas for a shard can not +# be contacted. In this scenario, having persisted the state more frequently +# will result in potentially fewer lost silences, and fewer duplicate +# notifications. # CLI flag: -alertmanager.persist-interval [persist_interval: | default = 15m] ``` diff --git a/pkg/alertmanager/alertmanager_client.go b/pkg/alertmanager/alertmanager_client.go index 3ef8b60c54f..28a6d394137 100644 --- a/pkg/alertmanager/alertmanager_client.go +++ b/pkg/alertmanager/alertmanager_client.go @@ -39,7 +39,7 @@ type Client interface { // ClientConfig is the configuration struct for the alertmanager client. type ClientConfig struct { - RemoteTimeout time.Duration `yaml:"remote_timeout"` + RemoteTimeout time.Duration `yaml:"remote_timeout" category:"advanced"` TLSEnabled bool `yaml:"tls_enabled" category:"advanced"` TLS tls.ClientConfig `yaml:",inline"` } diff --git a/pkg/alertmanager/alertmanager_ring.go b/pkg/alertmanager/alertmanager_ring.go index f52fed0b7ff..9808add2127 100644 --- a/pkg/alertmanager/alertmanager_ring.go +++ b/pkg/alertmanager/alertmanager_ring.go @@ -49,17 +49,17 @@ var SyncRingOp = ring.NewOp([]ring.InstanceState{ring.ACTIVE, ring.JOINING}, fun // to the user. type RingConfig struct { KVStore kv.Config `yaml:"kvstore" doc:"description=The key-value store used to share the hash ring across multiple instances."` - HeartbeatPeriod time.Duration `yaml:"heartbeat_period"` - HeartbeatTimeout time.Duration `yaml:"heartbeat_timeout"` - ReplicationFactor int `yaml:"replication_factor"` - ZoneAwarenessEnabled bool `yaml:"zone_awareness_enabled"` + HeartbeatPeriod time.Duration `yaml:"heartbeat_period" category:"advanced"` + HeartbeatTimeout time.Duration `yaml:"heartbeat_timeout" category:"advanced"` + ReplicationFactor int `yaml:"replication_factor" category:"advanced"` + ZoneAwarenessEnabled bool `yaml:"zone_awareness_enabled" category:"advanced"` // Instance details - InstanceID string `yaml:"instance_id" doc:"hidden"` - InstanceInterfaceNames []string `yaml:"instance_interface_names"` - InstancePort int `yaml:"instance_port" doc:"hidden"` - InstanceAddr string `yaml:"instance_addr" doc:"hidden"` - InstanceZone string `yaml:"instance_availability_zone"` + InstanceID string `yaml:"instance_id" doc:"hidden" category:"advanced"` + InstanceInterfaceNames []string `yaml:"instance_interface_names" category:"advanced"` + InstancePort int `yaml:"instance_port" category:"advanced"` + InstanceAddr string `yaml:"instance_addr" category:"advanced"` + InstanceZone string `yaml:"instance_availability_zone" category:"advanced"` // Injected internally ListenPort int `yaml:"-"` diff --git a/pkg/alertmanager/multitenant.go b/pkg/alertmanager/multitenant.go index f61319c8585..c0fea7d199d 100644 --- a/pkg/alertmanager/multitenant.go +++ b/pkg/alertmanager/multitenant.go @@ -66,20 +66,20 @@ var ( // MultitenantAlertmanagerConfig is the configuration for a multitenant Alertmanager. type MultitenantAlertmanagerConfig struct { DataDir string `yaml:"data_dir"` - Retention time.Duration `yaml:"retention"` + Retention time.Duration `yaml:"retention" category:"advanced"` ExternalURL flagext.URLValue `yaml:"external_url"` - PollInterval time.Duration `yaml:"poll_interval"` - MaxRecvMsgSize int64 `yaml:"max_recv_msg_size"` + PollInterval time.Duration `yaml:"poll_interval" category:"advanced"` + MaxRecvMsgSize int64 `yaml:"max_recv_msg_size" category:"advanced"` // Enable sharding for the Alertmanager - ShardingEnabled bool `yaml:"sharding_enabled"` + ShardingEnabled bool `yaml:"sharding_enabled" category:"advanced"` ShardingRing RingConfig `yaml:"sharding_ring"` FallbackConfigFile string `yaml:"fallback_config_file"` Cluster ClusterConfig `yaml:"cluster"` - EnableAPI bool `yaml:"enable_api"` + EnableAPI bool `yaml:"enable_api" category:"advanced"` // For distributor. AlertmanagerClient ClientConfig `yaml:"alertmanager_client"` @@ -89,12 +89,12 @@ type MultitenantAlertmanagerConfig struct { } type ClusterConfig struct { - ListenAddr string `yaml:"listen_address"` - AdvertiseAddr string `yaml:"advertise_address"` - Peers flagext.StringSliceCSV `yaml:"peers"` - PeerTimeout time.Duration `yaml:"peer_timeout"` - GossipInterval time.Duration `yaml:"gossip_interval"` - PushPullInterval time.Duration `yaml:"push_pull_interval"` + ListenAddr string `yaml:"listen_address" category:"advanced"` + AdvertiseAddr string `yaml:"advertise_address" category:"advanced"` + Peers flagext.StringSliceCSV `yaml:"peers" category:"advanced"` + PeerTimeout time.Duration `yaml:"peer_timeout" category:"advanced"` + GossipInterval time.Duration `yaml:"gossip_interval" category:"advanced"` + PushPullInterval time.Duration `yaml:"push_pull_interval" category:"advanced"` } const ( diff --git a/pkg/alertmanager/state_persister.go b/pkg/alertmanager/state_persister.go index 0fcc9448faa..14d940e8ac0 100644 --- a/pkg/alertmanager/state_persister.go +++ b/pkg/alertmanager/state_persister.go @@ -31,7 +31,7 @@ var ( ) type PersisterConfig struct { - Interval time.Duration `yaml:"persist_interval"` + Interval time.Duration `yaml:"persist_interval" category:"advanced"` } func (cfg *PersisterConfig) RegisterFlagsWithPrefix(prefix string, f *flag.FlagSet) { From 0210659fef17207c47d56d07fa8f3ed9f555e070 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Tue, 1 Feb 2022 16:56:20 +0100 Subject: [PATCH 070/168] Wait for ruler ring client to self-detect during startup (#990) Signed-off-by: Marco Pracucci --- pkg/ruler/ruler.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/ruler/ruler.go b/pkg/ruler/ruler.go index 0589de1db29..ad32af65ae9 100644 --- a/pkg/ruler/ruler.go +++ b/pkg/ruler/ruler.go @@ -325,6 +325,15 @@ func (r *Ruler) starting(ctx context.Context) error { return errors.Wrap(err, "unable to start ruler subservices") } + // Wait until the ring client detected this instance in the ACTIVE state to + // make sure that when we'll run the initial sync we already know the tokens + // assigned to this instance. + level.Info(r.logger).Log("msg", "waiting until ruler is ACTIVE in the ring") + if err := ring.WaitInstanceState(ctx, r.ring, r.lifecycler.GetInstanceID(), ring.ACTIVE); err != nil { + return err + } + level.Info(r.logger).Log("msg", "ruler is ACTIVE in the ring") + // TODO: ideally, ruler would wait until its queryable is finished starting. return nil } From 6c7863a1eb10768d62231ffa563ebcd1a847a8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel=20Ortu=C3=B1o?= Date: Tue, 1 Feb 2022 17:54:20 +0100 Subject: [PATCH 071/168] Remove `api.response_compression_enabled` flag (#880) * Always enable api compression and remove api.response_compression_enabled flag * updated CHANGELOG.md * remove api.response_compression_enabled flag usage * disable write-path api response compression * Update CHANGELOG.md Co-authored-by: Marco Pracucci * api: add gzip flag to register route log * removed missing api.response-compression-enabled flag occurrences * fix reference help * Update CHANGELOG.md Co-authored-by: Marco Pracucci * addressed PR comments Co-authored-by: Marco Pracucci --- CHANGELOG.md | 1 + cmd/mimir/help-all.txt.tmpl | 2 - cmd/mimir/help.txt.tmpl | 2 - .../configuration/config-file-reference.md | 5 - integration/configs.go | 2 - .../mimir-tests/test-defaults-generated.yaml | 1 - ...est-disable-chunk-streaming-generated.yaml | 2 - .../test-query-sharding-generated.yaml | 2 - .../test-shuffle-sharding-generated.yaml | 2 - .../test-storage-azure-generated.yaml | 2 - .../test-storage-gcs-generated.yaml | 2 - .../test-storage-s3-generated.yaml | 2 - operations/mimir/query-frontend.libsonnet | 4 - operations/mimir/ruler.libsonnet | 1 - pkg/api/api.go | 174 +++++++++--------- 15 files changed, 86 insertions(+), 118 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55a79337d6c..fdd8476c93a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ * CLI flag `-blocks-storage.tsdb.max-exemplars` is renamed to `-ingester.max-global-exemplars-per-user`. * YAML `max_exemplars` is moved from `tsdb` to `overrides` and renamed to `max_global_exemplars_per_user`. * [CHANGE] The metric `cortex_deprecated_flags_inuse_total` has been renamed to `deprecated_flags_inuse_total` as part of using grafana/dskit functionality. #185 +* [CHANGE] API: The `-api.response-compression-enabled` flag has been removed, and GZIP response compression is always enabled except on `/api/v1/push` and `/push` endpoints. #880 * [CHANGE] Alertmanager: Don't count user-not-found errors from replicas as failures in the `cortex_alertmanager_state_fetch_replica_state_failed_total` metric. #190 * [CHANGE] Alertmanager: Use distributor for non-API routes when sharding is enabled. #213 * [CHANGE] Query-frontend: added `sharded` label to `cortex_query_seconds_total` metric. #235 diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index adac0691969..6771855d5d7 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -227,8 +227,6 @@ Usage of ./cmd/mimir/mimir: How long to keep data for. (default 120h0m0s) -alertmanager.web.external-url value The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself. If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Alertmanager. (default http://localhost) - -api.response-compression-enabled - Use GZIP compression for API responses. Some endpoints serve large YAML or JSON blobs which can benefit from compression. -api.skip-label-name-validation-header-enabled Allows to skip label name validation via header on the http write path. Use with caution as it breaks PromQL. Allowing this for external clients allows any client to send invalid label names. After enabling it, requests with a specific HTTP header set to true will not have label names validated. -auth.enabled diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index e7b107df362..6ae6aa1f860 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -131,8 +131,6 @@ Usage of ./cmd/mimir/mimir: Base path for data storage. (default "data/") -alertmanager.web.external-url value The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself. If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Alertmanager. (default http://localhost) - -api.response-compression-enabled - Use GZIP compression for API responses. Some endpoints serve large YAML or JSON blobs which can benefit from compression. -auth.enabled Set to false to disable auth. (default true) -blocks-storage.azure.account-key value diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 1e5d0ead19c..a0406616bcd 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -69,11 +69,6 @@ Where default_value is the value to use if the environment variable is undefined [http_prefix: | default = "/api/prom"] api: - # Use GZIP compression for API responses. Some endpoints serve large YAML or - # JSON blobs which can benefit from compression. - # CLI flag: -api.response-compression-enabled - [response_compression_enabled: | default = false] - # [advanced] Allows to skip label name validation via header on the http write # path. Use with caution as it breaks PromQL. Allowing this for external # clients allows any client to send invalid label names. After enabling it, diff --git a/integration/configs.go b/integration/configs.go index f4adedbb953..7c3fa586d92 100644 --- a/integration/configs.go +++ b/integration/configs.go @@ -80,7 +80,6 @@ var ( return map[string]string{ "-alertmanager.configs.poll-interval": "1s", "-alertmanager.web.external-url": "http://localhost/api/prom", - "-api.response-compression-enabled": "true", } } @@ -127,7 +126,6 @@ var ( RulerFlags = func() map[string]string { return map[string]string{ - "-api.response-compression-enabled": "true", "-ruler.poll-interval": "2s", "-ruler.enable-api": "true", "-ruler-storage.backend": "s3", diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml index 43fec80c637..bbef5571753 100644 --- a/operations/mimir-tests/test-defaults-generated.yaml +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -836,7 +836,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -frontend.align-querier-with-step=false - -frontend.cache-results=true - -frontend.max-cache-freshness=10m diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index 8369f9c69e6..aa8f3aaf63d 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -914,7 +914,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -frontend.align-querier-with-step=false - -frontend.cache-results=true - -frontend.max-cache-freshness=10m @@ -1052,7 +1051,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index 9e5714c7975..d2e7110bf26 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -913,7 +913,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -frontend.align-querier-with-step=false - -frontend.cache-results=true - -frontend.max-cache-freshness=10m @@ -1055,7 +1054,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index e27b6fa55ee..3620125b47a 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -917,7 +917,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -frontend.align-querier-with-step=false - -frontend.cache-results=true - -frontend.max-cache-freshness=10m @@ -1057,7 +1056,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index cf79ac1ff78..70408e4f18e 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -915,7 +915,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -frontend.align-querier-with-step=false - -frontend.cache-results=true - -frontend.max-cache-freshness=10m @@ -1053,7 +1052,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -blocks-storage.azure.account-key=blocks-account-key - -blocks-storage.azure.account-name=blocks-account-name - -blocks-storage.azure.container-name=blocks-bucket diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 0bbe0e3e962..42ef58d0232 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -913,7 +913,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -frontend.align-querier-with-step=false - -frontend.cache-results=true - -frontend.max-cache-freshness=10m @@ -1051,7 +1050,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -blocks-storage.backend=gcs - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index 24a3cfc1bda..9bf79ed084a 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -914,7 +914,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -frontend.align-querier-with-step=false - -frontend.cache-results=true - -frontend.max-cache-freshness=10m @@ -1052,7 +1051,6 @@ spec: topologyKey: kubernetes.io/hostname containers: - args: - - -api.response-compression-enabled=true - -blocks-storage.backend=s3 - -blocks-storage.bucket-store.bucket-index.enabled=true - -blocks-storage.bucket-store.metadata-cache.backend=memcached diff --git a/operations/mimir/query-frontend.libsonnet b/operations/mimir/query-frontend.libsonnet index 61f1785fbc6..8c1c3991ef7 100644 --- a/operations/mimir/query-frontend.libsonnet +++ b/operations/mimir/query-frontend.libsonnet @@ -25,10 +25,6 @@ // So that exporters like cloudwatch can still send in data and be un-cached. 'frontend.max-cache-freshness': '10m', - // Use GZIP compression for API responses; improves latency for very big results and slow - // connections. - 'api.response-compression-enabled': true, - // So it can receive big responses from the querier. 'server.grpc-max-recv-msg-size-bytes': 100 << 20, diff --git a/operations/mimir/ruler.libsonnet b/operations/mimir/ruler.libsonnet index c18c965ed6c..d0feadd3932 100644 --- a/operations/mimir/ruler.libsonnet +++ b/operations/mimir/ruler.libsonnet @@ -19,7 +19,6 @@ // Alertmanager configs 'ruler.alertmanager-url': 'http://alertmanager.%s.svc.cluster.local/alertmanager' % $._config.namespace, 'ruler.enable-api': true, - 'api.response-compression-enabled': true, // Ring Configs 'ruler.ring.store': 'consul', diff --git a/pkg/api/api.go b/pkg/api/api.go index 569a306ef20..618e27992dc 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -46,7 +46,6 @@ type DistributorPushWrapper func(next push.Func) push.Func type ConfigHandler func(actualCfg interface{}, defaultCfg interface{}) http.HandlerFunc type Config struct { - ResponseCompression bool `yaml:"response_compression_enabled"` SkipLabelNameValidationHeader bool `yaml:"skip_label_name_validation_header_enabled" category:"advanced"` AlertmanagerHTTPPrefix string `yaml:"alertmanager_http_prefix" category:"advanced"` @@ -70,7 +69,6 @@ type Config struct { // RegisterFlags adds the flags required to config this to the given FlagSet. func (cfg *Config) RegisterFlags(f *flag.FlagSet) { - f.BoolVar(&cfg.ResponseCompression, "api.response-compression-enabled", false, "Use GZIP compression for API responses. Some endpoints serve large YAML or JSON blobs which can benefit from compression.") // TODO(56quarters): Mention the specific header "X-Mimir-SkipLabelNameValidation" after Mimir is public f.BoolVar(&cfg.SkipLabelNameValidationHeader, "api.skip-label-name-validation-header-enabled", false, "Allows to skip label name validation via header on the http write path. Use with caution as it breaks PromQL. Allowing this for external clients allows any client to send invalid label names. After enabling it, requests with a specific HTTP header set to true will not have label names validated.") cfg.RegisterFlagsWithPrefix("", f) @@ -134,16 +132,15 @@ func New(cfg Config, serverCfg server.Config, s *server.Server, logger log.Logge // RegisterRoute registers a single route enforcing HTTP methods. A single // route is expected to be specific about which HTTP methods are supported. -func (a *API) RegisterRoute(path string, handler http.Handler, auth bool, method string, methods ...string) { +func (a *API) RegisterRoute(path string, handler http.Handler, auth, gzipEnabled bool, method string, methods ...string) { methods = append([]string{method}, methods...) - level.Debug(a.logger).Log("msg", "api: registering route", "methods", strings.Join(methods, ","), "path", path, "auth", auth) + level.Debug(a.logger).Log("msg", "api: registering route", "methods", strings.Join(methods, ","), "path", path, "auth", auth, "gzip", gzipEnabled) if auth { handler = a.AuthMiddleware.Wrap(handler) } - - if a.cfg.ResponseCompression { + if gzipEnabled { handler = gziphandler.GzipHandler(handler) } @@ -154,13 +151,12 @@ func (a *API) RegisterRoute(path string, handler http.Handler, auth bool, method a.server.HTTP.Path(path).Methods(methods...).Handler(handler) } -func (a *API) RegisterRoutesWithPrefix(prefix string, handler http.Handler, auth bool, methods ...string) { - level.Debug(a.logger).Log("msg", "api: registering route", "methods", strings.Join(methods, ","), "prefix", prefix, "auth", auth) +func (a *API) RegisterRoutesWithPrefix(prefix string, handler http.Handler, auth, gzipEnabled bool, methods ...string) { + level.Debug(a.logger).Log("msg", "api: registering route", "methods", strings.Join(methods, ","), "prefix", prefix, "auth", auth, "gzip", gzipEnabled) if auth { handler = a.AuthMiddleware.Wrap(handler) } - - if a.cfg.ResponseCompression { + if gzipEnabled { handler = gziphandler.GzipHandler(handler) } @@ -179,29 +175,29 @@ func (a *API) RegisterAlertmanager(am *alertmanager.MultitenantAlertmanager, tar a.indexPage.AddLink(SectionAdminEndpoints, "/multitenant_alertmanager/status", "Alertmanager Status") a.indexPage.AddLink(SectionAdminEndpoints, "/multitenant_alertmanager/ring", "Alertmanager Ring Status") // Ensure this route is registered before the prefixed AM route - a.RegisterRoute("/multitenant_alertmanager/status", am.GetStatusHandler(), false, "GET") - a.RegisterRoute("/multitenant_alertmanager/configs", http.HandlerFunc(am.ListAllConfigs), false, "GET") - a.RegisterRoute("/multitenant_alertmanager/ring", http.HandlerFunc(am.RingHandler), false, "GET", "POST") - a.RegisterRoute("/multitenant_alertmanager/delete_tenant_config", http.HandlerFunc(am.DeleteUserConfig), true, "POST") + a.RegisterRoute("/multitenant_alertmanager/status", am.GetStatusHandler(), false, true, "GET") + a.RegisterRoute("/multitenant_alertmanager/configs", http.HandlerFunc(am.ListAllConfigs), false, true, "GET") + a.RegisterRoute("/multitenant_alertmanager/ring", http.HandlerFunc(am.RingHandler), false, true, "GET", "POST") + a.RegisterRoute("/multitenant_alertmanager/delete_tenant_config", http.HandlerFunc(am.DeleteUserConfig), true, true, "POST") // UI components lead to a large number of routes to support, utilize a path prefix instead - a.RegisterRoutesWithPrefix(a.cfg.AlertmanagerHTTPPrefix, am, true) + a.RegisterRoutesWithPrefix(a.cfg.AlertmanagerHTTPPrefix, am, true, true) level.Debug(a.logger).Log("msg", "api: registering alertmanager", "path_prefix", a.cfg.AlertmanagerHTTPPrefix) // MultiTenant Alertmanager API routes if apiEnabled { - a.RegisterRoute("/api/v1/alerts", http.HandlerFunc(am.GetUserConfig), true, "GET") - a.RegisterRoute("/api/v1/alerts", http.HandlerFunc(am.SetUserConfig), true, "POST") - a.RegisterRoute("/api/v1/alerts", http.HandlerFunc(am.DeleteUserConfig), true, "DELETE") + a.RegisterRoute("/api/v1/alerts", http.HandlerFunc(am.GetUserConfig), true, true, "GET") + a.RegisterRoute("/api/v1/alerts", http.HandlerFunc(am.SetUserConfig), true, true, "POST") + a.RegisterRoute("/api/v1/alerts", http.HandlerFunc(am.DeleteUserConfig), true, true, "DELETE") } // If the target is Alertmanager, enable the legacy behaviour. Otherwise only enable // the component routed API. if target { - a.RegisterRoute("/status", am.GetStatusHandler(), false, "GET") + a.RegisterRoute("/status", am.GetStatusHandler(), false, true, "GET") // WARNING: If LegacyHTTPPrefix is an empty string, any other paths added after this point will be // silently ignored by the HTTP service. Therefore, this must be the last route to be configured. - a.RegisterRoutesWithPrefix(a.cfg.LegacyHTTPPrefix, am, true) + a.RegisterRoutesWithPrefix(a.cfg.LegacyHTTPPrefix, am, true, true) } } @@ -210,9 +206,9 @@ func (a *API) RegisterAPI(httpPathPrefix string, actualCfg interface{}, defaultC a.indexPage.AddLink(SectionAdminEndpoints, "/config", "Current Config (including the default values)") a.indexPage.AddLink(SectionAdminEndpoints, "/config?mode=diff", "Current Config (show only values that differ from the defaults)") - a.RegisterRoute("/config", a.cfg.configHandler(actualCfg, defaultCfg), false, "GET") - a.RegisterRoute("/", indexHandler(httpPathPrefix, a.indexPage), false, "GET") - a.RegisterRoute("/debug/fgprof", fgprof.Handler(), false, "GET") + a.RegisterRoute("/config", a.cfg.configHandler(actualCfg, defaultCfg), false, true, "GET") + a.RegisterRoute("/", indexHandler(httpPathPrefix, a.indexPage), false, true, "GET") + a.RegisterRoute("/debug/fgprof", fgprof.Handler(), false, true, "GET") } // RegisterRuntimeConfig registers the endpoints associates with the runtime configuration @@ -220,27 +216,27 @@ func (a *API) RegisterRuntimeConfig(runtimeConfigHandler http.HandlerFunc) { a.indexPage.AddLink(SectionAdminEndpoints, "/runtime_config", "Current Runtime Config (incl. Overrides)") a.indexPage.AddLink(SectionAdminEndpoints, "/runtime_config?mode=diff", "Current Runtime Config (show only values that differ from the defaults)") - a.RegisterRoute("/runtime_config", runtimeConfigHandler, false, "GET") + a.RegisterRoute("/runtime_config", runtimeConfigHandler, false, true, "GET") } // RegisterDistributor registers the endpoints associated with the distributor. func (a *API) RegisterDistributor(d *distributor.Distributor, pushConfig distributor.Config) { distributorpb.RegisterDistributorServer(a.server.GRPC, d) - a.RegisterRoute("/api/v1/push", push.Handler(pushConfig.MaxRecvMsgSize, a.sourceIPs, a.cfg.SkipLabelNameValidationHeader, a.cfg.wrapDistributorPush(d)), true, "POST") + a.RegisterRoute("/api/v1/push", push.Handler(pushConfig.MaxRecvMsgSize, a.sourceIPs, a.cfg.SkipLabelNameValidationHeader, a.cfg.wrapDistributorPush(d)), true, false, "POST") a.indexPage.AddLink(SectionAdminEndpoints, "/distributor/ring", "Distributor Ring Status") a.indexPage.AddLink(SectionAdminEndpoints, "/distributor/all_user_stats", "Usage Statistics") a.indexPage.AddLink(SectionAdminEndpoints, "/distributor/ha_tracker", "HA Tracking Status") - a.RegisterRoute("/distributor/ring", d, false, "GET", "POST") - a.RegisterRoute("/distributor/all_user_stats", http.HandlerFunc(d.AllUserStatsHandler), false, "GET") - a.RegisterRoute("/distributor/ha_tracker", d.HATracker, false, "GET") + a.RegisterRoute("/distributor/ring", d, false, true, "GET", "POST") + a.RegisterRoute("/distributor/all_user_stats", http.HandlerFunc(d.AllUserStatsHandler), false, true, "GET") + a.RegisterRoute("/distributor/ha_tracker", d.HATracker, false, true, "GET") // Legacy Routes - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/push"), push.Handler(pushConfig.MaxRecvMsgSize, a.sourceIPs, a.cfg.SkipLabelNameValidationHeader, a.cfg.wrapDistributorPush(d)), true, "POST") - a.RegisterRoute("/all_user_stats", http.HandlerFunc(d.AllUserStatsHandler), false, "GET") - a.RegisterRoute("/ha-tracker", d.HATracker, false, "GET") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/push"), push.Handler(pushConfig.MaxRecvMsgSize, a.sourceIPs, a.cfg.SkipLabelNameValidationHeader, a.cfg.wrapDistributorPush(d)), true, false, "POST") + a.RegisterRoute("/all_user_stats", http.HandlerFunc(d.AllUserStatsHandler), false, true, "GET") + a.RegisterRoute("/ha-tracker", d.HATracker, false, true, "GET") } // Ingester is defined as an interface to allow for alternative implementations @@ -258,34 +254,34 @@ func (a *API) RegisterIngester(i Ingester, pushConfig distributor.Config) { a.indexPage.AddLink(SectionDangerous, "/ingester/flush", "Trigger a Flush of data from Ingester to storage") a.indexPage.AddLink(SectionDangerous, "/ingester/shutdown", "Trigger Ingester Shutdown (Dangerous)") - a.RegisterRoute("/ingester/flush", http.HandlerFunc(i.FlushHandler), false, "GET", "POST") - a.RegisterRoute("/ingester/shutdown", http.HandlerFunc(i.ShutdownHandler), false, "GET", "POST") - a.RegisterRoute("/ingester/push", push.Handler(pushConfig.MaxRecvMsgSize, a.sourceIPs, a.cfg.SkipLabelNameValidationHeader, i.PushWithCleanup), true, "POST") // For testing and debugging. + a.RegisterRoute("/ingester/flush", http.HandlerFunc(i.FlushHandler), false, true, "GET", "POST") + a.RegisterRoute("/ingester/shutdown", http.HandlerFunc(i.ShutdownHandler), false, true, "GET", "POST") + a.RegisterRoute("/ingester/push", push.Handler(pushConfig.MaxRecvMsgSize, a.sourceIPs, a.cfg.SkipLabelNameValidationHeader, i.PushWithCleanup), true, false, "POST") // For testing and debugging. // Legacy Routes - a.RegisterRoute("/flush", http.HandlerFunc(i.FlushHandler), false, "GET", "POST") - a.RegisterRoute("/shutdown", http.HandlerFunc(i.ShutdownHandler), false, "GET", "POST") - a.RegisterRoute("/push", push.Handler(pushConfig.MaxRecvMsgSize, a.sourceIPs, a.cfg.SkipLabelNameValidationHeader, i.PushWithCleanup), true, "POST") // For testing and debugging. + a.RegisterRoute("/flush", http.HandlerFunc(i.FlushHandler), false, true, "GET", "POST") + a.RegisterRoute("/shutdown", http.HandlerFunc(i.ShutdownHandler), false, true, "GET", "POST") + a.RegisterRoute("/push", push.Handler(pushConfig.MaxRecvMsgSize, a.sourceIPs, a.cfg.SkipLabelNameValidationHeader, i.PushWithCleanup), true, false, "POST") // For testing and debugging. } func (a *API) RegisterTenantDeletion(api *purger.TenantDeletionAPI) { - a.RegisterRoute("/purger/delete_tenant", http.HandlerFunc(api.DeleteTenant), true, "POST") - a.RegisterRoute("/purger/delete_tenant_status", http.HandlerFunc(api.DeleteTenantStatus), true, "GET") + a.RegisterRoute("/purger/delete_tenant", http.HandlerFunc(api.DeleteTenant), true, true, "POST") + a.RegisterRoute("/purger/delete_tenant_status", http.HandlerFunc(api.DeleteTenantStatus), true, true, "GET") } // RegisterRuler registers routes associated with the Ruler service. func (a *API) RegisterRuler(r *ruler.Ruler) { a.indexPage.AddLink(SectionAdminEndpoints, "/ruler/ring", "Ruler Ring Status") - a.RegisterRoute("/ruler/ring", r, false, "GET", "POST") + a.RegisterRoute("/ruler/ring", r, false, true, "GET", "POST") // Administrative API, uses authentication to inform which user's configuration to delete. - a.RegisterRoute("/ruler/delete_tenant_config", http.HandlerFunc(r.DeleteTenantConfiguration), true, "POST") + a.RegisterRoute("/ruler/delete_tenant_config", http.HandlerFunc(r.DeleteTenantConfiguration), true, true, "POST") // Legacy Ring Route - a.RegisterRoute("/ruler_ring", r, false, "GET", "POST") + a.RegisterRoute("/ruler_ring", r, false, true, "GET", "POST") // List all user rule groups - a.RegisterRoute("/ruler/rule_groups", http.HandlerFunc(r.ListAllRules), false, "GET") + a.RegisterRoute("/ruler/rule_groups", http.HandlerFunc(r.ListAllRules), false, true, "GET") ruler.RegisterRulerServer(a.server.GRPC, r) } @@ -293,37 +289,37 @@ func (a *API) RegisterRuler(r *ruler.Ruler) { // RegisterRulerAPI registers routes associated with the Ruler API func (a *API) RegisterRulerAPI(r *ruler.API) { // Prometheus Rule API Routes - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/rules"), http.HandlerFunc(r.PrometheusRules), true, "GET") - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/alerts"), http.HandlerFunc(r.PrometheusAlerts), true, "GET") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/rules"), http.HandlerFunc(r.PrometheusRules), true, true, "GET") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/alerts"), http.HandlerFunc(r.PrometheusAlerts), true, true, "GET") // Ruler API Routes - a.RegisterRoute("/api/v1/rules", http.HandlerFunc(r.ListRules), true, "GET") - a.RegisterRoute("/api/v1/rules/{namespace}", http.HandlerFunc(r.ListRules), true, "GET") - a.RegisterRoute("/api/v1/rules/{namespace}/{groupName}", http.HandlerFunc(r.GetRuleGroup), true, "GET") - a.RegisterRoute("/api/v1/rules/{namespace}", http.HandlerFunc(r.CreateRuleGroup), true, "POST") - a.RegisterRoute("/api/v1/rules/{namespace}/{groupName}", http.HandlerFunc(r.DeleteRuleGroup), true, "DELETE") - a.RegisterRoute("/api/v1/rules/{namespace}", http.HandlerFunc(r.DeleteNamespace), true, "DELETE") + a.RegisterRoute("/api/v1/rules", http.HandlerFunc(r.ListRules), true, true, "GET") + a.RegisterRoute("/api/v1/rules/{namespace}", http.HandlerFunc(r.ListRules), true, true, "GET") + a.RegisterRoute("/api/v1/rules/{namespace}/{groupName}", http.HandlerFunc(r.GetRuleGroup), true, true, "GET") + a.RegisterRoute("/api/v1/rules/{namespace}", http.HandlerFunc(r.CreateRuleGroup), true, true, "POST") + a.RegisterRoute("/api/v1/rules/{namespace}/{groupName}", http.HandlerFunc(r.DeleteRuleGroup), true, true, "DELETE") + a.RegisterRoute("/api/v1/rules/{namespace}", http.HandlerFunc(r.DeleteNamespace), true, true, "DELETE") // Legacy Prometheus Rule API Routes - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/rules"), http.HandlerFunc(r.PrometheusRules), true, "GET") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/alerts"), http.HandlerFunc(r.PrometheusAlerts), true, "GET") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/rules"), http.HandlerFunc(r.PrometheusRules), true, true, "GET") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/alerts"), http.HandlerFunc(r.PrometheusAlerts), true, true, "GET") // Legacy Ruler API Routes - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules"), http.HandlerFunc(r.ListRules), true, "GET") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules/{namespace}"), http.HandlerFunc(r.ListRules), true, "GET") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules/{namespace}/{groupName}"), http.HandlerFunc(r.GetRuleGroup), true, "GET") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules/{namespace}"), http.HandlerFunc(r.CreateRuleGroup), true, "POST") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules/{namespace}/{groupName}"), http.HandlerFunc(r.DeleteRuleGroup), true, "DELETE") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules/{namespace}"), http.HandlerFunc(r.DeleteNamespace), true, "DELETE") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules"), http.HandlerFunc(r.ListRules), true, true, "GET") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules/{namespace}"), http.HandlerFunc(r.ListRules), true, true, "GET") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules/{namespace}/{groupName}"), http.HandlerFunc(r.GetRuleGroup), true, true, "GET") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules/{namespace}"), http.HandlerFunc(r.CreateRuleGroup), true, true, "POST") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules/{namespace}/{groupName}"), http.HandlerFunc(r.DeleteRuleGroup), true, true, "DELETE") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/rules/{namespace}"), http.HandlerFunc(r.DeleteNamespace), true, true, "DELETE") } // RegisterRing registers the ring UI page associated with the distributor for writes. func (a *API) RegisterRing(r http.Handler) { a.indexPage.AddLink(SectionAdminEndpoints, "/ingester/ring", "Ingester Ring Status") - a.RegisterRoute("/ingester/ring", r, false, "GET", "POST") + a.RegisterRoute("/ingester/ring", r, false, true, "GET", "POST") // Legacy Route - a.RegisterRoute("/ring", r, false, "GET", "POST") + a.RegisterRoute("/ring", r, false, true, "GET", "POST") } // RegisterStoreGateway registers the ring UI page associated with the store-gateway. @@ -332,15 +328,15 @@ func (a *API) RegisterStoreGateway(s *storegateway.StoreGateway) { a.indexPage.AddLink(SectionAdminEndpoints, "/store-gateway/ring", "Store Gateway Ring") a.indexPage.AddLink(SectionAdminEndpoints, "/store-gateway/tenants", "Store Gateway Tenants & Blocks") - a.RegisterRoute("/store-gateway/ring", http.HandlerFunc(s.RingHandler), false, "GET", "POST") - a.RegisterRoute("/store-gateway/tenants", http.HandlerFunc(s.TenantsHandler), false, "GET") - a.RegisterRoute("/store-gateway/tenant/{tenant}/blocks", http.HandlerFunc(s.BlocksHandler), false, "GET") + a.RegisterRoute("/store-gateway/ring", http.HandlerFunc(s.RingHandler), false, true, "GET", "POST") + a.RegisterRoute("/store-gateway/tenants", http.HandlerFunc(s.TenantsHandler), false, true, "GET") + a.RegisterRoute("/store-gateway/tenant/{tenant}/blocks", http.HandlerFunc(s.BlocksHandler), false, true, "GET") } // RegisterCompactor registers the ring UI page associated with the compactor. func (a *API) RegisterCompactor(c *compactor.MultitenantCompactor) { a.indexPage.AddLink(SectionAdminEndpoints, "/compactor/ring", "Compactor Ring Status") - a.RegisterRoute("/compactor/ring", http.HandlerFunc(c.RingHandler), false, "GET", "POST") + a.RegisterRoute("/compactor/ring", http.HandlerFunc(c.RingHandler), false, true, "GET", "POST") } type Distributor interface { @@ -355,34 +351,34 @@ func (a *API) RegisterQueryable( distributor Distributor, ) { // these routes are always registered to the default server - a.RegisterRoute("/api/v1/user_stats", http.HandlerFunc(distributor.UserStatsHandler), true, "GET") + a.RegisterRoute("/api/v1/user_stats", http.HandlerFunc(distributor.UserStatsHandler), true, true, "GET") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/user_stats"), http.HandlerFunc(distributor.UserStatsHandler), true, "GET") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/user_stats"), http.HandlerFunc(distributor.UserStatsHandler), true, true, "GET") } // RegisterQueryAPI registers the Prometheus API routes with the provided handler. func (a *API) RegisterQueryAPI(handler http.Handler) { - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/read"), handler, true, "POST") - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/query"), handler, true, "GET", "POST") - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/query_range"), handler, true, "GET", "POST") - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/query_exemplars"), handler, true, "GET", "POST") - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/labels"), handler, true, "GET", "POST") - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/label/{name}/values"), handler, true, "GET") - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/series"), handler, true, "GET", "POST", "DELETE") - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/metadata"), handler, true, "GET") - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/cardinality/label_names"), handler, true, "GET", "POST") - a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/cardinality/label_values"), handler, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/read"), handler, true, true, "POST") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/query"), handler, true, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/query_range"), handler, true, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/query_exemplars"), handler, true, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/labels"), handler, true, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/label/{name}/values"), handler, true, true, "GET") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/series"), handler, true, true, "GET", "POST", "DELETE") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/metadata"), handler, true, true, "GET") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/cardinality/label_names"), handler, true, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/cardinality/label_values"), handler, true, true, "GET", "POST") // Register Legacy Routers - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/read"), handler, true, "POST") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/query"), handler, true, "GET", "POST") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/query_range"), handler, true, "GET", "POST") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/query_exemplars"), handler, true, "GET", "POST") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/labels"), handler, true, "GET", "POST") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/label/{name}/values"), handler, true, "GET") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/series"), handler, true, "GET", "POST", "DELETE") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/metadata"), handler, true, "GET") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/cardinality/label_names"), handler, true, "GET", "POST") - a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/cardinality/label_values"), handler, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/read"), handler, true, true, "POST") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/query"), handler, true, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/query_range"), handler, true, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/query_exemplars"), handler, true, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/labels"), handler, true, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/label/{name}/values"), handler, true, true, "GET") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/series"), handler, true, true, "GET", "POST", "DELETE") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/metadata"), handler, true, true, "GET") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/cardinality/label_names"), handler, true, true, "GET", "POST") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/cardinality/label_values"), handler, true, true, "GET", "POST") } // RegisterQueryFrontend registers the Prometheus routes supported by the @@ -410,10 +406,10 @@ func (a *API) RegisterQueryScheduler(f *scheduler.Scheduler) { // or a future module manager #2291 func (a *API) RegisterServiceMapHandler(handler http.Handler) { a.indexPage.AddLink(SectionAdminEndpoints, "/services", "Service Status") - a.RegisterRoute("/services", handler, false, "GET") + a.RegisterRoute("/services", handler, false, true, "GET") } func (a *API) RegisterMemberlistKV(handler http.Handler) { a.indexPage.AddLink(SectionAdminEndpoints, "/memberlist", "Memberlist Status") - a.RegisterRoute("/memberlist", handler, false, "GET") + a.RegisterRoute("/memberlist", handler, false, true, "GET") } From d867e9921b1cb28563669b653322ff719caf4580 Mon Sep 17 00:00:00 2001 From: Patrick Oyarzun Date: Tue, 1 Feb 2022 11:56:29 -0500 Subject: [PATCH 072/168] Categorize storage-related parameters (#985) * Categorize storage-related parameters * Update config reference and help reference * Categorize s3 signature_version as advanced --- cmd/mimir/help.txt.tmpl | 84 ---------- docs/sources/blocks-storage/querier.md | 48 +++--- docs/sources/blocks-storage/store-gateway.md | 48 +++--- .../configuration/config-file-reference.md | 144 +++++++++--------- pkg/storage/bucket/azure/config.go | 6 +- pkg/storage/bucket/s3/config.go | 16 +- pkg/storage/bucket/swift/config.go | 6 +- 7 files changed, 139 insertions(+), 213 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 6ae6aa1f860..4a159a1ad0d 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -11,12 +11,6 @@ Usage of ./cmd/mimir/mimir: Azure storage container name -alertmanager-storage.azure.endpoint-suffix string Azure storage endpoint suffix without schema. The account name will be prefixed to this value to create the FQDN. If set to empty string, default endpoint suffix is used. - -alertmanager-storage.azure.max-retries int - Number of retries for recoverable errors (default 20) - -alertmanager-storage.azure.msi-resource string - If set, this URL is used instead of https://. for obtaining ServicePrincipalToken from MSI. - -alertmanager-storage.azure.user-assigned-id string - User assigned identity. If empty, then System assigned identity is used. -alertmanager-storage.backend string Backend storage to use. Supported backends are: s3, gcs, azure, swift, filesystem, local. (default "filesystem") -alertmanager-storage.filesystem.dir string @@ -33,26 +27,10 @@ Usage of ./cmd/mimir/mimir: S3 bucket name -alertmanager-storage.s3.endpoint string The S3 bucket endpoint. It could be an AWS S3 endpoint listed at https://docs.aws.amazon.com/general/latest/gr/s3.html or the address of an S3-compatible service in hostname:port format. - -alertmanager-storage.s3.expect-continue-timeout duration - The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) - -alertmanager-storage.s3.http.idle-conn-timeout duration - The time an idle connection will remain idle before closing. (default 1m30s) - -alertmanager-storage.s3.http.response-header-timeout duration - The amount of time the client will wait for a servers response headers. (default 2m0s) - -alertmanager-storage.s3.insecure - If enabled, use http:// for the S3 endpoint instead of https://. This could be useful in local dev/test environments while using an S3-compatible backend storage, like Minio. - -alertmanager-storage.s3.max-connections-per-host int - Maximum number of connections per host. 0 means no limit. - -alertmanager-storage.s3.max-idle-connections int - Maximum number of idle (keep-alive) connections across all hosts. 0 means no limit. (default 100) - -alertmanager-storage.s3.max-idle-connections-per-host int - Maximum number of idle (keep-alive) connections to keep per-host. If 0, a built-in default value is used. (default 100) -alertmanager-storage.s3.region string S3 region. If unset, the client will issue a S3 GetBucketLocation API call to autodetect it. -alertmanager-storage.s3.secret-access-key value S3 secret access key - -alertmanager-storage.s3.signature-version string - The signature version to use for authenticating against S3. Supported values are: v4, v2. (default "v4") -alertmanager-storage.s3.sse.kms-encryption-context string KMS Encryption Context used for object encryption. It expects JSON formatted string. -alertmanager-storage.s3.sse.kms-key-id string @@ -63,16 +41,12 @@ Usage of ./cmd/mimir/mimir: OpenStack Swift authentication URL -alertmanager-storage.swift.auth-version int OpenStack Swift authentication API version. 0 to autodetect. - -alertmanager-storage.swift.connect-timeout duration - Time after which a connection attempt is aborted. (default 10s) -alertmanager-storage.swift.container-name string Name of the OpenStack Swift container to put chunks in. -alertmanager-storage.swift.domain-id string OpenStack Swift user's domain ID. -alertmanager-storage.swift.domain-name string OpenStack Swift user's domain name. - -alertmanager-storage.swift.max-retries int - Max retries on requests error. (default 3) -alertmanager-storage.swift.password string OpenStack Swift API key. -alertmanager-storage.swift.project-domain-id string @@ -85,8 +59,6 @@ Usage of ./cmd/mimir/mimir: OpenStack Swift project name (v2,v3 auth only). -alertmanager-storage.swift.region-name string OpenStack Swift Region to use (v2,v3 auth only). - -alertmanager-storage.swift.request-timeout duration - Time after which an idle request is aborted. The timeout watchdog is reset each time some data is received, so the timeout triggers after X time no data is received on a request. (default 5s) -alertmanager-storage.swift.user-domain-id string OpenStack Swift user's domain ID. -alertmanager-storage.swift.user-domain-name string @@ -141,12 +113,6 @@ Usage of ./cmd/mimir/mimir: Azure storage container name -blocks-storage.azure.endpoint-suffix string Azure storage endpoint suffix without schema. The account name will be prefixed to this value to create the FQDN. If set to empty string, default endpoint suffix is used. - -blocks-storage.azure.max-retries int - Number of retries for recoverable errors (default 20) - -blocks-storage.azure.msi-resource string - If set, this URL is used instead of https://. for obtaining ServicePrincipalToken from MSI. - -blocks-storage.azure.user-assigned-id string - User assigned identity. If empty, then System assigned identity is used. -blocks-storage.backend string Backend storage to use. Supported backends are: s3, gcs, azure, swift, filesystem. (default "filesystem") -blocks-storage.bucket-store.block-sync-concurrency int @@ -283,26 +249,10 @@ Usage of ./cmd/mimir/mimir: S3 bucket name -blocks-storage.s3.endpoint string The S3 bucket endpoint. It could be an AWS S3 endpoint listed at https://docs.aws.amazon.com/general/latest/gr/s3.html or the address of an S3-compatible service in hostname:port format. - -blocks-storage.s3.expect-continue-timeout duration - The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) - -blocks-storage.s3.http.idle-conn-timeout duration - The time an idle connection will remain idle before closing. (default 1m30s) - -blocks-storage.s3.http.response-header-timeout duration - The amount of time the client will wait for a servers response headers. (default 2m0s) - -blocks-storage.s3.insecure - If enabled, use http:// for the S3 endpoint instead of https://. This could be useful in local dev/test environments while using an S3-compatible backend storage, like Minio. - -blocks-storage.s3.max-connections-per-host int - Maximum number of connections per host. 0 means no limit. - -blocks-storage.s3.max-idle-connections int - Maximum number of idle (keep-alive) connections across all hosts. 0 means no limit. (default 100) - -blocks-storage.s3.max-idle-connections-per-host int - Maximum number of idle (keep-alive) connections to keep per-host. If 0, a built-in default value is used. (default 100) -blocks-storage.s3.region string S3 region. If unset, the client will issue a S3 GetBucketLocation API call to autodetect it. -blocks-storage.s3.secret-access-key value S3 secret access key - -blocks-storage.s3.signature-version string - The signature version to use for authenticating against S3. Supported values are: v4, v2. (default "v4") -blocks-storage.s3.sse.kms-encryption-context string KMS Encryption Context used for object encryption. It expects JSON formatted string. -blocks-storage.s3.sse.kms-key-id string @@ -313,16 +263,12 @@ Usage of ./cmd/mimir/mimir: OpenStack Swift authentication URL -blocks-storage.swift.auth-version int OpenStack Swift authentication API version. 0 to autodetect. - -blocks-storage.swift.connect-timeout duration - Time after which a connection attempt is aborted. (default 10s) -blocks-storage.swift.container-name string Name of the OpenStack Swift container to put chunks in. -blocks-storage.swift.domain-id string OpenStack Swift user's domain ID. -blocks-storage.swift.domain-name string OpenStack Swift user's domain name. - -blocks-storage.swift.max-retries int - Max retries on requests error. (default 3) -blocks-storage.swift.password string OpenStack Swift API key. -blocks-storage.swift.project-domain-id string @@ -335,8 +281,6 @@ Usage of ./cmd/mimir/mimir: OpenStack Swift project name (v2,v3 auth only). -blocks-storage.swift.region-name string OpenStack Swift Region to use (v2,v3 auth only). - -blocks-storage.swift.request-timeout duration - Time after which an idle request is aborted. The timeout watchdog is reset each time some data is received, so the timeout triggers after X time no data is received on a request. (default 5s) -blocks-storage.swift.user-domain-id string OpenStack Swift user's domain ID. -blocks-storage.swift.user-domain-name string @@ -795,12 +739,6 @@ Usage of ./cmd/mimir/mimir: Azure storage container name -ruler-storage.azure.endpoint-suffix string Azure storage endpoint suffix without schema. The account name will be prefixed to this value to create the FQDN. If set to empty string, default endpoint suffix is used. - -ruler-storage.azure.max-retries int - Number of retries for recoverable errors (default 20) - -ruler-storage.azure.msi-resource string - If set, this URL is used instead of https://. for obtaining ServicePrincipalToken from MSI. - -ruler-storage.azure.user-assigned-id string - User assigned identity. If empty, then System assigned identity is used. -ruler-storage.backend string Backend storage to use. Supported backends are: s3, gcs, azure, swift, filesystem, local. (default "filesystem") -ruler-storage.filesystem.dir string @@ -817,26 +755,10 @@ Usage of ./cmd/mimir/mimir: S3 bucket name -ruler-storage.s3.endpoint string The S3 bucket endpoint. It could be an AWS S3 endpoint listed at https://docs.aws.amazon.com/general/latest/gr/s3.html or the address of an S3-compatible service in hostname:port format. - -ruler-storage.s3.expect-continue-timeout duration - The time to wait for a server's first response headers after fully writing the request headers if the request has an Expect header. 0 to send the request body immediately. (default 1s) - -ruler-storage.s3.http.idle-conn-timeout duration - The time an idle connection will remain idle before closing. (default 1m30s) - -ruler-storage.s3.http.response-header-timeout duration - The amount of time the client will wait for a servers response headers. (default 2m0s) - -ruler-storage.s3.insecure - If enabled, use http:// for the S3 endpoint instead of https://. This could be useful in local dev/test environments while using an S3-compatible backend storage, like Minio. - -ruler-storage.s3.max-connections-per-host int - Maximum number of connections per host. 0 means no limit. - -ruler-storage.s3.max-idle-connections int - Maximum number of idle (keep-alive) connections across all hosts. 0 means no limit. (default 100) - -ruler-storage.s3.max-idle-connections-per-host int - Maximum number of idle (keep-alive) connections to keep per-host. If 0, a built-in default value is used. (default 100) -ruler-storage.s3.region string S3 region. If unset, the client will issue a S3 GetBucketLocation API call to autodetect it. -ruler-storage.s3.secret-access-key value S3 secret access key - -ruler-storage.s3.signature-version string - The signature version to use for authenticating against S3. Supported values are: v4, v2. (default "v4") -ruler-storage.s3.sse.kms-encryption-context string KMS Encryption Context used for object encryption. It expects JSON formatted string. -ruler-storage.s3.sse.kms-key-id string @@ -847,16 +769,12 @@ Usage of ./cmd/mimir/mimir: OpenStack Swift authentication URL -ruler-storage.swift.auth-version int OpenStack Swift authentication API version. 0 to autodetect. - -ruler-storage.swift.connect-timeout duration - Time after which a connection attempt is aborted. (default 10s) -ruler-storage.swift.container-name string Name of the OpenStack Swift container to put chunks in. -ruler-storage.swift.domain-id string OpenStack Swift user's domain ID. -ruler-storage.swift.domain-name string OpenStack Swift user's domain name. - -ruler-storage.swift.max-retries int - Max retries on requests error. (default 3) -ruler-storage.swift.password string OpenStack Swift API key. -ruler-storage.swift.project-domain-id string @@ -869,8 +787,6 @@ Usage of ./cmd/mimir/mimir: OpenStack Swift project name (v2,v3 auth only). -ruler-storage.swift.region-name string OpenStack Swift Region to use (v2,v3 auth only). - -ruler-storage.swift.request-timeout duration - Time after which an idle request is aborted. The timeout watchdog is reset each time some data is received, so the timeout triggers after X time no data is received on a request. (default 5s) -ruler-storage.swift.user-domain-id string OpenStack Swift user's domain ID. -ruler-storage.swift.user-domain-name string diff --git a/docs/sources/blocks-storage/querier.md b/docs/sources/blocks-storage/querier.md index f581936fd4f..a98172295f2 100644 --- a/docs/sources/blocks-storage/querier.md +++ b/docs/sources/blocks-storage/querier.md @@ -230,14 +230,14 @@ blocks_storage: # CLI flag: -blocks-storage.s3.access-key-id [access_key_id: | default = ""] - # If enabled, use http:// for the S3 endpoint instead of https://. This - # could be useful in local dev/test environments while using an - # S3-compatible backend storage, like Minio. + # [advanced] If enabled, use http:// for the S3 endpoint instead of + # https://. This could be useful in local dev/test environments while using + # an S3-compatible backend storage, like Minio. # CLI flag: -blocks-storage.s3.insecure [insecure: | default = false] - # The signature version to use for authenticating against S3. Supported - # values are: v4, v2. + # [advanced] The signature version to use for authenticating against S3. + # Supported values are: v4, v2. # CLI flag: -blocks-storage.s3.signature-version [signature_version: | default = "v4"] @@ -246,11 +246,12 @@ blocks_storage: [sse: ] http: - # The time an idle connection will remain idle before closing. + # [advanced] The time an idle connection will remain idle before closing. # CLI flag: -blocks-storage.s3.http.idle-conn-timeout [idle_conn_timeout: | default = 1m30s] - # The amount of time the client will wait for a servers response headers. + # [advanced] The amount of time the client will wait for a servers + # response headers. # CLI flag: -blocks-storage.s3.http.response-header-timeout [response_header_timeout: | default = 2m] @@ -263,23 +264,23 @@ blocks_storage: # CLI flag: -blocks-storage.s3.tls-handshake-timeout [tls_handshake_timeout: | default = 10s] - # The time to wait for a server's first response headers after fully - # writing the request headers if the request has an Expect header. 0 to - # send the request body immediately. + # [advanced] The time to wait for a server's first response headers after + # fully writing the request headers if the request has an Expect header. 0 + # to send the request body immediately. # CLI flag: -blocks-storage.s3.expect-continue-timeout [expect_continue_timeout: | default = 1s] - # Maximum number of idle (keep-alive) connections across all hosts. 0 - # means no limit. + # [advanced] Maximum number of idle (keep-alive) connections across all + # hosts. 0 means no limit. # CLI flag: -blocks-storage.s3.max-idle-connections [max_idle_connections: | default = 100] - # Maximum number of idle (keep-alive) connections to keep per-host. If 0, - # a built-in default value is used. + # [advanced] Maximum number of idle (keep-alive) connections to keep + # per-host. If 0, a built-in default value is used. # CLI flag: -blocks-storage.s3.max-idle-connections-per-host [max_idle_connections_per_host: | default = 100] - # Maximum number of connections per host. 0 means no limit. + # [advanced] Maximum number of connections per host. 0 means no limit. # CLI flag: -blocks-storage.s3.max-connections-per-host [max_connections_per_host: | default = 0] @@ -313,17 +314,18 @@ blocks_storage: # CLI flag: -blocks-storage.azure.endpoint-suffix [endpoint_suffix: | default = ""] - # Number of retries for recoverable errors + # [advanced] Number of retries for recoverable errors # CLI flag: -blocks-storage.azure.max-retries [max_retries: | default = 20] - # If set, this URL is used instead of + # [advanced] If set, this URL is used instead of # https://. for obtaining # ServicePrincipalToken from MSI. # CLI flag: -blocks-storage.azure.msi-resource [msi_resource: | default = ""] - # User assigned identity. If empty, then System assigned identity is used. + # [advanced] User assigned identity. If empty, then System assigned identity + # is used. # CLI flag: -blocks-storage.azure.user-assigned-id [user_assigned_id: | default = ""] @@ -390,17 +392,17 @@ blocks_storage: # CLI flag: -blocks-storage.swift.container-name [container_name: | default = ""] - # Max retries on requests error. + # [advanced] Max retries on requests error. # CLI flag: -blocks-storage.swift.max-retries [max_retries: | default = 3] - # Time after which a connection attempt is aborted. + # [advanced] Time after which a connection attempt is aborted. # CLI flag: -blocks-storage.swift.connect-timeout [connect_timeout: | default = 10s] - # Time after which an idle request is aborted. The timeout watchdog is reset - # each time some data is received, so the timeout triggers after X time no - # data is received on a request. + # [advanced] Time after which an idle request is aborted. The timeout + # watchdog is reset each time some data is received, so the timeout triggers + # after X time no data is received on a request. # CLI flag: -blocks-storage.swift.request-timeout [request_timeout: | default = 5s] diff --git a/docs/sources/blocks-storage/store-gateway.md b/docs/sources/blocks-storage/store-gateway.md index 09570e43a55..68ccd06c7df 100644 --- a/docs/sources/blocks-storage/store-gateway.md +++ b/docs/sources/blocks-storage/store-gateway.md @@ -306,14 +306,14 @@ blocks_storage: # CLI flag: -blocks-storage.s3.access-key-id [access_key_id: | default = ""] - # If enabled, use http:// for the S3 endpoint instead of https://. This - # could be useful in local dev/test environments while using an - # S3-compatible backend storage, like Minio. + # [advanced] If enabled, use http:// for the S3 endpoint instead of + # https://. This could be useful in local dev/test environments while using + # an S3-compatible backend storage, like Minio. # CLI flag: -blocks-storage.s3.insecure [insecure: | default = false] - # The signature version to use for authenticating against S3. Supported - # values are: v4, v2. + # [advanced] The signature version to use for authenticating against S3. + # Supported values are: v4, v2. # CLI flag: -blocks-storage.s3.signature-version [signature_version: | default = "v4"] @@ -322,11 +322,12 @@ blocks_storage: [sse: ] http: - # The time an idle connection will remain idle before closing. + # [advanced] The time an idle connection will remain idle before closing. # CLI flag: -blocks-storage.s3.http.idle-conn-timeout [idle_conn_timeout: | default = 1m30s] - # The amount of time the client will wait for a servers response headers. + # [advanced] The amount of time the client will wait for a servers + # response headers. # CLI flag: -blocks-storage.s3.http.response-header-timeout [response_header_timeout: | default = 2m] @@ -339,23 +340,23 @@ blocks_storage: # CLI flag: -blocks-storage.s3.tls-handshake-timeout [tls_handshake_timeout: | default = 10s] - # The time to wait for a server's first response headers after fully - # writing the request headers if the request has an Expect header. 0 to - # send the request body immediately. + # [advanced] The time to wait for a server's first response headers after + # fully writing the request headers if the request has an Expect header. 0 + # to send the request body immediately. # CLI flag: -blocks-storage.s3.expect-continue-timeout [expect_continue_timeout: | default = 1s] - # Maximum number of idle (keep-alive) connections across all hosts. 0 - # means no limit. + # [advanced] Maximum number of idle (keep-alive) connections across all + # hosts. 0 means no limit. # CLI flag: -blocks-storage.s3.max-idle-connections [max_idle_connections: | default = 100] - # Maximum number of idle (keep-alive) connections to keep per-host. If 0, - # a built-in default value is used. + # [advanced] Maximum number of idle (keep-alive) connections to keep + # per-host. If 0, a built-in default value is used. # CLI flag: -blocks-storage.s3.max-idle-connections-per-host [max_idle_connections_per_host: | default = 100] - # Maximum number of connections per host. 0 means no limit. + # [advanced] Maximum number of connections per host. 0 means no limit. # CLI flag: -blocks-storage.s3.max-connections-per-host [max_connections_per_host: | default = 0] @@ -389,17 +390,18 @@ blocks_storage: # CLI flag: -blocks-storage.azure.endpoint-suffix [endpoint_suffix: | default = ""] - # Number of retries for recoverable errors + # [advanced] Number of retries for recoverable errors # CLI flag: -blocks-storage.azure.max-retries [max_retries: | default = 20] - # If set, this URL is used instead of + # [advanced] If set, this URL is used instead of # https://. for obtaining # ServicePrincipalToken from MSI. # CLI flag: -blocks-storage.azure.msi-resource [msi_resource: | default = ""] - # User assigned identity. If empty, then System assigned identity is used. + # [advanced] User assigned identity. If empty, then System assigned identity + # is used. # CLI flag: -blocks-storage.azure.user-assigned-id [user_assigned_id: | default = ""] @@ -466,17 +468,17 @@ blocks_storage: # CLI flag: -blocks-storage.swift.container-name [container_name: | default = ""] - # Max retries on requests error. + # [advanced] Max retries on requests error. # CLI flag: -blocks-storage.swift.max-retries [max_retries: | default = 3] - # Time after which a connection attempt is aborted. + # [advanced] Time after which a connection attempt is aborted. # CLI flag: -blocks-storage.swift.connect-timeout [connect_timeout: | default = 10s] - # Time after which an idle request is aborted. The timeout watchdog is reset - # each time some data is received, so the timeout triggers after X time no - # data is received on a request. + # [advanced] Time after which an idle request is aborted. The timeout + # watchdog is reset each time some data is received, so the timeout triggers + # after X time no data is received on a request. # CLI flag: -blocks-storage.swift.request-timeout [request_timeout: | default = 5s] diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index a0406616bcd..6bbb6bf5430 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -1339,14 +1339,14 @@ s3: # CLI flag: -ruler-storage.s3.access-key-id [access_key_id: | default = ""] - # If enabled, use http:// for the S3 endpoint instead of https://. This could - # be useful in local dev/test environments while using an S3-compatible - # backend storage, like Minio. + # [advanced] If enabled, use http:// for the S3 endpoint instead of https://. + # This could be useful in local dev/test environments while using an + # S3-compatible backend storage, like Minio. # CLI flag: -ruler-storage.s3.insecure [insecure: | default = false] - # The signature version to use for authenticating against S3. Supported values - # are: v4, v2. + # [advanced] The signature version to use for authenticating against S3. + # Supported values are: v4, v2. # CLI flag: -ruler-storage.s3.signature-version [signature_version: | default = "v4"] @@ -1355,11 +1355,12 @@ s3: [sse: ] http: - # The time an idle connection will remain idle before closing. + # [advanced] The time an idle connection will remain idle before closing. # CLI flag: -ruler-storage.s3.http.idle-conn-timeout [idle_conn_timeout: | default = 1m30s] - # The amount of time the client will wait for a servers response headers. + # [advanced] The amount of time the client will wait for a servers response + # headers. # CLI flag: -ruler-storage.s3.http.response-header-timeout [response_header_timeout: | default = 2m] @@ -1372,23 +1373,23 @@ s3: # CLI flag: -ruler-storage.s3.tls-handshake-timeout [tls_handshake_timeout: | default = 10s] - # The time to wait for a server's first response headers after fully writing - # the request headers if the request has an Expect header. 0 to send the - # request body immediately. + # [advanced] The time to wait for a server's first response headers after + # fully writing the request headers if the request has an Expect header. 0 + # to send the request body immediately. # CLI flag: -ruler-storage.s3.expect-continue-timeout [expect_continue_timeout: | default = 1s] - # Maximum number of idle (keep-alive) connections across all hosts. 0 means - # no limit. + # [advanced] Maximum number of idle (keep-alive) connections across all + # hosts. 0 means no limit. # CLI flag: -ruler-storage.s3.max-idle-connections [max_idle_connections: | default = 100] - # Maximum number of idle (keep-alive) connections to keep per-host. If 0, a - # built-in default value is used. + # [advanced] Maximum number of idle (keep-alive) connections to keep + # per-host. If 0, a built-in default value is used. # CLI flag: -ruler-storage.s3.max-idle-connections-per-host [max_idle_connections_per_host: | default = 100] - # Maximum number of connections per host. 0 means no limit. + # [advanced] Maximum number of connections per host. 0 means no limit. # CLI flag: -ruler-storage.s3.max-connections-per-host [max_connections_per_host: | default = 0] @@ -1422,17 +1423,18 @@ azure: # CLI flag: -ruler-storage.azure.endpoint-suffix [endpoint_suffix: | default = ""] - # Number of retries for recoverable errors + # [advanced] Number of retries for recoverable errors # CLI flag: -ruler-storage.azure.max-retries [max_retries: | default = 20] - # If set, this URL is used instead of + # [advanced] If set, this URL is used instead of # https://. for obtaining # ServicePrincipalToken from MSI. # CLI flag: -ruler-storage.azure.msi-resource [msi_resource: | default = ""] - # User assigned identity. If empty, then System assigned identity is used. + # [advanced] User assigned identity. If empty, then System assigned identity + # is used. # CLI flag: -ruler-storage.azure.user-assigned-id [user_assigned_id: | default = ""] @@ -1499,17 +1501,17 @@ swift: # CLI flag: -ruler-storage.swift.container-name [container_name: | default = ""] - # Max retries on requests error. + # [advanced] Max retries on requests error. # CLI flag: -ruler-storage.swift.max-retries [max_retries: | default = 3] - # Time after which a connection attempt is aborted. + # [advanced] Time after which a connection attempt is aborted. # CLI flag: -ruler-storage.swift.connect-timeout [connect_timeout: | default = 10s] - # Time after which an idle request is aborted. The timeout watchdog is reset - # each time some data is received, so the timeout triggers after X time no - # data is received on a request. + # [advanced] Time after which an idle request is aborted. The timeout watchdog + # is reset each time some data is received, so the timeout triggers after X + # time no data is received on a request. # CLI flag: -ruler-storage.swift.request-timeout [request_timeout: | default = 5s] @@ -1745,14 +1747,14 @@ s3: # CLI flag: -alertmanager-storage.s3.access-key-id [access_key_id: | default = ""] - # If enabled, use http:// for the S3 endpoint instead of https://. This could - # be useful in local dev/test environments while using an S3-compatible - # backend storage, like Minio. + # [advanced] If enabled, use http:// for the S3 endpoint instead of https://. + # This could be useful in local dev/test environments while using an + # S3-compatible backend storage, like Minio. # CLI flag: -alertmanager-storage.s3.insecure [insecure: | default = false] - # The signature version to use for authenticating against S3. Supported values - # are: v4, v2. + # [advanced] The signature version to use for authenticating against S3. + # Supported values are: v4, v2. # CLI flag: -alertmanager-storage.s3.signature-version [signature_version: | default = "v4"] @@ -1761,11 +1763,12 @@ s3: [sse: ] http: - # The time an idle connection will remain idle before closing. + # [advanced] The time an idle connection will remain idle before closing. # CLI flag: -alertmanager-storage.s3.http.idle-conn-timeout [idle_conn_timeout: | default = 1m30s] - # The amount of time the client will wait for a servers response headers. + # [advanced] The amount of time the client will wait for a servers response + # headers. # CLI flag: -alertmanager-storage.s3.http.response-header-timeout [response_header_timeout: | default = 2m] @@ -1778,23 +1781,23 @@ s3: # CLI flag: -alertmanager-storage.s3.tls-handshake-timeout [tls_handshake_timeout: | default = 10s] - # The time to wait for a server's first response headers after fully writing - # the request headers if the request has an Expect header. 0 to send the - # request body immediately. + # [advanced] The time to wait for a server's first response headers after + # fully writing the request headers if the request has an Expect header. 0 + # to send the request body immediately. # CLI flag: -alertmanager-storage.s3.expect-continue-timeout [expect_continue_timeout: | default = 1s] - # Maximum number of idle (keep-alive) connections across all hosts. 0 means - # no limit. + # [advanced] Maximum number of idle (keep-alive) connections across all + # hosts. 0 means no limit. # CLI flag: -alertmanager-storage.s3.max-idle-connections [max_idle_connections: | default = 100] - # Maximum number of idle (keep-alive) connections to keep per-host. If 0, a - # built-in default value is used. + # [advanced] Maximum number of idle (keep-alive) connections to keep + # per-host. If 0, a built-in default value is used. # CLI flag: -alertmanager-storage.s3.max-idle-connections-per-host [max_idle_connections_per_host: | default = 100] - # Maximum number of connections per host. 0 means no limit. + # [advanced] Maximum number of connections per host. 0 means no limit. # CLI flag: -alertmanager-storage.s3.max-connections-per-host [max_connections_per_host: | default = 0] @@ -1828,17 +1831,18 @@ azure: # CLI flag: -alertmanager-storage.azure.endpoint-suffix [endpoint_suffix: | default = ""] - # Number of retries for recoverable errors + # [advanced] Number of retries for recoverable errors # CLI flag: -alertmanager-storage.azure.max-retries [max_retries: | default = 20] - # If set, this URL is used instead of + # [advanced] If set, this URL is used instead of # https://. for obtaining # ServicePrincipalToken from MSI. # CLI flag: -alertmanager-storage.azure.msi-resource [msi_resource: | default = ""] - # User assigned identity. If empty, then System assigned identity is used. + # [advanced] User assigned identity. If empty, then System assigned identity + # is used. # CLI flag: -alertmanager-storage.azure.user-assigned-id [user_assigned_id: | default = ""] @@ -1905,17 +1909,17 @@ swift: # CLI flag: -alertmanager-storage.swift.container-name [container_name: | default = ""] - # Max retries on requests error. + # [advanced] Max retries on requests error. # CLI flag: -alertmanager-storage.swift.max-retries [max_retries: | default = 3] - # Time after which a connection attempt is aborted. + # [advanced] Time after which a connection attempt is aborted. # CLI flag: -alertmanager-storage.swift.connect-timeout [connect_timeout: | default = 10s] - # Time after which an idle request is aborted. The timeout watchdog is reset - # each time some data is received, so the timeout triggers after X time no - # data is received on a request. + # [advanced] Time after which an idle request is aborted. The timeout watchdog + # is reset each time some data is received, so the timeout triggers after X + # time no data is received on a request. # CLI flag: -alertmanager-storage.swift.request-timeout [request_timeout: | default = 5s] @@ -2703,14 +2707,14 @@ s3: # CLI flag: -blocks-storage.s3.access-key-id [access_key_id: | default = ""] - # If enabled, use http:// for the S3 endpoint instead of https://. This could - # be useful in local dev/test environments while using an S3-compatible - # backend storage, like Minio. + # [advanced] If enabled, use http:// for the S3 endpoint instead of https://. + # This could be useful in local dev/test environments while using an + # S3-compatible backend storage, like Minio. # CLI flag: -blocks-storage.s3.insecure [insecure: | default = false] - # The signature version to use for authenticating against S3. Supported values - # are: v4, v2. + # [advanced] The signature version to use for authenticating against S3. + # Supported values are: v4, v2. # CLI flag: -blocks-storage.s3.signature-version [signature_version: | default = "v4"] @@ -2719,11 +2723,12 @@ s3: [sse: ] http: - # The time an idle connection will remain idle before closing. + # [advanced] The time an idle connection will remain idle before closing. # CLI flag: -blocks-storage.s3.http.idle-conn-timeout [idle_conn_timeout: | default = 1m30s] - # The amount of time the client will wait for a servers response headers. + # [advanced] The amount of time the client will wait for a servers response + # headers. # CLI flag: -blocks-storage.s3.http.response-header-timeout [response_header_timeout: | default = 2m] @@ -2736,23 +2741,23 @@ s3: # CLI flag: -blocks-storage.s3.tls-handshake-timeout [tls_handshake_timeout: | default = 10s] - # The time to wait for a server's first response headers after fully writing - # the request headers if the request has an Expect header. 0 to send the - # request body immediately. + # [advanced] The time to wait for a server's first response headers after + # fully writing the request headers if the request has an Expect header. 0 + # to send the request body immediately. # CLI flag: -blocks-storage.s3.expect-continue-timeout [expect_continue_timeout: | default = 1s] - # Maximum number of idle (keep-alive) connections across all hosts. 0 means - # no limit. + # [advanced] Maximum number of idle (keep-alive) connections across all + # hosts. 0 means no limit. # CLI flag: -blocks-storage.s3.max-idle-connections [max_idle_connections: | default = 100] - # Maximum number of idle (keep-alive) connections to keep per-host. If 0, a - # built-in default value is used. + # [advanced] Maximum number of idle (keep-alive) connections to keep + # per-host. If 0, a built-in default value is used. # CLI flag: -blocks-storage.s3.max-idle-connections-per-host [max_idle_connections_per_host: | default = 100] - # Maximum number of connections per host. 0 means no limit. + # [advanced] Maximum number of connections per host. 0 means no limit. # CLI flag: -blocks-storage.s3.max-connections-per-host [max_connections_per_host: | default = 0] @@ -2786,17 +2791,18 @@ azure: # CLI flag: -blocks-storage.azure.endpoint-suffix [endpoint_suffix: | default = ""] - # Number of retries for recoverable errors + # [advanced] Number of retries for recoverable errors # CLI flag: -blocks-storage.azure.max-retries [max_retries: | default = 20] - # If set, this URL is used instead of + # [advanced] If set, this URL is used instead of # https://. for obtaining # ServicePrincipalToken from MSI. # CLI flag: -blocks-storage.azure.msi-resource [msi_resource: | default = ""] - # User assigned identity. If empty, then System assigned identity is used. + # [advanced] User assigned identity. If empty, then System assigned identity + # is used. # CLI flag: -blocks-storage.azure.user-assigned-id [user_assigned_id: | default = ""] @@ -2863,17 +2869,17 @@ swift: # CLI flag: -blocks-storage.swift.container-name [container_name: | default = ""] - # Max retries on requests error. + # [advanced] Max retries on requests error. # CLI flag: -blocks-storage.swift.max-retries [max_retries: | default = 3] - # Time after which a connection attempt is aborted. + # [advanced] Time after which a connection attempt is aborted. # CLI flag: -blocks-storage.swift.connect-timeout [connect_timeout: | default = 10s] - # Time after which an idle request is aborted. The timeout watchdog is reset - # each time some data is received, so the timeout triggers after X time no - # data is received on a request. + # [advanced] Time after which an idle request is aborted. The timeout watchdog + # is reset each time some data is received, so the timeout triggers after X + # time no data is received on a request. # CLI flag: -blocks-storage.swift.request-timeout [request_timeout: | default = 5s] diff --git a/pkg/storage/bucket/azure/config.go b/pkg/storage/bucket/azure/config.go index 1cb743e9311..fef0b3866e4 100644 --- a/pkg/storage/bucket/azure/config.go +++ b/pkg/storage/bucket/azure/config.go @@ -17,9 +17,9 @@ type Config struct { StorageAccountKey flagext.Secret `yaml:"account_key"` ContainerName string `yaml:"container_name"` Endpoint string `yaml:"endpoint_suffix"` - MaxRetries int `yaml:"max_retries"` - MSIResource string `yaml:"msi_resource"` - UserAssignedID string `yaml:"user_assigned_id"` + MaxRetries int `yaml:"max_retries" category:"advanced"` + MSIResource string `yaml:"msi_resource" category:"advanced"` + UserAssignedID string `yaml:"user_assigned_id" category:"advanced"` } // RegisterFlags registers the flags for Azure storage diff --git a/pkg/storage/bucket/s3/config.go b/pkg/storage/bucket/s3/config.go index 5405fe5cf14..bccbdd4ffdf 100644 --- a/pkg/storage/bucket/s3/config.go +++ b/pkg/storage/bucket/s3/config.go @@ -44,14 +44,14 @@ var ( // HTTPConfig stores the http.Transport configuration for the s3 minio client. type HTTPConfig struct { - IdleConnTimeout time.Duration `yaml:"idle_conn_timeout"` - ResponseHeaderTimeout time.Duration `yaml:"response_header_timeout"` + IdleConnTimeout time.Duration `yaml:"idle_conn_timeout" category:"advanced"` + ResponseHeaderTimeout time.Duration `yaml:"response_header_timeout" category:"advanced"` InsecureSkipVerify bool `yaml:"insecure_skip_verify" category:"advanced"` TLSHandshakeTimeout time.Duration `yaml:"tls_handshake_timeout" category:"advanced"` - ExpectContinueTimeout time.Duration `yaml:"expect_continue_timeout"` - MaxIdleConns int `yaml:"max_idle_connections"` - MaxIdleConnsPerHost int `yaml:"max_idle_connections_per_host"` - MaxConnsPerHost int `yaml:"max_connections_per_host"` + ExpectContinueTimeout time.Duration `yaml:"expect_continue_timeout" category:"advanced"` + MaxIdleConns int `yaml:"max_idle_connections" category:"advanced"` + MaxIdleConnsPerHost int `yaml:"max_idle_connections_per_host" category:"advanced"` + MaxConnsPerHost int `yaml:"max_connections_per_host" category:"advanced"` // Allow upstream callers to inject a round tripper Transport http.RoundTripper `yaml:"-"` @@ -76,8 +76,8 @@ type Config struct { BucketName string `yaml:"bucket_name"` SecretAccessKey flagext.Secret `yaml:"secret_access_key"` AccessKeyID string `yaml:"access_key_id"` - Insecure bool `yaml:"insecure"` - SignatureVersion string `yaml:"signature_version"` + Insecure bool `yaml:"insecure" category:"advanced"` + SignatureVersion string `yaml:"signature_version" category:"advanced"` SSE SSEConfig `yaml:"sse"` HTTP HTTPConfig `yaml:"http"` diff --git a/pkg/storage/bucket/swift/config.go b/pkg/storage/bucket/swift/config.go index df2ba7045db..cc116e1c7f8 100644 --- a/pkg/storage/bucket/swift/config.go +++ b/pkg/storage/bucket/swift/config.go @@ -27,9 +27,9 @@ type Config struct { ProjectDomainName string `yaml:"project_domain_name"` RegionName string `yaml:"region_name"` ContainerName string `yaml:"container_name"` - MaxRetries int `yaml:"max_retries"` - ConnectTimeout time.Duration `yaml:"connect_timeout"` - RequestTimeout time.Duration `yaml:"request_timeout"` + MaxRetries int `yaml:"max_retries" category:"advanced"` + ConnectTimeout time.Duration `yaml:"connect_timeout" category:"advanced"` + RequestTimeout time.Duration `yaml:"request_timeout" category:"advanced"` } // RegisterFlags registers the flags for Swift storage From 1135cb15be6eaf4057c46e88ae76019e44c9e464 Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Tue, 1 Feb 2022 17:46:09 +0000 Subject: [PATCH 073/168] Add integration test that validates dev.yaml configuration (#979) * Embed dev.yaml using embedmd Signed-off-by: Jack Baldry * Add integration test that validates `dev.yaml` configuration The test ensures that the process starts successfully and that all of the user operations in the _Getting started with Grafana Mimir_ guide can be performed. Primarily this is writing and querying back series. Signed-off-by: Jack Baldry * Prefer "demo" over "dev" which more accurately explains the purpose of the configuration Signed-off-by: Jack Baldry * Remove sharding configuration from ruler Signed-off-by: Jack Baldry * Clean up comment Signed-off-by: Jack Baldry Co-Authored-by: replay * Run make doc Signed-off-by: Jack Baldry Co-authored-by: replay --- Makefile | 1 + docs/configurations/demo.yaml | 48 ++++++++++++++ docs/sources/getting-started/_index.md | 12 ++-- ...ting_started_single_process_config_test.go | 2 +- ...getting_started_with_grafana_mimir_test.go | 64 +++++++++++++++++++ 5 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 docs/configurations/demo.yaml create mode 100644 integration/getting_started_with_grafana_mimir_test.go diff --git a/Makefile b/Makefile index d01bf7dde05..4689f6eb38c 100644 --- a/Makefile +++ b/Makefile @@ -320,6 +320,7 @@ doc: clean-doc embedmd -w docs/sources/configuration/prometheus-frontend.md embedmd -w docs/sources/operations/requests-mirroring-to-secondary-cluster.md embedmd -w docs/sources/guides/overrides-exporter.md + embedmd -w docs/sources/getting-started/_index.md embedmd -w operations/mimir/README.md # Make up markdown files prettier. When running with check-doc target, it will fail if this produces any change. diff --git a/docs/configurations/demo.yaml b/docs/configurations/demo.yaml new file mode 100644 index 00000000000..9580494e1ad --- /dev/null +++ b/docs/configurations/demo.yaml @@ -0,0 +1,48 @@ +# Do not use this configuration in production. +# It is for demonstration purposes only. +auth_enabled: false + +blocks_storage: + backend: filesystem + bucket_store: + sync_dir: /tmp/mimir/tsdb-sync + filesystem: + dir: /tmp/mimir/data/tsdb + tsdb: + dir: /tmp/mimir/tsdb + +compactor: + data_dir: /tmp/mimir/compactor + sharding_ring: + kvstore: + store: memberlist + +distributor: + ring: + instance_addr: 127.0.0.1 + kvstore: + store: memberlist + +ingester: + lifecycler: + address: 127.0.0.1 + ring: + kvstore: + store: memberlist + replication_factor: 1 + +ruler: + enable_api: true + +ruler_storage: + backend: local + local: + directory: /tmp/mimir/rules + +server: + http_listen_port: 9009 + log_level: error + +store_gateway: + sharding_ring: + replication_factor: 1 diff --git a/docs/sources/getting-started/_index.md b/docs/sources/getting-started/_index.md index fc164667cd2..d0985eb3beb 100644 --- a/docs/sources/getting-started/_index.md +++ b/docs/sources/getting-started/_index.md @@ -38,11 +38,13 @@ chmod +x mimir ## Start Grafana Mimir -To run Grafana Mimir in a single process and with local filesystem storage, write the following configuration YAML to a file called `dev.yaml`: +To run Grafana Mimir in a single process and with local filesystem storage, write the following configuration YAML to a file called `demo.yaml`: + +[embedmd]:# (../../configurations/demo.yaml) ```yaml # Do not use this configuration in production. -# Its purpose is for you to get started within a development environment. +# It is for demonstration purposes only. auth_enabled: false blocks_storage: @@ -76,7 +78,6 @@ ingester: ruler: enable_api: true - enable_sharding: false ruler_storage: backend: local @@ -91,6 +92,7 @@ store_gateway: sharding_ring: replication_factor: 1 ``` + ## Run Grafana Mimir @@ -99,13 +101,13 @@ In a terminal, run one of the following commands: - Using Docker: ```bash - docker run --rm --name mimir --publish 9009:9009 --volume "$(pwd)"/dev.yaml:/etc/mimir/dev.yaml "grafana/mimir:${MIMIR_LATEST}" --config.file=/etc/mimir/dev.yaml + docker run --rm --name mimir --publish 9009:9009 --volume "$(pwd)"/demo.yaml:/etc/mimir/demo.yaml "grafana/mimir:${MIMIR_LATEST}" --config.file=/etc/mimir/demo.yaml ``` - Using a local binary: ```bash - ./mimir --config.file=./dev.yaml + ./mimir --config.file=./demo.yaml ``` Grafana Mimir listens on port `9009`. diff --git a/integration/getting_started_single_process_config_test.go b/integration/getting_started_single_process_config_test.go index 5bc8100c55a..2f18828d665 100644 --- a/integration/getting_started_single_process_config_test.go +++ b/integration/getting_started_single_process_config_test.go @@ -65,7 +65,7 @@ func TestGettingStartedSingleProcessConfigWithBlocksStorage(t *testing.T) { require.Equal(t, model.ValVector, result.Type()) assert.Equal(t, expectedVector, result.(model.Vector)) - // Work round Prometheus client lib not having a way to omit the start&end params + // Work around the Prometheus client lib not having a way to omit the start and end params. minTime := time.Unix(math.MinInt64/1000+62135596801, 0).UTC() maxTime := time.Unix(math.MaxInt64/1000-62135596801, 999999999).UTC() diff --git a/integration/getting_started_with_grafana_mimir_test.go b/integration/getting_started_with_grafana_mimir_test.go new file mode 100644 index 00000000000..f8a58177e4c --- /dev/null +++ b/integration/getting_started_with_grafana_mimir_test.go @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: AGPL-3.0-only +//go:build requires_docker +// +build requires_docker + +package integration + +import ( + "math" + "net/http" + "testing" + "time" + + "github.com/grafana/e2e" + "github.com/prometheus/common/model" + "github.com/prometheus/prometheus/prompb" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/grafana/mimir/integration/e2emimir" +) + +func TestGettingStartedWithGrafanaMimir(t *testing.T) { + s, err := e2e.NewScenario(networkName) + require.NoError(t, err) + defer s.Close() + + require.NoError(t, copyFileToSharedDir(s, "docs/configurations/demo.yaml", "demo.yaml")) + + mimir := e2emimir.NewSingleBinaryWithConfigFile("mimir", "demo.yaml", nil, "", 9009, 9095) + require.NoError(t, s.StartAndWaitReady(mimir)) + + c, err := e2emimir.NewClient(mimir.HTTPEndpoint(), mimir.HTTPEndpoint(), "", "", "user-1") + require.NoError(t, err) + + // Push some series to Mimir. + now := time.Now() + series, expectedVector := generateSeries("series_1", now, prompb.Label{Name: "foo", Value: "bar"}) + + res, err := c.Push(series) + require.NoError(t, err) + require.Equal(t, http.StatusOK, res.StatusCode) + + // Query the series. + result, err := c.Query("series_1", now) + require.NoError(t, err) + require.Equal(t, model.ValVector, result.Type()) + assert.Equal(t, expectedVector, result.(model.Vector)) + + // Work around the Prometheus client lib not having a way to omit the start and end params. + minTime := time.Unix(math.MinInt64/1000+62135596801, 0).UTC() + maxTime := time.Unix(math.MaxInt64/1000-62135596801, 999999999).UTC() + + labelValues, err := c.LabelValues("foo", minTime, maxTime, nil) + require.NoError(t, err) + require.Equal(t, model.LabelValues{"bar"}, labelValues) + + labelNames, err := c.LabelNames(minTime, maxTime) + require.NoError(t, err) + require.Equal(t, []string{"__name__", "foo"}, labelNames) + + // Check that a range query does not return an error to sanity check the queryrange tripperware. + _, err = c.QueryRange("series_1", now.Add(-15*time.Minute), now, 15*time.Second) + require.NoError(t, err) +} From 0574908846869a221f22a5a4fcb206b5a80f109a Mon Sep 17 00:00:00 2001 From: Patrick Oyarzun Date: Wed, 2 Feb 2022 04:30:08 -0500 Subject: [PATCH 074/168] Categorize blocks_storage related parameters (#994) * Categorize blocks_storage related params * Fix lint failures --- cmd/mimir/help.txt.tmpl | 144 ----------- docs/sources/blocks-storage/querier.md | 210 ++++++++-------- docs/sources/blocks-storage/store-gateway.md | 210 ++++++++-------- .../configuration/config-file-reference.md | 233 +++++++++--------- pkg/cache/memcache_config.go | 12 +- pkg/storage/tsdb/caching_config.go | 32 +-- pkg/storage/tsdb/config.go | 64 ++--- 7 files changed, 389 insertions(+), 516 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 4a159a1ad0d..1a22a6762fc 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -115,128 +115,30 @@ Usage of ./cmd/mimir/mimir: Azure storage endpoint suffix without schema. The account name will be prefixed to this value to create the FQDN. If set to empty string, default endpoint suffix is used. -blocks-storage.backend string Backend storage to use. Supported backends are: s3, gcs, azure, swift, filesystem. (default "filesystem") - -blocks-storage.bucket-store.block-sync-concurrency int - Maximum number of concurrent blocks synching per tenant. (default 20) -blocks-storage.bucket-store.bucket-index.enabled True to enable querier and store-gateway to discover blocks in the storage via bucket index instead of bucket scanning. - -blocks-storage.bucket-store.bucket-index.idle-timeout duration - How long a unused bucket index should be cached. Once this timeout expires, the unused bucket index is removed from the in-memory cache. This option is used only by querier. (default 1h0m0s) - -blocks-storage.bucket-store.bucket-index.max-stale-period duration - The maximum allowed age of a bucket index (last updated) before queries start failing because the bucket index is too old. The bucket index is periodically updated by the compactor, while this check is enforced in the querier (at query time). (default 1h0m0s) - -blocks-storage.bucket-store.bucket-index.update-on-error-interval duration - How frequently a bucket index, which previously failed to load, should be tried to load again. This option is used only by querier. (default 1m0s) - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items int - Maximum number of object attribute items to keep in a first level in-memory LRU cache. Metadata will be stored and fetched in-memory before hitting the cache backend. 0 to disable the in-memory cache. - -blocks-storage.bucket-store.chunks-cache.attributes-ttl duration - TTL for caching object attributes for chunks. If the metadata cache is configured, attributes will be stored under this cache backend, otherwise attributes are stored in the chunks cache backend. (default 168h0m0s) -blocks-storage.bucket-store.chunks-cache.backend string Backend for chunks cache, if not empty. Supported values: memcached. - -blocks-storage.bucket-store.chunks-cache.max-get-range-requests int - Maximum number of sub-GetRange requests that a single GetRange request can be split into when fetching chunks. Zero or negative value = unlimited number of sub-requests. (default 3) -blocks-storage.bucket-store.chunks-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 25000) - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency int - The maximum number of concurrent asynchronous operations can occur. (default 50) - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency int - The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 100) - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size int - The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.chunks-cache.memcached.timeout duration The socket read/write timeout. (default 100ms) - -blocks-storage.bucket-store.chunks-cache.subrange-size int - Size of each subrange that bucket object is split into for better caching. (default 16000) - -blocks-storage.bucket-store.chunks-cache.subrange-ttl duration - TTL for caching individual chunks subranges. (default 24h0m0s) - -blocks-storage.bucket-store.consistency-delay duration - Minimum age of a block before it's being read. Set it to safe value (e.g 30m) if your object storage is eventually consistent. GCS and S3 are (roughly) strongly consistent. - -blocks-storage.bucket-store.ignore-blocks-within duration - Blocks with minimum time within this duration are ignored, and not loaded by store-gateway. Useful when used together with -querier.query-store-after to prevent loading young blocks, because there are usually many of them (depending on number of ingesters) and they are not yet compacted. Negative values or 0 disable the filter. - -blocks-storage.bucket-store.ignore-deletion-marks-delay duration - Duration after which the blocks marked for deletion will be filtered out while fetching blocks. The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. (default 1h0m0s) -blocks-storage.bucket-store.index-cache.backend string The index cache backend type. Supported values: inmemory, memcached. (default "inmemory") -blocks-storage.bucket-store.index-cache.inmemory.max-size-bytes uint Maximum size in bytes of in-memory index cache used to speed up blocks index lookups (shared between all tenants). (default 1073741824) -blocks-storage.bucket-store.index-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). - -blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 25000) - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency int - The maximum number of concurrent asynchronous operations can occur. (default 50) - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency int - The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 100) - -blocks-storage.bucket-store.index-cache.memcached.max-item-size int - The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.index-cache.memcached.timeout duration The socket read/write timeout. (default 100ms) - -blocks-storage.bucket-store.index-header-lazy-loading-enabled - If enabled, store-gateway will lazy load an index-header only once required by a query. (default true) - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout duration - If index-header lazy loading is enabled and this setting is > 0, the store-gateway will offload unused index-headers after 'idle timeout' inactivity. (default 1h0m0s) - -blocks-storage.bucket-store.max-chunk-pool-bytes uint - Max size - in bytes - of a chunks pool, used to reduce memory allocations. The pool is shared across all tenants. 0 to disable the limit. (default 2147483648) - -blocks-storage.bucket-store.max-concurrent int - Max number of concurrent queries to execute against the long-term storage. The limit is shared across all tenants. (default 100) - -blocks-storage.bucket-store.meta-sync-concurrency int - Number of Go routines to use when syncing block meta files from object storage per tenant. (default 20) -blocks-storage.bucket-store.metadata-cache.backend string Backend for metadata cache, if not empty. Supported values: memcached. - -blocks-storage.bucket-store.metadata-cache.block-index-attributes-ttl duration - How long to cache attributes of the block index. (default 168h0m0s) - -blocks-storage.bucket-store.metadata-cache.bucket-index-content-ttl duration - How long to cache content of the bucket index. (default 5m0s) - -blocks-storage.bucket-store.metadata-cache.bucket-index-max-size-bytes int - Maximum size of bucket index content to cache in bytes. Caching will be skipped if the content exceeds this size. This is useful to avoid network round trip for large content if the configured caching backend has an hard limit on cached items size (in this case, you should set this limit to the same limit in the caching backend). (default 1048576) - -blocks-storage.bucket-store.metadata-cache.chunks-list-ttl duration - How long to cache list of chunks for a block. (default 24h0m0s) -blocks-storage.bucket-store.metadata-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 25000) - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency int - The maximum number of concurrent asynchronous operations can occur. (default 50) - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency int - The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 100) - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size int - The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.metadata-cache.memcached.timeout duration The socket read/write timeout. (default 100ms) - -blocks-storage.bucket-store.metadata-cache.metafile-attributes-ttl duration - How long to cache attributes of the block metafile. (default 168h0m0s) - -blocks-storage.bucket-store.metadata-cache.metafile-content-ttl duration - How long to cache content of the metafile. (default 24h0m0s) - -blocks-storage.bucket-store.metadata-cache.metafile-doesnt-exist-ttl duration - How long to cache information that block metafile doesn't exist. Also used for user deletion mark file. (default 5m0s) - -blocks-storage.bucket-store.metadata-cache.metafile-exists-ttl duration - How long to cache information that block metafile exists. Also used for user deletion mark file. (default 2h0m0s) - -blocks-storage.bucket-store.metadata-cache.metafile-max-size-bytes int - Maximum size of metafile content to cache in bytes. Caching will be skipped if the content exceeds this size. This is useful to avoid network round trip for large content if the configured caching backend has an hard limit on cached items size (in this case, you should set this limit to the same limit in the caching backend). (default 1048576) - -blocks-storage.bucket-store.metadata-cache.tenant-blocks-list-ttl duration - How long to cache list of blocks for each tenant. (default 5m0s) - -blocks-storage.bucket-store.metadata-cache.tenants-list-ttl duration - How long to cache list of tenants in the bucket. (default 15m0s) - -blocks-storage.bucket-store.series-hash-cache-max-size-bytes uint - Max size - in bytes - of the in-memory series hash cache. The cache is shared across all tenants and it's used only when query sharding is enabled. (default 1073741824) -blocks-storage.bucket-store.sync-dir string Directory to store synchronized TSDB index headers. (default "tsdb-sync") - -blocks-storage.bucket-store.sync-interval duration - How frequently to scan the bucket, or to refresh the bucket index (if enabled), in order to look for changes (new blocks shipped by ingesters and blocks deleted by retention or compaction). (default 15m0s) - -blocks-storage.bucket-store.tenant-sync-concurrency int - Maximum number of concurrent tenants synching blocks. (default 10) -blocks-storage.filesystem.dir string Local filesystem storage directory. (default "blocks") -blocks-storage.gcs.bucket-name string @@ -289,44 +191,10 @@ Usage of ./cmd/mimir/mimir: OpenStack Swift user ID. -blocks-storage.swift.username string OpenStack Swift username. - -blocks-storage.tsdb.block-ranges-period value - TSDB blocks range period. (default 2h0m0s) - -blocks-storage.tsdb.close-idle-tsdb-timeout duration - If TSDB has not received any data for this duration, and all blocks from TSDB have been shipped, TSDB is closed and deleted from local disk. If set to positive value, this value should be equal or higher than -querier.query-ingesters-within flag to make sure that TSDB is not closed prematurely, which could cause partial query results. 0 or negative value disables closing of idle TSDB. (default 13h0m0s) -blocks-storage.tsdb.dir string Local directory to store TSDBs in the ingesters. (default "tsdb") - -blocks-storage.tsdb.flush-blocks-on-shutdown - True to flush blocks to storage on shutdown. If false, incomplete blocks will be reused after restart. - -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes int - The write buffer size used by the head chunks mapper. Lower values reduce memory utilisation on clusters with a large number of tenants at the cost of increased disk I/O operations. (default 4194304) - -blocks-storage.tsdb.head-chunks-write-queue-size int - The size of the write queue used by the head chunks mapper. Lower values reduce memory utilisation at the cost of potentially higher ingest latency. (default 1000000) - -blocks-storage.tsdb.head-compaction-concurrency int - Maximum number of tenants concurrently compacting TSDB head into a new block (default 5) - -blocks-storage.tsdb.head-compaction-idle-timeout duration - If TSDB head is idle for this duration, it is compacted. Note that up to 25% jitter is added to the value to avoid ingesters compacting concurrently. 0 means disabled. (default 1h0m0s) - -blocks-storage.tsdb.head-compaction-interval duration - How frequently ingesters try to compact TSDB head. Block is only created if data covers smallest block range. Must be greater than 0 and max 5 minutes. (default 1m0s) - -blocks-storage.tsdb.isolation-enabled - Enables TSDB isolation feature. Disabling may improve performance. (default true) - -blocks-storage.tsdb.max-tsdb-opening-concurrency-on-startup int - limit the number of concurrently opening TSDB's on startup (default 10) - -blocks-storage.tsdb.memory-snapshot-on-shutdown - True to enable snapshotting of in-memory TSDB data on disk when shutting down. -blocks-storage.tsdb.retention-period duration TSDB blocks retention in the ingester before a block is removed. This should be larger than the -blocks-storage.tsdb.block-ranges-period, -querier.query-store-after and large enough to give store-gateways and queriers enough time to discover newly uploaded blocks. (default 24h0m0s) - -blocks-storage.tsdb.series-hash-cache-max-size-bytes uint - Max size - in bytes - of the in-memory series hash cache. The cache is shared across all tenants and it's used only when query sharding is enabled. (default 1073741824) - -blocks-storage.tsdb.ship-concurrency int - Maximum number of tenants concurrently shipping blocks to the storage. (default 10) - -blocks-storage.tsdb.ship-interval duration - How frequently the TSDB blocks are scanned and new ones are shipped to the storage. 0 means shipping is disabled. (default 1m0s) - -blocks-storage.tsdb.stripe-size int - The number of shards of series to use in TSDB (must be a power of 2). Reducing this will decrease memory footprint, but can negatively impact performance. (default 16384) - -blocks-storage.tsdb.wal-compression-enabled - True to enable TSDB WAL compression. - -blocks-storage.tsdb.wal-segment-size-bytes int - TSDB WAL segments files max size (bytes). (default 134217728) -compactor.blocks-retention-period value Delete blocks containing samples older than the specified retention period. 0 to disable. -compactor.compactor-tenant-shard-size int @@ -485,18 +353,6 @@ Usage of ./cmd/mimir/mimir: Enable cache compression, if not empty. Supported values are: snappy. -frontend.results-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). - -frontend.results-cache.memcached.max-async-buffer-size int - The maximum number of enqueued asynchronous operations allowed. (default 25000) - -frontend.results-cache.memcached.max-async-concurrency int - The maximum number of concurrent asynchronous operations can occur. (default 50) - -frontend.results-cache.memcached.max-get-multi-batch-size int - The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited. (default 100) - -frontend.results-cache.memcached.max-get-multi-concurrency int - The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited. (default 100) - -frontend.results-cache.memcached.max-idle-connections int - The maximum number of idle connections that will be maintained per address. (default 100) - -frontend.results-cache.memcached.max-item-size int - The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -frontend.results-cache.memcached.timeout duration The socket read/write timeout. (default 100ms) -frontend.scheduler-address string diff --git a/docs/sources/blocks-storage/querier.md b/docs/sources/blocks-storage/querier.md index a98172295f2..ff5c45ace90 100644 --- a/docs/sources/blocks-storage/querier.md +++ b/docs/sources/blocks-storage/querier.md @@ -418,33 +418,33 @@ blocks_storage: # CLI flag: -blocks-storage.bucket-store.sync-dir [sync_dir: | default = "tsdb-sync"] - # How frequently to scan the bucket, or to refresh the bucket index (if - # enabled), in order to look for changes (new blocks shipped by ingesters - # and blocks deleted by retention or compaction). + # [advanced] How frequently to scan the bucket, or to refresh the bucket + # index (if enabled), in order to look for changes (new blocks shipped by + # ingesters and blocks deleted by retention or compaction). # CLI flag: -blocks-storage.bucket-store.sync-interval [sync_interval: | default = 15m] - # Max number of concurrent queries to execute against the long-term storage. - # The limit is shared across all tenants. + # [advanced] Max number of concurrent queries to execute against the + # long-term storage. The limit is shared across all tenants. # CLI flag: -blocks-storage.bucket-store.max-concurrent [max_concurrent: | default = 100] - # Maximum number of concurrent tenants synching blocks. + # [advanced] Maximum number of concurrent tenants synching blocks. # CLI flag: -blocks-storage.bucket-store.tenant-sync-concurrency [tenant_sync_concurrency: | default = 10] - # Maximum number of concurrent blocks synching per tenant. + # [advanced] Maximum number of concurrent blocks synching per tenant. # CLI flag: -blocks-storage.bucket-store.block-sync-concurrency [block_sync_concurrency: | default = 20] - # Number of Go routines to use when syncing block meta files from object - # storage per tenant. + # [advanced] Number of Go routines to use when syncing block meta files from + # object storage per tenant. # CLI flag: -blocks-storage.bucket-store.meta-sync-concurrency [meta_sync_concurrency: | default = 20] - # Minimum age of a block before it's being read. Set it to safe value (e.g - # 30m) if your object storage is eventually consistent. GCS and S3 are - # (roughly) strongly consistent. + # [advanced] Minimum age of a block before it's being read. Set it to safe + # value (e.g 30m) if your object storage is eventually consistent. GCS and + # S3 are (roughly) strongly consistent. # CLI flag: -blocks-storage.bucket-store.consistency-delay [consistency_delay: | default = 0s] @@ -474,30 +474,30 @@ blocks_storage: # blocks-storage.bucket-store.chunks-cache [memcached: ] - # Size of each subrange that bucket object is split into for better - # caching. + # [advanced] Size of each subrange that bucket object is split into for + # better caching. # CLI flag: -blocks-storage.bucket-store.chunks-cache.subrange-size [subrange_size: | default = 16000] - # Maximum number of sub-GetRange requests that a single GetRange request - # can be split into when fetching chunks. Zero or negative value = - # unlimited number of sub-requests. + # [advanced] Maximum number of sub-GetRange requests that a single + # GetRange request can be split into when fetching chunks. Zero or + # negative value = unlimited number of sub-requests. # CLI flag: -blocks-storage.bucket-store.chunks-cache.max-get-range-requests [max_get_range_requests: | default = 3] - # TTL for caching object attributes for chunks. If the metadata cache is - # configured, attributes will be stored under this cache backend, + # [advanced] TTL for caching object attributes for chunks. If the metadata + # cache is configured, attributes will be stored under this cache backend, # otherwise attributes are stored in the chunks cache backend. # CLI flag: -blocks-storage.bucket-store.chunks-cache.attributes-ttl [attributes_ttl: | default = 168h] - # Maximum number of object attribute items to keep in a first level - # in-memory LRU cache. Metadata will be stored and fetched in-memory + # [advanced] Maximum number of object attribute items to keep in a first + # level in-memory LRU cache. Metadata will be stored and fetched in-memory # before hitting the cache backend. 0 to disable the in-memory cache. # CLI flag: -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items [attributes_in_memory_max_items: | default = 0] - # TTL for caching individual chunks subranges. + # [advanced] TTL for caching individual chunks subranges. # CLI flag: -blocks-storage.bucket-store.chunks-cache.subrange-ttl [subrange_ttl: | default = 24h] @@ -511,65 +511,65 @@ blocks_storage: # blocks-storage.bucket-store.metadata-cache [memcached: ] - # How long to cache list of tenants in the bucket. + # [advanced] How long to cache list of tenants in the bucket. # CLI flag: -blocks-storage.bucket-store.metadata-cache.tenants-list-ttl [tenants_list_ttl: | default = 15m] - # How long to cache list of blocks for each tenant. + # [advanced] How long to cache list of blocks for each tenant. # CLI flag: -blocks-storage.bucket-store.metadata-cache.tenant-blocks-list-ttl [tenant_blocks_list_ttl: | default = 5m] - # How long to cache list of chunks for a block. + # [advanced] How long to cache list of chunks for a block. # CLI flag: -blocks-storage.bucket-store.metadata-cache.chunks-list-ttl [chunks_list_ttl: | default = 24h] - # How long to cache information that block metafile exists. Also used for - # user deletion mark file. + # [advanced] How long to cache information that block metafile exists. + # Also used for user deletion mark file. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-exists-ttl [metafile_exists_ttl: | default = 2h] - # How long to cache information that block metafile doesn't exist. Also - # used for user deletion mark file. + # [advanced] How long to cache information that block metafile doesn't + # exist. Also used for user deletion mark file. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-doesnt-exist-ttl [metafile_doesnt_exist_ttl: | default = 5m] - # How long to cache content of the metafile. + # [advanced] How long to cache content of the metafile. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-content-ttl [metafile_content_ttl: | default = 24h] - # Maximum size of metafile content to cache in bytes. Caching will be - # skipped if the content exceeds this size. This is useful to avoid - # network round trip for large content if the configured caching backend - # has an hard limit on cached items size (in this case, you should set - # this limit to the same limit in the caching backend). + # [advanced] Maximum size of metafile content to cache in bytes. Caching + # will be skipped if the content exceeds this size. This is useful to + # avoid network round trip for large content if the configured caching + # backend has an hard limit on cached items size (in this case, you should + # set this limit to the same limit in the caching backend). # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-max-size-bytes [metafile_max_size_bytes: | default = 1048576] - # How long to cache attributes of the block metafile. + # [advanced] How long to cache attributes of the block metafile. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-attributes-ttl [metafile_attributes_ttl: | default = 168h] - # How long to cache attributes of the block index. + # [advanced] How long to cache attributes of the block index. # CLI flag: -blocks-storage.bucket-store.metadata-cache.block-index-attributes-ttl [block_index_attributes_ttl: | default = 168h] - # How long to cache content of the bucket index. + # [advanced] How long to cache content of the bucket index. # CLI flag: -blocks-storage.bucket-store.metadata-cache.bucket-index-content-ttl [bucket_index_content_ttl: | default = 5m] - # Maximum size of bucket index content to cache in bytes. Caching will be - # skipped if the content exceeds this size. This is useful to avoid - # network round trip for large content if the configured caching backend - # has an hard limit on cached items size (in this case, you should set - # this limit to the same limit in the caching backend). + # [advanced] Maximum size of bucket index content to cache in bytes. + # Caching will be skipped if the content exceeds this size. This is useful + # to avoid network round trip for large content if the configured caching + # backend has an hard limit on cached items size (in this case, you should + # set this limit to the same limit in the caching backend). # CLI flag: -blocks-storage.bucket-store.metadata-cache.bucket-index-max-size-bytes [bucket_index_max_size_bytes: | default = 1048576] - # Duration after which the blocks marked for deletion will be filtered out - # while fetching blocks. The idea of ignore-deletion-marks-delay is to - # ignore blocks that are marked for deletion with some delay. This ensures - # store can still serve blocks that are meant to be deleted but do not have - # a replacement yet. + # [advanced] Duration after which the blocks marked for deletion will be + # filtered out while fetching blocks. The idea of + # ignore-deletion-marks-delay is to ignore blocks that are marked for + # deletion with some delay. This ensures store can still serve blocks that + # are meant to be deleted but do not have a replacement yet. # CLI flag: -blocks-storage.bucket-store.ignore-deletion-marks-delay [ignore_deletion_mark_delay: | default = 1h] @@ -579,34 +579,36 @@ blocks_storage: # CLI flag: -blocks-storage.bucket-store.bucket-index.enabled [enabled: | default = false] - # How frequently a bucket index, which previously failed to load, should - # be tried to load again. This option is used only by querier. + # [advanced] How frequently a bucket index, which previously failed to + # load, should be tried to load again. This option is used only by + # querier. # CLI flag: -blocks-storage.bucket-store.bucket-index.update-on-error-interval [update_on_error_interval: | default = 1m] - # How long a unused bucket index should be cached. Once this timeout - # expires, the unused bucket index is removed from the in-memory cache. - # This option is used only by querier. + # [advanced] How long a unused bucket index should be cached. Once this + # timeout expires, the unused bucket index is removed from the in-memory + # cache. This option is used only by querier. # CLI flag: -blocks-storage.bucket-store.bucket-index.idle-timeout [idle_timeout: | default = 1h] - # The maximum allowed age of a bucket index (last updated) before queries - # start failing because the bucket index is too old. The bucket index is - # periodically updated by the compactor, while this check is enforced in - # the querier (at query time). + # [advanced] The maximum allowed age of a bucket index (last updated) + # before queries start failing because the bucket index is too old. The + # bucket index is periodically updated by the compactor, while this check + # is enforced in the querier (at query time). # CLI flag: -blocks-storage.bucket-store.bucket-index.max-stale-period [max_stale_period: | default = 1h] - # Blocks with minimum time within this duration are ignored, and not loaded - # by store-gateway. Useful when used together with + # [advanced] Blocks with minimum time within this duration are ignored, and + # not loaded by store-gateway. Useful when used together with # -querier.query-store-after to prevent loading young blocks, because there # are usually many of them (depending on number of ingesters) and they are # not yet compacted. Negative values or 0 disable the filter. # CLI flag: -blocks-storage.bucket-store.ignore-blocks-within [ignore_blocks_within: | default = 0s] - # Max size - in bytes - of a chunks pool, used to reduce memory allocations. - # The pool is shared across all tenants. 0 to disable the limit. + # [advanced] Max size - in bytes - of a chunks pool, used to reduce memory + # allocations. The pool is shared across all tenants. 0 to disable the + # limit. # CLI flag: -blocks-storage.bucket-store.max-chunk-pool-bytes [max_chunk_pool_bytes: | default = 2147483648] @@ -618,20 +620,20 @@ blocks_storage: # CLI flag: -blocks-storage.bucket-store.chunk-pool-max-bucket-size-bytes [chunk_pool_max_bucket_size_bytes: | default = 50000000] - # Max size - in bytes - of the in-memory series hash cache. The cache is - # shared across all tenants and it's used only when query sharding is - # enabled. + # [advanced] Max size - in bytes - of the in-memory series hash cache. The + # cache is shared across all tenants and it's used only when query sharding + # is enabled. # CLI flag: -blocks-storage.bucket-store.series-hash-cache-max-size-bytes [series_hash_cache_max_size_bytes: | default = 1073741824] - # If enabled, store-gateway will lazy load an index-header only once - # required by a query. + # [advanced] If enabled, store-gateway will lazy load an index-header only + # once required by a query. # CLI flag: -blocks-storage.bucket-store.index-header-lazy-loading-enabled [index_header_lazy_loading_enabled: | default = true] - # If index-header lazy loading is enabled and this setting is > 0, the - # store-gateway will offload unused index-headers after 'idle timeout' - # inactivity. + # [advanced] If index-header lazy loading is enabled and this setting is > + # 0, the store-gateway will offload unused index-headers after 'idle + # timeout' inactivity. # CLI flag: -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout [index_header_lazy_loading_idle_timeout: | default = 1h] @@ -650,7 +652,7 @@ blocks_storage: # CLI flag: -blocks-storage.tsdb.dir [dir: | default = "tsdb"] - # TSDB blocks range period. + # [advanced] TSDB blocks range period. # CLI flag: -blocks-storage.tsdb.block-ranges-period [block_ranges_period: | default = 2h0m0s] @@ -661,35 +663,36 @@ blocks_storage: # CLI flag: -blocks-storage.tsdb.retention-period [retention_period: | default = 24h] - # How frequently the TSDB blocks are scanned and new ones are shipped to the - # storage. 0 means shipping is disabled. + # [advanced] How frequently the TSDB blocks are scanned and new ones are + # shipped to the storage. 0 means shipping is disabled. # CLI flag: -blocks-storage.tsdb.ship-interval [ship_interval: | default = 1m] - # Maximum number of tenants concurrently shipping blocks to the storage. + # [advanced] Maximum number of tenants concurrently shipping blocks to the + # storage. # CLI flag: -blocks-storage.tsdb.ship-concurrency [ship_concurrency: | default = 10] - # How frequently ingesters try to compact TSDB head. Block is only created - # if data covers smallest block range. Must be greater than 0 and max 5 - # minutes. + # [advanced] How frequently ingesters try to compact TSDB head. Block is + # only created if data covers smallest block range. Must be greater than 0 + # and max 5 minutes. # CLI flag: -blocks-storage.tsdb.head-compaction-interval [head_compaction_interval: | default = 1m] - # Maximum number of tenants concurrently compacting TSDB head into a new - # block + # [advanced] Maximum number of tenants concurrently compacting TSDB head + # into a new block # CLI flag: -blocks-storage.tsdb.head-compaction-concurrency [head_compaction_concurrency: | default = 5] - # If TSDB head is idle for this duration, it is compacted. Note that up to - # 25% jitter is added to the value to avoid ingesters compacting + # [advanced] If TSDB head is idle for this duration, it is compacted. Note + # that up to 25% jitter is added to the value to avoid ingesters compacting # concurrently. 0 means disabled. # CLI flag: -blocks-storage.tsdb.head-compaction-idle-timeout [head_compaction_idle_timeout: | default = 1h] - # The write buffer size used by the head chunks mapper. Lower values reduce - # memory utilisation on clusters with a large number of tenants at the cost - # of increased disk I/O operations. + # [advanced] The write buffer size used by the head chunks mapper. Lower + # values reduce memory utilisation on clusters with a large number of + # tenants at the cost of increased disk I/O operations. # CLI flag: -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes [head_chunks_write_buffer_size_bytes: | default = 4194304] @@ -699,56 +702,57 @@ blocks_storage: # CLI flag: -blocks-storage.tsdb.head-chunks-end-time-variance [head_chunks_end_time_variance: | default = 0] - # The number of shards of series to use in TSDB (must be a power of 2). - # Reducing this will decrease memory footprint, but can negatively impact - # performance. + # [advanced] The number of shards of series to use in TSDB (must be a power + # of 2). Reducing this will decrease memory footprint, but can negatively + # impact performance. # CLI flag: -blocks-storage.tsdb.stripe-size [stripe_size: | default = 16384] - # True to enable TSDB WAL compression. + # [advanced] True to enable TSDB WAL compression. # CLI flag: -blocks-storage.tsdb.wal-compression-enabled [wal_compression_enabled: | default = false] - # TSDB WAL segments files max size (bytes). + # [advanced] TSDB WAL segments files max size (bytes). # CLI flag: -blocks-storage.tsdb.wal-segment-size-bytes [wal_segment_size_bytes: | default = 134217728] - # True to flush blocks to storage on shutdown. If false, incomplete blocks - # will be reused after restart. + # [advanced] True to flush blocks to storage on shutdown. If false, + # incomplete blocks will be reused after restart. # CLI flag: -blocks-storage.tsdb.flush-blocks-on-shutdown [flush_blocks_on_shutdown: | default = false] - # If TSDB has not received any data for this duration, and all blocks from - # TSDB have been shipped, TSDB is closed and deleted from local disk. If set - # to positive value, this value should be equal or higher than + # [advanced] If TSDB has not received any data for this duration, and all + # blocks from TSDB have been shipped, TSDB is closed and deleted from local + # disk. If set to positive value, this value should be equal or higher than # -querier.query-ingesters-within flag to make sure that TSDB is not closed # prematurely, which could cause partial query results. 0 or negative value # disables closing of idle TSDB. # CLI flag: -blocks-storage.tsdb.close-idle-tsdb-timeout [close_idle_tsdb_timeout: | default = 13h] - # True to enable snapshotting of in-memory TSDB data on disk when shutting - # down. + # [advanced] True to enable snapshotting of in-memory TSDB data on disk when + # shutting down. # CLI flag: -blocks-storage.tsdb.memory-snapshot-on-shutdown [memory_snapshot_on_shutdown: | default = false] - # The size of the write queue used by the head chunks mapper. Lower values - # reduce memory utilisation at the cost of potentially higher ingest - # latency. + # [advanced] The size of the write queue used by the head chunks mapper. + # Lower values reduce memory utilisation at the cost of potentially higher + # ingest latency. # CLI flag: -blocks-storage.tsdb.head-chunks-write-queue-size [head_chunks_write_queue_size: | default = 1000000] - # Enables TSDB isolation feature. Disabling may improve performance. + # [advanced] Enables TSDB isolation feature. Disabling may improve + # performance. # CLI flag: -blocks-storage.tsdb.isolation-enabled [isolation_enabled: | default = true] - # Max size - in bytes - of the in-memory series hash cache. The cache is - # shared across all tenants and it's used only when query sharding is - # enabled. + # [advanced] Max size - in bytes - of the in-memory series hash cache. The + # cache is shared across all tenants and it's used only when query sharding + # is enabled. # CLI flag: -blocks-storage.tsdb.series-hash-cache-max-size-bytes [series_hash_cache_max_size_bytes: | default = 1073741824] - # limit the number of concurrently opening TSDB's on startup + # [advanced] limit the number of concurrently opening TSDB's on startup # CLI flag: -blocks-storage.tsdb.max-tsdb-opening-concurrency-on-startup [max_tsdb_opening_concurrency_on_startup: | default = 10] ``` diff --git a/docs/sources/blocks-storage/store-gateway.md b/docs/sources/blocks-storage/store-gateway.md index 68ccd06c7df..b3f672dea29 100644 --- a/docs/sources/blocks-storage/store-gateway.md +++ b/docs/sources/blocks-storage/store-gateway.md @@ -494,33 +494,33 @@ blocks_storage: # CLI flag: -blocks-storage.bucket-store.sync-dir [sync_dir: | default = "tsdb-sync"] - # How frequently to scan the bucket, or to refresh the bucket index (if - # enabled), in order to look for changes (new blocks shipped by ingesters - # and blocks deleted by retention or compaction). + # [advanced] How frequently to scan the bucket, or to refresh the bucket + # index (if enabled), in order to look for changes (new blocks shipped by + # ingesters and blocks deleted by retention or compaction). # CLI flag: -blocks-storage.bucket-store.sync-interval [sync_interval: | default = 15m] - # Max number of concurrent queries to execute against the long-term storage. - # The limit is shared across all tenants. + # [advanced] Max number of concurrent queries to execute against the + # long-term storage. The limit is shared across all tenants. # CLI flag: -blocks-storage.bucket-store.max-concurrent [max_concurrent: | default = 100] - # Maximum number of concurrent tenants synching blocks. + # [advanced] Maximum number of concurrent tenants synching blocks. # CLI flag: -blocks-storage.bucket-store.tenant-sync-concurrency [tenant_sync_concurrency: | default = 10] - # Maximum number of concurrent blocks synching per tenant. + # [advanced] Maximum number of concurrent blocks synching per tenant. # CLI flag: -blocks-storage.bucket-store.block-sync-concurrency [block_sync_concurrency: | default = 20] - # Number of Go routines to use when syncing block meta files from object - # storage per tenant. + # [advanced] Number of Go routines to use when syncing block meta files from + # object storage per tenant. # CLI flag: -blocks-storage.bucket-store.meta-sync-concurrency [meta_sync_concurrency: | default = 20] - # Minimum age of a block before it's being read. Set it to safe value (e.g - # 30m) if your object storage is eventually consistent. GCS and S3 are - # (roughly) strongly consistent. + # [advanced] Minimum age of a block before it's being read. Set it to safe + # value (e.g 30m) if your object storage is eventually consistent. GCS and + # S3 are (roughly) strongly consistent. # CLI flag: -blocks-storage.bucket-store.consistency-delay [consistency_delay: | default = 0s] @@ -550,30 +550,30 @@ blocks_storage: # blocks-storage.bucket-store.chunks-cache [memcached: ] - # Size of each subrange that bucket object is split into for better - # caching. + # [advanced] Size of each subrange that bucket object is split into for + # better caching. # CLI flag: -blocks-storage.bucket-store.chunks-cache.subrange-size [subrange_size: | default = 16000] - # Maximum number of sub-GetRange requests that a single GetRange request - # can be split into when fetching chunks. Zero or negative value = - # unlimited number of sub-requests. + # [advanced] Maximum number of sub-GetRange requests that a single + # GetRange request can be split into when fetching chunks. Zero or + # negative value = unlimited number of sub-requests. # CLI flag: -blocks-storage.bucket-store.chunks-cache.max-get-range-requests [max_get_range_requests: | default = 3] - # TTL for caching object attributes for chunks. If the metadata cache is - # configured, attributes will be stored under this cache backend, + # [advanced] TTL for caching object attributes for chunks. If the metadata + # cache is configured, attributes will be stored under this cache backend, # otherwise attributes are stored in the chunks cache backend. # CLI flag: -blocks-storage.bucket-store.chunks-cache.attributes-ttl [attributes_ttl: | default = 168h] - # Maximum number of object attribute items to keep in a first level - # in-memory LRU cache. Metadata will be stored and fetched in-memory + # [advanced] Maximum number of object attribute items to keep in a first + # level in-memory LRU cache. Metadata will be stored and fetched in-memory # before hitting the cache backend. 0 to disable the in-memory cache. # CLI flag: -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items [attributes_in_memory_max_items: | default = 0] - # TTL for caching individual chunks subranges. + # [advanced] TTL for caching individual chunks subranges. # CLI flag: -blocks-storage.bucket-store.chunks-cache.subrange-ttl [subrange_ttl: | default = 24h] @@ -587,65 +587,65 @@ blocks_storage: # blocks-storage.bucket-store.metadata-cache [memcached: ] - # How long to cache list of tenants in the bucket. + # [advanced] How long to cache list of tenants in the bucket. # CLI flag: -blocks-storage.bucket-store.metadata-cache.tenants-list-ttl [tenants_list_ttl: | default = 15m] - # How long to cache list of blocks for each tenant. + # [advanced] How long to cache list of blocks for each tenant. # CLI flag: -blocks-storage.bucket-store.metadata-cache.tenant-blocks-list-ttl [tenant_blocks_list_ttl: | default = 5m] - # How long to cache list of chunks for a block. + # [advanced] How long to cache list of chunks for a block. # CLI flag: -blocks-storage.bucket-store.metadata-cache.chunks-list-ttl [chunks_list_ttl: | default = 24h] - # How long to cache information that block metafile exists. Also used for - # user deletion mark file. + # [advanced] How long to cache information that block metafile exists. + # Also used for user deletion mark file. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-exists-ttl [metafile_exists_ttl: | default = 2h] - # How long to cache information that block metafile doesn't exist. Also - # used for user deletion mark file. + # [advanced] How long to cache information that block metafile doesn't + # exist. Also used for user deletion mark file. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-doesnt-exist-ttl [metafile_doesnt_exist_ttl: | default = 5m] - # How long to cache content of the metafile. + # [advanced] How long to cache content of the metafile. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-content-ttl [metafile_content_ttl: | default = 24h] - # Maximum size of metafile content to cache in bytes. Caching will be - # skipped if the content exceeds this size. This is useful to avoid - # network round trip for large content if the configured caching backend - # has an hard limit on cached items size (in this case, you should set - # this limit to the same limit in the caching backend). + # [advanced] Maximum size of metafile content to cache in bytes. Caching + # will be skipped if the content exceeds this size. This is useful to + # avoid network round trip for large content if the configured caching + # backend has an hard limit on cached items size (in this case, you should + # set this limit to the same limit in the caching backend). # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-max-size-bytes [metafile_max_size_bytes: | default = 1048576] - # How long to cache attributes of the block metafile. + # [advanced] How long to cache attributes of the block metafile. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-attributes-ttl [metafile_attributes_ttl: | default = 168h] - # How long to cache attributes of the block index. + # [advanced] How long to cache attributes of the block index. # CLI flag: -blocks-storage.bucket-store.metadata-cache.block-index-attributes-ttl [block_index_attributes_ttl: | default = 168h] - # How long to cache content of the bucket index. + # [advanced] How long to cache content of the bucket index. # CLI flag: -blocks-storage.bucket-store.metadata-cache.bucket-index-content-ttl [bucket_index_content_ttl: | default = 5m] - # Maximum size of bucket index content to cache in bytes. Caching will be - # skipped if the content exceeds this size. This is useful to avoid - # network round trip for large content if the configured caching backend - # has an hard limit on cached items size (in this case, you should set - # this limit to the same limit in the caching backend). + # [advanced] Maximum size of bucket index content to cache in bytes. + # Caching will be skipped if the content exceeds this size. This is useful + # to avoid network round trip for large content if the configured caching + # backend has an hard limit on cached items size (in this case, you should + # set this limit to the same limit in the caching backend). # CLI flag: -blocks-storage.bucket-store.metadata-cache.bucket-index-max-size-bytes [bucket_index_max_size_bytes: | default = 1048576] - # Duration after which the blocks marked for deletion will be filtered out - # while fetching blocks. The idea of ignore-deletion-marks-delay is to - # ignore blocks that are marked for deletion with some delay. This ensures - # store can still serve blocks that are meant to be deleted but do not have - # a replacement yet. + # [advanced] Duration after which the blocks marked for deletion will be + # filtered out while fetching blocks. The idea of + # ignore-deletion-marks-delay is to ignore blocks that are marked for + # deletion with some delay. This ensures store can still serve blocks that + # are meant to be deleted but do not have a replacement yet. # CLI flag: -blocks-storage.bucket-store.ignore-deletion-marks-delay [ignore_deletion_mark_delay: | default = 1h] @@ -655,34 +655,36 @@ blocks_storage: # CLI flag: -blocks-storage.bucket-store.bucket-index.enabled [enabled: | default = false] - # How frequently a bucket index, which previously failed to load, should - # be tried to load again. This option is used only by querier. + # [advanced] How frequently a bucket index, which previously failed to + # load, should be tried to load again. This option is used only by + # querier. # CLI flag: -blocks-storage.bucket-store.bucket-index.update-on-error-interval [update_on_error_interval: | default = 1m] - # How long a unused bucket index should be cached. Once this timeout - # expires, the unused bucket index is removed from the in-memory cache. - # This option is used only by querier. + # [advanced] How long a unused bucket index should be cached. Once this + # timeout expires, the unused bucket index is removed from the in-memory + # cache. This option is used only by querier. # CLI flag: -blocks-storage.bucket-store.bucket-index.idle-timeout [idle_timeout: | default = 1h] - # The maximum allowed age of a bucket index (last updated) before queries - # start failing because the bucket index is too old. The bucket index is - # periodically updated by the compactor, while this check is enforced in - # the querier (at query time). + # [advanced] The maximum allowed age of a bucket index (last updated) + # before queries start failing because the bucket index is too old. The + # bucket index is periodically updated by the compactor, while this check + # is enforced in the querier (at query time). # CLI flag: -blocks-storage.bucket-store.bucket-index.max-stale-period [max_stale_period: | default = 1h] - # Blocks with minimum time within this duration are ignored, and not loaded - # by store-gateway. Useful when used together with + # [advanced] Blocks with minimum time within this duration are ignored, and + # not loaded by store-gateway. Useful when used together with # -querier.query-store-after to prevent loading young blocks, because there # are usually many of them (depending on number of ingesters) and they are # not yet compacted. Negative values or 0 disable the filter. # CLI flag: -blocks-storage.bucket-store.ignore-blocks-within [ignore_blocks_within: | default = 0s] - # Max size - in bytes - of a chunks pool, used to reduce memory allocations. - # The pool is shared across all tenants. 0 to disable the limit. + # [advanced] Max size - in bytes - of a chunks pool, used to reduce memory + # allocations. The pool is shared across all tenants. 0 to disable the + # limit. # CLI flag: -blocks-storage.bucket-store.max-chunk-pool-bytes [max_chunk_pool_bytes: | default = 2147483648] @@ -694,20 +696,20 @@ blocks_storage: # CLI flag: -blocks-storage.bucket-store.chunk-pool-max-bucket-size-bytes [chunk_pool_max_bucket_size_bytes: | default = 50000000] - # Max size - in bytes - of the in-memory series hash cache. The cache is - # shared across all tenants and it's used only when query sharding is - # enabled. + # [advanced] Max size - in bytes - of the in-memory series hash cache. The + # cache is shared across all tenants and it's used only when query sharding + # is enabled. # CLI flag: -blocks-storage.bucket-store.series-hash-cache-max-size-bytes [series_hash_cache_max_size_bytes: | default = 1073741824] - # If enabled, store-gateway will lazy load an index-header only once - # required by a query. + # [advanced] If enabled, store-gateway will lazy load an index-header only + # once required by a query. # CLI flag: -blocks-storage.bucket-store.index-header-lazy-loading-enabled [index_header_lazy_loading_enabled: | default = true] - # If index-header lazy loading is enabled and this setting is > 0, the - # store-gateway will offload unused index-headers after 'idle timeout' - # inactivity. + # [advanced] If index-header lazy loading is enabled and this setting is > + # 0, the store-gateway will offload unused index-headers after 'idle + # timeout' inactivity. # CLI flag: -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout [index_header_lazy_loading_idle_timeout: | default = 1h] @@ -726,7 +728,7 @@ blocks_storage: # CLI flag: -blocks-storage.tsdb.dir [dir: | default = "tsdb"] - # TSDB blocks range period. + # [advanced] TSDB blocks range period. # CLI flag: -blocks-storage.tsdb.block-ranges-period [block_ranges_period: | default = 2h0m0s] @@ -737,35 +739,36 @@ blocks_storage: # CLI flag: -blocks-storage.tsdb.retention-period [retention_period: | default = 24h] - # How frequently the TSDB blocks are scanned and new ones are shipped to the - # storage. 0 means shipping is disabled. + # [advanced] How frequently the TSDB blocks are scanned and new ones are + # shipped to the storage. 0 means shipping is disabled. # CLI flag: -blocks-storage.tsdb.ship-interval [ship_interval: | default = 1m] - # Maximum number of tenants concurrently shipping blocks to the storage. + # [advanced] Maximum number of tenants concurrently shipping blocks to the + # storage. # CLI flag: -blocks-storage.tsdb.ship-concurrency [ship_concurrency: | default = 10] - # How frequently ingesters try to compact TSDB head. Block is only created - # if data covers smallest block range. Must be greater than 0 and max 5 - # minutes. + # [advanced] How frequently ingesters try to compact TSDB head. Block is + # only created if data covers smallest block range. Must be greater than 0 + # and max 5 minutes. # CLI flag: -blocks-storage.tsdb.head-compaction-interval [head_compaction_interval: | default = 1m] - # Maximum number of tenants concurrently compacting TSDB head into a new - # block + # [advanced] Maximum number of tenants concurrently compacting TSDB head + # into a new block # CLI flag: -blocks-storage.tsdb.head-compaction-concurrency [head_compaction_concurrency: | default = 5] - # If TSDB head is idle for this duration, it is compacted. Note that up to - # 25% jitter is added to the value to avoid ingesters compacting + # [advanced] If TSDB head is idle for this duration, it is compacted. Note + # that up to 25% jitter is added to the value to avoid ingesters compacting # concurrently. 0 means disabled. # CLI flag: -blocks-storage.tsdb.head-compaction-idle-timeout [head_compaction_idle_timeout: | default = 1h] - # The write buffer size used by the head chunks mapper. Lower values reduce - # memory utilisation on clusters with a large number of tenants at the cost - # of increased disk I/O operations. + # [advanced] The write buffer size used by the head chunks mapper. Lower + # values reduce memory utilisation on clusters with a large number of + # tenants at the cost of increased disk I/O operations. # CLI flag: -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes [head_chunks_write_buffer_size_bytes: | default = 4194304] @@ -775,56 +778,57 @@ blocks_storage: # CLI flag: -blocks-storage.tsdb.head-chunks-end-time-variance [head_chunks_end_time_variance: | default = 0] - # The number of shards of series to use in TSDB (must be a power of 2). - # Reducing this will decrease memory footprint, but can negatively impact - # performance. + # [advanced] The number of shards of series to use in TSDB (must be a power + # of 2). Reducing this will decrease memory footprint, but can negatively + # impact performance. # CLI flag: -blocks-storage.tsdb.stripe-size [stripe_size: | default = 16384] - # True to enable TSDB WAL compression. + # [advanced] True to enable TSDB WAL compression. # CLI flag: -blocks-storage.tsdb.wal-compression-enabled [wal_compression_enabled: | default = false] - # TSDB WAL segments files max size (bytes). + # [advanced] TSDB WAL segments files max size (bytes). # CLI flag: -blocks-storage.tsdb.wal-segment-size-bytes [wal_segment_size_bytes: | default = 134217728] - # True to flush blocks to storage on shutdown. If false, incomplete blocks - # will be reused after restart. + # [advanced] True to flush blocks to storage on shutdown. If false, + # incomplete blocks will be reused after restart. # CLI flag: -blocks-storage.tsdb.flush-blocks-on-shutdown [flush_blocks_on_shutdown: | default = false] - # If TSDB has not received any data for this duration, and all blocks from - # TSDB have been shipped, TSDB is closed and deleted from local disk. If set - # to positive value, this value should be equal or higher than + # [advanced] If TSDB has not received any data for this duration, and all + # blocks from TSDB have been shipped, TSDB is closed and deleted from local + # disk. If set to positive value, this value should be equal or higher than # -querier.query-ingesters-within flag to make sure that TSDB is not closed # prematurely, which could cause partial query results. 0 or negative value # disables closing of idle TSDB. # CLI flag: -blocks-storage.tsdb.close-idle-tsdb-timeout [close_idle_tsdb_timeout: | default = 13h] - # True to enable snapshotting of in-memory TSDB data on disk when shutting - # down. + # [advanced] True to enable snapshotting of in-memory TSDB data on disk when + # shutting down. # CLI flag: -blocks-storage.tsdb.memory-snapshot-on-shutdown [memory_snapshot_on_shutdown: | default = false] - # The size of the write queue used by the head chunks mapper. Lower values - # reduce memory utilisation at the cost of potentially higher ingest - # latency. + # [advanced] The size of the write queue used by the head chunks mapper. + # Lower values reduce memory utilisation at the cost of potentially higher + # ingest latency. # CLI flag: -blocks-storage.tsdb.head-chunks-write-queue-size [head_chunks_write_queue_size: | default = 1000000] - # Enables TSDB isolation feature. Disabling may improve performance. + # [advanced] Enables TSDB isolation feature. Disabling may improve + # performance. # CLI flag: -blocks-storage.tsdb.isolation-enabled [isolation_enabled: | default = true] - # Max size - in bytes - of the in-memory series hash cache. The cache is - # shared across all tenants and it's used only when query sharding is - # enabled. + # [advanced] Max size - in bytes - of the in-memory series hash cache. The + # cache is shared across all tenants and it's used only when query sharding + # is enabled. # CLI flag: -blocks-storage.tsdb.series-hash-cache-max-size-bytes [series_hash_cache_max_size_bytes: | default = 1073741824] - # limit the number of concurrently opening TSDB's on startup + # [advanced] limit the number of concurrently opening TSDB's on startup # CLI flag: -blocks-storage.tsdb.max-tsdb-opening-concurrency-on-startup [max_tsdb_opening_concurrency_on_startup: | default = 10] ``` diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 6bbb6bf5430..1563080b258 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -2895,33 +2895,33 @@ bucket_store: # CLI flag: -blocks-storage.bucket-store.sync-dir [sync_dir: | default = "tsdb-sync"] - # How frequently to scan the bucket, or to refresh the bucket index (if - # enabled), in order to look for changes (new blocks shipped by ingesters and - # blocks deleted by retention or compaction). + # [advanced] How frequently to scan the bucket, or to refresh the bucket index + # (if enabled), in order to look for changes (new blocks shipped by ingesters + # and blocks deleted by retention or compaction). # CLI flag: -blocks-storage.bucket-store.sync-interval [sync_interval: | default = 15m] - # Max number of concurrent queries to execute against the long-term storage. - # The limit is shared across all tenants. + # [advanced] Max number of concurrent queries to execute against the long-term + # storage. The limit is shared across all tenants. # CLI flag: -blocks-storage.bucket-store.max-concurrent [max_concurrent: | default = 100] - # Maximum number of concurrent tenants synching blocks. + # [advanced] Maximum number of concurrent tenants synching blocks. # CLI flag: -blocks-storage.bucket-store.tenant-sync-concurrency [tenant_sync_concurrency: | default = 10] - # Maximum number of concurrent blocks synching per tenant. + # [advanced] Maximum number of concurrent blocks synching per tenant. # CLI flag: -blocks-storage.bucket-store.block-sync-concurrency [block_sync_concurrency: | default = 20] - # Number of Go routines to use when syncing block meta files from object - # storage per tenant. + # [advanced] Number of Go routines to use when syncing block meta files from + # object storage per tenant. # CLI flag: -blocks-storage.bucket-store.meta-sync-concurrency [meta_sync_concurrency: | default = 20] - # Minimum age of a block before it's being read. Set it to safe value (e.g - # 30m) if your object storage is eventually consistent. GCS and S3 are - # (roughly) strongly consistent. + # [advanced] Minimum age of a block before it's being read. Set it to safe + # value (e.g 30m) if your object storage is eventually consistent. GCS and S3 + # are (roughly) strongly consistent. # CLI flag: -blocks-storage.bucket-store.consistency-delay [consistency_delay: | default = 0s] @@ -2951,29 +2951,30 @@ bucket_store: # blocks-storage.bucket-store.chunks-cache [memcached: ] - # Size of each subrange that bucket object is split into for better caching. + # [advanced] Size of each subrange that bucket object is split into for + # better caching. # CLI flag: -blocks-storage.bucket-store.chunks-cache.subrange-size [subrange_size: | default = 16000] - # Maximum number of sub-GetRange requests that a single GetRange request can - # be split into when fetching chunks. Zero or negative value = unlimited - # number of sub-requests. + # [advanced] Maximum number of sub-GetRange requests that a single GetRange + # request can be split into when fetching chunks. Zero or negative value = + # unlimited number of sub-requests. # CLI flag: -blocks-storage.bucket-store.chunks-cache.max-get-range-requests [max_get_range_requests: | default = 3] - # TTL for caching object attributes for chunks. If the metadata cache is - # configured, attributes will be stored under this cache backend, otherwise - # attributes are stored in the chunks cache backend. + # [advanced] TTL for caching object attributes for chunks. If the metadata + # cache is configured, attributes will be stored under this cache backend, + # otherwise attributes are stored in the chunks cache backend. # CLI flag: -blocks-storage.bucket-store.chunks-cache.attributes-ttl [attributes_ttl: | default = 168h] - # Maximum number of object attribute items to keep in a first level - # in-memory LRU cache. Metadata will be stored and fetched in-memory before - # hitting the cache backend. 0 to disable the in-memory cache. + # [advanced] Maximum number of object attribute items to keep in a first + # level in-memory LRU cache. Metadata will be stored and fetched in-memory + # before hitting the cache backend. 0 to disable the in-memory cache. # CLI flag: -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items [attributes_in_memory_max_items: | default = 0] - # TTL for caching individual chunks subranges. + # [advanced] TTL for caching individual chunks subranges. # CLI flag: -blocks-storage.bucket-store.chunks-cache.subrange-ttl [subrange_ttl: | default = 24h] @@ -2987,65 +2988,65 @@ bucket_store: # blocks-storage.bucket-store.metadata-cache [memcached: ] - # How long to cache list of tenants in the bucket. + # [advanced] How long to cache list of tenants in the bucket. # CLI flag: -blocks-storage.bucket-store.metadata-cache.tenants-list-ttl [tenants_list_ttl: | default = 15m] - # How long to cache list of blocks for each tenant. + # [advanced] How long to cache list of blocks for each tenant. # CLI flag: -blocks-storage.bucket-store.metadata-cache.tenant-blocks-list-ttl [tenant_blocks_list_ttl: | default = 5m] - # How long to cache list of chunks for a block. + # [advanced] How long to cache list of chunks for a block. # CLI flag: -blocks-storage.bucket-store.metadata-cache.chunks-list-ttl [chunks_list_ttl: | default = 24h] - # How long to cache information that block metafile exists. Also used for - # user deletion mark file. + # [advanced] How long to cache information that block metafile exists. Also + # used for user deletion mark file. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-exists-ttl [metafile_exists_ttl: | default = 2h] - # How long to cache information that block metafile doesn't exist. Also used - # for user deletion mark file. + # [advanced] How long to cache information that block metafile doesn't + # exist. Also used for user deletion mark file. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-doesnt-exist-ttl [metafile_doesnt_exist_ttl: | default = 5m] - # How long to cache content of the metafile. + # [advanced] How long to cache content of the metafile. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-content-ttl [metafile_content_ttl: | default = 24h] - # Maximum size of metafile content to cache in bytes. Caching will be - # skipped if the content exceeds this size. This is useful to avoid network - # round trip for large content if the configured caching backend has an hard - # limit on cached items size (in this case, you should set this limit to the - # same limit in the caching backend). + # [advanced] Maximum size of metafile content to cache in bytes. Caching + # will be skipped if the content exceeds this size. This is useful to avoid + # network round trip for large content if the configured caching backend has + # an hard limit on cached items size (in this case, you should set this + # limit to the same limit in the caching backend). # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-max-size-bytes [metafile_max_size_bytes: | default = 1048576] - # How long to cache attributes of the block metafile. + # [advanced] How long to cache attributes of the block metafile. # CLI flag: -blocks-storage.bucket-store.metadata-cache.metafile-attributes-ttl [metafile_attributes_ttl: | default = 168h] - # How long to cache attributes of the block index. + # [advanced] How long to cache attributes of the block index. # CLI flag: -blocks-storage.bucket-store.metadata-cache.block-index-attributes-ttl [block_index_attributes_ttl: | default = 168h] - # How long to cache content of the bucket index. + # [advanced] How long to cache content of the bucket index. # CLI flag: -blocks-storage.bucket-store.metadata-cache.bucket-index-content-ttl [bucket_index_content_ttl: | default = 5m] - # Maximum size of bucket index content to cache in bytes. Caching will be - # skipped if the content exceeds this size. This is useful to avoid network - # round trip for large content if the configured caching backend has an hard - # limit on cached items size (in this case, you should set this limit to the - # same limit in the caching backend). + # [advanced] Maximum size of bucket index content to cache in bytes. Caching + # will be skipped if the content exceeds this size. This is useful to avoid + # network round trip for large content if the configured caching backend has + # an hard limit on cached items size (in this case, you should set this + # limit to the same limit in the caching backend). # CLI flag: -blocks-storage.bucket-store.metadata-cache.bucket-index-max-size-bytes [bucket_index_max_size_bytes: | default = 1048576] - # Duration after which the blocks marked for deletion will be filtered out - # while fetching blocks. The idea of ignore-deletion-marks-delay is to ignore - # blocks that are marked for deletion with some delay. This ensures store can - # still serve blocks that are meant to be deleted but do not have a - # replacement yet. + # [advanced] Duration after which the blocks marked for deletion will be + # filtered out while fetching blocks. The idea of ignore-deletion-marks-delay + # is to ignore blocks that are marked for deletion with some delay. This + # ensures store can still serve blocks that are meant to be deleted but do not + # have a replacement yet. # CLI flag: -blocks-storage.bucket-store.ignore-deletion-marks-delay [ignore_deletion_mark_delay: | default = 1h] @@ -3055,34 +3056,34 @@ bucket_store: # CLI flag: -blocks-storage.bucket-store.bucket-index.enabled [enabled: | default = false] - # How frequently a bucket index, which previously failed to load, should be - # tried to load again. This option is used only by querier. + # [advanced] How frequently a bucket index, which previously failed to load, + # should be tried to load again. This option is used only by querier. # CLI flag: -blocks-storage.bucket-store.bucket-index.update-on-error-interval [update_on_error_interval: | default = 1m] - # How long a unused bucket index should be cached. Once this timeout - # expires, the unused bucket index is removed from the in-memory cache. This - # option is used only by querier. + # [advanced] How long a unused bucket index should be cached. Once this + # timeout expires, the unused bucket index is removed from the in-memory + # cache. This option is used only by querier. # CLI flag: -blocks-storage.bucket-store.bucket-index.idle-timeout [idle_timeout: | default = 1h] - # The maximum allowed age of a bucket index (last updated) before queries - # start failing because the bucket index is too old. The bucket index is - # periodically updated by the compactor, while this check is enforced in the - # querier (at query time). + # [advanced] The maximum allowed age of a bucket index (last updated) before + # queries start failing because the bucket index is too old. The bucket + # index is periodically updated by the compactor, while this check is + # enforced in the querier (at query time). # CLI flag: -blocks-storage.bucket-store.bucket-index.max-stale-period [max_stale_period: | default = 1h] - # Blocks with minimum time within this duration are ignored, and not loaded by - # store-gateway. Useful when used together with -querier.query-store-after to - # prevent loading young blocks, because there are usually many of them - # (depending on number of ingesters) and they are not yet compacted. Negative - # values or 0 disable the filter. + # [advanced] Blocks with minimum time within this duration are ignored, and + # not loaded by store-gateway. Useful when used together with + # -querier.query-store-after to prevent loading young blocks, because there + # are usually many of them (depending on number of ingesters) and they are not + # yet compacted. Negative values or 0 disable the filter. # CLI flag: -blocks-storage.bucket-store.ignore-blocks-within [ignore_blocks_within: | default = 0s] - # Max size - in bytes - of a chunks pool, used to reduce memory allocations. - # The pool is shared across all tenants. 0 to disable the limit. + # [advanced] Max size - in bytes - of a chunks pool, used to reduce memory + # allocations. The pool is shared across all tenants. 0 to disable the limit. # CLI flag: -blocks-storage.bucket-store.max-chunk-pool-bytes [max_chunk_pool_bytes: | default = 2147483648] @@ -3094,18 +3095,19 @@ bucket_store: # CLI flag: -blocks-storage.bucket-store.chunk-pool-max-bucket-size-bytes [chunk_pool_max_bucket_size_bytes: | default = 50000000] - # Max size - in bytes - of the in-memory series hash cache. The cache is - # shared across all tenants and it's used only when query sharding is enabled. + # [advanced] Max size - in bytes - of the in-memory series hash cache. The + # cache is shared across all tenants and it's used only when query sharding is + # enabled. # CLI flag: -blocks-storage.bucket-store.series-hash-cache-max-size-bytes [series_hash_cache_max_size_bytes: | default = 1073741824] - # If enabled, store-gateway will lazy load an index-header only once required - # by a query. + # [advanced] If enabled, store-gateway will lazy load an index-header only + # once required by a query. # CLI flag: -blocks-storage.bucket-store.index-header-lazy-loading-enabled [index_header_lazy_loading_enabled: | default = true] - # If index-header lazy loading is enabled and this setting is > 0, the - # store-gateway will offload unused index-headers after 'idle timeout' + # [advanced] If index-header lazy loading is enabled and this setting is > 0, + # the store-gateway will offload unused index-headers after 'idle timeout' # inactivity. # CLI flag: -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout [index_header_lazy_loading_idle_timeout: | default = 1h] @@ -3125,7 +3127,7 @@ tsdb: # CLI flag: -blocks-storage.tsdb.dir [dir: | default = "tsdb"] - # TSDB blocks range period. + # [advanced] TSDB blocks range period. # CLI flag: -blocks-storage.tsdb.block-ranges-period [block_ranges_period: | default = 2h0m0s] @@ -3136,33 +3138,36 @@ tsdb: # CLI flag: -blocks-storage.tsdb.retention-period [retention_period: | default = 24h] - # How frequently the TSDB blocks are scanned and new ones are shipped to the - # storage. 0 means shipping is disabled. + # [advanced] How frequently the TSDB blocks are scanned and new ones are + # shipped to the storage. 0 means shipping is disabled. # CLI flag: -blocks-storage.tsdb.ship-interval [ship_interval: | default = 1m] - # Maximum number of tenants concurrently shipping blocks to the storage. + # [advanced] Maximum number of tenants concurrently shipping blocks to the + # storage. # CLI flag: -blocks-storage.tsdb.ship-concurrency [ship_concurrency: | default = 10] - # How frequently ingesters try to compact TSDB head. Block is only created if - # data covers smallest block range. Must be greater than 0 and max 5 minutes. + # [advanced] How frequently ingesters try to compact TSDB head. Block is only + # created if data covers smallest block range. Must be greater than 0 and max + # 5 minutes. # CLI flag: -blocks-storage.tsdb.head-compaction-interval [head_compaction_interval: | default = 1m] - # Maximum number of tenants concurrently compacting TSDB head into a new block + # [advanced] Maximum number of tenants concurrently compacting TSDB head into + # a new block # CLI flag: -blocks-storage.tsdb.head-compaction-concurrency [head_compaction_concurrency: | default = 5] - # If TSDB head is idle for this duration, it is compacted. Note that up to 25% - # jitter is added to the value to avoid ingesters compacting concurrently. 0 - # means disabled. + # [advanced] If TSDB head is idle for this duration, it is compacted. Note + # that up to 25% jitter is added to the value to avoid ingesters compacting + # concurrently. 0 means disabled. # CLI flag: -blocks-storage.tsdb.head-compaction-idle-timeout [head_compaction_idle_timeout: | default = 1h] - # The write buffer size used by the head chunks mapper. Lower values reduce - # memory utilisation on clusters with a large number of tenants at the cost of - # increased disk I/O operations. + # [advanced] The write buffer size used by the head chunks mapper. Lower + # values reduce memory utilisation on clusters with a large number of tenants + # at the cost of increased disk I/O operations. # CLI flag: -blocks-storage.tsdb.head-chunks-write-buffer-size-bytes [head_chunks_write_buffer_size_bytes: | default = 4194304] @@ -3172,54 +3177,57 @@ tsdb: # CLI flag: -blocks-storage.tsdb.head-chunks-end-time-variance [head_chunks_end_time_variance: | default = 0] - # The number of shards of series to use in TSDB (must be a power of 2). - # Reducing this will decrease memory footprint, but can negatively impact + # [advanced] The number of shards of series to use in TSDB (must be a power of + # 2). Reducing this will decrease memory footprint, but can negatively impact # performance. # CLI flag: -blocks-storage.tsdb.stripe-size [stripe_size: | default = 16384] - # True to enable TSDB WAL compression. + # [advanced] True to enable TSDB WAL compression. # CLI flag: -blocks-storage.tsdb.wal-compression-enabled [wal_compression_enabled: | default = false] - # TSDB WAL segments files max size (bytes). + # [advanced] TSDB WAL segments files max size (bytes). # CLI flag: -blocks-storage.tsdb.wal-segment-size-bytes [wal_segment_size_bytes: | default = 134217728] - # True to flush blocks to storage on shutdown. If false, incomplete blocks - # will be reused after restart. + # [advanced] True to flush blocks to storage on shutdown. If false, incomplete + # blocks will be reused after restart. # CLI flag: -blocks-storage.tsdb.flush-blocks-on-shutdown [flush_blocks_on_shutdown: | default = false] - # If TSDB has not received any data for this duration, and all blocks from - # TSDB have been shipped, TSDB is closed and deleted from local disk. If set - # to positive value, this value should be equal or higher than + # [advanced] If TSDB has not received any data for this duration, and all + # blocks from TSDB have been shipped, TSDB is closed and deleted from local + # disk. If set to positive value, this value should be equal or higher than # -querier.query-ingesters-within flag to make sure that TSDB is not closed # prematurely, which could cause partial query results. 0 or negative value # disables closing of idle TSDB. # CLI flag: -blocks-storage.tsdb.close-idle-tsdb-timeout [close_idle_tsdb_timeout: | default = 13h] - # True to enable snapshotting of in-memory TSDB data on disk when shutting - # down. + # [advanced] True to enable snapshotting of in-memory TSDB data on disk when + # shutting down. # CLI flag: -blocks-storage.tsdb.memory-snapshot-on-shutdown [memory_snapshot_on_shutdown: | default = false] - # The size of the write queue used by the head chunks mapper. Lower values - # reduce memory utilisation at the cost of potentially higher ingest latency. + # [advanced] The size of the write queue used by the head chunks mapper. Lower + # values reduce memory utilisation at the cost of potentially higher ingest + # latency. # CLI flag: -blocks-storage.tsdb.head-chunks-write-queue-size [head_chunks_write_queue_size: | default = 1000000] - # Enables TSDB isolation feature. Disabling may improve performance. + # [advanced] Enables TSDB isolation feature. Disabling may improve + # performance. # CLI flag: -blocks-storage.tsdb.isolation-enabled [isolation_enabled: | default = true] - # Max size - in bytes - of the in-memory series hash cache. The cache is - # shared across all tenants and it's used only when query sharding is enabled. + # [advanced] Max size - in bytes - of the in-memory series hash cache. The + # cache is shared across all tenants and it's used only when query sharding is + # enabled. # CLI flag: -blocks-storage.tsdb.series-hash-cache-max-size-bytes [series_hash_cache_max_size_bytes: | default = 1073741824] - # limit the number of concurrently opening TSDB's on startup + # [advanced] limit the number of concurrently opening TSDB's on startup # CLI flag: -blocks-storage.tsdb.max-tsdb-opening-concurrency-on-startup [max_tsdb_opening_concurrency_on_startup: | default = 10] ``` @@ -3535,32 +3543,33 @@ The `memcached_config` configures the Memcached-based caching backend. The suppo # CLI flag: -.memcached.timeout [timeout: | default = 100ms] -# The maximum number of idle connections that will be maintained per address. +# [advanced] The maximum number of idle connections that will be maintained per +# address. # CLI flag: -.memcached.max-idle-connections [max_idle_connections: | default = 100] -# The maximum number of concurrent asynchronous operations can occur. +# [advanced] The maximum number of concurrent asynchronous operations can occur. # CLI flag: -.memcached.max-async-concurrency [max_async_concurrency: | default = 50] -# The maximum number of enqueued asynchronous operations allowed. +# [advanced] The maximum number of enqueued asynchronous operations allowed. # CLI flag: -.memcached.max-async-buffer-size [max_async_buffer_size: | default = 25000] -# The maximum number of concurrent connections running get operations. If set to -# 0, concurrency is unlimited. +# [advanced] The maximum number of concurrent connections running get +# operations. If set to 0, concurrency is unlimited. # CLI flag: -.memcached.max-get-multi-concurrency [max_get_multi_concurrency: | default = 100] -# The maximum number of keys a single underlying get operation should run. If -# more keys are specified, internally keys are split into multiple batches and -# fetched concurrently, honoring the max concurrency. If set to 0, the max batch -# size is unlimited. +# [advanced] The maximum number of keys a single underlying get operation should +# run. If more keys are specified, internally keys are split into multiple +# batches and fetched concurrently, honoring the max concurrency. If set to 0, +# the max batch size is unlimited. # CLI flag: -.memcached.max-get-multi-batch-size [max_get_multi_batch_size: | default = 100] -# The maximum size of an item stored in memcached. Bigger items are not stored. -# If set to 0, no maximum size is enforced. +# [advanced] The maximum size of an item stored in memcached. Bigger items are +# not stored. If set to 0, no maximum size is enforced. # CLI flag: -.memcached.max-item-size [max_item_size: | default = 1048576] ``` diff --git a/pkg/cache/memcache_config.go b/pkg/cache/memcache_config.go index 92e00fffbea..3b922a369fa 100644 --- a/pkg/cache/memcache_config.go +++ b/pkg/cache/memcache_config.go @@ -22,12 +22,12 @@ var ( type MemcachedConfig struct { Addresses string `yaml:"addresses"` Timeout time.Duration `yaml:"timeout"` - MaxIdleConnections int `yaml:"max_idle_connections"` - MaxAsyncConcurrency int `yaml:"max_async_concurrency"` - MaxAsyncBufferSize int `yaml:"max_async_buffer_size"` - MaxGetMultiConcurrency int `yaml:"max_get_multi_concurrency"` - MaxGetMultiBatchSize int `yaml:"max_get_multi_batch_size"` - MaxItemSize int `yaml:"max_item_size"` + MaxIdleConnections int `yaml:"max_idle_connections" category:"advanced"` + MaxAsyncConcurrency int `yaml:"max_async_concurrency" category:"advanced"` + MaxAsyncBufferSize int `yaml:"max_async_buffer_size" category:"advanced"` + MaxGetMultiConcurrency int `yaml:"max_get_multi_concurrency" category:"advanced"` + MaxGetMultiBatchSize int `yaml:"max_get_multi_batch_size" category:"advanced"` + MaxItemSize int `yaml:"max_item_size" category:"advanced"` } func (cfg *MemcachedConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { diff --git a/pkg/storage/tsdb/caching_config.go b/pkg/storage/tsdb/caching_config.go index f3a12bd3b6d..789d8a3bcd9 100644 --- a/pkg/storage/tsdb/caching_config.go +++ b/pkg/storage/tsdb/caching_config.go @@ -29,11 +29,11 @@ import ( type ChunksCacheConfig struct { cache.BackendConfig `yaml:",inline"` - SubrangeSize int64 `yaml:"subrange_size"` - MaxGetRangeRequests int `yaml:"max_get_range_requests"` - AttributesTTL time.Duration `yaml:"attributes_ttl"` - AttributesInMemoryMaxItems int `yaml:"attributes_in_memory_max_items"` - SubrangeTTL time.Duration `yaml:"subrange_ttl"` + SubrangeSize int64 `yaml:"subrange_size" category:"advanced"` + MaxGetRangeRequests int `yaml:"max_get_range_requests" category:"advanced"` + AttributesTTL time.Duration `yaml:"attributes_ttl" category:"advanced"` + AttributesInMemoryMaxItems int `yaml:"attributes_in_memory_max_items" category:"advanced"` + SubrangeTTL time.Duration `yaml:"subrange_ttl" category:"advanced"` } func (cfg *ChunksCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { @@ -55,17 +55,17 @@ func (cfg *ChunksCacheConfig) Validate() error { type MetadataCacheConfig struct { cache.BackendConfig `yaml:",inline"` - TenantsListTTL time.Duration `yaml:"tenants_list_ttl"` - TenantBlocksListTTL time.Duration `yaml:"tenant_blocks_list_ttl"` - ChunksListTTL time.Duration `yaml:"chunks_list_ttl"` - MetafileExistsTTL time.Duration `yaml:"metafile_exists_ttl"` - MetafileDoesntExistTTL time.Duration `yaml:"metafile_doesnt_exist_ttl"` - MetafileContentTTL time.Duration `yaml:"metafile_content_ttl"` - MetafileMaxSize int `yaml:"metafile_max_size_bytes"` - MetafileAttributesTTL time.Duration `yaml:"metafile_attributes_ttl"` - BlockIndexAttributesTTL time.Duration `yaml:"block_index_attributes_ttl"` - BucketIndexContentTTL time.Duration `yaml:"bucket_index_content_ttl"` - BucketIndexMaxSize int `yaml:"bucket_index_max_size_bytes"` + TenantsListTTL time.Duration `yaml:"tenants_list_ttl" category:"advanced"` + TenantBlocksListTTL time.Duration `yaml:"tenant_blocks_list_ttl" category:"advanced"` + ChunksListTTL time.Duration `yaml:"chunks_list_ttl" category:"advanced"` + MetafileExistsTTL time.Duration `yaml:"metafile_exists_ttl" category:"advanced"` + MetafileDoesntExistTTL time.Duration `yaml:"metafile_doesnt_exist_ttl" category:"advanced"` + MetafileContentTTL time.Duration `yaml:"metafile_content_ttl" category:"advanced"` + MetafileMaxSize int `yaml:"metafile_max_size_bytes" category:"advanced"` + MetafileAttributesTTL time.Duration `yaml:"metafile_attributes_ttl" category:"advanced"` + BlockIndexAttributesTTL time.Duration `yaml:"block_index_attributes_ttl" category:"advanced"` + BucketIndexContentTTL time.Duration `yaml:"bucket_index_content_ttl" category:"advanced"` + BucketIndexMaxSize int `yaml:"bucket_index_max_size_bytes" category:"advanced"` } func (cfg *MetadataCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { diff --git a/pkg/storage/tsdb/config.go b/pkg/storage/tsdb/config.go index 83d6f6aae31..54815d29c5c 100644 --- a/pkg/storage/tsdb/config.go +++ b/pkg/storage/tsdb/config.go @@ -141,29 +141,29 @@ func (cfg *BlocksStorageConfig) Validate() error { //nolint:golint type TSDBConfig struct { Dir string `yaml:"dir"` - BlockRanges DurationList `yaml:"block_ranges_period"` + BlockRanges DurationList `yaml:"block_ranges_period" category:"advanced"` Retention time.Duration `yaml:"retention_period"` - ShipInterval time.Duration `yaml:"ship_interval"` - ShipConcurrency int `yaml:"ship_concurrency"` - HeadCompactionInterval time.Duration `yaml:"head_compaction_interval"` - HeadCompactionConcurrency int `yaml:"head_compaction_concurrency"` - HeadCompactionIdleTimeout time.Duration `yaml:"head_compaction_idle_timeout"` - HeadChunksWriteBufferSize int `yaml:"head_chunks_write_buffer_size_bytes"` + ShipInterval time.Duration `yaml:"ship_interval" category:"advanced"` + ShipConcurrency int `yaml:"ship_concurrency" category:"advanced"` + HeadCompactionInterval time.Duration `yaml:"head_compaction_interval" category:"advanced"` + HeadCompactionConcurrency int `yaml:"head_compaction_concurrency" category:"advanced"` + HeadCompactionIdleTimeout time.Duration `yaml:"head_compaction_idle_timeout" category:"advanced"` + HeadChunksWriteBufferSize int `yaml:"head_chunks_write_buffer_size_bytes" category:"advanced"` HeadChunksEndTimeVariance float64 `yaml:"head_chunks_end_time_variance" category:"experimental"` - StripeSize int `yaml:"stripe_size"` - WALCompressionEnabled bool `yaml:"wal_compression_enabled"` - WALSegmentSizeBytes int `yaml:"wal_segment_size_bytes"` - FlushBlocksOnShutdown bool `yaml:"flush_blocks_on_shutdown"` - CloseIdleTSDBTimeout time.Duration `yaml:"close_idle_tsdb_timeout"` - MemorySnapshotOnShutdown bool `yaml:"memory_snapshot_on_shutdown"` - HeadChunksWriteQueueSize int `yaml:"head_chunks_write_queue_size"` - IsolationEnabled bool `yaml:"isolation_enabled"` + StripeSize int `yaml:"stripe_size" category:"advanced"` + WALCompressionEnabled bool `yaml:"wal_compression_enabled" category:"advanced"` + WALSegmentSizeBytes int `yaml:"wal_segment_size_bytes" category:"advanced"` + FlushBlocksOnShutdown bool `yaml:"flush_blocks_on_shutdown" category:"advanced"` + CloseIdleTSDBTimeout time.Duration `yaml:"close_idle_tsdb_timeout" category:"advanced"` + MemorySnapshotOnShutdown bool `yaml:"memory_snapshot_on_shutdown" category:"advanced"` + HeadChunksWriteQueueSize int `yaml:"head_chunks_write_queue_size" category:"advanced"` + IsolationEnabled bool `yaml:"isolation_enabled" category:"advanced"` // Series hash cache. - SeriesHashCacheMaxBytes uint64 `yaml:"series_hash_cache_max_size_bytes"` + SeriesHashCacheMaxBytes uint64 `yaml:"series_hash_cache_max_size_bytes" category:"advanced"` // MaxTSDBOpeningConcurrencyOnStartup limits the number of concurrently opening TSDB's during startup. - MaxTSDBOpeningConcurrencyOnStartup int `yaml:"max_tsdb_opening_concurrency_on_startup"` + MaxTSDBOpeningConcurrencyOnStartup int `yaml:"max_tsdb_opening_concurrency_on_startup" category:"advanced"` // If true, user TSDBs are not closed on shutdown. Only for testing. // If false (default), user TSDBs are closed to make sure all resources are released and closed properly. @@ -252,30 +252,30 @@ func (cfg *TSDBConfig) IsBlocksShippingEnabled() bool { // BucketStoreConfig holds the config information for Bucket Stores used by the querier and store-gateway. type BucketStoreConfig struct { SyncDir string `yaml:"sync_dir"` - SyncInterval time.Duration `yaml:"sync_interval"` - MaxConcurrent int `yaml:"max_concurrent"` - TenantSyncConcurrency int `yaml:"tenant_sync_concurrency"` - BlockSyncConcurrency int `yaml:"block_sync_concurrency"` - MetaSyncConcurrency int `yaml:"meta_sync_concurrency"` - ConsistencyDelay time.Duration `yaml:"consistency_delay"` + SyncInterval time.Duration `yaml:"sync_interval" category:"advanced"` + MaxConcurrent int `yaml:"max_concurrent" category:"advanced"` + TenantSyncConcurrency int `yaml:"tenant_sync_concurrency" category:"advanced"` + BlockSyncConcurrency int `yaml:"block_sync_concurrency" category:"advanced"` + MetaSyncConcurrency int `yaml:"meta_sync_concurrency" category:"advanced"` + ConsistencyDelay time.Duration `yaml:"consistency_delay" category:"advanced"` IndexCache IndexCacheConfig `yaml:"index_cache"` ChunksCache ChunksCacheConfig `yaml:"chunks_cache"` MetadataCache MetadataCacheConfig `yaml:"metadata_cache"` - IgnoreDeletionMarksDelay time.Duration `yaml:"ignore_deletion_mark_delay"` + IgnoreDeletionMarksDelay time.Duration `yaml:"ignore_deletion_mark_delay" category:"advanced"` BucketIndex BucketIndexConfig `yaml:"bucket_index"` - IgnoreBlocksWithin time.Duration `yaml:"ignore_blocks_within"` + IgnoreBlocksWithin time.Duration `yaml:"ignore_blocks_within" category:"advanced"` // Chunk pool. - MaxChunkPoolBytes uint64 `yaml:"max_chunk_pool_bytes"` + MaxChunkPoolBytes uint64 `yaml:"max_chunk_pool_bytes" category:"advanced"` ChunkPoolMinBucketSizeBytes int `yaml:"chunk_pool_min_bucket_size_bytes" category:"advanced"` ChunkPoolMaxBucketSizeBytes int `yaml:"chunk_pool_max_bucket_size_bytes" category:"advanced"` // Series hash cache. - SeriesHashCacheMaxBytes uint64 `yaml:"series_hash_cache_max_size_bytes"` + SeriesHashCacheMaxBytes uint64 `yaml:"series_hash_cache_max_size_bytes" category:"advanced"` // Controls whether index-header lazy loading is enabled. - IndexHeaderLazyLoadingEnabled bool `yaml:"index_header_lazy_loading_enabled"` - IndexHeaderLazyLoadingIdleTimeout time.Duration `yaml:"index_header_lazy_loading_idle_timeout"` + IndexHeaderLazyLoadingEnabled bool `yaml:"index_header_lazy_loading_enabled" category:"advanced"` + IndexHeaderLazyLoadingIdleTimeout time.Duration `yaml:"index_header_lazy_loading_idle_timeout" category:"advanced"` // Controls the partitioner, used to aggregate multiple GET object API requests. PartitionerMaxGapBytes uint64 `yaml:"partitioner_max_gap_bytes" category:"advanced"` @@ -334,9 +334,9 @@ func (cfg *BucketStoreConfig) Validate() error { type BucketIndexConfig struct { Enabled bool `yaml:"enabled"` - UpdateOnErrorInterval time.Duration `yaml:"update_on_error_interval"` - IdleTimeout time.Duration `yaml:"idle_timeout"` - MaxStalePeriod time.Duration `yaml:"max_stale_period"` + UpdateOnErrorInterval time.Duration `yaml:"update_on_error_interval" category:"advanced"` + IdleTimeout time.Duration `yaml:"idle_timeout" category:"advanced"` + MaxStalePeriod time.Duration `yaml:"max_stale_period" category:"advanced"` } func (cfg *BucketIndexConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { From f86fc3561f76135074829978e6a413b9481dc63f Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Wed, 2 Feb 2022 10:38:31 +0100 Subject: [PATCH 075/168] Renamed distributorConfig jsonnet config to ingesterRingClientConfig (#997) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 1 + operations/mimir/config.libsonnet | 5 +++-- operations/mimir/distributor.libsonnet | 2 +- operations/mimir/ingester.libsonnet | 2 +- operations/mimir/querier.libsonnet | 2 +- operations/mimir/ruler.libsonnet | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fdd8476c93a..ebb00f27a3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -612,6 +612,7 @@ * [CHANGE] Enabled attributes in-memory cache in store-gateway. #905 * [CHANGE] Configured store-gateway to not load blocks containing samples more recent than 10h (because such samples are queried from ingesters). #905 * [CHANGE] Dynamically compute `-compactor.deletion-delay` based on other settings, in order to reduce the deletion delay as much as possible and lower the number of live blocks in the storage. #907 +* [CHANGE] The config field `distributorConfig` has been renamed to `ingesterRingClientConfig`. #997 * [FEATURE] Added query sharding support. It can be enabled setting `cortex_query_sharding_enabled: true` in the `_config` object. #653 * [FEATURE] Added shuffle-sharding support. It can be enabled and configured using the following config: #902 ``` diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index 5b802667537..ef597fffe16 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -147,8 +147,9 @@ 'ring.prefix': '', }, - // Some distributor config is shared with the querier. - distributorConfig: { + // The ingester ring client config that should be shared across all Mimir services + // watching the ingester ring. + ingesterRingClientConfig: { 'distributor.replication-factor': $._config.replication_factor, 'distributor.health-check-ingesters': true, 'ring.heartbeat-timeout': '10m', diff --git a/operations/mimir/distributor.libsonnet b/operations/mimir/distributor.libsonnet index d1a6ebd59bb..cb9cf8969c8 100644 --- a/operations/mimir/distributor.libsonnet +++ b/operations/mimir/distributor.libsonnet @@ -5,7 +5,7 @@ distributor_args:: $._config.grpcConfig + $._config.ringConfig + - $._config.distributorConfig + + $._config.ingesterRingClientConfig + $._config.distributorLimitsConfig + { target: 'distributor', diff --git a/operations/mimir/ingester.libsonnet b/operations/mimir/ingester.libsonnet index d379b1d7265..fea3f190248 100644 --- a/operations/mimir/ingester.libsonnet +++ b/operations/mimir/ingester.libsonnet @@ -10,7 +10,7 @@ $._config.ringConfig + $._config.storageConfig + $._config.blocksStorageConfig + - $._config.distributorConfig + // This adds the distributor ring flags to the ingester. + $._config.ingesterRingClientConfig + $._config.ingesterLimitsConfig + { target: 'ingester', diff --git a/operations/mimir/querier.libsonnet b/operations/mimir/querier.libsonnet index 5cd1a9b5d30..7c5d545617e 100644 --- a/operations/mimir/querier.libsonnet +++ b/operations/mimir/querier.libsonnet @@ -8,7 +8,7 @@ $._config.blocksStorageConfig + $._config.queryConfig + $._config.queryEngineConfig + - $._config.distributorConfig + + $._config.ingesterRingClientConfig + $._config.queryBlocksStorageConfig + $.blocks_metadata_caching_config + $.bucket_index_config diff --git a/operations/mimir/ruler.libsonnet b/operations/mimir/ruler.libsonnet index d0feadd3932..f3da02b3542 100644 --- a/operations/mimir/ruler.libsonnet +++ b/operations/mimir/ruler.libsonnet @@ -8,7 +8,7 @@ $._config.blocksStorageConfig + $._config.queryConfig + $._config.queryEngineConfig + - $._config.distributorConfig + + $._config.ingesterRingClientConfig + $._config.rulerClientConfig + $._config.rulerLimitsConfig + $._config.queryBlocksStorageConfig + From 8cc74682de9e6e7dda15a4352a4410a9426759c4 Mon Sep 17 00:00:00 2001 From: George Krajcsovits Date: Wed, 2 Feb 2022 10:42:16 +0100 Subject: [PATCH 076/168] queier_test: be more specific with assertion (#998) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The test doesn't verify the expected error, just that there is an error. This fix will make it more easier to understand an upcoming change and also not hide if we're failing for an unintended reason. Signed-off-by: György Krajcsovits --- integration/querier_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/integration/querier_test.go b/integration/querier_test.go index d7378a5485a..f7c10ef7564 100644 --- a/integration/querier_test.go +++ b/integration/querier_test.go @@ -16,6 +16,7 @@ import ( "github.com/grafana/e2e" e2ecache "github.com/grafana/e2e/cache" e2edb "github.com/grafana/e2e/db" + promv1 "github.com/prometheus/client_golang/api/prometheus/v1" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/prompb" @@ -792,6 +793,7 @@ func TestQuerierWithBlocksStorageOnMissingBlocksFromStorage(t *testing.T) { _, err = c.Query("series_1", series1Timestamp) require.Error(t, err) assert.Contains(t, err.Error(), "500") + assert.Contains(t, err.(*promv1.Error).Detail, "The specified key does not exist") } func TestQueryLimitsWithBlocksStorageRunningInMicroServices(t *testing.T) { From b8f67f41ef075e4d3e4919d1a835cb26ab3b78ab Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Wed, 2 Feb 2022 12:51:09 +0000 Subject: [PATCH 077/168] Docs: Provide OS and architecture specific binary download instructions (#980) * Provide OS and architecture specific binary download instructions Use valid Linux/AMD64 OS/architecture combination in terminal example Signed-off-by: Jack Baldry * Add download link and ensure consistency resulting binary name Signed-off-by: Jack Baldry Co-authored-by: Marco Pracucci Co-authored-by: Marco Pracucci --- docs/sources/getting-started/_index.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/sources/getting-started/_index.md b/docs/sources/getting-started/_index.md index d0985eb3beb..fca4eb50882 100644 --- a/docs/sources/getting-started/_index.md +++ b/docs/sources/getting-started/_index.md @@ -31,8 +31,11 @@ docker pull "grafana/mimir:latest" - Using a local binary: +Download the appropriate [release asset](https://github.com/grafana/mimir/releases/latest) for your operating system and architecture and make it executable. +For Linux with the AMD64 architecture: + ```bash -curl -LO https://github.com/grafana/mimir/releases/latest/download/mimir +curl -Lo mimir https://github.com/grafana/mimir/releases/latest/download/mimir-linux-amd64 chmod +x mimir ``` From 80d849a588d67b8efc9a3fad891a9e26be443f81 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Wed, 2 Feb 2022 14:10:35 +0100 Subject: [PATCH 078/168] Mark querier tenant federation as stable (#1002) Signed-off-by: Marco Pracucci --- CHANGELOG.md | 3 ++- cmd/mimir/help-all.txt.tmpl | 2 +- cmd/mimir/help.txt.tmpl | 2 ++ docs/sources/configuration/config-file-reference.md | 6 +++--- docs/sources/configuration/v1-guarantees.md | 1 - pkg/mimir/mimir.go | 1 - pkg/querier/tenantfederation/tenant_federation.go | 2 +- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ebb00f27a3c..5ee6cedf1de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -300,7 +300,7 @@ * [FEATURE] Mimir: Added "Activity tracker" feature which can log ongoing activities from previous Mimir run in case of the crash. It is enabled by default and controlled by the `-activity-tracker.filepath` flag. It can be disabled by setting this path to an empty string. Currently, the Store-gateway, Ruler, Querier, and Query-frontend components uses this feature. #631 #782 #822 * [FEATURE] Mimir: Divide configuration parameters into categories "basic", "advanced", and "experimental". Only flags in the basic category are shown when invoking `-help`, whereas `-help-all` will include flags in all categories (basic, advanced, experimental). #840 * [FEATURE] Store-gateway: Added `/store-gateway/tenants` and `/store-gateway/tenant/{tenant}/blocks` endpoints that provide functionality that was provided by `tools/listblocks`. #911 -* [FEATURE] The following features have been moved from experimental to stable: #913 +* [FEATURE] The following features have been moved from experimental to stable: #913 #1002 * Alertmanager API * Alertmanager receiver firewall * Alertmanager sharding @@ -314,6 +314,7 @@ * OpenStack Swift storage support * Query-frontend: query stats tracking * Query-scheduler + * Querier: tenant federation * Ruler API * S3 Server Side Encryption (SSE) using KMS * TLS configuration for gRPC, HTTP and etcd clients diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 6771855d5d7..5db0ae4fc81 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -1624,7 +1624,7 @@ Usage of ./cmd/mimir/mimir: -target value Comma-separated list of modules to load. The alias 'all' can be used in the list to load a number of core modules and will enable single-binary mode. Use '-modules' command line flag to get a list of available modules, and to see which modules are included in 'all'. (default all) -tenant-federation.enabled - [experimental] If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header. + If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header. -validation.create-grace-period value Duration which table will be created/deleted before/after it's needed; we won't accept sample from before this time. (default 10m) -validation.enforce-metadata-metric-name diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 1a22a6762fc..bcbcc5a0cff 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -863,6 +863,8 @@ Usage of ./cmd/mimir/mimir: Limit the query time range (end - start time). This limit is enforced in the query-frontend (on the received query), in the querier (on the query possibly split by the query-frontend) and ruler. 0 to disable. -target value Comma-separated list of modules to load. The alias 'all' can be used in the list to load a number of core modules and will enable single-binary mode. Use '-modules' command line flag to get a list of available modules, and to see which modules are included in 'all'. (default all) + -tenant-federation.enabled + If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header. -validation.create-grace-period value Duration which table will be created/deleted before/after it's needed; we won't accept sample from before this time. (default 10m) -validation.enforce-metadata-metric-name diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 1563080b258..436f257c816 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -129,9 +129,9 @@ api: [store_gateway: ] tenant_federation: - # [experimental] If enabled on all services, queries can be federated across - # multiple tenants. The tenant IDs involved need to be specified separated by - # a '|' character in the 'X-Scope-OrgID' header. + # If enabled on all services, queries can be federated across multiple + # tenants. The tenant IDs involved need to be specified separated by a '|' + # character in the 'X-Scope-OrgID' header. # CLI flag: -tenant-federation.enabled [enabled: | default = false] diff --git a/docs/sources/configuration/v1-guarantees.md b/docs/sources/configuration/v1-guarantees.md index 5f6dea38fed..1509fb92a96 100644 --- a/docs/sources/configuration/v1-guarantees.md +++ b/docs/sources/configuration/v1-guarantees.md @@ -33,7 +33,6 @@ Grafana Mimir is an actively developed project and we want to encourage the intr Currently experimental features are: -- Querier: tenant federation. - Ruler: tenant federation. - Distributor: metrics relabeling. - Purger: tenant deletion API. diff --git a/pkg/mimir/mimir.go b/pkg/mimir/mimir.go index 284ee701048..71200798664 100644 --- a/pkg/mimir/mimir.go +++ b/pkg/mimir/mimir.go @@ -309,7 +309,6 @@ func New(cfg Config) (*Mimir, error) { // Swap out the default resolver to support multiple tenant IDs separated by a '|' if cfg.TenantFederation.Enabled { - util_log.WarnExperimentalUse("tenant-federation") tenant.WithDefaultResolver(tenant.NewMultiResolver()) if cfg.Ruler.TenantFederation.Enabled { diff --git a/pkg/querier/tenantfederation/tenant_federation.go b/pkg/querier/tenantfederation/tenant_federation.go index c35c4856577..018c696eb95 100644 --- a/pkg/querier/tenantfederation/tenant_federation.go +++ b/pkg/querier/tenantfederation/tenant_federation.go @@ -11,7 +11,7 @@ import ( type Config struct { // Enabled switches on support for multi tenant query federation - Enabled bool `yaml:"enabled" category:"experimental"` + Enabled bool `yaml:"enabled"` } func (cfg *Config) RegisterFlags(f *flag.FlagSet) { From 431065b6c61a910648dac0faf93a28b6a9f5eb1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Wed, 2 Feb 2022 15:55:16 +0100 Subject: [PATCH 079/168] Mention activity tracker in playbooks. (#1005) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Mention activity tracker in playbooks. Signed-off-by: Peter Štibraný --- operations/mimir-mixin/docs/playbooks.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/operations/mimir-mixin/docs/playbooks.md b/operations/mimir-mixin/docs/playbooks.md index 17996e1d302..f31048a0c70 100644 --- a/operations/mimir-mixin/docs/playbooks.md +++ b/operations/mimir-mixin/docs/playbooks.md @@ -222,6 +222,7 @@ How to **investigate**: - The panels in the dashboard are vertically sorted by the network path (eg. on the write path: cortex-gw -> distributor -> ingester) - If the failing service is going OOM (`OOMKilled`): scale up or increase the memory - If the failing service is crashing / panicking: look for the stack trace in the logs and investigate from there + - If crashing service is query-frontend, querier or store-gateway, and you have "activity tracker" feature enabled, look for `found unfinished activities from previous run` message and subsequent `activity` messages in the log file to see which queries caused the crash. ### MimirIngesterUnhealthy @@ -547,6 +548,7 @@ How to **investigate**: - Are queriers in a crash loop (eg. OOMKilled)? - `OOMKilled`: temporarily increase queriers memory request/limit - `panic`: look for the stack trace in the logs and investigate from there + - if queriers run with activity tracker enabled, they may log `unfinished activities` message on startup with queries that possibly caused the crash. - Is QPS increased? - Scale up queriers to satisfy the increased workload - Is query latency increased? From af1f249826b822701dced3e78fe9f459d42ae7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel=20Ortu=C3=B1o?= Date: Wed, 2 Feb 2022 16:15:08 +0100 Subject: [PATCH 080/168] Change memcached client default timeout setting (#1000) * Change memcached client default timeout setting * updated CHANGELOG.md * make linter happy * updated CHANGELOG.md --- CHANGELOG.md | 7 ++++++- cmd/mimir/help-all.txt.tmpl | 8 ++++---- cmd/mimir/help.txt.tmpl | 8 ++++---- docs/sources/configuration/config-file-reference.md | 2 +- operations/mimir-tests/test-defaults-generated.yaml | 4 ---- .../test-disable-chunk-streaming-generated.yaml | 5 ----- operations/mimir-tests/test-query-sharding-generated.yaml | 5 ----- .../mimir-tests/test-shuffle-sharding-generated.yaml | 5 ----- operations/mimir-tests/test-storage-azure-generated.yaml | 5 ----- operations/mimir-tests/test-storage-gcs-generated.yaml | 5 ----- operations/mimir-tests/test-storage-s3-generated.yaml | 5 ----- operations/mimir/config.libsonnet | 3 --- pkg/cache/memcache_config.go | 2 +- 13 files changed, 16 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ee6cedf1de..3d513085d8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -226,7 +226,7 @@ * [CHANGE] Ruler: removed `-ruler.enable-sharding` option, and change default value of `-ruler.ring.store` to `memberlist`. #943 * [CHANGE] Ruler: `-ruler.alertmanager-use-v2` now defaults to `true`. #954 * [CHANGE] Compactor: Removed `-compactor.sharding-enabled` option. Sharding in compactor is now always enabled. Default value of `-compactor.ring.store` has changed from `consul` to `memberlist`. Default value of `-compactor.ring.wait-stability-min-duration` is now 0, which disables the feature. #956 -* [CHANGE] Changed default settings for memcached clients: #959 +* [CHANGE] Changed default settings for memcached clients: #959 #1000 * The default value for the following config options has changed from `10000` to `25000`: * `-blocks-storage.bucket-store.chunks-cache.memcached.max-async-buffer-size` * `-blocks-storage.bucket-store.index-cache.memcached.max-async-buffer-size` @@ -242,6 +242,11 @@ * `-blocks-storage.bucket-store.index-cache.memcached.max-idle-connections` * `-blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections` * `-frontend.results-cache.memcached.max-idle-connections` + * The default value for the following config options has changed from `100ms` to `200ms`: + * `-blocks-storage.bucket-store.metadata-cache.memcached.timeout` + * `-blocks-storage.bucket-store.index-cache.memcached.timeout` + * `-blocks-storage.bucket-store.chunks-cache.memcached.timeout` + * `-frontend.results-cache.memcached.timeout` * [CHANGE] Querier: removed `-querier.worker-match-max-concurrent` and `-querier.worker-parallelism` CLI flags (and their respective YAML config options). Mimir now behaves like if `-querier.worker-match-max-concurrent` is always enabled and you should configure the max concurrency per querier process using `-querier.max-concurrent` instead. #958 * [CHANGE] Distributor: change default value of `-distributor.instance-limits.max-inflight-push-requests` to `2000`. #964 * [CHANGE] Distributor: change default value of `-distributor.remote-timeout` from `2s` to `20s`. #970 diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 5db0ae4fc81..51c66f5f5d7 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -284,7 +284,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.chunks-cache.memcached.timeout duration - The socket read/write timeout. (default 100ms) + The socket read/write timeout. (default 200ms) -blocks-storage.bucket-store.chunks-cache.subrange-size int Size of each subrange that bucket object is split into for better caching. (default 16000) -blocks-storage.bucket-store.chunks-cache.subrange-ttl duration @@ -314,7 +314,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.index-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.index-cache.memcached.timeout duration - The socket read/write timeout. (default 100ms) + The socket read/write timeout. (default 200ms) -blocks-storage.bucket-store.index-header-lazy-loading-enabled If enabled, store-gateway will lazy load an index-header only once required by a query. (default true) -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout duration @@ -350,7 +350,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -blocks-storage.bucket-store.metadata-cache.memcached.timeout duration - The socket read/write timeout. (default 100ms) + The socket read/write timeout. (default 200ms) -blocks-storage.bucket-store.metadata-cache.metafile-attributes-ttl duration How long to cache attributes of the block metafile. (default 168h0m0s) -blocks-storage.bucket-store.metadata-cache.metafile-content-ttl duration @@ -880,7 +880,7 @@ Usage of ./cmd/mimir/mimir: -frontend.results-cache.memcached.max-item-size int The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced. (default 1048576) -frontend.results-cache.memcached.timeout duration - The socket read/write timeout. (default 100ms) + The socket read/write timeout. (default 200ms) -frontend.scheduler-address string DNS hostname used for finding query-schedulers. -frontend.scheduler-dns-lookup-period duration diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index bcbcc5a0cff..16aeec13f5d 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -122,7 +122,7 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.chunks-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -blocks-storage.bucket-store.chunks-cache.memcached.timeout duration - The socket read/write timeout. (default 100ms) + The socket read/write timeout. (default 200ms) -blocks-storage.bucket-store.index-cache.backend string The index cache backend type. Supported values: inmemory, memcached. (default "inmemory") -blocks-storage.bucket-store.index-cache.inmemory.max-size-bytes uint @@ -130,13 +130,13 @@ Usage of ./cmd/mimir/mimir: -blocks-storage.bucket-store.index-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -blocks-storage.bucket-store.index-cache.memcached.timeout duration - The socket read/write timeout. (default 100ms) + The socket read/write timeout. (default 200ms) -blocks-storage.bucket-store.metadata-cache.backend string Backend for metadata cache, if not empty. Supported values: memcached. -blocks-storage.bucket-store.metadata-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -blocks-storage.bucket-store.metadata-cache.memcached.timeout duration - The socket read/write timeout. (default 100ms) + The socket read/write timeout. (default 200ms) -blocks-storage.bucket-store.sync-dir string Directory to store synchronized TSDB index headers. (default "tsdb-sync") -blocks-storage.filesystem.dir string @@ -354,7 +354,7 @@ Usage of ./cmd/mimir/mimir: -frontend.results-cache.memcached.addresses string Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that). -frontend.results-cache.memcached.timeout duration - The socket read/write timeout. (default 100ms) + The socket read/write timeout. (default 200ms) -frontend.scheduler-address string DNS hostname used for finding query-schedulers. -frontend.split-queries-by-interval duration diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 436f257c816..93644cf5fd9 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -3541,7 +3541,7 @@ The `memcached_config` configures the Memcached-based caching backend. The suppo # The socket read/write timeout. # CLI flag: -.memcached.timeout -[timeout: | default = 100ms] +[timeout: | default = 200ms] # [advanced] The maximum number of idle connections that will be maintained per # address. diff --git a/operations/mimir-tests/test-defaults-generated.yaml b/operations/mimir-tests/test-defaults-generated.yaml index bbef5571753..3edb8b92dd4 100644 --- a/operations/mimir-tests/test-defaults-generated.yaml +++ b/operations/mimir-tests/test-defaults-generated.yaml @@ -748,7 +748,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.gcs.bucket-name=blocks-bucket - -consul.hostname=consul.default.svc.cluster.local:8500 @@ -1314,7 +1313,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 @@ -1322,7 +1320,6 @@ spec: - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 - - -blocks-storage.bucket-store.index-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.index-header-lazy-loading-enabled=true - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout=60m - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 @@ -1332,7 +1329,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.gcs.bucket-name=blocks-bucket - -runtime-config.file=/etc/mimir/overrides.yaml diff --git a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml index aa8f3aaf63d..f85676b273d 100644 --- a/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml +++ b/operations/mimir-tests/test-disable-chunk-streaming-generated.yaml @@ -825,7 +825,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket @@ -1057,7 +1056,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket @@ -1639,7 +1637,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 @@ -1647,7 +1644,6 @@ spec: - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 - - -blocks-storage.bucket-store.index-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.index-header-lazy-loading-enabled=true - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout=60m - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 @@ -1657,7 +1653,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket diff --git a/operations/mimir-tests/test-query-sharding-generated.yaml b/operations/mimir-tests/test-query-sharding-generated.yaml index d2e7110bf26..3c71189b311 100644 --- a/operations/mimir-tests/test-query-sharding-generated.yaml +++ b/operations/mimir-tests/test-query-sharding-generated.yaml @@ -824,7 +824,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket @@ -1060,7 +1059,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket @@ -1642,7 +1640,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 @@ -1650,7 +1647,6 @@ spec: - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 - - -blocks-storage.bucket-store.index-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.index-header-lazy-loading-enabled=true - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout=60m - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 @@ -1660,7 +1656,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket diff --git a/operations/mimir-tests/test-shuffle-sharding-generated.yaml b/operations/mimir-tests/test-shuffle-sharding-generated.yaml index 3620125b47a..c6e931f444b 100644 --- a/operations/mimir-tests/test-shuffle-sharding-generated.yaml +++ b/operations/mimir-tests/test-shuffle-sharding-generated.yaml @@ -825,7 +825,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket @@ -1062,7 +1061,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket @@ -1649,7 +1647,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 @@ -1657,7 +1654,6 @@ spec: - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 - - -blocks-storage.bucket-store.index-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.index-header-lazy-loading-enabled=true - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout=60m - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 @@ -1667,7 +1663,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket diff --git a/operations/mimir-tests/test-storage-azure-generated.yaml b/operations/mimir-tests/test-storage-azure-generated.yaml index 70408e4f18e..84a4f8e5524 100644 --- a/operations/mimir-tests/test-storage-azure-generated.yaml +++ b/operations/mimir-tests/test-storage-azure-generated.yaml @@ -827,7 +827,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -consul.hostname=consul.default.svc.cluster.local:8500 @@ -1061,7 +1060,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -consul.hostname=consul.default.svc.cluster.local:8500 @@ -1653,7 +1651,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 @@ -1661,7 +1658,6 @@ spec: - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 - - -blocks-storage.bucket-store.index-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.index-header-lazy-loading-enabled=true - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout=60m - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 @@ -1671,7 +1667,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -runtime-config.file=/etc/mimir/overrides.yaml diff --git a/operations/mimir-tests/test-storage-gcs-generated.yaml b/operations/mimir-tests/test-storage-gcs-generated.yaml index 42ef58d0232..522837bc260 100644 --- a/operations/mimir-tests/test-storage-gcs-generated.yaml +++ b/operations/mimir-tests/test-storage-gcs-generated.yaml @@ -824,7 +824,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket @@ -1056,7 +1055,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket @@ -1638,7 +1636,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 @@ -1646,7 +1643,6 @@ spec: - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 - - -blocks-storage.bucket-store.index-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.index-header-lazy-loading-enabled=true - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout=60m - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 @@ -1656,7 +1652,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.gcs.bucket-name=blocks-bucket diff --git a/operations/mimir-tests/test-storage-s3-generated.yaml b/operations/mimir-tests/test-storage-s3-generated.yaml index 9bf79ed084a..6ad2a732c47 100644 --- a/operations/mimir-tests/test-storage-s3-generated.yaml +++ b/operations/mimir-tests/test-storage-s3-generated.yaml @@ -824,7 +824,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.s3.bucket-name=blocks-bucket @@ -1057,7 +1056,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.s3.bucket-name=blocks-bucket @@ -1645,7 +1643,6 @@ spec: - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.chunks-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.ignore-blocks-within=10h - -blocks-storage.bucket-store.index-cache.backend=memcached - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 @@ -1653,7 +1650,6 @@ spec: - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 - - -blocks-storage.bucket-store.index-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.index-header-lazy-loading-enabled=true - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout=60m - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 @@ -1663,7 +1659,6 @@ spec: - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 - - -blocks-storage.bucket-store.metadata-cache.memcached.timeout=200ms - -blocks-storage.bucket-store.sync-dir=/data/tsdb - -blocks-storage.bucket-store.sync-interval=15m - -blocks-storage.s3.bucket-name=blocks-bucket diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index ef597fffe16..146c89143fe 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -406,7 +406,6 @@ if $._config.memcached_index_queries_enabled then { 'blocks-storage.bucket-store.index-cache.backend': 'memcached', 'blocks-storage.bucket-store.index-cache.memcached.addresses': 'dnssrvnoa+memcached-index-queries.%(namespace)s.svc.cluster.local:11211' % $._config, - 'blocks-storage.bucket-store.index-cache.memcached.timeout': '200ms', 'blocks-storage.bucket-store.index-cache.memcached.max-item-size': $._config.memcached_index_queries_max_item_size_mb * 1024 * 1024, 'blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency': '50', } else {} @@ -414,7 +413,6 @@ if $._config.memcached_chunks_enabled then { 'blocks-storage.bucket-store.chunks-cache.backend': 'memcached', 'blocks-storage.bucket-store.chunks-cache.memcached.addresses': 'dnssrvnoa+memcached.%(namespace)s.svc.cluster.local:11211' % $._config, - 'blocks-storage.bucket-store.chunks-cache.memcached.timeout': '200ms', 'blocks-storage.bucket-store.chunks-cache.memcached.max-item-size': $._config.memcached_chunks_max_item_size_mb * 1024 * 1024, 'blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency': '50', } else {} @@ -423,7 +421,6 @@ blocks_metadata_caching_config:: if $._config.memcached_metadata_enabled then { 'blocks-storage.bucket-store.metadata-cache.backend': 'memcached', 'blocks-storage.bucket-store.metadata-cache.memcached.addresses': 'dnssrvnoa+memcached-metadata.%(namespace)s.svc.cluster.local:11211' % $._config, - 'blocks-storage.bucket-store.metadata-cache.memcached.timeout': '200ms', 'blocks-storage.bucket-store.metadata-cache.memcached.max-item-size': $._config.memcached_metadata_max_item_size_mb * 1024 * 1024, 'blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency': '50', } else {}, diff --git a/pkg/cache/memcache_config.go b/pkg/cache/memcache_config.go index 3b922a369fa..893b2a90b58 100644 --- a/pkg/cache/memcache_config.go +++ b/pkg/cache/memcache_config.go @@ -32,7 +32,7 @@ type MemcachedConfig struct { func (cfg *MemcachedConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { f.StringVar(&cfg.Addresses, prefix+"addresses", "", "Comma separated list of memcached addresses. Supported prefixes are: dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query, dnssrvnoa+ (looked up as a SRV query, with no A/AAAA lookup made after that).") - f.DurationVar(&cfg.Timeout, prefix+"timeout", 100*time.Millisecond, "The socket read/write timeout.") + f.DurationVar(&cfg.Timeout, prefix+"timeout", 200*time.Millisecond, "The socket read/write timeout.") f.IntVar(&cfg.MaxIdleConnections, prefix+"max-idle-connections", 100, "The maximum number of idle connections that will be maintained per address.") f.IntVar(&cfg.MaxAsyncConcurrency, prefix+"max-async-concurrency", 50, "The maximum number of concurrent asynchronous operations can occur.") f.IntVar(&cfg.MaxAsyncBufferSize, prefix+"max-async-buffer-size", 25000, "The maximum number of enqueued asynchronous operations allowed.") From f4a866ebebddf18122d1e4af9ad9a16d9c467375 Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Thu, 3 Feb 2022 09:00:48 +0000 Subject: [PATCH 081/168] Re-order documentation for an "Operating Grafana Mimir" section (#1010) * Re-order documentation for an "Operating Grafana Mimir" section Signed-off-by: Jack Baldry * Fix typo in monitorin. * Re-add scalable-query-frontend.md. Co-authored-by: Ursula Kallio --- Makefile | 4 +- docs/sources/operations/_index.md | 12 +- .../configure-ha-deduplication.md} | 7 +- .../configure-shuffle-sharding.md} | 9 +- .../configure-tracing.md} | 9 +- .../_index.md | 10 +- .../dashboards-overview.md | 0 .../install-dashboards-and-alerts.md | 0 .../requirements.md | 0 .../encrypt-data-at-rest.md} | 9 +- .../encrypt-data-at-rest.template} | 9 +- .../plan-capacity.md} | 9 +- .../secure-communications-with-tls.md} | 9 +- .../proposals/scalable-query-frontend.md | 284 +++--------------- .../sources/{operations => }/query-auditor.md | 0 docs/sources/{operations => }/query-tee.md | 0 ...requests-mirroring-to-secondary-cluster.md | 2 +- 17 files changed, 84 insertions(+), 289 deletions(-) rename docs/sources/{guides/ha-pair-handling.md => operations/configure-ha-deduplication.md} (96%) rename docs/sources/{guides/shuffle-sharding.md => operations/configure-shuffle-sharding.md} (98%) rename docs/sources/{guides/tracing.md => operations/configure-tracing.md} (90%) rename docs/sources/operations/{observability => deploy-monitoring-mixin}/_index.md (88%) rename docs/sources/operations/{observability => deploy-monitoring-mixin}/dashboards-overview.md (100%) rename docs/sources/operations/{observability => deploy-monitoring-mixin}/install-dashboards-and-alerts.md (100%) rename docs/sources/operations/{observability => deploy-monitoring-mixin}/requirements.md (100%) rename docs/sources/{guides/encryption-at-rest.md => operations/encrypt-data-at-rest.md} (95%) rename docs/sources/{guides/encryption-at-rest.template => operations/encrypt-data-at-rest.template} (94%) rename docs/sources/{guides/capacity-planning.md => operations/plan-capacity.md} (96%) rename docs/sources/{guides/tls.md => operations/secure-communications-with-tls.md} (95%) rename docs/sources/{operations => }/query-auditor.md (100%) rename docs/sources/{operations => }/query-tee.md (100%) rename docs/sources/{operations => }/requests-mirroring-to-secondary-cluster.md (98%) diff --git a/Makefile b/Makefile index 4689f6eb38c..0a0cc185136 100644 --- a/Makefile +++ b/Makefile @@ -316,9 +316,9 @@ doc: clean-doc go run ./tools/doc-generator ./docs/sources/blocks-storage/compactor.template > ./docs/sources/blocks-storage/compactor.md go run ./tools/doc-generator ./docs/sources/blocks-storage/store-gateway.template > ./docs/sources/blocks-storage/store-gateway.md go run ./tools/doc-generator ./docs/sources/blocks-storage/querier.template > ./docs/sources/blocks-storage/querier.md - go run ./tools/doc-generator ./docs/sources/guides/encryption-at-rest.template > ./docs/sources/guides/encryption-at-rest.md + go run ./tools/doc-generator ./docs/sources/operations/encrypt-data-at-rest.template > ./docs/sources/operations/encrypt-data-at-rest.md embedmd -w docs/sources/configuration/prometheus-frontend.md - embedmd -w docs/sources/operations/requests-mirroring-to-secondary-cluster.md + embedmd -w docs/sources/requests-mirroring-to-secondary-cluster.md embedmd -w docs/sources/guides/overrides-exporter.md embedmd -w docs/sources/getting-started/_index.md embedmd -w operations/mimir/README.md diff --git a/docs/sources/operations/_index.md b/docs/sources/operations/_index.md index 468cc64cd94..37c464f810a 100644 --- a/docs/sources/operations/_index.md +++ b/docs/sources/operations/_index.md @@ -1,7 +1,9 @@ --- -title: "Operating Cortex" -linkTitle: "Operations" -no_section_index_title: true -weight: 8 -menu: +title: "Operating Grafana Mimir" +description: "Collection of tasks pertaining to the ongoing operation of Grafana Mimir." +weight: 2000 --- + +# Operating Grafana Mimir + +`{{< section >}}` diff --git a/docs/sources/guides/ha-pair-handling.md b/docs/sources/operations/configure-ha-deduplication.md similarity index 96% rename from docs/sources/guides/ha-pair-handling.md rename to docs/sources/operations/configure-ha-deduplication.md index eb0a8055255..190d86cd691 100644 --- a/docs/sources/guides/ha-pair-handling.md +++ b/docs/sources/operations/configure-ha-deduplication.md @@ -1,10 +1,11 @@ --- -title: "Config for sending HA Pairs data to Cortex" -linkTitle: "Config for sending HA Pairs data to Cortex" +title: "Configure HA deduplication" +description: "How to configure Grafana Mimir to handle HA Prometheus server deduplication." weight: 10 -slug: ha-pair-handling --- +# Configure HA deduplication + ## Context You can have more than a single Prometheus monitoring and ingesting the same metrics for redundancy. Cortex already does replication for redundancy and it doesn't make sense to ingest the same data twice. So in Cortex, we made sure we can dedupe the data we receive from HA Pairs of Prometheus. We do this via the following: diff --git a/docs/sources/guides/shuffle-sharding.md b/docs/sources/operations/configure-shuffle-sharding.md similarity index 98% rename from docs/sources/guides/shuffle-sharding.md rename to docs/sources/operations/configure-shuffle-sharding.md index 4bee3b3339b..7603c8a099e 100644 --- a/docs/sources/guides/shuffle-sharding.md +++ b/docs/sources/operations/configure-shuffle-sharding.md @@ -1,10 +1,11 @@ --- -title: "Shuffle Sharding" -linkTitle: "Shuffle Sharding" -weight: 10 -slug: shuffle-sharding +title: "Configure shuffle sharding" +description: "How to configure shuffle sharding of tenants data." +weight: 20 --- +# Configure shuffle sharding + Grafana Mimir leverages sharding techniques to horizontally scale both single- and multi-tenant clusters beyond the capacity of a single node. ## Background diff --git a/docs/sources/guides/tracing.md b/docs/sources/operations/configure-tracing.md similarity index 90% rename from docs/sources/guides/tracing.md rename to docs/sources/operations/configure-tracing.md index 34375d7d6c0..e581f6a1c4f 100644 --- a/docs/sources/guides/tracing.md +++ b/docs/sources/operations/configure-tracing.md @@ -1,10 +1,11 @@ --- -title: "Tracing" -linkTitle: "Tracing" -weight: 10 -slug: tracing +title: "Configure Grafana Mimir to send traces" +description: "How to configure Grafana Mimir to send traces to Jaeger." +weight: 30 --- +# Configure Grafana Mimir to send traces + Cortex uses [Jaeger](https://www.jaegertracing.io/) to implement distributed tracing. We have found Jaeger invaluable for troubleshooting the behavior of Cortex in production. diff --git a/docs/sources/operations/observability/_index.md b/docs/sources/operations/deploy-monitoring-mixin/_index.md similarity index 88% rename from docs/sources/operations/observability/_index.md rename to docs/sources/operations/deploy-monitoring-mixin/_index.md index c5af7bcb35f..8bab4c9d3b4 100644 --- a/docs/sources/operations/observability/_index.md +++ b/docs/sources/operations/deploy-monitoring-mixin/_index.md @@ -1,8 +1,10 @@ -+++ -title = "Observability" -+++ +--- +title: "Deploy monitoring mixin" +description: "How to to deploy the Grafana Mimir monitoring mixin." +weight: 10 +--- -# Observability +# Deploy monitoring mixin Grafana Mimir exposes a `/metrics` endpoint returning Prometheus metrics. The endpoint is exposed on the Mimir HTTP server address / port which can be customized through `-server.http-listen-address` and `-server.http-listen-port` CLI flags or their respective YAML [config options]({{< relref "../../configuration/config-file-reference.md" >}}). diff --git a/docs/sources/operations/observability/dashboards-overview.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards-overview.md similarity index 100% rename from docs/sources/operations/observability/dashboards-overview.md rename to docs/sources/operations/deploy-monitoring-mixin/dashboards-overview.md diff --git a/docs/sources/operations/observability/install-dashboards-and-alerts.md b/docs/sources/operations/deploy-monitoring-mixin/install-dashboards-and-alerts.md similarity index 100% rename from docs/sources/operations/observability/install-dashboards-and-alerts.md rename to docs/sources/operations/deploy-monitoring-mixin/install-dashboards-and-alerts.md diff --git a/docs/sources/operations/observability/requirements.md b/docs/sources/operations/deploy-monitoring-mixin/requirements.md similarity index 100% rename from docs/sources/operations/observability/requirements.md rename to docs/sources/operations/deploy-monitoring-mixin/requirements.md diff --git a/docs/sources/guides/encryption-at-rest.md b/docs/sources/operations/encrypt-data-at-rest.md similarity index 95% rename from docs/sources/guides/encryption-at-rest.md rename to docs/sources/operations/encrypt-data-at-rest.md index 0f73b78e6e4..79a3b99a71c 100644 --- a/docs/sources/guides/encryption-at-rest.md +++ b/docs/sources/operations/encrypt-data-at-rest.md @@ -1,10 +1,11 @@ --- -title: "Encryption at Rest" -linkTitle: "Encryption at Rest" -weight: 10 -slug: encryption-at-rest +title: "Encrypt data at rest" +description: "How to configure object storage encryption." +weight: 40 --- +# Encrypt data at rest + Cortex supports data encryption at rest for some storage backends. ## S3 diff --git a/docs/sources/guides/encryption-at-rest.template b/docs/sources/operations/encrypt-data-at-rest.template similarity index 94% rename from docs/sources/guides/encryption-at-rest.template rename to docs/sources/operations/encrypt-data-at-rest.template index 48396c5698a..f4a8d47314e 100644 --- a/docs/sources/guides/encryption-at-rest.template +++ b/docs/sources/operations/encrypt-data-at-rest.template @@ -1,10 +1,11 @@ --- -title: "Encryption at Rest" -linkTitle: "Encryption at Rest" -weight: 10 -slug: encryption-at-rest +title: "Encrypt data at rest" +description: "How to configure object storage encryption." +weight: 40 --- +# Encrypt data at rest + Cortex supports data encryption at rest for some storage backends. ## S3 diff --git a/docs/sources/guides/capacity-planning.md b/docs/sources/operations/plan-capacity.md similarity index 96% rename from docs/sources/guides/capacity-planning.md rename to docs/sources/operations/plan-capacity.md index dc4f9f764d9..c0d58707327 100644 --- a/docs/sources/guides/capacity-planning.md +++ b/docs/sources/operations/plan-capacity.md @@ -1,10 +1,11 @@ --- -title: "Capacity Planning" -linkTitle: "Capacity Planning" -weight: 10 -slug: capacity-planning +title: "Plan capacity" +description: "How to plan the resources required for a Grafana Mimir deployment." +weight: 50 --- +# Plan capacity + You will want to estimate how many nodes are required, how many of each component to run, and how much storage space will be required. In practice, these will vary greatly depending on the metrics being diff --git a/docs/sources/guides/tls.md b/docs/sources/operations/secure-communications-with-tls.md similarity index 95% rename from docs/sources/guides/tls.md rename to docs/sources/operations/secure-communications-with-tls.md index 1b5af10f735..cfb184e5e4c 100644 --- a/docs/sources/guides/tls.md +++ b/docs/sources/operations/secure-communications-with-tls.md @@ -1,10 +1,11 @@ --- -title: "Securing communication between Cortex components with TLS" -linkTitle: "Securing communication between Cortex components with TLS" -weight: 10 -slug: tls +title: "Secure communications with TLS" +description: "How to configure TLS between Grafana mimir microservices." +weight: 60 --- +# Secure communications with TLS + Cortex is a distributed system with significant traffic between its services. To allow for secure communication, Cortex supports TLS between all its components. This guide describes the process of setting up TLS. diff --git a/docs/sources/proposals/scalable-query-frontend.md b/docs/sources/proposals/scalable-query-frontend.md index 108e4257f9d..cd2a791e532 100644 --- a/docs/sources/proposals/scalable-query-frontend.md +++ b/docs/sources/proposals/scalable-query-frontend.md @@ -1,266 +1,50 @@ --- -title: "Scalable Query Frontend" -linkTitle: "Scalable Query Frontend" -weight: 1 -slug: scalable-query frontend +title: "Scaling the Query Frontend" +linkTitle: "Scaling the Query Frontend" +weight: 60 +slug: scaling-query-frontend --- -- Author: [Joe Elliott](https://github.com/joe-elliott) -- Date: April 2020 -- Status: Proposed +Historically scaling the Cortex query frontend has [posed some challenges](../proposals/scalable-query-frontend.md). +This document aims to detail how to use some added configuration parameters to correctly scale the frontend. +Note that these instructions apply in both the HA single binary scenario or microservices mode. -## Overview +## Scaling the Query Frontend -This document aims to describe the [role](#query-frontend-role) that the Cortex Query Frontend plays in running multitenant Cortex at scale. It also describes the [challenges](#challenges-and-proposals) of horizontally scaling the query frontend component and includes several recommendations and options for creating a reliably scalable query-frontend. Finally, we conclude with a discussion of the overall philosophy of the changes and propose an [alternative](#alternative). +For every query frontend the querier adds a [configurable number of concurrent workers](https://github.com/cortexproject/cortex/blob/1797adfed2979f6096c3305b0dc9162c1ec0c046/pkg/querier/worker/worker.go#L212) +which are each capable of executing a query. +Each worker is connected to a single query frontend instance, therefore scaling up the query frontend impacts the amount of work each individual querier is attempting to do at any given time. -For the original design behind the query frontend, you should read [Cortex Query Optimisations design doc from 2018-07](https://docs.google.com/document/d/1lsvSkv0tiAMPQv-V8vI2LZ8f4i9JuTRsuPI_i-XcAqY). +Scaling up may cause a querier to attempt more work than they are configured for due to restrictions such as memory and cpu limits. +Additionally, the PromQL engine itself is limited in the number of queries it can do as configured by the `-querier.max-concurrent` parameter. +Attempting more queries concurrently than this value causes the queries to queue up in the querier itself. -## Reasoning +For similar reasons scaling down the query frontend may cause a querier to not use its allocated memory and cpu effectively. +This will lower effective resource utilization. +Also, because individual queriers will be doing less work, this may cause increased queueing in the query frontends. -Query frontend scaling is becoming increasingly important for two primary reasons. +### Query Scheduler -The Cortex team is working toward a scalable single binary solution. Recently the query-frontend was [added](https://github.com/cortexproject/cortex/pull/2437) to the Cortex single binary mode and, therefore, needs to seamlessly scale. Technically, nothing immediately breaks when scaling the query-frontend, but there are a number of concerns detailed in [Challenges And Proposals](#challenges-and-proposals). +Query scheduler is a service that moves the in-memory queue from query frontend to a separate component. +This makes scaling query frontend easier, as it allows running multiple query frontends without increasing the number of queues. -As the query-frontend continues to [support additional features](https://github.com/cortexproject/cortex/pull/1878) it will start to become a bottleneck of the system. Current wisdom is to run very few query-frontends in order to maximize [Tenancy Fairness](#tenancy-fairness) but as more features are added scaling horizontally will become necessary. +In order to use query scheduler, both query frontend and queriers must be configured with query scheduler address +(using `-frontend.scheduler-address` and `-querier.scheduler-address` options respectively). -## Query Frontend Role +Note that querier will only fetch queries from query frontend or query scheduler, but not both. +`-querier.frontend-address` and `-querier.scheduler-address` options are mutually exclusive, and at most one can be set. -### Load Shedding +When using query scheduler, it is recommended to run two query scheduler instances. +Running only one query scheduler poses a risk of increased query latency when single scheduler crashes or restarts. +Running two query-schedulers should be enough even for large Cortex clusters with an high QPS. -The query frontend maintains a queue per tenant of configurable length (default 100) in which it stores a series of requests from that tenant. If this queue fills up then the frontend will return 429’s thus load shedding the rest of the system. +When using single-binary mode, Cortex defaults to run **without** query scheduler. -This is particularly effective due to the “pull” based model in which queriers pull requests from query frontends. +### DNS Configuration / Readiness -### Query Retries +When a new frontend is first created on scale up it will not immediately have queriers attached to it. +The existing endpoint `/ready` returns HTTP 200 status code only when the query frontend is ready to serve queries. +Make sure to configure this endpoint as a healthcheck in your load balancer, +otherwise a query frontend scale up event might result in failed queries or high latency for a bit while queriers attach. -The query frontend is capable of retrying a query on another querier if the first should fail due to OOM or network issues. - -### Sharding/Parallelization - -The query frontend shards requests by interval and [other factors](https://github.com/cortexproject/cortex/pull/1878) to concurrently run a single query across multiple queriers. - -### Query Alignment/Caching - -Queries are aligned to their own step and then stored/retrieved from cache. - -### Tenancy Fairness - -By maintaining one queue per tenant, a low demand tenant will have the same opportunity to have a query serviced as a high demand tenant. See [Dilutes Tenant Fairness](#dilutes-tenant-fairness) for additional discussion. - -For clarity, tenancy fairness only comes into play when queries are actually being queued in the query frontend. Currently this rarely occurs, but as [query sharding](https://github.com/cortexproject/cortex/pull/1878) becomes more aggressive this may become the norm. - -## Challenges And Proposals - -### Dynamic Querier Concurrency - -#### Challenge - -For every query frontend the querier adds a [configurable number of goroutines](https://github.com/cortexproject/cortex/blob/50f53dba8f8bd5f62c0e85cc5d85684234cd1c1c/pkg/querier/frontend/worker.go#L146) which are each capable of executing a query. Therefore, scaling the query frontend impacts the amount of work each individual querier is attempting to do at any given time. - -Scaling up may cause a querier to attempt more work than they are configured for due to restrictions such as memory and cpu limits. Additionally, the promql engine itself is limited in the number of queries it can do as configured by the `-querier.max-concurrent` parameter. Attempting more queries concurrently than this value causes the queries to queue up in the querier itself. - -For similar reasons scaling down the query frontend may cause a querier to not use its allocated memory and cpu effectively. This will lower effective resource utilization. Also, because individual queriers will be doing less work, this may cause increased queueing in the query frontends. - -#### Proposal - -Currently queriers are configured to have a [max parallelism per query frontend](https://github.com/cortexproject/cortex/blob/50f53dba8f8bd5f62c0e85cc5d85684234cd1c1c/pkg/querier/frontend/worker.go#L146). An additional “total max concurrency” flag should be added. - -Total Max Concurrency would then be evenly divided amongst all available query frontends. This would decouple the amount of work a querier is attempting to do with the number of query frontends that happen to exist at this moment. Consequently this would allow allocated resources (e.g. k8s cpu/memory limits) to remain balanced with the work the querier was attempting as the query frontend is scaled up or down. - -A [PR](https://github.com/cortexproject/cortex/pull/2456) has already been merged to address this. - -### Overwhelming PromQL Concurrency - -#### Challenge - -If #frontends > promql concurrency then the queriers are incapable of devoting even a single worker to each query frontend without risking queueing in the querier. Queuing in the querier is a highly undesirable state and one of the primary reasons the query frontend was originally created. - -#### Proposal - -When #frontends > promql concurrency then each querier will maintain [exactly one connection](https://github.com/cortexproject/cortex/blob/8fb86155a7c7c155b8c4d31b91b267f9631b60ba/pkg/querier/frontend/worker.go#L194-L200) to every frontend. As the query frontend is [currently coded](https://github.com/cortexproject/cortex/blob/8fb86155a7c7c155b8c4d31b91b267f9631b60ba/pkg/querier/frontend/frontend.go#L279-L332) it will attempt to use every open GRPC connection to execute a query in the attached queriers. Therefore, in this situation where #frontends > promql concurrency, the querier is exposing itself to more work then it is actually configured to perform. - -To prevent this we will add “flow control” information to the [ProcessResponse message](https://github.com/cortexproject/cortex/blob/master/pkg/querier/frontend/frontend.proto#L21) that is used to return query results from the querier to the query frontend. In an active system this message is passed multiple times per second from the queriers to the query frontends and would be a reliable way for the frontends to track the state of queriers and balance load. - -There are a lot of options for an exact implementation of this idea. An effective solution should be determined and chosen by modeling a set of alternatives. The details of this would be included in another design doc. A simple implementation would look something like the following: - -Add two new fields to [ProcessResponse](https://github.com/cortexproject/cortex/blob/master/pkg/querier/frontend/frontend.proto#L21): - -```protobuf -message ProcessResponse { - httpgrpc.HTTPResponse httpResponse = 1; - currentConcurrency int = 2; - desiredConcurrency int = 3; -} -``` - -**currentConcurrency** - The current number of queries being executed by the querier. - -**desiredConcurrency** - The total number of queries that a querier is capable of executing. - -Add a short backoff to the main frontend [processing loop](https://github.com/cortexproject/cortex/blob/8fb86155a7c7c155b8c4d31b91b267f9631b60ba/pkg/querier/frontend/frontend.go#L288-L331). This would cause the frontend to briefly back off of any querier that was overloaded but continue to send queries to those that were capable of doing work. - -```go -if current > desired { - zzz := (current - desired) * backoffDuration - zzz *= 1 + rand.Float64() * .1 // jitter - time.Sleep(zzz) -} -``` - -Passing flow control information from the querier to the frontend would also open up additional future work for more sophisticated load balancing across queriers. For example by simply comparing and choosing [the least congested of two](https://www.nginx.com/blog/nginx-power-of-two-choices-load-balancing-algorithm/) queriers we could dramatically improve how well work is distributed. - -### Increased Time To Failure - -#### Challenge - -Scaling the query frontend also increases the per tenant queue length by creating more queues. This could result in increased latencies where failing fast (429) would have been preferred. - -The operator could reduce the queue length per query frontend in response to scaling out, but then they would run the risk of unnecessarily failing a request due to unbalanced distribution across query frontends. Also, shorter queues run the risk of failing to properly service heavily sharded queries. - -Another concern is that a system with more queues will take longer to recover from an production event as it will have queued up more work. - -#### Proposal - -Currently we are not proposing any changes to alleviate this concern. We believe this is solvable operationally. This can be revisited as more information is gathered. - -### Querier Discovery Lag - -#### Challenge - -Queriers have a configurable parameter that controls how often they refresh their query frontend list. The default value is 10 seconds. After a new query frontend is added the average querier will take 5 seconds (after DNS is updated) to become aware of it and begin requesting queries from it. - -#### Proposal - -It is recommended to add a readiness/health check to the query frontend to prevent it from receiving queries while it is waiting for queriers to connect. HTTP health checks are supported by [envoy](https://www.envoyproxy.io/learn/health-check), [k8s](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/), [nginx](https://docs.nginx.com/nginx/admin-guide/load-balancer/http-health-check/), and basically any commodity load balancer. The query frontend would not indicate healthy on its health check until at least one querier had connected. - -In a k8s environment this will require two services. One service for discovery with `publishNotReadyAddresses` set to true and one service for load balancing which honors the healthcheck/readiness probe. After a new query-frontend instance is created the "discovery service" would immediately have the ip of the new instance which would allow queriers to discover and attach to it. After queriers had connected it would then raise its readiness probe and appear on the "load balancing" service and begin receiving traffic. - -### Dilutes Tenant Fairness - -#### Challenge - -Given `f` query frontends, `n` tenants and an average of `q` queries in the frontend per tenant. The following assumes that queries are perfectly distributed across query frontends. The number of tenants per instance would be: - - - -The chance that a query by a tenant with `Q` queries in the frontend is serviced next is: - - - -Note that fewer query frontends caps the impact of the number of active queries per tenant. If there is only one query frontend then the equation reduces to: - - - -and every tenant has an equal chance of being serviced regardless of the number of queued queries. - -Adding more query frontends favors high volume tenants by giving them more slots to be picked up by the next available querier. Fewer query frontends allows for an even playing field regardless of the number of active queries. - -For clarity, it should be noted that tenant fairness is only impacted if queries are being queued in the frontend. Under normal operations this is currently not occurring although this may change with increased sharding. - -#### Proposal - -Tenancy fairness is complex and is currently _not_ impacting our system. Therefore we are proposing a very simple improvement to the query frontend. If/when frontend queuing becomes more common this can be revisited as we will understand the problem better. - -Currently the query frontend [picks a random tenant](https://github.com/cortexproject/cortex/blob/50f53dba8f8bd5f62c0e85cc5d85684234cd1c1c/pkg/querier/frontend/frontend.go#L362-L367) to service when a querier requests a new query. This can increase long tail latency if a tenant gets “unlucky” and is also exacerbated for low volume tenants by scaling the query frontend. Instead the query frontend could use a round robin approach to choose the next tenant to service. Round robin is a commonly used algorithm to increase fairness in scheduling. - -This would be a very minor improvement, but would give some guarantees to low volume tenants that their queries would be serviced. This has been proposed in this [issue](https://github.com/cortexproject/cortex/issues/2431). - -**Pros:** Requires local knowledge only. Easier to implement than weighted round robin. - -**Cons:** Improvement is minor. - -**Alternatives to Round Robin** - -**Do Nothing** - -As is noted above tenancy fairness only comes into play when queries start queueing up in the query frontend. Internal Metrics for multi-tenant Cortex at Grafana show that this has only happened 5 times in the past week significantly enough to have been caught by Prometheus. - -Right now doing nothing is a viable option that will, almost always, fairly serve our tenants. There is, however, some concern that as sharding becomes more commonplace queueing will become more common and QOS will suffer due to reasons outlined in [Dilutes Tenant Fairness](#dilutes-tenant-fairness). - -**Pros:** Easy! - -**Cons:** Nothing happens! - -**Weighted Round Robin** - -The query frontends could maintain a local record of throughput or work per tenant. Tenants could then be sorted in QOS bands. In its simplest form there would be two QOS bands. The band of low volume tenants would be serviced twice for every one time the band of high volume tenants would be serviced. The full details of this approach would require a separate proposal. - -This solution would also open up interesting future work. For instance, we could allow operators to manually configure tenants into QOS bands. - -**Pros:** Requires local knowledge only. Can be extended later to allow tenants to be manually sorted into QOS tiers. - -**Cons:** Improvement is better than Round Robin only. Relies on even distribution of queries across frontends. Increased complexity and difficulty in reasoning about edge cases. - -**Weighted Round Robin With Gossiped Traffic** - -This approach would be equivalent to Weighted Round Robin proposed above but with tenant traffic volume gossiped between query frontends. - -**Pros:** Benefits of Weighted Round Robin without the requirement of even query distribution. Even though it requires distributed information a failure in gossip means it gracefully degrades to Weighted Round Robin. - -**Cons:** Requires cross instance communication. Increased complexity and difficulty in reasoning about edge cases. - -## Alternative - -The proposals in this document have preferred augmenting existing components to make decisions with local knowledge. The unstated goal of these proposals is to build a distributed queue across a scaled query frontend that reliably and fairly serves our tenants. - -Overall, these proposals will create a robust system that is resistant to network partitions and failures of individual pieces. However, it will also create a complex system that could be difficult to reason about, contain hard to ascertain edge cases and nuanced failure modes. - -The alternative is, instead of building a distributed queue, to add a new cortex queueing service that sits in between the frontends and the queriers. This queueing service would pull from the frontends and distribute to the queriers. It would decouple the stateful queue from the stateless elements of the query frontend and allow us to easily scale the query frontend while keeping the queue itself a singleton. In a single binary HA mode one (or few) of the replicas would be leader elected to serve this role. - -Having a singleton queue is attractive because it is simple to reason about and gives us a single place to make fair cross tenant queueing decisions. It does, however, create a single point of failure and add another network hop to the query path. - -## Conclusion - -In this document we reviewed the [reasons the frontend exists](#query-frontend-role), [challenges and proposals to scaling the frontend](#challenges-and-proposals) and [an alternative architecture that avoids most problems but comes with its own challenges.](#alternative) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Challenge - Proposal - Status -
Dynamic Querier Concurrency - Add Max Total Concurrency in Querier - Pull Request -
Overwhelming PromQL Concurrency - Queriers Coordinate Concurrency with Frontends - Proposed -
Increased Time to Failure - Operational/Configuration Issue. No Changes Proposed. - - N/A -
Querier Discovery Lag - Query Frontend HTTP Health Checks - Pull Request -
Dilutes Tenant Fairness - Round Robin with additional alternatives proposed - Pull Request -
+When using query frontend with query scheduler, `/ready` will report 200 status code only after frontend discovers some schedulers via DNS resolution. diff --git a/docs/sources/operations/query-auditor.md b/docs/sources/query-auditor.md similarity index 100% rename from docs/sources/operations/query-auditor.md rename to docs/sources/query-auditor.md diff --git a/docs/sources/operations/query-tee.md b/docs/sources/query-tee.md similarity index 100% rename from docs/sources/operations/query-tee.md rename to docs/sources/query-tee.md diff --git a/docs/sources/operations/requests-mirroring-to-secondary-cluster.md b/docs/sources/requests-mirroring-to-secondary-cluster.md similarity index 98% rename from docs/sources/operations/requests-mirroring-to-secondary-cluster.md rename to docs/sources/requests-mirroring-to-secondary-cluster.md index d19a8dd7cca..50c925e852b 100644 --- a/docs/sources/operations/requests-mirroring-to-secondary-cluster.md +++ b/docs/sources/requests-mirroring-to-secondary-cluster.md @@ -18,7 +18,7 @@ For example, requests mirroring can be used when you need to setup a testing Cor The following Envoy configuration shows an example with two Cortex clusters. Envoy will listen on port `9900` and will proxies all requests to `cortex-primary:8080`, mirroring it to `cortex-secondary:8080` too. -[embedmd]:# (../../configurations/requests-mirroring-envoy.yaml) +[embedmd]:# (../configurations/requests-mirroring-envoy.yaml) ```yaml admin: # No access logs. From 91b235ebd561c3d32b63bcff8c14445b8527f49a Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Thu, 3 Feb 2022 10:14:44 +0100 Subject: [PATCH 082/168] Added querier autoscaling panels and alerts to mixin (#1006) * Added querier autoscaling panels and alerts to mixin Signed-off-by: Marco Pracucci * Fixed typos Signed-off-by: Marco Pracucci * Addressed review comments Signed-off-by: Marco Pracucci --- CHANGELOG.md | 1 + Makefile | 2 +- operations/mimir-mixin-compiled/alerts.yaml | 18 +- .../dashboards/mimir-reads.json | 361 ++++++++++++++++-- operations/mimir-mixin/alerts.libsonnet | 1 + .../mimir-mixin/alerts/alerts.libsonnet | 2 +- .../mimir-mixin/alerts/autoscaling.libsonnet | 27 ++ .../mimir-mixin/alerts/blocks.libsonnet | 2 +- .../mimir-mixin/alerts/compactor.libsonnet | 2 +- operations/mimir-mixin/config.libsonnet | 6 + .../dashboards/dashboard-utils.libsonnet | 33 ++ .../mimir-mixin/dashboards/reads.libsonnet | 62 +++ operations/mimir-mixin/docs/playbooks.md | 27 ++ .../mimir-mixin/mixin-compiled.libsonnet | 9 + 14 files changed, 510 insertions(+), 43 deletions(-) create mode 100644 operations/mimir-mixin/alerts/autoscaling.libsonnet create mode 100644 operations/mimir-mixin/mixin-compiled.libsonnet diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d513085d8d..02d1e84ee88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -468,6 +468,7 @@ * [CHANGE] Enabled resources dashboards by default. Can be disabled setting `resources_dashboards_enabled` config field to `false`. #920 * [FEATURE] Added `Cortex / Overrides` dashboard, displaying default limits and per-tenant overrides applied to Mimir. #673 * [FEATURE] Added `Mimir / Tenants` and `Mimir / Top tenants` dashboards, displaying user-based metrics. #776 +* [FEATURE] Added querier autoscaling panels and alerts. #1006 * [ENHANCEMENT] cortex-mixin: Make `cluster_namespace_deployment:kube_pod_container_resource_requests_{cpu_cores,memory_bytes}:sum` backwards compatible with `kube-state-metrics` v2.0.0. [#317](https://github.com/grafana/cortex-jsonnet/pull/317) * [ENHANCEMENT] Cortex-mixin: Include `cortex-gw-internal` naming variation in default `gateway` job names. [#328](https://github.com/grafana/cortex-jsonnet/pull/328) * [ENHANCEMENT] Ruler dashboard: added object storage metrics. [#354](https://github.com/grafana/cortex-jsonnet/pull/354) diff --git a/Makefile b/Makefile index 0a0cc185136..d34d169f1b4 100644 --- a/Makefile +++ b/Makefile @@ -437,7 +437,7 @@ check-mixin-playbook: build-mixin build-mixin: check-mixin-jb @rm -rf $(MIXIN_OUT_PATH) && mkdir $(MIXIN_OUT_PATH) - @mixtool generate all --output-alerts $(MIXIN_OUT_PATH)/alerts.yaml --output-rules $(MIXIN_OUT_PATH)/rules.yaml --directory $(MIXIN_OUT_PATH)/dashboards ${MIXIN_PATH}/mixin.libsonnet + @mixtool generate all --output-alerts $(MIXIN_OUT_PATH)/alerts.yaml --output-rules $(MIXIN_OUT_PATH)/rules.yaml --directory $(MIXIN_OUT_PATH)/dashboards ${MIXIN_PATH}/mixin-compiled.libsonnet @cd $(MIXIN_OUT_PATH)/.. && zip -q -r mimir-mixin.zip $$(basename "$(MIXIN_OUT_PATH)") @echo "The mixin has been compiled to $(MIXIN_OUT_PATH) and archived to $$(realpath --relative-to=$$(pwd) $(MIXIN_OUT_PATH)/../mimir-mixin.zip)" diff --git a/operations/mimir-mixin-compiled/alerts.yaml b/operations/mimir-mixin-compiled/alerts.yaml index 3322fdb94e2..197d43e6745 100644 --- a/operations/mimir-mixin-compiled/alerts.yaml +++ b/operations/mimir-mixin-compiled/alerts.yaml @@ -122,7 +122,7 @@ groups: for: 5m labels: severity: critical -- name: cortex_instance_limits_alerts +- name: mimir_instance_limits_alerts rules: - alert: MimirIngesterReachingSeriesLimit annotations: @@ -436,7 +436,7 @@ groups: increase(cortex_alertmanager_state_initial_sync_completed_total{outcome="failed"}[1m]) > 0 labels: severity: critical -- name: cortex_blocks_alerts +- name: mimir_blocks_alerts rules: - alert: MimirIngesterHasNotShippedBlocks annotations: @@ -580,7 +580,7 @@ groups: for: 6h labels: severity: warning -- name: cortex_compactor_alerts +- name: mimir_compactor_alerts rules: - alert: MimirCompactorHasNotSuccessfullyCleanedUpBlocks annotations: @@ -641,3 +641,15 @@ groups: for: 1m labels: severity: warning +- name: mimir_autoscaling_querier + rules: + - alert: MimirQuerierAutoscalerNotActive + annotations: + message: The Horizontal Pod Autoscaler (HPA) in {{ $labels.namespace }} is not active. + expr: | + kube_horizontalpodautoscaler_status_condition{horizontalpodautoscaler="keda-hpa-querier",condition="ScalingActive",status="false"} + * on(cluster, namespace) group_left max by(cluster, namespace) (cortex_build_info) + > 0 + for: 15m + labels: + severity: warning diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-reads.json b/operations/mimir-mixin-compiled/dashboards/mimir-reads.json index 67478633ca3..d03a828b77c 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-reads.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-reads.json @@ -1464,6 +1464,295 @@ "title": "Querier", "titleSize": "h6" }, + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "### Replicas\nThe minimum, maximum, and current number of querier replicas.\n\n", + "fill": 1, + "id": 19, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kube_horizontalpodautoscaler_spec_min_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\", horizontalpodautoscaler=\"keda-hpa-querier\"}", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "Min", + "legendLink": null, + "step": 10 + }, + { + "expr": "kube_horizontalpodautoscaler_spec_max_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\", horizontalpodautoscaler=\"keda-hpa-querier\"}", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "Max", + "legendLink": null, + "step": 10 + }, + { + "expr": "kube_horizontalpodautoscaler_status_current_replicas{cluster=~\"$cluster\", namespace=~\"$namespace\", horizontalpodautoscaler=\"keda-hpa-querier\"}", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "Current", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Replicas", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "### Scaling metric\nThis panel shows the result of the query used as scaling metric and target/threshold used.\nThe desired number of replicas is computed by HPA as: / .\n\n", + "fieldConfig": { + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Target per replica" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "fill": 1, + "id": 20, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "keda_metrics_adapter_scaler_metrics_value +\non(metric) group_left\nlabel_replace(\n kube_horizontalpodautoscaler_spec_target_metric{cluster=~\"$cluster\", namespace=~\"$namespace\", horizontalpodautoscaler=\"keda-hpa-querier\"}\n * 0, \"metric\", \"$1\", \"metric_name\", \"(.+)\"\n)\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "Scaling metric", + "legendLink": null, + "step": 10 + }, + { + "expr": "kube_horizontalpodautoscaler_spec_target_metric{cluster=~\"$cluster\", namespace=~\"$namespace\", horizontalpodautoscaler=\"keda-hpa-querier\"}", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "Target per replica", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Scaling metric", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "description": "### Autoscaler failures rate\nThe rate of failures in the KEDA custom metrics API server. Whenever an error occurs, the KEDA custom\nmetrics server is unable to query the scaling metric from Prometheus so the autoscaler woudln't work properly.\n\n", + "fill": 1, + "id": 21, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [ ], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ ], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(keda_metrics_adapter_scaler_errors[$__rate_interval])) +\non(metric) group_left\nlabel_replace(\n kube_horizontalpodautoscaler_spec_target_metric{cluster=~\"$cluster\", namespace=~\"$namespace\", horizontalpodautoscaler=\"keda-hpa-querier\"}\n * 0, \"metric\", \"$1\", \"metric_name\", \"(.+)\"\n)\n", + "format": "time_series", + "interval": "15s", + "intervalFactor": 2, + "legendFormat": "Failures per second", + "legendLink": null, + "step": 10 + } + ], + "thresholds": [ ], + "timeFrom": null, + "timeShift": null, + "title": "Autoscaler failures rate", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ ] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Querier - autoscaling", + "titleSize": "h6" + }, { "collapse": false, "height": "250px", @@ -1483,7 +1772,7 @@ "dashes": false, "datasource": "$datasource", "fill": 10, - "id": 19, + "id": 22, "legend": { "avg": false, "current": false, @@ -1560,7 +1849,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 20, + "id": 23, "legend": { "avg": false, "current": false, @@ -1652,7 +1941,7 @@ "dashes": false, "datasource": "$datasource", "fill": 0, - "id": 21, + "id": 24, "legend": { "show": false }, @@ -1741,7 +2030,7 @@ "dashes": false, "datasource": "$datasource", "fill": 10, - "id": 22, + "id": 25, "legend": { "avg": false, "current": false, @@ -1818,7 +2107,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 23, + "id": 26, "legend": { "avg": false, "current": false, @@ -1910,7 +2199,7 @@ "dashes": false, "datasource": "$datasource", "fill": 0, - "id": 24, + "id": 27, "legend": { "show": false }, @@ -1999,7 +2288,7 @@ "dashes": false, "datasource": "$datasource", "fill": 10, - "id": 25, + "id": 28, "legend": { "avg": false, "current": false, @@ -2076,7 +2365,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 26, + "id": 29, "legend": { "avg": false, "current": false, @@ -2183,7 +2472,7 @@ "dashes": false, "datasource": "$datasource", "fill": 10, - "id": 27, + "id": 30, "legend": { "avg": false, "current": false, @@ -2260,7 +2549,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 28, + "id": 31, "legend": { "avg": false, "current": false, @@ -2356,7 +2645,7 @@ "datasource": "$datasource", "description": "### Hit ratio\nEven if you do not set up memcached for the blocks index cache, you will still see data in this panel because the store-gateway by default has an\nin-memory blocks index cache.\n\n", "fill": 1, - "id": 29, + "id": 32, "legend": { "avg": false, "current": false, @@ -2445,7 +2734,7 @@ "dashes": false, "datasource": "$datasource", "fill": 10, - "id": 30, + "id": 33, "legend": { "avg": false, "current": false, @@ -2522,7 +2811,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 31, + "id": 34, "legend": { "avg": false, "current": false, @@ -2617,7 +2906,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 32, + "id": 35, "legend": { "avg": false, "current": false, @@ -2706,7 +2995,7 @@ "dashes": false, "datasource": "$datasource", "fill": 10, - "id": 33, + "id": 36, "legend": { "avg": false, "current": false, @@ -2783,7 +3072,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 34, + "id": 37, "legend": { "avg": false, "current": false, @@ -2878,7 +3167,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 35, + "id": 38, "legend": { "avg": false, "current": false, @@ -2967,7 +3256,7 @@ "dashes": false, "datasource": "$datasource", "fill": 10, - "id": 36, + "id": 39, "legend": { "avg": false, "current": false, @@ -3044,7 +3333,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 37, + "id": 40, "legend": { "avg": false, "current": false, @@ -3139,7 +3428,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 38, + "id": 41, "legend": { "avg": false, "current": false, @@ -3228,7 +3517,7 @@ "dashes": false, "datasource": "$datasource", "fill": 10, - "id": 39, + "id": 42, "legend": { "avg": false, "current": false, @@ -3305,7 +3594,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 40, + "id": 43, "legend": { "avg": false, "current": false, @@ -3382,7 +3671,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 41, + "id": 44, "legend": { "avg": false, "current": false, @@ -3477,7 +3766,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 42, + "id": 45, "legend": { "avg": false, "current": false, @@ -3584,7 +3873,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 43, + "id": 46, "legend": { "avg": false, "current": false, @@ -3679,7 +3968,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 44, + "id": 47, "legend": { "avg": false, "current": false, @@ -3774,7 +4063,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 45, + "id": 48, "legend": { "avg": false, "current": false, @@ -3869,7 +4158,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 46, + "id": 49, "legend": { "avg": false, "current": false, @@ -3976,7 +4265,7 @@ "dashes": false, "datasource": "$datasource", "fill": 10, - "id": 47, + "id": 50, "legend": { "avg": false, "current": false, @@ -4053,7 +4342,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 48, + "id": 51, "legend": { "avg": false, "current": false, @@ -4130,7 +4419,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 49, + "id": 52, "legend": { "avg": false, "current": false, @@ -4225,7 +4514,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 50, + "id": 53, "legend": { "avg": false, "current": false, @@ -4332,7 +4621,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 51, + "id": 54, "legend": { "avg": false, "current": false, @@ -4427,7 +4716,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 52, + "id": 55, "legend": { "avg": false, "current": false, @@ -4522,7 +4811,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 53, + "id": 56, "legend": { "avg": false, "current": false, @@ -4617,7 +4906,7 @@ "dashes": false, "datasource": "$datasource", "fill": 1, - "id": 54, + "id": 57, "legend": { "avg": false, "current": false, diff --git a/operations/mimir-mixin/alerts.libsonnet b/operations/mimir-mixin/alerts.libsonnet index dbab11a805f..6a91cf83725 100644 --- a/operations/mimir-mixin/alerts.libsonnet +++ b/operations/mimir-mixin/alerts.libsonnet @@ -4,5 +4,6 @@ (import 'alerts/alertmanager.libsonnet') + (import 'alerts/blocks.libsonnet') + (import 'alerts/compactor.libsonnet') + + (import 'alerts/autoscaling.libsonnet') + { _config:: $._config + $._group_config }, } diff --git a/operations/mimir-mixin/alerts/alerts.libsonnet b/operations/mimir-mixin/alerts/alerts.libsonnet index fcb9d67f04e..68883da26b5 100644 --- a/operations/mimir-mixin/alerts/alerts.libsonnet +++ b/operations/mimir-mixin/alerts/alerts.libsonnet @@ -224,7 +224,7 @@ ], }, { - name: 'cortex_instance_limits_alerts', + name: 'mimir_instance_limits_alerts', rules: [ { alert: $.alertName('IngesterReachingSeriesLimit'), diff --git a/operations/mimir-mixin/alerts/autoscaling.libsonnet b/operations/mimir-mixin/alerts/autoscaling.libsonnet new file mode 100644 index 00000000000..836f58accb5 --- /dev/null +++ b/operations/mimir-mixin/alerts/autoscaling.libsonnet @@ -0,0 +1,27 @@ +(import 'alerts-utils.libsonnet') { + groups+: if !$._config.autoscaling.querier_enabled then [] else [ + { + name: 'mimir_autoscaling_querier', + rules: [ + { + alert: $.alertName('QuerierAutoscalerNotActive'), + 'for': '15m', + expr: ||| + kube_horizontalpodautoscaler_status_condition{horizontalpodautoscaler="%(hpa_name)s",condition="ScalingActive",status="false"} + * on(%(aggregation_labels)s) group_left max by(%(aggregation_labels)s) (cortex_build_info) + > 0 + ||| % { + aggregation_labels: $._config.alert_aggregation_labels, + hpa_name: $._config.autoscaling.querier_hpa_name, + }, + labels: { + severity: 'warning', + }, + annotations: { + message: 'The Horizontal Pod Autoscaler (HPA) in {{ $labels.namespace }} is not active.' % $._config, + }, + }, + ], + }, + ], +} diff --git a/operations/mimir-mixin/alerts/blocks.libsonnet b/operations/mimir-mixin/alerts/blocks.libsonnet index 1bfe2b7e32d..98d4f2c4c69 100644 --- a/operations/mimir-mixin/alerts/blocks.libsonnet +++ b/operations/mimir-mixin/alerts/blocks.libsonnet @@ -1,7 +1,7 @@ (import 'alerts-utils.libsonnet') { groups+: [ { - name: 'cortex_blocks_alerts', + name: 'mimir_blocks_alerts', rules: [ { // Alert if the ingester has not shipped any block in the last 4h. It also checks cortex_ingester_ingested_samples_total diff --git a/operations/mimir-mixin/alerts/compactor.libsonnet b/operations/mimir-mixin/alerts/compactor.libsonnet index 6ca2f0a1985..7eda7984e1b 100644 --- a/operations/mimir-mixin/alerts/compactor.libsonnet +++ b/operations/mimir-mixin/alerts/compactor.libsonnet @@ -1,7 +1,7 @@ (import 'alerts-utils.libsonnet') { groups+: [ { - name: 'cortex_compactor_alerts', + name: 'mimir_compactor_alerts', rules: [ { // Alert if the compactor has not successfully cleaned up blocks in the last 6h. diff --git a/operations/mimir-mixin/config.libsonnet b/operations/mimir-mixin/config.libsonnet index ca218465be2..7a578066e41 100644 --- a/operations/mimir-mixin/config.libsonnet +++ b/operations/mimir-mixin/config.libsonnet @@ -67,6 +67,12 @@ top_tenants: true, }, + // Whether autoscaling panels and alerts should be enabled for specific Mimir services. + autoscaling: { + querier_enabled: false, + querier_hpa_name: 'keda-hpa-querier', + }, + // The routes to exclude from alerts. alert_excluded_routes: [], }, diff --git a/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet b/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet index 8f60b8e2ab6..f2fbf9f774d 100644 --- a/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet +++ b/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet @@ -561,6 +561,39 @@ local utils = import 'mixin-utils/utils.libsonnet'; containerName, ], + filterKedaMetricByHPA(query, hpa_name):: + ||| + %(query)s + + on(metric) group_left + label_replace( + kube_horizontalpodautoscaler_spec_target_metric{%(namespace)s, horizontalpodautoscaler="%(hpa_name)s"} + * 0, "metric", "$1", "metric_name", "(.+)" + ) + ||| % { + query: query, + hpa_name: hpa_name, + namespace: $.namespaceMatcher(), + }, + + panelAxisPlacement(seriesName, placement):: { + fieldConfig+: { + overrides+: [ + { + matcher: { + id: 'byName', + options: seriesName, + }, + properties: [ + { + id: 'custom.axisPlacement', + value: placement, + }, + ], + }, + ], + }, + }, + panelDescription(title, description):: { description: ||| ### %s diff --git a/operations/mimir-mixin/dashboards/reads.libsonnet b/operations/mimir-mixin/dashboards/reads.libsonnet index d24a6a1ad51..e5ca2b78f5a 100644 --- a/operations/mimir-mixin/dashboards/reads.libsonnet +++ b/operations/mimir-mixin/dashboards/reads.libsonnet @@ -198,6 +198,68 @@ local utils = import 'mixin-utils/utils.libsonnet'; { yaxes: $.yaxes('s') } ) ) + .addRowIf( + $._config.autoscaling.querier_enabled, + $.row('Querier - autoscaling') + .addPanel( + local title = 'Replicas'; + $.panel(title) + + $.queryPanel( + [ + 'kube_horizontalpodautoscaler_spec_min_replicas{%s, horizontalpodautoscaler="%s"}' % [$.namespaceMatcher(), $._config.autoscaling.querier_hpa_name], + 'kube_horizontalpodautoscaler_spec_max_replicas{%s, horizontalpodautoscaler="%s"}' % [$.namespaceMatcher(), $._config.autoscaling.querier_hpa_name], + 'kube_horizontalpodautoscaler_status_current_replicas{%s, horizontalpodautoscaler="%s"}' % [$.namespaceMatcher(), $._config.autoscaling.querier_hpa_name], + ], + [ + 'Min', + 'Max', + 'Current', + ], + ) + + $.panelDescription( + title, + ||| + The minimum, maximum, and current number of querier replicas. + ||| + ), + ) + .addPanel( + local title = 'Scaling metric'; + $.panel(title) + + $.queryPanel( + [ + $.filterKedaMetricByHPA('keda_metrics_adapter_scaler_metrics_value', $._config.autoscaling.querier_hpa_name), + 'kube_horizontalpodautoscaler_spec_target_metric{%s, horizontalpodautoscaler="%s"}' % [$.namespaceMatcher(), $._config.autoscaling.querier_hpa_name], + ], [ + 'Scaling metric', + 'Target per replica', + ] + ) + + $.panelDescription( + title, + ||| + This panel shows the result of the query used as scaling metric and target/threshold used. + The desired number of replicas is computed by HPA as: / . + ||| + ) + + $.panelAxisPlacement('Target per replica', 'right'), + ) + .addPanel( + local title = 'Autoscaler failures rate'; + $.panel(title) + + $.queryPanel( + $.filterKedaMetricByHPA('sum(rate(keda_metrics_adapter_scaler_errors[$__rate_interval]))', $._config.autoscaling.querier_hpa_name), + 'Failures per second' + ) + + $.panelDescription( + title, + ||| + The rate of failures in the KEDA custom metrics API server. Whenever an error occurs, the KEDA custom + metrics server is unable to query the scaling metric from Prometheus so the autoscaler woudln't work properly. + ||| + ), + ) + ) .addRow( $.row('Ingester') .addPanel( diff --git a/operations/mimir-mixin/docs/playbooks.md b/operations/mimir-mixin/docs/playbooks.md index f31048a0c70..8262edfd52c 100644 --- a/operations/mimir-mixin/docs/playbooks.md +++ b/operations/mimir-mixin/docs/playbooks.md @@ -832,6 +832,33 @@ How to **investigate**: ``` - In case you need to quickly reject write path traffic from a single tenant, you can override its `ingestion_rate` and `ingestion_rate_burst` setting lower values (so that some/most of their traffic will be rejected) +### MimirQuerierAutoscalerNotActive + +This alert fires when the Mimir querier Kubernetes Horizontal Pod Autoscaler's (HPA) `ScalingActive` condition is `false`. When this happens, it's not able to calculate desired scale and generally indicates problems with fetching metrics. + +How it **works**: + +- HPA is configured to autoscale Mimir queriers based on custom metrics fetched from Prometheus via the KEDA custom metrics API server +- HPA periodically queries updated metrics and updates the number of desired replicas based on that +- Please refer to the [HPA documentation](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) for more information about it + +How to **investigate**: + +- Check HPA conditions and events to get more details about the failure + ``` + kubectl describe hpa -n keda-hpa-querier + ``` +- Ensure KEDA custom metrics API server is up and running + ``` + # Assuming KEDA is running in a dedicated namespace "keda": + kubectl get pods -n keda + ``` +- Check KEDA custom metrics API server logs + ``` + # Assuming KEDA is running in a dedicated namespace "keda": + kubectl logs -n keda deployment/keda-operator-metrics-apiserver + ``` + ## Mimir routes by path **Write path**: diff --git a/operations/mimir-mixin/mixin-compiled.libsonnet b/operations/mimir-mixin/mixin-compiled.libsonnet new file mode 100644 index 00000000000..914dc6f3a73 --- /dev/null +++ b/operations/mimir-mixin/mixin-compiled.libsonnet @@ -0,0 +1,9 @@ +(import 'mixin.libsonnet') + { + // Config overrides used when building the compiled version of the mimir-mixin. + // This includes all features, since the compiled version can't be customized. + _config+:: { + autoscaling+: { + querier_enabled: true, + }, + }, +} From 95a9a0677e5ae693442fa1011208372c901d25d5 Mon Sep 17 00:00:00 2001 From: Ursula Kallio <73951760+osg-grafana@users.noreply.github.com> Date: Thu, 3 Feb 2022 10:28:38 +0100 Subject: [PATCH 083/168] Remove obsolete information to eliminate confusion. (#1011) --- docs/sources/proposals/_index.md | 7 - docs/sources/proposals/api_design.md | 81 ---- .../proposals/blocks-storage-bucket-index.md | 108 ------ .../proposals/blocks-storage-sharding.md | 84 ----- .../cross-tenant-query-federation.md | 122 ------ docs/sources/proposals/parallel-compaction.md | 70 ---- docs/sources/proposals/receiving_metadata.md | 60 --- .../proposals/scalable-alertmanager.md | 76 ---- .../proposals/scalable-query-frontend.md | 50 --- .../shuffle-sharding-and-zone-awareness.md | 108 ------ .../shuffle-sharding-on-the-read-path.md | 347 ------------------ docs/sources/proposals/tenant-deletion.md | 155 -------- docs/sources/proposals/tenant_retention.md | 47 --- 13 files changed, 1315 deletions(-) delete mode 100644 docs/sources/proposals/_index.md delete mode 100644 docs/sources/proposals/api_design.md delete mode 100644 docs/sources/proposals/blocks-storage-bucket-index.md delete mode 100644 docs/sources/proposals/blocks-storage-sharding.md delete mode 100644 docs/sources/proposals/cross-tenant-query-federation.md delete mode 100644 docs/sources/proposals/parallel-compaction.md delete mode 100644 docs/sources/proposals/receiving_metadata.md delete mode 100644 docs/sources/proposals/scalable-alertmanager.md delete mode 100644 docs/sources/proposals/scalable-query-frontend.md delete mode 100644 docs/sources/proposals/shuffle-sharding-and-zone-awareness.md delete mode 100644 docs/sources/proposals/shuffle-sharding-on-the-read-path.md delete mode 100644 docs/sources/proposals/tenant-deletion.md delete mode 100644 docs/sources/proposals/tenant_retention.md diff --git a/docs/sources/proposals/_index.md b/docs/sources/proposals/_index.md deleted file mode 100644 index 2d941554aa1..00000000000 --- a/docs/sources/proposals/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Proposals" -linkTitle: "Proposals" -no_section_index_title: true -weight: 9 -menu: ---- diff --git a/docs/sources/proposals/api_design.md b/docs/sources/proposals/api_design.md deleted file mode 100644 index d331c51095e..00000000000 --- a/docs/sources/proposals/api_design.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: "HTTP API Design" -linkTitle: "HTTP API Design" -weight: 1 -slug: http-api-design ---- - -- Author: @jtlisi -- Reviewers: @pracucci, @pstibrany, @khaines, @gouthamve -- Date: March 2020 -- Status: Accepted - -## Overview - -The purpose of this design document is to propose a set of standards that should be the basis of the Cortex HTTP API. This document will outline the current state of the Cortex http api and describe limitations that result from the current approach. It will also outline a set of paradigms on how http routes should be created within Cortex. - -## Current Design - -As things currently stand, the majority of HTTP API calls exist under the `/api/prom` path prefix. This prefix is configurable. However, since this prefix is shared between all the modules which leads to conflicts if the Alertmanager is attempted to be run as as part of the single binary (#1722). - -## Proposed Design - -### Module-Based Routing - -Cortex incorporates three separate APIs: Alertmanager, Prometheus, and Cortex. Each of these APIs should use a separate route prefix that accurately describes the API. Currently, all of the api calls in Cortex reside under the configured http prefix. Instead the following routing tree is proposed: - -#### `/prometheus/*` - -Under this path prefix, Cortex will act as a Prometheus web server. It will host all of the required Prometheus api endpoints. For example to query cortex the endpoint `/prometheus/api/v1/query_range` will be used. - -#### `/alertmanager/*` - -Under this path prefix, Cortex will act as a Alertmanager web server. In this case, it will forward requests to the alertmanager and support the alertmanager API. This means for a user to access their Alertmanager UI, they will use the `/alertmanager` path of cortex. - -#### `/api/v1/*` -- The cortex API will exist under this path prefix. - -- `/push` -- `/chunks` -- `/rules/*` - -| Current | Proposed | -| ------------------- | ----------------- | -| `/api/prom/push` | `/api/v1/push` | -| `/api/prom/chunks` | `/api/v1/chunks` | -| `/api/prom/rules/*` | `/api/v1/rules/*` | - -#### Service Endpoints - -A number of endpoints currently exist that are not under the `/api/prom` prefix that provide basic web interfaces and trigger operations for cortex services. These endpoints will all be placed under a url with their service name as a prefix if it is applicable. - -| Current | Proposed | -| --------------------- | ---------------------------------- | -| `/status` | `/multitenant-alertmanager/status` | -| `/config` | `/config` | -| `/ring` | `/ingester/ring` | -| `/ruler_ring` | `/ruler/ring` | -| `/compactor/ring` | `/compactor/ring` | -| `/store-gateway/ring` | `/store-gateway/ring` | -| `/ha-tracker` | `/distributor/ha_tracker` | -| `/all_user_stats` | `/distributor/all_user_stats` | -| `/user_stats` | `/distributor/user_stats` | -| `/flush` | `/ingester/flush` | -| `/shutdown` | `/ingester/shutdown` | - -### Path Versioning - -Cortex will utilize path based versioning similar to both Prometheus and Alertmanager. This will allow future versions of the API to be released with changes over time. - -### Backwards-Compatibility - -The new API endpoints and the current http prefix endpoints can be maintained concurrently. The flag to configure these endpoints will be maintained as `http.prefix`. This will allow us to roll out the new API without disrupting the current routing schema. The original http prefix endpoints can maintained indefinitely or be phased out over time. Deprecation warnings can be added to the current API either when initialized or utilized. This can be accomplished by injecting a middleware that logs a warning whenever a legacy API endpoint is used. - -In cases where Cortex is run as a single binary, the Alertmanager module will only be accesible using the new API. - -### Implementation - -This will be implemented by adding an API module to the Cortex service. This module will handle setting up all the required HTTP routes with Cortex. It will be designed around a set of interfaces required to fulfill the API. This is similar to how the `v1` Prometheus API is implemented. - -### Style - -- All new paths will utilize `_` instead of `-` for their url to conform with Prometheus and its use of the underscore in the `query_range` endpoint. This applies to all operations endpoints. Component names in the path can still contain dashes. For example: `/store-gateway/ring`. diff --git a/docs/sources/proposals/blocks-storage-bucket-index.md b/docs/sources/proposals/blocks-storage-bucket-index.md deleted file mode 100644 index 0836e993639..00000000000 --- a/docs/sources/proposals/blocks-storage-bucket-index.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: "Blocks storage bucket index" -linkTitle: "Blocks storage bucket index" -weight: 1 -slug: blocks-storage-bucket-index ---- - -- Author: [Marco Pracucci](https://github.com/pracucci) -- Date: November 2020 -- Status: draft - -## Introduction - -Queriers and store-gateways, at startup and periodically while running, need to scan the entire object store bucket to find tenants and blocks for each tenants. - -For each discovered block, they need to fetch the `meta.json` file and check for the existence of `deletion-mark.json` (used to signal a block is "marked for deletion"). The `meta.json` file is immutable and gets cached, but `deletion-mark.json` can be created at any time and its non-existence can't be safely cached for long (actually our cache is pretty ineffective regarding this). - -The number of blocks in the storage linearly increases with the number of tenants, and so does the number of bucket API calls required to scan the bucket. - -For example, assuming 1 block / day / tenant and a 400d retention, we would have 400 blocks for a single-tenant cluster, but 4M blocks for a 10K tenants cluster (regardless of the number of active series or their QPS). - -We're currently testing a cluster running with 6K tenants and we have faced the following issues: - -- The cold start of queriers and store-gateways (empty caches) take tens of minutes. -- If we increase the concurrency of bucket operations run to scan the bucket, we hit into object store rate limits and/or the 5xx error rate increases -- The need to run "list objects" API call for queriers and store-gateways to discover blocks and the check for the existence of `deletion-mark.json` (which requires a read operation for each block and can't be cached for a long time) represents a significant % of bucket API calls baseline costs, regardless the tenants QPS (costs we have even if the cluster has 0 queries) - -## Goal - -The goal of this proposal is: - -- The querier should be up and running without having to scan the bucket at all (zero startup time) -- The querier should not run any "list objects" operation at anytime -- The querier should require only 1 "get object" operation to get the entire view of a tenant's blocks - -## Out of scope - -We believe the same technique described in this proposal could be applied to optimise the store-gateway too (we've built a [PoC](https://github.com/cortexproject/cortex/compare/pracucci:experiment-object-store-based-blocks-index)), however to keep the design doc easier to discuss we suggest to keep the store-gateway out of scope and address it in a follow-up design doc. - -## Proposal - -We propose to introduce a per-tenant bucket index. The index is a single JSON file containing two main information: list of all completed (non partial) blocks in the bucket + list of all deletion marks. The bucket index is stored in the bucket within the tenant location (eg. `/user-1/bucket-index.json`) and is kept updated by the compactor. - -The querier, at query time, checks whether the bucket index for the tenant has already been loaded in memory. If not, the querier will download it and cache it in memory. Given it's a small file, we expect the lazy download of the bucket index to not significantly impact first query performances. - -While in-memory, a background process will keep it updated at periodic intervals (configurable), so that subsequent queries from the same tenant to the same querier instance will use the cached (and periodically updated) bucket index. - -If a bucket index is unused for a long time (configurable), eg. because that querier instance is not receiving any query from the tenant, the querier will offload it, stopping to keep it updated at regular intervals. This is particularly useful when shuffle sharding is enabled, because a querier will only run queries for a subset of tenants and tenants can be re-sharded across queries in the event of a scale up/down or rolling updates. - -The bucket index will be also cached on memcached for a short period of time, to reduce the number of "get object" operations in case multiple queriers fetch it in a short period of time (eg. 5 minutes). - -### Bucket index structure - -The `bucket-index.json` is a single file containing the following information: - -- `Version` -- List of blocks - - `ID`, `MinTime`, `MaxTime`, `UploadedAt` - - `SegmentsFormat` (eg. "1-based-6-digits"), `SegmentsNum` (these two information will be used by the store-gateway) -- List of block deletion marks - - `ID`, `DeletionTime` -- Timestamp of when the index has been updated - -The bucket index intentionally stores a subset of data for each block's `meta.json`, in order to keep the size of the index small. The information in the index is enough to run the querier without having to load the full `meta.json` of each block. - -**Size**: the expected size of the index is about 150 bytes per block. In the case of a tenant with 400 blocks, its bucket index would be 58KB. The size could be further reduced compressing it: experiments show a compression ratio of about 4x using gzip. - -### Why the compactor writes the bucket index - -There are few reasons why the compactor may be a good candidate to write the bucket index: - -- The compactor already scans the bucket to have a consistent view of the blocks before running a compaction. Writing the bucket index in the compactor would require no additional bucket API calls. -- Queriers and store-gateways currently read only from the bucket (no writes). We believe that it may be a nice property to preserve. - -### How to reduce bucket API calls required to discover deletion marks - -The `deletion-mark.json` files are stored within each block location. This means that the compactor would still need to run a "get object" operation for every single block in order to find out which block has it, while updating the bucket index. - -To reduce the number of operations required, we propose to store block deletion marks for all blocks in a per-tenant location (`markers/`). Discovering all blocks marked for deletion for a given tenant would only require a single "list objects" operation on the `//markers/` prefix. New markers introduced in the future (eg. tenant deletion mark) could be stored in the same location in order to discover all markers with a single "list objects" operation. - -For example: - -``` -/user-1/markers/01ER1ZSYHF1FT6RBD8HTVQWX13-deletion-mark.json -/user-1/markers/01ER1ZGSX1Q4B41MK1QQ7RHD33-deletion-mark.json -/user-1/markers/01ER1ZGWKVFT60YMXT8D3XJMDB-deletion-mark.json -``` - -### What if a bucket index gets stale - -Queriers and store-gateways don't need a strongly consistent view over the bucket. Even today, given queriers and store-gateways run a periodic scan of the bucket, their view could be stale up to the "scan interval" (defaults to 15m). - -The maximum delay between a change into the bucket is picked up by queriers and store-gateways depends on the configuration and is the minimum time between: - -- New blocks uploaded by ingester: - `min(-querier.query-ingesters-within, -blocks-storage.tsdb.retention-period)` (default: 13h) -- New blocks uploaded/deleted by compactor: - `-compactor.deletion-delay` (default: 12h) - -In order to guarantee consistent query results, we propose to configure the bucket index max stale period in the querier and fail queries if, because of any issue, the bucket index `UpdatedAt` age exceeds it. - -The staleness of each bucket index will be tracked via metrics, in order to be alert on it when it's close to expiration (but before it happens). - -### Object store eventual consistency - -Object stores like S3 or GCS do guarantee read-after-create consistency but not read-after-update. - -However, given the analysis done in "[What if a bucket index gets stale](#what-if-a-bucket-index-gets-stale)" we expect this not to be a real issue, considering we do expect object store reads to not be out of sync for hours. diff --git a/docs/sources/proposals/blocks-storage-sharding.md b/docs/sources/proposals/blocks-storage-sharding.md deleted file mode 100644 index ac576cfa1a4..00000000000 --- a/docs/sources/proposals/blocks-storage-sharding.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "Blocks storage sharding" -linkTitle: "Blocks storage sharding" -weight: 1 -slug: blocks-storage-sharding ---- - -- Author: [Marco Pracucci](https://github.com/pracucci) -- Date: March 2020 -- Status: accepted - -## Problem - -In Cortex, when using the experimental blocks storage, each querier internally runs the Thanos [`BucketStore`](https://github.com/thanos-io/thanos/blob/master/pkg/store/bucket.go). This means that each querier has a full view over all blocks in the long-term storage and all blocks index headers are loaded in each querier memory. The querier memory usage linearly increase with number and size of all blocks in the storage, imposing a scalability limit to the blocks storage. - -In this proposal we want to solve this. In particular, we want to: - -1. Shard blocks (index headers) across a pool of nodes -2. Do not compromise HA on the read path (if a node fails, queries should continue to work) -3. Do not compromise correctness (either the query result is correct or it fails) - -## Proposed solution - -The idea is to introduce a new Cortex service - `store-gateway` - internally running the Thanos [`BucketStore`](https://github.com/thanos-io/thanos/blob/master/pkg/store/bucket.go). At query time, a querier will run a query fetching the matching series both from ingesters and the subset of gateways holding the related blocks (based on the query time range). Blocks are replicated across the gateways in order to guarantee query results consistency and HA even in the case of a gateway instance failure. - -### Ring-based sharding and replication - -In order to build blocks sharding and replication, the `store-gateway` instances form a [ring](../architecture.md#the-hash-ring). Each gateway instance uses a custom [`MetaFetcherFilter`](https://github.com/thanos-io/thanos/blob/master/pkg/block/fetcher.go#L108) to filter blocks loaded on the instance itself, keeping only blocks whose `hash(block-id)` is within the tokens range assigned to the gateway instance within the ring. - -Within a gateway, the blocks synchronization is triggered in two cases: - -1. **Periodically**
- to discover new blocks uploaded by ingesters or compactor, and delete old blocks removed due to retention or by the compactor -2. **On-demand**
- when the ring topology changes (the tokens ranges assigned to the gateway instance have changed) - -It's important to outline that the sync takes time (typically will have to re-scan the bucket and download new blocks index headers) and Cortex needs to guarantee query results consistency at any given time (_see below_). - -### Query execution - -When a querier executes a query, it will need to fetch series both from ingesters and the store-gateway instances. - -For a given query, the number of blocks to query is expected to be low, especially if the Cortex cluster is running the `query-frontend` with a `24h` query split interval. In this scenario, whatever is the client's query time range, the `query-frontend` will split the client's query into partitioned queries each with up to `24h` time range and the querier will likely hit not more than 1 block per partitioned query (except for the last 24h for which blocks may have not been compacted yet). - -Given this assumption, we want to avoid sending every query to every store-gateway instance. The querier should be able to take an informed decision about the minimum subset of store-gateway instances which needs to query given a time range. - -The idea is to run the [`MetaFetcher`](https://github.com/thanos-io/thanos/blob/master/pkg/block/fetcher.go#L127) also within the querier, but without any sharding filter (contrary to the store-gateway). At any given point in time, the querier knows the entire list of blocks in the storage. When the querier executes the `Select()` (or `SelectSorted()`) it does: - -1. Compute the list of blocks by the query time range -2. Compute the minimum list of store-gateway instances containing the required blocks (using the information from the ring) -3. Fetch series from ingesters and the matching store-gateway instances -4. Merge and deduplicate received series - - Optimization: can be skipped if the querier hits only 1 store-gateway - -### Query results consistency - -When a querier executes a query, it should guarantee that either all blocks matching the time range are queried or the query fails. - -However, due to the (intentional) lack of a strong coordination between queriers and store-gateways, and the ring topology which can change any time, there's no guarantee that the blocks assigned to a store-gateway shard are effectively loaded on the store-gateway itself at any given point in time. - -The idea is introduce a **consistency check in the querier**. When a store-gateway receives a request from the querier, the store-gateway includes in the response the list of block IDs currently loaded on the store-gateway itself. The querier can then merge the list of block IDs received from all store-gateway hit, and match it against the list of block IDs computed at the beginning of the query execution. - -There are three possible scenarios: - -1. The list match: all good -2. All the blocks known by the querier are within the list of blocks returned by store-gateway, but the store-gateway also included blocks unknown to the querier: all good (it means the store-gateways have discovered and loaded new blocks before the querier discovered them) -3. Some blocks known by the querier are **not** within the list of blocks returned by store-gateway: potential consistency issue - -We want to protect from a partial results response which may occur in the case #3. However, there are some legit cases which, if not handled, would lead to frequent false positives. Given the querier and store-gateway instances independently scan the bucket at a regular interval (to find new blocks or deleted blocks), we may be in one of the following cases: - -a. The querier has discovered new blocks before the store-gateway successfully discovered and loaded them -b. The store-gateway has offloaded blocks "marked for deletion" before the querier - -To protect from case (a), we can exclude the blocks which have been uploaded in the last `X` time from the consistency check (same technique already used in other Thanos components). This `X` delay time is used to give the store-gateway enough time to discover and load new blocks, before the querier consider them for the consistency check. This value `X` should be greater than the `-experimental.blocks-storage.bucket-store.consistency-delay`, because we do expect the querier to consider a block for consistency check once it's reasonably safe to assume that its store-gateway already loaded it. - -To protect from case (b) we need to understand how blocks are offloaded. The `BucketStore` (running within the store-gateway) offloads a block as soon as it's not returned by the `MetaFetcher`. This means we can configure the `MetaFetcher` with a [`IgnoreDeletionMarkFilter`](https://github.com/thanos-io/thanos/blob/4bd19b16a752e9ceb1836c21d4156bdeb517fe50/pkg/block/fetcher.go#L648) with a delay of `X` (could be the same value used for case (a)) and in the querier exclude the blocks which have been marked for deletion more than `X` time ago from the consistency check. - -## Trade-offs - -The proposed solution comes with the following trade-offs: - -- A querier is not ready until it has completed an initial full scan of the bucket, downloading the `meta.json` file of every block -- A store-gateway is not ready until it has completed an initial full scan of the bucket, downloading the `meta.json` and index header of each block matching its shard -- If a querier hits 2+ store-gateways it may receive duplicated series if the 2+ store-gateways share some blocks due to the replication factor diff --git a/docs/sources/proposals/cross-tenant-query-federation.md b/docs/sources/proposals/cross-tenant-query-federation.md deleted file mode 100644 index 5e61668c4ba..00000000000 --- a/docs/sources/proposals/cross-tenant-query-federation.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: "Cross-Tenant Query Federation" -linkTitle: "Cross-Tenant Query Federation" -weight: 1 -slug: "cross-tenant-query-federation" ---- - -- Author: [Christian Simon](https://github.com/simonswine) -- Date: October 2020 -- Status: Accepted - -## Overview - -This document aims to describe how to implement the ability to allow queries to cover data from more than a single Cortex tenant. - -## Reasoning - -Adopting a tenancy model within an organization with each tenant representing a department comes with the disadvantage that it will prevent queries from spanning multiple departments. This proposal tries to overcome those limitations. - -## Alternatives considered - -### Aggregation in PromQL API clients - -In theory PromQL API clients could be aggregating/correlating query results from multiple tenants. For example Grafana could be used with multiple data sources and a cross tenant query could be achieved through using [Transformations][grafana_transformation]. - -As this approach comes with the following disadvantages, it was not considered further: - -- Every PromQL API client needs to support the aggregation from various sources. - -- Queries that are written in PromQL can't be used without extra work across tenants. - -[grafana_transformation]: https://grafana.com/docs/grafana/latest/panels/transformations/ - -### Multi tenant aggregation in the query frontends - -Another approach to multi tenant query federation could be achieved by aggregation of partial query results within the query frontend. For this a query needs to be split into sub queries per tenant and afterwards the partial results need reduced into the final result. - -The [astmapper] package goes down a similar approach, but it cannot parallelize all query types. Ideally multi-tenant query federation should support the full PromQL language and the algorithms necessary would differ per query functions and operators used. This approach was deemed as a fairly complex way to achieve that tenant query federation. - -[astmapper]: https://github.com/cortexproject/cortex/blob/f0c81bb59bf202db820403812e8dabcb64347bfd/pkg/querier/astmapper/parallel.go#L27 - -## Challenges - -### Aggregate data without overlaps - -#### Challenge - -The series in different tenants might have exactly the same labels and hence potentially collide which each other. - -#### Proposal - -In order to be able to always identify the tenant correctly, queries using multiple tenants should inject a tenant label named `__tenant_id__` and its value containing the tenant ID into the results. A potentially existing label with the same name should be stored in a label with the prefix `original_`. - -Label selectors containing the tenant label should behave like any other labels. This can be achieved by selecting the tenants used in a multi tenant query. - -### Exposure of feature to the user - -#### Challenge - -The tenant ID is currently read from the `X-Scope-OrgID` HTTP header. The tenant ID has those [documented limitations][cortex_tenant_id] of values being allowed. - -[cortex_tenant_id]: https://cortexmetrics.io/docs/guides/limitations/#tenant-id-naming - -#### Proposal - -For the query path a user should be able to specify a `X-Scope-OrgID` header with multiple tenant IDs. Multiple tenant IDs should then be propagating throughout out the system until it reaches the querier. The `Queryable` instance returned by the querier component, is wrapped by a `mergeQueryable`, which will aggregate the results from a `Queryable` per tenant and hence treated by the downstream components as a single tenant query. - -To allow such queries to be processed we suggest that an experimental configuration flag `-querier.tenant-federation.enabled` will be added, which is switched off by default. Once enabled the value of the `X-Scope-OrgID` header should be interpreted as `|` separated list of tenant ids. Components which are not expecting multiple tenant ids (e.g. the ingress path) must signal an error if multiple are used. - -### Implementing Limits, Fairness and Observability for Cross-Tenant queries - -#### Challenge - -In Cortex the tenant id is used as the primary identifier for those components: - -- The limits that apply to a certain query. - -- The query-frontend maintains a per tenant query queue to implement fairness. - -- Relevant metrics about the query are exposed under a `user` label. - -Having a query spanning multiple tenants, the existing methods are no longer correct. - -#### Proposal - -The identifier for aforementioned features for queries involving more than a single tenant should be derived from: An ordered, distinct list of tenant IDs, which is joined by a `|`. This will produce a reproducible identifier for the same set of tenants no matter which order they have been specified. - -While this feature is considered experimental, this provides some insights and ability to limit multi-tenant queries with these short comings: - -- Cardinality costs to the possible amount of tenant ID combinations. - -- Query limits applied to single tenants part of a multi tenant query are ignored. - -## Conclusion - -| Challenge | Status | -| ------------------------------------------------------------------------ | ---------------------------- | -| Aggregate data without overlap | Implementation in PR [#3250] | -| Exposure of feature to the user | Implementation in PR [#3250] | -| Implementing Limits, Fairness and Observability for Cross-Tenant queries | Implementation in PR [#3250] | - -[#3250]: https://github.com/cortexproject/cortex/pull/3250 - -### Future work - -Those features are currently out of scope for this proposal, but we can foresee some interest implementing them after this proposal. - -#### Cross Tenant support for the ruler - -Ability to use multi tenant queries in the ruler. - -#### Allow the identifier for limits, fairness and observability to be switched out - -It would be great if the source identifier could be made more pluggable. This could allow to for example base all of those features on another dimension (e.g. users rather than tenants) - -#### Allow customisation of the label used to expose tenant ids - -As per this proposal the label name `__tenant_id__` is fixed, but users might want to be able to modify that through a configuration option. - -#### Retain overlapping tenant id label values recursively - -As per this proposal the tenant label injection retains an existing label value, but this is not implemented recursively. So if the result already contains `__tenant_id__` and `original__tenant_id__` labels, the value of the latter would be lost. diff --git a/docs/sources/proposals/parallel-compaction.md b/docs/sources/proposals/parallel-compaction.md deleted file mode 100644 index f3511370e86..00000000000 --- a/docs/sources/proposals/parallel-compaction.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "Parallel Compaction by Time Interval" -linkTitle: "Parallel Compaction by Time Interval" -weight: 1 -slug: parallel-compaction ---- - -- Author: [Roy Chiang](https://github.com/roystchiang) -- Date: May 2021 -- Status: Proposed - ---- - -## Introduction - -As a part of pushing Cortex’s scaling capability at AWS, we have done performance testing with Cortex and found the compactor to be one of the main limiting factors for higher active timeseries limit per tenant. The documentation [Compactor](https://cortexmetrics.io/docs/blocks-storage/compactor/#how-compaction-works) describes the responsibilities of a compactor, and this proposal focuses on the limitations of the current compactor architecture. In the current architecture, compactor has simple sharding, meaning that a single tenant is sharded to a single compactor. In addition, a compactor handles compaction groups of a single tenant iteratively, meaning that blocks belonging non-overlapping times are not compacted in parallel. - -### Problem and Requirements - -Currently, a compactor is able to compact up to 20M timeseries within 2 hours for a level-2 compaction, including the time to download blocks, compact, and upload the newly compacted block. We would like to increase the timeseries limit per tenant, and compaction is one of the limiting factors. In addition, we would like to achieve the following: - -- Compact multiple non-overlapping time intervals concurrently, so we can achieve higher throughput for the compaction of a single tenant -- We should be able to scale up, down compactor as needed, depending on how many compactions are pending -- Insight into the compaction progress of a tenant, such as the number of compactions required in order to catch up to the newest blocks - -## Design - -We accept the fact that a single compaction can potentially take more than 2 hours to compact, and we achieve higher compaction throughput through horizontally scaling the compactor. To compact more blocks in parallel for a single tenant, we distribute the compaction groups to compactors, instead of introducing more parallelism within a compactor. - -### Parallelize Work - -This proposal builds heavily on top of the [GrafanaLabs approach of introducing parallelism via time intervals](https://github.com/cortexproject/cortex/pull/2616). The difference being that a single tenant is now sharded across multiple compactors instead of just a single compactor. The initial approach will be to work on distinct time intervals, but the compactor planner can be later extended to introduce parallelism within a time interval as well. - -The following is an example of parallelize work at each level: - -![Parallel Compaction Grouping](/images/proposals/parallel-compaction-grouping.png) - -Compactors are shuffle-sharded, meaning that 1 tenant can belong to multiple compactors, and these subset of compactors determine which blocks should be compacted together. Compactors determine amongst themselves the responsibility of the compaction blocks, by using a hash of time interval and tenant id, and putting it on the sharding ring. - -The benefit of this approach is that this aligns with what Cortex currently does in Ruler. The downside is that a compaction job can only be assigned to a single compactor, rather than all of the compactors sharded for the tenant. If a compaction job takes forever, other tenants sharded to the same compactor will be blocked until the issue is resolved. With the scheduler approach, any compactor assigned to a given tenant can pick up any work required. - -![Parallel Compaction Without Scheduler](/images/proposals/parallel-compaction-without-scheduler.png) - -## Scenarios - -### Bad block resulting in non-ideal compaction groups - -A Cortex operator configures the compaction block range. Using 2h and 6h as example, [2h-1] [2h-2] [2h-3] [2h-4] [2h-5] [2h-6]. If the [2h-1] block is corrupted, we may compact the subsequent [2h-2] [2h-3] [2h-4] [2h-5] [2h-6] blocks. To compact into a 6 hour group, the ideal compaction is [2h-1] [2h-2] [2h-3] and [2h-4] [2h-5] [2h-6]. The cortex planner needs to know the ideal compaction interval, and prevent compaction of [2h-2] [2h-3] [2h-4] from happening, which will result in [2h-1] not able to be compacted into longer time interval blocks. Cortex has full information regarding all the available blocks, so we should utilize this information to achieve the best compaction interval. - -## Alternatives - -### Shard compaction jobs amongst compactors with a scheduler - -![Parallel Compaction Architecture](/images/proposals/parallel-compaction-design.png) - -We add a new component Compactor Scheduler, which is responsible for calculating the compaction plan, and distributing compaction groups to compactors. The planner is sharded by tenant id, so that we can horizontally scale the planner as needed in order to accept more tenants in the cortex cluster. A tenant will have two queues inside the planner, a compaction queue and a clean up queue, similar to how the query frontend currently holds queues of pending queries. - -Once a compactor scheduler pushes a job to a compactor, the job is no longer available. Every set interval, or once the compaction is done, a compactor will update the compactor schedule the current status of the compaction job. If a compactor does not provide an update to the scheduler within a timeout, the compaction job becomes available to be assigned to other compactors. - -#### Concurrency - -To achieve concurrency within a single tenant, compactor scheduler will push jobs to compactors. Compactors are shuffle-sharded by tenant id, to prevent a large tenant from impacting the compaction of other tenants. Compactor will download blocks from long term storage, compact, and upload. Compactor will also pull from the clean up queues from scheduler, and delete blocks marked for deletion. - -#### Consistency - -On resharding of compactor schedulers, a tenant might move to a different scheduler. We can either drop the current compactor job in order to prevent duplicate compaction jobs, or continue compaction. I propose that the compactor drops the compaction job if the compaction group no longer belongs to the original compactor scheduler. This way, we do not have duplicate compactions happening, and we can minimize work wasted. - -### Contribute to Thanos for a more scalable compactor - -Instead of introducing parallelism on the Cortex compactor level, we move the parallelism to the Thanos compactor itself. Thanos has a [proposal to make compactor more scalable](https://docs.google.com/document/d/1xi0V8DB0hE54XgkogJRnNL6yH7C5JThJywlLFoC6dCQ/), and a [PR](https://github.com/thanos-io/thanos/pull/3807). Cortex will enjoy higher throughput per tenant if Thanos is able to speed up the compaction, and we can keep the Cortex architecture the same. However, this approach means that a single tenant is still sharded to a single compactor. In order to compact more groups at once, we must scale up compactor vertically. Although vertical scaling can get us far, we should scale horizontally where we can. diff --git a/docs/sources/proposals/receiving_metadata.md b/docs/sources/proposals/receiving_metadata.md deleted file mode 100644 index 4bbb47bfffb..00000000000 --- a/docs/sources/proposals/receiving_metadata.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "Support metadata API" -linkTitle: "Support metadata API" -weight: 1 -slug: support-metadata-api ---- - -- Author: @gotjosh -- Reviewers: @gouthamve, @pracucci -- Date: March 2020 -- Status: Accepted - -## Problem Statement - -Prometheus holds metric metadata alongside the contents of a scrape. This metadata (`HELP`, `TYPE`, `UNIT` and `METRIC_NAME`) enables [some Prometheus API](https://github.com/prometheus/prometheus/issues/6395) endpoints to output the metadata for integrations (e.g. [Grafana](https://github.com/grafana/grafana/pull/21124)) to consume it. - -At the moment of writing, Cortex does not support the `api/v1/metadata` endpoint that Prometheus implements as metadata was never propagated via remote write. Recent [work is done in Prometheus](https://github.com/prometheus/prometheus/pull/6815/files) enables the propagation of metadata. - -With this in place, remote write integrations such as Cortex can now receive this data and implement the API endpoint. This results in Cortex users being able to enjoy a tiny bit more insight on their metrics. - -## Potential Solutions - -Before we delve into the solutions, let's set a baseline about how the data is received. This applies almost equally for the two. - -Metadata from Prometheus is sent in the same [`WriteRequest` proto message](https://github.com/prometheus/prometheus/blob/master/prompb/remote.proto) that the samples use. It is part of a different field (#3 given #2 is already [used interally](https://github.com/cortexproject/cortex/blob/master/pkg/ingester/client/cortex.proto#L36)), the data is a set identified by the metric name - that means it is aggregated across targets, and is sent all at once. Implying, Cortex will receive a single `WriteRequest` containing a set of the metadata for that instance at an specified interval. - -. It is also important to note that this current process is an intermediary step. Eventually, metadata in a request will be sent alongside samples and only for those included. The solutions proposed, take this nuance into account to avoid coupling between the current and future state of Prometheus, and hopefully do something now that also works for the future. - -As a reference, these are some key numbers regarding the size (and send timings) of the data at hand from our clusters at Grafana Labs: - -- On average, metadata (a combination of `HELP`, `TYPE`, `UNIT` and `METRIC_NAME`) is ~55 bytes uncompressed. -- at GL, on an instance with about 2.6M active series, we hold ~1241 unique metrics in total. -- with that, we can assume that on a worst-case scenario the metadata set for that instance is ~68 kilobytes uncompressed. -- by default, this data is only propagated once every minute (aligning with the default scrape interval), but this can be adjusted. -- Finally, what this gives us is a baseline worst-case scenario formula for the data to store per tenant: `~68KB * Replication Factor * # of Instances`. Keeping in mind that typically, there's a very high overlap of metadata across instances, and we plan to deduplicate in the ingesters. - -### Write Path - -1. Store the metadata directly from the distributors into a cache (e.g. Memcached) - -Since metadata is received all at once, we could directly store into an external cache using the tenant ID as a key, and still, avoid a read-modify-write. However, a very common use case of Cortex is to have multiple Prometheus sending data for the same tenant ID. This complicates things, as it adds a need to have an intermediary merging phase and thus making a read-modify-write inevitable. - -2. Keep metadata in memory within the ingesters - -Similarly to what we do with sample data, we can keep the metadata in-memory in the ingesters and apply similar semantics. I propose to use the tenant ID as a hash key, distribute it to the ingesters (taking into account the replication factor), using a hash map to keep a set of the metadata across all instances for a single tenant, and implement a configurable time-based purge process to deal with metadata churn. Given, we need to ensure fair-use we also propose implementing limits for both the number of metadata entries we can receive and the size of a single entry. - -### Read Path - -In my eyes, the read path seems to only have one option. At the moment of writing, Cortex uses a [`DummyTargetRetriever`](https://github.com/cortexproject/cortex/blob/master/pkg/querier/dummy.go#L11-L20) as a way to signal that these API endpoints are not implemented. We'd need to modify the Prometheus interface to support a `Context` and extract the tenant ID from there. Then, use the tenant ID to query the ingesters for the data, deduplicate it and serve it. - -## Conclusions - -I conclude that solution #2 is ideal for this work on the write path. It allows us to use similar semantics to samples, thus reducing operational complexity, and lays a groundwork for when we start receiving metadata alongside samples. - -There's one last piece to address: Allowing metadata to survive rolling restarts. Option #1 handles this well, given the aim would be to use an external cache such as Memcached. Option #2 lacks this, as it does not include any plans to persist this data. Given Prometheus (by default) sends metadata every minute, and we don't need a high level of consistency. We expect that an eventual consistency of up to 1 minute on the default case is deemed acceptable. - -## References - -- [Prometheus Propagate metadata via Remote Write Design Doc](https://docs.google.com/document/d/1LoCWPAIIbGSq59NG3ZYyvkeNb8Ymz28PUKbg_yhAzvE/edit#) -- [Prometheus Propagate metadata via Remote Write Design Issue](https://github.com/prometheus/prometheus/issues/6395) diff --git a/docs/sources/proposals/scalable-alertmanager.md b/docs/sources/proposals/scalable-alertmanager.md deleted file mode 100644 index 99798725720..00000000000 --- a/docs/sources/proposals/scalable-alertmanager.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: "Scalable Alertmanager" -linkTitle: "Scalable Alertmanager" -weight: 1 -slug: scalable-alertmanager ---- - -- Author: [Josh Abreu](https://github.com/gotjosh) -- Date: December 2020 -- Status: Accepted - -## Context and Background - -The Cortex Alertmanager at its current state supports high-availability by using the same technique as the upstream Prometheus Alertmanager: we gossip silences and notifications between replicas to achieve eventual consistency. This allows us to tolerate machine failure without interruption of service. The caveat here is traffic between the ruler and Alertmanagers must not be load balanced as alerts themselves are not gossiped. - -By itself it is not horizontally scalable; it is recommended to run a maximum of 3 replicas (for high availability). Each alertmanager replica will contain an internal instance for every tenant. The Alertmanager uses roughly ~3.7MB of memory and ~0.001 CPU cores per tenant, with an average tenant having ~10 active alerts and ~1 silences. These stats were measured from a cluster with ~80 QPS (Alerts received Per Second), ~40 NPS (Notifications Per Second), and ~700 configurations over a single replica. - -## Problem and Requirements - -Current numbers show a reasonably sized machine can handle 2000 tenants in the current service. We would like to be able to scale this up to 10x without increasing the machine size; i.e. we would like to make Cortex Alertmanager service horizontally scalable. - -Furthermore, we desire to preserve the following characteristics: - -- A single Cortex Alertmanager replica crashing or exiting abruptly should not cause externally-visible downtime or failure to deliver notifications. -- Users should have an eventually consistent view of all the alerts current firing and under active notification, favouring availability of the Cortex Alertmanager over consistency. -- We should be able to scale up, down and roll out new versions of the service without any service interruption or data loss. - -## Design - -This is a big design, and as such we have divided the problem up into 4 areas: Routing & Sharding, Persistence & State, Replication & Consistency, and Architecture. The options and solutions I propose are divided along these lines to aid clarity. - -### Routing & Sharding - -To achieve horizontal scalability, we need to distribute the workload among replicas of the service. We need to choose an appropriate field to use to distribute the workload. The field must be present on all the API requests to the Alertmanager service. - -**We propose the sharding on Tenant ID**. The simplicity of this implementation, would allow us to get up and running relatively quickly whilst helping us validate assumptions. We intend to use the existing ring code to manage this. Other options such as tenant ID + receiver or Tenant ID + route are relatively complex as distributor components (in this case the Ruler) would need to be aware of Alertmanager configuration. - -### Persistence & State - -Alertmanager is a stateful service; it stores the notification state and configured silences. By default, Alertmanager persists its state to disk every 15mins. In the horizontally scalable Alertmanager service, we need to move this state around as the number of replicas grows and shrinks. We also need to persist this state across restarts and rolling upgrades. - -**We propose** making each Alertmanager replica flush the state to object storage, under its own key that’s a combination of tenant ID + replica periodically. This state on durable storage will only be used when cold-starting the cluster. - -This mechanism covers multiple challenges (scaling up & down, rolling restarts, total cluster failure). **To top this off, in the implementation, we’ll always try to request state from other replicas in the cluster before ever trying to go to object storage.** - -### Replication & Consistency - -Upstream Alertmanager replicates notification state between replicas to ensure notifications are not sent more than once. Cortex Alertmanager does the same. When we move to a model where AM instances for a given tenant only live on a subset of replicas, we have to decide how we will keep these replicas in sync. - -**We have an option of doing nothing** and use the existing gossip mechanism and gossip all tenants state to all replicas. The AM Router will then drop state updates for tenants which don’t shard to a given replica. I think this will be easy to implement as it requires few changes but probably won’t scale. - -**However, I propose we Synchronized state over gRPC.** The upstream Alertmanager notification dispatcher uses a timeout-based approach for its notifications. Using the “peer order”, it’ll wait a certain amount of time before letting other replicas know if this notification succeeded or not. If it didn’t, the next replica in line will try to send the notification. We propose to communicate this via gRPC calls. - -While I propose the use of gRPC, is good to note that doing nothing is still a solid candidate for consideration but not having to maintain and operate two separate replication patterns feels like a win. - -### Architecture - -To implement the sharding strategy we need a component in charge of handling incoming alerts and API requests, distributing it to the corresponding shard. - -The idea here is to have an “Alertmanager Distributor” as a first stop in the reception of alerts. Once alerts are received, the component is in charge of validating the alerts against the limits. Validated alerts are then sent to multiple managers in parallel. - -The individual pieces of this component (sharding, limits) cannot be optional - the optional part of it is where we decide to run it. - -We can either run it as a separate service or embed it. **I propose we simply embed it**. At its core it’ll be simpler to operate. With future work making it possible to run as a separate service so that operators can scale when/if needed. - -## Conclusion - -Under the assumption we implement the options proposed above, our architecture looks like this: - -![Scalable Alertmanager Architecture](/images/proposals/scalable-am.png) - -**POST /api/v1/alerts (from the ruler) can go to any Alertmanager replica.** The AM distributor uses the ring to write alerts to a quorum of AM managers (reusing the existing code). We continue to use the same in-memory data structure from the upstream Alertmanager to save alerts and notify other pieces - -**GET /api/v1/alerts and /api/v1/alerts/group** uses the ring to find the right alertmanager replicas for the given tenant. They read from a quorum of alertmanager replicas and return an union of the results. - -**Alertmanager state is replicated between instances to keep them in sync**. Where the state is replicated to to is controlled by the ring. diff --git a/docs/sources/proposals/scalable-query-frontend.md b/docs/sources/proposals/scalable-query-frontend.md deleted file mode 100644 index cd2a791e532..00000000000 --- a/docs/sources/proposals/scalable-query-frontend.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Scaling the Query Frontend" -linkTitle: "Scaling the Query Frontend" -weight: 60 -slug: scaling-query-frontend ---- - -Historically scaling the Cortex query frontend has [posed some challenges](../proposals/scalable-query-frontend.md). -This document aims to detail how to use some added configuration parameters to correctly scale the frontend. -Note that these instructions apply in both the HA single binary scenario or microservices mode. - -## Scaling the Query Frontend - -For every query frontend the querier adds a [configurable number of concurrent workers](https://github.com/cortexproject/cortex/blob/1797adfed2979f6096c3305b0dc9162c1ec0c046/pkg/querier/worker/worker.go#L212) -which are each capable of executing a query. -Each worker is connected to a single query frontend instance, therefore scaling up the query frontend impacts the amount of work each individual querier is attempting to do at any given time. - -Scaling up may cause a querier to attempt more work than they are configured for due to restrictions such as memory and cpu limits. -Additionally, the PromQL engine itself is limited in the number of queries it can do as configured by the `-querier.max-concurrent` parameter. -Attempting more queries concurrently than this value causes the queries to queue up in the querier itself. - -For similar reasons scaling down the query frontend may cause a querier to not use its allocated memory and cpu effectively. -This will lower effective resource utilization. -Also, because individual queriers will be doing less work, this may cause increased queueing in the query frontends. - -### Query Scheduler - -Query scheduler is a service that moves the in-memory queue from query frontend to a separate component. -This makes scaling query frontend easier, as it allows running multiple query frontends without increasing the number of queues. - -In order to use query scheduler, both query frontend and queriers must be configured with query scheduler address -(using `-frontend.scheduler-address` and `-querier.scheduler-address` options respectively). - -Note that querier will only fetch queries from query frontend or query scheduler, but not both. -`-querier.frontend-address` and `-querier.scheduler-address` options are mutually exclusive, and at most one can be set. - -When using query scheduler, it is recommended to run two query scheduler instances. -Running only one query scheduler poses a risk of increased query latency when single scheduler crashes or restarts. -Running two query-schedulers should be enough even for large Cortex clusters with an high QPS. - -When using single-binary mode, Cortex defaults to run **without** query scheduler. - -### DNS Configuration / Readiness - -When a new frontend is first created on scale up it will not immediately have queriers attached to it. -The existing endpoint `/ready` returns HTTP 200 status code only when the query frontend is ready to serve queries. -Make sure to configure this endpoint as a healthcheck in your load balancer, -otherwise a query frontend scale up event might result in failed queries or high latency for a bit while queriers attach. - -When using query frontend with query scheduler, `/ready` will report 200 status code only after frontend discovers some schedulers via DNS resolution. diff --git a/docs/sources/proposals/shuffle-sharding-and-zone-awareness.md b/docs/sources/proposals/shuffle-sharding-and-zone-awareness.md deleted file mode 100644 index dbfb31da705..00000000000 --- a/docs/sources/proposals/shuffle-sharding-and-zone-awareness.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: "Shuffle sharding and zone awareness" -linkTitle: "Shuffle sharding and zone awareness" -weight: 1 -slug: shuffle-sharding-and-zone-awareness ---- - -- Author: @pracucci, @tomwilkie, @pstibrany -- Reviewers: -- Date: August 2020 -- Status: Accepted, implemented in [PR #3090](https://github.com/cortexproject/cortex/pull/3090) - -## Shuffle sharding and zone awareness - -### Background - -Cortex shards the received series across all available ingesters. In a multi-tenant cluster, each tenant series are sharded across all ingesters. This allows to horizontally scale the series across the pool of ingesters but also suffers some issues: - -1. Given every tenant writes series to all ingesters, there’s no isolation between tenants - a single misbehaving tenant can affect the whole cluster. -2. Each ingester needs an open TSDB per tenant per ingester - which has significant memory overhead. The larger the number of tenants, the higher the TSDB memory overhead, regardless of the number of series stored in each TSDB. -3. Similarly, the number of uploaded blocks to the storage every 2 hours is a function of the number of TSDBs open for each ingester. A cluster with a large number of small tenants will upload a very large number of blocks to the storage, each block being very small, increasing the number of API calls against the storage bucket. - -Cortex currently supports sharding a tenant to a subset of the ingesters on the write path [PR](https://github.com/cortexproject/cortex/pull/1947), using a feature called “**subring**”. However, the current subring implementation suffers two issues: - -1. **No zone awareness:** it doesn’t guarantee selected instances are balanced across availability zones -2. **No shuffling:** the implementation is based on the hash ring and it selects N consecutive instances in the ring. This means that, instead of minimizing the likelihood that two tenants share the same instances, it emphasises it. In order to provide a good isolation between tenants, we want to minimize the chances that two tenants share the same instances. - -### Goal - -The goal of this work is to fix “shuffling” and “zone-awareness” when building the subring for a given tenant, honoring the following properties: - -- **Stability:** given the same ring, the algorithm always generates the same subring for a given tenant, even across different machines -- [**Consistency:**](https://en.wikipedia.org/wiki/Consistent_hashing) when the ring is resized, only n/m series are remapped on average (where n is the number of series and m is the number of replicas). -- **Shuffling:** probabilistically and for a large enough cluster, ensure every tenant gets a different set of instances, with a reduced number of overlapping instances between two tenants to improve failure isolation. -- **Zone-awareness (balanced):** the subring built for each tenant contains a balanced number of instances for each availability zone. Selecting the same number of instances in each zone is an important property because we want to preserve the balance of in-memory series across ingesters. Having less replicas in one zone will mean more load per node in this zone, which is something we want to avoid. - -### Proposal - -This proposal is based on [Amazon’s Shuffle Sharding article](https://aws.amazon.com/builders-library/workload-isolation-using-shuffle-sharding/) and the algorithm has been inspired by shuffle sharding implementation in the [AWS Route53 infima library](https://github.com/awslabs/route53-infima/blob/master/src/main/java/com/amazonaws/services/route53/infima/SimpleSignatureShuffleSharder.java). - -Given a tenant and a shard size S (number of instances to which tenant data/workload should be sharded to), we build a subring selecting N instances from each zone, where N = ceil(S / num of zones). The shard size S is required to be a multiple of the number of zones, in order to select an equal number of instances from each zone. - -To do it, we **treat each zone as a separate ring** and select N unique instances from each zone. The instances selection process works as follow: - -1. Generate a seed based on the tenant ID -2. Initialise a pseudo random number generator with the tenant’s seed. The random generator must guarantee predictable numbers given the same input seed. -3. Generate a sequence of N random numbers, where N is the number of instances to select from the zone. Each random number is used as a “token” to look up instances in the ring. For each random number: - - Lookup the instance holding that token in the ring - - If the instance has not been previously selected, then pick it - - If the instance was previously selected (we call this a “collision”), then continue walking the ring clockwise until we find an instance which has not been selected yet - -### Guaranteed properties - -#### Stability - -The same tenant ID always generates the same seed. Given the same seed, the pseudo number random generator always generates the same sequence of numbers. - -This guarantees that, given the same ring, we generate the same exact subring for a given tenant. - -#### Consistency - -The consistency property is honored by two aspects of the algorithm: - -1. The quantity of random numbers generated is always equal to the shard size S, even in case of “collisions”. A collision is when the instance holding the random token has already been picked and we need to select a different instance which has not been picked yet. -2. In case of collisions, we select the “next” instance continuing walking the ring instead of generating another random number - -##### Example adding an instance to the ring - -Let’s consider an initial ring with 3 instances and 1 zone (for simplicity): - -- I1 - Tokens: 1, 8, 15 -- I2 - Tokens: 5, 11, 19 -- I3 - Tokens: 7, 13, 21 - -With a replication factor = 2, the random sequence looks up: - -- 3 (I2) -- 6 (I1) - -Then we add a new instance and the **updated ring** is: - -- I1 - Tokens: 1, 8, 15 -- I2 - Tokens: 5, 11, 19 -- I3 - Tokens: 7, 13, 21 -- I4 - Tokens: 4, 7, 17 - -Now, let’s compare two different algorithms to solve collisions: - -- Using the random generator:
- Random sequence = 3 (**I4**), 6 (I4 - collision), 12 (**I3**)
- **all instances are different** (I4, I3) -- Walking the ring:
- Random sequence = 3 (**I4**), 6 (I4 - collision, next is **I1**)
- **only 1 instance is different** (I4, I1) - -#### Shuffling - -Unless when resolving collisions, the algorithm doesn’t walk the ring to find the next instances, but uses a sequence of random numbers. This guarantees instances are shuffled, between different tenants, when building the subring. - -#### Zone-awareness - -We treat each zone as a separate ring and select an equal number of instances from each zone. This guarantees a fair balance of instances between zones. - -### Proof of concept - -We’ve built a [reference implementation](https://github.com/cortexproject/cortex/pull/3090) of the proposed algorithm, to test the properties described above. - -In particular, we’ve observed that the [actual distribution](https://github.com/cortexproject/cortex/pull/3090/files#diff-121ffce90aa9932f6b87ffd138e0f36aR281) of matching instances between different tenants is very close to the [theoretical one](https://docs.google.com/spreadsheets/d/1FXbiWTXi6bdERtamH-IfmpgFq1fNL4GP_KX_yJvbRi4/edit), as well as consistency and stability properties are both honored. diff --git a/docs/sources/proposals/shuffle-sharding-on-the-read-path.md b/docs/sources/proposals/shuffle-sharding-on-the-read-path.md deleted file mode 100644 index 88727ceb95d..00000000000 --- a/docs/sources/proposals/shuffle-sharding-on-the-read-path.md +++ /dev/null @@ -1,347 +0,0 @@ ---- -title: "Shuffle sharding on the read path" -linkTitle: "Shuffle sharding on the read path" -weight: 1 -slug: shuffle-sharding-on-the-read-path ---- - -- Author: @pracucci, @tomwilkie, @pstibrany -- Reviewers: -- Date: August 2020 -- Status: Proposed, partially implemented - -## Background - -Cortex currently supports sharding of tenants to a subset of the ingesters on the write path [PR](https://github.com/cortexproject/cortex/pull/1947). - -This feature is called “subring”, because it computes a subset of nodes registered to the hash ring. The aim of this feature is to improve isolation between tenants and reduce the number of tenants impacted by an outage. - -This approach is similar to the techniques described in [Amazon’s Shuffle Sharding article](https://aws.amazon.com/builders-library/workload-isolation-using-shuffle-sharding/), but currently suffers from a non random selection of nodes (_proposed solution below_). - -Cortex can be **configured** with a default subring size, and then it can be [customized on a per-tenant basis](https://cortexmetrics.io/docs/configuration/configuration-file/#limits_config). The per-tenant configuration is live reloaded during runtime and applied without restarting the Cortex process. - -The subring sharding currently supports only the write-path. The read-path is not shuffle sharding aware. For example, an outage of more than one ingester with RF=3 will affect all tenants, or a particularly noisy tenant wrt queries has the ability to affect all tenants. - -## Goals - -The Cortex **read path should support shuffle sharding to isolate** the impact of an outage in the cluster. The shard size must be dynamically configurable on a per-tenant basis during runtime. - -This deliverable involves introducing shuffle sharding in: - -- **Query-frontend → Querier** (for queries sharding) [PR #3113](https://github.com/cortexproject/cortex/pull/3113) -- **Querier → Store-gateway** (for blocks sharding) [PR #3069](https://github.com/cortexproject/cortex/pull/3069) -- **Querier→ Ingesters** (for queries on recent data) -- **Ruler** (for rule and alert evaluation) - -### Prerequisite: fix subring shuffling - -The solution is implemented in https://github.com/cortexproject/cortex/pull/3090. - -#### The problem - -The subring is a subset of nodes that should be used for a specific tenant. - -The current subring implementation doesn’t shuffle tenants across nodes. Given a tenant ID, it finds the first node owning the hash(tenant ID) token and then it picks N distinct consecutive nodes walking the ring clockwise. - -For example, in a cluster with 6 nodes (numbered 1-6) and a replication factor of 3, three tenants (A, B, C) could have the following shards: - -| Tenant ID | Node 1 | Node 2 | Node 3 | Node 4 | Node 5 | Node 6 | -| --------- | ------ | ------ | ------ | ------ | ------ | ------ | -| A | x | x | x | | | -| B | | x | x | x | | -| C | | | x | x | x | - -#### Proposal - -We propose to build the subring picking N distinct and random nodes registered in the ring, using the following algorithm: - -1. SID = tenant ID -2. SID = hash(SID) -3. Look for the node owning the token range containing FNV-1a(SID) -4. Loop to (2) until we’ve found N distinct nodes (where N is the shard size) - -_hash() function to be decided. The required property is to be strong enough to not generate loops across multiple subsequent hashing of the previous hash._ - -### Query-frontend → Queriers shuffle sharding - -Implemented in https://github.com/cortexproject/cortex/pull/3113. - -### How querier runs query-frontend jobs - -Today **each** querier connects to **each** query-frontend instance, and calls a single “Process” method via gRPC. - -“Process” is a bi-directional streaming gRPC method – using the server-to-client stream for sending requests from query-frontend to the querier, and client-to-server stream for returning results from querier to the query-frontend. NB this is the opposite of what might be considered normal. Query-frontend scans all its queues with pending query requests, and picks a query to execute based on a fair schedule between tenants. - -The query request is then sent to an idle querier worker over the stream opened in the Process method, and the query-frontend then waits for a response from querier. This loop repeats until querier disconnects. - -### Proposal - -To support shuffle sharding, Query-Frontends will keep a list of connected Queriers, and randomly (but consistently between query-frontends) choose N of them to distribute requests to. When Query-Frontend looks for the next request to send to a given querier, it will only consider tenants that “belong” to the Querier. - -To choose N Queriers for a tenant, we propose to use a simple algorithm: - -1. Sort all Queriers by their ID -2. SID = tenant ID -3. SID = hash(SID) -4. Pick the querier from the list of sorted queries with:
- index = FNV-1a(SID) % number of Queriers -5. Loop to (3) until we’ve found N distinct queriers (where N is the shard size) and stop early if there aren’t enough queriers - -_hash() function to be decided. The required property is to be strong enough to not generate loops across multiple subsequent hashing of the previous hash._ - -### Properties - -- **Stability:** this will produce the same result on all query-frontends as long as all queriers are connected to all query-frontends. -- **Simplicity:** no external dependencies. -- **No consistent hashing:** adding/removing queriers will cause “resharding” of tenants between queriers. While in general that’s not desirable property, queriers are stateless so it doesn’t seem to matter in this case. - -### Implementation notes - -- **Caching:** once this list of queriers to use for a tenant is computed in the query-frontend, it is cached in memory until queriers are added or removed. Per-tenant cache entries will have a TTL to discard tenants not “seen” since a while. -- **Querier ID:** Query-frontends currently don’t have any identity for queriers. We need to introduce sending of a unique ID (eg. hostname) by querier to query-frontend when it calls “Process” method. -- **Backward-compatibility:** when querier shuffle sharding is enabled, the system expects that both query-frontend and querier will run a compatible version. Cluster version upgrade will require to rollout new query-frontends and queriers first, and then enable shuffle sharding. -- **UI:** we propose to expose the current state of the query-frontend through a new endpoint which should display: - - Which querier are connected to the query-frontend - - Are there any “old” queriers, that are receiving requests from all tenants? - - Mapping of tenants to queriers. Note that this mapping may only be available for tenants with pending requests on given query-frontend, and therefore be very dynamic. - -### Configuration - -- **Shard size** will be configurable on a per-tenant basis via existing “runtime-configuration” mechanism (limits overrides). Changing a value for a tenant needs to invalidate cached per-tenant queriers. -- Queriers shard size will be a different setting than then one used for writes. - -### Evaluated alternatives - -#### Use the subring - -An alternative option would be using the subring. This implies having queriers registering to the hash ring and query-frontend instances using the ring client to find the queriers subring for each tenant. - -This solution looks adding more complexity without any actual benefit. - -#### Change query-frontend → querier architecture - -Completely different approach would be to introduce a place where starting queriers would register (eg. DNS-based service discovery), and let query-frontends discover queriers from this central registry. - -Possible benefit would be that queriers don’t need to initiate connection to all query-frontends, but query-frontends would only connect to queriers for which they have actual pending requests. However this would be a significant redesign of how query-frontend / querier communication works. - -## Querier → Store-gateway shuffle sharding - -Implemented in https://github.com/cortexproject/cortex/pull/3069. - -### Introduction - -As of today, the store-gateway supports blocks sharding with customizable replication factor (defaults to 3). Blocks of a single tenant are sharded across all store-gateway instances and so to execute a query the querier may touch any store-gateway in the cluster. - -The current sharding implementation is based on a **hash ring** formed by store-gateway instances. - -### Proposal - -The proposed solution to add shuffle sharding support to the store-gateway is to **leverage on the existing hash ring** to build a per-tenant **subring**, which is then used both by the querier and store-gateway to know to which store-gateway a block belongs to. - -### Configuration - -- Shuffle sharding can be enabled in the **store-gateway configuration.** It supports a **default sharding factor,** which is **overridable on a per-tenant basis** and live reloaded during runtime (using the existing limits config). -- The querier already requires the store-gateway configuration when the blocks sharding is enabled. Similarly, when shuffle sharding is enabled the querier will require the store-gateway shuffle sharding configuration as well. - -### Implementation notes - -When shuffle sharding is enabled: - -- The **store-gateway** `syncUsersBlocks()` will build a tenant’s subring for each tenant found scanning the bucket and will skip any tenant not belonging to its shard.
- Likewise, ShardingMetadataFilter will first build a **tenant’s subring** and then will use the existing logic to filter out blocks not belonging to store-gateway instance itself. The tenant ID can be read from the block’s meta.json. -- The **querier** `blocksStoreReplicationSet.GetClientsFor()` will first build a **tenant’s subring** and then will use the existing logic to find out to which store-gateway instance each requested block belongs to. - -### Evaluated alternatives - -_Given the store-gateways already form a ring and building the shuffle sharding based on the ring (like in the write path) doesn’t introduce extra operational complexity, we haven’t discussed alternatives._ - -## Querier→ Ingesters shuffle sharding - -We’re currently discussing/evaluating different options. - -### Problem - -Cortex must guarantee query correctness; transiently incorrect results may be cached and returned forever. The main problem to solve when introducing ingesters shuffle sharding on the read path is to make sure that a querier fetch data from all ingesters having at least 1 sample for a given tenant. - -The problem to solve is: how can a querier efficiently find which ingesters have data for a given tenant? Each option must consider the changing of the set of ingesters and the changing of each tenant’s subring size. - -### Proposal: use only the information contained in the ring. - -_This section describes an alternative approach. Discussion is still on-going._ - -The idea is for the queries to be able to deduce what ingesters could possibly hold data for a given tenant by just consulting the ring (and the per-tenant sub ring sizes). We posit that this is possible with only a single piece of extra information: a single timestamp per ingester saying when the ingester first joined the ring. - -#### Scenario: ingester scale up - -When a new ingester is added to the ring, there will be a set of user subrings that see a change: an ingester being removed, and a new one being added. We need to guarantee that for some time period (the block flush interval), the ingester removed is also consulted for queries. - -To do this, during the subring selection if we encounters an ingester added within the time period, we will add this to the subring but continue node selection as before - in effect, selecting an extra ingester: - -```go -var ( - subringSize int - selectedNodes []Node - deadline = time.Now().Add(-flushWindow) -) - -for len(selectedNodes) < subringSize { - token := random.Next() - node := getNodeByToken(token) - for { - if node in selectedNodes { - node = node.Next() - continue - } - if node.Added.After(deadline) { - subringSize++ - selectedNodes.Add(node) - node = node.Next() - continue - ) - selectedNodes.Add(node) - break - ) -} -``` - -#### Scenario: ingester scale down - -When an ingester is permanently removed from the ring it will flush its data to the object store and the subrings containing the removed ingester will gain a “new” ingester. Queries consult the store and merge the results with those from the ingesters, so no data will be missed. - -Queriers and store-gateways will discover newly flushed blocks on next sync (`-blocks-storage.bucket-store.sync-interval`, default 5 minutes). -Multiple ingesters should not be scaled-down within this interval. - -To improve read-performance, queriers and rulers are usually configured with non-zero value of `-querier.query-store-after` option. -This option makes queriers and rulers to consult **only** ingesters when running queries within specified time window (eg. 12h). -During scale-down this needs to be lowered in order to let queriers and rulers use flushed blocks from the storage. - -#### Scenario: increase size of a tenant’s subring - -Node selection for subrings is stable - increasing the size of a subring is guaranteed to only add new nodes to it (and not remove any nodes). Hence, if a tenant’s subring is increase in size the queriers will notice the config change and start consulting the new ingester. - -#### Scenario: decreasing size of a tenant’s subring - -If a tenant’s subring decreases in size, there is currently no way for the queriers to know how big the ring was previously, and hence they will potentially miss an ingester with data for that tenant. - -This is deemed an infrequent operation that we considered banning, but have a proposal for how we might make it possible: - -The proposal is to have separate read subring and write subring size in the config. The read subring will not be allowed to be smaller than the write subring. When reducing the size of a tenant’s subring, operators must first reduce the write subring, and then two hours later when the blocks have been flushed, the read subring. In the majority of cases the read subring will not need to be specified, as it will default to the write subring size. - -### Considered alternative #1: Ingesters expose list of tenants - -A possible solution could be keeping in the querier an in-memory data structure to map each ingester to the list of tenants for which it has some data. This data structure would be constructed at querier startup, and then periodically updated, interpolating two information: - -1. The current state of the ring -2. The list of tenants directly exposed by each ingester (via a dedicated gRPC call) - -#### Scenario: new querier starts up - -When a querier starts up and before getting ready: - -1. It scans all ingesters (discovered via the ring) and fetches the list of tenants for which each ingester has some data -2. For each found tenant (unique list of tenant IDs across all ingesters responses), the querier looks at the current state of the ring and adds to the map the list of ingesters currently assigned to the tenant shard, even if they don’t hold any data yet (because may start receiving series shortly) - -Then the querier watches the ingester ring and rebuilds the in-memory map whenever the ring topology changes. - -#### Scenario: querier receives a query for an unknown tenant - -A new tenant starts remote writing to the cluster. The querier doesn’t know it in its in-memory map, so it adds the tenant on the fly to the map just looking at the current state of the ring. - -#### Scenario: ingester scale up / down - -When a new ingester is added / removed to / from the ring, the ring topology changes and queriers will update the in-memory map. - -#### Scenario: per-tenant shard size increases - -Queriers periodically (every 1m) reload the limits config file. When a tenant shard size change is detected, the querier updates the in-memory map for the affected tenant. - -**Issue:** some time series data may be missing in queries up to 1m. - -#### Edge case: queriers notice the ring topology change before distributors - -Consider the following scenario: - -1. Tenant A shard is composed by ingesters 1,2,3,4,5,6 -2. Tenant A is remote writing 1 single series and gets replicated to ingester 1,2,3 -3. The ring topology changes and tenant A shard is ingesters 1,2,3,7,8,9 -4. Querier notices the ring topology change and updates the in-memory map. Given tenant A series were only on ingester 1,2,3, the querier maps tenant A to ingester 1,2,3 (because of what received from ingesters via gRPC) and 7,8,9 (because of the current state of the ring) -5. Distributor hasn’t updated the ring state yet -6. Tenant A remote writes 1 **new** series, which get replicated to 4,5,6 -7. Distributor updates the ring state -8. **Race condition:** querier will not know that ingesters 4,5,6 contains tenant A data until the next sync - -### Considered alternative #2: streaming updates from ingesters to queriers - -_This section describes an alternative approach._ - -#### Current state - -As of today, queriers discover ingesters via the ring: - -- **Ingesters** register (and update their heartbeat timestamp) to the ring and queriers watch the ring, keeping an in-memory copy of the latest ingesters ring state. -- **Queriers** use the in-memory ring state to discover all ingesters that should be queried at query time. - -#### Proposal - -The proposal is to expose a new gRPC endpoint on ingesters, which allows queriers to receive a stream of real time updates from ingesters about the tenants for which an ingester currently has time series data. - -From the querier side: - -- At **startup** the querier discovers all existing ingesters. For each ingester, the querier calls the ingester’s gRPC endpoint WatchTenants() (to be created). As soon as the WatchTenants() rpc is called, the ingester sends the entire set of tenants to the querier and then will send incremental updates (tenant added or removed from ingester) while the WatchTenants() stream connection is alive. -- If the querier **loses the connection** to an ingester, it will automatically retry (with backoff) while the ingester is within the ring. -- The querier **watches the ring** to discover added/removed ingesters. When an ingester is added, the querier adds the ingester to the pool of ingesters whose state should be monitored via WatchTenants(). -- At **query time,** the querier looks for all ingesters within the ring. There are two options: - 1. The querier knows the state of the ingester: the ingester will be queried only if it contains data for the query’s tenant. - 2. The querier doesn’t know the state of the ingester (eg. because it was just registered to the ring and WatchTenants() hasn’t succeeded yet): the ingester will be queried anyway (correctness first). -- The querier will fine tune [gRPC keepalive](https://godoc.org/google.golang.org/grpc/keepalive) settings to ensure a lost connection between the querier and ingester will be early detected and retried. - -#### Trade-offs - -Pros: - -- The querier logic, used to find ingesters for a tenant’s shard, **does not require to watch the overrides** config file (containing tenant shard size override). Watching the file in the querier is problematic because of introduced delays (ConfigMap update and Cortex file polling) which could lead to distributors apply changes before queriers. -- The querier **never uses the current state of the ring** as a source of information to detect which ingesters have data for a specific tenant. This information comes directly from the ingesters themselves, which makes the implementation less likely to be subject to race conditions. - -Cons: - -- Each querier needs to open a gRPC connection to each ingester. Given gRPC supports multiplexing, the underlying TCP connection could be the same connection used to fetch samples from ingesters at query time, basically having 1 single TCP connection between a querier and an ingester. -- The “Edge case: queriers notice the ring topology change before distributors” described in attempt #1 can still happen in case of delays in the propagation of the state update from an ingester to queriers: - - Short delay: a short delay (few seconds) shouldn’t be a real problem. From the final user perspective, there’s no real difference between this edge case and a delay of few seconds in the ingestion path (eg. Prometheus remote write lagging behind few seconds). In the real case of Prometheus remote writing to Cortex, there’s no easy way to know if the latest samples are missing because has not been remote written yet by Prometheus or any delay in the propagation of this information between ingesters and queriers. - - Long delay: in case of networking issue propagating the state update from an ingester to the querier, the gRPC keepalive will trigger (because of failed ping-pong) and the querier will remove the failing ingesters in-memory data, so the ingester will be always tried by the querier for any query, until the state update will be re-established. - -## Ruler sharding - -### Introduction - -The ruler currently supports rule groups sharding across a pool of rulers. When sharding is enabled, rulers form a hash ring and each ruler uses the ring to check if it should evaluate a specific rule group. - -At a polling interval (defaults to 1 minute), the ruler: - -- List all the bucket objects to find all rule groups (listing is done specifying an empty delimiter so it return objects at any depth) -- For each discovered rule group, the ruler hashes the object key and checks if it belongs to the range of tokens assigned to the ruler itself. If not, the rule group is discarded, otherwise it’s kept for evaluation. - -### Proposal - -We propose to introduce shuffle sharding in the ruler as well, leveraging on the already existing hash ring used by the current sharding implementation. - -The **configuration** will be extended to allow to configure: - -- Enable/disable shuffle sharding -- Default shard size -- Per-tenant overrides (reloaded at runtime) - -When shuffle sharding is enabled: - -- The ruler lists (ListBucketV2) the tenants for which rule groups are stored in the bucket -- The ruler filters out tenants not belonging to its shard -- For each tenant belonging to its shard, the ruler does a ListBucketV2 call with the “/” prefix and with empty delimiter to find all the rule groups, which are then evaluated in the ruler - -The ruler re-syncs the rule groups from the bucket whenever one of the following conditions happen: - -1. Periodic interval (configurable) -2. Ring topology changes -3. The configured shard size of a tenant has changed - -### Other notes - -- The “subring” implementation is unoptimized. We will optimize it as part of this work to make sure no performance degradation is introduced when using the subring vs the normal ring. diff --git a/docs/sources/proposals/tenant-deletion.md b/docs/sources/proposals/tenant-deletion.md deleted file mode 100644 index 4765beec63e..00000000000 --- a/docs/sources/proposals/tenant-deletion.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: "Deletion of Tenant Data from Blocks Storage" -linkTitle: "Deletion of Tenant Data from Blocks Storage" -weight: 1 -slug: tenant-deletion ---- - -- Author: [Peter Stibrany](https://github.com/pstibrany) -- Date: November 2020 -- Status: Accepted - -## Deletion of tenant data - -## Problem - -When a tenant is deleted from the external system that controls access to Cortex, we want to clean up tenants data from Cortex as well. - -## Background - -When using blocks storage, Cortex stores tenant’s data in several places: - -- object store for long-term storage of blocks, -- ingesters disks for short-term storage. Ingesters eventually upload data to long-term storage, -- various caches: query-frontend, chunks, index and metadata, -- object store for rules (separate from blocks), -- object store for alert manager configuration, -- state for alertmanager instances (notifications and silences). - -This document expects that there is an external authorization system in place. -Disabling or deleting the tenant in this system will stop tenants data, queries and other API calls from reaching Cortex. -Note that there may be a delay before disabling or deleting the user, until data / queries fully stop, due to eg. caching in authorization proxies. -Cortex endpoint for deleting a tenant data should be only called after this blocking is in place. - -## Proposal - -### API Endpoints - -#### POST /purger/delete_tenant - -We propose to introduce an `/purger/delete_tenant` API endpoint to trigger data deletion for the tenant. - -While this endpoint works as an “admin” endpoint and should not be exposed directly to tenants, it still needs to know under which tenant it should operate. -For consistency with other endpoints this endpoint would therefore require an `X-Scope-OrgID` header and use the tenant from it. - -It is safe to call “delete_tenant” multiple times. - -#### GET /purger/delete_tenant_status - -To monitor the state of data deletion, another endpoint will be available: `/purger/delete_tenant_status`. -This will return OK if tenant’s data has been fully deleted – no more blocks exist on the long-term storage, alertmanager and rulers are fully stopped and configuration removed. -Similarly to “delete_tenant” endpoint, “delete_tenant_status” will require `X-Scope-OrgID` header. - -### Implementation (asynchronous) - -Purger will implement both API endpoints. -Upon receiving the call to `/purger/delete_tenant` endpoint, Purger will initiate the deletion by writing “deletion marker” objects for specific tenant to following buckets: - -- Blocks bucket -- Ruler configuration bucket -- Alertmanager configuration bucket - -Deletion marker for the tenant will be an object stored under tenant prefix, eg. “//deleted”. -This object will contain the timestamp when it was created, so that we can delete it later based on the specified time period. -We could reuse a subset of the proposed Thanos tombstones format, or use custom format. - -“delete_tenant_status” endpoint will report success, if all of the following are true: - -- There are no blocks for the tenant in the blocks bucket -- There is a “deletion finished” object in the bucket for the tenant in the ruler configuration bucket. -- There is a “deletion finished” object in the bucket for the tenant in the alertmanager configuration bucket. - -See later sections on Ruler and Alertmanager for explanation of “deletion finished” objects. - -### Blocks deletion marker - -Blocks deletion marker will be used by compactor, querier and store-gateway. - -#### Compactor - -Upon discovering the blocks deletion marker, the compactor will start deletion of all blocks that belong to the tenant. -This can take hours to finish, depending on the number of blocks. -Even after deleting all blocks on the storage, ingesters may upload additional blocks for the tenant. -To make sure that the compactor deletes these blocks, the compactor will keep the deletion marker in the bucket. -After a configurable period of time it can delete the deletion marker too. - -To implement deletion, Compactor should use new TenantsCleaner component similar to existing BlocksCleaner (which deletes blocks marked for deletion), and modify UserScanner to ignore deleted tenants (for BlocksCleaner and Compactor itself) or only return deleted tenants (for TenantsCleaner). - -#### Querier, Store-gateway - -These two components scan for all tenants periodically, and can use the tenant deletion marker to skip tenants and avoid loading their blocks into memory and caching to disk (store-gateways). -By implementing this, store-gateways will also unload and remove cached blocks. - -Queriers and store-gateways use metadata cache and chunks cache when accessing blocks to reduce the number of API calls to object storage. -In this proposal we don’t suggest removing obsolete entries from the cache – we will instead rely on configured expiration time for cache items. - -Note: assuming no queries will be sent to the system once the tenant is deleted, implementing support for tenant deletion marker in queriers and store-gateways is just an optimization. -These components will unload blocks once they are deleted from the object store even without this optimization. - -#### Query Frontend - -While query-frontend could use the tenant blocks deletion marker to clean up the cache, we don’t suggest to do that due to additional complexity. -Instead we will only rely on eventual eviction of cached query results from the cache. - -#### Ingester - -Ingesters don’t scan object store for tenants. - -To clean up the local state on ingesters, we will implement closing and deletion of local per-tenant data for idle TSDB. (See Cortex PR #3491). -This requires additional configuration for ingesters, specifically how long to wait before closing and deleting TSDB. -This feature needs to work properly in two different scenarios: - -- Ingester is no longer receiving data due to ring changes (eg. scale up of ingesters) -- Data is received because user has been deleted. - -Ingester doesn’t distinguish between the two at the moment. -To make sure we don’t break queries by accidentally deleting TSDB too early, ingester needs to wait at least `-querier.query-ingesters-within` duration. - -Alternatively, ingester could check whether deletion marker exists on the block storage, when it detects idle TSDB. - -**If more data is pushed to the ingester for a given tenant, ingester will open new TSDB, build new blocks and upload them. It is therefore essential that no more data is pushed to Cortex for the tenant after calling the “delete_tenant” endpoint.** - -#### Ruler deletion marker - -This deletion marker is stored in the ruler configuration bucket. -When rulers discover this marker during the periodic sync of the rule groups, they will - -- stop the evaluation of the rule groups for the user, -- delete tenant rule groups (when multiple rulers do this at the same time, they will race for deletion, and need to be prepared to handle possible “object not found” errors) -- delete local state. - -When the ruler is finished with this cleanup, it will ask all other rulers if they still have any data for the tenant. -If all other rulers reply with “no”, ruler can write “deletion finished” marker back to the bucket. -This allows rulers to ignore the ruler completely, and it also communicates the status of the deletion back to purger. - -Note that ruler currently relies on cached local files when using Prometheus Ruler Manager component. -[This can be avoided now](https://github.com/cortexproject/cortex/issues/3134), and since it makes cleanup simpler, we suggest to modify Cortex ruler implementation to avoid this local copy. - -**Similarly to ingesters, it is necessary to disable access to the ruler API for deleted tenant. -This must be done in external authorization proxy.** - -#### Alertmanager deletion marker - -Deletion marker for alert manager is stored in the alertmanager configuration bucket. Cleanup procedure for alertmanager data is similar to rulers – when individual alertmanager instances discover the marker, they will: - -- Delete tenant configuration -- Delete local notifications and silences state -- Ask other alertmanagers if they have any tenant state yet, and if not, write “deletion finished” marker back to the bucket. - -To perform the last step, Alertmanagers need to find other alertmanager instances. This will be implemented by using the ring, which will (likely) be added as per [Alertmanager scaling proposal](https://github.com/cortexproject/cortex/pull/3574). - -Access to Alertmanager API must be disabled for tenant that is going to be deleted. - -## Alternatives Considered - -Another possibility how to deal with tenant data deletion is to make purger component actively communicate with ingester, compactor, ruler and alertmanagers to make data deletion faster. In this case purger would need to understand how to reach out to all those components (with multiple ring configurations, one for each component type), and internal API calls would need to have strict semantics around when the data deletion is complete. This alternative has been rejected due to additional complexity and only small benefit in terms of how fast data would be deleted. diff --git a/docs/sources/proposals/tenant_retention.md b/docs/sources/proposals/tenant_retention.md deleted file mode 100644 index 6f24a0c3f9a..00000000000 --- a/docs/sources/proposals/tenant_retention.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Retention of Tenant Data from Blocks Storage" -linkTitle: "Retention of Tenant Data from Blocks Storage" -weight: 1 -slug: tenant-retention ---- - -- Author: [Allenzhli](https://github.com/Allenzhli) -- Date: January 2021 -- Status: Proposed - -## Retention of tenant data - -## Problem - -Metric data is growing over time per-tenant, at the same time, the value of data decreases. We want to have a retention policy like prometheus does. In Cortex, data retention is typically achieved via a bucket policy. However, this has two main issues: - -1. Not every backend storage support bucket policies -2. Bucket policies don't easily allow a per-tenant custom retention - -## Background - -### tenants - -When using blocks storage, Cortex stores tenant’s data in object store for long-term storage of blocks, tenant id as part of the object store path. We discover all tenants via scan the root dir of bucket. - -### runtime config - -Using the "overrides" mechanism (part of runtime config) already allows for per-tenant settings. See [runtime-configuration-file](https://cortexmetrics.io/docs/configuration/arguments/#runtime-configuration-file) for more details. Using it for tenant retention would fit nicely. Admin could set per-tenant retention here, and also have a single global value for tenants that don't have custom value set. - -## Proposal - -### retention period field - -We propose to introduce just one new field `RetentionPeriod` in the Limits struct(defined at pkg/util/validation/limits.go). - -`RetentionPeriod` setting how long historical metric data retention period per-tenant. `0` is disable. - -Runtime config is reloaded periodically (defaults to 10 seconds), so we can update the retention settings on-the-fly. - -For each tenant, if a tenant-specific _runtime_config_ value exists, it will be used directly, otherwise, if a default _limits_config_ value exists, then the default value will be used; If neither exists, do nothing. - -### Implementation - -A BlocksCleaner within the Compactor run periodically (which defaults to 15 minutes) and the retention logic will insert into it. The logic should compare retention value to block `maxTime` and blocks that match `maxTime < now - retention` will be marked for delete. - -Blocks deletion is not immediate, but follows a two steps process. See [soft-and-hard-blocks-deletion](https://cortexmetrics.io/docs/blocks-storage/compactor/#soft-and-hard-blocks-deletion) From 1f504dcb17d249f930c9fe137f4420fe64af6907 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Thu, 3 Feb 2022 12:16:32 +0100 Subject: [PATCH 084/168] Fix autoscaling dashboard (#1016) * Fixed autoscaling dashboards Signed-off-by: Marco Pracucci * Fix Signed-off-by: Marco Pracucci * Added PR number to CHANGELOG Signed-off-by: Marco Pracucci --- CHANGELOG.md | 2 +- .../dashboards/mimir-reads.json | 27 ++++++------------- .../dashboards/dashboard-utils.libsonnet | 25 ++++++++--------- .../mimir-mixin/dashboards/reads.libsonnet | 2 +- 4 files changed, 21 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02d1e84ee88..22932b249a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -468,7 +468,7 @@ * [CHANGE] Enabled resources dashboards by default. Can be disabled setting `resources_dashboards_enabled` config field to `false`. #920 * [FEATURE] Added `Cortex / Overrides` dashboard, displaying default limits and per-tenant overrides applied to Mimir. #673 * [FEATURE] Added `Mimir / Tenants` and `Mimir / Top tenants` dashboards, displaying user-based metrics. #776 -* [FEATURE] Added querier autoscaling panels and alerts. #1006 +* [FEATURE] Added querier autoscaling panels and alerts. #1006 #1016 * [ENHANCEMENT] cortex-mixin: Make `cluster_namespace_deployment:kube_pod_container_resource_requests_{cpu_cores,memory_bytes}:sum` backwards compatible with `kube-state-metrics` v2.0.0. [#317](https://github.com/grafana/cortex-jsonnet/pull/317) * [ENHANCEMENT] Cortex-mixin: Include `cortex-gw-internal` naming variation in default `gateway` job names. [#328](https://github.com/grafana/cortex-jsonnet/pull/328) * [ENHANCEMENT] Ruler dashboard: added object storage metrics. [#354](https://github.com/grafana/cortex-jsonnet/pull/354) diff --git a/operations/mimir-mixin-compiled/dashboards/mimir-reads.json b/operations/mimir-mixin-compiled/dashboards/mimir-reads.json index d03a828b77c..2ef50dc4c33 100644 --- a/operations/mimir-mixin-compiled/dashboards/mimir-reads.json +++ b/operations/mimir-mixin-compiled/dashboards/mimir-reads.json @@ -1571,22 +1571,6 @@ "dashes": false, "datasource": "$datasource", "description": "### Scaling metric\nThis panel shows the result of the query used as scaling metric and target/threshold used.\nThe desired number of replicas is computed by HPA as: / .\n\n", - "fieldConfig": { - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Target per replica" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "right" - } - ] - } - ] - }, "fill": 1, "id": 20, "legend": { @@ -1606,7 +1590,12 @@ "pointradius": 5, "points": false, "renderer": "flot", - "seriesOverrides": [ ], + "seriesOverrides": [ + { + "alias": "Target per replica", + "yaxis": 2 + } + ], "spaceLength": 10, "span": 4, "stack": false, @@ -1663,7 +1652,7 @@ "logBase": 1, "max": null, "min": null, - "show": false + "show": true } ] }, @@ -1700,7 +1689,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(keda_metrics_adapter_scaler_errors[$__rate_interval])) +\non(metric) group_left\nlabel_replace(\n kube_horizontalpodautoscaler_spec_target_metric{cluster=~\"$cluster\", namespace=~\"$namespace\", horizontalpodautoscaler=\"keda-hpa-querier\"}\n * 0, \"metric\", \"$1\", \"metric_name\", \"(.+)\"\n)\n", + "expr": "sum by(metric) (rate(keda_metrics_adapter_scaler_errors[$__rate_interval])) +\non(metric) group_left\nlabel_replace(\n kube_horizontalpodautoscaler_spec_target_metric{cluster=~\"$cluster\", namespace=~\"$namespace\", horizontalpodautoscaler=\"keda-hpa-querier\"}\n * 0, \"metric\", \"$1\", \"metric_name\", \"(.+)\"\n)\n", "format": "time_series", "interval": "15s", "intervalFactor": 2, diff --git a/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet b/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet index f2fbf9f774d..cf646ab0815 100644 --- a/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet +++ b/operations/mimir-mixin/dashboards/dashboard-utils.libsonnet @@ -575,24 +575,21 @@ local utils = import 'mixin-utils/utils.libsonnet'; namespace: $.namespaceMatcher(), }, - panelAxisPlacement(seriesName, placement):: { - fieldConfig+: { - overrides+: [ + // panelAxisPlacement allows to place a series on the right axis. + // This function supports the old Graph panel. + panelAxisPlacement(seriesName, placement):: + if placement != 'right' then {} else { + seriesOverrides+: [ { - matcher: { - id: 'byName', - options: seriesName, - }, - properties: [ - { - id: 'custom.axisPlacement', - value: placement, - }, - ], + alias: seriesName, + yaxis: 2, }, ], + // Ensure all Y-axis are displayed (default is that right axis is hidden). + yaxes: std.map(function(entry) entry { + show: true, + }, super.yaxes), }, - }, panelDescription(title, description):: { description: ||| diff --git a/operations/mimir-mixin/dashboards/reads.libsonnet b/operations/mimir-mixin/dashboards/reads.libsonnet index e5ca2b78f5a..48a2794f0c9 100644 --- a/operations/mimir-mixin/dashboards/reads.libsonnet +++ b/operations/mimir-mixin/dashboards/reads.libsonnet @@ -248,7 +248,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; local title = 'Autoscaler failures rate'; $.panel(title) + $.queryPanel( - $.filterKedaMetricByHPA('sum(rate(keda_metrics_adapter_scaler_errors[$__rate_interval]))', $._config.autoscaling.querier_hpa_name), + $.filterKedaMetricByHPA('sum by(metric) (rate(keda_metrics_adapter_scaler_errors[$__rate_interval]))', $._config.autoscaling.querier_hpa_name), 'Failures per second' ) + $.panelDescription( From 0080ea88ad4e265956452eafba6c445c268fd51b Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Thu, 3 Feb 2022 12:08:31 +0000 Subject: [PATCH 085/168] Re-order architectural documentation (#1007) * Made fixes and improvements to the architecture doc Signed-off-by: Jack Baldry Co-authored-by: aldernero * Draft "About the architecture" section * Add weighting to refactored architecture docs * Remove reference to architecture in blocks storage * Ensure title matches first heading Signed-off-by: Jack Baldry --- Makefile | 8 +- docs/sources/architecture.md | 238 ------------------ docs/sources/architecture/_index.md | 80 ++++++ docs/sources/architecture/alertmanager.md | 15 ++ .../compactor.md | 17 +- .../compactor.template | 17 +- docs/sources/architecture/distributor.md | 67 +++++ docs/sources/architecture/ingester.md | 45 ++++ .../querier.md | 5 +- .../querier.template | 5 +- docs/sources/architecture/query-frontend.md | 36 +++ docs/sources/architecture/query-scheduler.md | 23 ++ docs/sources/architecture/ruler.md | 16 ++ .../store-gateway.md | 11 +- .../store-gateway.template | 11 +- docs/sources/blocks-storage/_index.md | 45 ---- docs/sources/getting-started/_index.md | 2 +- docs/sources/images/architecture.png | Bin 0 -> 36966 bytes .../avoid-querying-non-compacted-blocks.png | Bin .../images}/bucket-index-querier-workflow.png | Bin ...tor-horizontal-and-vertical-compaction.png | Bin .../images}/compactor-split-and-merge.png | Bin images/architecture.png | Bin 76137 -> 0 bytes 23 files changed, 331 insertions(+), 310 deletions(-) delete mode 100644 docs/sources/architecture.md create mode 100644 docs/sources/architecture/_index.md create mode 100644 docs/sources/architecture/alertmanager.md rename docs/sources/{blocks-storage => architecture}/compactor.md (94%) rename docs/sources/{blocks-storage => architecture}/compactor.template (91%) create mode 100644 docs/sources/architecture/distributor.md create mode 100644 docs/sources/architecture/ingester.md rename docs/sources/{blocks-storage => architecture}/querier.md (99%) rename docs/sources/{blocks-storage => architecture}/querier.template (99%) create mode 100644 docs/sources/architecture/query-frontend.md create mode 100644 docs/sources/architecture/query-scheduler.md create mode 100644 docs/sources/architecture/ruler.md rename docs/sources/{blocks-storage => architecture}/store-gateway.md (99%) rename docs/sources/{blocks-storage => architecture}/store-gateway.template (97%) create mode 100644 docs/sources/images/architecture.png rename {website/static/images/blocks-storage => docs/sources/images}/avoid-querying-non-compacted-blocks.png (100%) rename {website/static/images/blocks-storage => docs/sources/images}/bucket-index-querier-workflow.png (100%) rename {website/static/images/blocks-storage => docs/sources/images}/compactor-horizontal-and-vertical-compaction.png (100%) rename {website/static/images/blocks-storage => docs/sources/images}/compactor-split-and-merge.png (100%) delete mode 100644 images/architecture.png diff --git a/Makefile b/Makefile index d34d169f1b4..77e0ea1eff3 100644 --- a/Makefile +++ b/Makefile @@ -310,12 +310,12 @@ web-build: web-pre web-deploy: ./tools/website/web-deploy.sh -# Generates the config file documentation. +doc: ## Generates the config file documentation. doc: clean-doc go run ./tools/doc-generator ./docs/sources/configuration/config-file-reference.template > ./docs/sources/configuration/config-file-reference.md - go run ./tools/doc-generator ./docs/sources/blocks-storage/compactor.template > ./docs/sources/blocks-storage/compactor.md - go run ./tools/doc-generator ./docs/sources/blocks-storage/store-gateway.template > ./docs/sources/blocks-storage/store-gateway.md - go run ./tools/doc-generator ./docs/sources/blocks-storage/querier.template > ./docs/sources/blocks-storage/querier.md + go run ./tools/doc-generator ./docs/sources/architecture/compactor.template > ./docs/sources/architecture/compactor.md + go run ./tools/doc-generator ./docs/sources/architecture/store-gateway.template > ./docs/sources/architecture/store-gateway.md + go run ./tools/doc-generator ./docs/sources/architecture/querier.template > ./docs/sources/architecture/querier.md go run ./tools/doc-generator ./docs/sources/operations/encrypt-data-at-rest.template > ./docs/sources/operations/encrypt-data-at-rest.md embedmd -w docs/sources/configuration/prometheus-frontend.md embedmd -w docs/sources/requests-mirroring-to-secondary-cluster.md diff --git a/docs/sources/architecture.md b/docs/sources/architecture.md deleted file mode 100644 index b28d20b0774..00000000000 --- a/docs/sources/architecture.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: "Mimir architecture" -linkTitle: "Architecture" -weight: 2 -slug: architecture ---- - -Mimir consists of multiple horizontally scalable microservices. Each microservice uses the most appropriate technique for horizontal scaling; most are stateless and can handle requests for any users while some (namely the [ingesters](#ingester)) are semi-stateful and depend on consistent hashing. This document provides a basic overview of Mimir’s architecture. - -

Mimir architecture

- -## The role of Prometheus - -Prometheus instances scrape samples from various targets and then push them to Mimir (using Prometheus' [remote write API](https://prometheus.io/docs/prometheus/latest/storage/#remote-storage-integrations)). That remote write API emits batched [Snappy](https://google.github.io/snappy/)-compressed [Protocol Buffer](https://developers.google.com/protocol-buffers/) messages inside the body of an HTTP `PUT` request. - -Mimir requires that each HTTP request bear a header specifying a tenant ID for the request. Request authentication and authorization are handled by an external reverse proxy. - -Incoming samples (writes from Prometheus) are handled by the [distributor](#distributor) while incoming reads (PromQL queries) are handled by the [querier](#querier) or optionally by the [query frontend](#query-frontend). - -## Storage - -The Mimir storage format is based on [Prometheus TSDB](https://prometheus.io/docs/prometheus/latest/storage/): it stores each tenant's time series into their own TSDB which write out their series to a on-disk block (defaults to 2h block range periods). Each block is composed by a few files storing the blocks and the block index. - -The TSDB block files contain the samples for multiple series. The series inside the blocks are then indexed by a per-block index, which indexes metric names and labels to time series in the block files. - -Mimir requires an object store for the block files, which can be: - -- [Amazon S3](https://aws.amazon.com/s3) -- [Google Cloud Storage](https://cloud.google.com/storage/) -- [Microsoft Azure Storage](https://azure.microsoft.com/en-us/services/storage/) -- [OpenStack Swift](https://wiki.openstack.org/wiki/Swift) -- [Local Filesystem](https://thanos.io/storage.md/#filesystem) (single node only) - -For more information, see [Blocks storage](./blocks-storage/_index.md). - -## Services - -Mimir has a service-based architecture, in which the overall system is split up into a variety of components that perform a specific task. These components run separately and in parallel. Mimir can alternatively run in a single process mode, where all components are executed within a single process. The single process mode is particularly handy for local testing and development. - -Mimir is, for the most part, a shared-nothing system. Each layer of the system can run multiple instances of each component and they don't coordinate or communicate with each other within that layer. - -The Mimir services are: - -- [Distributor](#distributor) -- [Ingester](#ingester) -- [Querier](#querier) -- [Query frontend](#query-frontend) (optional) -- [Ruler](#ruler) (optional) -- [Alertmanager](#alertmanager) (optional) -- [Configs API](#configs-api) (optional) - -### Distributor - -The **distributor** service is responsible for handling incoming samples from Prometheus. It's the first stop in the write path for series samples. Once the distributor receives samples from Prometheus, each sample is validated for correctness and to ensure that it is within the configured tenant limits, falling back to default ones in case limits have not been overridden for the specific tenant. Valid samples are then split into batches and sent to multiple [ingesters](#ingester) in parallel. - -The validation done by the distributor includes: - -- The metric labels name are formally correct -- The configured max number of labels per metric is respected -- The configured max length of a label name and value is respected -- The timestamp is not older/newer than the configured min/max time range - -Distributors are **stateless** and can be scaled up and down as needed. - -#### High Availability Tracker - -The distributor features a **High Availability (HA) Tracker**. When enabled, the distributor deduplicates incoming samples from redundant Prometheus servers. This allows you to have multiple HA replicas of the same Prometheus servers, writing the same series to Mimir and then deduplicate these series in the Mimir distributor. - -The HA Tracker deduplicates incoming samples based on a cluster and replica label. The cluster label uniquely identifies the cluster of redundant Prometheus servers for a given tenant, while the replica label uniquely identifies the replica within the Prometheus cluster. Incoming samples are considered duplicated (and thus dropped) if received by any replica which is not the current primary within a cluster. - -The HA Tracker requires a key-value (KV) store to coordinate which replica is currently elected. The distributor will only accept samples from the current leader. Samples with one or no labels (of the replica and cluster) are accepted by default and never deduplicated. - -The supported KV stores for the HA tracker are: - -- [Consul](https://www.consul.io) -- [Etcd](https://etcd.io) - -Note: Memberlist is not supported. Memberlist-based KV store propagates updates using gossip, which is very slow for HA purposes: result is that different distributors may see different Prometheus server as elected HA replica, which is definitely not desirable. - -For more information, please refer to [config for sending HA pairs data to Mimir](guides/ha-pair-handling.md) in the documentation. - -#### Hashing - -Distributors use consistent hashing, in conjunction with a configurable replication factor, to determine which ingester instance(s) should receive a given series. - -The hash is calculated using the metric name, labels and tenant ID. - -There is a trade-off associated with including labels in the hash. Writes are more balanced across ingesters, but each query needs to talk to all ingesters since a metric could be spread across multiple ingesters given different label sets. - -#### The hash ring - -A hash ring (stored in a key-value store) is used to achieve consistent hashing for the series sharding and replication across the ingesters. All [ingesters](#ingester) register themselves into the hash ring with a set of tokens they own; each token is a random unsigned 32-bit number. Each incoming series is [hashed](#hashing) in the distributor and then pushed to the ingester owning the tokens range for the series hash number plus N-1 subsequent ingesters in the ring, where N is the replication factor. - -To do the hash lookup, distributors find the smallest appropriate token whose value is larger than the [hash of the series](#hashing). When the replication factor is larger than 1, the next subsequent tokens (clockwise in the ring) that belong to different ingesters will also be included in the result. - -The effect of this hash set up is that each token that an ingester owns is responsible for a range of hashes. If there are three tokens with values 0, 25, and 50, then a hash of 3 would be given to the ingester that owns the token 25; the ingester owning token 25 is responsible for the hash range of 1-25. - -The supported KV stores for the hash ring are: - -- [Consul](https://www.consul.io) -- [Etcd](https://etcd.io) -- Gossip [memberlist](https://github.com/hashicorp/memberlist) - -#### Quorum consistency - -Since all distributors share access to the same hash ring, write requests can be sent to any distributor and you can setup a stateless load balancer in front of it. - -To ensure consistent query results, Mimir uses [Dynamo-style](https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf) quorum consistency on reads and writes. This means that the distributor will wait for a positive response of at least one half plus one of the ingesters to send the sample to before successfully responding to the Prometheus write request. - -#### Load balancing across distributors - -We recommend randomly load balancing write requests across distributor instances. For example, if you're running Mimir in a Kubernetes cluster, you could run the distributors as a Kubernetes [Service](https://kubernetes.io/docs/concepts/services-networking/service/). - -### Ingester - -The **ingester** service is responsible for writing incoming series to a [long-term storage backend](#storage) on the write path and returning in-memory series samples for queries on the read path. - -Incoming series are not immediately written to the storage but kept in memory and periodically flushed to the storage (2 hours by default). For this reason, the [queriers](#querier) may need to fetch samples both from ingesters and long-term storage while executing a query on the read path. - -Ingesters contain a **lifecycler** which manages the lifecycle of an ingester and stores the **ingester state** in the [hash ring](#the-hash-ring). Each ingester could be in one of the following states: - -- **`PENDING`**
- The ingester has just started. While in this state, the ingester doesn't receive neither write and read requests. -- **`JOINING`**
- The ingester is starting up and joining the ring. While in this state the ingester doesn't receive neither write and read requests. The ingester will load tokens from disk (if `-ingester.tokens-file-path` is configured) or generate a set of new random ones. Finally, the ingester optionally observes the ring for tokens conflicts and then, once any conflict is resolved, will move to `ACTIVE` state. -- **`ACTIVE`**
- The ingester is up and running. While in this state the ingester can receive both write and read requests. -- **`LEAVING`**
- The ingester is shutting down and leaving the ring. While in this state the ingester doesn't receive write requests, while it could receive read requests. -- **`UNHEALTHY`**
- The ingester has failed to heartbeat to the ring's KV Store. While in this state, distributors skip the ingester while building the replication set for incoming series and the ingester does not receive write or read requests. - -Ingesters are **semi-stateful**. - -#### Ingesters failure and data loss - -If an ingester process crashes or exits abruptly, all the in-memory series that have not yet been flushed to the long-term storage will be lost. There are two main ways to mitigate this failure mode: - -1. Replication -2. Write-ahead log (WAL) - -The **replication** is used to hold multiple (typically 3) replicas of each time series in the ingesters. If the Mimir cluster looses an ingester, the in-memory series hold by the lost ingester are also replicated at least to another ingester. In the event of a single ingester failure, no time series samples will be lost while, in the event of multiple ingesters failure, time series may be potentially lost if failure affects all the ingesters holding the replicas of a specific time series. - -The **write-ahead log** (WAL) is used to write to a persistent disk all incoming series samples until they're flushed to the long-term storage. In the event of an ingester failure, a subsequent process restart will replay the WAL and recover the in-memory series samples. - -Contrary to the sole replication and given the persistent disk data is not lost, in the event of multiple ingesters failure each ingester will recover the in-memory series samples from WAL upon subsequent restart. The replication is still recommended in order to ensure no temporary failures on the read path in the event of a single ingester failure. - -#### Ingesters write de-amplification - -Ingesters store recently received samples in-memory in order to perform write de-amplification. If the ingesters would immediately write received samples to the long-term storage, the system would be very difficult to scale due to the very high pressure on the storage. For this reason, the ingesters batch and compress samples in-memory and periodically flush them out to the storage. - -Write de-amplification is the main source of Mimir's low total cost of ownership (TCO). - -### Querier - -The **querier** service handles queries using the [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/) query language. - -Queriers fetch series samples both from the ingesters and long-term storage: the ingesters hold the in-memory series which have not yet been flushed to the long-term storage. Because of the replication factor, it is possible that the querier may receive duplicated samples; to resolve this, for a given time series the querier internally **deduplicates** samples with the same exact timestamp. - -Queriers are **stateless** and can be scaled up and down as needed. - -### Query frontend - -The **query frontend** is an **optional service** providing the querier's API endpoints and can be used to accelerate the read path. When the query frontend is in place, incoming query requests should be directed to the query frontend instead of the queriers. The querier service will be still required within the cluster, in order to execute the actual queries. - -The query frontend internally performs some query adjustments and holds queries in an internal queue. In this setup, queriers act as workers which pull jobs from the queue, execute them, and return them to the query-frontend for aggregation. Queriers need to be configured with the query frontend address (via the `-querier.frontend-address` CLI flag) in order to allow them to connect to the query frontends. - -Query frontends are **stateless**. However, due to how the internal queue works, it's recommended to run a few query frontend replicas to reap the benefit of fair scheduling. Two replicas should suffice in most cases. - -Flow of the query in the system when using query-frontend: - -1. Query is received by query frontend, which can optionally split it or serve from the cache. -2. Query frontend stores the query into in-memory queue, where it waits for some querier to pick it up. -3. Querier picks up the query, and executes it. -4. Querier sends result back to query-frontend, which then forwards it to the client. - -#### Queueing - -The query frontend queuing mechanism is used to: - -- Ensure that large queries, that could cause an out-of-memory (OOM) error in the querier, will be retried on failure. This allows administrators to under-provision memory for queries, or optimistically run more small queries in parallel, which helps to reduce the TCO. -- Prevent multiple large requests from being convoyed on a single querier by distributing them across all queriers using a first-in/first-out queue (FIFO). -- Prevent a single tenant from denial-of-service-ing (DOSing) other tenants by fairly scheduling queries between tenants. - -#### Splitting - -The query frontend splits multi-day queries into multiple single-day queries, executing these queries in parallel on downstream queriers and stitching the results back together again. This prevents large (multi-day) queries from causing out of memory issues in a single querier and helps to execute them faster. - -#### Caching - -The query frontend supports caching query results and reuses them on subsequent queries. If the cached results are incomplete, the query frontend calculates the required subqueries and executes them in parallel on downstream queriers. The query frontend can optionally align queries with their step parameter to improve the cacheability of the query results. The result cache is compatible with any Mimir caching backend (currently memcached, redis, and an in-memory cache). - -### Query Scheduler - -Query Scheduler is an **optional** service that moves the internal queue from query frontend into separate component. -This enables independent scaling of query frontends and number of queues (query scheduler). - -In order to use query scheduler, both query frontend and queriers must be configured with query scheduler address -(using `-frontend.scheduler-address` and `-querier.scheduler-address` options respectively). - -Flow of the query in the system changes when using query scheduler: - -1. Query is received by query frontend, which can optionally split it or serve from the cache. -2. Query frontend forwards the query to random query scheduler process. -3. Query scheduler stores the query into in-memory queue, where it waits for some querier to pick it up. -4. Querier picks up the query, and executes it. -5. Querier sends result back to query-frontend, which then forwards it to the client. - -Query schedulers are **stateless**. It is recommended to run two replicas to make sure queries can still be serviced while one replica is restarting. - -### Ruler - -The **ruler** is an **optional service** executing PromQL queries for recording rules and alerts. The ruler requires a database storing the recording rules and alerts for each tenant. - -Ruler is **semi-stateful** and can be scaled horizontally. -Running rules internally have state, as well as the ring the rulers initiate. -However, if the rulers all fail and restart, -Prometheus alert rules have a feature where an alert is restored and returned to a firing state -if it would have been active in its for period. -However, there would be gaps in the series generated by the recording rules. - -### Alertmanager - -The **alertmanager** is an **optional service** responsible for accepting alert notifications from the [ruler](#ruler), deduplicating and grouping them, and routing them to the correct notification channel, such as email, PagerDuty or OpsGenie. - -The Mimir alertmanager is built on top of the [Prometheus Alertmanager](https://prometheus.io/docs/alerting/alertmanager/), adding multi-tenancy support. Like the [ruler](#ruler), the alertmanager requires a database storing the per-tenant configuration. - -Alertmanager is **semi-stateful**. -The Alertmanager persists information about silences and active alerts to its disk. -If all of the alertmanager nodes failed simultaneously there would be a loss of data. - -### Configs API - -The **configs API** is an **optional service** managing the configuration of Rulers and Alertmanagers. -It provides APIs to get/set/update the ruler and alertmanager configurations and store them into backend. -Current supported backend are PostgreSQL and in-memory. - -Configs API is **stateless**. diff --git a/docs/sources/architecture/_index.md b/docs/sources/architecture/_index.md new file mode 100644 index 00000000000..f648934eb41 --- /dev/null +++ b/docs/sources/architecture/_index.md @@ -0,0 +1,80 @@ +--- +title: "About the architecture" +description: "Overview of the architecture of Grafana Mimir." +weight: 1000 +--- + +# About the architecture + +Grafana Mimir has a service-based architecture. +The system has multiple horizontally scalable microservices that run separately and in parallel. + + + +![Architecture of Grafana Mimir](../images/architecture.png) + +## Microservices + +Most microservices are stateless and don't require any data persisted between process restarts. + +Some microservices are stateful and rely on non-volatile storage to prevent data loss between process restarts. + +A dedicate page describes each microservice in detail. + +`{{< section >}}` + + + +### The write path + +**Ingesters** receive incoming samples from the distributors. Each push request belongs to a tenant, and the ingester appends the received samples to the specific per-tenant TSDB stored on the local disk. The received samples are both kept in-memory and written to a write-ahead log (WAL) and used to recover the in-memory series in case the ingester abruptly terminates. The per-tenant TSDB is lazily created in each ingester as soon as the first samples are received for that tenant. + +The in-memory samples are periodically flushed to disk - and the WAL truncated - when a new TSDB block is created, which by default occurs every 2 hours. Each newly created block is then uploaded to the long-term storage and kept in the ingester until the configured `-blocks-storage.tsdb.retention-period` expires, in order to give [queriers](./querier.md) and [store-gateways](./store-gateway.md) enough time to discover the new block on the storage and download its index-header. + +In order to effectively use the **WAL** and being able to recover the in-memory series upon ingester abruptly termination, the WAL needs to be stored to a persistent disk which can survive in the event of an ingester failure (ie. AWS EBS volume or GCP persistent disk when running in the cloud). For example, if you're running the Mimir cluster in Kubernetes, you may use a StatefulSet with a persistent volume claim for the ingesters. The location on the filesystem where the WAL is stored is the same where local TSDB blocks (compacted from head) are stored and cannot be decoupled. See also the [timeline of block uploads](production-tips/#how-to-estimate--querierquery-store-after) and [disk space estimate](production-tips/#ingester-disk-space). + +#### Distributor series sharding and replication + +Due to the replication factor N (typically 3), each time series is stored by N ingesters, and each ingester writes its own block to the long-term storage. [Compactor](./compactor.md) merges blocks from multiple ingesters into a single block, and removes duplicate samples. After blocks compaction, the storage utilization is significantly reduced. + +For more information, see [Compactor](./compactor.md) and [Production tips](./production-tips.md). + +### The read path + +[Queriers](./querier.md) and [store-gateways](./store-gateway.md) periodically iterate over the storage bucket to discover blocks recently uploaded by ingesters. + +For each discovered block, queriers only download the block's `meta.json` file (containing some metadata including min and max timestamp of samples within the block), while store-gateways download the `meta.json` as well as the index-header, which is a small subset of the block's index used by the store-gateway to lookup series at query time. + +Queriers use the blocks metadata to compute the list of blocks that need to be queried at query time and fetch matching series from the store-gateway instances holding the required blocks. + +For more information, please refer to the following dedicated sections: + + + + + +## The role of Prometheus + +Prometheus instances scrape samples from various targets and then push them to Mimir (using Prometheus' [remote write API](https://prometheus.io/docs/prometheus/latest/storage/#remote-storage-integrations)). That remote write API emits batched [Snappy](https://google.github.io/snappy/)-compressed [Protocol Buffer](https://developers.google.com/protocol-buffers/) messages inside the body of an HTTP `PUT` request. + +Mimir requires that each HTTP request bear a header specifying a tenant ID for the request. Request authentication and authorization are handled by an external reverse proxy. + +Incoming samples (writes from Prometheus) are handled by the [distributor](#distributor) while incoming reads (PromQL queries) are handled by the [querier](#querier) or optionally by the [query frontend](#query-frontend). + +## Storage + +The Mimir storage format is based on [Prometheus TSDB](https://prometheus.io/docs/prometheus/latest/storage/): it stores each tenant's time series into their own TSDB which write their series to an on-disk block (defaults to 2h block range periods). Each block is composed oy a few files storing the blocks and the block index. + +The TSDB block files contain samples for multiple series. The series inside the blocks are then indexed by a per-block index, which indexes metric names and labels to time series in the block files. + +Mimir requires an object store for the block files, which can be: + +- [Amazon S3](https://aws.amazon.com/s3) +- [Google Cloud Storage](https://cloud.google.com/storage/) +- [Microsoft Azure Storage](https://azure.microsoft.com/en-us/services/storage/) +- [OpenStack Swift](https://wiki.openstack.org/wiki/Swift) +- [Local Filesystem](https://thanos.io/storage.md/#filesystem) (single node only) + +For more information, see [Blocks storage](./blocks-storage/_index.md). + + diff --git a/docs/sources/architecture/alertmanager.md b/docs/sources/architecture/alertmanager.md new file mode 100644 index 00000000000..80a7def113f --- /dev/null +++ b/docs/sources/architecture/alertmanager.md @@ -0,0 +1,15 @@ +--- +title: "(Optional) Alertmanager" +description: "Overview of the alertmanager microservice." +weight: 80 +--- + +# (Optional) Alertmanager + +The **alertmanager** is an **optional service** responsible for accepting alert notifications from the [ruler]({{}}), deduplicating and grouping them, and routing them to the correct notification channel, such as email, PagerDuty or OpsGenie. + +The Mimir alertmanager is built on top of the [Prometheus Alertmanager](https://prometheus.io/docs/alerting/alertmanager/), adding multi-tenancy support. Like the [ruler]({{}}), the alertmanager requires a database to store the per-tenant configuration. + +Alertmanager is **semi-stateful**. +The Alertmanager persists information about silences and active alerts to its disk. +If all of the alertmanager nodes failed simultaneously there would be a loss of data. diff --git a/docs/sources/blocks-storage/compactor.md b/docs/sources/architecture/compactor.md similarity index 94% rename from docs/sources/blocks-storage/compactor.md rename to docs/sources/architecture/compactor.md index 4b9870ae300..67b07a505ab 100644 --- a/docs/sources/blocks-storage/compactor.md +++ b/docs/sources/architecture/compactor.md @@ -1,12 +1,19 @@ --- title: "Compactor" -linkTitle: "Compactor" -weight: 4 -slug: compactor +description: "Overview of the compactor microservice." +weight: 10 --- + + +The **[compactor](./compactor.md)** is responsible to merge and deduplicate smaller blocks into larger ones, in order to reduce the number of blocks stored in the long-term storage for a given tenant and query them more efficiently. It also keeps the [bucket index](./bucket-index.md) updated and, for this reason, it's a required component. + +The `alertmanager` and `ruler` components can also use object storage to store its configurations and rules uploaded by users. In that case a separate bucket should be created to store alertmanager configurations and rules: using the same bucket between ruler/alertmanager and blocks will cause issue with the **[compactor](./compactor.md)**. + + + The **compactor** is an service which is responsible to: - Compact multiple blocks of a given tenant into a single optimized larger block. This helps to reduce storage costs (deduplication, index size reduction), and increase query speed (querying fewer blocks is faster). @@ -25,7 +32,7 @@ The **vertical compaction** merges all the blocks of a tenant uploaded by ingest The **horizontal compaction** triggers after the vertical compaction and compacts several blocks with adjacent 2-hour range periods into a single larger block. Even though the total size of block chunks doesn't change after this compaction, it may still significantly reduce the size of the index and the index-header kept in memory by store-gateways. -![Compactor - horizontal and vertical compaction](/images/blocks-storage/compactor-horizontal-and-vertical-compaction.png) +![Compactor - horizontal and vertical compaction](../images/compactor-horizontal-and-vertical-compaction.png) @@ -48,7 +55,7 @@ Given the split blocks, the compactor then runs the **merge** stage for each sha The merge stage is then run for subsequent compaction time ranges (eg. 12h, 24h), compacting together blocks belonging to the same shard (_not shown in the picture below_). -![Compactor - split-and-merge compaction strategy](/images/blocks-storage/compactor-split-and-merge.png) +![Compactor - split-and-merge compaction strategy](../images/compactor-split-and-merge.png) diff --git a/docs/sources/blocks-storage/compactor.template b/docs/sources/architecture/compactor.template similarity index 91% rename from docs/sources/blocks-storage/compactor.template rename to docs/sources/architecture/compactor.template index b054bac3db4..5da51d0708f 100644 --- a/docs/sources/blocks-storage/compactor.template +++ b/docs/sources/architecture/compactor.template @@ -1,12 +1,19 @@ --- title: "Compactor" -linkTitle: "Compactor" -weight: 4 -slug: compactor +description: "Overview of the compactor microservice." +weight: 10 --- {{ .GeneratedFileWarning }} + + +The **[compactor](./compactor.md)** is responsible to merge and deduplicate smaller blocks into larger ones, in order to reduce the number of blocks stored in the long-term storage for a given tenant and query them more efficiently. It also keeps the [bucket index](./bucket-index.md) updated and, for this reason, it's a required component. + +The `alertmanager` and `ruler` components can also use object storage to store its configurations and rules uploaded by users. In that case a separate bucket should be created to store alertmanager configurations and rules: using the same bucket between ruler/alertmanager and blocks will cause issue with the **[compactor](./compactor.md)**. + + + The **compactor** is an service which is responsible to: - Compact multiple blocks of a given tenant into a single optimized larger block. This helps to reduce storage costs (deduplication, index size reduction), and increase query speed (querying fewer blocks is faster). @@ -25,7 +32,7 @@ The **vertical compaction** merges all the blocks of a tenant uploaded by ingest The **horizontal compaction** triggers after the vertical compaction and compacts several blocks with adjacent 2-hour range periods into a single larger block. Even though the total size of block chunks doesn't change after this compaction, it may still significantly reduce the size of the index and the index-header kept in memory by store-gateways. -![Compactor - horizontal and vertical compaction](/images/blocks-storage/compactor-horizontal-and-vertical-compaction.png) +![Compactor - horizontal and vertical compaction](../images/compactor-horizontal-and-vertical-compaction.png) @@ -48,7 +55,7 @@ Given the split blocks, the compactor then runs the **merge** stage for each sha The merge stage is then run for subsequent compaction time ranges (eg. 12h, 24h), compacting together blocks belonging to the same shard (_not shown in the picture below_). -![Compactor - split-and-merge compaction strategy](/images/blocks-storage/compactor-split-and-merge.png) +![Compactor - split-and-merge compaction strategy](../images/compactor-split-and-merge.png) diff --git a/docs/sources/architecture/distributor.md b/docs/sources/architecture/distributor.md new file mode 100644 index 00000000000..edb10b939c2 --- /dev/null +++ b/docs/sources/architecture/distributor.md @@ -0,0 +1,67 @@ +--- +title: "Distributor" +description: "Overview of the distributor microservice." +weight: 20 +--- + +# Distributor + +The **distributor** service is responsible for handling incoming samples from Prometheus. It's the first stop in the write path for series samples. Once the distributor receives samples from Prometheus, each sample is validated for correctness and to ensure that it is within the configured tenant limits, falling back to defaults in case limits have not been overridden for the specific tenant. Valid samples are then split into batches and sent to multiple [ingesters]({{}}) in parallel. + +The validation done by the distributor includes: + +- The metric labels name are formally correct +- The configured max number of labels per metric is respected +- The configured max length of a label name and value is respected +- The timestamp is not older/newer than the configured min/max time range + +Distributors are **stateless** and can be scaled up and down as needed. + +## High Availability Tracker + +The distributor features a **High Availability (HA) Tracker**. When enabled, the distributor deduplicates incoming samples from redundant Prometheus servers. This allows you to have multiple HA replicas of the same Prometheus servers, writing the same series to Mimir and then deduplicate these series in the Mimir distributor. + +The HA Tracker deduplicates incoming samples based on a cluster and replica label. The cluster label uniquely identifies the cluster of redundant Prometheus servers for a given tenant, while the replica label uniquely identifies the replica within the Prometheus cluster. Incoming samples are considered duplicated (and thus dropped) if received by any replica which is not the current primary within a cluster. + +The HA Tracker requires a key-value (KV) store to coordinate which replica is currently elected. The distributor will only accept samples from the current leader. Samples with one or no labels (of the replica and cluster) are accepted by default and never deduplicated. + +The supported KV stores for the HA tracker are: + +- [Consul](https://www.consul.io) +- [Etcd](https://etcd.io) + +Note: Memberlist is not supported. Memberlist-based KV stores propagate updates using the gossip protocol, which is very slow for HA purposes: the result is that different distributors may see a different Prometheus server elected as an HA replica, which is definitely not desirable. + +For more information, please refer to [config for sending HA pairs data to Mimir](guides/ha-pair-handling.md) in the documentation. + +## Hashing + +Distributors use consistent hashing, in conjunction with a configurable replication factor, to determine which ingester instance(s) should receive a given series. + +The hash is calculated using the metric name, labels and tenant ID. + +There is a trade-off associated with including labels in the hash. Writes are more balanced across ingesters, but each query needs to talk to all ingesters since a metric could be spread across multiple ingesters given different label sets. + +### The hash ring + +A hash ring (stored in a key-value store) is used to achieve consistent hashing for the series sharding and replication across the ingesters. All [ingesters]({{}}) register themselves into the hash ring with a set of tokens they own; each token is a random unsigned 32-bit integer. Each incoming series is [hashed](#hashing) in the distributor and then pushed to the ingester which owns the token range for the series hash number plus N-1 subsequent ingesters in the ring, where N is the replication factor. + +To do the hash lookup, distributors find the smallest appropriate token whose value is larger than the [hash of the series](#hashing). When the replication factor is larger than 1, the subsequent tokens (clockwise in the ring) that belong to different ingesters will also be included in the result. + +The effect of this hash set up is that each token that an ingester owns is responsible for a range of hashes. If there are three tokens with values 0, 25, and 50, then a hash of 3 would be given to the ingester that owns the token 25; the ingester owning token 25 is responsible for the hash range of 1-25. + +The supported KV stores for the hash ring are: + +- [Consul](https://www.consul.io) +- [Etcd](https://etcd.io) +- Gossip [memberlist](https://github.com/hashicorp/memberlist) + +#### Quorum consistency + +Since all distributors share access to the same hash ring, write requests can be sent to any distributor and you can setup a stateless load balancer in front of it. + +To ensure consistent query results, Mimir uses [Dynamo-style](https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf) quorum consistency on reads and writes. This means that the distributor will wait for a positive response of at least one half plus one of the ingesters to send the sample to before successfully responding to the Prometheus write request. + +## Load balancing across distributors + +We recommend randomly load balancing write requests across distributor instances. For example, if you're running Mimir in a Kubernetes cluster, you could run the distributors as a Kubernetes [Service](https://kubernetes.io/docs/concepts/services-networking/service/). diff --git a/docs/sources/architecture/ingester.md b/docs/sources/architecture/ingester.md new file mode 100644 index 00000000000..e323799ac90 --- /dev/null +++ b/docs/sources/architecture/ingester.md @@ -0,0 +1,45 @@ +--- +title: "Ingester" +description: "Overview of the ingester microservice." +weight: 30 +--- + +# Ingester + +The **ingester** service is responsible for writing incoming series to a [long-term storage backend](#storage) on the write path and returning in-memory series samples for queries on the read path. + +Incoming series are not immediately written to the storage but kept in memory and periodically flushed to the storage (2 hours by default). For this reason, the [queriers](#querier) may need to fetch samples both from ingesters and long-term storage while executing a query on the read path. + +Ingesters contain a **lifecycler** which manages the lifecycle of an ingester and stores the **ingester state** in the [hash ring](#the-hash-ring). Each ingester could be in one of the following states: + +- **`PENDING`**
+ The ingester has just started. While in this state, the ingester receives neither write nor read requests. +- **`JOINING`**
+ The ingester is starting up and joining the ring. While in this state the ingester receives neither write nor read requests. The ingester will load tokens from disk (if `-ingester.tokens-file-path` is configured) or generate a set of new random tokens. Finally, the ingester optionally observes the ring for token conflicts, and once resolved, will move to the `ACTIVE` state. +- **`ACTIVE`**
+ The ingester is up and running. While in this state the ingester can receive both write and read requests. +- **`LEAVING`**
+ The ingester is shutting down and leaving the ring. While in this state the ingester doesn't receive write requests, but could still receive read requests. +- **`UNHEALTHY`**
+ The ingester has failed to heartbeat to the ring's KV Store. While in this state, distributors skip the ingester while building the replication set for incoming series and the ingester does not receive write or read requests. + +Ingesters are **semi-stateful**. + +## Ingesters failure and data loss + +If an ingester process crashes or exits abruptly, all the in-memory series that have not yet been flushed to the long-term storage will be lost. There are two main ways to mitigate this failure mode: + +1. Replication +2. Write-ahead log (WAL) + +**Replication** is used to hold multiple (typically 3) replicas of each time series in the ingesters. If the Mimir cluster loses an ingester, the in-memory series held by the lost ingester are replicated to at least one other ingester. In the event of a single ingester failure, no time series samples will be lost, while in the event that multiple ingesters fail, time series may potentially be lost if the failure affects all the ingesters holding the replicas of a specific time series. + +The **write-ahead log** (WAL) is used to write to a persistent disk all incoming series samples until they're flushed to the long-term storage. In the event of an ingester failure, a subsequent process restart will replay the WAL and recover the in-memory series samples. + +Contrary to the sole replication and given the persistent disk data is not lost, in the event of the failure of multiple ingesters, each ingester will recover the in-memory series samples from WAL upon subsequent restart. Replication is still recommended in order to ensure no temporary failures on the read path in the event of a single ingester failure. + +## Ingesters write de-amplification + +Ingesters store recently received samples in-memory in order to perform write de-amplification. If the ingesters would immediately write received samples to the long-term storage, the system would be difficult to scale due to the high pressure on the storage. For this reason, the ingesters batch and compress samples in-memory and periodically flush them out to the storage. + +Write de-amplification is the main source of Mimir's low total cost of ownership (TCO). diff --git a/docs/sources/blocks-storage/querier.md b/docs/sources/architecture/querier.md similarity index 99% rename from docs/sources/blocks-storage/querier.md rename to docs/sources/architecture/querier.md index ff5c45ace90..78bac5adcc6 100644 --- a/docs/sources/blocks-storage/querier.md +++ b/docs/sources/architecture/querier.md @@ -1,8 +1,7 @@ --- title: "Querier" -linkTitle: "Querier" -weight: 2 -slug: querier +description: "Overview of the querier microservice." +weight: 40 --- diff --git a/docs/sources/blocks-storage/querier.template b/docs/sources/architecture/querier.template similarity index 99% rename from docs/sources/blocks-storage/querier.template rename to docs/sources/architecture/querier.template index ee944d3d07a..50ceda7c8ab 100644 --- a/docs/sources/blocks-storage/querier.template +++ b/docs/sources/architecture/querier.template @@ -1,8 +1,7 @@ --- title: "Querier" -linkTitle: "Querier" -weight: 2 -slug: querier +description: "Overview of the querier microservice." +weight: 40 --- {{ .GeneratedFileWarning }} diff --git a/docs/sources/architecture/query-frontend.md b/docs/sources/architecture/query-frontend.md new file mode 100644 index 00000000000..f42c4e7dfc7 --- /dev/null +++ b/docs/sources/architecture/query-frontend.md @@ -0,0 +1,36 @@ +--- +title: "Query-frontend" +description: "Overview of the query-frontend microservice." +weight: 50 +--- + +# Query-frontend + +The **query-frontend** is an **optional service** that provides the querier's API endpoints and can be used to accelerate the read path. When the query frontend is in place, incoming query requests should be directed to the query frontend instead of the queriers. The querier service will still be required within the cluster, in order to execute the actual queries. + +The query frontend internally performs some query adjustments and holds queries in an internal queue. In this setup, queriers act as workers which pull jobs from the queue, execute them, and return them to the query-frontend for aggregation. Queriers need to be configured with the query frontend address (via the `-querier.frontend-address` CLI flag) to allow them to connect to the query frontends. + +Query frontends are **stateless**. However, due to how the internal queue works, it's recommended to run a few query frontend replicas to reap the benefit of fair scheduling. Two replicas should suffice in most cases. + +Flow of the query in the system when using query-frontend: + +1. Query is received by query frontend, which can optionally split it or serve from the cache. +2. Query frontend stores the query into an in-memory queue, where it waits for some querier to pick it up. +3. Querier picks up the query, and executes it. +4. Querier sends result back to query-frontend, which then forwards it to the client. + +#### Queueing + +The query frontend queuing mechanism is used to: + +- Ensure that large queries, that could cause an out-of-memory (OOM) error in the querier, will be retried on failure. This allows administrators to under-provision memory for queries, or optimistically run more small queries in parallel, which helps to reduce the TCO. +- Prevent multiple large requests from being convoyed on a single querier by distributing them across all queriers using a first-in/first-out queue (FIFO). +- Prevent a single tenant from denial-of-service-ing (DOSing) other tenants by fairly scheduling queries between tenants. + +#### Splitting + +The query frontend splits multi-day queries into multiple single-day queries, executing these queries in parallel on downstream queriers and stitching the results back together again. This prevents large (multi-day) queries from causing out of memory issues in a single querier and helps to execute them faster. + +#### Caching + +The query frontend supports caching query results and reuses them on subsequent queries. If the cached results are incomplete, the query frontend calculates the required subqueries and executes them in parallel on downstream queriers. The query frontend can optionally align queries with their step parameter to improve the cacheability of the query results. The result cache is compatible with any Mimir caching backend (currently memcached, Redis, and an in-memory cache). diff --git a/docs/sources/architecture/query-scheduler.md b/docs/sources/architecture/query-scheduler.md new file mode 100644 index 00000000000..6f6e8a79061 --- /dev/null +++ b/docs/sources/architecture/query-scheduler.md @@ -0,0 +1,23 @@ +--- +title: "Query-scheduler" +description: "Overview of the query-scheduler microservice." +weight: 60 +--- + +# Query-scheduler + +Query-scheduler is an **optional** service that moves the internal queue from the query frontend into a separate component. +This enables independent scaling of query frontends and number of queues (query-scheduler). + +In order to use query-scheduler, both query frontend and queriers must be configured with the query-scheduler address +(using `-frontend.scheduler-address` and `-querier.scheduler-address` options respectively). + +Flow of the query in the system changes when using query-scheduler: + +1. Query is received by query frontend, which can optionally split it or serve from the cache. +2. Query frontend forwards the query to random query-scheduler process. +3. query-scheduler stores the query into an in-memory queue, where it waits for some querier to pick it up. +4. Querier picks up the query, and executes it. +5. Querier sends result back to query-frontend, which then forwards it to the client. + +Query-schedulers are **stateless**. It is recommended to run two replicas to make sure queries can still be serviced while one replica is restarting. diff --git a/docs/sources/architecture/ruler.md b/docs/sources/architecture/ruler.md new file mode 100644 index 00000000000..71b85f2f84e --- /dev/null +++ b/docs/sources/architecture/ruler.md @@ -0,0 +1,16 @@ +--- +title: "(Optional) Ruler" +description: "Overview of the ruler microservice." +weight: 90 +--- + +# (Optional) Ruler + +The **ruler** is an **optional service** that executes PromQL queries for recording rules and alerts. The ruler requires a database to store the recording rules and alerts for each tenant. + +Ruler is **semi-stateful** and can be scaled horizontally. +Running rules internally have state, as well as the ring the rulers initiate. +However, if the rulers all fail and restart, +Prometheus alert rules have a feature where an alert is restored and returned to a firing state +if it would have been active in its for period. +However, there would be gaps in the series generated by the recording rules. diff --git a/docs/sources/blocks-storage/store-gateway.md b/docs/sources/architecture/store-gateway.md similarity index 99% rename from docs/sources/blocks-storage/store-gateway.md rename to docs/sources/architecture/store-gateway.md index b3f672dea29..c605d0daedc 100644 --- a/docs/sources/blocks-storage/store-gateway.md +++ b/docs/sources/architecture/store-gateway.md @@ -1,12 +1,17 @@ --- title: "Store-gateway" -linkTitle: "Store-gateway" -weight: 3 -slug: store-gateway +description: "Overview of the store-gateway microservice." +weight: 70 --- + + +The **[store-gateway](./store-gateway.md)** is responsible to query blocks and is used by the [querier](./querier.md) at query time. The store-gateway is required when running the blocks storage. + + + The store-gateway is the Cortex service responsible to query series from blocks. The store-gateway is required when running the Cortex blocks storage. The store-gateway is **semi-stateful**. diff --git a/docs/sources/blocks-storage/store-gateway.template b/docs/sources/architecture/store-gateway.template similarity index 97% rename from docs/sources/blocks-storage/store-gateway.template rename to docs/sources/architecture/store-gateway.template index e950213c9d4..d376c5bd08d 100644 --- a/docs/sources/blocks-storage/store-gateway.template +++ b/docs/sources/architecture/store-gateway.template @@ -1,12 +1,17 @@ --- title: "Store-gateway" -linkTitle: "Store-gateway" -weight: 3 -slug: store-gateway +description: "Overview of the store-gateway microservice." +weight: 70 --- {{ .GeneratedFileWarning }} + + +The **[store-gateway](./store-gateway.md)** is responsible to query blocks and is used by the [querier](./querier.md) at query time. The store-gateway is required when running the blocks storage. + + + The store-gateway is the Cortex service responsible to query series from blocks. The store-gateway is required when running the Cortex blocks storage. The store-gateway is **semi-stateful**. diff --git a/docs/sources/blocks-storage/_index.md b/docs/sources/blocks-storage/_index.md index e99d6fdfd10..724ecf4414c 100644 --- a/docs/sources/blocks-storage/_index.md +++ b/docs/sources/blocks-storage/_index.md @@ -16,48 +16,3 @@ The supported backends for the blocks storage are: - [Local Filesystem](https://thanos.io/storage.md/#filesystem) (single node only) _Internally, some components are based on [Thanos](https://thanos.io), but no Thanos knowledge is required in order to run it._ - -## Architecture - -When running the Mimir blocks storage, the Mimir architecture doesn't significantly change and thus the [general architecture documentation](../architecture.md) applies to the blocks storage as well. However, there are two additional Mimir services when running the blocks storage: - -- [Store-gateway](./store-gateway.md) -- [Compactor](./compactor.md) - -![Architecture](/images/blocks-storage/architecture.png) - - - -The **[store-gateway](./store-gateway.md)** is responsible to query blocks and is used by the [querier](./querier.md) at query time. The store-gateway is required when running the blocks storage. - -The **[compactor](./compactor.md)** is responsible to merge and deduplicate smaller blocks into larger ones, in order to reduce the number of blocks stored in the long-term storage for a given tenant and query them more efficiently. It also keeps the [bucket index](./bucket-index.md) updated and, for this reason, it's a required component. - -The `alertmanager` and `ruler` components can also use object storage to store its configurations and rules uploaded by users. In that case a separate bucket should be created to store alertmanager configurations and rules: using the same bucket between ruler/alertmanager and blocks will cause issue with the **[compactor](./compactor.md)**. - -### The write path - -**Ingesters** receive incoming samples from the distributors. Each push request belongs to a tenant, and the ingester appends the received samples to the specific per-tenant TSDB stored on the local disk. The received samples are both kept in-memory and written to a write-ahead log (WAL) and used to recover the in-memory series in case the ingester abruptly terminates. The per-tenant TSDB is lazily created in each ingester as soon as the first samples are received for that tenant. - -The in-memory samples are periodically flushed to disk - and the WAL truncated - when a new TSDB block is created, which by default occurs every 2 hours. Each newly created block is then uploaded to the long-term storage and kept in the ingester until the configured `-blocks-storage.tsdb.retention-period` expires, in order to give [queriers](./querier.md) and [store-gateways](./store-gateway.md) enough time to discover the new block on the storage and download its index-header. - -In order to effectively use the **WAL** and being able to recover the in-memory series upon ingester abruptly termination, the WAL needs to be stored to a persistent disk which can survive in the event of an ingester failure (ie. AWS EBS volume or GCP persistent disk when running in the cloud). For example, if you're running the Mimir cluster in Kubernetes, you may use a StatefulSet with a persistent volume claim for the ingesters. The location on the filesystem where the WAL is stored is the same where local TSDB blocks (compacted from head) are stored and cannot be decoupled. See also the [timeline of block uploads](production-tips/#how-to-estimate--querierquery-store-after) and [disk space estimate](production-tips/#ingester-disk-space). - -#### Distributor series sharding and replication - -Due to the replication factor N (typically 3), each time series is stored by N ingesters, and each ingester writes its own block to the long-term storage. [Compactor](./compactor.md) merges blocks from multiple ingesters into a single block, and removes duplicate samples. After blocks compaction, the storage utilization is significantly reduced. - -For more information, see [Compactor](./compactor.md) and [Production tips](./production-tips.md). - -### The read path - -[Queriers](./querier.md) and [store-gateways](./store-gateway.md) periodically iterate over the storage bucket to discover blocks recently uploaded by ingesters. - -For each discovered block, queriers only download the block's `meta.json` file (containing some metadata including min and max timestamp of samples within the block), while store-gateways download the `meta.json` as well as the index-header, which is a small subset of the block's index used by the store-gateway to lookup series at query time. - -Queriers use the blocks metadata to compute the list of blocks that need to be queried at query time and fetch matching series from the store-gateway instances holding the required blocks. - -For more information, please refer to the following dedicated sections: - -- [Querier](./querier.md) -- [Store-gateway](./store-gateway.md) -- [Production tips](./production-tips.md) diff --git a/docs/sources/getting-started/_index.md b/docs/sources/getting-started/_index.md index fca4eb50882..d9141b15cba 100644 --- a/docs/sources/getting-started/_index.md +++ b/docs/sources/getting-started/_index.md @@ -13,7 +13,7 @@ The single process mode is useful for users who want to try or develop on Grafan The microservices mode allows you to independently scale different services and isolate failures. These instructions focus on deploying Grafana Mimir as a single process. -For more information about the microservices, refer to [Architecture]({{}}). +For more information about the microservices, refer to [Architecture]({{}}). ## Before you begin diff --git a/docs/sources/images/architecture.png b/docs/sources/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..66651162b0d08e9391f73f09c7d3517588b1fd22 GIT binary patch literal 36966 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�GKweZ_T=iEm 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 From 491a2fcd3b5773929d6b71be48aa9a1a7b7e7973 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Thu, 3 Feb 2022 15:07:52 +0100 Subject: [PATCH 086/168] operations: Remove gossip_ring_member selector from services (#1008) Signed-off-by: Arve Knudsen --- CHANGELOG.md | 1 + .../mimir-tests/test-gossip-generated.yaml | 1798 +++++++++++++++++ operations/mimir-tests/test-gossip.jsonnet | 25 + operations/mimir/alertmanager.libsonnet | 6 +- operations/mimir/config.libsonnet | 4 + operations/mimir/distributor.libsonnet | 4 +- operations/mimir/gossip.libsonnet | 15 +- operations/mimir/ingester.libsonnet | 4 +- operations/mimir/overrides-exporter.libsonnet | 2 +- operations/mimir/querier.libsonnet | 4 +- operations/mimir/query-frontend.libsonnet | 4 +- operations/mimir/query-scheduler.libsonnet | 4 +- operations/mimir/ruler.libsonnet | 2 +- operations/mimir/store-gateway.libsonnet | 2 +- operations/mimir/test-exporter.libsonnet | 2 +- 15 files changed, 1846 insertions(+), 31 deletions(-) create mode 100644 operations/mimir-tests/test-gossip-generated.yaml create mode 100644 operations/mimir-tests/test-gossip.jsonnet diff --git a/CHANGELOG.md b/CHANGELOG.md index 22932b249a8..7645269a5a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -649,6 +649,7 @@ * [BUGFIX] Fixed `-distributor.extend-writes` setting on ruler when `unregister_ingesters_on_shutdown` is disabled. [#369](https://github.com/grafana/cortex-jsonnet/pull/369) * [BUGFIX] Treat `compactor_blocks_retention_period` type as string rather than int.[#395](https://github.com/grafana/cortex-jsonnet/pull/395) * [BUGFIX] Pass `-ruler-storage.s3.endpoint` to ruler when using S3. [#421](https://github.com/grafana/cortex-jsonnet/pull/421) +* [BUGFIX] Remove service selector on label `gossip_ring_member` from other services than `gossip-ring`. [#1008](https://github.com/grafana/mimir/pull/1008) ### Query-tee diff --git a/operations/mimir-tests/test-gossip-generated.yaml b/operations/mimir-tests/test-gossip-generated.yaml new file mode 100644 index 00000000000..c04a16a6924 --- /dev/null +++ b/operations/mimir-tests/test-gossip-generated.yaml @@ -0,0 +1,1798 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: default +--- +apiVersion: policy/v1beta1 +kind: PodDisruptionBudget +metadata: + labels: + name: ingester-pdb + name: ingester-pdb + namespace: default +spec: + maxUnavailable: 1 + selector: + matchLabels: + name: ingester +--- +apiVersion: policy/v1beta1 +kind: PodDisruptionBudget +metadata: + labels: + name: store-gateway-pdb + name: store-gateway-pdb + namespace: default +spec: + maxUnavailable: 2 + selector: + matchLabels: + name: store-gateway +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: consul-sidekick + namespace: default +--- +apiVersion: v1 +data: + consul-config.json: '{"leave_on_terminate": true, "raft_snapshot_threshold": 128, + "raft_trailing_logs": 10000, "telemetry": {"dogstatsd_addr": "127.0.0.1:9125"}}' + mapping: | + mappings: + - match: consul.*.runtime.* + name: consul_runtime + labels: + type: $2 + - match: consul.runtime.total_gc_pause_ns + name: consul_runtime_total_gc_pause_ns + labels: + type: $2 + - match: consul.consul.health.service.query-tag.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3 + - match: consul.consul.health.service.query-tag.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4 + - match: consul.consul.health.service.query-tag.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9.$10 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9.$10.$11 + - match: consul.consul.health.service.query-tag.*.*.*.*.*.*.*.*.*.*.*.* + name: consul_health_service_query_tag + labels: + query: $1.$2.$3.$4.$5.$6.$7.$8.$9.$10.$11.$12 + - match: consul.consul.catalog.deregister + name: consul_catalog_deregister + labels: {} + - match: consul.consul.dns.domain_query.*.*.*.*.* + name: consul_dns_domain_query + labels: + query: $1.$2.$3.$4.$5 + - match: consul.consul.health.service.not-found.* + name: consul_health_service_not_found + labels: + query: $1 + - match: consul.consul.health.service.query.* + name: consul_health_service_query + labels: + query: $1 + - match: consul.*.memberlist.health.score + name: consul_memberlist_health_score + labels: {} + - match: consul.serf.queue.* + name: consul_serf_events + labels: + type: $1 + - match: consul.serf.snapshot.appendLine + name: consul_serf_snapshot_appendLine + labels: + type: $1 + - match: consul.serf.coordinate.adjustment-ms + name: consul_serf_coordinate_adjustment_ms + labels: {} + - match: consul.consul.rpc.query + name: consul_rpc_query + labels: {} + - match: consul.*.consul.session_ttl.active + name: consul_session_ttl_active + labels: {} + - match: consul.raft.rpc.* + name: consul_raft_rpc + labels: + type: $1 + - match: consul.raft.rpc.appendEntries.storeLogs + name: consul_raft_rpc_appendEntries_storeLogs + labels: + type: $1 + - match: consul.consul.fsm.persist + name: consul_fsm_persist + labels: {} + - match: consul.raft.fsm.apply + name: consul_raft_fsm_apply + labels: {} + - match: consul.raft.leader.lastContact + name: consul_raft_leader_lastcontact + labels: {} + - match: consul.raft.leader.dispatchLog + name: consul_raft_leader_dispatchLog + labels: {} + - match: consul.raft.commitTime + name: consul_raft_commitTime + labels: {} + - match: consul.raft.replication.appendEntries.logs.*.*.*.* + name: consul_raft_replication_appendEntries_logs + labels: + query: ${1}.${2}.${3}.${4} + - match: consul.raft.replication.appendEntries.rpc.*.*.*.* + name: consul_raft_replication_appendEntries_rpc + labels: + query: ${1}.${2}.${3}.${4} + - match: consul.raft.replication.heartbeat.*.*.*.* + name: consul_raft_replication_heartbeat + labels: + query: ${1}.${2}.${3}.${4} + - match: consul.consul.rpc.request + name: consul_rpc_requests + labels: {} + - match: consul.consul.rpc.accept_conn + name: consul_rpc_accept_conn + labels: {} + - match: consul.memberlist.udp.* + name: consul_memberlist_udp + labels: + type: $1 + - match: consul.memberlist.tcp.* + name: consul_memberlist_tcp + labels: + type: $1 + - match: consul.memberlist.gossip + name: consul_memberlist_gossip + labels: {} + - match: consul.memberlist.probeNode + name: consul_memberlist_probenode + labels: {} + - match: consul.memberlist.pushPullNode + name: consul_memberlist_pushpullnode + labels: {} + - match: consul.http.* + name: consul_http_request + labels: + method: $1 + path: / + - match: consul.http.*.* + name: consul_http_request + labels: + method: $1 + path: /$2 + - match: consul.http.*.*.* + name: consul_http_request + labels: + method: $1 + path: /$2/$3 + - match: consul.http.*.*.*.* + name: consul_http_request + labels: + method: $1 + path: /$2/$3/$4 + - match: consul.http.*.*.*.*.* + name: consul_http_request + labels: + method: $1 + path: /$2/$3/$4/$5 + - match: consul.consul.leader.barrier + name: consul_leader_barrier + labels: {} + - match: consul.consul.leader.reconcileMember + name: consul_leader_reconcileMember + labels: {} + - match: consul.consul.leader.reconcile + name: consul_leader_reconcile + labels: {} + - match: consul.consul.fsm.coordinate.batch-update + name: consul_fsm_coordinate_batch_update + labels: {} + - match: consul.consul.fsm.autopilot + name: consul_fsm_autopilot + labels: {} + - match: consul.consul.fsm.kvs.cas + name: consul_fsm_kvs_cas + labels: {} + - match: consul.consul.fsm.register + name: consul_fsm_register + labels: {} + - match: consul.consul.fsm.deregister + name: consul_fsm_deregister + labels: {} + - match: consul.consul.fsm.tombstone.reap + name: consul_fsm_tombstone_reap + labels: {} + - match: consul.consul.catalog.register + name: consul_catalog_register + labels: {} + - match: consul.consul.catalog.deregister + name: consul_catalog_deregister + labels: {} + - match: consul.consul.leader.reapTombstones + name: consul_leader_reapTombstones + labels: {} +kind: ConfigMap +metadata: + name: consul + namespace: default +--- +apiVersion: v1 +data: + overrides.yaml: | + overrides: {} +kind: ConfigMap +metadata: + name: overrides + namespace: default +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: consul-sidekick + namespace: default +rules: +- apiGroups: + - "" + - extensions + - apps + resources: + - pods + - replicasets + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: consul-sidekick + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: consul-sidekick +subjects: +- kind: ServiceAccount + name: consul-sidekick + namespace: default +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: alertmanager + name: alertmanager + namespace: default +spec: + clusterIP: None + ports: + - name: alertmanager-http-metrics + port: 8080 + targetPort: 8080 + - name: alertmanager-grpc + port: 9095 + targetPort: 9095 + selector: + name: alertmanager +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: consul + name: consul + namespace: default +spec: + ports: + - name: consul-server + port: 8300 + targetPort: 8300 + - name: consul-serf + port: 8301 + targetPort: 8301 + - name: consul-client + port: 8400 + targetPort: 8400 + - name: consul-api + port: 8500 + targetPort: 8500 + - name: statsd-exporter-http-metrics + port: 8000 + targetPort: 8000 + - name: consul-exporter-http-metrics + port: 9107 + targetPort: 9107 + selector: + name: consul +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: distributor + name: distributor + namespace: default +spec: + clusterIP: None + ports: + - name: distributor-http-metrics + port: 8080 + targetPort: 8080 + - name: distributor-grpc + port: 9095 + targetPort: 9095 + - name: distributor-gossip-ring + port: 7946 + targetPort: 7946 + selector: + name: distributor +--- +apiVersion: v1 +kind: Service +metadata: + name: gossip-ring + namespace: default +spec: + clusterIP: None + ports: + - name: gossip-ring + port: 7946 + protocol: TCP + targetPort: 7946 + selector: + gossip_ring_member: "true" +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: ingester + name: ingester + namespace: default +spec: + ports: + - name: ingester-http-metrics + port: 8080 + targetPort: 8080 + - name: ingester-grpc + port: 9095 + targetPort: 9095 + - name: ingester-gossip-ring + port: 7946 + targetPort: 7946 + selector: + name: ingester +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached + name: memcached + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached-frontend + name: memcached-frontend + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached-frontend +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached-index-queries + name: memcached-index-queries + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached-index-queries +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: memcached-metadata + name: memcached-metadata + namespace: default +spec: + clusterIP: None + ports: + - name: memcached-client + port: 11211 + targetPort: 11211 + - name: exporter-http-metrics + port: 9150 + targetPort: 9150 + selector: + name: memcached-metadata +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: querier + name: querier + namespace: default +spec: + ports: + - name: querier-http-metrics + port: 8080 + targetPort: 8080 + - name: querier-grpc + port: 9095 + targetPort: 9095 + - name: querier-gossip-ring + port: 7946 + targetPort: 7946 + selector: + name: querier +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: query-frontend + name: query-frontend + namespace: default +spec: + ports: + - name: query-frontend-http-metrics + port: 8080 + targetPort: 8080 + - name: query-frontend-grpc + port: 9095 + targetPort: 9095 + selector: + name: query-frontend +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: query-frontend + name: query-frontend-discovery + namespace: default +spec: + clusterIP: None + ports: + - name: query-frontend-http-metrics + port: 8080 + targetPort: 8080 + - name: query-frontend-grpc + port: 9095 + targetPort: 9095 + publishNotReadyAddresses: true + selector: + name: query-frontend +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: query-scheduler + name: query-scheduler + namespace: default +spec: + ports: + - name: query-scheduler-http-metrics + port: 8080 + targetPort: 8080 + - name: query-scheduler-grpc + port: 9095 + targetPort: 9095 + selector: + name: query-scheduler +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: query-scheduler + name: query-scheduler-discovery + namespace: default +spec: + clusterIP: None + ports: + - name: query-scheduler-http-metrics + port: 8080 + targetPort: 8080 + - name: query-scheduler-grpc + port: 9095 + targetPort: 9095 + publishNotReadyAddresses: true + selector: + name: query-scheduler +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: ruler + name: ruler + namespace: default +spec: + ports: + - name: ruler-http-metrics + port: 8080 + targetPort: 8080 + - name: ruler-grpc + port: 9095 + targetPort: 9095 + selector: + name: ruler +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: store-gateway + name: store-gateway + namespace: default +spec: + ports: + - name: store-gateway-http-metrics + port: 8080 + targetPort: 8080 + - name: store-gateway-grpc + port: 9095 + targetPort: 9095 + selector: + name: store-gateway +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: consul + namespace: default +spec: + minReadySeconds: 10 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: consul + template: + metadata: + annotations: + consul-hash: e56ef6821a3557604caccaf6d5820239 + labels: + name: consul + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: consul + topologyKey: kubernetes.io/hostname + - labelSelector: + matchLabels: + name: ingester + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - args: + - agent + - -ui + - -server + - -client=0.0.0.0 + - -config-file=/etc/config/consul-config.json + - -bootstrap-expect=1 + - -ui-content-path=/default/consul/ + env: + - name: CHECKPOINT_DISABLE + value: "1" + image: consul:1.5.3 + imagePullPolicy: IfNotPresent + name: consul + ports: + - containerPort: 8300 + name: server + - containerPort: 8301 + name: serf + - containerPort: 8400 + name: client + - containerPort: 8500 + name: api + resources: + requests: + cpu: "4" + memory: 4Gi + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + - args: + - --namespace=$(POD_NAMESPACE) + - --pod-name=$(POD_NAME) + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + image: weaveworks/consul-sidekick:master-f18ad13 + imagePullPolicy: IfNotPresent + name: sidekick + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + - args: + - --web.listen-address=:8000 + - --statsd.mapping-config=/etc/config/mapping + image: prom/statsd-exporter:v0.12.2 + imagePullPolicy: IfNotPresent + name: statsd-exporter + ports: + - containerPort: 8000 + name: http-metrics + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + - args: + - --consul.server=localhost:8500 + - --web.listen-address=:9107 + - --consul.timeout=1s + - --no-consul.health-summary + - --consul.allow_stale + image: prom/consul-exporter:v0.5.0 + imagePullPolicy: IfNotPresent + name: consul-exporter + ports: + - containerPort: 9107 + name: http-metrics + volumeMounts: + - mountPath: /etc/config + name: consul + - mountPath: /consul/data/ + name: data + serviceAccount: consul-sidekick + volumes: + - configMap: + name: consul + name: consul + - emptyDir: + medium: Memory + name: data +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: distributor + namespace: default +spec: + minReadySeconds: 10 + replicas: 3 + revisionHistoryLimit: 10 + selector: + matchLabels: + gossip_ring_member: "true" + name: distributor + strategy: + rollingUpdate: + maxSurge: 5 + maxUnavailable: 1 + template: + metadata: + labels: + gossip_ring_member: "true" + name: distributor + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: distributor + topologyKey: kubernetes.io/hostname + containers: + - args: + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.extend-writes=true + - -distributor.ha-tracker.enable=true + - -distributor.ha-tracker.enable-for-all-users=true + - -distributor.ha-tracker.etcd.endpoints=etcd-client.default.svc.cluster.local.:2379 + - -distributor.ha-tracker.prefix=prom_ha/ + - -distributor.ha-tracker.store=etcd + - -distributor.health-check-ingesters=true + - -distributor.ingestion-burst-size=200000 + - -distributor.ingestion-rate-limit=10000 + - -distributor.replication-factor=3 + - -distributor.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.ring.prefix= + - -mem-ballast-size-bytes=1073741824 + - -memberlist.abort-if-join-fails=false + - -memberlist.bind-port=7946 + - -memberlist.join=gossip-ring.default.svc.cluster.local:7946 + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -ring.store=memberlist + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.max-connection-age=2m + - -server.grpc.keepalive.max-connection-age-grace=5m + - -server.grpc.keepalive.max-connection-idle=1m + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -target=distributor + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: distributor + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + - containerPort: 7946 + name: gossip-ring + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 4Gi + requests: + cpu: "2" + memory: 2Gi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: querier + namespace: default +spec: + minReadySeconds: 10 + replicas: 6 + revisionHistoryLimit: 10 + selector: + matchLabels: + gossip_ring_member: "true" + name: querier + strategy: + rollingUpdate: + maxSurge: 5 + maxUnavailable: 1 + template: + metadata: + labels: + gossip_ring_member: "true" + name: querier + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: querier + topologyKey: kubernetes.io/hostname + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.metadata-cache.backend=memcached + - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.sync-dir=/data/tsdb + - -blocks-storage.bucket-store.sync-interval=15m + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.health-check-ingesters=true + - -distributor.replication-factor=3 + - -mem-ballast-size-bytes=268435456 + - -memberlist.abort-if-join-fails=false + - -memberlist.bind-port=7946 + - -memberlist.join=gossip-ring.default.svc.cluster.local:7946 + - -querier.frontend-client.grpc-max-send-msg-size=104857600 + - -querier.max-concurrent=8 + - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true + - -querier.query-store-after=12h + - -querier.query-store-for-labels-enabled=true + - -querier.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -ring.store=memberlist + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -server.http-write-timeout=1m + - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -store-gateway.sharding-ring.prefix= + - -store-gateway.sharding-ring.replication-factor=3 + - -store-gateway.sharding-ring.store=consul + - -store.max-query-length=768h + - -target=querier + env: + - name: JAEGER_REPORTER_MAX_QUEUE_SIZE + value: "1024" + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: querier + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + - containerPort: 7946 + name: gossip-ring + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 24Gi + requests: + cpu: "1" + memory: 12Gi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: query-frontend + namespace: default +spec: + minReadySeconds: 10 + replicas: 2 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: query-frontend + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + template: + metadata: + labels: + name: query-frontend + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: query-frontend + topologyKey: kubernetes.io/hostname + containers: + - args: + - -frontend.align-querier-with-step=false + - -frontend.cache-results=true + - -frontend.max-cache-freshness=10m + - -frontend.results-cache.backend=memcached + - -frontend.results-cache.memcached.addresses=dnssrvnoa+memcached-frontend.default.svc.cluster.local:11211 + - -frontend.results-cache.memcached.timeout=500ms + - -frontend.scheduler-address=query-scheduler-discovery.default.svc.cluster.local:9095 + - -frontend.split-queries-by-interval=24h + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc-max-recv-msg-size-bytes=104857600 + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -server.http-write-timeout=1m + - -store.max-query-length=12000h + - -target=query-frontend + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: query-frontend + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 1200Mi + requests: + cpu: "2" + memory: 600Mi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: query-scheduler + namespace: default +spec: + minReadySeconds: 10 + replicas: 2 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: query-scheduler + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + template: + metadata: + labels: + name: query-scheduler + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: query-scheduler + topologyKey: kubernetes.io/hostname + containers: + - args: + - -query-scheduler.max-outstanding-requests-per-tenant=100 + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -target=query-scheduler + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: query-scheduler + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 2Gi + requests: + cpu: "2" + memory: 1Gi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ruler + namespace: default +spec: + minReadySeconds: 10 + replicas: 2 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: ruler + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + template: + metadata: + labels: + name: ruler + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: ruler + topologyKey: kubernetes.io/hostname + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.metadata-cache.backend=memcached + - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.sync-dir=/data/tsdb + - -blocks-storage.bucket-store.sync-interval=15m + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.extend-writes=true + - -distributor.health-check-ingesters=true + - -distributor.replication-factor=3 + - -memberlist.abort-if-join-fails=false + - -memberlist.bind-port=7946 + - -memberlist.join=gossip-ring.default.svc.cluster.local:7946 + - -querier.query-ingesters-within=13h + - -querier.query-label-names-with-matchers-enabled=true + - -querier.query-store-after=12h + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -ring.store=memberlist + - -ruler-storage.backend=gcs + - -ruler-storage.gcs.bucket-name=rules-bucket + - -ruler.alertmanager-url=http://alertmanager.default.svc.cluster.local/alertmanager + - -ruler.enable-api=true + - -ruler.max-rule-groups-per-tenant=35 + - -ruler.max-rules-per-rule-group=20 + - -ruler.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -ruler.ring.store=consul + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc-max-recv-msg-size-bytes=10485760 + - -server.grpc-max-send-msg-size-bytes=10485760 + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -store-gateway.sharding-ring.prefix= + - -store-gateway.sharding-ring.replication-factor=3 + - -store-gateway.sharding-ring.store=consul + - -store.max-query-length=768h + - -target=ruler + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: ruler + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + cpu: "16" + memory: 16Gi + requests: + cpu: "1" + memory: 6Gi + volumeMounts: + - mountPath: /etc/mimir + name: overrides + terminationGracePeriodSeconds: 600 + volumes: + - configMap: + name: overrides + name: overrides +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: alertmanager + name: alertmanager + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: alertmanager + serviceName: alertmanager + template: + metadata: + labels: + name: alertmanager + spec: + containers: + - args: + - -alertmanager-storage.backend=gcs + - -alertmanager-storage.gcs.bucket-name=alerts-bucket + - -alertmanager.enable-api=true + - -alertmanager.sharding-enabled=true + - -alertmanager.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -alertmanager.sharding-ring.replication-factor=3 + - -alertmanager.sharding-ring.store=consul + - -alertmanager.storage.path=/data + - -alertmanager.web.external-url=http://test/alertmanager + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -target=alertmanager + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: alertmanager + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + requests: + cpu: 100m + memory: 1Gi + volumeMounts: + - mountPath: /data + name: alertmanager-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 900 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: alertmanager-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Gi +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: compactor + name: compactor + namespace: default +spec: + podManagementPolicy: Parallel + replicas: 1 + selector: + matchLabels: + name: compactor + serviceName: compactor + template: + metadata: + labels: + name: compactor + spec: + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -compactor.block-ranges=2h,12h,24h + - -compactor.blocks-retention-period=0 + - -compactor.cleanup-interval=15m + - -compactor.compaction-concurrency=1 + - -compactor.compaction-interval=30m + - -compactor.compactor-tenant-shard-size=1 + - -compactor.data-dir=/data + - -compactor.deletion-delay=2h + - -compactor.max-closing-blocks-concurrency=2 + - -compactor.max-opening-blocks-concurrency=4 + - -compactor.ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -compactor.ring.prefix= + - -compactor.ring.store=consul + - -compactor.ring.wait-stability-min-duration=1m + - -compactor.split-and-merge-shards=0 + - -compactor.split-groups=1 + - -compactor.symbols-flushers-concurrency=4 + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -target=compactor + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: compactor + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 6Gi + requests: + cpu: 1 + memory: 6Gi + volumeMounts: + - mountPath: /data + name: compactor-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 900 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: compactor-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 250Gi + storageClassName: standard +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: ingester + name: ingester + namespace: default +spec: + podManagementPolicy: Parallel + replicas: 3 + selector: + matchLabels: + name: ingester + serviceName: ingester + template: + metadata: + labels: + gossip_ring_member: "true" + name: ingester + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: ingester + topologyKey: kubernetes.io/hostname + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -blocks-storage.tsdb.block-ranges-period=2h + - -blocks-storage.tsdb.close-idle-tsdb-timeout=13h + - -blocks-storage.tsdb.dir=/data/tsdb + - -blocks-storage.tsdb.isolation-enabled=false + - -blocks-storage.tsdb.ship-interval=1m + - -consul.hostname=consul.default.svc.cluster.local:8500 + - -distributor.health-check-ingesters=true + - -distributor.replication-factor=3 + - -ingester.heartbeat-period=5s + - -ingester.join-after=60s + - -ingester.max-global-series-per-metric=20000 + - -ingester.max-global-series-per-user=150000 + - -ingester.num-tokens=512 + - -ingester.tokens-file-path=/data/tokens + - -ingester.unregister-on-shutdown=true + - -memberlist.abort-if-join-fails=false + - -memberlist.bind-port=7946 + - -memberlist.join=gossip-ring.default.svc.cluster.local:7946 + - -ring.heartbeat-timeout=10m + - -ring.prefix= + - -ring.store=memberlist + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc-max-concurrent-streams=10000 + - -server.grpc-max-recv-msg-size-bytes=10485760 + - -server.grpc-max-send-msg-size-bytes=10485760 + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -target=ingester + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: ingester + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + - containerPort: 7946 + name: gossip-ring + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 25Gi + requests: + cpu: "4" + memory: 15Gi + volumeMounts: + - mountPath: /data + name: ingester-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 1200 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: ingester-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Gi + storageClassName: fast +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: memcached + serviceName: memcached + template: + metadata: + labels: + name: memcached + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 6144 + - -I 1m + - -c 16384 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 9Gi + requests: + cpu: 500m + memory: 6552Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached-frontend + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: memcached-frontend + serviceName: memcached-frontend + template: + metadata: + labels: + name: memcached-frontend + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached-frontend + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 1024 + - -I 5m + - -c 1024 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 1536Mi + requests: + cpu: 500m + memory: 1329Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached-index-queries + namespace: default +spec: + replicas: 3 + selector: + matchLabels: + name: memcached-index-queries + serviceName: memcached-index-queries + template: + metadata: + labels: + name: memcached-index-queries + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached-index-queries + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 1024 + - -I 5m + - -c 16384 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 1536Mi + requests: + cpu: 500m + memory: 1329Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: memcached-metadata + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + name: memcached-metadata + serviceName: memcached-metadata + template: + metadata: + labels: + name: memcached-metadata + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + name: memcached-metadata + topologyKey: kubernetes.io/hostname + containers: + - args: + - -m 512 + - -I 1m + - -c 16384 + - -v + image: memcached:1.6.9-alpine + imagePullPolicy: IfNotPresent + name: memcached + ports: + - containerPort: 11211 + name: client + resources: + limits: + memory: 768Mi + requests: + cpu: 500m + memory: 715Mi + - args: + - --memcached.address=localhost:11211 + - --web.listen-address=0.0.0.0:9150 + image: prom/memcached-exporter:v0.6.0 + imagePullPolicy: IfNotPresent + name: exporter + ports: + - containerPort: 9150 + name: http-metrics + updateStrategy: + type: RollingUpdate +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + name: store-gateway + name: store-gateway + namespace: default +spec: + podManagementPolicy: Parallel + replicas: 3 + selector: + matchLabels: + name: store-gateway + serviceName: store-gateway + template: + metadata: + labels: + name: store-gateway + spec: + containers: + - args: + - -blocks-storage.backend=gcs + - -blocks-storage.bucket-store.bucket-index.enabled=true + - -blocks-storage.bucket-store.chunks-cache.attributes-in-memory-max-items=50000 + - -blocks-storage.bucket-store.chunks-cache.backend=memcached + - -blocks-storage.bucket-store.chunks-cache.memcached.addresses=dnssrvnoa+memcached.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-get-multi-concurrency=100 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-idle-connections=100 + - -blocks-storage.bucket-store.chunks-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.ignore-blocks-within=10h + - -blocks-storage.bucket-store.index-cache.backend=memcached + - -blocks-storage.bucket-store.index-cache.memcached.addresses=dnssrvnoa+memcached-index-queries.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.index-cache.memcached.max-get-multi-concurrency=100 + - -blocks-storage.bucket-store.index-cache.memcached.max-idle-connections=100 + - -blocks-storage.bucket-store.index-cache.memcached.max-item-size=5242880 + - -blocks-storage.bucket-store.index-header-lazy-loading-enabled=true + - -blocks-storage.bucket-store.index-header-lazy-loading-idle-timeout=60m + - -blocks-storage.bucket-store.max-chunk-pool-bytes=12884901888 + - -blocks-storage.bucket-store.metadata-cache.backend=memcached + - -blocks-storage.bucket-store.metadata-cache.memcached.addresses=dnssrvnoa+memcached-metadata.default.svc.cluster.local:11211 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-async-concurrency=50 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-get-multi-concurrency=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-idle-connections=100 + - -blocks-storage.bucket-store.metadata-cache.memcached.max-item-size=1048576 + - -blocks-storage.bucket-store.sync-dir=/data/tsdb + - -blocks-storage.bucket-store.sync-interval=15m + - -blocks-storage.gcs.bucket-name=blocks-bucket + - -runtime-config.file=/etc/mimir/overrides.yaml + - -server.grpc.keepalive.min-time-between-pings=10s + - -server.grpc.keepalive.ping-without-stream-allowed=true + - -server.http-listen-port=8080 + - -store-gateway.sharding-ring.consul.hostname=consul.default.svc.cluster.local:8500 + - -store-gateway.sharding-ring.prefix= + - -store-gateway.sharding-ring.replication-factor=3 + - -store-gateway.sharding-ring.store=consul + - -store-gateway.sharding-ring.tokens-file-path=/data/tokens + - -store-gateway.sharding-ring.wait-stability-min-duration=1m + - -target=store-gateway + image: cortexproject/cortex:v1.9.0 + imagePullPolicy: IfNotPresent + name: store-gateway + ports: + - containerPort: 8080 + name: http-metrics + - containerPort: 9095 + name: grpc + readinessProbe: + httpGet: + path: /ready + port: 8080 + initialDelaySeconds: 15 + timeoutSeconds: 1 + resources: + limits: + memory: 18Gi + requests: + cpu: "1" + memory: 12Gi + volumeMounts: + - mountPath: /data + name: store-gateway-data + - mountPath: /etc/mimir + name: overrides + securityContext: + runAsUser: 0 + terminationGracePeriodSeconds: 120 + volumes: + - configMap: + name: overrides + name: overrides + updateStrategy: + type: RollingUpdate + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: store-gateway-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Gi + storageClassName: standard +--- +apiVersion: etcd.database.coreos.com/v1beta2 +kind: EtcdCluster +metadata: + annotations: + etcd.database.coreos.com/scope: clusterwide + name: etcd + namespace: default +spec: + pod: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + etcd_cluster: etcd + topologyKey: kubernetes.io/hostname + annotations: + prometheus.io/port: "2379" + prometheus.io/scrape: "true" + etcdEnv: + - name: ETCD_AUTO_COMPACTION_RETENTION + value: 1h + labels: + name: etcd + resources: + limits: + memory: 512Mi + requests: + cpu: 500m + memory: 512Mi + size: 3 + version: 3.3.13 diff --git a/operations/mimir-tests/test-gossip.jsonnet b/operations/mimir-tests/test-gossip.jsonnet new file mode 100644 index 00000000000..43ccc1cfdac --- /dev/null +++ b/operations/mimir-tests/test-gossip.jsonnet @@ -0,0 +1,25 @@ +local mimir = import 'mimir/mimir.libsonnet'; +local gossip = import 'mimir/gossip.libsonnet'; + +mimir + gossip { + _config+:: { + namespace: 'default', + external_url: 'http://test', + + blocks_storage_backend: 'gcs', + blocks_storage_bucket_name: 'blocks-bucket', + bucket_index_enabled: true, + query_scheduler_enabled: true, + + ruler_enabled: true, + ruler_client_type: 'gcs', + ruler_storage_bucket_name: 'rules-bucket', + + alertmanager_enabled: true, + alertmanager_client_type: 'gcs', + alertmanager_gcs_bucket_name: 'alerts-bucket', + alertmanager+: { + sharding_enabled: true, + }, + }, +} diff --git a/operations/mimir/alertmanager.libsonnet b/operations/mimir/alertmanager.libsonnet index 604bf325c19..4286d6c54ae 100644 --- a/operations/mimir/alertmanager.libsonnet +++ b/operations/mimir/alertmanager.libsonnet @@ -30,7 +30,7 @@ }, flags: [], service: - $.util.serviceFor($.alertmanager_statefulset) + + $.util.serviceFor($.alertmanager_statefulset, $._config.service_ignored_labels) + service.mixin.spec.withClusterIp('None'), }, gossip_multi_replica: { @@ -44,14 +44,14 @@ '--alertmanager.cluster.peers=%s' % std.join(',', peers), ], service: - $.util.serviceFor($.alertmanager_statefulset) + + $.util.serviceFor($.alertmanager_statefulset, $._config.service_ignored_labels) + service.mixin.spec.withClusterIp('None'), }, gossip_single_replica: { ports: [], args: {}, flags: ['--alertmanager.cluster.listen-address=""'], - service: $.util.serviceFor($.alertmanager_statefulset), + service: $.util.serviceFor($.alertmanager_statefulset, $._config.service_ignored_labels), }, }[haType], local hasFallbackConfig = std.length($._config.alertmanager.fallback_config) > 0, diff --git a/operations/mimir/config.libsonnet b/operations/mimir/config.libsonnet index 146c89143fe..4e07a0d2660 100644 --- a/operations/mimir/config.libsonnet +++ b/operations/mimir/config.libsonnet @@ -372,6 +372,10 @@ // max_tenants: 0, // Max number of tenants per ingester. 0 = no limit. // }, ingester_instance_limits: null, + + gossip_member_label: 'gossip_ring_member', + // Labels that service selectors should not use + service_ignored_labels:: [self.gossip_member_label], }, local configMap = $.core.v1.configMap, diff --git a/operations/mimir/distributor.libsonnet b/operations/mimir/distributor.libsonnet index cb9cf8969c8..eaabf02ad27 100644 --- a/operations/mimir/distributor.libsonnet +++ b/operations/mimir/distributor.libsonnet @@ -61,9 +61,7 @@ local service = $.core.v1.service, - distributor_service_ignored_labels:: [], - distributor_service: - $.util.serviceFor($.distributor_deployment, $.distributor_service_ignored_labels) + + $.util.serviceFor($.distributor_deployment, $._config.service_ignored_labels) + service.mixin.spec.withClusterIp('None'), } diff --git a/operations/mimir/gossip.libsonnet b/operations/mimir/gossip.libsonnet index 8b6261641d1..7e4c5b8b4fb 100644 --- a/operations/mimir/gossip.libsonnet +++ b/operations/mimir/gossip.libsonnet @@ -47,16 +47,9 @@ querier_ports+:: [gossipPort], ingester_ports+:: [gossipPort], - local gossip_member_label = 'gossip_ring_member', - - distributor_deployment_labels+:: { [gossip_member_label]: 'true' }, - ingester_deployment_labels+:: { [gossip_member_label]: 'true' }, - querier_deployment_labels+:: { [gossip_member_label]: 'true' }, - - // Don't use gossip ring member label in service definition. - distributor_service_ignored_labels+:: [gossip_member_label], - ingester_service_ignored_labels+:: [gossip_member_label], - querier_service_ignored_labels+:: [gossip_member_label], + distributor_deployment_labels+:: { [$._config.gossip_member_label]: 'true' }, + ingester_deployment_labels+:: { [$._config.gossip_member_label]: 'true' }, + querier_deployment_labels+:: { [$._config.gossip_member_label]: 'true' }, // Headless service (= no assigned IP, DNS returns all targets instead) pointing to some // users of gossiped-ring. We use ingesters as seed nodes for joining gossip cluster. @@ -76,7 +69,7 @@ ]; service.new( 'gossip-ring', // name - { [gossip_member_label]: 'true' }, // point to all gossip members + { [$._config.gossip_member_label]: 'true' }, // point to all gossip members ports, ) + service.mixin.spec.withClusterIp('None'), // headless service } diff --git a/operations/mimir/ingester.libsonnet b/operations/mimir/ingester.libsonnet index fea3f190248..e6782044566 100644 --- a/operations/mimir/ingester.libsonnet +++ b/operations/mimir/ingester.libsonnet @@ -96,10 +96,8 @@ ingester_statefulset: self.newIngesterStatefulSet('ingester', $.ingester_container), - ingester_service_ignored_labels:: [], - ingester_service: - $.util.serviceFor($.ingester_statefulset, $.ingester_service_ignored_labels), + $.util.serviceFor($.ingester_statefulset, $._config.service_ignored_labels), newIngesterPdb(pdbName, ingesterName):: podDisruptionBudget.new() + diff --git a/operations/mimir/overrides-exporter.libsonnet b/operations/mimir/overrides-exporter.libsonnet index 758f27f30f2..5c6d262c54b 100644 --- a/operations/mimir/overrides-exporter.libsonnet +++ b/operations/mimir/overrides-exporter.libsonnet @@ -47,5 +47,5 @@ deployment.mixin.metadata.withLabels({ name: name }), overrides_exporter_service: - $.util.serviceFor($.overrides_exporter_deployment), + $.util.serviceFor($.overrides_exporter_deployment, $._config.service_ignored_labels), } diff --git a/operations/mimir/querier.libsonnet b/operations/mimir/querier.libsonnet index 7c5d545617e..740ebc92471 100644 --- a/operations/mimir/querier.libsonnet +++ b/operations/mimir/querier.libsonnet @@ -66,8 +66,6 @@ local service = $.core.v1.service, - querier_service_ignored_labels:: [], - querier_service: - $.util.serviceFor($.querier_deployment, $.querier_service_ignored_labels), + $.util.serviceFor($.querier_deployment, $._config.service_ignored_labels), } diff --git a/operations/mimir/query-frontend.libsonnet b/operations/mimir/query-frontend.libsonnet index 8c1c3991ef7..bb20c96fcb9 100644 --- a/operations/mimir/query-frontend.libsonnet +++ b/operations/mimir/query-frontend.libsonnet @@ -56,10 +56,10 @@ local service = $.core.v1.service, query_frontend_service: - $.util.serviceFor($.query_frontend_deployment), + $.util.serviceFor($.query_frontend_deployment, $._config.service_ignored_labels), query_frontend_discovery_service: - $.util.serviceFor($.query_frontend_deployment) + + $.util.serviceFor($.query_frontend_deployment, $._config.service_ignored_labels) + // Make sure that query frontend worker, running in the querier, do resolve // each query-frontend pod IP and NOT the service IP. To make it, we do NOT // use the service cluster IP so that when the service DNS is resolved it diff --git a/operations/mimir/query-scheduler.libsonnet b/operations/mimir/query-scheduler.libsonnet index 9db417875a8..ab3df323be1 100644 --- a/operations/mimir/query-scheduler.libsonnet +++ b/operations/mimir/query-scheduler.libsonnet @@ -34,11 +34,11 @@ self.newQuerySchedulerDeployment('query-scheduler', $.query_scheduler_container), query_scheduler_service: if !$._config.query_scheduler_enabled then {} else - $.util.serviceFor($.query_scheduler_deployment), + $.util.serviceFor($.query_scheduler_deployment, $._config.service_ignored_labels), // Headless to make sure resolution gets IP address of target pods, and not service IP. query_scheduler_discovery_service: if !$._config.query_scheduler_enabled then {} else - $.util.serviceFor($.query_scheduler_deployment) + + $.util.serviceFor($.query_scheduler_deployment, $._config.service_ignored_labels) + service.mixin.spec.withPublishNotReadyAddresses(true) + service.mixin.spec.withClusterIp('None') + service.mixin.metadata.withName('query-scheduler-discovery'), diff --git a/operations/mimir/ruler.libsonnet b/operations/mimir/ruler.libsonnet index f3da02b3542..b8553a12fe7 100644 --- a/operations/mimir/ruler.libsonnet +++ b/operations/mimir/ruler.libsonnet @@ -62,6 +62,6 @@ ruler_service: if $._config.ruler_enabled then - $.util.serviceFor($.ruler_deployment) + $.util.serviceFor($.ruler_deployment, $._config.service_ignored_labels) else {}, } diff --git a/operations/mimir/store-gateway.libsonnet b/operations/mimir/store-gateway.libsonnet index f40c32abba0..cd6b8f6fd54 100644 --- a/operations/mimir/store-gateway.libsonnet +++ b/operations/mimir/store-gateway.libsonnet @@ -94,7 +94,7 @@ store_gateway_statefulset: self.newStoreGatewayStatefulSet('store-gateway', $.store_gateway_container), store_gateway_service: - $.util.serviceFor($.store_gateway_statefulset), + $.util.serviceFor($.store_gateway_statefulset, $._config.service_ignored_labels), store_gateway_pdb: podDisruptionBudget.new() + diff --git a/operations/mimir/test-exporter.libsonnet b/operations/mimir/test-exporter.libsonnet index 9d69abee682..7e25e4e962a 100644 --- a/operations/mimir/test-exporter.libsonnet +++ b/operations/mimir/test-exporter.libsonnet @@ -36,5 +36,5 @@ if !($._config.test_exporter_enabled) then {} else - $.util.serviceFor($.test_exporter_deployment), + $.util.serviceFor($.test_exporter_deployment, $._config.service_ignored_labels), } From b1082f3470ccfb27182db8a1269fe2757f4636b2 Mon Sep 17 00:00:00 2001 From: Nick Pillitteri <56quarters@users.noreply.github.com> Date: Thu, 3 Feb 2022 09:08:58 -0500 Subject: [PATCH 087/168] Tenant federation implementation of exemplar query interfaces (#927) Allow queries with multiple tenants against exemplar endpoints. Queries for each tenant are split and run in parallel using the same logic as the existing tenant federation query endpoints. Similar to the existing federated endpoints, the label `__tenant_id__` is added to the set of series labels for each exemplar to indicate which tenant it was queried from. Signed-off-by: Nick Pillitteri --- CHANGELOG.md | 1 + integration/e2emimir/client.go | 5 + integration/querier_tenant_federation_test.go | 8 +- pkg/mimir/modules.go | 11 +- .../merge_exemplar_queryable.go | 224 ++++++++++++ .../merge_exemplar_queryable_test.go | 340 ++++++++++++++++++ .../tenantfederation/merge_queryable.go | 96 +---- .../tenantfederation/merge_queryable_test.go | 2 +- .../tenantfederation/tenant_federation.go | 76 ++++ 9 files changed, 674 insertions(+), 89 deletions(-) create mode 100644 pkg/querier/tenantfederation/merge_exemplar_queryable.go create mode 100644 pkg/querier/tenantfederation/merge_exemplar_queryable_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 7645269a5a9..1d9388d702d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -335,6 +335,7 @@ * User config size (`-alertmanager.max-config-size-bytes`) * Templates count in user config (`-alertmanager.max-templates-count`) * Max template size (`-alertmanager.max-template-size-bytes`) +* [FEATURE] Querier: Added support for tenant federation to exemplar endpoints. #927 * [ENHANCEMENT] Query-frontend: added `cortex_query_frontend_workers_enqueued_requests_total` metric to track the number of requests enqueued in each query-scheduler. #384 * [ENHANCEMENT] Add a flag (`--proxy.compare-use-relative-error`) in the query-tee to compare floating point values using relative error. #208 * [ENHANCEMENT] Add a flag (`--proxy.compare-skip-recent-samples`) in the query-tee to skip comparing recent samples. By default samples not older than 1 minute are skipped. #234 diff --git a/integration/e2emimir/client.go b/integration/e2emimir/client.go index 68591919902..42597a6a572 100644 --- a/integration/e2emimir/client.go +++ b/integration/e2emimir/client.go @@ -158,6 +158,11 @@ func (c *Client) QueryRangeRaw(query string, start, end time.Time, step time.Dur return c.DoGetBody(addr) } +// QueryExemplars runs an exemplar query. +func (c *Client) QueryExemplars(query string, start, end time.Time) ([]promv1.ExemplarQueryResult, error) { + return c.querierClient.QueryExemplars(context.Background(), query, start, end) +} + // QuerierAddress returns the address of the querier func (c *Client) QuerierAddress() string { return c.querierAddress diff --git a/integration/querier_tenant_federation_test.go b/integration/querier_tenant_federation_test.go index 6f68d8e93d5..f2fbdbba034 100644 --- a/integration/querier_tenant_federation_test.go +++ b/integration/querier_tenant_federation_test.go @@ -71,6 +71,7 @@ func runQuerierTenantFederationTest(t *testing.T, cfg querierTenantFederationCon "-frontend.results-cache.backend": "memcached", "-frontend.results-cache.memcached.addresses": "dns+" + memcached.NetworkEndpoint(e2ecache.MemcachedPort), "-tenant-federation.enabled": "true", + "-ingester.max-global-exemplars-per-user": "10000", }) // Start the query-scheduler if enabled. @@ -149,6 +150,11 @@ func runQuerierTenantFederationTest(t *testing.T, cfg querierTenantFederationCon assert.Equal(t, mergeResults(tenantIDs, expectedVectors), result.(model.Vector)) + // query exemplars for all tenants + exemplars, err := c.QueryExemplars("series_1", now.Add(-1*time.Hour), now.Add(1*time.Hour)) + require.NoError(t, err) + assert.Len(t, exemplars, numUsers) + // ensure a push to multiple tenants is failing series, _ := generateSeries("series_1", now) res, err := c.Push(series) @@ -156,7 +162,7 @@ func runQuerierTenantFederationTest(t *testing.T, cfg querierTenantFederationCon require.Equal(t, 500, res.StatusCode) // check metric label values for total queries in the query frontend - require.NoError(t, queryFrontend.WaitSumMetricsWithOptions(e2e.Equals(1), []string{"cortex_query_frontend_queries_total"}, e2e.WithLabelMatchers( + require.NoError(t, queryFrontend.WaitSumMetricsWithOptions(e2e.Equals(2), []string{"cortex_query_frontend_queries_total"}, e2e.WithLabelMatchers( labels.MustNewMatcher(labels.MatchEqual, "user", strings.Join(tenantIDs, "|")), labels.MustNewMatcher(labels.MatchEqual, "op", "query")))) diff --git a/pkg/mimir/modules.go b/pkg/mimir/modules.go index fc46e644bd5..2d680f798de 100644 --- a/pkg/mimir/modules.go +++ b/pkg/mimir/modules.go @@ -281,8 +281,9 @@ func (t *Mimir) initTenantFederation() (serv services.Service, err error) { // Make sure the mergeQuerier is only used for request with more than a // single tenant. This allows for a less impactful enabling of tenant // federation. - const byPassForSingleQuerier = true - t.QuerierQueryable = querier.NewSampleAndChunkQueryable(tenantfederation.NewQueryable(t.QuerierQueryable, byPassForSingleQuerier, util_log.Logger)) + const bypassForSingleQuerier = true + t.QuerierQueryable = querier.NewSampleAndChunkQueryable(tenantfederation.NewQueryable(t.QuerierQueryable, bypassForSingleQuerier, util_log.Logger)) + t.ExemplarQueryable = tenantfederation.NewExemplarQueryable(t.ExemplarQueryable, bypassForSingleQuerier, util_log.Logger) } return nil, nil } @@ -533,12 +534,12 @@ func (t *Mimir) initRuler() (serv services.Service, err error) { if !t.Cfg.TenantFederation.Enabled { return nil, errors.New("-ruler.tenant-federation.enabled=true requires -tenant-federation.enabled=true") } - // Setting byPassForSingleQuerier=false forces `tenantfederation.NewQueryable` to add + // Setting bypassForSingleQuerier=false forces `tenantfederation.NewQueryable` to add // the `__tenant_id__` label on all metrics regardless if they're for a single tenant or multiple tenants. // This makes this label more consistent and hopefully less confusing to users. - const byPassForSingleQuerier = false + const bypassForSingleQuerier = false - federatedQueryable = tenantfederation.NewQueryable(queryable, byPassForSingleQuerier, util_log.Logger) + federatedQueryable = tenantfederation.NewQueryable(queryable, bypassForSingleQuerier, util_log.Logger) } managerFactory := ruler.DefaultTenantManagerFactory(t.Cfg.Ruler, t.Distributor, queryable, federatedQueryable, eng, t.Overrides, prometheus.DefaultRegisterer) diff --git a/pkg/querier/tenantfederation/merge_exemplar_queryable.go b/pkg/querier/tenantfederation/merge_exemplar_queryable.go new file mode 100644 index 00000000000..e73886dbc90 --- /dev/null +++ b/pkg/querier/tenantfederation/merge_exemplar_queryable.go @@ -0,0 +1,224 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package tenantfederation + +import ( + "context" + "fmt" + + "github.com/go-kit/log" + "github.com/grafana/dskit/concurrency" + "github.com/prometheus/prometheus/model/exemplar" + "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/storage" + "github.com/weaveworks/common/user" + + "github.com/grafana/mimir/pkg/tenant" + "github.com/grafana/mimir/pkg/util/spanlogger" +) + +// NewExemplarQueryable returns an exemplar queryable that makes requests for +// all tenant IDs that are part of the request and aggregates the results from +// each tenant's ExemplarQuerier. +// +// Results contain the series label __tenant_id__ to identify which tenant the +// exemplar is from. +// +// By setting bypassWithSingleQuerier to true, tenant federation logic gets +// bypassed if the request is only for a single tenant. The requests will also +// not contain the pseudo series label __tenant_id__ in this case. +func NewExemplarQueryable(upstream storage.ExemplarQueryable, bypassWithSingleQuerier bool, logger log.Logger) storage.ExemplarQueryable { + return NewMergeExemplarQueryable(defaultTenantLabel, upstream, bypassWithSingleQuerier, logger) +} + +// NewMergeExemplarQueryable returns an exemplar queryable that makes requests for +// all tenant IDs that are part of the request and aggregates the results from +// each tenant's ExemplarQuerier. +// +// Results contain the series label `idLabelName` to identify which tenant the +// exemplar is from. +// +// By setting bypassWithSingleQuerier to true, tenant federation logic gets +// bypassed if the request is only for a single tenant. The requests will also +// not contain the pseudo series label `idLabelName` in this case. +func NewMergeExemplarQueryable(idLabelName string, upstream storage.ExemplarQueryable, bypassWithSingleQuerier bool, logger log.Logger) storage.ExemplarQueryable { + return &mergeExemplarQueryable{ + logger: logger, + idLabelName: idLabelName, + bypassWithSingleQuerier: bypassWithSingleQuerier, + upstream: upstream, + } +} + +type mergeExemplarQueryable struct { + logger log.Logger + idLabelName string + bypassWithSingleQuerier bool + upstream storage.ExemplarQueryable +} + +// tenantsAndQueriers returns a list of tenant IDs and corresponding queriers based on the context +func (m *mergeExemplarQueryable) tenantsAndQueriers(ctx context.Context) ([]string, []storage.ExemplarQuerier, error) { + tenantIDs, err := tenant.TenantIDs(ctx) + if err != nil { + return nil, nil, err + } + + queriers := make([]storage.ExemplarQuerier, len(tenantIDs)) + for i, tenantID := range tenantIDs { + q, err := m.upstream.ExemplarQuerier(user.InjectOrgID(ctx, tenantID)) + if err != nil { + return nil, nil, err + } + + queriers[i] = q + } + + return tenantIDs, queriers, nil +} + +// ExemplarQuerier returns a new querier that aggregates results from queries run +// across multiple tenants +func (m *mergeExemplarQueryable) ExemplarQuerier(ctx context.Context) (storage.ExemplarQuerier, error) { + ids, queriers, err := m.tenantsAndQueriers(ctx) + if err != nil { + return nil, err + } + + // If desired and there is only a single querier, just return it directly instead + // of going through the federation querier. bypassWithSingleQuerier=true allows a + // bit less overhead when it's not needed while bypassWithSingleQuerier=false will + // consistently add a __tenant_id__ label to all results. + if m.bypassWithSingleQuerier && len(queriers) == 1 { + return queriers[0], nil + } + + return &mergeExemplarQuerier{ + logger: m.logger, + ctx: ctx, + idLabelName: m.idLabelName, + tenants: ids, + queriers: queriers, + }, nil +} + +type exemplarJob struct { + tenant string + matchers [][]*labels.Matcher + querier storage.ExemplarQuerier +} + +type mergeExemplarQuerier struct { + logger log.Logger + ctx context.Context + idLabelName string + tenants []string + queriers []storage.ExemplarQuerier +} + +// Select returns the union exemplars within the time range that match each slice of +// matchers, across multiple tenants. The query for each tenant is forwarded to an +// instance of an upstream querier. +func (m *mergeExemplarQuerier) Select(start, end int64, matchers ...[]*labels.Matcher) ([]exemplar.QueryResult, error) { + spanlog, ctx := spanlogger.NewWithLogger(m.ctx, m.logger, "mergeExemplarQuerier.Select") + defer spanlog.Finish() + + // If we have any matchers that are looking for __tenant_id__, use that to filter down the + // original list of tenants given to this querier and then remove those matchers from the list + // that will be passed to each querier. We do this because the label isn't an actual label on + // the series/exemplars, it's a generated label we add when performing the query. + filteredTenants, filteredMatchers := filterTenantsAndRewriteMatchers(m.idLabelName, m.tenants, matchers) + + // In order to run a query for each tenant in parallel and have them all write to the same + // structure, we create a slice of jobs and results of the same size. Each job writes to its + // corresponding slot in the results slice. This way we avoid the need for locks. + jobs := make([]*exemplarJob, len(filteredTenants)) + results := make([][]exemplar.QueryResult, len(filteredTenants)) + + jobIdx := 0 + for idIdx, tenantID := range m.tenants { + // Upstream queriers are indexed corresponding to the original, non-filtered, IDs + // given to this querier. Iterate over the original list of tenant IDs but skip if + // this tenant ID got filtered out. Otherwise, use the index of this tenant ID to + // pick the corresponding querier. + if _, matched := filteredTenants[tenantID]; !matched { + continue + } + + // Each job gets a copy of the matchers provided to this method so that upstream + // queriers don't modify our slice of filtered matchers. Otherwise, each querier + // might modify the slice and end up with an ever-growing list of matchers. + jobMatchers := make([][]*labels.Matcher, len(filteredMatchers)) + copy(jobMatchers, filteredMatchers) + + jobs[jobIdx] = &exemplarJob{ + tenant: tenantID, + matchers: jobMatchers, + querier: m.queriers[idIdx], + } + + jobIdx++ + } + + // Each task grabs a job object from the slice and stores its results in the corresponding + // index in the results slice. The job handles performing a tenant-specific exemplar query + // and adding a tenant ID label to each of the results. + run := func(ctx context.Context, idx int) error { + job := jobs[idx] + + res, err := job.querier.Select(start, end, job.matchers...) + if err != nil { + return fmt.Errorf("unable to run federated exemplar query for %s: %w", job.tenant, err) + } + + for i, e := range res { + e.SeriesLabels = setLabelsRetainExisting(e.SeriesLabels, labels.Label{ + Name: m.idLabelName, + Value: job.tenant, + }) + + res[i] = e + } + + results[idx] = res + return nil + } + + err := concurrency.ForEachJob(ctx, len(jobs), maxConcurrency, run) + if err != nil { + return nil, err + } + + var out []exemplar.QueryResult + for _, exemplars := range results { + out = append(out, exemplars...) + } + + return out, nil +} + +func filterTenantsAndRewriteMatchers(idLabelName string, ids []string, allMatchers [][]*labels.Matcher) (map[string]struct{}, [][]*labels.Matcher) { + // If there are no potential matchers by which we could filter down the list of tenants that + // we're getting exemplars for, just return the full set and provided matchers verbatim. + if len(allMatchers) == 0 { + return sliceToSet(ids), allMatchers + } + + outIds := make(map[string]struct{}) + outMatchers := make([][]*labels.Matcher, len(allMatchers)) + + // The ExemplarQuerier.Select method accepts a slice of slices of matchers. The matchers within + // a single slice are AND'd together (intersection) and each outer slice is OR'd together (union). + // In order to support that, we start with a set of 0 tenant IDs and add any tenant IDs that remain + // after filtering (based on the inner slice of matchers), for each outer slice. + for i, matchers := range allMatchers { + filteredIds, unrelatedMatchers := filterValuesByMatchers(idLabelName, ids, matchers...) + for k := range filteredIds { + outIds[k] = struct{}{} + } + + outMatchers[i] = unrelatedMatchers + } + + return outIds, outMatchers +} diff --git a/pkg/querier/tenantfederation/merge_exemplar_queryable_test.go b/pkg/querier/tenantfederation/merge_exemplar_queryable_test.go new file mode 100644 index 00000000000..029b88ecf34 --- /dev/null +++ b/pkg/querier/tenantfederation/merge_exemplar_queryable_test.go @@ -0,0 +1,340 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package tenantfederation + +import ( + "context" + "errors" + "fmt" + "testing" + "time" + + "github.com/prometheus/prometheus/model/exemplar" + "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/storage" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/weaveworks/common/user" + + "github.com/grafana/mimir/pkg/tenant" + "github.com/grafana/mimir/pkg/util/test" +) + +type mockExemplarQueryable struct { + queriers map[string]storage.ExemplarQuerier + err error +} + +func (m *mockExemplarQueryable) ExemplarQuerier(ctx context.Context) (storage.ExemplarQuerier, error) { + if m.err != nil { + return nil, m.err + } + + ids, err := tenant.TenantIDs(ctx) + if err != nil { + return nil, err + } + + if len(ids) != 1 { + return nil, fmt.Errorf("single tenant ID expected in mock queryable, got %+v", ids) + } + + if q, ok := m.queriers[ids[0]]; ok { + return q, nil + } + + return nil, fmt.Errorf("no error or mock queriers configured for mock exemplar queryable. context: %+v", ctx) +} + +type mockExemplarQuerier struct { + res []exemplar.QueryResult + err error +} + +func (m *mockExemplarQuerier) Select(_, _ int64, allMatchers ...[]*labels.Matcher) ([]exemplar.QueryResult, error) { + if m.err != nil { + return nil, m.err + } + + unique := make(map[string]exemplar.QueryResult) + + for _, r := range m.res { + for _, matchers := range allMatchers { + // If the result matches this bundle of matchers, put it in the output and + // break the matcher loop (the contract is that the matchers within each slice + // are AND'd together which each slice of matches is OR'd together) and move + // on the testing the next result. + if m.matches(r, matchers) { + unique[r.SeriesLabels.String()] = r + break + } + } + } + + out := make([]exemplar.QueryResult, 0, len(unique)) + for _, r := range unique { + out = append(out, r) + } + + return out, nil +} + +func (m *mockExemplarQuerier) matches(res exemplar.QueryResult, matchers []*labels.Matcher) bool { + for _, l := range res.SeriesLabels { + for _, m := range matchers { + if m.Name == l.Name && !m.Matches(l.Value) { + return false + } + } + } + + return true +} + +func TestMergeExemplarQueryable_ExemplarQuerier(t *testing.T) { + resolver := tenant.DefaultResolver + tenant.WithDefaultResolver(tenant.NewMultiResolver()) + + t.Cleanup(func() { + tenant.WithDefaultResolver(resolver) + }) + + t.Run("error getting tenant IDs", func(t *testing.T) { + upstream := &mockExemplarQueryable{} + federated := NewExemplarQueryable(upstream, false, test.NewTestingLogger(t)) + + q, err := federated.ExemplarQuerier(context.Background()) + assert.ErrorIs(t, err, user.ErrNoOrgID) + assert.Nil(t, q) + }) + + t.Run("error getting upstream querier", func(t *testing.T) { + ctx := user.InjectOrgID(context.Background(), "123") + upstream := &mockExemplarQueryable{err: errors.New("unable to get querier")} + federated := NewExemplarQueryable(upstream, false, test.NewTestingLogger(t)) + + q, err := federated.ExemplarQuerier(ctx) + assert.Error(t, err) + assert.Nil(t, q) + }) + + t.Run("single tenant bypass single querier happy path", func(t *testing.T) { + ctx := user.InjectOrgID(context.Background(), "123") + querier := &mockExemplarQuerier{} + upstream := &mockExemplarQueryable{queriers: map[string]storage.ExemplarQuerier{"123": querier}} + federated := NewExemplarQueryable(upstream, true, test.NewTestingLogger(t)) + + q, err := federated.ExemplarQuerier(ctx) + assert.NoError(t, err) + assert.Same(t, q, querier) + }) + + t.Run("single tenant federated happy path", func(t *testing.T) { + ctx := user.InjectOrgID(context.Background(), "123") + querier := &mockExemplarQuerier{} + upstream := &mockExemplarQueryable{queriers: map[string]storage.ExemplarQuerier{"123": querier}} + federated := NewExemplarQueryable(upstream, false, test.NewTestingLogger(t)) + + q, err := federated.ExemplarQuerier(ctx) + require.NoError(t, err) + require.IsType(t, q, &mergeExemplarQuerier{}) + + mergeQ := q.(*mergeExemplarQuerier) + assert.Len(t, mergeQ.tenants, 1) + assert.Len(t, mergeQ.queriers, 1) + }) + + t.Run("multi tenant federated happy path", func(t *testing.T) { + ctx := user.InjectOrgID(context.Background(), "123|456") + querier1 := &mockExemplarQuerier{} + querier2 := &mockExemplarQuerier{} + upstream := &mockExemplarQueryable{queriers: map[string]storage.ExemplarQuerier{ + "123": querier1, + "456": querier2, + }} + federated := NewExemplarQueryable(upstream, false, test.NewTestingLogger(t)) + + q, err := federated.ExemplarQuerier(ctx) + require.NoError(t, err) + require.IsType(t, q, &mergeExemplarQuerier{}) + + mergeQ := q.(*mergeExemplarQuerier) + assert.Len(t, mergeQ.tenants, 2) + assert.Len(t, mergeQ.queriers, 2) + }) +} + +func TestMergeExemplarQuerier_Select(t *testing.T) { + resolver := tenant.DefaultResolver + tenant.WithDefaultResolver(tenant.NewMultiResolver()) + + t.Cleanup(func() { + tenant.WithDefaultResolver(resolver) + }) + + now := time.Now() + + // fixtureResults returns two slices of exemplar results, one for each of two + // mock queriers that will be used as the upstream for various merge queryable + // tests below. + fixtureResults := func() ([]exemplar.QueryResult, []exemplar.QueryResult) { + res1 := []exemplar.QueryResult{ + { + SeriesLabels: labels.Labels{ + { + Name: "__name__", + Value: "request_duration_seconds", + }, + }, + Exemplars: []exemplar.Exemplar{ + { + Labels: labels.Labels{{Name: "traceID", Value: "abc123"}}, + Value: 123.4, + Ts: now.UnixMilli(), + }, + }, + }, + } + + res2 := []exemplar.QueryResult{ + { + SeriesLabels: labels.Labels{ + { + Name: "__name__", + Value: "request_duration_seconds", + }, + }, + Exemplars: []exemplar.Exemplar{ + { + Labels: labels.Labels{{Name: "traceID", Value: "abc456"}}, + Value: 456.7, + Ts: now.UnixMilli(), + }, + }, + }, + } + + return res1, res2 + } + + // Matchers included a matcher looking for a specific tenant ID. Ensure that we only + // get results from a single tenant in this case even though both queriers return results. + t.Run("two tenants one filtered", func(t *testing.T) { + matchers := [][]*labels.Matcher{{ + labels.MustNewMatcher(labels.MatchEqual, "__name__", "request_duration_seconds"), + labels.MustNewMatcher(labels.MatchEqual, "__tenant_id__", "123"), + }} + + res1, res2 := fixtureResults() + upstream := &mockExemplarQueryable{queriers: map[string]storage.ExemplarQuerier{ + "123": &mockExemplarQuerier{res: res1}, + "456": &mockExemplarQuerier{res: res2}, + }} + + federated := NewExemplarQueryable(upstream, false, test.NewTestingLogger(t)) + q, err := federated.ExemplarQuerier(user.InjectOrgID(context.Background(), "123|456")) + require.NoError(t, err) + + exemplars, err := q.Select(0, now.UnixMilli(), matchers...) + require.NoError(t, err) + require.Len(t, exemplars, 1) + assert.Equal(t, exemplars[0].SeriesLabels.Get("__tenant_id__"), "123") + assert.Equal(t, exemplars[0].Exemplars[0].Value, 123.4) + assert.Equal(t, exemplars[0].Exemplars[0].Labels.Get("traceID"), "abc123") + }) + + // There are no matchers that reference __tenant_id__, make sure we get the expected + // number of exemplar results (i.e. one from each of the two upstream queriers). + t.Run("two tenants no filtering", func(t *testing.T) { + matchers := [][]*labels.Matcher{{ + labels.MustNewMatcher(labels.MatchEqual, "__name__", "request_duration_seconds"), + }} + + res1, res2 := fixtureResults() + upstream := &mockExemplarQueryable{queriers: map[string]storage.ExemplarQuerier{ + "123": &mockExemplarQuerier{res: res1}, + "456": &mockExemplarQuerier{res: res2}, + }} + + federated := NewExemplarQueryable(upstream, false, test.NewTestingLogger(t)) + q, err := federated.ExemplarQuerier(user.InjectOrgID(context.Background(), "123|456")) + require.NoError(t, err) + + exemplars, err := q.Select(0, now.UnixMilli(), matchers...) + assert.NoError(t, err) + assert.Len(t, exemplars, 2) + }) + + // Each of the groups of matchers require a specific __tenant_id__ BUT, since they + // each reference one of the two IDs we're querying for we end up returning results + // from each of the upstream queriers. + t.Run("two tenants two groups of matchers filtering", func(t *testing.T) { + matchers := [][]*labels.Matcher{ + { + labels.MustNewMatcher(labels.MatchEqual, "__name__", "request_duration_seconds"), + labels.MustNewMatcher(labels.MatchEqual, "__tenant_id__", "123"), + }, + { + labels.MustNewMatcher(labels.MatchEqual, "__name__", "request_duration_seconds"), + labels.MustNewMatcher(labels.MatchEqual, "__tenant_id__", "456"), + }, + } + + res1, res2 := fixtureResults() + upstream := &mockExemplarQueryable{queriers: map[string]storage.ExemplarQuerier{ + "123": &mockExemplarQuerier{res: res1}, + "456": &mockExemplarQuerier{res: res2}, + }} + + federated := NewExemplarQueryable(upstream, false, test.NewTestingLogger(t)) + q, err := federated.ExemplarQuerier(user.InjectOrgID(context.Background(), "123|456")) + require.NoError(t, err) + + exemplars, err := q.Select(0, now.UnixMilli(), matchers...) + assert.NoError(t, err) + assert.Len(t, exemplars, 2) + }) + + // With no matchers, none of the results returned from each of the upstream queriers + // will actually be selected. Ensure that we get no results from the merge querier in + // this case. + t.Run("no matchers to filter", func(t *testing.T) { + var matchers [][]*labels.Matcher + + res1, res2 := fixtureResults() + upstream := &mockExemplarQueryable{queriers: map[string]storage.ExemplarQuerier{ + "123": &mockExemplarQuerier{res: res1}, + "456": &mockExemplarQuerier{res: res2}, + }} + + federated := NewExemplarQueryable(upstream, false, test.NewTestingLogger(t)) + q, err := federated.ExemplarQuerier(user.InjectOrgID(context.Background(), "123|456")) + require.NoError(t, err) + + exemplars, err := q.Select(0, now.UnixMilli(), matchers...) + assert.NoError(t, err) + assert.Empty(t, exemplars) + }) + + // Ensure that an error from an upstream querier means we get an error response from the + // merge querier, regardless if other queriers return results successfully. + t.Run("upstream error", func(t *testing.T) { + matchers := [][]*labels.Matcher{{ + labels.MustNewMatcher(labels.MatchEqual, "__name__", "request_duration_seconds"), + }} + + res1, _ := fixtureResults() + upstream := &mockExemplarQueryable{queriers: map[string]storage.ExemplarQuerier{ + "123": &mockExemplarQuerier{res: res1}, + "456": &mockExemplarQuerier{err: errors.New("timeout running exemplar query")}, + }} + + federated := NewExemplarQueryable(upstream, false, test.NewTestingLogger(t)) + q, err := federated.ExemplarQuerier(user.InjectOrgID(context.Background(), "123|456")) + require.NoError(t, err) + + exemplars, err := q.Select(0, now.UnixMilli(), matchers...) + assert.Error(t, err) + assert.Empty(t, exemplars) + }) +} diff --git a/pkg/querier/tenantfederation/merge_queryable.go b/pkg/querier/tenantfederation/merge_queryable.go index 7511b121368..c86704623f8 100644 --- a/pkg/querier/tenantfederation/merge_queryable.go +++ b/pkg/querier/tenantfederation/merge_queryable.go @@ -23,16 +23,10 @@ import ( "github.com/grafana/mimir/pkg/util/spanlogger" ) -const ( - defaultTenantLabel = "__tenant_id__" - retainExistingPrefix = "original_" - maxConcurrency = 16 -) - // NewQueryable returns a queryable that iterates through all the tenant IDs // that are part of the request and aggregates the results from each tenant's // Querier by sending of subsequent requests. -// By setting byPassWithSingleQuerier to true the mergeQuerier gets by-passed +// By setting bypassWithSingleQuerier to true the mergeQuerier gets bypassed // and results for request with a single querier will not contain the // "__tenant_id__" label. This allows a smoother transition, when enabling // tenant federation in a cluster. @@ -76,7 +70,7 @@ type MergeQuerierCallback func(ctx context.Context, mint int64, maxt int64) (ids // NewMergeQueryable returns a queryable that merges results from multiple // underlying Queryables. The underlying queryables and its label values to be // considered are returned by a MergeQuerierCallback. -// By setting byPassWithSingleQuerier to true the mergeQuerier gets by-passed +// By setting bypassWithSingleQuerier to true the mergeQuerier gets bypassed // and results for request with a single querier will not contain the id label. // This allows a smoother transition, when enabling tenant federation in a // cluster. @@ -90,14 +84,14 @@ func NewMergeQueryable(idLabelName string, callback MergeQuerierCallback, byPass logger: logger, idLabelName: idLabelName, callback: callback, - byPassWithSingleQuerier: byPassWithSingleQuerier, + bypassWithSingleQuerier: byPassWithSingleQuerier, } } type mergeQueryable struct { logger log.Logger idLabelName string - byPassWithSingleQuerier bool + bypassWithSingleQuerier bool callback MergeQuerierCallback } @@ -113,7 +107,7 @@ func (m *mergeQueryable) Querier(ctx context.Context, mint int64, maxt int64) (s } // by pass when only single querier is returned - if m.byPassWithSingleQuerier && len(queriers) == 1 { + if m.bypassWithSingleQuerier && len(queriers) == 1 { return queriers[0], nil } @@ -146,8 +140,8 @@ type mergeQuerier struct { // For the label "original_" + `idLabelName it will return all the values // of the underlying queriers for `idLabelName`. func (m *mergeQuerier) LabelValues(name string, matchers ...*labels.Matcher) ([]string, storage.Warnings, error) { - log, _ := spanlogger.NewWithLogger(m.ctx, m.logger, "mergeQuerier.LabelValues") - defer log.Span.Finish() + spanlog, _ := spanlogger.NewWithLogger(m.ctx, m.logger, "mergeQuerier.LabelValues") + defer spanlog.Finish() matchedTenants, filteredMatchers := filterValuesByMatchers(m.idLabelName, m.ids, matchers...) @@ -176,8 +170,8 @@ func (m *mergeQuerier) LabelValues(name string, matchers ...*labels.Matcher) ([] // queriers. It also adds the `idLabelName` and if present in the original // results the original `idLabelName`. func (m *mergeQuerier) LabelNames(matchers ...*labels.Matcher) ([]string, storage.Warnings, error) { - log, _ := spanlogger.NewWithLogger(m.ctx, m.logger, "mergeQuerier.LabelNames") - defer log.Span.Finish() + spanlog, _ := spanlogger.NewWithLogger(m.ctx, m.logger, "mergeQuerier.LabelNames") + defer spanlog.Finish() matchedTenants, filteredMatchers := filterValuesByMatchers(m.idLabelName, m.ids, matchers...) @@ -287,7 +281,6 @@ func (m *mergeQuerier) Close() error { } type selectJob struct { - pos int querier storage.Querier id string } @@ -297,9 +290,11 @@ type selectJob struct { // matching. The forwarded labelSelector is not containing those that operate // on `idLabelName`. func (m *mergeQuerier) Select(sortSeries bool, hints *storage.SelectHints, matchers ...*labels.Matcher) storage.SeriesSet { - log, ctx := spanlogger.NewWithLogger(m.ctx, m.logger, "mergeQuerier.Select") - defer log.Span.Finish() + spanlog, ctx := spanlogger.NewWithLogger(m.ctx, m.logger, "mergeQuerier.Select") + defer spanlog.Finish() + matchedValues, filteredMatchers := filterValuesByMatchers(m.idLabelName, m.ids, matchers...) + var jobs = make([]*selectJob, len(matchedValues)) var seriesSets = make([]storage.SeriesSet, len(matchedValues)) var jobPos int @@ -308,7 +303,6 @@ func (m *mergeQuerier) Select(sortSeries bool, hints *storage.SelectHints, match continue } jobs[jobPos] = &selectJob{ - pos: jobPos, querier: m.queriers[labelPos], id: m.ids[labelPos], } @@ -317,7 +311,7 @@ func (m *mergeQuerier) Select(sortSeries bool, hints *storage.SelectHints, match run := func(ctx context.Context, idx int) error { job := jobs[idx] - seriesSets[job.pos] = &addLabelsSeriesSet{ + seriesSets[idx] = &addLabelsSeriesSet{ upstream: job.querier.Select(sortSeries, hints, filteredMatchers...), labels: labels.Labels{ { @@ -337,50 +331,6 @@ func (m *mergeQuerier) Select(sortSeries bool, hints *storage.SelectHints, match return storage.NewMergeSeriesSet(seriesSets, storage.ChainedSeriesMerge) } -// filterValuesByMatchers applies matchers to inputed `idLabelName` and -// `ids`. A map of matched values is returned and also all label matchers not -// matching the `idLabelName`. -// In case a label matcher is set on a label conflicting with `idLabelName`, we -// need to rename this labelMatcher's name to its original name. This is used -// to as part of Select in the mergeQueryable, to ensure only relevant queries -// are considered and the forwarded matchers do not contain matchers on the -// `idLabelName`. -func filterValuesByMatchers(idLabelName string, ids []string, matchers ...*labels.Matcher) (matchedIDs map[string]struct{}, unrelatedMatchers []*labels.Matcher) { - // this contains the matchers which are not related to idLabelName - unrelatedMatchers = make([]*labels.Matcher, 0, len(matchers)) - - // build map of values to consider for the matchers - matchedIDs = make(map[string]struct{}, len(ids)) - for _, value := range ids { - matchedIDs[value] = struct{}{} - } - - for _, m := range matchers { - switch m.Name { - // matcher has idLabelName to target a specific tenant(s) - case idLabelName: - for value := range matchedIDs { - if !m.Matches(value) { - delete(matchedIDs, value) - } - } - - // check if has the retained label name - case retainExistingPrefix + idLabelName: - // rewrite label to the original name, by copying matcher and - // replacing the label name - rewrittenM := *m - rewrittenM.Name = idLabelName - unrelatedMatchers = append(unrelatedMatchers, &rewrittenM) - - default: - unrelatedMatchers = append(unrelatedMatchers, m) - } - } - - return matchedIDs, unrelatedMatchers -} - type addLabelsSeriesSet struct { upstream storage.SeriesSet labels labels.Labels @@ -449,21 +399,3 @@ func (a *addLabelsSeries) Labels() labels.Labels { func (a *addLabelsSeries) Iterator() chunkenc.Iterator { return a.upstream.Iterator() } - -// this sets a label and preserves an existing value a new label prefixed with -// original_. It doesn't do this recursively. -func setLabelsRetainExisting(src labels.Labels, additionalLabels ...labels.Label) labels.Labels { - lb := labels.NewBuilder(src) - - for _, additionalL := range additionalLabels { - if oldValue := src.Get(additionalL.Name); oldValue != "" { - lb.Set( - retainExistingPrefix+additionalL.Name, - oldValue, - ) - } - lb.Set(additionalL.Name, additionalL.Value) - } - - return lb.Labels() -} diff --git a/pkg/querier/tenantfederation/merge_queryable_test.go b/pkg/querier/tenantfederation/merge_queryable_test.go index 2e3cf2d8a99..e3283170d33 100644 --- a/pkg/querier/tenantfederation/merge_queryable_test.go +++ b/pkg/querier/tenantfederation/merge_queryable_test.go @@ -345,7 +345,7 @@ type labelValuesScenario struct { func TestMergeQueryable_Querier(t *testing.T) { t.Run("querying without a tenant specified should error", func(t *testing.T) { queryable := &mockTenantQueryableWithFilter{logger: log.NewNopLogger()} - q := NewQueryable(queryable, false /* byPassWithSingleQuerier */, log.NewNopLogger()) + q := NewQueryable(queryable, false /* bypassWithSingleQuerier */, log.NewNopLogger()) // Create a context with no tenant specified. ctx := context.Background() diff --git a/pkg/querier/tenantfederation/tenant_federation.go b/pkg/querier/tenantfederation/tenant_federation.go index 018c696eb95..e5d3a65e6e9 100644 --- a/pkg/querier/tenantfederation/tenant_federation.go +++ b/pkg/querier/tenantfederation/tenant_federation.go @@ -7,6 +7,14 @@ package tenantfederation import ( "flag" + + "github.com/prometheus/prometheus/model/labels" +) + +const ( + defaultTenantLabel = "__tenant_id__" + retainExistingPrefix = "original_" + maxConcurrency = 16 ) type Config struct { @@ -17,3 +25,71 @@ type Config struct { func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.BoolVar(&cfg.Enabled, "tenant-federation.enabled", false, "If enabled on all services, queries can be federated across multiple tenants. The tenant IDs involved need to be specified separated by a '|' character in the 'X-Scope-OrgID' header.") } + +// filterValuesByMatchers applies matchers to inputed `idLabelName` and +// `ids`. A set of matched IDs is returned and also all label matchers not +// targeting the `idLabelName` label. +// +// In case a label matcher is set on a label conflicting with `idLabelName`, we +// need to rename this labelMatcher's name to its original name. This is used +// to as part of Select in the mergeQueryable, to ensure only relevant queries +// are considered and the forwarded matchers do not contain matchers on the +// `idLabelName`. +func filterValuesByMatchers(idLabelName string, ids []string, matchers ...*labels.Matcher) (matchedIDs map[string]struct{}, unrelatedMatchers []*labels.Matcher) { + // this contains the matchers which are not related to idLabelName + unrelatedMatchers = make([]*labels.Matcher, 0, len(matchers)) + + // build map of values to consider for the matchers + matchedIDs = sliceToSet(ids) + + for _, m := range matchers { + switch m.Name { + // matcher has idLabelName to target a specific tenant(s) + case idLabelName: + for value := range matchedIDs { + if !m.Matches(value) { + delete(matchedIDs, value) + } + } + + // check if has the retained label name + case retainExistingPrefix + idLabelName: + // rewrite label to the original name, by copying matcher and + // replacing the label name + rewrittenM := *m + rewrittenM.Name = idLabelName + unrelatedMatchers = append(unrelatedMatchers, &rewrittenM) + + default: + unrelatedMatchers = append(unrelatedMatchers, m) + } + } + + return matchedIDs, unrelatedMatchers +} + +// this sets a label and preserves an existing value a new label prefixed with +// original_. It doesn't do this recursively. +func setLabelsRetainExisting(src labels.Labels, additionalLabels ...labels.Label) labels.Labels { + lb := labels.NewBuilder(src) + + for _, additionalL := range additionalLabels { + if oldValue := src.Get(additionalL.Name); oldValue != "" { + lb.Set( + retainExistingPrefix+additionalL.Name, + oldValue, + ) + } + lb.Set(additionalL.Name, additionalL.Value) + } + + return lb.Labels() +} + +func sliceToSet(values []string) map[string]struct{} { + out := make(map[string]struct{}, len(values)) + for _, v := range values { + out[v] = struct{}{} + } + return out +} From e4a4cefdec483c618316e091878f3edbda0ab087 Mon Sep 17 00:00:00 2001 From: Richard Hartmann Date: Thu, 3 Feb 2022 15:35:20 +0100 Subject: [PATCH 088/168] Add Grafana Labs SECURITY.md (#1019) Signed-off-by: Richard Hartmann --- SECURITY.md | 89 +++++++---------------------------------------------- 1 file changed, 11 insertions(+), 78 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index ba07c5344e3..b8697c164d6 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,87 +1,20 @@ -# Cortex Security and Disclosure Information +# Reporting security issues -As with any complex system, it is certain that bugs will be found, some of them security-relevant. If you find a _security bug_ please report it privately to the maintainers listed in the MAINTAINERS of the relevant repository and CC cortex-team@googlegroups.com. We will fix the issue as soon as possible and coordinate a release date with you. You will be able to choose if you want public acknowledgement of your effort and if you want to be mentioned by name. +If you think you have found a security vulnerability, please send a report to [security@grafana.com](mailto:security@grafana.com). This address can be used for all of Grafana Labs's open source and commercial products (including but not limited to Grafana, Grafana Cloud, Grafana Enterprise, and grafana.com). We can accept only vulnerability reports at this address. -## Public Disclosure Timing +Please encrypt your message to us; please use our PGP key. The key fingerprint is: -The public disclosure date is agreed between the Cortex Team and the bug submitter. We prefer to fully disclose the bug as soon as possible, but only after a mitigation or fix is available. We will ask for delay if the bug or the fix is not yet fully understood or the solution is not tested to our standards yet. While there is no fixed timeframe for fix & disclosure, we will try our best to be quick and do not expect to need the usual 90 days most companies ask or. For a vulnerability with a straightforward mitigation, we expect report date to disclosure date to be on the order of 7 days. +F988 7BEA 027A 049F AE8E 5CAA D125 8932 BE24 C5CA ---- +The key is available from [keyserver.ubuntu.com](https://keyserver.ubuntu.com/pks/lookup?search=0xF9887BEA027A049FAE8E5CAAD1258932BE24C5CA&fingerprint=on&op=index). -## Private Vendors List +Grafana Labs will send you a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance. -We also have a list for vendors who provide Cortex to their users. -This list is not intended for individuals to find out about security issues. +**Important:** We ask you to not disclose the vulnerability before it have been fixed and announced, unless you received a response from the Grafana Labs security team that you can do so. -### Embargo Policy +## Security announcements -The information members receive on cortex-vendors-announce@googlegroups.com -must not be made public, shared, nor even hinted at anywhere -beyond the need-to-know within your specific team except with the list's -explicit approval. This holds true until the public disclosure date/time that was -agreed upon by the list. Members of the list and others may not use the information -for anything other than getting the issue fixed for your respective vendor’s users. +We maintain a category on the community site called [Security Announcements](https://community.grafana.com/c/support/security-announcements), +where we will post a summary, remediation, and mitigation details for any patch containing security fixes. -Before any information from the list is shared with respective members of your -team required to fix said issue, they must agree to the same terms and only -find out information on a need-to-know basis. - -In the unfortunate event you share the information beyond what is allowed by -this policy, you _must_ urgently inform the cortex-team@googlegroups.com -mailing list of exactly what information -leaked and to whom. A retrospective will take place after the leak so -we can assess how to not make the same mistake in the future. - -If you continue to leak information and break the policy outlined here, you -will be removed from the list. - -### Contributing Back - -This is a team effort. As a member of the list you must carry some water. This -could be in the form of the following: - -**Technical** - -- Review and/or test the proposed patches and point out potential issues with - them (such as incomplete fixes for the originally reported issues, additional - issues you might notice, and newly introduced bugs), and inform the list of the - work done even if no issues were encountered. - -**Administrative** - -- Help draft emails to the public disclosure mailing list. -- Help with release notes. - -### Membership - -Group membership is managed by the Cortex maintainers using Google Groups. - -### Membership Criteria - -To be eligible for the cortex-vendors-announce@googlegroups.com mailing list, your -company should: - -0. Have an actively monitored security email alias for our project. -1. Have a public hosted version/distribution of Cortex. -2. Have a user base not limited to your own organization. -3. Not be a downstream or rebuild of another vendor. -4. Be a participant and active contributor in the community. -5. Accept the [Embargo Policy](#embargo-policy) that is outlined above. -6. Be willing to [contribute back](#contributing-back) as outlined above. - -**Removal**: If your vendor stops meeting one or more of these criteria -after joining the list then you will be unsubscribed. - -### Request to Join - -Please open an issue to the repo with the details to prove that you're eligible based on -the above criteria. The team will review the application and will reach out to you in case -of any clarifications. Once the application is accepted you'll be added to the mailing-list -and also to the list below. - -### Members of the list - -Members of the list are listed below: - -- Cortex Maintainers -- AWS Security Announce (email private) +You can also subscribe to email updates to this category if you have a grafana.com account and sign on to the community site or track updates via an [RSS feed](https://community.grafana.com/c/support/security-announcements.rss). From 0e2ef9ba8709edaede6f662118d7fac9940e7d89 Mon Sep 17 00:00:00 2001 From: George Krajcsovits Date: Thu, 3 Feb 2022 15:47:24 +0100 Subject: [PATCH 089/168] Krajo/blocks store graceful query errorhandling (#1003) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * querier: retry or ignore failed store gateways Do not fail the whole query if a store gateway fails in it. Let queryWithConsistencyCheck retry of successed if all blocks are present. Signed-off-by: György Krajcsovits * querier_test: follow up change to retry or ignore failed store gateways Simply changing the expected error Detail is not enough, since consistency check is not done for recently uploaded blocks. In real life we do not ask store gateways for recent blocks, rather we ask ingesters, see querier.query-ingesters-within option. Signed-off-by: György Krajcsovits --- CHANGELOG.md | 1 + integration/querier_test.go | 18 ++- pkg/querier/blocks_store_queryable.go | 12 +- pkg/querier/blocks_store_queryable_test.go | 134 ++++++++++++++++++++- 4 files changed, 153 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d9388d702d..ef105561484 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -392,6 +392,7 @@ * [ENHANCEMENT] Store-gateway: wait for ring tokens stability instead of ring stability to speed up startup and tests #620 * [ENHANCEMENT] Query-scheduler: exported summary `cortex_query_scheduler_inflight_requests` tracking total number of inflight requests (both enqueued and processing) in percentile buckets. #675 * [ENHANCEMENT] Ingester: Expose ingester ring page on ingesters. #654 +* [ENHANCEMENT] Querier: retry store-gateway in case of unexpected failure, instead of failing the query. #1003 * [BUGFIX] Frontend: Fixes @ modifier functions (start/end) when splitting queries by time. #206 * [BUGFIX] Fixes a panic in the query-tee when comparing result. #207 * [BUGFIX] Upgrade Prometheus. TSDB now waits for pending readers before truncating Head block, fixing the `chunk not found` error and preventing wrong query results. #16 diff --git a/integration/querier_test.go b/integration/querier_test.go index f7c10ef7564..c42646756f9 100644 --- a/integration/querier_test.go +++ b/integration/querier_test.go @@ -761,19 +761,27 @@ func TestQuerierWithBlocksStorageOnMissingBlocksFromStorage(t *testing.T) { require.NoError(t, ingester.WaitSumMetrics(e2e.Equals(1), "cortex_ingester_memory_series_removed_total")) require.NoError(t, ingester.WaitSumMetrics(e2e.Equals(1), "cortex_ingester_memory_series")) - // Start the querier and store-gateway, and configure them to not frequently sync blocks. + // Start the querier and store-gateway, and configure them to frequently sync blocks fast enough to trigger consistency check + // We will induce an error in the store gateway by deleting blocks and the querier ignores the direct error + // and relies on checking that all blocks were queried. However this consistency check will skip most recent + // blocks (less than 3*sync-interval age) as they could be unnoticed by the store-gateway and ingesters + // have them anyway. We turn down the sync-interval to speed up the test. storeGateway := e2emimir.NewStoreGateway("store-gateway", consul.NetworkHTTPEndpoint(), mergeFlags(flags, map[string]string{ - "-blocks-storage.bucket-store.sync-interval": "1m", + "-blocks-storage.bucket-store.sync-interval": "1s", }), "") querier := e2emimir.NewQuerier("querier", consul.NetworkHTTPEndpoint(), mergeFlags(flags, map[string]string{ - "-blocks-storage.bucket-store.sync-interval": "1m", + "-blocks-storage.bucket-store.sync-interval": "1s", }), "") require.NoError(t, s.StartAndWaitReady(querier, storeGateway)) - // Wait until the querier and store-gateway have updated the ring. + // Wait until the querier and store-gateway have updated the ring require.NoError(t, querier.WaitSumMetrics(e2e.Equals(512*2), "cortex_ring_tokens_total")) require.NoError(t, storeGateway.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total")) + // Wait until the blocks are old enough for consistency check + // 1 sync on startup, 3 to go over the consistency check limit explained above + require.NoError(t, querier.WaitSumMetrics(e2e.GreaterOrEqual(1+3), "cortex_blocks_meta_syncs_total")) + // Query back the series. c, err = e2emimir.NewClient("", querier.HTTPEndpoint(), "", "", "user-1") require.NoError(t, err) @@ -793,7 +801,7 @@ func TestQuerierWithBlocksStorageOnMissingBlocksFromStorage(t *testing.T) { _, err = c.Query("series_1", series1Timestamp) require.Error(t, err) assert.Contains(t, err.Error(), "500") - assert.Contains(t, err.(*promv1.Error).Detail, "The specified key does not exist") + assert.Contains(t, err.(*promv1.Error).Detail, "consistency check failed because some blocks were not queried") } func TestQueryLimitsWithBlocksStorageRunningInMicroServices(t *testing.T) { diff --git a/pkg/querier/blocks_store_queryable.go b/pkg/querier/blocks_store_queryable.go index 683dc1c7ee5..c86519b1b5e 100644 --- a/pkg/querier/blocks_store_queryable.go +++ b/pkg/querier/blocks_store_queryable.go @@ -721,7 +721,8 @@ func (q *blocksStoreQuerier) fetchSeriesFromStores( stream, err := c.Series(gCtx, req) if err != nil { - return errors.Wrapf(err, "failed to fetch series from %s", c.RemoteAddress()) + level.Warn(spanLog).Log("msg", "failed to fetch series", "remote", c.RemoteAddress(), "err", err) + return nil } mySeries := []*storepb.Series(nil) @@ -740,7 +741,8 @@ func (q *blocksStoreQuerier) fetchSeriesFromStores( break } if err != nil { - return errors.Wrapf(err, "failed to receive series from %s", c.RemoteAddress()) + level.Warn(spanLog).Log("msg", "failed to receive series", "remote", c.RemoteAddress(), "err", err) + return nil } // Response may either contain series, warning or hints. @@ -854,7 +856,8 @@ func (q *blocksStoreQuerier) fetchLabelNamesFromStore( namesResp, err := c.LabelNames(gCtx, req) if err != nil { - return errors.Wrapf(err, "failed to fetch series from %s", c.RemoteAddress()) + level.Warn(spanLog).Log("msg", "failed to fetch label names", "remote", c.RemoteAddress(), "err", err) + return nil } myQueriedBlocks := []ulid.ULID(nil) @@ -931,7 +934,8 @@ func (q *blocksStoreQuerier) fetchLabelValuesFromStore( valuesResp, err := c.LabelValues(gCtx, req) if err != nil { - return errors.Wrapf(err, "failed to fetch series from %s", c.RemoteAddress()) + level.Warn(spanLog).Log("msg", "failed to fetch label values", "remote", c.RemoteAddress(), "err", err) + return nil } myQueriedBlocks := []ulid.ULID(nil) diff --git a/pkg/querier/blocks_store_queryable_test.go b/pkg/querier/blocks_store_queryable_test.go index 3bd9ad4d22e..dae868739eb 100644 --- a/pkg/querier/blocks_store_queryable_test.go +++ b/pkg/querier/blocks_store_queryable_test.go @@ -746,6 +746,73 @@ func TestBlocksStoreQuerier_Select(t *testing.T) { cortex_querier_storegateway_refetches_per_query_count 1 `, }, + "multiple store-gateways have the block, but one of them fails to return": { + finderResult: bucketindex.Blocks{ + {ID: block1}, + }, + storeSetResponses: []interface{}{ + map[BlocksStoreClient][]ulid.ULID{ + &storeGatewayClientMock{ + remoteAddr: "1.1.1.1", + mockedSeriesErr: errors.New("failed to receive from store-gateway"), + }: {block1}, + }, + map[BlocksStoreClient][]ulid.ULID{ + &storeGatewayClientMock{remoteAddr: "2.2.2.2", mockedSeriesResponses: []*storepb.SeriesResponse{ + mockSeriesResponse(labels.Labels{metricNameLabel, series1Label}, minT, 2), + mockHintsResponse(block1), + }}: {block1}, + }, + }, + limits: &blocksStoreLimitsMock{}, + queryLimiter: noOpQueryLimiter, + expectedSeries: []seriesResult{ + { + lbls: labels.New(metricNameLabel, series1Label), + values: []valueResult{ + {t: minT, v: 2}, + }, + }, + }, + expectedMetrics: ` + # HELP cortex_querier_blocks_found_total Number of blocks found based on query time range. + # TYPE cortex_querier_blocks_found_total counter + cortex_querier_blocks_found_total 1 + + # HELP cortex_querier_blocks_queried_total Number of blocks queried to satisfy query. Compared to blocks found, some blocks may have been filtered out thanks to query and compactor sharding. + # TYPE cortex_querier_blocks_queried_total counter + cortex_querier_blocks_queried_total 1 + + # HELP cortex_querier_blocks_with_compactor_shard_but_incompatible_query_shard_total Blocks that couldn't be checked for query and compactor sharding optimization due to incompatible shard counts. + # TYPE cortex_querier_blocks_with_compactor_shard_but_incompatible_query_shard_total counter + cortex_querier_blocks_with_compactor_shard_but_incompatible_query_shard_total 0 + + # HELP cortex_querier_storegateway_instances_hit_per_query Number of store-gateway instances hit for a single query. + # TYPE cortex_querier_storegateway_instances_hit_per_query histogram + cortex_querier_storegateway_instances_hit_per_query_bucket{le="0"} 0 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="1"} 0 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="2"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="3"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="4"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="5"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="6"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="7"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="8"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="9"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="10"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="+Inf"} 1 + cortex_querier_storegateway_instances_hit_per_query_sum 2 + cortex_querier_storegateway_instances_hit_per_query_count 1 + # HELP cortex_querier_storegateway_refetches_per_query Number of re-fetches attempted while querying store-gateway instances due to missing blocks. + # TYPE cortex_querier_storegateway_refetches_per_query histogram + cortex_querier_storegateway_refetches_per_query_bucket{le="0"} 0 + cortex_querier_storegateway_refetches_per_query_bucket{le="1"} 1 + cortex_querier_storegateway_refetches_per_query_bucket{le="2"} 1 + cortex_querier_storegateway_refetches_per_query_bucket{le="+Inf"} 1 + cortex_querier_storegateway_refetches_per_query_sum 1 + cortex_querier_storegateway_refetches_per_query_count 1 + `, + }, } for testName, testData := range tests { @@ -1229,6 +1296,64 @@ func TestBlocksStoreQuerier_Labels(t *testing.T) { cortex_querier_storegateway_refetches_per_query_count 1 `, }, + "multiple store-gateways have the block, but one of them fails to return": { + finderResult: bucketindex.Blocks{ + {ID: block1}, + }, + storeSetResponses: []interface{}{ + map[BlocksStoreClient][]ulid.ULID{ + &storeGatewayClientMock{ + remoteAddr: "1.1.1.1", + mockedLabelNamesErr: errors.New("failed to receive from store-gateway"), + mockedLabelValuesErr: errors.New("failed to receive from store-gateway"), + }: {block1}, + }, + map[BlocksStoreClient][]ulid.ULID{ + &storeGatewayClientMock{ + remoteAddr: "2.2.2.2", + mockedLabelNamesResponse: &storepb.LabelNamesResponse{ + Names: namesFromSeries(series1), + Warnings: []string{}, + Hints: mockNamesHints(block1), + }, + mockedLabelValuesResponse: &storepb.LabelValuesResponse{ + Values: valuesFromSeries(labels.MetricName, series1), + Warnings: []string{}, + Hints: mockValuesHints(block1), + }, + }: {block1}, + }, + }, + expectedLabelNames: namesFromSeries(series1), + expectedLabelValues: valuesFromSeries(labels.MetricName, series1), + expectedMetrics: ` + # HELP cortex_querier_storegateway_instances_hit_per_query Number of store-gateway instances hit for a single query. + # TYPE cortex_querier_storegateway_instances_hit_per_query histogram + cortex_querier_storegateway_instances_hit_per_query_bucket{le="0"} 0 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="1"} 0 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="2"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="3"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="4"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="5"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="6"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="7"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="8"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="9"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="10"} 1 + cortex_querier_storegateway_instances_hit_per_query_bucket{le="+Inf"} 1 + cortex_querier_storegateway_instances_hit_per_query_sum 2 + cortex_querier_storegateway_instances_hit_per_query_count 1 + + # HELP cortex_querier_storegateway_refetches_per_query Number of re-fetches attempted while querying store-gateway instances due to missing blocks. + # TYPE cortex_querier_storegateway_refetches_per_query histogram + cortex_querier_storegateway_refetches_per_query_bucket{le="0"} 0 + cortex_querier_storegateway_refetches_per_query_bucket{le="1"} 1 + cortex_querier_storegateway_refetches_per_query_bucket{le="2"} 1 + cortex_querier_storegateway_refetches_per_query_bucket{le="+Inf"} 1 + cortex_querier_storegateway_refetches_per_query_sum 1 + cortex_querier_storegateway_refetches_per_query_count 1 + `, + }, } for testName, testData := range tests { @@ -1708,8 +1833,11 @@ func (m *blocksFinderMock) GetBlocks(ctx context.Context, userID string, minT, m type storeGatewayClientMock struct { remoteAddr string mockedSeriesResponses []*storepb.SeriesResponse + mockedSeriesErr error mockedLabelNamesResponse *storepb.LabelNamesResponse + mockedLabelNamesErr error mockedLabelValuesResponse *storepb.LabelValuesResponse + mockedLabelValuesErr error } func (m *storeGatewayClientMock) Series(ctx context.Context, in *storepb.SeriesRequest, opts ...grpc.CallOption) (storegatewaypb.StoreGateway_SeriesClient, error) { @@ -1717,15 +1845,15 @@ func (m *storeGatewayClientMock) Series(ctx context.Context, in *storepb.SeriesR mockedResponses: m.mockedSeriesResponses, } - return seriesClient, nil + return seriesClient, m.mockedSeriesErr } func (m *storeGatewayClientMock) LabelNames(context.Context, *storepb.LabelNamesRequest, ...grpc.CallOption) (*storepb.LabelNamesResponse, error) { - return m.mockedLabelNamesResponse, nil + return m.mockedLabelNamesResponse, m.mockedLabelNamesErr } func (m *storeGatewayClientMock) LabelValues(context.Context, *storepb.LabelValuesRequest, ...grpc.CallOption) (*storepb.LabelValuesResponse, error) { - return m.mockedLabelValuesResponse, nil + return m.mockedLabelValuesResponse, m.mockedLabelValuesErr } func (m *storeGatewayClientMock) RemoteAddress() string { From bc4b8e93317714df2a5d20dffc5e38bc4f1c741e Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Thu, 3 Feb 2022 15:44:38 +0000 Subject: [PATCH 090/168] Explicitly set SHELL to bash as the Makefile recipes are not written POSIX sh (#1023) Without this declaration, users with alternative shells (like `dash`) can have trouble with our Makefile. Signed-off-by: Jack Baldry --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 77e0ea1eff3..c9b82f51b9c 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +SHELL = /usr/bin/env bash + # Adapted from https://www.thapaliya.com/en/writings/well-documented-makefiles/ .PHONY: help help: ## Display this help and any documented user-facing targets. Other undocumented targets may be present in the Makefile. From 37cc73879c40b0ebf074a7e8af8f0756fd6bdc2c Mon Sep 17 00:00:00 2001 From: Ursula Kallio <73951760+osg-grafana@users.noreply.github.com> Date: Fri, 4 Feb 2022 09:08:03 +0100 Subject: [PATCH 091/168] Move tools into a tools subdirectory. (#1030) --- docs/sources/{ => tools}/query-auditor.md | 0 docs/sources/{ => tools}/query-tee.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename docs/sources/{ => tools}/query-auditor.md (100%) rename docs/sources/{ => tools}/query-tee.md (100%) diff --git a/docs/sources/query-auditor.md b/docs/sources/tools/query-auditor.md similarity index 100% rename from docs/sources/query-auditor.md rename to docs/sources/tools/query-auditor.md diff --git a/docs/sources/query-tee.md b/docs/sources/tools/query-tee.md similarity index 100% rename from docs/sources/query-tee.md rename to docs/sources/tools/query-tee.md From 8e2b2e5321c95429afb23feec36cd9893996353c Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Fri, 4 Feb 2022 09:10:23 +0000 Subject: [PATCH 092/168] Add "About Grafana Mimir tools" index page (#1031) * Add "About the tools" index page Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio <73951760+osg-grafana@users.noreply.github.com> --- docs/sources/tools/_index.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 docs/sources/tools/_index.md diff --git a/docs/sources/tools/_index.md b/docs/sources/tools/_index.md new file mode 100644 index 00000000000..87c8b0cf32b --- /dev/null +++ b/docs/sources/tools/_index.md @@ -0,0 +1,7 @@ +--- +title: "About Grafana Mimir tools" +description: "" +weight: 3000 +--- + +`{{< section >}}` From 64a1235e8c43e9cf5c3075c9448d51c0c15b1b33 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Fri, 4 Feb 2022 10:13:40 +0100 Subject: [PATCH 093/168] Docs: Add section on configuration parameter categories (#938) * docs: Add section on configuration parameter categories Signed-off-by: Arve Knudsen Co-authored-by: Marco Pracucci --- .../configuration/config-param-lifecycle.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 docs/sources/configuration/config-param-lifecycle.md diff --git a/docs/sources/configuration/config-param-lifecycle.md b/docs/sources/configuration/config-param-lifecycle.md new file mode 100644 index 00000000000..3f34e7e0650 --- /dev/null +++ b/docs/sources/configuration/config-param-lifecycle.md @@ -0,0 +1,26 @@ +--- +title: "Configuration parameter lifecycle" +linkTitle: "Configuration parameter lifecycle" +weight: 1 +slug: config-param-lifecycle +--- + +In order to simplify Mimir configuration, parameters are bucketed into 3 categories according to +their maturity and intended use: _basic_, _advanced_, and _experimental_. + +## Basic + +Parameters that we expect the majority of users to modify. For example, object store credentials or +other dependency connection information. These parameters will generally remain stable for long periods +of time, and should focus on user goals. + +## Advanced + +Parameters that we expect the majority of users to leave defaulted, but we have evidence that there +are strong use-cases to change the default value. + +## Experimental + +Parameters related to new and experimental features under testing. These parameters are provided +for users who wish to become early adopters and for Mimir developers to gain confidence with new +features. From 3ae90138dbb81d78e39d6ec92dc76abf41ff4512 Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Fri, 4 Feb 2022 09:17:06 +0000 Subject: [PATCH 094/168] Move mimirtool README into technical documentation (#1032) * Move mimirtool README into technical documentation Signed-off-by: Jack Baldry Co-authored-by: Ursula Kallio --- .../sources/tools/mimirtool/_index.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) rename cmd/mimirtool/README.md => docs/sources/tools/mimirtool/_index.md (99%) diff --git a/cmd/mimirtool/README.md b/docs/sources/tools/mimirtool/_index.md similarity index 99% rename from cmd/mimirtool/README.md rename to docs/sources/tools/mimirtool/_index.md index e8238875e12..76b69db13c7 100644 --- a/cmd/mimirtool/README.md +++ b/docs/sources/tools/mimirtool/_index.md @@ -1,4 +1,10 @@ -# Mimir Tools +--- +title: "About Mimirtool" +description: "" +weight: 100 +--- + +# Mimirtool This tool is used to interact with user-facing Mimir APIs. @@ -131,7 +137,7 @@ There are two flags of note for this command: At the end of the run, the command tells you whenever the operation was a success in the form of ```console -INFO[0000] SUCESS: 194 rules found, 0 modified expressions +INFO[0000] SUCCESS: 194 rules found, 0 modified expressions ``` It is important to note that a modification can be a PromQL expression lint or a label add to your aggregation. From ec0b1c32452fb1e43c6ca990f0209e26299ae084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Fri, 4 Feb 2022 10:17:25 +0100 Subject: [PATCH 095/168] Global markers bucket now deletes both markers, and only reports "Exists" if both markers exists. (#1015) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Global markers bucket now deletes both files, and only reports "Exists" if both files exist. Signed-off-by: Peter Štibraný * Use verifyPathExists at more places. Signed-off-by: Peter Štibraný * CHANGELOG.md Signed-off-by: Peter Štibraný * Fix test and typo. Signed-off-by: Peter Štibraný * Extract commong getGlobalMarkPathFromBlockMark function. Signed-off-by: Peter Štibraný --- CHANGELOG.md | 1 + pkg/compactor/compactor_test.go | 1 + .../tsdb/bucketindex/markers_bucket_client.go | 75 ++++++--- .../bucketindex/markers_bucket_client_test.go | 156 ++++++++++++++++-- 4 files changed, 193 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef105561484..1c15c660fba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -411,6 +411,7 @@ * [BUGFIX] Querier: Disable query scheduler SRV DNS lookup. #689 * [BUGFIX] Query-frontend: fix API error messages that were mentioning Prometheus `--enable-feature=promql-negative-offset` and `--enable-feature=promql-at-modifier` flags. #688 * [BUGFIX] Query-frontend: worker's cancellation channels are now buffered to ensure that all request cancellations are properly handled. #741 +* [BUGFIX] Compactor: compactor should now be able to correctly mark blocks for deletion and no-compaction, if such marking was previously interrupted. #1015 ### Mixin (changes since `grafana/cortex-jsonnet` `1.9.0`) diff --git a/pkg/compactor/compactor_test.go b/pkg/compactor/compactor_test.go index 59b151471db..faeb5f3b4f8 100644 --- a/pkg/compactor/compactor_test.go +++ b/pkg/compactor/compactor_test.go @@ -880,6 +880,7 @@ func TestMultitenantCompactor_ShouldNotCompactBlocksForUsersMarkedForDeletion(t bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/meta.json", mockBlockMetaJSON("01DTVP434PA9VFXSW2JKB3392D"), nil) bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/index", "some index content", nil) bucketClient.MockExists("user-1/01DTVP434PA9VFXSW2JKB3392D/deletion-mark.json", false, nil) + bucketClient.MockExists("user-1/markers/01DTVP434PA9VFXSW2JKB3392D-deletion-mark.json", false, nil) bucketClient.MockDelete("user-1/01DTVP434PA9VFXSW2JKB3392D/meta.json", nil) bucketClient.MockDelete("user-1/01DTVP434PA9VFXSW2JKB3392D/index", nil) diff --git a/pkg/storage/tsdb/bucketindex/markers_bucket_client.go b/pkg/storage/tsdb/bucketindex/markers_bucket_client.go index cf9a550e275..48188a8adac 100644 --- a/pkg/storage/tsdb/bucketindex/markers_bucket_client.go +++ b/pkg/storage/tsdb/bucketindex/markers_bucket_client.go @@ -12,6 +12,7 @@ import ( "io/ioutil" "path" + "github.com/grafana/dskit/multierror" "github.com/oklog/ulid" "github.com/thanos-io/thanos/pkg/block" "github.com/thanos-io/thanos/pkg/block/metadata" @@ -34,12 +35,8 @@ func BucketWithGlobalMarkers(b objstore.Bucket) objstore.Bucket { // Upload implements objstore.Bucket. func (b *globalMarkersBucket) Upload(ctx context.Context, name string, r io.Reader) error { - globalMarkPath := "" - if blockID, ok := b.isBlockDeletionMark(name); ok { - globalMarkPath = path.Clean(path.Join(path.Dir(name), "../", BlockDeletionMarkFilepath(blockID))) - } else if blockID, ok := b.isNoCompactMark(name); ok { - globalMarkPath = path.Clean(path.Join(path.Dir(name), "../", NoCompactMarkFilepath(blockID))) - } else { + globalMarkPath := getGlobalMarkPathFromBlockMark(name) + if globalMarkPath == "" { return b.parent.Upload(ctx, name, r) } @@ -60,28 +57,32 @@ func (b *globalMarkersBucket) Upload(ctx context.Context, name string, r io.Read // Delete implements objstore.Bucket. func (b *globalMarkersBucket) Delete(ctx context.Context, name string) error { - // Call the parent. - if err := b.parent.Delete(ctx, name); err != nil { - return err + // Call the parent. Only return error here (without deleting global marker too) if error is different than "not found". + err1 := b.parent.Delete(ctx, name) + if err1 != nil && !b.parent.IsObjNotFoundErr(err1) { + return err1 } // Delete the marker in the global markers location too. - globalMarkPath := "" - if blockID, ok := b.isBlockDeletionMark(name); ok { - globalMarkPath = path.Clean(path.Join(path.Dir(name), "../", BlockDeletionMarkFilepath(blockID))) - } else if blockID, ok := b.isNoCompactMark(name); ok { - globalMarkPath = path.Clean(path.Join(path.Dir(name), "../", NoCompactMarkFilepath(blockID))) + globalMarkPath := getGlobalMarkPathFromBlockMark(name) + if globalMarkPath == "" { + return err1 } - if globalMarkPath != "" { - if err := b.parent.Delete(ctx, globalMarkPath); err != nil { - if !b.parent.IsObjNotFoundErr(err) { - return err - } + var err2 error + if err := b.parent.Delete(ctx, globalMarkPath); err != nil { + if !b.parent.IsObjNotFoundErr(err) { + err2 = err } } - return nil + if err1 != nil { + // In this case err1 is "ObjNotFound". If we tried to wrap it together with err2, we would need to + // handle this possibility in globalMarkersBucket.IsObjNotFoundErr(). Instead we just ignore err2, if any. + return err1 + } + + return err2 } // Name implements objstore.Bucket. @@ -111,7 +112,21 @@ func (b *globalMarkersBucket) GetRange(ctx context.Context, name string, off, le // Exists implements objstore.Bucket. func (b *globalMarkersBucket) Exists(ctx context.Context, name string) (bool, error) { - return b.parent.Exists(ctx, name) + globalMarkPath := getGlobalMarkPathFromBlockMark(name) + if globalMarkPath == "" { + return b.parent.Exists(ctx, name) + } + + // Report "exists" only if BOTH (block-local, and global) files exist, otherwise Thanos + // code will never try to upload the file again, if it finds that it exist. + ok1, err1 := b.parent.Exists(ctx, name) + ok2, err2 := b.parent.Exists(ctx, globalMarkPath) + + var me multierror.MultiError + me.Add(err1) + me.Add(err2) + + return ok1 && ok2, me.Err() } // IsObjNotFoundErr implements objstore.Bucket. @@ -142,7 +157,21 @@ func (b *globalMarkersBucket) ReaderWithExpectedErrs(fn objstore.IsOpFailureExpe return b } -func (b *globalMarkersBucket) isBlockDeletionMark(name string) (ulid.ULID, bool) { +// getGlobalMarkPathFromBlockMark returns path to global mark, if name points to a block-local mark file. If name +// doesn't point to a block-local mark file, returns empty string. +func getGlobalMarkPathFromBlockMark(name string) string { + if blockID, ok := isBlockDeletionMark(name); ok { + return path.Clean(path.Join(path.Dir(name), "../", BlockDeletionMarkFilepath(blockID))) + } + + if blockID, ok := isNoCompactMark(name); ok { + return path.Clean(path.Join(path.Dir(name), "../", NoCompactMarkFilepath(blockID))) + } + + return "" +} + +func isBlockDeletionMark(name string) (ulid.ULID, bool) { if path.Base(name) != metadata.DeletionMarkFilename { return ulid.ULID{}, false } @@ -152,7 +181,7 @@ func (b *globalMarkersBucket) isBlockDeletionMark(name string) (ulid.ULID, bool) return block.IsBlockDir(path.Dir(name)) } -func (b *globalMarkersBucket) isNoCompactMark(name string) (ulid.ULID, bool) { +func isNoCompactMark(name string) (ulid.ULID, bool) { if path.Base(name) != metadata.NoCompactMarkFilename { return ulid.ULID{}, false } diff --git a/pkg/storage/tsdb/bucketindex/markers_bucket_client_test.go b/pkg/storage/tsdb/bucketindex/markers_bucket_client_test.go index db050981055..a55f3f9a7a3 100644 --- a/pkg/storage/tsdb/bucketindex/markers_bucket_client_test.go +++ b/pkg/storage/tsdb/bucketindex/markers_bucket_client_test.go @@ -49,23 +49,149 @@ func TestGlobalMarkersBucket_Delete_ShouldSucceedIfDeletionMarkDoesNotExistInThe } } +func TestGlobalMarkersBucket_DeleteShouldDeleteGlobalMarkIfBlockMarkerDoesntExist(t *testing.T) { + ctx := context.Background() + + blockID := ulid.MustNew(1, nil) + + for name, tc := range map[string]struct { + blockMarker string + globalMarker string + }{ + "deletion mark": { + blockMarker: path.Join(blockID.String(), metadata.DeletionMarkFilename), + globalMarker: BlockDeletionMarkFilepath(blockID), + }, + "no compact": { + blockMarker: path.Join(blockID.String(), metadata.NoCompactMarkFilename), + globalMarker: NoCompactMarkFilepath(blockID), + }, + } { + t.Run(name, func(t *testing.T) { + // Create a mocked block deletion mark in the global location. + bkt, _ := mimir_testutil.PrepareFilesystemBucket(t) + bkt = BucketWithGlobalMarkers(bkt) + + // Upload global only + require.NoError(t, bkt.Upload(ctx, tc.globalMarker, strings.NewReader("{}"))) + + // Verify global exists. + verifyPathExists(t, bkt, tc.globalMarker, true) + + // Delete block marker. + err := bkt.Delete(ctx, tc.blockMarker) + require.Error(t, err) + require.True(t, bkt.IsObjNotFoundErr(err)) + + // Ensure global one been actually deleted. + verifyPathExists(t, bkt, tc.globalMarker, false) + }) + } +} + func TestUploadToGlobalMarkerPath(t *testing.T) { - bkt, _ := mimir_testutil.PrepareFilesystemBucket(t) - bkt = BucketWithGlobalMarkers(bkt) + blockID := ulid.MustNew(1, nil) + for name, tc := range map[string]struct { + blockMarker string + globalMarker string + }{ + "deletion mark": { + blockMarker: path.Join(blockID.String(), metadata.DeletionMarkFilename), + globalMarker: BlockDeletionMarkFilepath(blockID), + }, + "no compact": { + blockMarker: path.Join(blockID.String(), metadata.NoCompactMarkFilename), + globalMarker: NoCompactMarkFilepath(blockID), + }, + } { + t.Run(name, func(t *testing.T) { + bkt, _ := mimir_testutil.PrepareFilesystemBucket(t) + bkt = BucketWithGlobalMarkers(bkt) + // Verify that uploading block mark file uploads it to the global markers location too. + require.NoError(t, bkt.Upload(context.Background(), tc.blockMarker, strings.NewReader("mark file"))) + + verifyPathExists(t, bkt, tc.globalMarker, true) + }) + } +} + +func TestGlobalMarkersBucket_ExistShouldReportTrueOnlyIfBothExist(t *testing.T) { blockID := ulid.MustNew(1, nil) - // Verify that uploading deletion mark file uploads it to the global markers location too. - require.NoError(t, bkt.Upload(context.Background(), path.Join(blockID.String(), metadata.DeletionMarkFilename), strings.NewReader("mark file"))) - ok, err := bkt.Exists(context.Background(), BlockDeletionMarkFilepath(blockID)) - require.NoError(t, err) - require.True(t, ok) + for name, tc := range map[string]struct { + blockMarker string + globalMarker string + }{ + "deletion mark": { + blockMarker: path.Join(blockID.String(), metadata.DeletionMarkFilename), + globalMarker: BlockDeletionMarkFilepath(blockID), + }, + "no compact": { + blockMarker: path.Join(blockID.String(), metadata.NoCompactMarkFilename), + globalMarker: NoCompactMarkFilepath(blockID), + }, + } { + t.Run(name, func(t *testing.T) { + bkt, _ := mimir_testutil.PrepareFilesystemBucket(t) + bkt = BucketWithGlobalMarkers(bkt) + + // Upload to global marker only + require.NoError(t, bkt.Upload(context.Background(), tc.globalMarker, strings.NewReader("mark file"))) + + // Verify global exists, but block marker doesn't. + verifyPathExists(t, bkt, tc.globalMarker, true) + verifyPathExists(t, bkt, tc.blockMarker, false) + + // Now upload to block marker (also overwrites global) + require.NoError(t, bkt.Upload(context.Background(), tc.blockMarker, strings.NewReader("mark file"))) + + // Verify global exists and block marker does too. + verifyPathExists(t, bkt, tc.globalMarker, true) + verifyPathExists(t, bkt, tc.blockMarker, true) - // Verify the same for no-compact mark. - require.NoError(t, bkt.Upload(context.Background(), path.Join(blockID.String(), metadata.NoCompactMarkFilename), strings.NewReader("mark file"))) - ok, err = bkt.Exists(context.Background(), NoCompactMarkFilepath(blockID)) + // Now delete global file, and only keep block. + require.NoError(t, bkt.Delete(context.Background(), tc.globalMarker)) + + // Verify global doesn't exist anymore. Block marker also returns false, even though it *does* exist. + verifyPathExists(t, bkt, tc.globalMarker, false) + verifyPathExists(t, bkt, tc.blockMarker, false) + }) + } +} + +func verifyPathExists(t *testing.T, bkt objstore.Bucket, name string, expected bool) { + t.Helper() + + ok, err := bkt.Exists(context.Background(), name) require.NoError(t, err) - require.True(t, ok) + require.Equal(t, expected, ok) +} + +func TestGlobalMarkersBucket_getGlobalMarkPathFromBlockMark(t *testing.T) { + type testCase struct { + name string + expected string + } + + tests := []testCase{ + {name: "", expected: ""}, + {name: "01FV060K6XXCS8BCD2CH6C3GBR/index", expected: ""}, + } + + for _, marker := range []string{metadata.DeletionMarkFilename, metadata.NoCompactMarkFilename} { + tests = append(tests, testCase{name: marker, expected: ""}) + tests = append(tests, testCase{name: "01FV060K6XXCS8BCD2CH6C3GBR/" + marker, expected: "markers/01FV060K6XXCS8BCD2CH6C3GBR-" + marker}) + tests = append(tests, testCase{name: "/path/to/01FV060K6XXCS8BCD2CH6C3GBR/" + marker, expected: "/path/to/markers/01FV060K6XXCS8BCD2CH6C3GBR-" + marker}) + tests = append(tests, testCase{name: "invalid-block-id/" + marker, expected: ""}) + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + result := getGlobalMarkPathFromBlockMark(tc.name) + assert.Equal(t, tc.expected, result) + }) + } } func TestGlobalMarkersBucket_isBlockDeletionMark(t *testing.T) { @@ -96,11 +222,9 @@ func TestGlobalMarkersBucket_isBlockDeletionMark(t *testing.T) { }, } - b := BucketWithGlobalMarkers(nil).(*globalMarkersBucket) - for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - actualID, actualOk := b.isBlockDeletionMark(tc.name) + actualID, actualOk := isBlockDeletionMark(tc.name) assert.Equal(t, tc.expectedOk, actualOk) assert.Equal(t, tc.expectedID, actualID) }) @@ -135,11 +259,9 @@ func TestGlobalMarkersBucket_isNoCompactMark(t *testing.T) { }, } - b := BucketWithGlobalMarkers(nil).(*globalMarkersBucket) - for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - actualID, actualOk := b.isNoCompactMark(tc.name) + actualID, actualOk := isNoCompactMark(tc.name) assert.Equal(t, tc.expectedOk, actualOk) assert.Equal(t, tc.expectedID, actualID) }) From 2bd377e275392555f74679ea545f09efb1816e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Fri, 4 Feb 2022 10:31:15 +0100 Subject: [PATCH 096/168] Docs: Add documentation for auth-injector, compaction-planner and listblocks. (#1033) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add docs for auth-injector and compaction planner. Signed-off-by: Peter Štibraný * Add docs for listblocks. Signed-off-by: Peter Štibraný --- docs/sources/tools/auth-injector.md | 22 ++++++++ docs/sources/tools/compaction-planner.md | 34 ++++++++++++ docs/sources/tools/listblocks.md | 70 ++++++++++++++++++++++++ tools/compaction-planner/README.md | 1 - tools/listblocks/README.md | 1 - 5 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 docs/sources/tools/auth-injector.md create mode 100644 docs/sources/tools/compaction-planner.md create mode 100644 docs/sources/tools/listblocks.md delete mode 100644 tools/compaction-planner/README.md delete mode 100644 tools/listblocks/README.md diff --git a/docs/sources/tools/auth-injector.md b/docs/sources/tools/auth-injector.md new file mode 100644 index 00000000000..6f565e87fe6 --- /dev/null +++ b/docs/sources/tools/auth-injector.md @@ -0,0 +1,22 @@ +--- +title: "Auth Injector" +description: "" +weight: 100 +--- + +# Auth injector + +Auth injector is an HTTP proxy that injects `X-Scope-OrgId` header with value specified by `-tenant-id` option +to incoming HTTP requests, and forwards such modified requests to specified `-remote-address`. + +This can be used to query data for a specific tenant during development or troubleshooting. + +``` +Usage of auth-injector: + -local-address string + Local address to listen on (host:port or :port). (default ":8080") + -remote-address string + URL of target to forward requests to to (eg. http://domain.com:80). + -tenant-id string + Tenant ID to inject to proxied requests. +``` diff --git a/docs/sources/tools/compaction-planner.md b/docs/sources/tools/compaction-planner.md new file mode 100644 index 00000000000..52616dcfdde --- /dev/null +++ b/docs/sources/tools/compaction-planner.md @@ -0,0 +1,34 @@ +--- +title: "Compaction planner" +description: "" +weight: 100 +--- + +# Compaction planner + +Compaction planner is a tool for troubleshooting compactor. It loads a bucket index and shows compaction jobs that would +be generated by the Mimir split-and-merge compactor. Because compaction planner uses bucket index to get a list of blocks +for a tenant, it doesn't have up-to-date view on the blocks in the bucket. (Bucket index is refreshed by running +compactor regularly, for example every 15 minutes.) + +Compaction planner needs to be configured with access to the bucket, and tenant (`-user`) to work with. Furthermore +`-shard-count` and `-split-groups` options can be used to fine-tune the split-and-merge compactor parameters. Compaction +planner is not able to figure out these values from Mimir or existing configuration file. Ordering of the jobs can be +modified by `-sorting` option. + +Example: + +``` +$ ./compaction-planner -backend=gcs -gcs.bucket-name=blocks-bucket -user=10428 -split-groups=1 -shard-count=4 +2022-02-04 09:52:05.506428 I | Using index from 2022-02-04T08:38:27Z +2022-02-04 09:52:05.533720 I | Filtering using *compactor.NoCompactionMarkFilter +Job No. Start Time End Time Blocks Job Key +1 2022-02-04T02:00:00Z 2022-02-04T04:00:00Z 4 0@6672437747845546250-merge-2_of_4-1643940000000-1643947200000 +2 2022-02-04T02:00:00Z 2022-02-04T04:00:00Z 4 0@6672437747845546250-merge-4_of_4-1643940000000-1643947200000 +3 2022-02-04T04:00:00Z 2022-02-04T06:00:00Z 4 0@6672437747845546250-merge-1_of_4-1643947200000-1643954400000 +4 2022-02-04T04:00:00Z 2022-02-04T06:00:00Z 4 0@6672437747845546250-merge-2_of_4-1643947200000-1643954400000 +5 2022-02-04T04:00:00Z 2022-02-04T06:00:00Z 4 0@6672437747845546250-merge-3_of_4-1643947200000-1643954400000 +6 2022-02-04T04:00:00Z 2022-02-04T06:00:00Z 4 0@6672437747845546250-merge-4_of_4-1643947200000-1643954400000 +``` + +Each output line is one compaction job that Mimir's compactor with same parameters would work on in specified order. diff --git a/docs/sources/tools/listblocks.md b/docs/sources/tools/listblocks.md new file mode 100644 index 00000000000..011e7755998 --- /dev/null +++ b/docs/sources/tools/listblocks.md @@ -0,0 +1,70 @@ +--- +title: "Listblocks" +description: "" +weight: 100 +--- + +# Listblocks + +Listblocks can list blocks and show their details for a specific user. Listblocks requires at least configuration to +access the bucket, and tenant. + +Listblocks doesn't use the bucket index, and works by downloading meta.json file of every block for the tenant. This +means it has up-to-date view of the blocks in the bucket. + +``` +$ ./listblocks -backend=gcs -gcs.bucket-name=bucket-with-blocks -user=10428 +Block ID Min Time Max Time Duration +01E0HMK47RGAAKZJBMG8B8QXGP 2020-02-07T07:49:46Z 2020-02-08T00:00:00Z 16h10m13.89s +01E0M0VK2KEDZC5AK1PX8K00EX 2020-02-08T00:00:00Z 2020-02-09T00:00:00Z 24h0m0s +01E0PK9B84XJ9KQ0DHZDQECNH6 2020-02-09T00:00:00Z 2020-02-10T00:00:00Z 24h0m0s +01E0S8VAKJ0H41N41GBKQN4G1N 2020-02-10T00:00:00Z 2020-02-11T00:00:00Z 24h0m0s +01E0VTN88859KW1KTDVBS14E7A 2020-02-11T00:00:00Z 2020-02-12T00:00:00Z 24h0m0s +01E0YCZKFG2ME5GZ60AYCQ39V4 2020-02-12T00:00:00Z 2020-02-13T00:00:00Z 24h0m0s +01E111CX17BXFZD97AKSYKX0A5 2020-02-13T00:00:00Z 2020-02-14T00:00:00Z 24h0m0s +01E13JCZK9A5SJMAY6QSSEB0XX 2020-02-14T00:00:00Z 2020-02-15T00:00:00Z 24h0m0s +01E164EJFPT8ZCY6QWEKNJ0VYX 2020-02-15T00:00:00Z 2020-02-16T00:00:00Z 24h0m0s +... +``` + +Listblocks has many options to modify the output, the most important ones are: + +``` + -max-time value + If set, only blocks with MaxTime <= this value are printed + -min-time value + If set, only blocks with MinTime >= this value are printed + -show-block-size + Show size of block based on details in meta.json, if available + -show-compaction-level + Show compaction level + -show-deleted + Show deleted blocks + -show-labels + Show block labels + -show-parents + Show parent blocks + -show-sources + Show compaction sources + -show-ulid-time + Show time from ULID +``` + +For example: + +``` +$ ./listblocks -backend=gcs -gcs.bucket-name=bucket-with-blocks -user=10428 -min-time=2022-02-01T00:00:00Z -max-time=2022-02-04T00:00:00Z -show-labels -show-block-size +Block ID Min Time Max Time Duration Size Labels (excl. __org_id__) +01FTWJ3V2TP7N4D7FCSSBJXQ9Z 2022-02-01T00:00:00Z 2022-02-02T00:00:00Z 24h0m0s 69 GiB {__compactor_shard_id__="1_of_4"} +01FTWJZ3FD4QX4T1FMJJNP7XR1 2022-02-01T00:00:00Z 2022-02-02T00:00:00Z 24h0m0s 69 GiB {__compactor_shard_id__="2_of_4"} +01FTWMN7AQBPMXWBHVC61ENPT7 2022-02-01T00:00:00Z 2022-02-02T00:00:00Z 24h0m0s 69 GiB {__compactor_shard_id__="3_of_4"} +01FTWQ5Y87AWVKXH44T2N23BHW 2022-02-01T00:00:00Z 2022-02-02T00:00:00Z 24h0m0s 69 GiB {__compactor_shard_id__="4_of_4"} +01FTZ4QWE2PNK69ZJGTK2NCWFB 2022-02-02T00:00:00Z 2022-02-03T00:00:00Z 24h0m0s 73 GiB {__compactor_shard_id__="1_of_4"} +01FTZ55XAZCVHWP9K5AAR5BVHF 2022-02-02T00:00:00Z 2022-02-03T00:00:00Z 24h0m0s 73 GiB {__compactor_shard_id__="2_of_4"} +01FTZ7AQBCSBB8T6P2Q5QZ416W 2022-02-02T00:00:00Z 2022-02-03T00:00:00Z 24h0m0s 73 GiB {__compactor_shard_id__="3_of_4"} +01FTYW42TNTZ44QMM9YTFDE6Y4 2022-02-02T00:00:00Z 2022-02-03T00:00:00Z 24h0m0s 73 GiB {__compactor_shard_id__="4_of_4"} +01FV1S5GQDAFTQ4M9CTN1CD1E4 2022-02-03T00:00:00Z 2022-02-04T00:00:00Z 24h0m0s 77 GiB {__compactor_shard_id__="1_of_4"} +01FV1JKPH2VFXA4K6XNETC8FBR 2022-02-03T00:00:00Z 2022-02-04T00:00:00Z 24h0m0s 77 GiB {__compactor_shard_id__="2_of_4"} +01FV1VQQTAJVA287ZY8DC435HD 2022-02-03T00:00:00Z 2022-02-04T00:00:00Z 24h0m0s 77 GiB {__compactor_shard_id__="3_of_4"} +01FV1FRX39NC1J64D6H6W9VVZ9 2022-02-03T00:00:00Z 2022-02-04T00:00:00Z 24h0m0s 77 GiB {__compactor_shard_id__="4_of_4"} +``` diff --git a/tools/compaction-planner/README.md b/tools/compaction-planner/README.md deleted file mode 100644 index 0c01484bffc..00000000000 --- a/tools/compaction-planner/README.md +++ /dev/null @@ -1 +0,0 @@ -This tool loads a bucket index and shows compaction jobs as would be generated by the Mimir compactor. diff --git a/tools/listblocks/README.md b/tools/listblocks/README.md deleted file mode 100644 index 58d3df4e692..00000000000 --- a/tools/listblocks/README.md +++ /dev/null @@ -1 +0,0 @@ -Listblocks can list blocks and details about them from bucket for a specific user. From f6369f89a3ac86760bd1d3a181e153a7c9235a2c Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Fri, 4 Feb 2022 11:15:59 +0100 Subject: [PATCH 097/168] docs: Rename from configuration parameter lifecycle to categories (#1036) Signed-off-by: Arve Knudsen --- ...config-param-lifecycle.md => config-param-categories.md} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename docs/sources/configuration/{config-param-lifecycle.md => config-param-categories.md} (87%) diff --git a/docs/sources/configuration/config-param-lifecycle.md b/docs/sources/configuration/config-param-categories.md similarity index 87% rename from docs/sources/configuration/config-param-lifecycle.md rename to docs/sources/configuration/config-param-categories.md index 3f34e7e0650..5ee7e379360 100644 --- a/docs/sources/configuration/config-param-lifecycle.md +++ b/docs/sources/configuration/config-param-categories.md @@ -1,8 +1,8 @@ --- -title: "Configuration parameter lifecycle" -linkTitle: "Configuration parameter lifecycle" +title: "Configuration parameter categories" +linkTitle: "Configuration parameter categories" weight: 1 -slug: config-param-lifecycle +slug: config-param-categories --- In order to simplify Mimir configuration, parameters are bucketed into 3 categories according to From e020e13672cfd4832f84427e9d7df7b2d98800e2 Mon Sep 17 00:00:00 2001 From: Jack Baldry Date: Fri, 4 Feb 2022 10:24:10 +0000 Subject: [PATCH 098/168] Fix rendering of sections (#1039) Signed-off-by: Jack Baldry --- docs/sources/architecture/_index.md | 2 +- docs/sources/operations/_index.md | 2 +- docs/sources/tools/_index.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sources/architecture/_index.md b/docs/sources/architecture/_index.md index f648934eb41..b36a3faea83 100644 --- a/docs/sources/architecture/_index.md +++ b/docs/sources/architecture/_index.md @@ -21,7 +21,7 @@ Some microservices are stateful and rely on non-volatile storage to prevent data A dedicate page describes each microservice in detail. -`{{< section >}}` +{{< section >}} diff --git a/docs/sources/operations/_index.md b/docs/sources/operations/_index.md index 37c464f810a..c28afacf820 100644 --- a/docs/sources/operations/_index.md +++ b/docs/sources/operations/_index.md @@ -6,4 +6,4 @@ weight: 2000 # Operating Grafana Mimir -`{{< section >}}` +{{< section >}} diff --git a/docs/sources/tools/_index.md b/docs/sources/tools/_index.md index 87c8b0cf32b..f705db8dd24 100644 --- a/docs/sources/tools/_index.md +++ b/docs/sources/tools/_index.md @@ -4,4 +4,4 @@ description: "" weight: 3000 --- -`{{< section >}}` +{{< section >}} From 952e2485e400b931ac28e39605a9532b4d816061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Fri, 4 Feb 2022 12:34:42 +0100 Subject: [PATCH 099/168] Remove tools/LICENSE, add license and provenance headers where needed. (#1040) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also fix Provenance-includes-location to be valid links. Signed-off-by: Peter Štibraný --- tools/LICENSE | 13 ------------- tools/cleanup-white-noise.sh | 2 +- tools/image-tag | 4 ++++ tools/migrate-ingester-statefulsets.sh | 2 +- tools/release-docs | 1 + 5 files changed, 7 insertions(+), 15 deletions(-) delete mode 100644 tools/LICENSE diff --git a/tools/LICENSE b/tools/LICENSE deleted file mode 100644 index 9cd1640bad1..00000000000 --- a/tools/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2018 Weaveworks. All rights reserved. - -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. diff --git a/tools/cleanup-white-noise.sh b/tools/cleanup-white-noise.sh index ad42afbee91..a57d5489cc0 100755 --- a/tools/cleanup-white-noise.sh +++ b/tools/cleanup-white-noise.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # SPDX-License-Identifier: AGPL-3.0-only -# Provenance-includes-location: https://github.com/cortexproject/cortex/tools/cleanup-white-noise.sh +# Provenance-includes-location: https://github.com/cortexproject/cortex/blob/master/tools/cleanup-white-noise.sh # Provenance-includes-license: Apache-2.0 # Provenance-includes-copyright: The Cortex Authors. diff --git a/tools/image-tag b/tools/image-tag index 31f023dac0e..e1b65838ab9 100755 --- a/tools/image-tag +++ b/tools/image-tag @@ -1,4 +1,8 @@ #!/usr/bin/env bash +# SPDX-License-Identifier: AGPL-3.0-only +# Provenance-includes-location: https://github.com/cortexproject/cortex/blob/master/tools/image-tag +# Provenance-includes-license: Apache-2.0 +# Provenance-includes-copyright: The Cortex Authors. set -o errexit set -o nounset diff --git a/tools/migrate-ingester-statefulsets.sh b/tools/migrate-ingester-statefulsets.sh index 26055a0f005..0b7a3d6bc18 100644 --- a/tools/migrate-ingester-statefulsets.sh +++ b/tools/migrate-ingester-statefulsets.sh @@ -1,6 +1,6 @@ #!/bin/bash # SPDX-License-Identifier: AGPL-3.0-only -# Provenance-includes-location: https://github.com/cortexproject/cortex/tools/migrate-ingester-statefulsets.sh +# Provenance-includes-location: https://github.com/cortexproject/cortex/blob/master/tools/migrate-ingester-statefulsets.sh # Provenance-includes-license: Apache-2.0 # Provenance-includes-copyright: The Cortex Authors. diff --git a/tools/release-docs b/tools/release-docs index 1a12c4b9260..d3895944239 100755 --- a/tools/release-docs +++ b/tools/release-docs @@ -1,4 +1,5 @@ #!/usr/bin/env bash +# SPDX-License-Identifier: AGPL-3.0-only set -euf -o pipefail From 8665be9a73e64388a038b348085e05cbf4056770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Fri, 4 Feb 2022 15:31:46 +0100 Subject: [PATCH 100/168] Add docs for TSDB tools. (#1038) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add docs for TSDB tools. Signed-off-by: Peter Štibraný * Use Grafana Mimir. Signed-off-by: Peter Štibraný * Fix white space. Signed-off-by: Peter Štibraný * Fix lint errors. Signed-off-by: Peter Štibraný --- docs/sources/tools/tsdb-tools.md | 220 +++++++++++++++++++++++++++++++ tools/tsdb-chunks/README.md | 2 - tools/tsdb-compact/README.md | 2 - tools/tsdb-index/README.md | 3 - tools/tsdb-symbols/README.md | 3 - 5 files changed, 220 insertions(+), 10 deletions(-) create mode 100644 docs/sources/tools/tsdb-tools.md delete mode 100644 tools/tsdb-chunks/README.md delete mode 100644 tools/tsdb-compact/README.md delete mode 100644 tools/tsdb-index/README.md delete mode 100644 tools/tsdb-symbols/README.md diff --git a/docs/sources/tools/tsdb-tools.md b/docs/sources/tools/tsdb-tools.md new file mode 100644 index 00000000000..5d3e15ec760 --- /dev/null +++ b/docs/sources/tools/tsdb-tools.md @@ -0,0 +1,220 @@ +--- +title: "TSDB Tools" +description: "" +weight: 100 +--- + +# TSDB Tools + +Grafana Mimir has multiple tools useful for inspecting or debugging TSDB blocks. + +## tsdb-index + +`tsdb-index` lists all series found in the TSDB index of the block. It can optionally only list series matching a PromQL selector (`-select` option), and also show chunk metadata for each series (`-show-chunks` option). + +Example with `-select`: + +``` +tsdb-index -select 'up{instance="compactor:8006"}' ./01FTT67BBYH23T8870BBF77YZX +level=error msg="using matchers" matcher="instance=\"compactor:8006\"" matcher="__name__=\"up\"" +series {__name__="up", cluster="docker-compose", instance="compactor:8006", job="tsdb-blocks-storage-s3/compactor", namespace="tsdb-blocks-storage-s3", scraped_by="grafana-agent"} +series {__name__="up", cluster="docker-compose", instance="compactor:8006", job="tsdb-blocks-storage-s3/compactor", namespace="tsdb-blocks-storage-s3", scraped_by="prometheus"} +``` + +Example with the same `-select` and also `-show-chunks`: + +``` +tsdb-index -select 'up{instance="compactor:8006"}' -show-chunks ./01FTT67BBYH23T8870BBF77YZX +level=error msg="using matchers" matcher="instance=\"compactor:8006\"" matcher="__name__=\"up\"" +series {__name__="up", cluster="docker-compose", instance="compactor:8006", job="tsdb-blocks-storage-s3/compactor", namespace="tsdb-blocks-storage-s3", scraped_by="grafana-agent"} +chunk 29163268 min time: 1640166760891 max time: 1640167195891 +chunk 29163418 min time: 1640167200892 max time: 1640168095892 +chunk 29163551 min time: 1640168100892 max time: 1640168725891 +chunk 29163735 min time: 1640168730892 max time: 1640168845891 +chunk 29163785 min time: 1640168850891 max time: 1640169465891 +chunk 29163991 min time: 1640169470891 max time: 1640170085891 +chunk 29164197 min time: 1640170090892 max time: 1640170705891 +chunk 29164379 min time: 1640170710891 max time: 1640171320891 +chunk 29164581 min time: 1640171325891 max time: 1640171935891 +chunk 29164777 min time: 1640171940891 max time: 1640171965892 +series {__name__="up", cluster="docker-compose", instance="compactor:8006", job="tsdb-blocks-storage-s3/compactor", namespace="tsdb-blocks-storage-s3", scraped_by="prometheus"} +chunk 29164808 min time: 1640166759677 max time: 1640166764677 +chunk 29164833 min time: 1640166769677 max time: 1640167199682 +chunk 29164981 min time: 1640167204683 max time: 1640167224681 +chunk 29165012 min time: 1640167254678 max time: 1640168044653 +chunk 29165246 min time: 1640168049652 max time: 1640168684662 +chunk 29165439 min time: 1640168689662 max time: 1640169504679 +chunk 29165703 min time: 1640169509679 max time: 1640170119676 +chunk 29165892 min time: 1640170124676 max time: 1640170734658 +chunk 29166073 min time: 1640170739658 max time: 1640171349619 +chunk 29166296 min time: 1640171354618 max time: 1640171959602 +chunk 29166492 min time: 1640171964600 max time: 1640171964600 +``` + +## tsdb-print-chunk + +`tsdb-print-chunk` requires path to block and one or more chunk references, and it prints all samples (values and their timestamps) from given chunk. + +Example: + +``` +$ tsdb-print-chunk ./01FTT67BBYH23T8870BBF77YZX 8 1574 +Chunk ref: 8 samples: 13 bytes: 22 +1 1640167456784 (2021-12-22T10:04:16.784Z) +1 1640167516784 (2021-12-22T10:05:16.784Z) +1 1640167576784 (2021-12-22T10:06:16.784Z) +1 1640167636784 (2021-12-22T10:07:16.784Z) +1 1640167696784 (2021-12-22T10:08:16.784Z) +1 1640167756784 (2021-12-22T10:09:16.784Z) +1 1640167816784 (2021-12-22T10:10:16.784Z) +1 1640167876784 (2021-12-22T10:11:16.784Z) +1 1640167936784 (2021-12-22T10:12:16.784Z) +1 1640167996784 (2021-12-22T10:13:16.784Z) +1 1640168056784 (2021-12-22T10:14:16.784Z) +1 1640168116784 (2021-12-22T10:15:16.784Z) +1 1640168176784 (2021-12-22T10:16:16.784Z) +Chunk ref: 1574 samples: 7 bytes: 22 +0 1640171937334 (2021-12-22T11:18:57.334Z) +0 1640171942331 (2021-12-22T11:19:02.331Z) +0 1640171947331 (2021-12-22T11:19:07.331Z) +0 1640171952331 (2021-12-22T11:19:12.331Z) +0 1640171957331 (2021-12-22T11:19:17.331Z) +0 1640171962331 (2021-12-22T11:19:22.331Z) +0 1640171967331 (2021-12-22T11:19:27.331Z) +``` + +## tsdb-chunks + +`tsdb-chunks` parses chunks file (eg. chunks/000001) and prints its content: information about individual chunks, and their samples (if `-samples` is used). + +Example: + +``` +$ tsdb-chunks 01FQKXVKF3QG5WQXSY726KKSBP/chunks/000001 | head +01FQKXVKF3QG5WQXSY726KKSBP/chunks/000001 +Chunk #0: position: 8 length: 108 encoding: XOR, crc32: 833aa732, samples: 88 +Chunk #1: position: 122 length: 17 encoding: XOR, crc32: 40b9c560, samples: 1 +Chunk #2: position: 145 length: 137 encoding: XOR, crc32: 33d3e4fc, samples: 87 +Chunk #3: position: 289 length: 66 encoding: XOR, crc32: 15c9a62c, samples: 88 +Chunk #4: position: 361 length: 149 encoding: XOR, crc32: d8e556c4, samples: 89 +Chunk #5: position: 517 length: 113 encoding: XOR, crc32: 42309707, samples: 87 +Chunk #6: position: 636 length: 17 encoding: XOR, crc32: f8406014, samples: 1 +Chunk #7: position: 659 length: 126 encoding: XOR, crc32: d9631436, samples: 87 +Chunk #8: position: 791 length: 108 encoding: XOR, crc32: 204d98a0, samples: 88 +``` + +Example with samples: + +``` +tsdb-chunks -samples 01FTT67BBYH23T8870BBF77YZX/chunks/000001 | head -n 20 +01FTT67BBYH23T8870BBF77YZX/chunks/000001 +Chunk #0: position: 8 length: 22 encoding: XOR, crc32: fe445c39, samples: 13 +Chunk #0, sample #0: ts: 1640167456784 (2021-12-22T10:04:16.784Z), val: 1 +Chunk #0, sample #1: ts: 1640167516784 (2021-12-22T10:05:16.784Z), val: 1 +Chunk #0, sample #2: ts: 1640167576784 (2021-12-22T10:06:16.784Z), val: 1 +Chunk #0, sample #3: ts: 1640167636784 (2021-12-22T10:07:16.784Z), val: 1 +Chunk #0, sample #4: ts: 1640167696784 (2021-12-22T10:08:16.784Z), val: 1 +Chunk #0, sample #5: ts: 1640167756784 (2021-12-22T10:09:16.784Z), val: 1 +Chunk #0, sample #6: ts: 1640167816784 (2021-12-22T10:10:16.784Z), val: 1 +Chunk #0, sample #7: ts: 1640167876784 (2021-12-22T10:11:16.784Z), val: 1 +Chunk #0, sample #8: ts: 1640167936784 (2021-12-22T10:12:16.784Z), val: 1 +Chunk #0, sample #9: ts: 1640167996784 (2021-12-22T10:13:16.784Z), val: 1 +Chunk #0, sample #10: ts: 1640168056784 (2021-12-22T10:14:16.784Z), val: 1 +Chunk #0, sample #11: ts: 1640168116784 (2021-12-22T10:15:16.784Z), val: 1 +Chunk #0, sample #12: ts: 1640168176784 (2021-12-22T10:16:16.784Z), val: 1 +Chunk #0: minTS=1640167456784 (2021-12-22T10:04:16.784Z), maxTS=1640168176784 (2021-12-22T10:16:16.784Z) +Chunk #1: position: 36 length: 44 encoding: XOR, crc32: 1b2e22dd, samples: 56 +Chunk #1, sample #0: ts: 1640168356784 (2021-12-22T10:19:16.784Z), val: 1 +Chunk #1, sample #1: ts: 1640168416784 (2021-12-22T10:20:16.784Z), val: 1 +Chunk #1, sample #2: ts: 1640168476784 (2021-12-22T10:21:16.784Z), val: 1 +``` + +## tsdb-index-health + +`tsdb-index-health` inspects TSDB index of a block and generates summary report in JSON form about the health of the index. This is the same index health-check that is used by Grafana Mimir compactor before it compacts the block. + +``` +$ tsdb-index-health ./01FTT67BBYH23T8870BBF77YZX +{ + "TotalSeries": 19277, + "OutOfOrderSeries": 0, + "OutOfOrderChunks": 0, + "DuplicatedChunks": 0, + "OutsideChunks": 0, + "CompleteOutsideChunks": 0, + "Issue347OutsideChunks": 0, + "OutOfOrderLabels": 0, + "SeriesMinLifeDuration": "5s", + "SeriesAvgLifeDuration": "1h12m11s925ms", + "SeriesMaxLifeDuration": "1h26m40s1ms", + "SeriesMinLifeDurationWithoutSingleSampleSeries": "5s", + "SeriesAvgLifeDurationWithoutSingleSampleSeries": "1h12m11s925ms", + "SeriesMaxLifeDurationWithoutSingleSampleSeries": "1h26m40s1ms", + "SeriesMinChunks": 1, + "SeriesAvgChunks": 7, + "SeriesMaxChunks": 11, + "TotalChunks": 152276, + "ChunkMinDuration": "0s", + "ChunkAvgDuration": "9m8s389ms", + "ChunkMaxDuration": "1h19m25s", + "ChunkMinSize": 23, + "ChunkAvgSize": 201, + "ChunkMaxSize": 4651, + "SingleSampleSeries": 0, + "SingleSampleChunks": 3462, + "LabelNamesCount": 56, + "MetricLabelValuesCount": 541 +} +``` + +## tsdb-compact + +`tsdb-compact` compacts specified blocks together into one or more output blocks. +It doesn't do any planning, and simply merges all specified blocks. +If `-shard-count` option is used, multiple output blocks are produced, using the same sharding algorithm as split-and-merge compactor. + +Example: + +``` +$ tsdb-compact -output-dir ./out -shard-count=4 01FPCEFXKRREFKH3MHQFXA9S7G 01FQGS1WN6KVX3ZM39SRE88DBS 01FQKXVKF3QG5WQXSY726KKSBP +level=info msg="compact blocks" count=3 mint=1638874644135 maxt=1640167200000 ulid=01FV22WZ3F4HTE2JEMS5PJX8RC sources="[01FPCEFXKRREFKH3MHQFXA9S7G 01FQGS1WN6KVX3ZM39SRE88DBS 01FQKXVKF3QG5WQXSY726KKSBP]" duration=2.184381417s shard=1_of_4 +level=info msg="compact blocks" count=3 mint=1638874644135 maxt=1640167200000 ulid=01FV22WZ3FMCS7WNV49BZ20GQ9 sources="[01FPCEFXKRREFKH3MHQFXA9S7G 01FQGS1WN6KVX3ZM39SRE88DBS 01FQKXVKF3QG5WQXSY726KKSBP]" duration=2.184538792s shard=2_of_4 +level=info msg="compact blocks" count=3 mint=1638874644135 maxt=1640167200000 ulid=01FV22WZ3FGRPHAQD9ZNW4N57P sources="[01FPCEFXKRREFKH3MHQFXA9S7G 01FQGS1WN6KVX3ZM39SRE88DBS 01FQKXVKF3QG5WQXSY726KKSBP]" duration=2.184559125s shard=3_of_4 +level=info msg="compact blocks" count=3 mint=1638874644135 maxt=1640167200000 ulid=01FV22WZ3FRXGZA8MFPPFB5KXH sources="[01FPCEFXKRREFKH3MHQFXA9S7G 01FQGS1WN6KVX3ZM39SRE88DBS 01FQKXVKF3QG5WQXSY726KKSBP]" duration=2.184576709s shard=4_of_4 +``` + +## tsdb-index-toc + +`tsdb-index-toc` prints sizes of individual sections of TSDB Index, using TOC section from the Index. See [TSDB Index Format](https://github.com/prometheus/prometheus/blob/main/tsdb/docs/format/index.md) for more details. + +``` +$ tsdb-index-toc 01FPCEFXKRREFKH3MHQFXA9S7G/index +Symbols table size: 25721 +Series size: 1750593 +Label indices: 4177 +Postings: 292168 +Label offset table: 661 +Postings offset table: 35630 +``` + +## tsdb-symbols + +`tsdb-symbols` analyses symbols stored in TSDB index, and shows the summary of this analysis. It can also optionally do the series sharding from split-and-merge compactor and compute expected number of symbols per shard. + +``` +$ tsdb-symbols -shard-count=4 01FTT67BBYH23T8870BBF77YZX +01FTT67BBYH23T8870BBF77YZX: mint=1640166758768 (2021-12-22T09:52:38Z), maxt=1640174400000 (2021-12-22T12:00:00Z), duration: 2h7m21.232s +01FTT67BBYH23T8870BBF77YZX: {__org_id__="fake"} +01FTT67BBYH23T8870BBF77YZX: index: symbol table size: 28817 bytes, symbols: 965 +01FTT67BBYH23T8870BBF77YZX: symbols iteration: total length of symbols: 27848 bytes, symbols: 965 +01FTT67BBYH23T8870BBF77YZX: index structure overhead: 969 bytes +01FTT67BBYH23T8870BBF77YZX: found 953 unique symbols from series in the block + +Found 953 unique symbols from series across ALL blocks, with total length 27622 bytes +Shard 0: Found 808 unique symbols from series in the shard (84.78 %), length of symbols in the shard: 22735 bytes (82.31 %) +Shard 1: Found 807 unique symbols from series in the shard (84.68 %), length of symbols in the shard: 22865 bytes (82.78 %) +Shard 2: Found 797 unique symbols from series in the shard (83.63 %), length of symbols in the shard: 22172 bytes (80.27 %) +Shard 3: Found 814 unique symbols from series in the shard (85.41 %), length of symbols in the shard: 23019 bytes (83.34 %) + +Analysis complete in 82.33225ms +``` diff --git a/tools/tsdb-chunks/README.md b/tools/tsdb-chunks/README.md deleted file mode 100644 index 2150f9f6715..00000000000 --- a/tools/tsdb-chunks/README.md +++ /dev/null @@ -1,2 +0,0 @@ -tsdb-chunks parses chunks file (eg. chunks/000001) and prints its content: information about individual chunks, -and their samples (if -samples is used). diff --git a/tools/tsdb-compact/README.md b/tools/tsdb-compact/README.md deleted file mode 100644 index 695fd154da9..00000000000 --- a/tools/tsdb-compact/README.md +++ /dev/null @@ -1,2 +0,0 @@ -tsdb-compact runs Prometheus compaction code, but without the planning -- instead it compacts (merges) blocks -passed as command line arguments into single (or multiple when splitting is enabled) blocks. diff --git a/tools/tsdb-index/README.md b/tools/tsdb-index/README.md deleted file mode 100644 index f52937887c9..00000000000 --- a/tools/tsdb-index/README.md +++ /dev/null @@ -1,3 +0,0 @@ -tsdb-index prints series found in the TSDB block index. - -It can optionally show only series matching the selector. diff --git a/tools/tsdb-symbols/README.md b/tools/tsdb-symbols/README.md deleted file mode 100644 index 21ea81814e1..00000000000 --- a/tools/tsdb-symbols/README.md +++ /dev/null @@ -1,3 +0,0 @@ -tsdb-symbols compares number of symbols in the TSDB block index and symbols found in the series. - -It can also optionally run series sharding and compute expected number of symbols per shard. From 8b7f340513518ec32f23cfd02c6e4833e719fc4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Fri, 4 Feb 2022 16:00:11 +0100 Subject: [PATCH 101/168] Move remaining tools docs to correct location. (#1045) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- .../sources/tools/list-deduplicated-blocks.md | 12 ++++++++++-- .../sources/tools/query-step-alignment-analysis.md | 6 ++++++ .../README.md => docs/sources/tools/ulidtime.md | 10 +++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) rename tools/list-deduplicated-blocks/README.md => docs/sources/tools/list-deduplicated-blocks.md (63%) rename tools/query-step-alignment-analysis/README.md => docs/sources/tools/query-step-alignment-analysis.md (90%) rename tools/ulidtime/README.md => docs/sources/tools/ulidtime.md (66%) diff --git a/tools/list-deduplicated-blocks/README.md b/docs/sources/tools/list-deduplicated-blocks.md similarity index 63% rename from tools/list-deduplicated-blocks/README.md rename to docs/sources/tools/list-deduplicated-blocks.md index 5921b909a92..63ddb59eeae 100644 --- a/tools/list-deduplicated-blocks/README.md +++ b/docs/sources/tools/list-deduplicated-blocks.md @@ -1,5 +1,13 @@ -This tool downloads all meta.json file from tenants' debug/metas directory, removes duplicates -(using ShardAwareDeduplicateFilter), and prints information about remaining blocks. +--- +title: "List deduplicated blocks" +description: "" +weight: 100 +--- + +# List deduplicated blocks + +`list-deduplicated-blocks` downloads all `meta.json` files from tenants' debug/metas directory, removes duplicates +(using `ShardAwareDeduplicateFilter`), and prints information about remaining blocks. This should output blocks that are supposed to be in the bucket (although old blocks may have been deleted due to retention -- Mimir doesn't cleanup meta.json file from debug/metas in such case). diff --git a/tools/query-step-alignment-analysis/README.md b/docs/sources/tools/query-step-alignment-analysis.md similarity index 90% rename from tools/query-step-alignment-analysis/README.md rename to docs/sources/tools/query-step-alignment-analysis.md index fac0a48e970..d1312d74759 100644 --- a/tools/query-step-alignment-analysis/README.md +++ b/docs/sources/tools/query-step-alignment-analysis.md @@ -1,3 +1,9 @@ +--- +title: "Query Step Alignment analysis" +description: "" +weight: 100 +--- + # Query Step Alignment analysis This tools allow to parse the query stats log messages of query-frontends to diff --git a/tools/ulidtime/README.md b/docs/sources/tools/ulidtime.md similarity index 66% rename from tools/ulidtime/README.md rename to docs/sources/tools/ulidtime.md index fcde4c48432..e5d92eb4076 100644 --- a/tools/ulidtime/README.md +++ b/docs/sources/tools/ulidtime.md @@ -1,4 +1,12 @@ -Ulidtime is tiny tool to parse ULID and print time embedded in it. +--- +title: "ULID time" +description: "" +weight: 100 +--- + +# ULID time + +`ulidtime` is a tiny tool to parse [ULID](https://github.com/ulid/spec) and print the time embedded in it. Example: From a9dcbb2fe048568f6ad0274d215f1a70bbf01720 Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Fri, 4 Feb 2022 17:01:24 +0100 Subject: [PATCH 102/168] Simplify alertmanager discovery (#993) * Add support for thanos service discovery to ruler Signed-off-by: Dimitar Dimitrov * Add tests for incorrect URL in AM notifier Signed-off-by: Dimitar Dimitrov * Remove validation for SRV records in AM discovery Signed-off-by: Dimitar Dimitrov * Remove -ruler.alertmanager-discovery flag Signed-off-by: Dimitar Dimitrov * Move alertmanagersd to ruler/service_discovery Signed-off-by: Dimitar Dimitrov * Move SD functions to service_discovery.go Signed-off-by: Dimitar Dimitrov * Update CHANGELOG.md Signed-off-by: Dimitar Dimitrov * Regenerate docs Signed-off-by: Dimitar Dimitrov * Fix race in service_discovery_test.go Signed-off-by: Dimitar Dimitrov * Cancel contexts in service_discovery_test.go Signed-off-by: Dimitar Dimitrov * Use mock.Mock in service_discovery_test.go Signed-off-by: Dimitar Dimitrov * Realias thanosdns with dns in notifier and sd_test Signed-off-by: Dimitar Dimitrov * Move SRV host regex as a global var in notifier.go Signed-off-by: Dimitar Dimitrov * Pass prefixed and labeled registerer to ruler dns provider Signed-off-by: Dimitar Dimitrov * Remove references to thanos in ruler SD Signed-off-by: Dimitar Dimitrov * Remove backward compatibility in AM DNS SD Signed-off-by: Dimitar Dimitrov * Add more SD URL validation to notifier.go Signed-off-by: Dimitar Dimitrov * Update CHANGELOG.md Signed-off-by: Dimitar Dimitrov * Remove import aliases with thanos Signed-off-by: Dimitar Dimitrov * go mod vendor Signed-off-by: Dimitar Dimitrov * Rename prefix for ruler DNS resolver metrics Otherwise, we're getting duplicate metrics registration or other errors registering the same metrics with different labels. Signed-off-by: Dimitar Dimitrov * Correct CHANGELOG.md instructions for AM discovery Signed-off-by: Dimitar Dimitrov * Make memberlist and ruler DNS resolver metrics consistent Signed-off-by: Dimitar Dimitrov * Make a tribute to the linter gods * Update CHANGELOG.md Co-authored-by: Marco Pracucci * Reflect cortex_dns_* label name change in gossip e2e test Signed-off-by: Dimitar Dimitrov Co-authored-by: Marco Pracucci --- CHANGELOG.md | 6 + cmd/mimir/help-all.txt.tmpl | 4 +- cmd/mimir/help.txt.tmpl | 4 +- .../configuration/config-file-reference.md | 10 +- ...getting_started_with_gossiped_ring_test.go | 2 +- pkg/mimir/modules.go | 17 +- pkg/ruler/manager.go | 5 +- pkg/ruler/manager_test.go | 2 +- pkg/ruler/notifier.go | 78 ++-- pkg/ruler/notifier_test.go | 154 +++++--- pkg/ruler/ruler.go | 5 +- pkg/ruler/ruler_test.go | 5 +- pkg/ruler/service_discovery.go | 102 +++++ pkg/ruler/service_discovery_test.go | 168 ++++++++ .../prometheus/discovery/dns/dns.go | 360 ------------------ vendor/modules.txt | 1 - 16 files changed, 433 insertions(+), 490 deletions(-) create mode 100644 pkg/ruler/service_discovery.go create mode 100644 pkg/ruler/service_discovery_test.go delete mode 100644 vendor/github.com/prometheus/prometheus/discovery/dns/dns.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c15c660fba..9b9b50965fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -256,6 +256,12 @@ * [CHANGE] Alertmanager: `-experimental.alertmanager.enable-api` flag has been renamed to `-alertmanager.enable-api` and is now stable. #913 * [CHANGE] Ingester: changed default value of `-blocks-storage.tsdb.retention-period` from `6h` to `24h`. #966 * [CHANGE] Changed default value of `-querier.query-ingesters-within` and `-blocks-storage.tsdb.close-idle-tsdb-timeout` from `0` to `13h`. #966 +* [CHANGE] Ruler: `-ruler.alertmanager-discovery` flag has been removed. URLs following the prior SRV format, will be treated as a static target. To continue using service discovery for these URLs prepend `dnssrvnoa+` to them. #993 +* [CHANGE] Ruler: add support for [DNS service discovery format](./docs/sources/configuration/arguments.md#dns-service-discovery) for `-ruler.alertmanager-url`. #993 +* [CHANGE] Ruler: the following metrics for Alertmanager DNS service discovery are replaced: #993 + * `prometheus_sd_dns_lookups_total` replaced by `cortex_dns_lookups_total{component="ruler"}` + * `prometheus_sd_dns_lookup_failures_total` replaced by `cortex_dns_failures_total{component="ruler"}` +* [CHANGE] Memberlist: the `name` label on metrics `cortex_dns_failures_total`, `cortex_dns_lookups_total` and `cortex_dns_provider_results` was renamed to `component`. #993 * [FEATURE] Query Frontend: Add `cortex_query_fetched_chunks_total` per-user counter to expose the number of chunks fetched as part of queries. This metric can be enabled with the `-frontend.query-stats-enabled` flag (or its respective YAML config option `query_stats_enabled`). #31 * [FEATURE] Query Frontend: Add experimental querysharding for the blocks storage (instant and range queries). You can now enable querysharding for blocks storage (`-store.engine=blocks`) by setting `-frontend.parallelize-shardable-queries` to `true`. The following additional config and exported metrics have been added. #79 #80 #100 #124 #140 #148 #150 #151 #153 #154 #155 #156 #157 #158 #159 #160 #163 #169 #172 #196 #205 #225 #226 #227 #228 #230 #235 #240 #239 #246 #244 #319 #330 #371 #385 #400 #458 #586 #630 #660 #707 * New config options: diff --git a/cmd/mimir/help-all.txt.tmpl b/cmd/mimir/help-all.txt.tmpl index 51c66f5f5d7..86a54287acb 100644 --- a/cmd/mimir/help-all.txt.tmpl +++ b/cmd/mimir/help-all.txt.tmpl @@ -1331,12 +1331,10 @@ Usage of ./cmd/mimir/mimir: Path to the key file for the client certificate. Also requires the client certificate to be configured. -ruler.alertmanager-client.tls-server-name string Override the expected name on the server certificate. - -ruler.alertmanager-discovery - Use DNS SRV records to discover Alertmanager hosts. -ruler.alertmanager-refresh-interval duration How long to wait between refreshing DNS resolutions of Alertmanager hosts. (default 1m0s) -ruler.alertmanager-url string - Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each Alertmanager URL is treated as a separate group in the configuration. Multiple Alertmanagers in HA per group can be supported by using DNS resolution via -ruler.alertmanager-discovery. + Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each URL is treated as a separate group. Multiple Alertmanagers in HA per group can be supported by using DNS service discovery format. Basic auth is supported as part of the URL. -ruler.alertmanager-use-v2 If enabled requests to Alertmanager will utilize the V2 API. (default true) -ruler.client.backoff-max-period duration diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 16aeec13f5d..363a1008a8f 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -655,12 +655,10 @@ Usage of ./cmd/mimir/mimir: HTTP Basic authentication password. It overrides the password set in the URL (if any). -ruler.alertmanager-client.basic-auth-username string HTTP Basic authentication username. It overrides the username set in the URL (if any). - -ruler.alertmanager-discovery - Use DNS SRV records to discover Alertmanager hosts. -ruler.alertmanager-refresh-interval duration How long to wait between refreshing DNS resolutions of Alertmanager hosts. (default 1m0s) -ruler.alertmanager-url string - Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each Alertmanager URL is treated as a separate group in the configuration. Multiple Alertmanagers in HA per group can be supported by using DNS resolution via -ruler.alertmanager-discovery. + Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each URL is treated as a separate group. Multiple Alertmanagers in HA per group can be supported by using DNS service discovery format. Basic auth is supported as part of the URL. -ruler.alertmanager-use-v2 If enabled requests to Alertmanager will utilize the V2 API. (default true) -ruler.client.backoff-max-period duration diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 93644cf5fd9..14aaae4fd60 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -1141,16 +1141,12 @@ ruler_client: [rule_path: | default = "/rules"] # Comma-separated list of URL(s) of the Alertmanager(s) to send notifications -# to. Each Alertmanager URL is treated as a separate group in the configuration. -# Multiple Alertmanagers in HA per group can be supported by using DNS -# resolution via -ruler.alertmanager-discovery. +# to. Each URL is treated as a separate group. Multiple Alertmanagers in HA per +# group can be supported by using DNS service discovery format. Basic auth is +# supported as part of the URL. # CLI flag: -ruler.alertmanager-url [alertmanager_url: | default = ""] -# Use DNS SRV records to discover Alertmanager hosts. -# CLI flag: -ruler.alertmanager-discovery -[enable_alertmanager_discovery: | default = false] - # How long to wait between refreshing DNS resolutions of Alertmanager hosts. # CLI flag: -ruler.alertmanager-refresh-interval [alertmanager_refresh_interval: | default = 1m] diff --git a/integration/getting_started_with_gossiped_ring_test.go b/integration/getting_started_with_gossiped_ring_test.go index 8a0c6dcacff..99a831c7f01 100644 --- a/integration/getting_started_with_gossiped_ring_test.go +++ b/integration/getting_started_with_gossiped_ring_test.go @@ -131,7 +131,7 @@ func TestGettingStartedWithGossipedRing(t *testing.T) { // Make sure that no DNS failures occurred. // No actual DNS lookups are necessarily performed, so we can't really assert on that. - mlMatcher := labels.MustNewMatcher(labels.MatchEqual, "name", "memberlist") + mlMatcher := labels.MustNewMatcher(labels.MatchEqual, "component", "memberlist") require.NoError(t, mimir1.WaitSumMetricsWithOptions(e2e.Equals(0), []string{"cortex_dns_failures_total"}, e2e.WithLabelMatchers(mlMatcher))) require.NoError(t, mimir2.WaitSumMetricsWithOptions(e2e.Equals(0), []string{"cortex_dns_failures_total"}, e2e.WithLabelMatchers(mlMatcher))) } diff --git a/pkg/mimir/modules.go b/pkg/mimir/modules.go index 2d680f798de..5d261b51909 100644 --- a/pkg/mimir/modules.go +++ b/pkg/mimir/modules.go @@ -541,9 +541,20 @@ func (t *Mimir) initRuler() (serv services.Service, err error) { federatedQueryable = tenantfederation.NewQueryable(queryable, bypassForSingleQuerier, util_log.Logger) } - managerFactory := ruler.DefaultTenantManagerFactory(t.Cfg.Ruler, t.Distributor, queryable, federatedQueryable, eng, t.Overrides, prometheus.DefaultRegisterer) - manager, err := ruler.NewDefaultMultiTenantManager(t.Cfg.Ruler, managerFactory, prometheus.DefaultRegisterer, util_log.Logger) + + // We need to prefix and add a label to the metrics for the DNS resolver because, unlike other mimir components, + // it doesn't already have the `cortex_` prefix and the `component` label to the metrics it emits + dnsProviderReg := prometheus.WrapRegistererWithPrefix( + "cortex_", + prometheus.WrapRegistererWith( + prometheus.Labels{"component": "ruler"}, + prometheus.DefaultRegisterer, + ), + ) + + dnsResolver := dns.NewProvider(util_log.Logger, dnsProviderReg, dns.GolangResolverType) + manager, err := ruler.NewDefaultMultiTenantManager(t.Cfg.Ruler, managerFactory, prometheus.DefaultRegisterer, util_log.Logger, dnsResolver) if err != nil { return nil, err } @@ -624,7 +635,7 @@ func (t *Mimir) initMemberlistKV() (services.Service, error) { dnsProviderReg := prometheus.WrapRegistererWithPrefix( "cortex_", prometheus.WrapRegistererWith( - prometheus.Labels{"name": "memberlist"}, + prometheus.Labels{"component": "memberlist"}, reg, ), ) diff --git a/pkg/ruler/manager.go b/pkg/ruler/manager.go index bb310484771..8eb834876bb 100644 --- a/pkg/ruler/manager.go +++ b/pkg/ruler/manager.go @@ -21,6 +21,7 @@ import ( "github.com/prometheus/prometheus/model/rulefmt" "github.com/prometheus/prometheus/notifier" promRules "github.com/prometheus/prometheus/rules" + "github.com/thanos-io/thanos/pkg/cacheutil" "github.com/weaveworks/common/user" "golang.org/x/net/context/ctxhttp" @@ -52,8 +53,8 @@ type DefaultMultiTenantManager struct { logger log.Logger } -func NewDefaultMultiTenantManager(cfg Config, managerFactory ManagerFactory, reg prometheus.Registerer, logger log.Logger) (*DefaultMultiTenantManager, error) { - ncfg, err := buildNotifierConfig(&cfg) +func NewDefaultMultiTenantManager(cfg Config, managerFactory ManagerFactory, reg prometheus.Registerer, logger log.Logger, dnsResolver cacheutil.AddressProvider) (*DefaultMultiTenantManager, error) { + ncfg, err := buildNotifierConfig(&cfg, dnsResolver) if err != nil { return nil, err } diff --git a/pkg/ruler/manager_test.go b/pkg/ruler/manager_test.go index 1184c0314ce..64f6e6b7c23 100644 --- a/pkg/ruler/manager_test.go +++ b/pkg/ruler/manager_test.go @@ -31,7 +31,7 @@ func TestSyncRuleGroups(t *testing.T) { _ = os.RemoveAll(dir) }) - m, err := NewDefaultMultiTenantManager(Config{RulePath: dir}, factory, nil, log.NewNopLogger()) + m, err := NewDefaultMultiTenantManager(Config{RulePath: dir}, factory, nil, log.NewNopLogger(), nil) require.NoError(t, err) const user = "testUser" diff --git a/pkg/ruler/notifier.go b/pkg/ruler/notifier.go index bac61b6e809..6a32c85fa15 100644 --- a/pkg/ruler/notifier.go +++ b/pkg/ruler/notifier.go @@ -8,9 +8,7 @@ package ruler import ( "context" "flag" - "fmt" "net/url" - "regexp" "strings" "sync" @@ -21,8 +19,8 @@ import ( "github.com/prometheus/common/model" "github.com/prometheus/prometheus/config" "github.com/prometheus/prometheus/discovery" - "github.com/prometheus/prometheus/discovery/dns" "github.com/prometheus/prometheus/notifier" + "github.com/thanos-io/thanos/pkg/cacheutil" "github.com/grafana/mimir/pkg/util" ) @@ -93,43 +91,34 @@ func (rn *rulerNotifier) stop() { // Builds a Prometheus config.Config from a ruler.Config with just the required // options to configure notifications to Alertmanager. -func buildNotifierConfig(rulerConfig *Config) (*config.Config, error) { - amURLs := strings.Split(rulerConfig.AlertmanagerURL, ",") - validURLs := make([]*url.URL, 0, len(amURLs)) - - srvDNSregexp := regexp.MustCompile(`^_.+._.+`) - for _, h := range amURLs { - url, err := url.Parse(h) - if err != nil { - return nil, err - } - - if url.String() == "" { - continue - } - - // Given we only support SRV lookups as part of service discovery, we need to ensure - // hosts provided follow this specification: _service._proto.name - // e.g. _http._tcp.alertmanager.com - if rulerConfig.AlertmanagerDiscovery && !srvDNSregexp.MatchString(url.Host) { - return nil, fmt.Errorf("when alertmanager-discovery is on, host name must be of the form _portname._tcp.service.fqdn (is %q)", url.Host) - } - - validURLs = append(validURLs, url) - } - - if len(validURLs) == 0 { +func buildNotifierConfig(rulerConfig *Config, resolver cacheutil.AddressProvider) (*config.Config, error) { + if rulerConfig.AlertmanagerURL == "" { + // no AM URLs were provided, so we can just return a default config without errors return &config.Config{}, nil } + amURLs := strings.Split(rulerConfig.AlertmanagerURL, ",") + amConfigs := make([]*config.AlertmanagerConfig, 0, len(amURLs)) + apiVersion := config.AlertmanagerAPIVersionV1 if rulerConfig.AlertmanagerEnableV2API { apiVersion = config.AlertmanagerAPIVersionV2 } - amConfigs := make([]*config.AlertmanagerConfig, 0, len(validURLs)) - for _, url := range validURLs { - amConfigs = append(amConfigs, amConfigFromURL(rulerConfig, url, apiVersion)) + for _, rawURL := range amURLs { + isSD, qType, url, err := sanitizedAlertmanagerURL(rawURL) + if err != nil { + return nil, err + } + + var sdConfig discovery.Config + if isSD { + sdConfig = dnsSD(rulerConfig, resolver, qType, url) + } else { + sdConfig = staticTarget(url) + } + + amConfigs = append(amConfigs, amConfigWithSD(rulerConfig, url, apiVersion, sdConfig)) } promConfig := &config.Config{ @@ -141,34 +130,13 @@ func buildNotifierConfig(rulerConfig *Config) (*config.Config, error) { return promConfig, nil } -func amConfigFromURL(rulerConfig *Config, url *url.URL, apiVersion config.AlertmanagerAPIVersion) *config.AlertmanagerConfig { - var sdConfig discovery.Configs - if rulerConfig.AlertmanagerDiscovery { - sdConfig = discovery.Configs{ - &dns.SDConfig{ - Names: []string{url.Host}, - RefreshInterval: model.Duration(rulerConfig.AlertmanagerRefreshInterval), - Type: "SRV", - Port: 0, // Ignored, because of SRV. - }, - } - - } else { - sdConfig = discovery.Configs{ - discovery.StaticConfig{ - { - Targets: []model.LabelSet{{model.AddressLabel: model.LabelValue(url.Host)}}, - }, - }, - } - } - +func amConfigWithSD(rulerConfig *Config, url *url.URL, apiVersion config.AlertmanagerAPIVersion, sdConfig discovery.Config) *config.AlertmanagerConfig { amConfig := &config.AlertmanagerConfig{ APIVersion: apiVersion, Scheme: url.Scheme, PathPrefix: url.Path, Timeout: model.Duration(rulerConfig.NotificationTimeout), - ServiceDiscoveryConfigs: sdConfig, + ServiceDiscoveryConfigs: discovery.Configs{sdConfig}, HTTPClientConfig: config_util.HTTPClientConfig{ TLSConfig: config_util.TLSConfig{ CAFile: rulerConfig.Notifier.TLS.CAPath, diff --git a/pkg/ruler/notifier_test.go b/pkg/ruler/notifier_test.go index 3f1a4b2c544..5487f6080b4 100644 --- a/pkg/ruler/notifier_test.go +++ b/pkg/ruler/notifier_test.go @@ -6,7 +6,7 @@ package ruler import ( - "fmt" + "errors" "testing" "time" @@ -14,8 +14,8 @@ import ( "github.com/prometheus/common/model" "github.com/prometheus/prometheus/config" "github.com/prometheus/prometheus/discovery" - "github.com/prometheus/prometheus/discovery/dns" "github.com/stretchr/testify/require" + "github.com/thanos-io/thanos/pkg/discovery/dns" "github.com/grafana/mimir/pkg/util" ) @@ -57,25 +57,23 @@ func TestBuildNotifierConfig(t *testing.T) { }, }, { - name: "with a single URL and service discovery", + name: "with a single URL, v2 API, and no service discovery", cfg: &Config{ - AlertmanagerURL: "http://_http._tcp.alertmanager.default.svc.cluster.local/alertmanager", - AlertmanagerDiscovery: true, - AlertmanagerRefreshInterval: time.Duration(60), + AlertmanagerURL: "http://alertmanager.default.svc.cluster.local/alertmanager", + AlertmanagerEnableV2API: true, }, ncfg: &config.Config{ AlertingConfig: config.AlertingConfig{ AlertmanagerConfigs: []*config.AlertmanagerConfig{ { - APIVersion: "v1", + APIVersion: "v2", Scheme: "http", PathPrefix: "/alertmanager", ServiceDiscoveryConfigs: discovery.Configs{ - &dns.SDConfig{ - Names: []string{"_http._tcp.alertmanager.default.svc.cluster.local"}, - RefreshInterval: 60, - Type: "SRV", - Port: 0, + discovery.StaticConfig{ + { + Targets: []model.LabelSet{{"__address__": "alertmanager.default.svc.cluster.local"}}, + }, }, }, }, @@ -84,12 +82,29 @@ func TestBuildNotifierConfig(t *testing.T) { }, }, { - name: "with service discovery and an invalid URL", + name: "with a SRV URL but no service discovery (missing dns+ prefix)", cfg: &Config{ - AlertmanagerURL: "http://_http.default.svc.cluster.local/alertmanager", - AlertmanagerDiscovery: true, + AlertmanagerURL: "http://_http._tcp.alertmanager.default.svc.cluster.local/alertmanager", + AlertmanagerRefreshInterval: time.Duration(60), + }, + ncfg: &config.Config{ + AlertingConfig: config.AlertingConfig{ + AlertmanagerConfigs: []*config.AlertmanagerConfig{ + { + APIVersion: "v1", + Scheme: "http", + PathPrefix: "/alertmanager", + ServiceDiscoveryConfigs: discovery.Configs{ + discovery.StaticConfig{ + { + Targets: []model.LabelSet{{"__address__": "_http._tcp.alertmanager.default.svc.cluster.local"}}, + }, + }, + }, + }, + }, + }, }, - err: fmt.Errorf("when alertmanager-discovery is on, host name must be of the form _portname._tcp.service.fqdn (is \"alertmanager.default.svc.cluster.local\")"), }, { name: "with multiple URLs and no service discovery", @@ -125,39 +140,27 @@ func TestBuildNotifierConfig(t *testing.T) { }, }, }, + { - name: "with multiple URLs and service discovery", + name: "with basic authentication URL and no service discovery", cfg: &Config{ - AlertmanagerURL: "http://_http._tcp.alertmanager-0.default.svc.cluster.local/alertmanager,http://_http._tcp.alertmanager-1.default.svc.cluster.local/alertmanager", - AlertmanagerDiscovery: true, - AlertmanagerRefreshInterval: time.Duration(60), + AlertmanagerURL: "http://marco:hunter2@alertmanager-0.default.svc.cluster.local/alertmanager", }, ncfg: &config.Config{ AlertingConfig: config.AlertingConfig{ AlertmanagerConfigs: []*config.AlertmanagerConfig{ { - APIVersion: "v1", - Scheme: "http", - PathPrefix: "/alertmanager", - ServiceDiscoveryConfigs: discovery.Configs{ - &dns.SDConfig{ - Names: []string{"_http._tcp.alertmanager-0.default.svc.cluster.local"}, - RefreshInterval: 60, - Type: "SRV", - Port: 0, - }, + HTTPClientConfig: config_util.HTTPClientConfig{ + BasicAuth: &config_util.BasicAuth{Username: "marco", Password: "hunter2"}, }, - }, - { APIVersion: "v1", Scheme: "http", PathPrefix: "/alertmanager", ServiceDiscoveryConfigs: discovery.Configs{ - &dns.SDConfig{ - Names: []string{"_http._tcp.alertmanager-1.default.svc.cluster.local"}, - RefreshInterval: 60, - Type: "SRV", - Port: 0, + discovery.StaticConfig{ + { + Targets: []model.LabelSet{{"__address__": "alertmanager-0.default.svc.cluster.local"}}, + }, }, }, }, @@ -166,9 +169,9 @@ func TestBuildNotifierConfig(t *testing.T) { }, }, { - name: "with Basic Authentication URL", + name: "with basic authentication URL and service discovery", cfg: &Config{ - AlertmanagerURL: "http://marco:hunter2@alertmanager-0.default.svc.cluster.local/alertmanager", + AlertmanagerURL: "dnssrv+https://marco:hunter2@_http._tcp.alertmanager-0.default.svc.cluster.local/alertmanager", }, ncfg: &config.Config{ AlertingConfig: config.AlertingConfig{ @@ -178,13 +181,12 @@ func TestBuildNotifierConfig(t *testing.T) { BasicAuth: &config_util.BasicAuth{Username: "marco", Password: "hunter2"}, }, APIVersion: "v1", - Scheme: "http", + Scheme: "https", PathPrefix: "/alertmanager", ServiceDiscoveryConfigs: discovery.Configs{ - discovery.StaticConfig{ - { - Targets: []model.LabelSet{{"__address__": "alertmanager-0.default.svc.cluster.local"}}, - }, + dnsServiceDiscovery{ + Host: "_http._tcp.alertmanager-0.default.svc.cluster.local", + QType: dns.SRV, }, }, }, @@ -193,7 +195,7 @@ func TestBuildNotifierConfig(t *testing.T) { }, }, { - name: "with Basic Authentication URL and Explicit", + name: "with basic authentication URL, no service discovery, and explicit config", cfg: &Config{ AlertmanagerURL: "http://marco:hunter2@alertmanager-0.default.svc.cluster.local/alertmanager", Notifier: NotifierConfig{ @@ -225,16 +227,74 @@ func TestBuildNotifierConfig(t *testing.T) { }, }, }, + { + name: "with multiple URLs and service discovery", + cfg: &Config{ + AlertmanagerURL: "dns+http://alertmanager.mimir.svc.cluster.local:8080/alertmanager,dnssrv+https://_http._tcp.alertmanager2.mimir.svc.cluster.local/am", + AlertmanagerRefreshInterval: time.Second, + }, + ncfg: &config.Config{ + AlertingConfig: config.AlertingConfig{ + AlertmanagerConfigs: []*config.AlertmanagerConfig{ + { + APIVersion: "v1", + Scheme: "http", + PathPrefix: "/alertmanager", + ServiceDiscoveryConfigs: discovery.Configs{ + dnsServiceDiscovery{ + Host: "alertmanager.mimir.svc.cluster.local:8080", + RefreshInterval: time.Second, + QType: dns.A, + }, + }, + }, + { + APIVersion: "v1", + Scheme: "https", + PathPrefix: "/am", + ServiceDiscoveryConfigs: discovery.Configs{ + dnsServiceDiscovery{ + Host: "_http._tcp.alertmanager2.mimir.svc.cluster.local", + RefreshInterval: time.Second, + QType: dns.SRV, + }, + }, + }, + }, + }, + }, + }, + { + name: "with DNS service discovery and missing scheme", + cfg: &Config{ + AlertmanagerURL: "dns+alertmanager.mimir.svc.cluster.local:8080/alertmanager", + }, + err: errors.New("improperly formatted alertmanager URL \"alertmanager.mimir.svc.cluster.local:8080/alertmanager\" (maybe the scheme is missing?); see DNS Service Discovery docs"), + }, + { + name: "with only dns+ prefix", + cfg: &Config{ + AlertmanagerURL: "dns+", + }, + err: errors.New("improperly formatted alertmanager URL \"\" (maybe the scheme is missing?); see DNS Service Discovery docs"), + }, + { + name: "misspelled DNS SD format prefix (dnsserv+ vs dnssrv+)", + cfg: &Config{ + AlertmanagerURL: "dnsserv+https://_http._tcp.alertmanager2.mimir.svc.cluster.local/am", + }, + err: errors.New("invalid DNS service discovery prefix \"dnsserv\""), + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ncfg, err := buildNotifierConfig(tt.cfg) + ncfg, err := buildNotifierConfig(tt.cfg, nil) if tt.err == nil { require.NoError(t, err) require.Equal(t, tt.ncfg, ncfg) } else { - require.Error(t, tt.err, err) + require.EqualError(t, err, tt.err.Error()) } }) } diff --git a/pkg/ruler/ruler.go b/pkg/ruler/ruler.go index ad32af65ae9..f6b99e38917 100644 --- a/pkg/ruler/ruler.go +++ b/pkg/ruler/ruler.go @@ -85,8 +85,6 @@ type Config struct { // URL of the Alertmanager to send notifications to. AlertmanagerURL string `yaml:"alertmanager_url"` - // Whether to use DNS SRV records to discover Alertmanager. - AlertmanagerDiscovery bool `yaml:"enable_alertmanager_discovery"` // How long to wait between refreshing the list of Alertmanager based on DNS service discovery. AlertmanagerRefreshInterval time.Duration `yaml:"alertmanager_refresh_interval"` // Enables the ruler notifier to use the Alertmananger V2 API. @@ -146,8 +144,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.EvaluationInterval, "ruler.evaluation-interval", 1*time.Minute, "How frequently to evaluate rules") f.DurationVar(&cfg.PollInterval, "ruler.poll-interval", 1*time.Minute, "How frequently to poll for rule changes") - f.StringVar(&cfg.AlertmanagerURL, "ruler.alertmanager-url", "", "Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each Alertmanager URL is treated as a separate group in the configuration. Multiple Alertmanagers in HA per group can be supported by using DNS resolution via -ruler.alertmanager-discovery.") - f.BoolVar(&cfg.AlertmanagerDiscovery, "ruler.alertmanager-discovery", false, "Use DNS SRV records to discover Alertmanager hosts.") + f.StringVar(&cfg.AlertmanagerURL, "ruler.alertmanager-url", "", "Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each URL is treated as a separate group. Multiple Alertmanagers in HA per group can be supported by using DNS service discovery format. Basic auth is supported as part of the URL.") f.DurationVar(&cfg.AlertmanagerRefreshInterval, "ruler.alertmanager-refresh-interval", 1*time.Minute, "How long to wait between refreshing DNS resolutions of Alertmanager hosts.") f.BoolVar(&cfg.AlertmanagerEnableV2API, "ruler.alertmanager-use-v2", true, "If enabled requests to Alertmanager will utilize the V2 API.") f.IntVar(&cfg.NotificationQueueCapacity, "ruler.notification-queue-capacity", 10000, "Capacity of the queue for notifications to be sent to the Alertmanager.") diff --git a/pkg/ruler/ruler_test.go b/pkg/ruler/ruler_test.go index 7a739d00ab2..d3c6b4f2005 100644 --- a/pkg/ruler/ruler_test.go +++ b/pkg/ruler/ruler_test.go @@ -123,7 +123,7 @@ func testSetup(t *testing.T) (*promql.Engine, storage.QueryableFunc, Pusher, log func newManager(t *testing.T, cfg Config) *DefaultMultiTenantManager { engine, noopQueryable, pusher, logger, overrides := testSetup(t) - manager, err := NewDefaultMultiTenantManager(cfg, DefaultTenantManagerFactory(cfg, pusher, noopQueryable, noopQueryable, engine, overrides, nil), prometheus.NewRegistry(), logger) + manager, err := NewDefaultMultiTenantManager(cfg, DefaultTenantManagerFactory(cfg, pusher, noopQueryable, noopQueryable, engine, overrides, nil), prometheus.NewRegistry(), logger, nil) require.NoError(t, err) return manager @@ -172,7 +172,7 @@ func buildRuler(t *testing.T, cfg Config, storage rulestore.RuleStore, rulerAddr reg := prometheus.NewRegistry() managerFactory := DefaultTenantManagerFactory(cfg, pusher, noopQueryable, noopQueryable, engine, overrides, reg) - manager, err := NewDefaultMultiTenantManager(cfg, managerFactory, reg, log.NewNopLogger()) + manager, err := NewDefaultMultiTenantManager(cfg, managerFactory, reg, log.NewNopLogger(), nil) require.NoError(t, err) ruler, err := newRuler(cfg, manager, reg, logger, storage, overrides, newMockClientsPool(cfg, logger, reg, rulerAddrMap)) @@ -208,7 +208,6 @@ func TestNotifierSendsUserIDHeader(t *testing.T) { // We create an empty rule store so that the ruler will not load any rule from it. cfg := defaultRulerConfig(t) cfg.AlertmanagerURL = ts.URL - cfg.AlertmanagerDiscovery = false manager := newManager(t, cfg) defer manager.Stop() diff --git a/pkg/ruler/service_discovery.go b/pkg/ruler/service_discovery.go new file mode 100644 index 00000000000..f058ddd56a4 --- /dev/null +++ b/pkg/ruler/service_discovery.go @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package ruler + +import ( + "context" + "fmt" + "net/url" + "time" + + "github.com/pkg/errors" + "github.com/prometheus/common/model" + "github.com/prometheus/prometheus/discovery" + "github.com/prometheus/prometheus/discovery/refresh" + "github.com/prometheus/prometheus/discovery/targetgroup" + "github.com/thanos-io/thanos/pkg/cacheutil" + "github.com/thanos-io/thanos/pkg/discovery/dns" +) + +const ( + mechanismName = "dns_sd" +) + +type dnsServiceDiscovery struct { + Resolver cacheutil.AddressProvider + + RefreshInterval time.Duration + QType dns.QType + Host string +} + +func (dnsServiceDiscovery) Name() string { + return mechanismName +} + +func (c dnsServiceDiscovery) NewDiscoverer(opts discovery.DiscovererOptions) (discovery.Discoverer, error) { + return refresh.NewDiscovery(opts.Logger, mechanismName, c.RefreshInterval, c.resolve), nil +} + +func (c dnsServiceDiscovery) resolve(ctx context.Context) ([]*targetgroup.Group, error) { + if err := c.Resolver.Resolve(ctx, []string{string(c.QType) + "+" + c.Host}); err != nil { + return nil, err + } + + resolved := c.Resolver.Addresses() + targets := make([]model.LabelSet, len(resolved)) + for i, r := range resolved { + targets[i] = model.LabelSet{ + model.AddressLabel: model.LabelValue(r), + } + } + + tg := &targetgroup.Group{ + Targets: targets, + Source: c.Host, + } + + return []*targetgroup.Group{tg}, nil +} + +func dnsSD(rulerConfig *Config, resolver cacheutil.AddressProvider, qType dns.QType, url *url.URL) discovery.Config { + return dnsServiceDiscovery{ + Resolver: resolver, + RefreshInterval: rulerConfig.AlertmanagerRefreshInterval, + Host: url.Host, + QType: qType, + } +} + +func staticTarget(url *url.URL) discovery.Config { + return discovery.StaticConfig{ + { + Targets: []model.LabelSet{{model.AddressLabel: model.LabelValue(url.Host)}}, + }, + } +} + +func sanitizedAlertmanagerURL(amURL string) (isServiceDiscovery bool, qType dns.QType, parsedURL *url.URL, err error) { + rawQType, rawURL := dns.GetQTypeName(amURL) + qType = dns.QType(rawQType) + + switch qType { + case "", dns.A, dns.SRV, dns.SRVNoA: + default: + err = errors.Errorf("invalid DNS service discovery prefix %q", qType) + return + } + + parsedURL, err = url.Parse(rawURL) + if err != nil { + return + } + + if parsedURL.String() == "" || parsedURL.Host == "" { + err = fmt.Errorf("improperly formatted alertmanager URL %q (maybe the scheme is missing?); see DNS Service Discovery docs", rawURL) + return + } + + isServiceDiscovery = qType != "" + + return +} diff --git a/pkg/ruler/service_discovery_test.go b/pkg/ruler/service_discovery_test.go new file mode 100644 index 00000000000..8269b9155e4 --- /dev/null +++ b/pkg/ruler/service_discovery_test.go @@ -0,0 +1,168 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package ruler + +import ( + "context" + "testing" + "time" + + "github.com/prometheus/common/model" + "github.com/prometheus/prometheus/discovery" + "github.com/prometheus/prometheus/discovery/targetgroup" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "github.com/thanos-io/thanos/pkg/discovery/dns" +) + +func TestConfig_TranslatesToPrometheusTargetGroup(t *testing.T) { + const sourceAddress = "doesnt-matter.com" + + testCases := []struct { + name string + resolvedAddresses []string + + expectedTargetGroups []*targetgroup.Group + }{ + { + name: "happy flow single address", + resolvedAddresses: []string{"127.0.0.1"}, + expectedTargetGroups: []*targetgroup.Group{ + { + Targets: []model.LabelSet{ + {model.AddressLabel: "127.0.0.1"}, + }, + Source: sourceAddress, + }, + }, + }, + { + name: "happy flow multiple addresses", + resolvedAddresses: []string{"127.0.0.1", "127.0.0.2"}, + expectedTargetGroups: []*targetgroup.Group{ + { + Targets: []model.LabelSet{ + {model.AddressLabel: "127.0.0.1"}, + {model.AddressLabel: "127.0.0.2"}, + }, + Source: sourceAddress, + }, + }, + }, + { + name: "happy flow no addresses", + resolvedAddresses: []string{}, + expectedTargetGroups: []*targetgroup.Group{ + { + Targets: []model.LabelSet{}, + Source: sourceAddress, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + resolver := &mockResolver{} + resolver.expectAnyResolveCall() + resolver.returnAddresses(tc.resolvedAddresses) + + cfg := dnsServiceDiscovery{ + RefreshInterval: time.Millisecond, + Resolver: resolver, + QType: dns.A, + Host: sourceAddress, + } + discoverer, err := cfg.NewDiscoverer(discovery.DiscovererOptions{}) + require.NoError(t, err) + + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + groupsChan := make(chan []*targetgroup.Group) + go discoverer.Run(ctx, groupsChan) + groups := <-groupsChan + + assert.ElementsMatch(t, tc.expectedTargetGroups, groups) + }) + } +} + +func TestConfig_ConstructsLookupNamesCorrectly(t *testing.T) { + testCases := []struct { + name string + qType dns.QType + host string + + expectedAddress string + }{ + { + name: "dns+", + qType: dns.A, + host: "localhost:123", + expectedAddress: "dns+localhost:123", + }, + { + name: "dnssrv+", + qType: dns.SRV, + host: "localhost:123", + expectedAddress: "dnssrv+localhost:123", + }, + { + name: "dnssrvnoa+", + qType: dns.SRVNoA, + host: "localhost:123", + expectedAddress: "dnssrvnoa+localhost:123", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + resolver := &mockResolver{} + resolver.expectResolveCalledWith(tc.expectedAddress) + resolver.returnAddresses(nil) + + cfg := dnsServiceDiscovery{ + RefreshInterval: time.Millisecond, + Resolver: resolver, + QType: tc.qType, + Host: tc.host, + } + discoverer, err := cfg.NewDiscoverer(discovery.DiscovererOptions{}) + require.NoError(t, err) + + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + groupsChan := make(chan []*targetgroup.Group) + go discoverer.Run(ctx, groupsChan) + <-groupsChan // wait for at least one iteration + }) + } +} + +type mockResolver struct { + mock.Mock +} + +func (f *mockResolver) Resolve(ctx context.Context, toResolve []string) error { + ret := f.Called(ctx, toResolve) + return ret.Error(0) +} + +func (f *mockResolver) Addresses() []string { + return f.Called().Get(0).([]string) +} + +func (f *mockResolver) expectResolveCalledWith(toResolve ...string) { + f.On("Resolve", mock.Anything, toResolve).Return(nil) +} + +func (f *mockResolver) expectAnyResolveCall() { + f.On("Resolve", mock.Anything, mock.Anything).Return(nil) +} + +func (f *mockResolver) returnAddresses(resolved []string) { + f.On("Addresses").Return(resolved) +} diff --git a/vendor/github.com/prometheus/prometheus/discovery/dns/dns.go b/vendor/github.com/prometheus/prometheus/discovery/dns/dns.go deleted file mode 100644 index 6b9860d629e..00000000000 --- a/vendor/github.com/prometheus/prometheus/discovery/dns/dns.go +++ /dev/null @@ -1,360 +0,0 @@ -// Copyright 2016 The Prometheus Authors -// 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 dns - -import ( - "context" - "fmt" - "net" - "strings" - "sync" - "time" - - "github.com/go-kit/log" - "github.com/go-kit/log/level" - "github.com/miekg/dns" - "github.com/pkg/errors" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/model" - - "github.com/prometheus/prometheus/discovery" - "github.com/prometheus/prometheus/discovery/refresh" - "github.com/prometheus/prometheus/discovery/targetgroup" -) - -const ( - resolvConf = "/etc/resolv.conf" - - dnsNameLabel = model.MetaLabelPrefix + "dns_name" - dnsSrvRecordPrefix = model.MetaLabelPrefix + "dns_srv_record_" - dnsSrvRecordTargetLabel = dnsSrvRecordPrefix + "target" - dnsSrvRecordPortLabel = dnsSrvRecordPrefix + "port" - - // Constants for instrumentation. - namespace = "prometheus" -) - -var ( - dnsSDLookupsCount = prometheus.NewCounter( - prometheus.CounterOpts{ - Namespace: namespace, - Name: "sd_dns_lookups_total", - Help: "The number of DNS-SD lookups.", - }) - dnsSDLookupFailuresCount = prometheus.NewCounter( - prometheus.CounterOpts{ - Namespace: namespace, - Name: "sd_dns_lookup_failures_total", - Help: "The number of DNS-SD lookup failures.", - }) - - // DefaultSDConfig is the default DNS SD configuration. - DefaultSDConfig = SDConfig{ - RefreshInterval: model.Duration(30 * time.Second), - Type: "SRV", - } -) - -func init() { - discovery.RegisterConfig(&SDConfig{}) - prometheus.MustRegister(dnsSDLookupFailuresCount, dnsSDLookupsCount) -} - -// SDConfig is the configuration for DNS based service discovery. -type SDConfig struct { - Names []string `yaml:"names"` - RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` - Type string `yaml:"type"` - Port int `yaml:"port"` // Ignored for SRV records -} - -// Name returns the name of the Config. -func (*SDConfig) Name() string { return "dns" } - -// NewDiscoverer returns a Discoverer for the Config. -func (c *SDConfig) NewDiscoverer(opts discovery.DiscovererOptions) (discovery.Discoverer, error) { - return NewDiscovery(*c, opts.Logger), nil -} - -// UnmarshalYAML implements the yaml.Unmarshaler interface. -func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { - *c = DefaultSDConfig - type plain SDConfig - err := unmarshal((*plain)(c)) - if err != nil { - return err - } - if len(c.Names) == 0 { - return errors.New("DNS-SD config must contain at least one SRV record name") - } - switch strings.ToUpper(c.Type) { - case "SRV": - case "A", "AAAA": - if c.Port == 0 { - return errors.New("a port is required in DNS-SD configs for all record types except SRV") - } - default: - return errors.Errorf("invalid DNS-SD records type %s", c.Type) - } - return nil -} - -// Discovery periodically performs DNS-SD requests. It implements -// the Discoverer interface. -type Discovery struct { - *refresh.Discovery - names []string - port int - qtype uint16 - logger log.Logger - - lookupFn func(name string, qtype uint16, logger log.Logger) (*dns.Msg, error) -} - -// NewDiscovery returns a new Discovery which periodically refreshes its targets. -func NewDiscovery(conf SDConfig, logger log.Logger) *Discovery { - if logger == nil { - logger = log.NewNopLogger() - } - - qtype := dns.TypeSRV - switch strings.ToUpper(conf.Type) { - case "A": - qtype = dns.TypeA - case "AAAA": - qtype = dns.TypeAAAA - case "SRV": - qtype = dns.TypeSRV - } - d := &Discovery{ - names: conf.Names, - qtype: qtype, - port: conf.Port, - logger: logger, - lookupFn: lookupWithSearchPath, - } - d.Discovery = refresh.NewDiscovery( - logger, - "dns", - time.Duration(conf.RefreshInterval), - d.refresh, - ) - return d -} - -func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { - var ( - wg sync.WaitGroup - ch = make(chan *targetgroup.Group) - tgs = make([]*targetgroup.Group, 0, len(d.names)) - ) - - wg.Add(len(d.names)) - for _, name := range d.names { - go func(n string) { - if err := d.refreshOne(ctx, n, ch); err != nil && err != context.Canceled { - level.Error(d.logger).Log("msg", "Error refreshing DNS targets", "err", err) - } - wg.Done() - }(name) - } - - go func() { - wg.Wait() - close(ch) - }() - - for tg := range ch { - tgs = append(tgs, tg) - } - return tgs, nil -} - -func (d *Discovery) refreshOne(ctx context.Context, name string, ch chan<- *targetgroup.Group) error { - response, err := d.lookupFn(name, d.qtype, d.logger) - dnsSDLookupsCount.Inc() - if err != nil { - dnsSDLookupFailuresCount.Inc() - return err - } - - tg := &targetgroup.Group{} - hostPort := func(a string, p int) model.LabelValue { - return model.LabelValue(net.JoinHostPort(a, fmt.Sprintf("%d", p))) - } - - for _, record := range response.Answer { - var target, dnsSrvRecordTarget, dnsSrvRecordPort model.LabelValue - - switch addr := record.(type) { - case *dns.SRV: - dnsSrvRecordTarget = model.LabelValue(addr.Target) - dnsSrvRecordPort = model.LabelValue(fmt.Sprintf("%d", addr.Port)) - - // Remove the final dot from rooted DNS names to make them look more usual. - addr.Target = strings.TrimRight(addr.Target, ".") - - target = hostPort(addr.Target, int(addr.Port)) - case *dns.A: - target = hostPort(addr.A.String(), d.port) - case *dns.AAAA: - target = hostPort(addr.AAAA.String(), d.port) - case *dns.CNAME: - // CNAME responses can occur with "Type: A" dns_sd_config requests. - continue - default: - level.Warn(d.logger).Log("msg", "Invalid record", "record", record) - continue - } - tg.Targets = append(tg.Targets, model.LabelSet{ - model.AddressLabel: target, - dnsNameLabel: model.LabelValue(name), - dnsSrvRecordTargetLabel: dnsSrvRecordTarget, - dnsSrvRecordPortLabel: dnsSrvRecordPort, - }) - } - - tg.Source = name - select { - case <-ctx.Done(): - return ctx.Err() - case ch <- tg: - } - - return nil -} - -// lookupWithSearchPath tries to get an answer for various permutations of -// the given name, appending the system-configured search path as necessary. -// -// There are three possible outcomes: -// -// 1. One of the permutations of the given name is recognized as -// "valid" by the DNS, in which case we consider ourselves "done" -// and that answer is returned. Note that, due to the way the DNS -// handles "name has resource records, but none of the specified type", -// the answer received may have an empty set of results. -// -// 2. All of the permutations of the given name are responded to by one of -// the servers in the "nameservers" list with the answer "that name does -// not exist" (NXDOMAIN). In that case, it can be considered -// pseudo-authoritative that there are no records for that name. -// -// 3. One or more of the names was responded to by all servers with some -// sort of error indication. In that case, we can't know if, in fact, -// there are records for the name or not, so whatever state the -// configuration is in, we should keep it that way until we know for -// sure (by, presumably, all the names getting answers in the future). -// -// Outcomes 1 and 2 are indicated by a valid response message (possibly an -// empty one) and no error. Outcome 3 is indicated by an error return. The -// error will be generic-looking, because trying to return all the errors -// returned by the combination of all name permutations and servers is a -// nightmare. -func lookupWithSearchPath(name string, qtype uint16, logger log.Logger) (*dns.Msg, error) { - conf, err := dns.ClientConfigFromFile(resolvConf) - if err != nil { - return nil, errors.Wrap(err, "could not load resolv.conf") - } - - allResponsesValid := true - - for _, lname := range conf.NameList(name) { - response, err := lookupFromAnyServer(lname, qtype, conf, logger) - - if err != nil { - // We can't go home yet, because a later name - // may give us a valid, successful answer. However - // we can no longer say "this name definitely doesn't - // exist", because we did not get that answer for - // at least one name. - allResponsesValid = false - } else if response.Rcode == dns.RcodeSuccess { - // Outcome 1: GOLD! - return response, nil - } - } - - if allResponsesValid { - // Outcome 2: everyone says NXDOMAIN, that's good enough for me - return &dns.Msg{}, nil - } - // Outcome 3: boned. - return nil, errors.Errorf("could not resolve %q: all servers responded with errors to at least one search domain", name) -} - -// lookupFromAnyServer uses all configured servers to try and resolve a specific -// name. If a viable answer is received from a server, then it is -// immediately returned, otherwise the other servers in the config are -// tried, and if none of them return a viable answer, an error is returned. -// -// A "viable answer" is one which indicates either: -// -// 1. "yes, I know that name, and here are its records of the requested type" -// (RCODE==SUCCESS, ANCOUNT > 0); -// 2. "yes, I know that name, but it has no records of the requested type" -// (RCODE==SUCCESS, ANCOUNT==0); or -// 3. "I know that name doesn't exist" (RCODE==NXDOMAIN). -// -// A non-viable answer is "anything else", which encompasses both various -// system-level problems (like network timeouts) and also -// valid-but-unexpected DNS responses (SERVFAIL, REFUSED, etc). -func lookupFromAnyServer(name string, qtype uint16, conf *dns.ClientConfig, logger log.Logger) (*dns.Msg, error) { - client := &dns.Client{} - - for _, server := range conf.Servers { - servAddr := net.JoinHostPort(server, conf.Port) - msg, err := askServerForName(name, qtype, client, servAddr, true) - if err != nil { - level.Warn(logger).Log("msg", "DNS resolution failed", "server", server, "name", name, "err", err) - continue - } - - if msg.Rcode == dns.RcodeSuccess || msg.Rcode == dns.RcodeNameError { - // We have our answer. Time to go home. - return msg, nil - } - } - - return nil, errors.Errorf("could not resolve %s: no servers returned a viable answer", name) -} - -// askServerForName makes a request to a specific DNS server for a specific -// name (and qtype). Retries with TCP in the event of response truncation, -// but otherwise just sends back whatever the server gave, whether that be a -// valid-looking response, or an error. -func askServerForName(name string, queryType uint16, client *dns.Client, servAddr string, edns bool) (*dns.Msg, error) { - msg := &dns.Msg{} - - msg.SetQuestion(dns.Fqdn(name), queryType) - if edns { - msg.SetEdns0(dns.DefaultMsgSize, false) - } - - response, _, err := client.Exchange(msg, servAddr) - if err != nil { - return nil, err - } - - if response.Truncated { - if client.Net == "tcp" { - return nil, errors.New("got truncated message on TCP (64kiB limit exceeded?)") - } - - client.Net = "tcp" - return askServerForName(name, queryType, client, servAddr, false) - } - - return response, nil -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 85b7d6dd734..1e70d46a0ce 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -618,7 +618,6 @@ github.com/prometheus/procfs/internal/util ## explicit; go 1.16 github.com/prometheus/prometheus/config github.com/prometheus/prometheus/discovery -github.com/prometheus/prometheus/discovery/dns github.com/prometheus/prometheus/discovery/refresh github.com/prometheus/prometheus/discovery/targetgroup github.com/prometheus/prometheus/model/exemplar From 27492b36552689ec41bd5433ba74b46c21e16ace Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Fri, 4 Feb 2022 18:28:58 +0100 Subject: [PATCH 103/168] Replace cortex with mimir in mimirtool help texts and errors (#983) * Replace cortex with mimir in help texts and errors Signed-off-by: Dimitar Dimitrov * Apply docs squad suggestions Co-authored-by: Ursula Kallio * Change mimir to Grafana Mimir in AlertCommand Signed-off-by: Dimitar Dimitrov Co-authored-by: Ursula Kallio --- pkg/mimirtool/client/client.go | 4 +- pkg/mimirtool/client/client_test.go | 36 ++++++++--------- pkg/mimirtool/commands/access_control.go | 2 +- pkg/mimirtool/commands/alerts.go | 32 +++++++-------- pkg/mimirtool/commands/analyse.go | 16 ++++---- pkg/mimirtool/commands/analyse_rulefiles.go | 2 +- pkg/mimirtool/commands/analyse_ruler.go | 2 +- pkg/mimirtool/commands/loadgen.go | 2 +- pkg/mimirtool/commands/remote_read.go | 8 ++-- pkg/mimirtool/commands/rules.go | 44 ++++++++++----------- pkg/mimirtool/version/version.go | 2 +- 11 files changed, 75 insertions(+), 75 deletions(-) diff --git a/pkg/mimirtool/client/client.go b/pkg/mimirtool/client/client.go index 1e1b53b263b..b9c8b14769d 100644 --- a/pkg/mimirtool/client/client.go +++ b/pkg/mimirtool/client/client.go @@ -130,7 +130,7 @@ func (r *CortexClient) doRequest(path, method string, payload []byte) (*http.Res log.WithFields(log.Fields{ "url": req.URL.String(), "method": req.Method, - }).Debugln("sending request to cortex api") + }).Debugln("sending request to Grafana Mimir API") resp, err := r.Client.Do(req) if err != nil { @@ -138,7 +138,7 @@ func (r *CortexClient) doRequest(path, method string, payload []byte) (*http.Res "url": req.URL.String(), "method": req.Method, "error": err.Error(), - }).Errorln("error during request to cortex api") + }).Errorln("error during request to Grafana Mimir API") return nil, err } diff --git a/pkg/mimirtool/client/client_test.go b/pkg/mimirtool/client/client_test.go index c3bad9080a6..7a87b8cc0f8 100644 --- a/pkg/mimirtool/client/client_test.go +++ b/pkg/mimirtool/client/client_test.go @@ -25,64 +25,64 @@ func TestBuildURL(t *testing.T) { name: "builds the correct URL with a trailing slash", path: "/api/v1/rules", method: http.MethodPost, - url: "http://cortexurl.com/", - resultURL: "http://cortexurl.com/api/v1/rules", + url: "http://mimirurl.com/", + resultURL: "http://mimirurl.com/api/v1/rules", }, { name: "builds the correct URL without a trailing slash", path: "/api/v1/rules", method: http.MethodPost, - url: "http://cortexurl.com", - resultURL: "http://cortexurl.com/api/v1/rules", + url: "http://mimirurl.com", + resultURL: "http://mimirurl.com/api/v1/rules", }, { name: "builds the correct URL when the base url has a path", path: "/api/v1/rules", method: http.MethodPost, - url: "http://cortexurl.com/apathto", - resultURL: "http://cortexurl.com/apathto/api/v1/rules", + url: "http://mimirurl.com/apathto", + resultURL: "http://mimirurl.com/apathto/api/v1/rules", }, { name: "builds the correct URL when the base url has a path with trailing slash", path: "/api/v1/rules", method: http.MethodPost, - url: "http://cortexurl.com/apathto/", - resultURL: "http://cortexurl.com/apathto/api/v1/rules", + url: "http://mimirurl.com/apathto/", + resultURL: "http://mimirurl.com/apathto/api/v1/rules", }, { name: "builds the correct URL with a trailing slash and the target path contains special characters", path: "/api/v1/rules/%20%2Fspace%F0%9F%8D%BB", method: http.MethodPost, - url: "http://cortexurl.com/", - resultURL: "http://cortexurl.com/api/v1/rules/%20%2Fspace%F0%9F%8D%BB", + url: "http://mimirurl.com/", + resultURL: "http://mimirurl.com/api/v1/rules/%20%2Fspace%F0%9F%8D%BB", }, { name: "builds the correct URL without a trailing slash and the target path contains special characters", path: "/api/v1/rules/%20%2Fspace%F0%9F%8D%BB", method: http.MethodPost, - url: "http://cortexurl.com", - resultURL: "http://cortexurl.com/api/v1/rules/%20%2Fspace%F0%9F%8D%BB", + url: "http://mimirurl.com", + resultURL: "http://mimirurl.com/api/v1/rules/%20%2Fspace%F0%9F%8D%BB", }, { name: "builds the correct URL when the base url has a path and the target path contains special characters", path: "/api/v1/rules/%20%2Fspace%F0%9F%8D%BB", method: http.MethodPost, - url: "http://cortexurl.com/apathto", - resultURL: "http://cortexurl.com/apathto/api/v1/rules/%20%2Fspace%F0%9F%8D%BB", + url: "http://mimirurl.com/apathto", + resultURL: "http://mimirurl.com/apathto/api/v1/rules/%20%2Fspace%F0%9F%8D%BB", }, { name: "builds the correct URL when the base url has a path and the target path starts with a escaped slash", path: "/api/v1/rules/%2F-first-char-slash", method: http.MethodPost, - url: "http://cortexurl.com/apathto", - resultURL: "http://cortexurl.com/apathto/api/v1/rules/%2F-first-char-slash", + url: "http://mimirurl.com/apathto", + resultURL: "http://mimirurl.com/apathto/api/v1/rules/%2F-first-char-slash", }, { name: "builds the correct URL when the base url has a path and the target path ends with a escaped slash", path: "/api/v1/rules/last-char-slash%2F", method: http.MethodPost, - url: "http://cortexurl.com/apathto", - resultURL: "http://cortexurl.com/apathto/api/v1/rules/last-char-slash%2F", + url: "http://mimirurl.com/apathto", + resultURL: "http://mimirurl.com/apathto/api/v1/rules/last-char-slash%2F", }, } diff --git a/pkg/mimirtool/commands/access_control.go b/pkg/mimirtool/commands/access_control.go index 36536eacdb5..5edd049001c 100644 --- a/pkg/mimirtool/commands/access_control.go +++ b/pkg/mimirtool/commands/access_control.go @@ -26,7 +26,7 @@ func (a *AccessControlCommand) Register(app *kingpin.Application, envVars EnvVar aclCmd := app.Command("acl", "Generate and view ACL options in GrafanaCloud.") generateHeaderCmd := aclCmd.Command("generate-header", "Generate the header that needs to be passed to the datasource for setting ACLs.").Action(a.generateHeader) - generateHeaderCmd.Flag("id", "Cortex tenant ID, alternatively set "+envVars.TenantID+".").Envar(envVars.TenantID).Required().StringVar(&a.InstanceID) + generateHeaderCmd.Flag("id", "Grafana Mimir tenant ID, alternatively set "+envVars.TenantID+".").Envar(envVars.TenantID).Required().StringVar(&a.InstanceID) generateHeaderCmd.Flag("rule", "The access control rules (Prometheus selectors). Set it multiple times to set multiple rules.").Required().StringsVar(&a.ACLs) } diff --git a/pkg/mimirtool/commands/alerts.go b/pkg/mimirtool/commands/alerts.go index dffb119255b..947caef87cb 100644 --- a/pkg/mimirtool/commands/alerts.go +++ b/pkg/mimirtool/commands/alerts.go @@ -64,22 +64,22 @@ type AlertCommand struct { // Register rule related commands and flags with the kingpin application func (a *AlertmanagerCommand) Register(app *kingpin.Application, envVars EnvVarNames) { - alertCmd := app.Command("alertmanager", "View & edit alertmanager configs stored in cortex.").PreAction(a.setup) - alertCmd.Flag("address", "Address of the cortex cluster, alternatively set "+envVars.Address+".").Envar(envVars.Address).Required().StringVar(&a.ClientConfig.Address) - alertCmd.Flag("id", "Cortex tenant id, alternatively set "+envVars.TenantID+".").Envar(envVars.TenantID).Required().StringVar(&a.ClientConfig.ID) - alertCmd.Flag("user", fmt.Sprintf("API user to use when contacting cortex, alternatively set %s. If empty, %s will be used instead.", envVars.APIUser, envVars.TenantID)).Default("").Envar(envVars.APIUser).StringVar(&a.ClientConfig.User) - alertCmd.Flag("key", "API key to use when contacting cortex, alternatively set "+envVars.APIKey+".").Default("").Envar(envVars.APIKey).StringVar(&a.ClientConfig.Key) - alertCmd.Flag("tls-ca-path", "TLS CA certificate to verify cortex API as part of mTLS, alternatively set "+envVars.TLSCAPath+".").Default("").Envar(envVars.TLSCAPath).StringVar(&a.ClientConfig.TLS.CAPath) - alertCmd.Flag("tls-cert-path", "TLS client certificate to authenticate with cortex API as part of mTLS, alternatively set "+envVars.TLSCertPath+".").Default("").Envar(envVars.TLSCertPath).StringVar(&a.ClientConfig.TLS.CertPath) - alertCmd.Flag("tls-key-path", "TLS client certificate private key to authenticate with cortex API as part of mTLS, alternatively set "+envVars.TLSKeyPath+".").Default("").Envar(envVars.TLSKeyPath).StringVar(&a.ClientConfig.TLS.KeyPath) + alertCmd := app.Command("alertmanager", "View and edit Alertmanager configurations that are stored in Grafana Mimir.").PreAction(a.setup) + alertCmd.Flag("address", "Address of the Grafana Mimir cluster; alternatively, set "+envVars.Address+".").Envar(envVars.Address).Required().StringVar(&a.ClientConfig.Address) + alertCmd.Flag("id", "Grafana Mimir tenant ID; alternatively, set "+envVars.TenantID+".").Envar(envVars.TenantID).Required().StringVar(&a.ClientConfig.ID) + alertCmd.Flag("user", fmt.Sprintf("API user to use when contacting Grafana Mimir; alternatively, set %s. If empty, %s is used instead.", envVars.APIUser, envVars.TenantID)).Default("").Envar(envVars.APIUser).StringVar(&a.ClientConfig.User) + alertCmd.Flag("key", "API key to use when contacting Grafana Mimir; alternatively, set "+envVars.APIKey+".").Default("").Envar(envVars.APIKey).StringVar(&a.ClientConfig.Key) + alertCmd.Flag("tls-ca-path", "TLS CA certificate to verify Grafana Mimir API as part of mTLS; alternatively, set "+envVars.TLSCAPath+".").Default("").Envar(envVars.TLSCAPath).StringVar(&a.ClientConfig.TLS.CAPath) + alertCmd.Flag("tls-cert-path", "TLS client certificate to authenticate with the Grafana Mimir API as part of mTLS; alternatively, set "+envVars.TLSCertPath+".").Default("").Envar(envVars.TLSCertPath).StringVar(&a.ClientConfig.TLS.CertPath) + alertCmd.Flag("tls-key-path", "TLS client certificate private key to authenticate with the Grafana Mimir API as part of mTLS; alternatively, set "+envVars.TLSKeyPath+".").Default("").Envar(envVars.TLSKeyPath).StringVar(&a.ClientConfig.TLS.KeyPath) // Get Alertmanager Configs Command - getAlertsCmd := alertCmd.Command("get", "Get the alertmanager config currently in the cortex alertmanager.").Action(a.getConfig) + getAlertsCmd := alertCmd.Command("get", "Get the Alertmanager configuration that is currently in the Grafana Mimir Alertmanager.").Action(a.getConfig) getAlertsCmd.Flag("disable-color", "disable colored output").BoolVar(&a.DisableColor) - alertCmd.Command("delete", "Delete the alertmanager config currently in the cortex alertmanager.").Action(a.deleteConfig) + alertCmd.Command("delete", "Delete the Alertmanager configuration that is currently in the Grafana Mimir Alertmanager.").Action(a.deleteConfig) - loadalertCmd := alertCmd.Command("load", "load a set of rules to a designated cortex endpoint").Action(a.loadConfig) + loadalertCmd := alertCmd.Command("load", "Load a set of rules to a designated Grafana Mimir endpoint").Action(a.loadConfig) loadalertCmd.Arg("config", "alertmanager configuration to load").Required().StringVar(&a.AlertmanagerConfigFile) loadalertCmd.Arg("template-files", "The template files to load").ExistingFilesVar(&a.TemplateFiles) } @@ -143,12 +143,12 @@ func (a *AlertmanagerCommand) deleteConfig(k *kingpin.ParseContext) error { func (a *AlertCommand) Register(app *kingpin.Application, envVars EnvVarNames) { alertCmd := app.Command("alerts", "View active alerts in alertmanager.").PreAction(a.setup) - alertCmd.Flag("address", "Address of the cortex cluster, alternatively set "+envVars.Address+".").Envar(envVars.Address).Required().StringVar(&a.ClientConfig.Address) - alertCmd.Flag("id", "Cortex tenant id, alternatively set "+envVars.TenantID+".").Envar(envVars.TenantID).Required().StringVar(&a.ClientConfig.ID) - alertCmd.Flag("user", fmt.Sprintf("API user to use when contacting cortex, alternatively set %s. If empty, %s will be used instead.", envVars.APIUser, envVars.TenantID)).Default("").Envar(envVars.APIUser).StringVar(&a.ClientConfig.User) - alertCmd.Flag("key", "API key to use when contacting cortex, alternatively set "+envVars.APIKey+".").Default("").Envar(envVars.APIKey).StringVar(&a.ClientConfig.Key) + alertCmd.Flag("address", "Address of the Grafana Mimir cluster, alternatively set "+envVars.Address+".").Envar(envVars.Address).Required().StringVar(&a.ClientConfig.Address) + alertCmd.Flag("id", "Mimir tenant id, alternatively set "+envVars.TenantID+".").Envar(envVars.TenantID).Required().StringVar(&a.ClientConfig.ID) + alertCmd.Flag("user", fmt.Sprintf("API user to use when contacting Grafana Mimir, alternatively set %s. If empty, %s will be used instead.", envVars.APIUser, envVars.TenantID)).Default("").Envar(envVars.APIUser).StringVar(&a.ClientConfig.User) + alertCmd.Flag("key", "API key to use when contacting Grafana Mimir; alternatively, set "+envVars.APIKey+".").Default("").Envar(envVars.APIKey).StringVar(&a.ClientConfig.Key) - verifyAlertsCmd := alertCmd.Command("verify", "Verifies alerts in an alertmanager cluster are deduplicated; useful for verifying correct configuration when transferring from Prometheus to Cortex alert evaluation.").Action(a.verifyConfig) + verifyAlertsCmd := alertCmd.Command("verify", "Verifies whether or not alerts in an Alertmanager cluster are deduplicated; useful for verifying correct configuration when transferring from Prometheus to Grafana Mimir alert evaluation.").Action(a.verifyConfig) verifyAlertsCmd.Flag("ignore-alerts", "A comma separated list of Alert names to ignore in deduplication checks.").StringVar(&a.IgnoreString) verifyAlertsCmd.Flag("source-label", "Label to look for when deciding if two alerts are duplicates of each other from separate sources.").Default("prometheus").StringVar(&a.SourceLabel) verifyAlertsCmd.Flag("grace-period", "Grace period, don't consider alert groups with the incorrect amount of alert replicas erroneous unless the alerts have existed for more than this amount of time, in minutes.").Default("2").IntVar(&a.GracePeriod) diff --git a/pkg/mimirtool/commands/analyse.go b/pkg/mimirtool/commands/analyse.go index 6cdc055adb1..bfbaacadb52 100644 --- a/pkg/mimirtool/commands/analyse.go +++ b/pkg/mimirtool/commands/analyse.go @@ -13,19 +13,19 @@ type AnalyseCommand struct { } func (cmd *AnalyseCommand) Register(app *kingpin.Application, envVars EnvVarNames) { - analyseCmd := app.Command("analyse", "Run analysis against your Prometheus, Grafana and Cortex to see which metrics being used and exported.") + analyseCmd := app.Command("analyse", "Run analysis against your Prometheus, Grafana, and Grafana Mimir to see which metrics are being used and exported.") paCmd := &PrometheusAnalyseCommand{} prometheusAnalyseCmd := analyseCmd.Command("prometheus", "Take the metrics being used in Grafana and get the cardinality from a Prometheus.").Action(paCmd.run) - prometheusAnalyseCmd.Flag("address", "Address of the Prometheus/Cortex instance, alternatively set "+envVars.Address+"."). + prometheusAnalyseCmd.Flag("address", "Address of the Prometheus or Grafana Mimir instance; alternatively, set "+envVars.Address+"."). Envar(envVars.Address). Required(). StringVar(&paCmd.address) - prometheusAnalyseCmd.Flag("id", "Username to use when contacting Prometheus/Cortex, alternatively set "+envVars.TenantID+"."). + prometheusAnalyseCmd.Flag("id", "Username to use when contacting Prometheus or Grafana Mimir; alternatively, set "+envVars.TenantID+"."). Envar(envVars.TenantID). Default(""). StringVar(&paCmd.username) - prometheusAnalyseCmd.Flag("key", "Password to use when contacting Prometheus/Cortex, alternatively set "+envVars.APIKey+"."). + prometheusAnalyseCmd.Flag("key", "Password to use when contacting Prometheus or Grafana Mimir; alternatively, set "+envVars.APIKey+"."). Envar(envVars.APIKey). Default(""). StringVar(&paCmd.password) @@ -61,17 +61,17 @@ func (cmd *AnalyseCommand) Register(app *kingpin.Application, envVars EnvVarName StringVar(&gaCmd.outputFile) raCmd := &RulerAnalyseCommand{} - rulerAnalyseCmd := analyseCmd.Command("ruler", "Analyse and extract the metrics used in Cortex rules"). + rulerAnalyseCmd := analyseCmd.Command("ruler", "Analyse and extract the metrics that are used in Grafana Mimir rules"). Action(raCmd.run) - rulerAnalyseCmd.Flag("address", "Address of the Prometheus/Cortex instance, alternatively set "+envVars.Address+"."). + rulerAnalyseCmd.Flag("address", "Address of the Prometheus or Grafana Mimir instance; alternatively, set "+envVars.Address+"."). Envar(envVars.Address). Required(). StringVar(&raCmd.ClientConfig.Address) - rulerAnalyseCmd.Flag("id", "Username to use when contacting Prometheus/Cortex, alternatively set "+envVars.TenantID+"."). + rulerAnalyseCmd.Flag("id", "Username to use when contacting Prometheus or Grafana Mimir; alternatively, set "+envVars.TenantID+"."). Envar(envVars.TenantID). Default(""). StringVar(&raCmd.ClientConfig.ID) - rulerAnalyseCmd.Flag("key", "Password to use when contacting Prometheus/Cortex, alternatively set "+envVars.APIKey+"."). + rulerAnalyseCmd.Flag("key", "Password to use when contacting Prometheus or Grafana Mimir; alternatively, set "+envVars.APIKey+"."). Envar(envVars.APIKey). Default(""). StringVar(&raCmd.ClientConfig.Key) diff --git a/pkg/mimirtool/commands/analyse_rulefiles.go b/pkg/mimirtool/commands/analyse_rulefiles.go index 0f9d281596b..a6ed3cb90c5 100644 --- a/pkg/mimirtool/commands/analyse_rulefiles.go +++ b/pkg/mimirtool/commands/analyse_rulefiles.go @@ -23,7 +23,7 @@ func (cmd *RuleFileAnalyseCommand) run(k *kingpin.ParseContext) error { output := &analyse.MetricsInRuler{} output.OverallMetrics = make(map[string]struct{}) - nss, err := rules.ParseFiles("cortex", cmd.RuleFilesList) + nss, err := rules.ParseFiles(rules.MimirBackend, cmd.RuleFilesList) if err != nil { return errors.Wrap(err, "analyse operation unsuccessful, unable to parse rules files") } diff --git a/pkg/mimirtool/commands/analyse_ruler.go b/pkg/mimirtool/commands/analyse_ruler.go index 1f32bae948e..3da7c9f7a79 100644 --- a/pkg/mimirtool/commands/analyse_ruler.go +++ b/pkg/mimirtool/commands/analyse_ruler.go @@ -37,7 +37,7 @@ func (cmd *RulerAnalyseCommand) run(k *kingpin.ParseContext) error { cmd.cli = cli rules, err := cmd.cli.ListRules(context.Background(), "") if err != nil { - log.Fatalf("unable to read rules from cortex, %v", err) + log.Fatalf("Unable to read rules from Grafana Mimir, %v", err) } for ns := range rules { diff --git a/pkg/mimirtool/commands/loadgen.go b/pkg/mimirtool/commands/loadgen.go index bf65d2f2f89..c7ac3ba09ff 100644 --- a/pkg/mimirtool/commands/loadgen.go +++ b/pkg/mimirtool/commands/loadgen.go @@ -74,7 +74,7 @@ type LoadgenCommand struct { func (c *LoadgenCommand) Register(app *kingpin.Application, _ EnvVarNames) { loadgenCommand := &LoadgenCommand{} - cmd := app.Command("loadgen", "Simple load generator for Cortex.").Action(loadgenCommand.run) + cmd := app.Command("loadgen", "Simple load generator for Grafana Mimir.").Action(loadgenCommand.run) cmd.Flag("write-url", ""). Default("").StringVar(&loadgenCommand.writeURL) cmd.Flag("series-name", "name of the metric that will be generated"). diff --git a/pkg/mimirtool/commands/remote_read.go b/pkg/mimirtool/commands/remote_read.go index 3c1f88b18e1..924d1be2c9c 100644 --- a/pkg/mimirtool/commands/remote_read.go +++ b/pkg/mimirtool/commands/remote_read.go @@ -50,25 +50,25 @@ type RemoteReadCommand struct { } func (c *RemoteReadCommand) Register(app *kingpin.Application, envVars EnvVarNames) { - remoteReadCmd := app.Command("remote-read", "Inspect stored series in Cortex using the remote read API.") + remoteReadCmd := app.Command("remote-read", "Inspect stored series in Grafana Mimir using the remote read API.") exportCmd := remoteReadCmd.Command("export", "Export metrics remote read series into a local TSDB.").Action(c.export) dumpCmd := remoteReadCmd.Command("dump", "Dump remote read series.").Action(c.dump) statsCmd := remoteReadCmd.Command("stats", "Show statistic of remote read series.").Action(c.stats) now := time.Now() for _, cmd := range []*kingpin.CmdClause{exportCmd, dumpCmd, statsCmd} { - cmd.Flag("address", "Address of the cortex cluster, alternatively set "+envVars.Address+"."). + cmd.Flag("address", "Address of the Grafana Mimir cluster; alternatively, set "+envVars.Address+"."). Envar(envVars.Address). Required(). StringVar(&c.address) cmd.Flag("remote-read-path", "Path of the remote read endpoint."). Default("/prometheus/api/v1/read"). StringVar(&c.remoteReadPath) - cmd.Flag("id", "Cortex tenant id, alternatively set "+envVars.TenantID+"."). + cmd.Flag("id", "Grafana Mimir tenant ID; alternatively, set "+envVars.TenantID+"."). Envar(envVars.TenantID). Default(""). StringVar(&c.tenantID) - cmd.Flag("key", "Api key to use when contacting cortex, alternatively set "+envVars.APIKey+"."). + cmd.Flag("key", "API key to use when contacting Grafana Mimir; alternatively, set "+envVars.APIKey+"."). Envar(envVars.APIKey). Default(""). StringVar(&c.apiKey) diff --git a/pkg/mimirtool/commands/rules.go b/pkg/mimirtool/commands/rules.go index ccad90fe99d..ba123673f17 100644 --- a/pkg/mimirtool/commands/rules.go +++ b/pkg/mimirtool/commands/rules.go @@ -94,17 +94,17 @@ type RuleCommand struct { // Register rule related commands and flags with the kingpin application func (r *RuleCommand) Register(app *kingpin.Application, envVars EnvVarNames) { - rulesCmd := app.Command("rules", "View & edit rules stored in cortex.").PreAction(r.setup) - rulesCmd.Flag("user", fmt.Sprintf("API user to use when contacting cortex, alternatively set %s. If empty, %s will be used instead.", envVars.APIUser, envVars.TenantID)).Default("").Envar(envVars.APIUser).StringVar(&r.ClientConfig.User) - rulesCmd.Flag("key", "API key to use when contacting cortex, alternatively set "+envVars.APIKey+".").Default("").Envar(envVars.APIKey).StringVar(&r.ClientConfig.Key) - rulesCmd.Flag("backend", "Backend type to interact with: ").Default("cortex").EnumVar(&r.Backend, backends...) + rulesCmd := app.Command("rules", "View and edit rules stored in Grafan Mimir.").PreAction(r.setup) + rulesCmd.Flag("user", fmt.Sprintf("API user to use when contacting Grafana Mimir; alternatively, set %s. If empty, %s is used instead.", envVars.APIUser, envVars.TenantID)).Default("").Envar(envVars.APIUser).StringVar(&r.ClientConfig.User) + rulesCmd.Flag("key", "API key to use when contacting Grafana Mimir; alternatively, set "+envVars.APIKey+".").Default("").Envar(envVars.APIKey).StringVar(&r.ClientConfig.Key) + rulesCmd.Flag("backend", "Backend type to interact with (deprecated)").Default(rules.MimirBackend).EnumVar(&r.Backend, backends...) // Register rule commands listCmd := rulesCmd. - Command("list", "List the rules currently in the cortex ruler."). + Command("list", "List the rules currently in the Grafana Mimir ruler."). Action(r.listRules) printRulesCmd := rulesCmd. - Command("print", "Print the rules currently in the cortex ruler."). + Command("print", "Print the rules currently in the Grafana Mimir ruler."). Action(r.printRules) getRuleGroupCmd := rulesCmd. Command("get", "Retrieve a rulegroup from the ruler."). @@ -113,13 +113,13 @@ func (r *RuleCommand) Register(app *kingpin.Application, envVars EnvVarNames) { Command("delete", "Delete a rulegroup from the ruler."). Action(r.deleteRuleGroup) loadRulesCmd := rulesCmd. - Command("load", "load a set of rules to a designated cortex endpoint"). + Command("load", "Load a set of rules to a designated Grafana Mimir endpoint."). Action(r.loadRules) diffRulesCmd := rulesCmd. - Command("diff", "diff a set of rules to a designated cortex endpoint"). + Command("diff", "diff a set of rules to a designated Grafana Mimir endpoint."). Action(r.diffRules) syncRulesCmd := rulesCmd. - Command("sync", "sync a set of rules to a designated cortex endpoint"). + Command("sync", "sync a set of rules to a designated Grafana Mimir endpoint."). Action(r.syncRules) prepareCmd := rulesCmd. Command("prepare", "modifies a set of rules by including an specific label in aggregations."). @@ -133,32 +133,32 @@ func (r *RuleCommand) Register(app *kingpin.Application, envVars EnvVarNames) { // Require Mimir cluster address and tentant ID on all these commands for _, c := range []*kingpin.CmdClause{listCmd, printRulesCmd, getRuleGroupCmd, deleteRuleGroupCmd, loadRulesCmd, diffRulesCmd, syncRulesCmd} { - c.Flag("address", "Address of the cortex cluster, alternatively set "+envVars.Address+"."). + c.Flag("address", "Address of the Grafana Mimir cluster; alternatively, set "+envVars.Address+"."). Envar(envVars.Address). Required(). StringVar(&r.ClientConfig.Address) - c.Flag("id", "Cortex tenant id, alternatively set "+envVars.TenantID+"."). + c.Flag("id", "Grafana Mimir tenant ID; alternatively, set "+envVars.TenantID+"."). Envar(envVars.TenantID). Required(). StringVar(&r.ClientConfig.ID) - c.Flag("use-legacy-routes", "If set, API requests to cortex will use the legacy /api/prom/ routes, alternatively set "+envVars.UseLegacyRoutes+"."). + c.Flag("use-legacy-routes", "If set, the API requests to Grafana Mimir use the legacy /api/prom/ routes; alternatively, set "+envVars.UseLegacyRoutes+"."). Default("false"). Envar(envVars.UseLegacyRoutes). BoolVar(&r.ClientConfig.UseLegacyRoutes) - c.Flag("tls-ca-path", "TLS CA certificate to verify cortex API as part of mTLS, alternatively set "+envVars.TLSCAPath+"."). + c.Flag("tls-ca-path", "TLS CA certificate to verify Grafana Mimir API as part of mTLS; alternatively, set "+envVars.TLSCAPath+"."). Default(""). Envar(envVars.TLSCAPath). StringVar(&r.ClientConfig.TLS.CAPath) - c.Flag("tls-cert-path", "TLS client certificate to authenticate with cortex API as part of mTLS, alternatively set "+envVars.TLSCertPath+"."). + c.Flag("tls-cert-path", "TLS client certificate to authenticate with the Grafana Mimir API as part of mTLS; alternatively, set "+envVars.TLSCertPath+"."). Default(""). Envar(envVars.TLSCertPath). StringVar(&r.ClientConfig.TLS.CertPath) - c.Flag("tls-key-path", "TLS client certificate private key to authenticate with cortex API as part of mTLS, alternatively set "+envVars.TLSKeyPath+"."). + c.Flag("tls-key-path", "TLS client certificate private key to authenticate with the Grafana Mimir API as part of mTLS; alternatively, set "+envVars.TLSKeyPath+"."). Default(""). Envar(envVars.TLSKeyPath). StringVar(&r.ClientConfig.TLS.KeyPath) @@ -332,7 +332,7 @@ func (r *RuleCommand) setupFiles() error { func (r *RuleCommand) listRules(k *kingpin.ParseContext) error { rules, err := r.cli.ListRules(context.Background(), "") if err != nil { - log.Fatalf("unable to read rules from cortex, %v", err) + log.Fatalf("Unable to read rules from Grafana Mimir, %v", err) } @@ -347,7 +347,7 @@ func (r *RuleCommand) printRules(k *kingpin.ParseContext) error { log.Infof("no rule groups currently exist for this user") return nil } - log.Fatalf("unable to read rules from cortex, %v", err) + log.Fatalf("Unable to read rules from Grafana Mimir, %v", err) } p := printer.New(r.DisableColor) @@ -361,7 +361,7 @@ func (r *RuleCommand) getRuleGroup(k *kingpin.ParseContext) error { log.Infof("this rule group does not currently exist") return nil } - log.Fatalf("unable to read rules from cortex, %v", err) + log.Fatalf("Unable to read rules from Grafana Mimir, %v", err) } p := printer.New(r.DisableColor) @@ -371,7 +371,7 @@ func (r *RuleCommand) getRuleGroup(k *kingpin.ParseContext) error { func (r *RuleCommand) deleteRuleGroup(k *kingpin.ParseContext) error { err := r.cli.DeleteRuleGroup(context.Background(), r.Namespace, r.RuleGroup) if err != nil && err != client.ErrResourceNotFound { - log.Fatalf("unable to delete rule group from cortex, %v", err) + log.Fatalf("Unable to delete rule group from Grafana Mimir, %v", err) } return nil } @@ -388,7 +388,7 @@ func (r *RuleCommand) loadRules(k *kingpin.ParseContext) error { fmt.Printf("group: '%v', ns: '%v'\n", group.Name, ns.Namespace) curGroup, err := r.cli.GetRuleGroup(context.Background(), ns.Namespace, group.Name) if err != nil && err != client.ErrResourceNotFound { - return errors.Wrap(err, "load operation unsuccessful, unable to contact cortex api") + return errors.Wrap(err, "load operation unsuccessful, unable to contact Grafana Mimir API") } if curGroup != nil { err = rules.CompareGroups(*curGroup, group) @@ -449,7 +449,7 @@ func (r *RuleCommand) diffRules(k *kingpin.ParseContext) error { // If we're unable to reach the Mimir API due to a bad URL, we'll assume no rules are // part of the namespace and provide a diff of the whole ruleset. if err != nil && err != client.ErrResourceNotFound { - return errors.Wrap(err, "diff operation unsuccessful, unable to contact cortex api") + return errors.Wrap(err, "diff operation unsuccessful, unable to contact Grafana Mimir API") } changes := []rules.NamespaceChange{} @@ -512,7 +512,7 @@ func (r *RuleCommand) syncRules(k *kingpin.ParseContext) error { // If we're unable to reach the Mimir API due to a bad URL, we'll assume no rules are // part of the namespace and provide a diff of the whole ruleset. if err != nil && err != client.ErrResourceNotFound { - return errors.Wrap(err, "sync operation unsuccessful, unable to contact cortex api") + return errors.Wrap(err, "sync operation unsuccessful, unable to contact the Grafana Mimir API") } changes := []rules.NamespaceChange{} diff --git a/pkg/mimirtool/version/version.go b/pkg/mimirtool/version/version.go index 91642305c04..4eafd10e24a 100644 --- a/pkg/mimirtool/version/version.go +++ b/pkg/mimirtool/version/version.go @@ -46,7 +46,7 @@ func CheckLatest() { func getLatestFromGitHub() (string, error) { fmt.Print("checking latest version... ") c := github.NewClient(nil) - repoRelease, resp, err := c.Repositories.GetLatestRelease(context.Background(), "grafana", "cortex-tools") + repoRelease, resp, err := c.Repositories.GetLatestRelease(context.Background(), "grafana", "mimir") if err != nil { log.WithFields(log.Fields{"err": err}).Debugln("error while retrieving the latest version") return "", errUnableToRetrieveLatestVersion From 5bcdd601b23f5b107e83b507a52330d5f284102a Mon Sep 17 00:00:00 2001 From: Andy Asp <90626759+andyasp@users.noreply.github.com> Date: Fri, 4 Feb 2022 12:30:27 -0500 Subject: [PATCH 104/168] Categorize advanced ruler configuration parameters (#1026) * Categorize advanced ruler configuration parameters * Address review --- cmd/mimir/help.txt.tmpl | 26 ----------- .../configuration/config-file-reference.md | 43 +++++++++++-------- pkg/ruler/ruler.go | 26 +++++------ 3 files changed, 37 insertions(+), 58 deletions(-) diff --git a/cmd/mimir/help.txt.tmpl b/cmd/mimir/help.txt.tmpl index 363a1008a8f..c9c2e2969e3 100644 --- a/cmd/mimir/help.txt.tmpl +++ b/cmd/mimir/help.txt.tmpl @@ -655,8 +655,6 @@ Usage of ./cmd/mimir/mimir: HTTP Basic authentication password. It overrides the password set in the URL (if any). -ruler.alertmanager-client.basic-auth-username string HTTP Basic authentication username. It overrides the username set in the URL (if any). - -ruler.alertmanager-refresh-interval duration - How long to wait between refreshing DNS resolutions of Alertmanager hosts. (default 1m0s) -ruler.alertmanager-url string Comma-separated list of URL(s) of the Alertmanager(s) to send notifications to. Each URL is treated as a separate group. Multiple Alertmanagers in HA per group can be supported by using DNS service discovery format. Basic auth is supported as part of the URL. -ruler.alertmanager-use-v2 @@ -679,38 +677,16 @@ Usage of ./cmd/mimir/mimir: gRPC client max receive message size (bytes). (default 104857600) -ruler.client.grpc-max-send-msg-size int gRPC client max send message size (bytes). (default 16777216) - -ruler.disabled-tenants value - Comma separated list of tenants whose rules this ruler cannot evaluate. If specified, a ruler that would normally pick the specified tenant(s) for processing will ignore them instead. Subject to sharding. -ruler.enable-api Enable the ruler api - -ruler.enabled-tenants value - Comma separated list of tenants whose rules this ruler can evaluate. If specified, only these tenants will be handled by ruler, otherwise this ruler can process rules from all tenants. Subject to sharding. -ruler.evaluation-delay-duration value Duration to delay the evaluation of rules to ensure the underlying metrics have been pushed. - -ruler.evaluation-interval duration - How frequently to evaluate rules (default 1m0s) -ruler.external.url value URL of alerts return path. - -ruler.flush-period duration - Period with which to attempt to flush rule groups. (default 1m0s) - -ruler.for-grace-period duration - Minimum duration between alert and restored "for" state. This is maintained only for alerts with configured "for" time greater than grace period. (default 10m0s) - -ruler.for-outage-tolerance duration - Max time to tolerate outage for restoring "for" state of alert. (default 1h0m0s) -ruler.max-rule-groups-per-tenant int Maximum number of rule groups per-tenant. 0 to disable. (default 70) -ruler.max-rules-per-rule-group int Maximum number of rules per rule group per-tenant. 0 to disable. (default 20) - -ruler.notification-queue-capacity int - Capacity of the queue for notifications to be sent to the Alertmanager. (default 10000) - -ruler.notification-timeout duration - HTTP timeout duration when sending notifications to the Alertmanager. (default 10s) - -ruler.poll-interval duration - How frequently to poll for rule changes (default 1m0s) - -ruler.query-stats-enabled - Report the wall time for ruler queries to complete as a per user metric and as an info level log message. - -ruler.resend-delay duration - Minimum amount of time to wait before resending an alert to Alertmanager. (default 1m0s) -ruler.ring.consul.hostname string Hostname and port of Consul. (default "localhost:8500") -ruler.ring.etcd.endpoints value @@ -737,8 +713,6 @@ Usage of ./cmd/mimir/mimir: Backend storage to use for the ring. Supported values are: consul, etcd, inmemory, memberlist, multi. (default "memberlist") -ruler.rule-path string file path to store temporary rule files for the prometheus rule managers (default "/rules") - -ruler.search-pending-for duration - Time to spend searching for a pending ruler when shutting down. (default 5m0s) -ruler.tenant-federation.enabled Enable running rule groups against multiple tenants. The tenant IDs involved need to be in the rule group's 'source_tenants' field. If this flag is set to 'false' when there are already created federated rule groups, then these rules groups will be skipped during evaluations. -ruler.tenant-shard-size int diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 14aaae4fd60..16adf651641 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -1128,11 +1128,11 @@ ruler_client: # CLI flag: -ruler.client.tls-insecure-skip-verify [tls_insecure_skip_verify: | default = false] -# How frequently to evaluate rules +# [advanced] How frequently to evaluate rules # CLI flag: -ruler.evaluation-interval [evaluation_interval: | default = 1m] -# How frequently to poll for rule changes +# [advanced] How frequently to poll for rule changes # CLI flag: -ruler.poll-interval [poll_interval: | default = 1m] @@ -1147,7 +1147,8 @@ ruler_client: # CLI flag: -ruler.alertmanager-url [alertmanager_url: | default = ""] -# How long to wait between refreshing DNS resolutions of Alertmanager hosts. +# [advanced] How long to wait between refreshing DNS resolutions of Alertmanager +# hosts. # CLI flag: -ruler.alertmanager-refresh-interval [alertmanager_refresh_interval: | default = 1m] @@ -1155,11 +1156,13 @@ ruler_client: # CLI flag: -ruler.alertmanager-use-v2 [enable_alertmanager_v2: | default = true] -# Capacity of the queue for notifications to be sent to the Alertmanager. +# [advanced] Capacity of the queue for notifications to be sent to the +# Alertmanager. # CLI flag: -ruler.notification-queue-capacity [notification_queue_capacity: | default = 10000] -# HTTP timeout duration when sending notifications to the Alertmanager. +# [advanced] HTTP timeout duration when sending notifications to the +# Alertmanager. # CLI flag: -ruler.notification-timeout [notification_timeout: | default = 10s] @@ -1197,20 +1200,22 @@ alertmanager_client: # CLI flag: -ruler.alertmanager-client.basic-auth-password [basic_auth_password: | default = ""] -# Max time to tolerate outage for restoring "for" state of alert. +# [advanced] Max time to tolerate outage for restoring "for" state of alert. # CLI flag: -ruler.for-outage-tolerance [for_outage_tolerance: | default = 1h] -# Minimum duration between alert and restored "for" state. This is maintained -# only for alerts with configured "for" time greater than grace period. +# [advanced] Minimum duration between alert and restored "for" state. This is +# maintained only for alerts with configured "for" time greater than grace +# period. # CLI flag: -ruler.for-grace-period [for_grace_period: | default = 10m] -# Minimum amount of time to wait before resending an alert to Alertmanager. +# [advanced] Minimum amount of time to wait before resending an alert to +# Alertmanager. # CLI flag: -ruler.resend-delay [resend_delay: | default = 1m] -# Time to spend searching for a pending ruler when shutting down. +# [advanced] Time to spend searching for a pending ruler when shutting down. # CLI flag: -ruler.search-pending-for [search_pending_for: | default = 5m] @@ -1267,7 +1272,7 @@ ring: # CLI flag: -ruler.ring.num-tokens [num_tokens: | default = 128] -# Period with which to attempt to flush rule groups. +# [advanced] Period with which to attempt to flush rule groups. # CLI flag: -ruler.flush-period [flush_period: | default = 1m] @@ -1275,20 +1280,20 @@ ring: # CLI flag: -ruler.enable-api [enable_api: | default = false] -# Comma separated list of tenants whose rules this ruler can evaluate. If -# specified, only these tenants will be handled by ruler, otherwise this ruler -# can process rules from all tenants. Subject to sharding. +# [advanced] Comma separated list of tenants whose rules this ruler can +# evaluate. If specified, only these tenants will be handled by ruler, otherwise +# this ruler can process rules from all tenants. Subject to sharding. # CLI flag: -ruler.enabled-tenants [enabled_tenants: | default = ""] -# Comma separated list of tenants whose rules this ruler cannot evaluate. If -# specified, a ruler that would normally pick the specified tenant(s) for -# processing will ignore them instead. Subject to sharding. +# [advanced] Comma separated list of tenants whose rules this ruler cannot +# evaluate. If specified, a ruler that would normally pick the specified +# tenant(s) for processing will ignore them instead. Subject to sharding. # CLI flag: -ruler.disabled-tenants [disabled_tenants: | default = ""] -# Report the wall time for ruler queries to complete as a per user metric and as -# an info level log message. +# [advanced] Report the wall time for ruler queries to complete as a per user +# metric and as an info level log message. # CLI flag: -ruler.query-stats-enabled [query_stats_enabled: | default = false] diff --git a/pkg/ruler/ruler.go b/pkg/ruler/ruler.go index f6b99e38917..d27b0e9a005 100644 --- a/pkg/ruler/ruler.go +++ b/pkg/ruler/ruler.go @@ -77,45 +77,45 @@ type Config struct { // GRPC Client configuration. ClientTLSConfig grpcclient.Config `yaml:"ruler_client"` // How frequently to evaluate rules by default. - EvaluationInterval time.Duration `yaml:"evaluation_interval"` + EvaluationInterval time.Duration `yaml:"evaluation_interval" category:"advanced"` // How frequently to poll for updated rules. - PollInterval time.Duration `yaml:"poll_interval"` + PollInterval time.Duration `yaml:"poll_interval" category:"advanced"` // Path to store rule files for prom manager. RulePath string `yaml:"rule_path"` // URL of the Alertmanager to send notifications to. AlertmanagerURL string `yaml:"alertmanager_url"` // How long to wait between refreshing the list of Alertmanager based on DNS service discovery. - AlertmanagerRefreshInterval time.Duration `yaml:"alertmanager_refresh_interval"` + AlertmanagerRefreshInterval time.Duration `yaml:"alertmanager_refresh_interval" category:"advanced"` // Enables the ruler notifier to use the Alertmananger V2 API. AlertmanagerEnableV2API bool `yaml:"enable_alertmanager_v2"` // Capacity of the queue for notifications to be sent to the Alertmanager. - NotificationQueueCapacity int `yaml:"notification_queue_capacity"` + NotificationQueueCapacity int `yaml:"notification_queue_capacity" category:"advanced"` // HTTP timeout duration when sending notifications to the Alertmanager. - NotificationTimeout time.Duration `yaml:"notification_timeout"` + NotificationTimeout time.Duration `yaml:"notification_timeout" category:"advanced"` // Client configs for interacting with the Alertmanager Notifier NotifierConfig `yaml:"alertmanager_client"` // Max time to tolerate outage for restoring "for" state of alert. - OutageTolerance time.Duration `yaml:"for_outage_tolerance"` + OutageTolerance time.Duration `yaml:"for_outage_tolerance" category:"advanced"` // Minimum duration between alert and restored "for" state. This is maintained only for alerts with configured "for" time greater than grace period. - ForGracePeriod time.Duration `yaml:"for_grace_period"` + ForGracePeriod time.Duration `yaml:"for_grace_period" category:"advanced"` // Minimum amount of time to wait before resending an alert to Alertmanager. - ResendDelay time.Duration `yaml:"resend_delay"` + ResendDelay time.Duration `yaml:"resend_delay" category:"advanced"` // Enable sharding rule groups. - SearchPendingFor time.Duration `yaml:"search_pending_for"` + SearchPendingFor time.Duration `yaml:"search_pending_for" category:"advanced"` Ring RingConfig `yaml:"ring"` - FlushCheckPeriod time.Duration `yaml:"flush_period"` + FlushCheckPeriod time.Duration `yaml:"flush_period" category:"advanced"` EnableAPI bool `yaml:"enable_api"` - EnabledTenants flagext.StringSliceCSV `yaml:"enabled_tenants"` - DisabledTenants flagext.StringSliceCSV `yaml:"disabled_tenants"` + EnabledTenants flagext.StringSliceCSV `yaml:"enabled_tenants" category:"advanced"` + DisabledTenants flagext.StringSliceCSV `yaml:"disabled_tenants" category:"advanced"` RingCheckPeriod time.Duration `yaml:"-"` - EnableQueryStats bool `yaml:"query_stats_enabled"` + EnableQueryStats bool `yaml:"query_stats_enabled" category:"advanced"` TenantFederation TenantFederationConfig `yaml:"tenant_federation"` } From 3302af4fbee30df4266a2f240cec67c3458f5164 Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Mon, 7 Feb 2022 09:21:53 +0100 Subject: [PATCH 105/168] Docs: add Mimir dashboards example screenshots to doc (#992) * Add Mimir dashboards screenshots to docs Signed-off-by: Marco Pracucci * Added instructions to RELEASE doc Signed-off-by: Marco Pracucci * Fixed CI Signed-off-by: Marco Pracucci * Make linter happy Signed-off-by: Marco Pracucci * Added GRAFANA_PUBLISHED_PORT to config Signed-off-by: Marco Pracucci * Added png optimization Signed-off-by: Marco Pracucci --- .github/workflows/test-build-deploy.yml | 2 +- Makefile | 9 +- RELEASE.md | 4 + .../mimir-alertmanager-resources.png | Bin 0 -> 132596 bytes .../images/dashboards/mimir-alertmanager.png | Bin 0 -> 81104 bytes .../dashboards/mimir-compactor-resources.png | Bin 0 -> 49463 bytes .../images/dashboards/mimir-compactor.png | Bin 0 -> 84237 bytes .../images/dashboards/mimir-config.png | Bin 0 -> 23524 bytes .../images/dashboards/mimir-object-store.png | Bin 0 -> 72850 bytes .../images/dashboards/mimir-overrides.png | Bin 0 -> 23824 bytes .../images/dashboards/mimir-queries.png | Bin 0 -> 107415 bytes .../dashboards/mimir-reads-networking.png | Bin 0 -> 119301 bytes .../dashboards/mimir-reads-resources.png | Bin 0 -> 190005 bytes .../sources/images/dashboards/mimir-reads.png | Bin 0 -> 130763 bytes .../dashboards/mimir-rollout-progress.png | Bin 0 -> 37548 bytes .../sources/images/dashboards/mimir-ruler.png | Bin 0 -> 128696 bytes .../images/dashboards/mimir-scaling.png | Bin 0 -> 39373 bytes .../images/dashboards/mimir-tenants.png | Bin 0 -> 48095 bytes .../dashboards/mimir-writes-networking.png | Bin 0 -> 83185 bytes .../dashboards/mimir-writes-resources.png | Bin 0 -> 131831 bytes .../images/dashboards/mimir-writes.png | Bin 0 -> 133337 bytes .../deploy-monitoring-mixin/_index.md | 2 +- .../dashboards-overview.md | 123 -- .../dashboards/_index.md | 11 + .../dashboards/alertmanager-resources.md | 16 + .../dashboards/alertmanager.md | 15 + .../dashboards/compactor-resources.md | 16 + .../dashboards/compactor.md | 15 + .../dashboards/config.md | 14 + .../dashboards/object-store.md | 15 + .../dashboards/overrides.md | 14 + .../dashboards/queries.md | 14 + .../dashboards/reads-networking.md | 18 + .../dashboards/reads-resources.md | 18 + .../dashboards/reads.md | 17 + .../dashboards/rollout-progress.md | 15 + .../dashboards/ruler.md | 15 + .../dashboards/scaling.md | 14 + .../dashboards/slow-queries.md | 12 + .../dashboards/tenants.md | 14 + .../dashboards/top-tenants.md | 8 + .../dashboards/writes-networking.md | 18 + .../dashboards/writes-resources.md | 18 + .../dashboards/writes.md | 17 + .../install-dashboards-and-alerts.md | 2 +- .../mimir-mixin-tools/screenshots/.gitignore | 1 + .../mimir-mixin-tools/screenshots/Dockerfile | 23 + .../mimir-mixin-tools/screenshots/app.js | 130 +++ .../screenshots/package-lock.json | 1021 +++++++++++++++++ .../screenshots/package.json | 5 + .../mimir-mixin-tools/screenshots/run.sh | 72 ++ operations/mimir-mixin-tools/serve/.gitignore | 1 + .../serve/provisioning-dashboards.yaml | 12 + .../serve/provisioning-datasources.yaml | 15 + operations/mimir-mixin-tools/serve/run.sh | 75 ++ operations/mimir-tests/test-gossip.jsonnet | 2 +- 56 files changed, 1685 insertions(+), 128 deletions(-) create mode 100644 docs/sources/images/dashboards/mimir-alertmanager-resources.png create mode 100644 docs/sources/images/dashboards/mimir-alertmanager.png create mode 100644 docs/sources/images/dashboards/mimir-compactor-resources.png create mode 100644 docs/sources/images/dashboards/mimir-compactor.png create mode 100644 docs/sources/images/dashboards/mimir-config.png create mode 100644 docs/sources/images/dashboards/mimir-object-store.png create mode 100644 docs/sources/images/dashboards/mimir-overrides.png create mode 100644 docs/sources/images/dashboards/mimir-queries.png create mode 100644 docs/sources/images/dashboards/mimir-reads-networking.png create mode 100644 docs/sources/images/dashboards/mimir-reads-resources.png create mode 100644 docs/sources/images/dashboards/mimir-reads.png create mode 100644 docs/sources/images/dashboards/mimir-rollout-progress.png create mode 100644 docs/sources/images/dashboards/mimir-ruler.png create mode 100644 docs/sources/images/dashboards/mimir-scaling.png create mode 100644 docs/sources/images/dashboards/mimir-tenants.png create mode 100644 docs/sources/images/dashboards/mimir-writes-networking.png create mode 100644 docs/sources/images/dashboards/mimir-writes-resources.png create mode 100644 docs/sources/images/dashboards/mimir-writes.png delete mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards-overview.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/_index.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/alertmanager-resources.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/alertmanager.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/compactor-resources.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/compactor.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/config.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/object-store.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/overrides.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/queries.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/reads-networking.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/reads-resources.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/reads.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/rollout-progress.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/ruler.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/scaling.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/slow-queries.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/tenants.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/top-tenants.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/writes-networking.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/writes-resources.md create mode 100644 docs/sources/operations/deploy-monitoring-mixin/dashboards/writes.md create mode 100644 operations/mimir-mixin-tools/screenshots/.gitignore create mode 100644 operations/mimir-mixin-tools/screenshots/Dockerfile create mode 100644 operations/mimir-mixin-tools/screenshots/app.js create mode 100644 operations/mimir-mixin-tools/screenshots/package-lock.json create mode 100644 operations/mimir-mixin-tools/screenshots/package.json create mode 100755 operations/mimir-mixin-tools/screenshots/run.sh create mode 100644 operations/mimir-mixin-tools/serve/.gitignore create mode 100644 operations/mimir-mixin-tools/serve/provisioning-dashboards.yaml create mode 100644 operations/mimir-mixin-tools/serve/provisioning-datasources.yaml create mode 100755 operations/mimir-mixin-tools/serve/run.sh diff --git a/.github/workflows/test-build-deploy.yml b/.github/workflows/test-build-deploy.yml index d73c62708c5..43bed678a1b 100644 --- a/.github/workflows/test-build-deploy.yml +++ b/.github/workflows/test-build-deploy.yml @@ -160,7 +160,7 @@ jobs: - name: Build Images # Build everything except mimir (run by build-mimir job) and build image (not managed by CI). run: | - make list-image-targets | grep -v -E '/mimir-build-image/|/cmd/mimir/' | xargs -I {} make BUILD_IN_CONTAINER=false {} + make list-image-targets | grep -v -E '/mimir-build-image/|/cmd/mimir/|/mimir-mixin-tools/' | xargs -I {} make BUILD_IN_CONTAINER=false {} - name: Save Images run: | mkdir /tmp/images diff --git a/Makefile b/Makefile index c9b82f51b9c..9bcfacf98b8 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ help: # WARNING: do not commit to a repository! -include Makefile.local -.PHONY: all test test-with-race integration-tests cover clean images protos exes dist doc clean-doc check-doc push-multiarch-build-image license check-license format check-mixin check-mixin-jb check-mixin-mixtool checkin-mixin-playbook build-mixin format-mixin check-jsonnet-manifests format-jsonnet-manifests push-multiarch-mimir list-image-targets check-jsonnet-getting-started +.PHONY: all test test-with-race integration-tests cover clean images protos exes dist doc clean-doc check-doc push-multiarch-build-image license check-license format check-mixin check-mixin-jb check-mixin-mixtool checkin-mixin-playbook build-mixin format-mixin check-jsonnet-manifests format-jsonnet-manifests push-multiarch-mimir list-image-targets check-jsonnet-getting-started mixin-screenshots .DEFAULT_GOAL := all # Version number @@ -446,6 +446,13 @@ build-mixin: check-mixin-jb format-mixin: @find $(MIXIN_PATH) -type f -name '*.libsonnet' -print -o -name '*.jsonnet' -print | xargs jsonnetfmt -i +mixin-serve: ## Runs Grafana (listening on port 3000) loading the mixin dashboards compiled at operations/mimir-mixin-compiled. + @./operations/mimir-mixin-tools/serve/run.sh + +mixin-screenshots: ## Generates mixin dashboards screenshots. + @rm -f docs/sources/images/dashboards/*.png + @./operations/mimir-mixin-tools/screenshots/run.sh + check-jsonnet-manifests: format-jsonnet-manifests @echo "Checking diff:" @git diff --exit-code -- $(JSONNET_MANIFESTS_PATH) || (echo "Please format jsonnet manifests by running 'make format-jsonnet-manifests'" && false) diff --git a/RELEASE.md b/RELEASE.md index 7823faf40b8..b67c6b4efc0 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -105,6 +105,10 @@ To publish a stable release: 1. Update the Cortex version in the following locations: - Kubernetes manifests located at `k8s/` - Documentation located at `docs/` +1. Update dashboard screenshots + 1. Run `make mixin-screenshots` + 1. Review all updated screenshots and ensure no sensitive data is disclosed + 1. Open a PR 1. After merging your PR to release branch, `git tag` the new release (see [How to tag a release](#how-to-tag-a-release)) from release branch. 1. Wait until CI pipeline succeeded (once a tag is created, the release process through GitHub actions will be triggered for this tag) 1. Create a release in GitHub diff --git a/docs/sources/images/dashboards/mimir-alertmanager-resources.png b/docs/sources/images/dashboards/mimir-alertmanager-resources.png new file mode 100644 index 0000000000000000000000000000000000000000..605d12b8d5938ae63dfb29f50cf96706d917eeca GIT binary patch literal 132596 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 literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-alertmanager.png b/docs/sources/images/dashboards/mimir-alertmanager.png new file mode 100644 index 0000000000000000000000000000000000000000..ffab48689974f84613788b8965acda390b751666 GIT binary patch literal 81104 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 YUWpe!b+Xrx4*KZn7-<(>yz%IN0K~pl^Z)<= literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-compactor-resources.png b/docs/sources/images/dashboards/mimir-compactor-resources.png new file mode 100644 index 0000000000000000000000000000000000000000..8c129245053276e5e2b971e35ae2f4d6c5b913bb GIT binary patch literal 49463 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

74q{gz=~M6Zj(R9QW~GNL`qzB-zGx7g>$69qwL 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 literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-config.png b/docs/sources/images/dashboards/mimir-config.png new file mode 100644 index 0000000000000000000000000000000000000000..9c524a2ca1195cd74a907521d670e0faf27cfd98 GIT binary patch literal 23524 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 literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-object-store.png b/docs/sources/images/dashboards/mimir-object-store.png new file mode 100644 index 0000000000000000000000000000000000000000..033c8e074bca6711e86f3c2a9ab253f51712b23f GIT binary patch literal 72850 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 literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-overrides.png b/docs/sources/images/dashboards/mimir-overrides.png new file mode 100644 index 0000000000000000000000000000000000000000..9f00f51da338b8ee05cdffddc6126c9a8cdf19b3 GIT binary patch literal 23824 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 IsrO<353Qu(fB*mh literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-reads-networking.png b/docs/sources/images/dashboards/mimir-reads-networking.png new file mode 100644 index 0000000000000000000000000000000000000000..9f90ca99f4ed1c2d2535710c2910396febab3bd4 GIT binary patch literal 119301 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 literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-reads.png b/docs/sources/images/dashboards/mimir-reads.png new file mode 100644 index 0000000000000000000000000000000000000000..41898ef711d5bc869597e1ce24c3fc22b0895ed5 GIT binary patch literal 130763 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�D82(;j6+hXGD$&S|n{GIY|G+12UA9khN` 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

T!1Y5t3o3fN|MV?#EMPDMRTJ%7R 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

21)`-rJBa) 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 literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-tenants.png b/docs/sources/images/dashboards/mimir-tenants.png new file mode 100644 index 0000000000000000000000000000000000000000..580d8e5eb32ecc42e6ab7fb8140eb037fab05b0b GIT binary patch literal 48095 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
H8z;bd&r9UOg0)$c&Oj(HUj~g;C`C->m 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
SU^umr574VRy7FGGGTmV^o3Ii13Y*{lY@U9)z&y zluo);!Vq44atlF63DwmSrK!)r5ro7KwnqClm&=! zhZ20Im}Y&xxij~r3+Lxjj$w4j)0|-HunmqGw0!p%!SwjQ67uf_pAU5{H{8a36aoN)+ywY-NepOnC&>+JJt}voB>RlPlwm z*>unHQ7DQ@{Ix#R<)I{ErMosBB!nrbv$09!h!HAxypdn%nKz)Y6Fv=*UZ=hL=PuIf z0&+RxmiFT5UaxJ|r?kaZFUM%b_Pbw8UWfXIS~0MDGzB9X&c>|@D&60ii9~%1o+@z6 zcQC+BujU(UQwVdso=Z$4KfHR!5ON}v6qqWwGzif_EUk+U}SNX96)U!ol=Iwm_nk|)Dix9AJ%5W zcbuR03eh+aL4U_~H4R1A$%gE^Gm$J;1irPXh+2HE1q$Q04Fu!dE=#Fze-!jpTc?;U z9E3%ZF5M36{& zlqmQ@s@azLxzJAArR%)l8w>na|MzOGm!%6nr_Q%n?%;d-izZ6FhNXkB+)e+B*sG%S z6Ffl6R!h{X8~6BVZ>r7gVWT?+R$QrB!cxnsr zIH`nY3za;=B8muI-H`8fA);in1FOf>MizVgBtM&sBMf{dKPQh{lB?tb3=A^x=_~-S z&<0HHCc`d+-3_5$EdxN?YIdx(I%vDu$m$LP&x;9`=f05Y9&M`HmKA_2E_UL|h78hju8PV*E^(iI#~e;8@A^AGNBv79H5fS6g<1r}bungHajs@BM-<&il-Mw_ngXXjoFo=DH~z46nY}AgvS_<; z!uUZnJ+V{5gM|rW3RAA2CX{JuTrR|fvOph;E77sF{;GxYU7JDAypA@1T81mI(^ z7ZVX93NT0Oe(9wRMa_sAK0&JOUP#|(9f$ai_5YduW%As z-qagAfdsah%5+H72oBMvOr3Co-QT|TIl~xDIqXv9YSQdzpLovJqw3D1;S5h7XYlk< z1(a(5dNyR9v5l3Ol;Fx&FJPiIIPP){KWjW7+#PypvHtEXwSt|1L2<5&DMgJTJpnLr zS2P}upb#LYQF`4Dtg&trH!-K|-$s$ZYiU${-S}oDsH`3ie%KA$xY%#2AbfEshN%0M zc{?n^JXV#e>r?dr%iYjssxE#e5w+t8aI!{p=kTe}>y@tMvAW8B@5J$NnF9HV^xA`a z=4~Mmv~unh8-#FMZ*P9mazJ(nj@+?Is$-qcv$OUIbuJ-ggeWSILk1D_w`osw;-snf z2DUNhBPA%gta}{{0ex6FQlFL*+j5@&{1J4>Wzxvoww*r8UvmuSP$R`Gs%Q5K6*^6| z;vb6>=B?U`g^73cWfX*S;*ngOvK^sD>M*Lb!jD5q88P*aBW5N7p44zmv?!sZ%a?W{ zpppjfddEKNT|OeW{U-bH2G`y4UT0-{mnPkkeS{tztqz~1pr_1zrRjws$iR_hO7TLQ zqHtb6i;YKkU_Bi5&!-WdFmRAjlQE+W6(oz(mMQci&_YM&Vs9c3gRIW?(mt2i_GT4) zCx2h94H|j0TK0M+o16h_>>UpSDf5bP2Re|d-c(}Q=`m@vswV4p84=vD487IrtF3h> zCQJ~{a!O^PePs%M~gLh!?tOvZz6JnTNAE3oB znc*-X6j;c@QIh|f@rNXAle_y$fhwb=dCW6N0kboa3u-tm97_zNWrm~mtiII`FeK-B z(d3+mNd2#YHYcq?&Whco-4Ho6Sp^vC<-ynJtG%7l6H4^1rw-=j_?Lx#yiE8E|4l-; zoz+a6E+yy|rVOUyj!!#HmTT)4{zY+02ef}~WYVrzx$*=C`GLz^iZyg6NvCK(o@?Dc zwOWT3PWuj%sj79W+@(YWJb&l(d&}Y)+vb}SFaFHfV|QiJ`(Lv^>fKs8?i3<^qd=<% z8MEdp?e|G8lMR;Qr0Vx|&m#4dZlZrpj)rN_Q=5gkA)bp0CS=PX8&KN zt!iP6JS-)`gd7ki+Pjk#gda$u|INWZVGZ8d>*KERR$7eQaOe{g46dsc(O{dsUhNu> z^2_P}>Fm41nrfQ9Q3O;(kuE4GQlyL01O#a+T{@uz=~aS&5I{ghx`^}+(mR1r0|BJ> z-b5fk=tv9F>vsa^ec#V}Ki_*@Z~n-2%I?n2>~CiGoS8j?3j_oLSkVrGwo%G(>M}>Y z<2oq^a4n2z>{CBQ%pdmthX77M`?rYN^QZ0oB_gb40z`DGH`qw*Kj;L6_;0fNQv!>a zQ*>fA2^+_ag~`B6Cxg23V!FjjQRKdAU8%C$;)BwfUedEZ!2Q?>Mo`tIGmORC8)-x8 zs{*%Y?B*!`plrZsx7C2>I55yhG3Axzgu|t=`U3 zMRwu$XJE)~u>Iw)TvCB5y1GZxCF8U=Q2_bzqfPM-x=W!Wn@5RlqU@o3TM=k>b zB}nM{G*jh1-B#ynx^GTk9cbD}p@=1)YPYAB^|nEx+5L-m81WI4ywUw1pVS7>WPwOS zUp~2xz_F&-K>ot1|Gi z5}RfdJ7SMbKq|^qn&Gm2ZFN7!SN$FgYYYWz82-6mO^zLz-)cbgnf>KI><2ao?_V!q zOP&ns|GDZYB;im^bvK6ORKU~;fU zMB$Q15i&^45~8?~URoI2P%rSn1-sV3W+`(Sw~eQe85>=THM|GIz;~hnK$4tc9Y8Yh zRcLf-4fZq8f3qj2;pmP-2&eV*W9j`{d+}Rd*K+elLekbOQr7n1G2$%y$^17j^J^$v z@bZP7b3;>b}xt#y*ZQVg~T1awf8iOm2*s~+UxE~6OqR{ zt&>`mp30wj-;CO@k81A1pN+?uJf9Nd;2|vG;BgeFbY#MY<8IsqvKOdes2%6o1YoO= zK$S=Ft_znV@D&|s7#dHAwar*!Ip`NJd^sWxyb^RVmBG#-4xlt4z4uU8 zE-=8qk-Lpi9qnB0yLnw(70ttn{*%fx-KlJBYD5cOa*reNMku1YVo^dWSdH-dcQZne%d2#Fgg$_9XqbZFSNmMSi2j8usrcHizv=cl--^ zG;1HoviHTqo*=6zVar!tEg2O<`uzJJ@82YZfP>+0JEbN=9i%m5->{Cpc(itJc*6X@ z(f;Xj!nj$;Sd-|2%dM5+(yBEr%klAQ9ebq=sTh#J7@m!UvB8o|;2xW9^qr19zHBV} z&wdCI&jNFWORVvaU*tYR+i2dE?g&vwW6cDD&_`p15Z6QM2?fVo)c=P`R)$Va!1O3B%`1!dLOZ4hT6;@|=!#%m@g zGgvzxaO1y*h)eu?i1@(^EYNH#pw*$zmd!)Y7R;uicO` z+vy}|JeVUK#WfS;TP!@vHCr$>AbcA84Sbzn_fOfT-(}@7&J};!{j71;?*2nCEPTDW zUW;~x^4E8a1??~;q|)X)2(`xxK`E8IR$PP|DDVofZ{xO|OB{nc9z|^(tQ;Is!b)YG zj0`xgZTmYdL3smR=~4a0Qby<69yj(fp$--hD*(tK5r1!Z{3(*xY4V-(w_ne9oKr*V zf(BnF*R;{Axo7H;&Ha*zIpPdFppn^#qN&LvFmct~e=2)5aTT=|7Gem0m%0jK;&PPz z^(49eyB0GlWNO=ctMWg%d`pVq^t8^6n-_rJta6xqQHXr8_u5uuctX|_#xy4ZH&_|a z+V{78J=c2hwV1oasQ>3fLc@!%9Ib%|gCkROoofE8MKT+?n`n7qy&I!L=#EVzDWoW{ z;_52FKQ2&ME*Y93f}|W&N>}9;x~1-GW*_Dj38$@O?n(=#s|@N}XW%`pL`^gjXX@c? zBiLUewn5Yc(Tpt|x=3eLjL6DOpC(RV@~U9NxK(qO;OoWq3a)$Ue3EPkjir*~gT@gb z7yTrv%GlJ;E?IpV|Eexyh-Q?kRv^!99O$1*LaNitEXgtD?5DXmR=w$2ESmru*YOD& zc$n$d;l0ac~G4zRzO0BV7E#$dc6qcdAr9y;j z7u~)JSk9Oz6(VvwMK*|@$hy#t z-$su;Fm59!lz()L)e^vjcf>;pkNn6=xcbgQ(1&9%>;GR30(K)|ZRNl0&G=`v-Y)dA z*WyZV9PlV#`+#55nF-aicdl%O33oFYsLgKYk!p(0z1hKB(P{=nq+edcs^8@`y`$u-5W|8X_(7P-3`(hhbpaad16-)prBR#)uZ`i>VT5|=;RSE=aW8r}> zHY^@}i}ak-4KmXKQ(w(hIzMGDL9lAW`PHLn&R1PSd_Pg%wJLX|JLHc@K820;Zq0Ih zYzp<3%1w0?O=pK{#){CeBX<-yZmzO(l;2a&)$jPBd`A+N*d8WnwdIhye2-V<$E7c; zX!=Bvz_2uMA!U>VJy^Uso(v+D3#2z;a8sdZuzFJf%@$OX^rKJW-2rl|TKJJS=w9az z>(>dnctAsvP+Uphn;c6qr6_3liVySDl!i1(NojU7Srrpq7hO#1Ejcuh@*rj)f&^V% zlH4Eq##h3h;1!w|Tu2VW67v~vaB-N;NV>@(V(FtH>zkxQ;!aB<(K;>H_BfSG3&=FU zl(*q)7PGD($%E+>Rz<^-w|P1^6eCnw*$l+ST%O)y)9YuIQ5@rlfl9od2@p)~2n?%I zdHTU%fO;@%K#|w1A-SOQ?aZ20(Wsz|VxU7!7ZZ4@ST%^30T{#`FcK3SmHf<92JHo{ zn4OzbWc|UeuA>^t^@D|gu_sBeSksjxPW||jH@RV0CyuPDlt!j5nh{E4wCc2q!=WzqF2%DUW+k6x zxWFSJ{mfFp28m;T4PMxSZVVJxJa%w4q1dq~)|LzsvZK&9YG%2Be%}xZC7+p)gi(#K zqvrOk)X8DIIck=^+qv_-rbx$|^+Iq@sLF}xj~gug8BwL^ov(rk0Zm#19#;>_cU2|k z^k>#|?A7{4DSPq`D24VCeRZt_!V;~i*q~gW|)pWY^VM?Xon+e9RjquVd+bj!fUWYWZ`%HN> zQpq*n#qD4_a1gTfgO4h6QMJW=?_vw)dXH<;#v<1%ry`_^*WI@|)0nf2u1z7Xkjvb; zUw=VsLI3FuFts_?dmNMAkMC$=UnX68|A{8x2~Q6n^{Xek_t@$^sdyauLO%I^)~6b# z!i}OKl{cAW=%nl(?V2zxn@e3pJ_)o-$;K2N#LKI=E*@krYA8OoFO_enMBYs*TzJ<^ zg9J-|puD4MQS)>Dg^c|$H^R(4yJX*{57SYjT?vkhjZr$jtv;wB%JgIN84>e7gqa{g zefkngo8P)iG?sV<41%rJ1XWRxM;+6wI#f4RJc2s%Ghf?Kox28xG1T}Ivt~{Nu&(xv z2CD2<`T4oDc)`94ek87`kgsv!?%AAwKd(PWEPi3t0S{8*AOdm-2#~mV9eMH2$BW>P z#PmRxw39Q*HF}_q?8(1BP@GHr;vJyZCxuSVuvH}2NKXE-MS((QE*_4VEtrT4%D5dTDu4@^Ok2}@9tz~lOO6-GGgy1+h%ftrU!)c=(=%7~rPmB>H0d?N zp=){aoMJ;?u*-T)5@gVaZ8>8`d!idB2D*lZ1Z>PyGOR zr~$ST@hh*XWBBSL|5T3Xa&JGYs+}^Cd&4dIxFyGow|w@p(!P@2ciU1lweVGB$$4|l zSVwoLaOJ=a5Tkl{2{ZeZ7bPY%4fkmys?8}a6GXBn0z~T#2v)hm!mf)tDH6U;v5;w1 zS!P4obzIu?IGkqkchLwSkhZx>_aenwJHdFD0JK%_Go*fdp)em=&Sj7)|EpByig6y* zO9V$=5w_)#h#T6Q61(ADWyy;|Qo;`zaSOiJXsdw`wA@hUMrWqph$A;O?n}XeVTcK$ zLiRV{MfP?Ef)cr2&I08_mr3^0hOq0`+!yd58xIxMthLvkYLpMVUE&s9WOvF+g&n5K zUA&V9M|a2BZH0iihoTmcoLxR(%RH3VPm^Zu$31+EIYDTwdlvu86!RA16_KW9ae z!(u`<^~QJL&cl1V`r0O2ToKFNR%v^HsjLvns;yFF=QP64)i7-8+EjxD?&0o+iI2fw zxfaT!zuHkO8)U(SWO)N>uh8m&tyQ>`&#B1ommIaTIH?^>Ztm<^>8TaEP}majg4JA2 z%iht7$|*-cgQ`FRZAlf%9egjOxE@?kBBi&OzL8Vsz@g-BuB2lJ(MWc# ziD}vNxent0e!r5__UMUQ>Wk7nxvXMsJeZoChJ#6Fy1pQEs^jQ4~;T2LFvsKeXXxfAT>TQh4w0GSNkw8B;ErR1b>Hu~ z94k79jn+keuAt4q3DMfUT%MuZGcG;!M;p-~%+uDwmhqVsXbic(GKzR8PGwCBkt6Mh z@R(P6v!=D0Ab72fg`30p_=D&dJ(f`p=2W)^OY*+3IFNJUgIh@M$r+x_%FB_~KT2K4 z54AdT2j|mQMndKtJ8R7Z=L(e_t?zwpx)!t{%QMF5yhb4h>H>z00~j*Lwz`%H5%MKD z(i$2O9%l-%+9MKOucP2m1+QkjIbZ!(H;uO{9m7jwt z>x~bUMj~zc@6GsVuEliDc-C# zYU<04{vpl<>xSdR)&<^I*yXc<_6x9c$Z>U3?T;VvmBT)aF*O{%SX*qh2zOTZ^5ADes#0!)uSJg7&pOI4If}fp zNubVmnV*Q;0tGD86Oo_w_3mMXv{;ShyY)~?WR{BSJv-QvmZ3*s38>R zY7-f)nKr?qi*9a_5f=cxfHcH=U3F<`0_%m%peLUKX}eJUj|&qb)hOuThgI}deIpMU zXr+f=%eFFd8@OLcj@B>n-?A1hv=kvf4ofd5*M4jv08Ou#XR+fK$DO%^f-E;lxSjOe z0^4&=WNcd15bi8rT>h@3voJUHJVtgt8DCdz43P+Ev}7;W>kKi9M^M7_98;Q%B#Im7 zvnl|@+h7rom>4*dup|qvtZhUl-5b$kWcY=8D!f(SmVW4-VpE4{?_CXBifAoNneawd2!e6WQea1qt?|`#sqiAnRSu=rZvf(*OI{ozqf^guKds5G%38VE?;d8nHN809f|*wRhW3w( z>a0#d-j6RctIjNhwNl!(jMQ1WeHo>$8soRsovnA<&E7PSWG}*bOdZ1;-{K-yDkJ&B{3S>TrM4Ua z>_)3aNe!z-(4DW&N+)_D9%s%8t&~VMy?*QxSNds@LtL3mBk;B0Lu$ znfQGAmiyB_DkR^S7k5Aeu$9Az8aARmLXK93k3g~>)3NR3-(;{0vGljBXCX+ z6xXZ`o@kiJmjsp#!zW4NE^yWOpRE+AZUU)PFL1?tz@AHDmm9Qq4zUG9GC}?eE zkKiz$Ez7UFu*`#oAA7rv#PG(D2C{;_E9K&2(VmGvODD>cMh=i38Zvwhp=YG6E}wDy zn}t)BfR)slfZEc47xjP$P9%6Hk`o^PTc`dMG*$s#4+9PT5$b;@@$yW5XMKUQobvtQ zw95?8|KR&?B<`O|+@kSl(l`IjQ&bUMCjn{NXo?62$Qj=z#^Y@t{a!}KwK563JtdDziKTYylEsZado*5g+=XH7j8;J7@gpC1xxmeYe##Pku*K*)u!&076G zP?(?N54dvELTTr-xL52mKQpQFZAT1|+Gv(H1@nI#CFMd`@kGcIL+-h7^P`y8Wya%o z2O>czEv@bZukQpG%WS{tFVM=Kw7K_5!)wFT+6BIErKm1)=?1BPa^~m6+H=v$O?`%% z}kK! z(Ygw*&Hh7_$5rm5reli78|^f@$e_uEiL~d{Y33p>1ZTDQm{8KkHeh77DSc2B+icG9 zNONH6hu}+9W#ONXh6JZLmQK97=dZRk*6;Hb8~c@NYm+@ny|KMiKylsaR%o}D@^q~` zJBGsH#94FB+t?5tHgtH62oq1sv!z0_R~pczs0G7tc1rOsOCRxq|Dt>k)g7fKfpnke z-%1}M!YKH&pt1|-wiHB~{Y&$4&s@kfWH3pQYmQVfE_?r!;?lio?N=RdGw;08(RJhG zLe*Y9bpz&GsUp`sO^}GKiIJwUWXks8$!aM#xeGH(8{ez--1#`yyJnga|0=DCHikcNh;2Nj8MK+5LBbK^8K^fK^1wr zs9H%3j=U1!91X%lNFrI$9rY_SXwuo)W|IZUmUGcb6u{FV*wz;sRxcDrzEEXlT?M)q zckj^?m3{yZ*ztk|LkXTrz5StP_%J`Nyg)hfKW-`}kV;d#zr70=sooF?FJhLt+D%pr z^auk0QoHE}q!&e$w(RSN%Okbf4ulaz=+L96(eeaRgGr6*v#G;mE=kZQ)q%W?ahwA^ zA6sXS)|~;u+d!wb0qQgz#-#N$t>E^6ZC@k_R&{(BmoM#yzhfh~86FFe=ma{>CNYWn z7QZAi64KD4+VthI5;B#g73)7`jPTKrMgp#XVDEv*hT^Hhpy1OI$ES+0!u{7}+QNUm z45-)4pW-)w;$3vWhhhMIdTi3-eFRvFRF(^)mf>&b6He6(nC8xc3xI>)D)#5#OvO%h z5Ky|`s&uMrfQ#;*I(VWu|1!do08c0HRRQAI>G&)V0ysFkF7^9>@nrrxF%;OTLYn~< zW&@cBLKNFsb{~sPXQljO$zgG~dKxm^zk!4wLQo}a*1h`%)kVLNdM(FTGw=wzfhgL??tdcr0@_W1Un}(N$Q*5N)**bSV z@1~8WZKEvbqbW5K*cDF~T&%f;)a_U$@ZJ7nZ@sa8U0`6u@4BIL;wVVJZfp2t`Hz}J-acBa{1E2@6=IZ_Q5hunN_7?%bAfFo5zhmPx80Iew zoMHp}^8Fte09>(WAo+d$Pk}RTPPqiw!iLCTQLJ(iIPir&CS8>&<6rYhD+6GA3YX~M z6S$c9(fr0hCW{IvXr+y(A>hmeWcQQ(w8+yi_apqPNP3qqL$M`K19nC^H51ADy`w9; z@VSzsO|`DngP~WhPw5&r7+syK?}PYU7bZ5`hV2y#eqI{S7L zbYiQ<>`FIQ$kQQov8YmapBPgLKnTlFV4O!}&SvVP4aCtK{^MfUvFTFG_|-U67oDKh zULTxJna{P<;74MKmGk(n_ma?IYlZQqv8YS+hI?9D7%a=AcW?k39u$yA_uks{{#^15%C@fFTe#p|C3CQf{p@T z&EvwV#>P`57dR5VsXdF02LUW-k3I0NIf5TXfYt>vd5x#qgAj4r9!J+~Z4wc&0?bJ_1wAMc7S*8gT%6+Z@VzIR?+OATbX-;!e$?dITQSZ+yD$UA^9lF%U zX9VbqF{v%+Fx3lf3Z0^@?C*Y^l%F$N_nmI8x`&RRb_yMqTftk@UJ! zGmgX0o~n?s;*Mm}unn;N;&)EfRjTNX&nUMAGqY>g1!prsS;4l$>Rh~4-4S~w$nwg{IbavBao z80C6x-8k@kVW}A|!nGt=<)PyoB^&N3iEN5v)R4a&v3wUyAMnTPXFuXd z|8x=f5(%Z7#rNPRVE!MT!;5PFr6CJtVN!*21G&K7dCBC zBL$4A6vZbBpNMRxFWBWS6|MiDL+ng#LHj9C9cjwz-O{}4?6%wfWJV6d@xzdjP}7+a zoCjoyy1rVIMmC-#h0G@d#_9)K@|QL~^3@kjFP|I}R5Rdf95cX!1dbWTL*Gj->Fs%} zSUo$guXv7j@0pQuVTKxyh=Jlv_dsGy!_=}dx^fvoOyq(@^!K%|Q8-eYT$3wai zmKV3ABQm?nxhucQ$!tA0aZZeBqJK6OX%Wc3t)U}KBB=|a8yW&FPwt2>bwwn~}vx#VLqko0a zb0!||t^2o~M|^}TMG&uku6N17sY^*g+fuA5w+?rrH}2=i$q*W@R_;nmw^X<52JNq? z-=L-!5oJM>pvQ|3*Wph%?|}Om>$Rhy%g5_<#+yg+OvkqsR~A#Y`fQ3AMOkhXjuM9? z@k_pSQ?6$O60j4Ul7g6P69sgIlwjVMbNy0`V6H2A^ic4YO0Z?2wUOawsO!TavubuG zDTog=smby#n&i91Z$dYBKhG7ebT%o$>p$PrGiw>g$oWr;M7me0-d){>mLD1@Z+KBF zws>u$N%nOpni=c;%RfS8=Opu97vSQ3))7Z$wCM>(gfW8K{C@fHd!K)H%E10Fb>uyp zX%d7aaPC71l%$WqRz6SA%xHTFW1#$E0()>9OeSFK3)~~-dh-4*P{I~LiowVAeR1!) z01+nXTaYZ!!~qLBK#<}6-OFbeLiLd6I7i=&8?6(Ry~8Eux_lF$B8F&atE9Q^o#w+Z z?CVgx8XHdzdlkROlJywRhyMPMzPeMC0M$n z$5C98I#eF*K8HDv^CYT1=F0)PnTzp?yBHD&=LHkSiy_3~rE%d9gXe894$jUEv>F|Q z2lO1y1oJCi1`<3WAhH(+CsZ1#y_z~XOAQ=?kYX)~OS}T1bB^+_g%$8|aE!@ed-#{t zkPYKc-j}B0;C$O=VM6Iv8&k31;k@guk2(HwQ@`()>+`G1mvL|y{WNwpn^l*AQdU0`VUznbO3;c?Wg>2p#$9Rs?miUS&N*29WQ=aDeOA;aefe$3=Ibvxp9(;^BMmDlH0Ku)MwMln`b+)qnifhj3i2p< z<5_pb3|+6de#zar#TQNJLPzH0bQCGDb8z{zeXZ=h%MBwdpNQ^T7hJP)GxvGTB4X6( zNzLRB3Fi2$w>kP#urB<8R;hpXn|qn@eO_!nZ+?B(FG*^oHLe=kWH+O#yWdQKFBHB| zKGkhIKe(-j^3uNfsh;B=1CM&3 z*PPorKMwT54X#5X`QdD{8{-=y68v5J;0hlD!&9mne3180(_N*yD|k@{VNqi_e9htq zFUvw;jM*az8_jLfpfrG?j*!XN@)e#&H@i$z8w`* zeq;r8#UR4-VIGEMJ-5;o8fEsnHPrbz;o~&bLxXb$H=NdMP25 zW|FvAqon}tpv*xIqpWxp?nb6zQdEe6^>vrB7U=p7aQb_`VJQfZAJpi8?Q9lvXS^i7yA74Ji#B_7 z9JZNms8bGx%Xu=k9JPzti;6q!7P62$$}>Dp;;QpNE0Gc6d`)VoSe}h0h778VKg*+5 zADJ^p|LmR(kz}6L_IeB-v%MZPzBj7Fu5%^+Y{QsXLDprq>-x%*G6|#U7_CQ&sTUw+ve-8CH)j zQXgW+pgZ$#eGjVXXvY`82dgf(z)kv5*f#F8p@}i%#uq-~#_X@0e^r1Zc2lfvF i_8)GJ|KWQli$vp9wAO0Vr6v+Vq literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-writes-networking.png b/docs/sources/images/dashboards/mimir-writes-networking.png new file mode 100644 index 0000000000000000000000000000000000000000..81c9f0a296eeda9e4117c2d65009e10a769e5333 GIT binary patch literal 83185 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�Oi~Xv@~2;` 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 literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-writes-resources.png b/docs/sources/images/dashboards/mimir-writes-resources.png new file mode 100644 index 0000000000000000000000000000000000000000..31a4cca94626cace316ed0291ba6221110c5d55a GIT binary patch literal 131831 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. +Dashboards both provide an high-level and in-depth view over every aspect of a Grafana Mimir cluster. You can take a look at all the available dashboards in [this overview]({{< relref "./dashboards/_index.md" >}}). Alerts allow you to monitor the health of a Mimir cluster. For each alert, we provide detailed [playbooks](https://github.com/grafana/mimir/blob/main/operations/mimir-mixin/docs/playbooks.md) to further investigate and fix the issue. diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards-overview.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards-overview.md deleted file mode 100644 index 4e0dc6b59a4..00000000000 --- a/docs/sources/operations/deploy-monitoring-mixin/dashboards-overview.md +++ /dev/null @@ -1,123 +0,0 @@ -+++ -title = "Dashboards overview" -weight = 1 -+++ - -# Grafana Mimir dashboards overview - -Grafana Mimir provides the following production-ready dashboards. - -## Mimir / Writes - -This dashboard shows various health metrics for the write path. -It includes object storage metrics for operations triggered by the read path. -It is broken into sections for each service on the write path, -and organized by the order in which the write request flows. - -## Mimir / Writes Resources - -This dashboard shows CPU, memory, disk and other resources utilization metrics. -It is broken into sections for each service on the write path, -and organized by the order in which the write request flows. - -_Requires Kubernetes resources metrics._ - -## Mimir / Writes Networking - -This dashboard shows receive/transmit bandwidth, inflight requests and TCP connections. -It is broken into sections for each service on the write path, -and organized by the order in which the write request flows. - -_Requires Kubernetes networking metrics._ - -## Mimir / Reads - -This dashboard shows health metrics for the read path. -It includes object storage metrics for operations triggered by the read path. -It is broken into sections for each service on the read path, -and organized by the order in which the read request flows. - -## Mimir / Reads Resources - -This dashboard shows CPU, memory, disk and other resources utilization metrics. -It is broken into sections for each service on the read path, -and organized by the order in which the read request flows. - -_Requires Kubernetes resources metrics._ - -## Mimir / Reads Networking - -This dashboard shows receive/transmit bandwidth, inflight requests and TCP connections. -It is broken into sections for each service on the read path, -and organized by the order in which the read request flows. - -_Requires Kubernetes networking metrics._ - -## Mimir / Queries - -This dashboard shows a drill-down into queries execution. - -## Mimir / Compactor - -This dashboard shows health and activity metrics for the compactor. -It includes object storage metrics for operations triggered by the compactor. - -## Mimir / Compactor Resources - -This dashboard shows CPU, memory, disk and networking metrics for the compactor. - -_Requires Kubernetes resources metrics._ - -## Mimir / Ruler - -This dashboard shows health and activity metrics for the ruler. -It includes object storage metrics for operations triggered by the ruler. - -## Mimir / Alertmanager - -This dashboard shows health and activity metrics for the alermanager. -It includes object storage metrics for operations triggered by the ruler. - -## Mimir / Alertmanager Resources - -This dashboard shows CPU, memory, disk and networking metrics for the alertmanager. - -_Requires Kubernetes resources metrics._ - -## Mimir / Tenants - -This dashboard shows various metrics for the selected tenant/user. - -## Mimir / Top Tenants - -This dashboard shows the top tenants based on multiple selection criteria. - -## Mimir / Object Store - -This dashboard shows an overview on all the activity / operations on the object storage, -run by any Mimir service. - -## Mimir / Rollout progress - -This dashboard shows the progress of a rollout across Mimir cluster. -It also shows some key metrics to monitor during rollouts, like failures rate and latency. - -## Mimir / Slow Queries - -This dashboard shows details about the slowest queries for a given time range. -It also allows to filter by a specific tenant/user. -If [Grafana Tempo](https://grafana.com/oss/tempo/) tracing is enabled, it also displays a link to the trace of each query. - -_Requires Loki to fetch detailed query statistics from logs._ - -## Mimir / Config - -This dashboard shows details about the runtime config currently loaded by each Mimir instance/replica. - -## Mimir / Overrides - -This dashboard shows global limits and per-tenant overrides. - -## Mimir / Scaling - -This dashboards shows any services which are not scaled correctly. diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/_index.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/_index.md new file mode 100644 index 00000000000..5c3565c3a9c --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/_index.md @@ -0,0 +1,11 @@ +--- +title: "Grafana Mimir dashboards" +description: "Collection of production-ready dashboards maintained by Grafana Mimir." +weight: 1 +--- + +# Grafana Mimir dashboards + +Grafana Mimir provides the following production-ready dashboards. + +{{< section >}} diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/alertmanager-resources.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/alertmanager-resources.md new file mode 100644 index 00000000000..d10d3be5990 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/alertmanager-resources.md @@ -0,0 +1,16 @@ +--- +title: "Alertmanager resources" +weight: 120 +--- + +# Alertmanager resources + +This dashboard shows CPU, memory, disk and networking metrics for the alertmanager. + +Requires Kubernetes resources metrics. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir alertmanager resources dashboard](../../../../images/dashboards/mimir-alertmanager-resources.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/alertmanager.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/alertmanager.md new file mode 100644 index 00000000000..4c83dae0287 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/alertmanager.md @@ -0,0 +1,15 @@ +--- +title: "Alertmanager" +weight: 110 +--- + +# Alertmanager + +This dashboard shows health and activity metrics for the alermanager. +It includes object storage metrics for operations triggered by the ruler. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir alertmanager dashboard](../../../../images/dashboards/mimir-alertmanager.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/compactor-resources.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/compactor-resources.md new file mode 100644 index 00000000000..6ca975abdf7 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/compactor-resources.md @@ -0,0 +1,16 @@ +--- +title: "Compactor resources" +weight: 90 +--- + +# Compactor + +This dashboard shows CPU, memory, disk and networking metrics for the compactor. + +Requires Kubernetes resources metrics. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir compactor resources dashboard](../../../../images/dashboards/mimir-compactor-resources.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/compactor.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/compactor.md new file mode 100644 index 00000000000..f21f23ceca2 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/compactor.md @@ -0,0 +1,15 @@ +--- +title: "Compactor" +weight: 80 +--- + +# Compactor + +This dashboard shows health and activity metrics for the compactor. +It includes object storage metrics for operations triggered by the compactor. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir compactor dashboard](../../../../images/dashboards/mimir-compactor.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/config.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/config.md new file mode 100644 index 00000000000..a28b6c829b6 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/config.md @@ -0,0 +1,14 @@ +--- +title: "Config" +weight: 180 +--- + +# Config + +This dashboard shows details about the runtime config currently loaded by each Mimir instance/replica. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir config dashboard](../../../../images/dashboards/mimir-config.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/object-store.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/object-store.md new file mode 100644 index 00000000000..c52c9dde438 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/object-store.md @@ -0,0 +1,15 @@ +--- +title: "Object store" +weight: 150 +--- + +# Object store + +This dashboard shows an overview on all the activity and operations on the object storage, +run by any Mimir service. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir object store dashboard](../../../../images/dashboards/mimir-object-store.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/overrides.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/overrides.md new file mode 100644 index 00000000000..33d2e0d1a09 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/overrides.md @@ -0,0 +1,14 @@ +--- +title: "Overrides" +weight: 190 +--- + +# Config + +This dashboard shows global limits and per-tenant overrides. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir overrides dashboard](../../../../images/dashboards/mimir-overrides.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/queries.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/queries.md new file mode 100644 index 00000000000..288c0382fd9 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/queries.md @@ -0,0 +1,14 @@ +--- +title: "Queries" +weight: 70 +--- + +# Queries + +This dashboard shows a drill-down into queries execution. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir queries dashboard](../../../../images/dashboards/mimir-queries.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/reads-networking.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/reads-networking.md new file mode 100644 index 00000000000..86b38c340e1 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/reads-networking.md @@ -0,0 +1,18 @@ +--- +title: "Reads networking" +weight: 60 +--- + +# Reads networking + +This dashboard shows receive/transmit bandwidth, inflight requests and TCP connections. +It is broken into sections for each service on the read path, +and organized by the order in which the read request flows. + +Requires Kubernetes networking metrics. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir reads networking dashboard](../../../../images/dashboards/mimir-reads-networking.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/reads-resources.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/reads-resources.md new file mode 100644 index 00000000000..2c7c4ce8d36 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/reads-resources.md @@ -0,0 +1,18 @@ +--- +title: "Reads resources" +weight: 50 +--- + +# Reads resources + +This dashboard shows CPU, memory, disk and other resources utilization metrics. +It is broken into sections for each service on the read path, +and organized by the order in which the read request flows. + +Requires Kubernetes resources metrics. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir reads resources dashboard](../../../../images/dashboards/mimir-reads-resources.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/reads.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/reads.md new file mode 100644 index 00000000000..598259c2147 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/reads.md @@ -0,0 +1,17 @@ +--- +title: "Reads" +weight: 40 +--- + +# Reads + +This dashboard shows health metrics for the read path. +It includes object storage metrics for operations triggered by the read path. +It is broken into sections for each service on the read path, +and organized by the order in which the read request flows. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir reads dashboard](../../../../images/dashboards/mimir-reads.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/rollout-progress.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/rollout-progress.md new file mode 100644 index 00000000000..618ae81d299 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/rollout-progress.md @@ -0,0 +1,15 @@ +--- +title: "Rollout progress" +weight: 160 +--- + +# Rollout progress + +This dashboard shows the progress of a rollout across Mimir cluster. +It also shows some key metrics to monitor during rollouts, like failures rate and latency. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir rollout progress dashboard](../../../../images/dashboards/mimir-rollout-progress.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/ruler.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/ruler.md new file mode 100644 index 00000000000..7ed5fdfd177 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/ruler.md @@ -0,0 +1,15 @@ +--- +title: "Ruler" +weight: 100 +--- + +# Ruler + +This dashboard shows health and activity metrics for the ruler. +It includes object storage metrics for operations triggered by the ruler. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir ruler dashboard](../../../../images/dashboards/mimir-ruler.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/scaling.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/scaling.md new file mode 100644 index 00000000000..0458ae102bf --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/scaling.md @@ -0,0 +1,14 @@ +--- +title: "Scaling" +weight: 200 +--- + +# Config + +This dashboards shows any services which are not scaled correctly. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir scaling dashboard](../../../../images/dashboards/mimir-scaling.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/slow-queries.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/slow-queries.md new file mode 100644 index 00000000000..8204023ee2b --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/slow-queries.md @@ -0,0 +1,12 @@ +--- +title: "Slow queries" +weight: 170 +--- + +# Slow queries + +This dashboard shows details about the slowest queries for a given time range. +It also allows to filter by a specific tenant/user. +If [Grafana Tempo](https://grafana.com/oss/tempo/) tracing is enabled, it also displays a link to the trace of each query. + +Requires Loki to fetch detailed query statistics from logs. diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/tenants.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/tenants.md new file mode 100644 index 00000000000..5673e0bf20f --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/tenants.md @@ -0,0 +1,14 @@ +--- +title: "Tenants" +weight: 130 +--- + +# Tenants + +This dashboard shows various metrics for the selected tenant. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir tenants dashboard](../../../../images/dashboards/mimir-tenants.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/top-tenants.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/top-tenants.md new file mode 100644 index 00000000000..b6e9864deca --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/top-tenants.md @@ -0,0 +1,8 @@ +--- +title: "Top tenants" +weight: 140 +--- + +# Top tenants + +This dashboard shows the top tenants based on multiple selection criteria. diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/writes-networking.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/writes-networking.md new file mode 100644 index 00000000000..4beccfcdd1b --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/writes-networking.md @@ -0,0 +1,18 @@ +--- +title: "Writes networking" +weight: 20 +--- + +# Writes networking + +This dashboard shows receive/transmit bandwidth, inflight requests and TCP connections. +It is broken into sections for each service on the write path, +and organized by the order in which the write request flows. + +Requires Kubernetes networking metrics. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir writes networking dashboard](../../../../images/dashboards/mimir-writes-networking.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/writes-resources.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/writes-resources.md new file mode 100644 index 00000000000..0ea7405eb24 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/writes-resources.md @@ -0,0 +1,18 @@ +--- +title: "Writes resources" +weight: 30 +--- + +# Writes resources + +This dashboard shows CPU, memory, disk and other resources utilization metrics. +It is broken into sections for each service on the write path, +and organized by the order in which the write request flows. + +Requires Kubernetes resources metrics. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir writes resources dashboard](../../../../images/dashboards/mimir-writes-resources.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/dashboards/writes.md b/docs/sources/operations/deploy-monitoring-mixin/dashboards/writes.md new file mode 100644 index 00000000000..f1e0722b623 --- /dev/null +++ b/docs/sources/operations/deploy-monitoring-mixin/dashboards/writes.md @@ -0,0 +1,17 @@ +--- +title: "Writes" +weight: 10 +--- + +# Writes + +This dashboard shows various health metrics for the write path. +It includes object storage metrics for operations triggered by the read path. +It is broken into sections for each service on the write path, +and organized by the order in which the write request flows. + +## Example + +The following screenshot shows an example of this dashboard from a demo cluster. + +![Grafana Mimir writes dashboard](../../../../images/dashboards/mimir-writes.png) diff --git a/docs/sources/operations/deploy-monitoring-mixin/install-dashboards-and-alerts.md b/docs/sources/operations/deploy-monitoring-mixin/install-dashboards-and-alerts.md index acffbb8b7a1..45e02a69dc9 100644 --- a/docs/sources/operations/deploy-monitoring-mixin/install-dashboards-and-alerts.md +++ b/docs/sources/operations/deploy-monitoring-mixin/install-dashboards-and-alerts.md @@ -5,7 +5,7 @@ weight = 2 # Install Grafana Mimir dashboards and alerts -Grafana Mimir is shipped with a comprehensive set of production-ready Grafana [dashboards]({{< relref "./dashboards-overview.md" >}}) and alerts to monitor the state and health of a Mimir cluster. +Grafana Mimir is shipped with a comprehensive set of production-ready Grafana [dashboards]({{< relref "./dashboards/_index.md" >}}) and alerts to monitor the state and health of a Mimir cluster. ## Requirements diff --git a/operations/mimir-mixin-tools/screenshots/.gitignore b/operations/mimir-mixin-tools/screenshots/.gitignore new file mode 100644 index 00000000000..1f89d9f8894 --- /dev/null +++ b/operations/mimir-mixin-tools/screenshots/.gitignore @@ -0,0 +1 @@ +.config diff --git a/operations/mimir-mixin-tools/screenshots/Dockerfile b/operations/mimir-mixin-tools/screenshots/Dockerfile new file mode 100644 index 00000000000..2ed984df655 --- /dev/null +++ b/operations/mimir-mixin-tools/screenshots/Dockerfile @@ -0,0 +1,23 @@ +FROM node:17-bullseye + +# Install Chrome dependencies. +RUN apt-get update && apt-get install -y \ + libnss3 \ + libatk1.0-0 \ + libatk-bridge2.0-0 \ + libcups2 \ + libdrm2 \ + libxkbcommon-x11-0 \ + libxcomposite-dev \ + libxdamage1 \ + libxrandr2 \ + libgbm-dev \ + libasound2 \ + pngquant + +# Install sources and dependencies. +RUN mkdir /app +COPY package*.json app.js /app +RUN cd /app && npm ci + +WORKDIR /app diff --git a/operations/mimir-mixin-tools/screenshots/app.js b/operations/mimir-mixin-tools/screenshots/app.js new file mode 100644 index 00000000000..7afee32327b --- /dev/null +++ b/operations/mimir-mixin-tools/screenshots/app.js @@ -0,0 +1,130 @@ +const fs = require('fs'); +const path = require('path'); +const querystring = require('querystring'); +const puppeteer = require('puppeteer'); +const util = require('util'); +const exec = util.promisify(require('child_process').exec); + +const defaultViewportWidth = 1400; +const defaultViewportHeight = 2400; + +// This allow to customize the viewport height for specific dashboards. +const customViewportHeight = { + 'mimir-alertmanager-resources': 1900, + 'mimir-compactor-resources': 1000, + 'mimir-config': 800, + 'mimir-object-store': 1400, + 'mimir-overrides': 800, + 'mimir-reads-networking': 2000, + 'mimir-rollout-progress': 800, + 'mimir-scaling': 800, + 'mimir-slow-queries': 600, + 'mimir-tenants': 1200, + 'mimir-top-tenants': 2000, + 'mimir-writes-networking': 1000, + 'mimir-writes-resources': 1600, +}; + +// Dashboards for which we're not generating the screenshots because their content +// from a demo env is not much interesting. +const skippedDashboards = [ + 'mimir-slow-queries', + 'mimir-top-tenants', +]; + +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} + +// List all .json dashboards stored at /input and returns the basename +// and UID of each of them. +function listDashboards() { + var dashboards = []; + + fs.readdirSync('/input').forEach(file => { + // Parse the dashboard. + const raw = fs.readFileSync(path.join('/input', file)); + const data = JSON.parse(raw); + const name = path.basename(file, '.json'); + + // Skip dashboards to skip. + if (skippedDashboards.includes(name)) { + return; + } + + dashboards.push({ + name: name, + uid: data.uid, + }) + }); + + return dashboards +} + +async function takeScreenshot(browser, dashboard) { + const page = await browser.newPage(); + await page.setViewport({ + width: defaultViewportWidth, + height: customViewportHeight[dashboard.name] ? customViewportHeight[dashboard.name] : defaultViewportHeight, + }); + + // Build the dashboard url. + const dashboardURL = "http://mixin-serve-grafana:3000/d/" + dashboard.uid + "?" + querystring.stringify({ + "var-datasource": "Mimir", + "var-cluster": process.env.CLUSTER, + "var-namespace": dashboard.name.includes("alertmanager") ? process.env.ALERTMANAGER_NAMESPACE : process.env.MIMIR_NAMESPACE, + }) + + // Load the dashboard page. + await page.goto(dashboardURL); + await sleep(1000); + + // Send keyshortcut to expand all rows. + await page.keyboard.type('d', { delay: 50 }); + await page.keyboard.down('Shift'); + await page.keyboard.press('E', { delay: 50 }); + await page.keyboard.up('Shift'); + + // Wait until network is idle. + // (I haven't found a better way to wait until all panels are loaded). + await page.waitForNetworkIdle({idleTime: 1000, timeout: 15000 }); + + // Take screenshot. + const screenshotPath = "/output/" + dashboard.name + ".png"; + await page.screenshot({path: screenshotPath}); + await page.close(); + + // Optimize the png (lossless) + await exec(`pngquant --force --ext '.png' --skip-if-larger --speed 1 --strip --quality 100 ${screenshotPath}`); +} + +async function run() { + // Ensure required environment variables have been set. + ["CLUSTER", "MIMIR_NAMESPACE", "ALERTMANAGER_NAMESPACE"].forEach((name) => { + if (!process.env[name]) { + throw new Error(`The ${name} environment variable is missing`) + } + }) + + const browser = await puppeteer.launch({ + headless: true, + args: [ + "--disable-gpu", + "--disable-dev-shm-usage", + "--disable-setuid-sandbox", + "--no-sandbox", + ] + }); + + const dashboards = listDashboards(); + for (const dashboard of dashboards) { + console.log("Taking screenshot of " + dashboard.name); + await takeScreenshot(browser, dashboard); + } + + await browser.close(); +} + +run() diff --git a/operations/mimir-mixin-tools/screenshots/package-lock.json b/operations/mimir-mixin-tools/screenshots/package-lock.json new file mode 100644 index 00000000000..119623ae70f --- /dev/null +++ b/operations/mimir-mixin-tools/screenshots/package-lock.json @@ -0,0 +1,1021 @@ +{ + "name": "screenshot-taker", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "puppeteer": "^13.1.2" + } + }, + "node_modules/@types/node": { + "version": "17.0.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.12.tgz", + "integrity": "sha512-4YpbAsnJXWYK/fpTVFlMIcUIho2AYCi4wg5aNPrG1ng7fn/1/RZfCIpRCiBX+12RVa34RluilnvCqD+g3KiSiA==", + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.948846", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.948846.tgz", + "integrity": "sha512-5fGyt9xmMqUl2VI7+rnUkKCiAQIpLns8sfQtTENy5L70ktbNw0Z3TFJ1JoFNYdx/jffz4YXU45VF75wKZD7sZQ==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.1.2.tgz", + "integrity": "sha512-ozVM8Tdg0patMtm/xAr3Uh7rQ28vBpbTHLP+ECmoAxG/s4PKrVLN764H/poLux7Ln77jHThOd8OBJj5mTuA6Iw==", + "hasInstallScript": true, + "dependencies": { + "debug": "4.3.2", + "devtools-protocol": "0.0.948846", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "node-fetch": "2.6.7", + "pkg-dir": "4.2.0", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.2.3" + }, + "engines": { + "node": ">=10.18.1" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + }, + "dependencies": { + "@types/node": { + "version": "17.0.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.12.tgz", + "integrity": "sha512-4YpbAsnJXWYK/fpTVFlMIcUIho2AYCi4wg5aNPrG1ng7fn/1/RZfCIpRCiBX+12RVa34RluilnvCqD+g3KiSiA==", + "optional": true + }, + "@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "devtools-protocol": { + "version": "0.0.948846", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.948846.tgz", + "integrity": "sha512-5fGyt9xmMqUl2VI7+rnUkKCiAQIpLns8sfQtTENy5L70ktbNw0Z3TFJ1JoFNYdx/jffz4YXU45VF75wKZD7sZQ==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "puppeteer": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.1.2.tgz", + "integrity": "sha512-ozVM8Tdg0patMtm/xAr3Uh7rQ28vBpbTHLP+ECmoAxG/s4PKrVLN764H/poLux7Ln77jHThOd8OBJj5mTuA6Iw==", + "requires": { + "debug": "4.3.2", + "devtools-protocol": "0.0.948846", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "node-fetch": "2.6.7", + "pkg-dir": "4.2.0", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.2.3" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "requires": {} + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/operations/mimir-mixin-tools/screenshots/package.json b/operations/mimir-mixin-tools/screenshots/package.json new file mode 100644 index 00000000000..3dc4b69dfcf --- /dev/null +++ b/operations/mimir-mixin-tools/screenshots/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "puppeteer": "^13.1.2" + } +} diff --git a/operations/mimir-mixin-tools/screenshots/run.sh b/operations/mimir-mixin-tools/screenshots/run.sh new file mode 100755 index 00000000000..41eab7a6e19 --- /dev/null +++ b/operations/mimir-mixin-tools/screenshots/run.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +set -e + +SCRIPT_DIR=$(cd `dirname $0` && pwd) +DOCKET_NETWORK="mixin-serve" +DOCKER_APP_IMAGE="mixin-screenshots-taker" +DOCKER_APP_NAME="mixin-screenshots-taker" +GRAFANA_PID="" + +# Check if the config file exists. +if [ ! -e "${SCRIPT_DIR}/.config" ]; then + echo "This tool expects a local config file stored at ${SCRIPT_DIR}/.config and containing the following content:" + echo "" + echo "CLUSTER=\"\"" + echo "ALERTMANAGER_NAMESPACE=\"\"" + echo "" + exit 1 +fi + +# Load config. +source "${SCRIPT_DIR}/.config" + +function cleanup() { + echo "Cleaning up Docker setup" + if [[ ! -z "${GRAFANA_PID}" ]]; then + kill "${GRAFANA_PID}" + fi + docker rm --force "${DOCKER_APP_NAME}" || true + docker network rm "${DOCKET_NETWORK}" || true + echo "Cleaned up Docker setup" +} + +# Start from a clean setup and also trigger a cleanup on exit. +cleanup +trap cleanup EXIT + +# Build the Docker image. +echo "Building Docker image ${DOCKER_APP_IMAGE}" +docker build -t "${DOCKER_APP_IMAGE}" "${SCRIPT_DIR}" + +# Create Docker network. +echo "Creating Docker network ${DOCKET_NETWORK}" +docker network create "$DOCKET_NETWORK" + +# Before starting Grafana, let's make sure the Docker image pulling time +# is not taken in account when we'll wait below. +echo "Pulling latest Grafana image" +docker pull grafana/grafana:latest + +# Start Grafana in background. +"${SCRIPT_DIR}/../serve/run.sh" --docker-network "${DOCKET_NETWORK}" & +GRAFANA_PID="$!" + +# Give Grafana some time to startup. It's an hack, but an easy one. +sleep 5 + +# Start application to take screenshots. +echo "Start screenshot taker container with name ${DOCKER_APP_NAME}" +docker run \ + --rm \ + --name "$DOCKER_APP_NAME" \ + --network "$DOCKET_NETWORK" \ + --env "CLUSTER=${CLUSTER}" \ + --env "MIMIR_NAMESPACE=${MIMIR_NAMESPACE}" \ + --env "ALERTMANAGER_NAMESPACE=${ALERTMANAGER_NAMESPACE}" \ + -v "${SCRIPT_DIR}/../../mimir-mixin-compiled/dashboards:/input" \ + -v "${SCRIPT_DIR}/../../../docs/sources/images/dashboards:/output" \ + -v "${SCRIPT_DIR}:/sources" \ + --entrypoint "" \ + "${DOCKER_APP_IMAGE}" \ + /bin/bash -c 'cp /sources/app.js /app/app.js && node /app/app.js' diff --git a/operations/mimir-mixin-tools/serve/.gitignore b/operations/mimir-mixin-tools/serve/.gitignore new file mode 100644 index 00000000000..1f89d9f8894 --- /dev/null +++ b/operations/mimir-mixin-tools/serve/.gitignore @@ -0,0 +1 @@ +.config diff --git a/operations/mimir-mixin-tools/serve/provisioning-dashboards.yaml b/operations/mimir-mixin-tools/serve/provisioning-dashboards.yaml new file mode 100644 index 00000000000..88ea6ae49dd --- /dev/null +++ b/operations/mimir-mixin-tools/serve/provisioning-dashboards.yaml @@ -0,0 +1,12 @@ +apiVersion: 1 + +providers: + - name: 'dashboards' + orgId: 1 + type: file + disableDeletion: false + updateIntervalSeconds: 5 + allowUiUpdates: false + options: + path: /var/lib/grafana/dashboards + foldersFromFilesStructure: true diff --git a/operations/mimir-mixin-tools/serve/provisioning-datasources.yaml b/operations/mimir-mixin-tools/serve/provisioning-datasources.yaml new file mode 100644 index 00000000000..63f7920a5f2 --- /dev/null +++ b/operations/mimir-mixin-tools/serve/provisioning-datasources.yaml @@ -0,0 +1,15 @@ +apiVersion: 1 + +datasources: + - name: Mimir + type: prometheus + access: proxy + orgId: 1 + url: $DATASOURCE_URL + basicAuth: true + basicAuthUser: $DATASOURCE_USERNAME + isDefault: true + secureJsonData: + basicAuthPassword: $DATASOURCE_PASSWORD + version: 1 + editable: true diff --git a/operations/mimir-mixin-tools/serve/run.sh b/operations/mimir-mixin-tools/serve/run.sh new file mode 100755 index 00000000000..c20b86314ab --- /dev/null +++ b/operations/mimir-mixin-tools/serve/run.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +set -e + +SCRIPT_DIR=$(cd `dirname $0` && pwd) +DOCKER_CONTAINER_NAME="mixin-serve-grafana" +DOCKER_OPTS="" + +function usage() { + echo "Usage: $0 [--docker-network ]" + echo "" + echo "Options:" + echo " --docker-network Joins the Docker network " +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --docker-network) + DOCKER_OPTS="${DOCKER_OPTS} --network=$2" + shift + shift + ;; + *) break + ;; + esac +done + +if [[ $# -gt 0 ]]; then + usage + exit 1 +fi + +# Check if the config file exists. +if [ ! -e "${SCRIPT_DIR}/.config" ]; then + echo "This tool expects a local config file stored at ${SCRIPT_DIR}/.config and containing the following content:" + echo "" + echo "DATASOURCE_URL=\"\"" + echo "DATASOURCE_USERNAME=\"\"" + echo "DATASOURCE_PASSWORD=\"\"" + echo "GRAFANA_PUBLISHED_PORT=\"\"" + echo "" + exit 1 +fi + +# Load config. +source "${SCRIPT_DIR}/.config" + +function cleanup() { + echo "Cleaning up Docker setup" + docker rm --force "${DOCKER_CONTAINER_NAME}" || true + echo "Cleaned up Docker setup" +} + +# Start from a clean setup and also trigger a cleanup on exit. +cleanup +trap cleanup EXIT + +# Run Grafana. +echo "Starting Grafana container with name ${DOCKER_CONTAINER_NAME} listening on host port ${GRAFANA_PUBLISHED_PORT}" +docker run \ + $DOCKER_OPTS \ + --rm \ + --name "$DOCKER_CONTAINER_NAME" \ + --env "GF_AUTH_ANONYMOUS_ENABLED=true" \ + --env "GF_DASHBOARDS_MIN_REFRESH_INTERVAL=1m" \ + --env "GF_USERS_DEFAULT_THEME=light" \ + --env "GF_LOG_LEVEL=warn" \ + --env "DATASOURCE_URL=${DATASOURCE_URL}" \ + --env "DATASOURCE_USERNAME=${DATASOURCE_USERNAME}" \ + --env "DATASOURCE_PASSWORD=${DATASOURCE_PASSWORD}" \ + -v "${SCRIPT_DIR}/../../mimir-mixin-compiled/dashboards:/var/lib/grafana/dashboards" \ + -v "${SCRIPT_DIR}/provisioning-dashboards.yaml:/etc/grafana/provisioning/dashboards/provisioning-dashboards.yaml" \ + -v "${SCRIPT_DIR}/provisioning-datasources.yaml:/etc/grafana/provisioning/datasources/provisioning-datasources.yaml" \ + --expose 3000 \ + --publish "${GRAFANA_PUBLISHED_PORT}:3000" \ + grafana/grafana:latest diff --git a/operations/mimir-tests/test-gossip.jsonnet b/operations/mimir-tests/test-gossip.jsonnet index 43ccc1cfdac..9dc969dcbf2 100644 --- a/operations/mimir-tests/test-gossip.jsonnet +++ b/operations/mimir-tests/test-gossip.jsonnet @@ -1,5 +1,5 @@ -local mimir = import 'mimir/mimir.libsonnet'; local gossip = import 'mimir/gossip.libsonnet'; +local mimir = import 'mimir/mimir.libsonnet'; mimir + gossip { _config+:: { From d9428fc6d96796a97ffb0a9a222745351e265098 Mon Sep 17 00:00:00 2001 From: Karen Miller <84039272+KMiller-Grafana@users.noreply.github.com> Date: Mon, 7 Feb 2022 00:26:54 -0800 Subject: [PATCH 106/168] Docs: Update the templated configuration prose (#1027) * Docs: Update the templated configuration prose * Docs: revise per PR 1027 review comments --- .../configuration/config-file-reference.md | 65 ++++++++++--------- .../config-file-reference.template | 65 ++++++++++--------- 2 files changed, 66 insertions(+), 64 deletions(-) diff --git a/docs/sources/configuration/config-file-reference.md b/docs/sources/configuration/config-file-reference.md index 16adf651641..f24b989491d 100644 --- a/docs/sources/configuration/config-file-reference.md +++ b/docs/sources/configuration/config-file-reference.md @@ -1,56 +1,57 @@ --- -title: "Configuration file" -linkTitle: "Configuration file" -weight: 1 -slug: configuration-file +title: "Configuration reference" +description: "Configuration reference" +weight: 1010 --- +# Configuration reference + -Cortex can be configured using a YAML file - specified using the `-config.file` flag - or CLI flags. In case you combine both, CLI flags take precedence over the YAML config file. +You can configure Grafana Mimir by using a YAML file or via command-line flags +that represent configuration parameters. +To specify the YAML file, use the `-config.file` command-line option. +If you specify both the command-line flags and YAML configuration parameters, +the command-line flags take precedence over values in a YAML file. -The current configuration of any Cortex component can be seen by visiting the `/config` HTTP path. +To see the current configuration of any component, +go to the `/config` HTTP API endpoint. Passwords are filtered out of this endpoint. -## Reference - -To specify which configuration file to load, pass the `-config.file` flag at the command line. The file is written in [YAML format](https://en.wikipedia.org/wiki/YAML), defined by the scheme below. Brackets indicate that a parameter is optional. +Parameters are +written in [YAML format](https://en.wikipedia.org/wiki/YAML), and +brackets indicate that a parameter is optional. -### Generic placeholders +## Generic placeholders - ``: a boolean that can take the values `true` or `false` - ``: any integer matching the regular expression `[1-9]+[0-9]*` -- ``: a duration matching the regular expression `[0-9]+(ns|us|µs|ms|s|m|h|d|w|y)` where y = 365 days. -- ``: a regular string -- ``: an URL +- ``: a duration matching the regular expression `[0-9]+(ns|us|µs|ms|s|m|h|d|w|y)` where y = 365 days +- ``: a string +- ``: a URL - ``: a CLI flag prefix based on the context (look at the parent configuration block to see which CLI flags prefix should be used) -- ``: a [Prometheus relabeling configuration](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config). -- `tell us how we can improve.' -no = 'Sorry to hear that. Please tell us how we can improve.' - -[params.links] - -[markup.goldmark.renderer] -unsafe = true diff --git a/website/content/en/_index.html b/website/content/en/_index.html deleted file mode 100644 index 053b759e47b..00000000000 --- a/website/content/en/_index.html +++ /dev/null @@ -1,61 +0,0 @@ -+++ -title = "Cortex" -linkTitle = "Cortex" - -+++ - -{{< blocks/cover title="Horizontally scalable, highly available, multi-tenant, long term Prometheus." image_anchor="top" height="full" color="white" >}} -

- }}"> - Learn More - - - Releases - - {{< blocks/link-down color="primary" >}} -
-{{< /blocks/cover >}} - -{{< adopters color="light">}} - - -
- {{% blocks/feature icon="fa-archive" title="Long term storage" %}} - Durably store data for longer than the lifetime of any single machine, and use this data for long term capacity planning. - {{% /blocks/feature %}} - - - {{% blocks/feature icon="fa-bolt" title="Blazin' fast PromQL" %}} - Cortex makes your PromQL queries blazin' fast through aggressive parallelization and caching. - {{% /blocks/feature %}} - - {{% blocks/feature icon="fa-search" title="A global view of data" %}} - Cortex gives you a global view of Prometheus time series data that includes data in long-term storage, greatly expanding the usefulness of PromQL for analytical purposes. - {{% /blocks/feature %}} - - {{% blocks/feature icon="fa-expand" title="Horizontally scalable" %}} - Cortex runs across multiple machines in a cluster, exceeding the throughput and storage of a single machine. This enables you to send the metrics from multiple Prometheus servers to a single Cortex cluster. - {{% /blocks/feature %}} -
- - -
-
- -

We are a Cloud Native Computing Foundation Incubating project.

-
-
-

Join the community !

-

Join users and companies that are using Cortex in production.

- - Slack - - - Issues - - - Twitter - -
-
-
diff --git a/website/content/en/search-index.md b/website/content/en/search-index.md deleted file mode 100644 index 62e6329abda..00000000000 --- a/website/content/en/search-index.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -type: "search-index" -url: "index.json" ---- diff --git a/website/content/en/search.md b/website/content/en/search.md deleted file mode 100644 index 394feea5fdb..00000000000 --- a/website/content/en/search.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Search Results -layout: search ---- diff --git a/website/data/adopters.yml b/website/data/adopters.yml deleted file mode 100644 index 01c664aa30f..00000000000 --- a/website/data/adopters.yml +++ /dev/null @@ -1,47 +0,0 @@ ---- -adopters: -- name: Aspen Mesh - url: https://aspenmesh.io/ - logo: aspen_mesh.png -- name: AWS - url: https://aws.amazon.com/prometheus/ - logo: AWS_logo_RGB.png -- name: Buoyant - url: https://buoyant.io/ - logo: buoyant.svg -- name: DigitalOcean - url: https://www.digitalocean.com/ - logo: digital_ocean.png -- name: Electronic Arts - url: https://www.ea.com/ - logo: ea.png -- name: Etsy - url: https://www.etsy.com/ - logo: etsy.svg -- name: EverQuote - url: https://www.everquote.com/ - logo: everquote.png -- name: GoJek - url: https://www.gojek.io/ - logo: gojek.png -- name: Grafana Labs - url: https://grafana.com/ - logo: grafana.svg -- name: MayaData - url: https://mayadata.io/ - logo: mayadata.svg -- name: Opstrace - url: https://opstrace.com/ - logo: opstrace.png -- name: Platform9 - url: https://platform9.com/ - logo: platform9.svg -- name: REWE Digital - url: https://rewe-digital.com/ - logo: rewe_digital.png -- name: SysEleven - url: https://www.syseleven.de/ - logo: syseleven.png -- name: Weaveworks - url: https://www.weave.works/ - logo: weaveworks.svg diff --git a/website/layouts/404.html b/website/layouts/404.html deleted file mode 100644 index 378b7367502..00000000000 --- a/website/layouts/404.html +++ /dev/null @@ -1,10 +0,0 @@ -{{ define "main"}} -
-
-

Not found

-

Oops! This page doesn't exist. Try going back to our home page.

- -

You can learn how to make a 404 page like this in Custom 404 Pages.

-
-
-{{ end }} diff --git a/website/layouts/partials/footer.html b/website/layouts/partials/footer.html deleted file mode 100644 index 3e9436e1084..00000000000 --- a/website/layouts/partials/footer.html +++ /dev/null @@ -1,29 +0,0 @@ - diff --git a/website/layouts/partials/navbar.html b/website/layouts/partials/navbar.html deleted file mode 100644 index 856697ae971..00000000000 --- a/website/layouts/partials/navbar.html +++ /dev/null @@ -1,43 +0,0 @@ -{{ $cover := .HasShortcode "blocks/cover" }} - diff --git a/website/layouts/partials/page-meta-lastmod.html b/website/layouts/partials/page-meta-lastmod.html deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/website/layouts/partials/page-meta-links.html b/website/layouts/partials/page-meta-links.html deleted file mode 100644 index 9ea7abaff77..00000000000 --- a/website/layouts/partials/page-meta-links.html +++ /dev/null @@ -1,19 +0,0 @@ -{{ if .Path }} -{{ $gh_repo := ($.Param "github_repo") }} -{{ $gh_project_repo := ($.Param "github_project_repo") }} -{{ if $gh_repo }} -
-{{ $editURL := printf "%s/edit/master/%s" $gh_repo .Path }} -{{ if (.Params.originalpath) }} -{{ $editURL = printf "%s/edit/master/%s" $gh_repo .Params.originalpath }} -{{ end }} -{{ $issuesURL := printf "%s/issues/new?title=%s" $gh_repo (htmlEscape $.Title )}} - {{ T "post_edit_this" }} - {{ T "post_create_issue" }} -{{ if $gh_project_repo }} -{{ $project_issueURL := printf "%s/issues/new" $gh_project_repo }} - {{ T "post_create_project_issue" }} -{{ end }} -
-{{ end }} -{{ end }} diff --git a/website/layouts/partials/search-input.html b/website/layouts/partials/search-input.html deleted file mode 100644 index dcaaba23c7b..00000000000 --- a/website/layouts/partials/search-input.html +++ /dev/null @@ -1,8 +0,0 @@ -{{ if or .Site.Params.gcs_engine_id .Site.Params.algolia_docsearch }} - -{{ else if .Site.Params.offlineSearch }} -
- -
-
-{{ end }} \ No newline at end of file diff --git a/website/layouts/partials/section-index.html b/website/layouts/partials/section-index.html deleted file mode 100644 index aa6cf09eaff..00000000000 --- a/website/layouts/partials/section-index.html +++ /dev/null @@ -1,17 +0,0 @@ -{{ $pages := (where .Site.Pages "Section" .Section).ByWeight }} -{{ $parent := .Page }} - -{{ if $parent.Params.no_section_index }} - {{/* If no_section_index is true we don't show a list of subpages */}} -{{ else }} - {{ if $parent.Params.no_section_index_title }}{{ else }} -

More in this section

- {{ end }} -
    - {{ range $pages }} - {{ if eq .Parent $parent }} -
  • {{- .Title -}}
  • - {{ end }} - {{ end }} -
-{{ end }} diff --git a/website/layouts/shortcodes/adopters.html b/website/layouts/shortcodes/adopters.html deleted file mode 100644 index 907e4128315..00000000000 --- a/website/layouts/shortcodes/adopters.html +++ /dev/null @@ -1,21 +0,0 @@ -{{ $_hugo_config := `{ "version": 1 }` }} -{{ $col_id := .Get "color" | default .Ordinal }} -{{ $height := .Get "height" | default "auto" }} -{{/* Height can be one of: auto, min, med, max, full. */}} - -
-
-
-

Companies using Cortex

-
-
- {{ range $adopter := sort $.Site.Data.adopters.adopters "name" }} - {{ if $adopter.logo }} - - {{ end }} - {{ end }} -
-
-
diff --git a/website/layouts/shortcodes/blocks/cover.html b/website/layouts/shortcodes/blocks/cover.html deleted file mode 100644 index f35bbcb2057..00000000000 --- a/website/layouts/shortcodes/blocks/cover.html +++ /dev/null @@ -1,45 +0,0 @@ -{{ $_hugo_config := `{ "version": 1 }` }} -{{ $blockID := printf "td-cover-block-%d" .Ordinal }} -{{ $promo_image := (.Page.Resources.ByType "image").GetMatch "**background*" }} -{{ $logo_image := (.Page.Resources.ByType "image").GetMatch "**logo*" }} -{{ $col_id := .Get "color" | default "dark" }} -{{ $image_anchor := .Get "image_anchor" | default "smart" }} -{{ $logo_anchor := .Get "logo_anchor" | default "smart" }} -{{/* Height can be one of: auto, min, med, max, full. */}} -{{ $height := .Get "height" | default "max" }} -{{ with $promo_image }} -{{ $promo_image_big := (.Fill (printf "1920x1080 %s" $image_anchor)) }} -{{ $promo_image_small := (.Fill (printf "960x540 %s" $image_anchor)) }} - - - -{{ end }} -
-
-
-
- -
-
-
-
-
- {{ with .Get "title" }}

{{ $title := . }}{{ with $logo_image }}{{ $logo_image_resized := (.Fit (printf "70x70 %s" $logo_anchor)) }}{{ end }}{{ $title | html }}

{{ end }} - {{ with .Get "subtitle" }}

{{ . | html }}

{{ end }} -
- {{ .Inner | markdownify}} -
-
-
-
-
-
diff --git a/website/layouts/shortcodes/blocks/feature.html b/website/layouts/shortcodes/blocks/feature.html deleted file mode 100644 index 7dd33befa45..00000000000 --- a/website/layouts/shortcodes/blocks/feature.html +++ /dev/null @@ -1,10 +0,0 @@ -{{ $icon := .Get "icon" | default "fa-lightbulb" }} -{{ $url_text := .Get "url_text" }} -
-
- -
-

{{ .Get "title" | markdownify }}

-

{{ .Inner }}

- {{ with .Get "url" }}

{{ with $url_text }}{{ $url_text }}{{ else }}{{ T "ui_read_more" }}{{ end }} …

{{ end }} -
diff --git a/website/package-lock.json b/website/package-lock.json deleted file mode 100644 index 7c3011327e6..00000000000 --- a/website/package-lock.json +++ /dev/null @@ -1,2361 +0,0 @@ -{ - "name": "cortex-doc-hugo", - "version": "0.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "9.8.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.5.tgz", - "integrity": "sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001097", - "colorette": "^1.2.0", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001230", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", - "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", - "dev": true - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.738", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.738.tgz", - "integrity": "sha512-vCMf4gDOpEylPSLPLSwAEsz+R3ShP02Y3cAKMZvTqule3XcPp7tgc/0ESI7IS6ZeyBlGClE50N53fIOkcIVnpw==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "node-releases": { - "version": "1.1.72", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", - "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001107", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001107.tgz", - "integrity": "sha512-86rCH+G8onCmdN4VZzJet5uPELII59cUzDphko3thQFgAQG1RNa+sVLDoALIhRYmflo5iSIzWY3vu1XTWtNMQQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "dependency-graph": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", - "dev": true - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-5.0.1.tgz", - "integrity": "sha512-yrvWl8axFdiXlJuVQRIHM4qskvl0F4/fWUUIYyYo0RV6lOdB0Vcyt8Rv7lBvtwVuNa0pClz88LgxzT4ZzC7UWA==", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "chokidar": "^2.0.0", - "dependency-graph": "^0.7.0", - "fs-extra": "^5.0.0", - "get-stdin": "^6.0.0", - "globby": "^8.0.0", - "postcss": "^6.0.1", - "postcss-load-config": "^1.1.0", - "postcss-reporter": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "yargs": "^11.0.0" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", - "dev": true, - "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" - } - }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", - "dev": true, - "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" - } - }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "dev": true, - "requires": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" - } - }, - "postcss-reporter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", - "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "lodash": "^4.17.4", - "log-symbols": "^2.0.0", - "postcss": "^6.0.8" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } -} diff --git a/website/package.json b/website/package.json deleted file mode 100644 index f3391037a4d..00000000000 --- a/website/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "cortex-doc-hugo", - "version": "0.0.1", - "description": "Cortex technical documentation.", - "main": "none.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/cortexproject/cortex.git" - }, - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/cortexproject/cortex/issues" - }, - "homepage": "https://github.com/cortexproject/cortex/", - "dependencies": {}, - "devDependencies": { - "autoprefixer": "^9.8.5", - "postcss-cli": "^5.0.1" - } -} diff --git a/website/static/favicons/android-icon-144x144.png b/website/static/favicons/android-icon-144x144.png deleted file mode 100644 index bc49781eab13e9eb0f7e135e02c85b212f74c08e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10858 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 diff --git a/website/static/favicons/android-icon-192x192.png b/website/static/favicons/android-icon-192x192.png deleted file mode 100644 index c899031a81b728f948b72fc85bd554959cf6c1c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12866 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 RwK7@(INH0?D``O~e*v~NcRc_A diff --git a/website/static/favicons/android-icon-48x48.png b/website/static/favicons/android-icon-48x48.png deleted file mode 100644 index ce014279176c1ba38e06a60490faec15c02c35c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2796 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 diff --git a/website/static/favicons/android-icon-96x96.png b/website/static/favicons/android-icon-96x96.png deleted file mode 100644 index 5aafae0f5e220f7c268e27e21d99c9940507cb30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6350 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 diff --git a/website/static/favicons/apple-icon-114x114.png b/website/static/favicons/apple-icon-114x114.png deleted file mode 100644 index c81d6af6eb79ce5867e6adce8958842f834d390a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8042 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 F|1U^SrcVF> diff --git a/website/static/favicons/apple-icon-144x144.png b/website/static/favicons/apple-icon-144x144.png deleted file mode 100644 index bc49781eab13e9eb0f7e135e02c85b212f74c08e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10858 zcmZ{~1yEa0^e>(S_uv*F1Spi^PO#vC76?|{y|}vA?(W__=bpPsC~b8zVkTk$06?aJRMESy(f<`f{QLW+ z+G_iKh3llKr3e5tXOLXm;N7=@zIy6PfW~pi)_ntNht$&o074!B08!5YfXn-?s6POJ zzYqZM*BStT=K}!rUd5fdviAgh+sEoEfV=;$^6r<}_dP^jNE2TGK!D@F0t~8A2mk=M zziX%{8U!uwlmv$r&j#=Hn(_}_3D}uQ49o}hr)M@liXmm^!u<-)<)rb@r2g~9W2k2; zH*vtkBm1#ZR<0C#Q8Z2Aa~h;FNWkQY?q?YDeta6)KrVgPNN%g(SA~epKXOdHqDSM- zxq)H9@@(O5X^uanNA_f|j*3CI3RQ)jm#K0eZBFXVbp*E!(Az-!7*JF-ZXF;Vha<{n z<0t!u69ejRmjcKS@G{DyeD=Dx|H1|5ay5LbfUrpvA0dp;e-03)$|rn+R}0((e2w-d zlv>|-IUiO#bM5*NbPTc>?`0uGaz`m+w5{oznCA%~YS3-5vb~q0M95$YDBB7t!2m}& zA84Fl9Pa^66}ViJfe`J7qFB{-$LLy9G_e>{xZ#}^&dDrOtjpvdk|Ttr#=NZYz1W*@ z^Iap@GBB&^-Oi#*qdF-U-6PjOq5-;5QhL%HgjZ7`ZEkx(LDA{g6SBbgNQh)t^{It8ZifT6` zDs_IO4rPk#Tj8`OM#ZW8HX$^x(RGCg|2$&?O-JHHiv9lc!E=}!x{enGS)nN(tH=KV zY(QK-QJqmYoh15+*A=6JB|i!kUF0J{f6Br$76zRJiPoB6WRLdzM0eT8H!nw}BtbgB zNTEB=51v>8XdE3vce$1!KdF7}1;)p^LG+f;i!^%8ffM$PBkluZG#5MGLKEkAfHF7% zP9GgX*#t@)Yh_|d1^^M$w;1;Q>=Q~4Ddf#!g|=vn(MnpNJ3a{VqM z{;-s*E_1#fib>*3Y*CC~s{(<*ir=^&*cq1jmxBK8vB zm+w2}_X^2O458w8=J4XYG_f&T!S%(9enniTxEhRyN@|lFL_3Fq&-q30l|<)?aj+(n zzc5^wgejP*?kr9hu`K>Ix1N~UPQvG=M3+JZq?IXo7kxV`xGdD?4b2a|TcCJN_5GgU8eR_F;0 zq%Bg40a%j;UChVmCA5-DNd!UEVDuGQeAYw3s}{&T&}qz+vP>(5{-3k@HeT(tM zdcMeR9fC)V!f2uIuI~VB7#SNDY~`gu*43bIt58QRkB}j74#cK}uS&T(xfC^vQN}73 zoU{(}MvYdID#FK|re3w^?v*6|mW^6PW}5RM=Xr)}n!$C-YVob}h0*F!Z#fR=hBgWv z@DSs$RQy}2q=utWR~C%viVOx`e2)4+2YUgjaP!E@sJyXU@r>?wrU;FCNtt*{LQOX` zz#vKvbvn$B&fo}^AMXkP7~?FHbY;HL7-V4M;S^!XPt#KvrsQ^0BOlpu95q=gXZX#p z2LC;nnLQiQY6aX?Q&V@97|7QJNMDYdulQn4uy3h>mbg7Y*}^yX!r8D6C>-;+zHNKX zXFHe2F!l9->aJU+4(d+df9s{V%g-We^XJHM?m%G_QaNn^AB-hZD@(`M)+8QYUcU8ulkYD~9iitOlVArTpDXbayCkSP$hyu!!Q31cp*x!XvPiE~% z-_xsJd9xVKwthzjN8p*beg)@QB^t!#MN!}PF`8_?$H4+8WF|NGBzxI#dho(%RZD#x zZ43?PVh$5_MSk;X{}Nv3>9hpO8W~zFmAZq0bSmLU^-vf9-<%ga5H2Ps*Ftvn`_1zcq^T(Nuc;zpFfs`=h>$`Lq=`RvQZN+Gndjjmc2 zH?GJ{Hv;)YziL-><3$FKI}Se&RBde_+AY9TIlvxY2>+bM_SZLqJ9^F!rph45V+X8J z7SUP1v%T7;>>zLQDO7w_xSAjhS3bU7_rO{)M-sCqa(w^CBcgF+muUcb$7j{yt<)USaO~N8;L!tF-02pqaQK;bFiDJ2~Wj z)I?M$4MGFxr_+d0#0P`Xy03gHs)6=B&V2inG@Bqp)#W$@4PD$q20VIhX!Jpul1Iw@ zX8TWrLNo4$vSl~;FB@+%pKz_ui-66oV%!MM%GoJld^%rE$Mm-&CDfUkXNEcRbY<) zi$Ww0M!|0eQ;c%U{|%(XMo85W%21eC(DKwC@=#e+h?!7l0>im^*)K__2|BZbR7j{| ztrTx4J@I>@7C)?!C042|_-?GbV8}4@&?6+z=lXir5%k37v!mNF46k)ysSjIuS=<>k zr2!aiD>Ynp@Ob2ps^Y2wyXS5j>fpEHiaXE4$Yhf;jsi{gu}QcXhoe_!K_r)EW;oXr zWEF&kdI9$-cqrPbxv~{N#~WWjc*b3X_4dw)=E^Z_(U0evX&(e%Hqe zw~?7tkWAq}5q`@uN)Ij&52D^V2@Y~kFRQO_bWf2?sKliZP{wmJDmd$TzWR{hsNkx7 zjq~N%YR&UTWxSA#s&s~4C9(zyj`fed445zv0@lQ5DAU1!6@+{gcC?Djd*N|ry$JaW zOLrY2MEn(>%87Y4`0RpwKj?mc^k#mx$srxw4;`OQZ-4UWkntpt$d`UbV);e@d!4K^hN*S&fzh~UybgT9LpJS4k$@NJ&NPL?nS;?D)rp|{;!`qD$# z0edIVUHA6a4xyNMUAZ-0?C8fKDpl0>FZ`n`&Y2N!=LU*Ck>BqA{kBI}9y!}z`^{*w zNfR%@n-`=l(*g+E$~_nvW0VQQ9nhdNoXUG95VYCP6vzi4Q^zu=2i8k$gv4AR9I0X0 zw};Yw9h;TruUQCfXVq-dhugMOzi2nvKg z@?Zr``9Eh+ar`HfIlGV+W}8=0y!W+EXuvhE^73I6f4)j{8;_JUbn$uL!bE299WBiz z56PoMu-CU$|4(o5bI;QP0cIke3>mT$o9w=)5!G>J-nF5;2Kq)ihW`ADPkaZ(y&(RR zY;i48uPL2=KD~D&EE1wWQ#;5sDhd)wcJN9)o|#Jm2qGZPtXT`txW8wd^xW{TuR!8u z#5qG?L&gIg9xsz55oQne^tkLtB6jlei~D{R$0arA2JdOEu6v53S6$T`xoPM`AR+R9 z`L48zQ*>8#?`Qw?T_|eEn;ta5^2aaoZEd5xhv^fTcOLNOJ-tbGs4hB4qN%*L@iywp zVhX^N_T)^Dv&WLNiwoXS4(t2&7B9j?->8@U&!QBxWwx>et8r%X{>N+Azkf6E&u?vW z0w_Oy^sk$suy&bmlSE5~<0r>G<(N~sTNl3ph~VTuN8=~UDomL5uvud+yQp7?@GBGW zd1Gw@O1UoHbw~TWPL<^UJ%Zal4R!k z!PYwA3pB9Bm-$TUC38{aolnH8zC8FL&IB;}=GE)S5U{Hs6<*y(aH5B5kr>t6s|89w z^iEuG!hUL@52xw4xWZSoaTlFNMp-3uTDmc1-e==BD7hrCrhZiDEf5DNMq^@)=crUf zWMr0GoN01xQg@Zuz50>Ly9!^g{bF(|NgHZ31e&q4<}$s@J7|0t!UBBNzxh!Uyuz1Y z9G!C=$R7L0Cnw?>0u=m_!t@)M!`6zcqkfwfp6fcGgQ>PJ#0!a&)iN0a(84msagq|* zisqhC5-^Y&Ru;b=nXK)KifNXtTz=h(Y;zf4tNTu9Zl+uLa|f#%Oh29Bfza@Z#3R-E z6dX)!Q^CAvTkLZ+Xv+W&Zwt5uS`V77zK(R~J&*|EPo@nA)U=G>kH^olQB&z6DVF{b z4;AxGg1V=!)VkIh$6=cVJA}`R&}^G~;Pc+ptiB#AeWOS|tSH$@#rB6zaGMOXcNZN4 z&*$3T7M52`8}VIjglHb)RH;vUlb3FY;MEb`WLLdaAj`ZAWrEamzNRbWK}^A)v$>hs z!19J+7VPv#yy#Yj?}yZNgwu)5bCd+{FQ#AQ+v<^&!`50p(3f?k`}XUJ$HxZ927Dm48a=;7SNQ^UF4Ct_?zU3z|xeh;D<&Si<;m*TU2 zY>ZE)Oyn-|FG&n!soU#>H@A~>PABWe9v@99&Qsd6jfx5gyHYBKHA^I2sef_w$1&NBs(*Mz zx9G%Nj_$tXtc2)sDRUZt2VWRG_=_5B9%cQ-B1{+!E;sC)Bw9^UD0Cdc1zgp@PA%NJ}a>^XK)H1kX zSnOg@rXFj*Li_IKAGKxk+#Jz>`qzSdy;bJkASuHkCcf^%82$L1pP?wgsXkUVl38SK z6KZV{+dkjRt{O}vzx7W0!>{jz=ky%w-Kl*uv4aN5U;+qnDWd|F&S)`iI>F54i0-?A zS& zY?O{l%-YBP!U{Gc2)oc`^F>MTTj8v;<4$?y#K1{SEOC~ZHtsy31mB&jDK2Uq^E=Yi zmfc8K9Vg%u-ajQlz+dE?@ND*?fCF)Z-}2?#`Pt`p3_hrFVLM)pee+N!)0gigUV1}E zhE0*nGB3fw@IA!tk-;k}>7E~t<2}eVrDSIBKD_QeWC?2Hvm|_yx>wS4G;GecMsD70Rz$W40kfQE`he=gju#x7=u0E#qG2iA_F9)SHF|jPfta z&9r8^Gl;z^DZXqj?^IF|8%)3;1|y1h5h~Fayhno74;5JLi)an#=MfI)U6p-F%ah+B zs8sTKdMY_c;_&X=f1>RLhgoKNCls?7xXMV>&ybg~j!-VXE5q0sHq!-i!M(TsCUreW zFN@pI`H1LQD~ccV)GTkbhGR3OKzL>&;jA(=s)rmrG^TI8!YLkRS(Uc>fxPn>Lt!2`+o7TplryD(V zJkO)Wg?l?};{YEtZEr9f#y9SJxlgVaeX+F(7f9J=KTUe1!u_zsh|7d2dd)jpE9S7u z0Ft5oy)!h^gU>Y8xcALuD)+cM)|zcqX=Kcat?||CK>me;L}mz}Fnj~`oZR7o%6U*V z1(}zmjE4Ig=NvvI-QR;*ZS$sZcGZ6TGqCmhM&OHM*)@>? z!{&*T6?6(xr!ohy*BpQ0$=-+IJNjx1y9PocN!lRZ(NByk9TKl-ec*P^;@bi z6h%&|DA^{4=t03}R?mA6OUPT!V$Z$N0!R8P*RiS%{*NRg|ELr_Rq^mFVoWy2oia$) zo+e+rao0HP@KjFk`BFEM|J_`nWzJDS5ffBSN#F@9aS^s89Mq$P=QK8M>9G~O=}z%? z)|^~C#Xpa5^;+0eMF3hBZoY3sA0TE@u2m!+WbJC)lJ@&uR$3~sNe}!WA8okz%fdwC zsQ4!f4|!OAyAnc^2B!0>duCH?qsjKG$^@z*S1j=r zjsU8Rhsij0l(ZAk$!sD+QEV%?mARe^AX^g^m^+#pUb3$7=#z4&%Qe+ zAW&%4^+8L0I>(-?Xu;#z?KR#lg-EJ}=yPI0S1(q*u{nhbiYOFDWX>>FL>f2PP^XaoVBS zldUJzR<5gl9(`3Ls@J3_JSnz~usjJ~!sj%7Ssm=W6g?(9AW1d>e_}8rg{!0U_Y>~Z zo34p3iIl5>viUk$KVp=ZV*j)yYYfhg3~Tp!xq{cENYiaQuYqy zV136YW}{5i*)jo@-HUriZN#Fv>>D5Le4yOQ7}IAjg{X$L`^d`E5zu7S9VCq#SNMCJ zbBfiGUnM*>whV`++{1RwhSZx?#sEF(b&r~6`;EUwzdJb*aji(M%Z=l={i&r;m zG`a>w&EjCIBmo4#M^s|b8cNXO@t3l%q8ZCjYpr;ZT+Am<-dbU9>ix!F)fo_%V-k2KJbUfX`1YEL=VnQk|3i?lVp1i_&%uy zZBb`rU(tydp*SOW>me){#WDO+rL<)>SbrtHvO0?U#)@iP-&cg=tr}##cc0!{fR@AR zDdno;$D~yRcV-O$*i}ic-pG#bdNBGL`^u1FGYN8u5lKfMpm zq~i{1(njYqV9G1FtEu#T?ZplX &pxdj;A9c?%LX(m&i}rX`6qiibYh!?tCg1sh_0stqbI$I77_30bUK$5!0|KB=sWy(=x3+n(U@>KOGnYVx7c&PT?O z1!$_lup#XfvramaWp5G0W*<$uzN<(d>aCD|SUn6`E0F(qAIqocBPDSzlHp^v_y_b3 z*`;cozkgOWjCW(I?svBD0dmD1^Py4!uo7P;xYReMXUb8Fv0rY&`{)vXFDGlZP_Un{ z|N7oMUbyIdqewG@PZ~8E6<9=&p-B9-1} z1WbtVaC9(j(yV#GZqJbf*P!cU?KSP+qWKgNwvX;wMl^)5L=G0MwzI0**fTr*7_iAG9i{+uDGL zgAJhBkxtn5j3trv*Uolt6*c#GL^E>##Eckxn*~mA&WQezz>Nt-$FLsf?${8LaQ#7h zeA3YH2F}DE=L8l=E-{A^*6X(0QG9AhF`w2p0MEzP>-D5& zoqPkxJp23iYRt2@^UV2hs!CIr?z1}?a+ZfGN+p! zxFw{w_Vw4;7=v_C5ZGOld+~bR`Q05^2RxTuzN=3;^x)0(IOOW0;}zs^`p48~NYAm? z>b`H!oEG@&Bo^o>p8+J=cNjfjc_a{>;#DObm^ z%}Ug##wH)OgrhDB?;_2<;GR^C--$jjR`rLB+Xus0Zi~V}NfssN?Phuw1TVqASTMwT^^Qo+ zIr;6t5>P<#Gck;BvkG}8q4aF)c{Idz`v$vMnD~2>=%Ls0bcw6(pU)CsLgats+vQHd zTQz(8Ugvj_=O56~A9AbP^iU?fAws%^XQGqe@O0vKxD%tNuc1V+v!uUGGANFJb7OlX zl!=-@KvRfh(8MO?rb%qWn{Kdav%{b~&?NaokxA@D(qkg(&HMC@m7@6{YGk8Tf?rjh zkKDl%R97q|2|)K3(e`FX89IeOfmpX;EWlqb^_P6o0Bbe1iVX4OLcGS&RKN3=aZZ6X zeOvu_bA}ring|CeUE(8N+2+<{S+JSo^;g}HouID2nLnwZ%;L@oEpL!HV`^KKMpZde zFJr130f?POkwo85(^K7qaRCSBGZ;~N$>pt5}%UK(q9RQ6(9l}K}()^Lt}SD2$;Jx#ILNv>7_LB+LbQ%-^! z=y&egZeYa=$tqChy*ZaCe-xKq`89~PK9%rynoM&Y)4ABz7QO^dS*@-O*E@Bm3R$c~2FB4ef%8eFd1o*xO!OxbU!LBK%+=D|9crKi=Z!m_-PIsO0z2|4f2D;!(Bo4m0T6VlQN0kFR4f zy2#`HEs>~w(K1O3%UkgL$&xB^D59pm^Mk07_q+Sd6l+d>bMbL#`W--ad8S=JA0i+y zJ2Sf!v`(5sd7&t~e@$Fd)J42y$Ti)WNX{KXRgjuXt)-^>GsCu?#kVi56D1liNpMxp z1CIvG6sKrNyGm0y;D&*9+~nc`t$5RK6Kdrm?C_nhq$8PH7j~2%>^h-ZE~Is-CmwVo zFN-`SvZ@-PGvHC{oOgu zU}LGT$-Gk?&aDzk_*ign8J(StyLnv~3evIlhzFN>DCK&k8SX9loXK7i5htM2zgv9* zl@E-k#xpTBq+9GMXq{F6av3wINJ@BSd1njo zZ$pT7$?C@ubb_C><;M?3nLI&>G=)m!wzB=$kPe_bb^+PYVR>o!{$Z$Y$A~i0dw2Bs zfvREJsCtL`-0I1$bW)hCl{zC;Y_dDoW0Sz{BD{wPE~U1LulDp+EQYvY^d_3z&__@Z zFqC(g-ZaLi*v(`j!T{L;d~yEX!P^}A_BIr4=Ov#7Ii38TVmbgBKhD4A;cjMj@*XJ9 znO{Qdx$E3m&V-*ty!XC&b0XS|kl)2^W3!?7D<@W7p^`fw%*0jyJr%Yk@w1M$gRCbl zL}H!qTmILTvMR8E%CGe8OaV}7;{k&u%hSlJi6{I|d27ZP&wo^4IeUq?Fbgy}^6wrf zD0#oR9VqUoELP7biDQn|(^5zk+5Fev`<+lWqr7pu$QxA2p1A+g^%k1mMRVcbh^QRd zodSy9vB4-J?@mx1)x|i3+Gc&c)tr_Yew1g8hwgPATSV0vkc^0@jr3we9Wi_g+tck- zHD8_#EEPFc)5|A{Ad0?-&7lBTy_|kwl85tiLi;`Smem~M<(JnAFs`;Q;ZGUp=A0~Z ziNOga(VG2l5qLzqwE6enf@kFgo3~A4BifvPYkWZu4=sBMfG!fH&MD>JTued$K0he~-aMR>{YB zk15~pFQMk`<%kO<*o_e77?&*iOxy}R(Q#j}^N)DhpQ4O^Zgy1>7jpGrcZ9=QYzLFr zBN|gc$C_LIEWLorIM#G#=>hzAGhk70H2p$68mKtm8%huph2uGkk*J|N8EA? zLh~!MgD@(FBKJ#MBy2T_z7aT%yH|4(7FRyr|bD z^I=+}8!7fdbf37EUiXtC^>D#>M@*Uaa45hexniD}PM|=K#0!ak#GlB0|E_{KCTg!jc9eqHtjexUk40AtAVs(A-e0-~Ykj?rHDh82tZc zsLheV-ZQBEr@`0L(J#=(#{r<>ZsX*jW#i;x=L(e&kQ9*OmxkV}6yp~X=NA@%>IzFh zo&Eg0;DUmIfq?=p|Do^8JzBui$7wl!=UyOy;XjE6&i?MUaJY)6oxi(-haVh{x`+A# zgkRo$6#Tz1|63;=LbD{|{s2V(;htALMHTJK;Tq@qa+H zT-+V}g1sC7|Jy1-FApb$mZ#ePmmDpFdlW!eTvAL(R76}-B!g?~>>fh#Kji4Ugg5|% zl$3HR<^SE2p8gM#p`Hf7(Z$W-{_zFfJ^b7}odg|i0$l7oJ$wcK|A`T_v2nDs7qOER y6%%%_la`Wj5VaF^6cTc@7ZMk>6O*zPxaSbKw{MM-8~0uVKtokqrBTT`=6?bDYR^9a diff --git a/website/static/favicons/apple-icon-152x152.png b/website/static/favicons/apple-icon-152x152.png deleted file mode 100644 index 2ea1143bf4f1ff582ac0963f0d2a078b146e4c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11711 zcmZ{K2Q*w!_wO_%T6EEk-i^+XFnT1)AfiX_-Dn{Uq6;G=i0BeEQIqIIl+h(b??&$= zdU*5w*IVm-@2&OLUFV*A&iU+5QglQ5A0008obT51OPJo7(^m=J%y z*U16JXAmcZ4gvtENg=(qA;6b`eg>K%gM+ zN?$p~hdI~@Ld5Fxp-}Q9QkVcyIjT~iJiSYZ@@kTGNt4=y^UXiv1&FW5S)4On1rfNzxP^gY@r2(%-h z>l+dq|B(62&P31Aq9-qiMhRJD7By{OOf}y@Y4UWe0Lt!_0yKa$XuF7q9a8y(_gt*r z1ObF3ZwJ$03wu6D8GsMn}Q*IrD&$mg+DJ!rHba--P zKAA9|PO5{&nhr=qg;@uZq75-qLMca8Nbb+4`9lk&yM(7%2j)W+q&}GeiXC*zTkfhu zXR1`PEYS^XawkkXp`XYyH55RTk28Ms@Y2xMrX?I@Xs@}uRVFn%RB zBPDtB{N$fAMEemE#UTSo0k#uOWXbc~{|eLJ1g_IW^#V5liRijf$3_eM*#FdC3SM$J zIe`}6b`@KA7_%JGK`p(>R$ToZACy3m&z4)h%?>Uf)F;{B`5` zQGgSV&Y&g5CBgc`qWA6o9QU_YT0lp_Bk@R=m!E31uJN(*T48^#Vj5aAXvc0^xI6Cbe%P2BcKl9Uiml#AOjintC* zqOItOLX=cf%UKoIrss@A|>67`R-g|`c!jjMZu!eUr&Mz9`;Fg z0t@0$LUl3s`h4;rNCT<7$H~WRa(Kskf_G%0Oy}n5ztN^~84)27L_U?BfeO{vI6uWa zfCV^|y4wPAxwX@A7vmXlSW1|w$2|D{>(*a%GZHdCeo7S)VU_fK?YiV!r@g7<@rzGM4 z5Y9Ui#zJI46LFV=po#5bc~0s*@o}q%Mq7hs#FI=D8{!@%mImr`PG1*VD0oY+V~<}( zfuFjN`$Usldh2J0Q$!WWa4^pd^TCgF=KTZg)p|PAdLDA^g%f3rmh&nzt)gyG>tX7O zXV&N4rMC|Eumqbw6=D7(?{4`eX{L#A^!p2PpDDXTPM{$s&xfzN?Ca+OvB}jzMj}7m zF-W~>9->VY?N}VT5G%oUT;7#kW6Zg+kKe!smf1hBcl{Om_n4%_X`OV{u>`27tn8sF z6VkbaE=N9`=Rd#B?=0TG0k`Oej8|NrCDX11c!fA1%*Ys-C3^0*G5H_|t*6-}Ex_GD zB8EDgcilYkp@XC68!g<3`c6Cj=Fo2wKM+i^hG|KNKUZ$<+C_S%Ytd#U_98%Od_tNQ zdVeQCaUNz_o5lXSgY=6(d8`VkHY&&!E1a$%%cM?VhL*-x$^%U&fR1vVkgmqhs)?-X zC8c-d0jgB#{yooW`s0RT`t_4Sk+TuM@ne!`f7&pJ1y0*6JxLE1XJ)-j?YP3U`*?_= zYAb=2Z8d$m_QHn_#eU?y;7J|+jIzLs`NWe#$W@GLT8qId!vjO-bQ1@ZBD=8utXjs4?0VNuq8JT)8t2UKtDe;V z2O+*mYj5co@@kB??$kr;_8;HlO6rTtwwTa#p6SYfk$&6|S`giipf4Jdvm_6txoF~q zf*G`)!C%dpjJ?tNR)PJ4kk6;U&EK*~fRwkC7h!gy{q$G~!pyW@e{qRek9P-VOES2) zLGvlT?+s28FcJA|`_^qci5L1Zebce39eVo2W!=}FYz7XF@^0x=4iK0Vprq(BgL{uI+dYu;hyVRrA6;yxlT_YcEDEd~WV~{9C3f$PCSV2R_ zdCgKn3GEtxlvEifZ156Ip#Uus;b*%}VmyGQYkVQ*AA;Ds00%>@1+;zIm`v@cioNCu zc73M2O#~8X=W$EO7K;ri zAbG#Qq8K99-@ZL?C?BOG(vhOSCWoE94J@5ebkLrO^i@Heq*mb|#l6BrZ3OP3FmI&! zBqaj=>*}ahsSbf$YESKL;aV&xwC}qku%~KT?F2=?LYSE1QKPy2p$2Q#T>3uW1=cq# zJMMR6M-z(18iU(8bj1>-obT5bpV4hL{VACH%7c~EPbhB}IEbN$0J8woe%$yl|%=}p+j5BFl@CJLxk+@1_;e(+I!{X*FQZsK97 zdZ(8Av-DjrRpZrz2(5z6do|df3IRo-WzfxZ-qyG{Ll0#jj=#JqH_<5WFMivmhOTWn z)r#V;kk-rzWiw&-q&rUVrP|3u)i{wIsny7D z-^eBf>TwpS_|4s=zdiIkNtpt-hF3Qqzn)HMjlcL% zIy>}+|Ffgr({RGV=&#NQoPF3=F5Od2ZqC!9!KeV-Snd78XNZnVAT^g8CTKoES>{fJ zJDbG6$#p>y`3xNHubvubE!p4BAc7!1E;Qr5H0u+ayq7JlDMiGgR@y)P9#UZ4efC__ zqnpQD*feh1c(7+@#4Ec0-pH@t26A9nV*vqzzOj`$>*KNU?;lV7D0P~ZOD9|;5ngO^ zHMPi*hW#8a`+6blO_U(JuU-(fDBK?6gD}%7)2}6Iy3Lorl_laivP_=XpDmT{EHJrc za4h$7F9*>V{S(tfE2c2j^s_jx&nkaL&HTAXs46B&E55<6M)AZrTZ?ufU?gsat zSk-3qgbr&o+VOEDUNo0#S8_SC9nI0Im-YweUR-b_AooPm)%*D5-RdbC80D=hkP`=g z$=pfJ`0JT2&MOtxLFx63TH^k&lDS(Ut#E#jF~_8u8+42Ef?Kmh0iC|G?0kO*^Zkzo zemR&!8(@PL&oQC_ZCL}}<9VyypDNyV8)dEdR5zBEnWhGB+O_a88S?Tix(bye&jV@i zTqwdjXrO0j#*XoY*iI{(u+J(F@6tr}utTbSivy=8lHBwqY(&#e7Rc*a&z-pMJV)+r zPKxWSc2Y?A=~Hl6wsc=Vr?6_erb0nF2DwX?q{VksgRL6-v!6f3{J03@TAV&hwQr!` zavpe8kJ5R<2w#^V8+} z0D+@vCXkN4BJSUodvzGKONR;((|SDIyYp>U53E+~Lih`9U@w%aa;9pnV`3Wcpidr? zr&{RosCEa}0DF!}pNirWEy>?a@`&&HAXI4A>RaRGxVxwII5%F+9um~_^|MXhRn|>N z`9P|jfAK}I=gJma$@Kof51oHfp{&m0saF)mlmvE|j2`o3yX~EG5l(dgS}yl4gO*3=I`0JLtv_ zZy+1_6ZoAacAi8}?1ZNOI=07~&Sj&@pNXBKleM* zwe3J-29E6t43h}P-AEEsVe(6#of!h;(nSn>^SBzS;`>HFOtlYV0OCIj>phf%i>mXsl z89DZYB}?E{`o$jaiw}$ zI8mbteIYKI=kF_>q0>6UV&Vn$>NHA>(=v>AQb(L+%gR{HT+?%4n>2@>Bl%ZS|H4-; zq_}KaEYl%<_J&2wb?Q9-n=4-2#j~WQF!1Y5;mvyNsKcTj%^WDDTt{aGtGg>Y2A3#h@RwETj9+z(m{$Vk#B)<4!B2L{V-^_^L|_uoqemFXrDl2nWn`G66YOCC9vqkfvgdDwec2Ou}jZQ{Y?E% z!rc|EG$XaFE2|U6R$^xztm$PqWBa*fn*{4_3Wtwh*csN!zCmUCJF9mvd0EYNjD7DPj5I~>bw29VdWWCt>oigI z33WOH_@k8;*+2F@3KT$h;&R0qTNzvF+CM$eedDZ^RXvrZcd-`KvhOzdz@IrG*McY8 z?F~ZCIYW{m7;zt(1ld`(PkbL?`~3a>vrb`bF=Jt4ph}V&e<6uLTM`-ri%@+wcp^TH|x5tYQ%2l2M7V#7Z>qEfXjS2IEyzZ44^F1X@@DWp%BQ)myK z=6qAbn9L@l>Zi{;d4VIs8vDs9T=#ckORMFnRl{qgsDR7VUH-0vmseHH?iv<<&(^aP z_WXA1SQls6N9iUOrR+@aT=&G3QR@p?6}4*P!i9jB!bBB4&3dJz0vC63qKAu9z&BJ5 zgrR+ppG(!)pWR7&`b^aQO3Vs3P~CfZ2K-MN!b^YTV8XYR0fWeIhoZ zx)8-K3JB!0&H9z@%bo_dP^V=_4yqvVFD~te$>kW^UmVb*5s$S|T;mis_iN?3oxOW*wBOUm zi+%*afqikw-@SpaIZ~iL^of=CTIozPw@@F2HJVmEwC+-XhEKHo8RL;eucy-3xEDT+ zSM>CLk68xp!tPuqz(oezGGY&}s(l?Yd(Mg!+~A+=B~ zI^tU1#6!Vv?~s~Z$$))-!CFDR{!WzRJEtL%C0kZv>kvwgw8oX{yK59?8@|#HD2yYB zUaJQ2Iw_jP?el7X7(yyC#kLF_4E#Y%bJyMZfx$9Ivy@kLEguqL4$A2woLoC11XL#+ z$w9cC^Kt5va4z(1^ix0%dAa0Bl7oQ8P>_|Bow>5FtDfva4nRifmF)>o_0YtTFFvGs zl7j~}`+Urz>unvujQdabu2)T%r}r0tNgSlRtS#G>CbqRqjf%UkP(&c*5c!BPZ<#!-G@PUC2#$R#j=a2*@-GNw7DHS;~(#g9VPhIJ#>hZ^X_rpb$}w3X>wnG%|n;9AQoZK4oc$nRD}vJdg?T0EK<}gVJQbaWAnDKjchgz zhMq~yymrH(a;+Ap>VKVu(~L6hLn1r1X)p$PiC5|Ul!2As8Dyo~YCN!iVe}XC6Wl?$ z%}+J$4Qb`ucX`4vA@@}LKPJ4OB-iYBukis88o-lHdmBw{+Iqk~;w#GjSkyD^5_!8!g$dx^ZZ;a+hk{uM}O(FSC4^86d zhCzl`T&I145~LD@CT5FMf6N4Jf4P)9h5Qp!-;W475z%=5%dq$@JA*nSeHACyawq!i z4OL5D{P-J-*CJ7M=UQs}Od9jCXkFu!lb#^b1($_9p@hPvT`n?OO)5xByXMh1zxZVZ zZCk2g4UK+B+7WZz74UD(gp3L%@kVg;Pqt+7-bQSST;viz7Fa*QRoB+fIg5bPlOx^> zsrZ(i$mkHi{NRZ;sH3zD@(jyvr&Ign?B`Bs_qB{PVyA>ffU^Sg>&g^2Y+``-ytHj` zS~#Z)wUr%**Mm$C)0&WPI}OEeP7#uCQ!}l@$z~j^8odqCoWu&?8^_f#%glg01Wv9< zqys)!kr(B^3Ut4B^eINSOP=C&cG?$4I-ainb!XMNB@$e*1v(*$=C$cdNh+e*DCL%L zN`se?p7>xDb0FFA)u&|fx0YDyp^prUuj!T*KojMJ4qf$`HN2d%1@#PER3aT_M=fWn z#1D`G)+1T*V%YCp8Q`5LnKrx`rSrA5dRbYgg!gE^bb}Mp2K-Y^8~Bj=vL)%(kDEtr z;G_cJM2 zz5ZsxIbQ330$RA?9a=hGW}$KQNY9azH13&>Wn{x# z8UK%Eaf#+yF(Lc)8gkZj;{J+kw!^k4{%1Fu#mK$2QQ%2Z2>PqsoEsIWzo;Xbn_|_w zWpmi3%m1naJY~}r`RTPhP%Ik00GjrM-J%~K83}#An?KW1#gW5dikW%;VIx(p9Z*%G zp(IbIz%G3fOih;)6Wv6$^h}dEgifEe<5eJM{E?p4^J3q8F8<&p^Nzs7%=qw6F@;R= z(^$kc@ts1R&cdcda|LE!BU3w%QudeGcZ&y0Lr4YBr=R3HEu-I`UeqWKZ z!NYyhmO~8lAhzZsa32gU*4tIFg}P@1wZ;pkH>Ixr1?6|;BuXya=T|$GH_AVvI5MY2 zalvj#{)%5cef(E1Dd7Wkafwxg_aQ)Hof=7XtYbzIK-`NKjJR>MwM&&(B&+$x=eENn z!#gHFT^~7@GRGi6!jC!tvX~_hSW33=xiuE0@{&GCg5N^);+prD7ba zyRlfUbJEeBXKqB;6a5$6?)DDhDNEd1f$aUMTCKzp9wOe06Hf*xI+gYCrXyufjxb;* z{?V`peU78gzWP(Z&3(bXCK9?>tJsDKYSiWHvPRPD$EZ%@r8g&6Z~ir6pH9S}bG#$So5=tFpHHJrvk%qKIt)ZV9Cn_=bhU#Ff|3!M<8-Q2Rmn(fttk;gj*Ft2#!F z^&)*=%2nvAbzaOQtX>3)bmy$6)M5N(zyg@#fYU+%KVBraS5GvmN*CVZiX3B29yw6_l zu99h1ak>*lkgL#R-F53zjwlz%iZ#1B(X~Q{_E@@Tb=I9Aw;VMiaQ&GRC+oQ__s0We zX`(XJq&$7q&DhsCIA=DfxV;iZVx6`M6SB)F_QboO(Hw~nWFvMIVOPM?kM)i`D zHYEp*`kKeFf6mnADD=>Pyx&zo<8rU!+^9SZEnng!ecVmURZm1m@G^3+K>jyan}L=+9fAQQ03Tq@z8v{Xm)U%~05vX>yv>a!H!1+gUav z^&15o!{d+GOJa#RKi=G%-w6Pj4zZ05YfEQU_is(B5z}R;odFv4p@wJ5P2K$UOL~AS zl?MUV=v*n9iz3lp!zI>&~vMG0V0?jzHV$?Z9#3o|UeOr0U+a?Ftf*qyCt~#X{^^ZUq zjtN1oREtSe}!$b=_K0gXWqpt^O5fh&WZvu zCNpmv2ZJpWLR}^^&x8?kAG#lKlkWHmQm?76H&(=@F0u>pl(5$PdVwucqKSs7yjcCT zY`a5=XQbwY>n$cVjfJfeB!q=Gw)NN!<)0!fiUwLD5s`T3eHU9J&2 zF%>x@;HhS8Dr@!NNo`qQFqh=%2IeBCR8@Zg%ka@fWyPJ3gyvs@ck`13sAqG3okRMhqhF-39LpoUdJH!i?5-_r2s2dukV)Sl7YunEh;%;W)~&Ann=f49y;<1o z_Xq3z1ga0br!A^Ph@H=9=4h1MjiM=H$jMuyB@|bfxFZ05$9wFWx>6Y1GjUXfOB)}{ z^W*sL?jZQ22lm30a!KMOGxpCR2{&~fN0_8N2arhe_L{!G#8tJj2KXVlI3!}NIWqM9 z4t-0~&slzsnoTL0MwWxum7j=d?(9gVZFx^6(l!pHD!B_MY$`?l3Q2ZN2#kBJb(kI9 z@rC$crsWyfG8!PNYAkK`a#Cp(`FeLRwYv0&Q7wzIPv2P)?7O&@QV5>ogHpd0%yBn( zVVCylZS9WzEaRIZ^<+G)X8mlRDf6~&sfi`$yjyES@Sb;8lmy`i?{GlGo=5Scwl{-{ zulIh=B+@pi^E-v#E4RMj(l%BQ#P)vLbug$)b(UijXtIp+tI|Yl_;)}TZ_T_dHGta| z!)EFEq5nv!8k+QzEmh_R3=AAxViKp{DsJGp5+CfFnif3mSTWj|38u^@3Wj<;MKil> zLN@+e#2}P{V#_I=s_^Vya3R&^gaUJoi)!rJG>Yx5Z-z6t)^WUSO>BK~^=EWp$wr9( zuY7_{*XC{E`&FQB_Yodh%LYG{_3AfSHP1ZS4piZ1|B9!2<_+-vEQxeqb?e7?DE+ zv-XG9*U*Sl{X+0p`;QRV7MX8g_Oyx7Y2HpqPAwu$zxk8j;WmGG@-fh`mg!$QIjarW zb??0PBDj)qm#(W}{(+iN3`=|?oR|lTV4RWi~y;|JClmK+tuA&nI~uC734V!jJnHZzfa=CUXHZcXE-F0v(hNYpX5;3+AtL_$~nzy zSF8NeeZ3`BEEk48jHpbRJ0siS2uoWCMbaHUwEsJM)i4S5z7JNbqnqjfn)i|Jug$G^ zxs0ev*hepDuVrSJ0|T76F`+;MnOHnJ?gWo!e#*6FOa4Akzo)mz-den;uyTuCmjM?r zuG7SH(bJ!*i;r;=yMO-V7PmedZ8Im#$GQKGRK4YH_kQlzoT?M`WFcF*U*9~tz!@G- z4w-#1N2&gLbz?tn@{n=g>63(&!`?g+pM-2=Wve4EAI|7@K~Th7Qo%zKJ`+JwcsW~+ zhJ7{ZEcu7a!w&p*M6N?YVpe|1!CDq!pj9?319s51EkgM%DMj6DMcH=0i2%+fowWgM zErEQWm#T-n-$XeFAHa{W8JvR&IecC+qAc7<#Urwwmd2{q=-w>(0+V7k%0nFNW@9~3 zPt5aBRAX)+20c+!+nAST%Wz~Qu<`emW1$^#VT$2UcQhOX%ju`ugZNASWf4UIs znKfl&mHOT2W@rkYdgKG@|2~2nRZkteFt)a2`~KwBYl8OpORaRyB0I+Z6Ep1?XuiFR z{)&B1oj7kkUl_Md&&-h4bl~*0pnSqVbg{!9>{}c>po`16rf+&=t^XT?I1pccUoWuv zF}~uc=?kjpEmBE^vF>Uw+pm>>xS6BAAMA{Ex+IKsWRK>#{%@^!qyCOVHjALkKTMIW&Zej-RvK2S~Wzfa>roQ)i!!bId zae*v(msg>$<<77YAav9udxm=++9p2pSK%(}c-^6dDqLSL^&ne3;BL>9Epnj=cP?{6 zi|SkFR5Wb5Tl42x5zRS$kBdAu+a!jJ+Whx?)bY5&VYdX4kHs7Q;SlNacEz6HS##{S zzobUU+{s**V2>ZTS*#C#>@L&z@0kgAHjRWW@TQSxkDM4$d^S%p0%FWq+rm&Vku7Xc*<9TsTRMqh4oMJa*yt4K!1J%1TSuIIn_67&K_PyT{9juwT}V^4ETZTuSXUo z89!Kysn8+p?rr*eA^QAAiqcw{7ztP*771@ORSRe%T$w;)S?fF8gzHCV`SkjFTt4TD z1OVYj1w@%VdFFOx@U5r$V-Hdzej{G+vkyGq$WvcI;X@Kc52bh>2AsUEmP@2`F4wPL zf#4j2lz!FpylbES7spv~=)rx%uJ#XldB9DgP(2sVK-Nu}^PB(Q21~j)jK;z3yeeTI zaXIbCtvd;2pQX2#s^`r4oHi&nDyX^q(MBuXTzN=Y`%=oD_3kS6)Ra|=tPOGvjK3bD zt)?>62b`qog|fw>GK1rqht%7?m~4$wb@iQQPFmq|7Tv6fs5YNd^0{kfyU%m-#Bn_- z%5)$|_-Cs8N*!9_Gb~hkrp^bt6imN9m)O4e8BXH?1@`L^ki#B57&cC>tWHC|>{xIM zVp;f*gE-k&|Je58@3LjqWK>3unfrs1&QKAbHZeXqW-i-YKfqQ(Re{O6n-l=;tz z`62S}&<*<1(D+XeeqN5KKpS5Nz(WrkCkGuHCl@<6 z4jEBdQ8^KL4t$qVA~0zYaS0BjxD1Cg3grzK6AKIs6m|Iz8lUiJQ7>PoxtKk?LcqQM zXf$&6_ppV-)x7NdJsdnyaJW7m>IV=nxosBve=z^kCminV;Ns+r0*K2?+y(eX<1q~X zrRRTRp1Rnhoc{wEtArBcA&mb8(Q)x`Km~g{0RHE$#JoM7lxmH2{~tX%MtBrJTv}EN zCMh8;E0Mypb%uxB{VzR+F3%kRFcp>b!UwzfCgcBVdSdVp;OOG+fPZ{34^Nc4my?*I zO@ND?m#3fD|Ctyu8yiPEdkH&PNhxs$J9#-72T40gM;Oe}9wsemCnaYqikA?@-ye>O S4}$Lj@K9Y>?X!w?Kj~cpe%i-T;6A`+o`O|3T3g0Fd~m z2~{%opFb$@%PDx)dJ#5dHdy|Y<2|J^ehD5Os}9Nls;Y`fz$hCyEn2kWa2Zz!TR%Bn z_1nkisbYj0yHw%wlw#vTaWRP^($oTrY$q$mmbX)bYC4>c<~El?x@AwzXS?j}#{`Z{ z_d<(&6n(OU`MN%QsF6QfXjWHJ!!wJH# zIj}t?=a>E74^U&KyxO{s^k-~l07@Bs?RStD!iex^ELEDCI22}*`eA-ci%{u%D}cGt zgk(ojAPKhGA||nXHGwktC~+hmgx3R%ai&vFXY&(i1;XgT?lbZ$b?pQJr9PHpWK!PE zXW=5($tsJ8^Ap^LqwUSlJ(q(>C(?c)dy!?h``ni9q~#m{Cafg2Rk>9|EAF-a_17J) zq;$q(Wv(|SOd%W5s1@5tYP+MA|b2(TgqceE9tf6`)fv{ zTF&EeU+NIC$-X+QY}R#wT)&v~=2wwozid!d^RZ$cTsNnQjwKX;4tmF9BhnT#vZmZ# zgApd>_6eEQROAsC*b0Yy97Z6E@3`hns$K}3R_**i<7m~ssStbDQ7}=&)QFV~{KwPC zE)Lvg_4vk`Ysh>)uL6$^ByFLYsDXfFJ;EgjUdBLz1U%%Ay*A!>UwhI5eW{KC^Y-7s zx^kP z6Y;GkW+FR~)U(f$l^{&;pBgkOIkNes+Y`GiIfk`4sW3^q{eat{0Gyb5C`}`DOBs>5n17;CEZ?QlzV&1i`*@x?m_K z^A{Ylfd^3!oMS03P)y0yc3ltjTCqgxx^~43a41Cs*q!8;CFq?`G{{5}0Y_mx0JqSfrZkA7R%*P3J7!CF@7S zfOm|)38NBx-X@wbvbR%9vG@}li%`Du@$2D-u+5ESvHxwq}$X+dr!!93_~mo|bw9N^A8VI61j-uGswKEoKrbA_=B; zwSJy)&OUIz4HJR&9C{V4bE*Hi%u73JjxU*W2`#4v-nx{x&Ps}Z^QB>^0unfpx|&8} zn0X)nt79Om`jpRA`u;iBUstxLeMcxFC+Moty%rel$#mS9{%gf-h)T@bK!$@DP z-5A6}!hrSJ(aCLup~~BhQfA?l94cyhj0~pr+`F^N6!NV4>}>spIKQ@Njy+R@DB>pVAB zK&nR!#g)^213j|PQ7QpNtCEpJ$A&Mxxf@_Dt<9va!A4XKF_CdkLg=3no`V^a)UTx_ z(^`QA23`S|`s#k0&-?@E)YI%Au<`jY@rJ3Y=7xg*QKVHv$p*;YhZ=PC0nbHISC$d8 z;!gO3g&oXQL%(!$eIR)ROe7r?KOPR=Fye%&9m8Xoj5zV%YGy;M@~J)k7m)HY(Imy1qvi zEIc^RCEjF@xlwlI&Hj@#uNL|M#V58#+78~lc?tDjObfOpN(es>aR0+CCZX%&-X6>N zUHcG0)v%>*AdJ)(vNMBk2Z&b7)QwSBiDEalrjell!SWVdEud$jchoz?QaL@&LWTN} zOE#g6Q`rUq`vbp{#S6vNrktFZf1mOq5?sP%*dekrk3YDSRssQS6B6E%9xa$iLenUp z4Sky!*z*O8*J9~}Ri9Ow;yx8@k1EUF64pbuMShLjRY{%%#dBPRsaqe^T<3jSjJIj3 zQ-h5L|0Kv+H7eO=HS!FePGvJ#VE&cG_1u$bJndt)9>X~CFMnPwtfrzSGFN_m3iDJo zK04^8p)-mEc>`--Sx1ZeYg~`AWNArv|N0a=?E5Tvu?U4hB^Er^iBIk4frRFx5RYp& z$qp}A$m}n~t!i0E5f%Gc{m=TcVXnGp_C43@4vbX25vBCLkG2qbL+r+kN@1ebo!sGW z>~UYOryk{*)Ic_K1CnB`GjpfE3e!}(SX!})?c{1dAN|%QCh;>*z4;BMCT9wtlN+^V zmeJcqzIyZGzMX2xN02hG*^A41BcTIC=hAwUG5`bpV~=L`5a|1=$qWeHO!CG|5E5k5 zb*VV55HXg#c+xTa(WWZuUg^z|yWW!}`_GEv-415NKt<(D_TzplIbqtr9Q6SPbc2=w zyy?2G!P;8k5@txQO#BvPhoY^(&TS^^FOMH|3l^(pRWRFTrKRxteLY4nS=8Bt*bl>0 zmNIFqgNHik{U@W8w-smDMl}B1S_1E_3J)O@$d$SlACsR>l)QSHk4n(GU5((+xh!-L z<1IjSz5;=G)f~LAjFcbf#c$8ti;9*c;S76L+RBJ`SM#y;T!Ux*qNb#vaa^)wnSyn8 z62I?KYrqL~eIHiyUOCgDPkWYO{Q89XUuarZ)Y5lx~f$1ZS zTCoC)<8EeV?GX*bL9loNZi={N2f+uNS{}P8^d4G2so{;O%lG*BtZdrF~||l|yEgH-k+6zpPYqdj zrDW?FSZQu=om2?Vek(_6NioV2CRwG(Hiqg%>H4r#?Gp%*(?X?<<{Pqc@A`@4m*iL)24Y_+&SA^( zer{K={B_1snxEH6@)|~xY>|${Jl69>E&}4ZuKg|~;Z90tWsDOkOvov8KlOJJ8uYKl z5bLJKA6$b#?y9xz-LRX`?Kg2Y00D^ckuIw2AMG(`X3U(WmbZJqd19O4l5Hpp6i2y} z<#(n_M`#CQ8O-FD@u?rKs(+z1?eKNlHd%OBcn23vi3IQkMH)2@w-!sO1H;G)6)L&4 zZ!C`jV_s(_08Z{aJk<`XFm@1|RJV;fp{%yv_q^mVXdP!-G4g!MtbS^U~&0SX|fQkeQ4^-?Z@UiKmjqf)|# z2_k{|fKoM&pxpiM9A+R-7Ny(Fi8h3~Qtk_3AQUnd^#eUA2Z%Qs9(ewx@c|Sfa{E*H zuymO|d|>f?5T|H8BbQi?|5Rc&KR;xklD0>h+8^BG7Y^#3m+oGJ@0Mv8`GIxiL8=r% z;Y4Wqok}Dbd7c+#aep|ux~*8{iNj>ct{nP#ymG!D1l}a9b!wWKm{>4I&es$h z-6@L^qUjZ(Gzk=$SSDt&^77A17QK1BC%7FwJH6w%1{hE6Z*yI%o*!R*@fFCI@?ME3 zZM0N&7RB0(?7*SZkHBt9zt@O2UH8D}K^0QEyPN=C#pnLWcX}W$OFK~0>*6TSkFOcj zpz_C_w$7w|WXIf1#znC}iwieG)yMmiz7jb8J=k(w7~YxoKVrauKmBxQ-r-%CS|)4v z_{Dd$IupE^?zMcBVD_$6*ZdG#Y!S;fpl)E)=Xi0hgeh)Vm}l_sUDjNcyYH}cVr7ZG zYIyT&MKKyG`lk&^5PFBews3E;xmW(lWa=fx(Io7lOd6hs+ARIrBTSJP{5Ce7l_LG# z&rnVZBLQwiU%X$+I_MLISC)B|QE|=j@|$?>iI~pM-x{n<0ggS()0UIha4bO*&5cb@ z4{mlZ`v=*n+hB^BH0kyND$Pqt+07T=BrtXH0PBOx9##-c%eFQ_S^qh=dPMpQ@WE-2 zp&+Rg7<;-CclsW8nx?q+`WM$^ivV?1MtBQj1XtAhQbMSHEx@h62}EVYC#FB9E->^9 z>QkSv3f^LKD6L>=7@jgSu=RMA7Lxaa!@h8!lxsf=_3h4|Cw~8HAGhOt_!}WzI1^3j z+tv}J#a^YGqqAQF$TS$jajbr3RmyvzC_|Jg?sgjLsdQ1$gKxc=R9p|}LXn~`;`%#s)J zqb+}x6_z-6>~pm?z@-DQApC{l zw%M)y#HJmkNgh;j)S0Oug0PrQ5O5TqH=J4m_L=on77uSRVMY@=ktq)u@rPuoF zewZyVQ@&`K4Sr0-6$%ZsyktkRD9;B|P4-_FH-qZb5Ub~L?;ZhHn%ZVT6^%_S+_U$% zse$yA z9WJgJtmST7gPp~DW&1LS>Dw!o>afMwMR+&pfodX86gD}{x5|qi&4Q?lTH`|SEP8l^ zRxW5MQ3ovv6gv+S@Yl&EwM=^)dQh{z2Ugdi;2d!>B?DwR?!8Tz43EJ5k#ZxMTYp03l{q^`NEu(1a4G>hZVXD?Tt8c7uF~B;++J zeKKI5J%_WS#~_sIa>Jhp+f5h#9ha21nKRXc-mv`GbbYZf&ZSYRS)-c3skA2@v?F`+ zRp9aGBq;Nm=5Wpw&BFSIs6JC7|4w51K<+UU2M7N0p7GUk(W+O0D-ezfBJ^kU%f5o6BLM|B*jP9hizCt?h| zF8Cy;Y^Iw2*~_Assxk7$=h_px5<_?0*uV}Fii?zALIY82D!5TW>FH7oONhL1-H(U} zks?Vl)t686DlY+HUtVd|RD6csjZ*g#vzBe<)Vb5kd}X!VWVC%{X-|!K^B$h3A`;g) z4xG-tsH-|!2weSAwErbsLmVGItaNv-l+Qm4|Ldc{TNI6)hB|G!*}=`i2qrD`L6T+s zGL$64YEEetW`rFW+}}R>HwEYH?WoLq5+vY0kOfFwd~0kPC>ODJxreLY5Ra!Mt$Zu< z303&fDyL!F62xOjzR)uiTMM;n034}e%6;G;n^3DPsg8FCKE@N4nBZ=>DH~(8#pjOu z-qInW4wG{@4#S^Rv>V1`{umne|Avv;hc?wV@-jo0E8ba+(rZ5163>_*mSw1ubEfjl z1xgpm0?#k6M5s3WVf~2(qDv|-! z>a9#*^6?CVvwB80pgi$d?}W{h-o=J_T z>9VyXn+gM37x?cVJLBM%ycRzUM7Y%@hd;oHLYF>Fx2|uh7AUC*W!!Iy!Sj z_SScO7iTT$s2z`L!-4;Iwy7^VFk|Rs`gD`z@`7ZrGD@IgA>3ZHJtuoM~p6AU4CZ&?F>!73rrZ zsiDGhag8OBAH;6jk~HR=@|Ix4VeDs*!?r0;`X@J$NxrZr*B!OWof16h@2nATXHy{p zZFK&!5OoZpRJ8(~I(AK(QZZYeHkfI=&1249Aag5s(0DR@?D+{h2zOlKt!WAY{Hf0F z)_3L}^*2cr*1<&hOE;ZW#+zQl!d^-flUp+SN`$`rT(4{>0{gfK0_1ag(_0=-O=gVFzkD#QdM-C$l=#JmrYg>$6%?%*k)JQApMh7 z%bPXAmpN5=-1}!iW*O7^GmZ*gjb4rfGzr%ZU8?Q{O`^Mdc;a=XFf9&dITV7(Y@LI6=Wp0)lX8pX_a$dD@X`TbV>gb0N zB0q`x2j29s0Deyl#@d`mcUALwfeRD=v+*qKjS|{;Hv5HmeM$PXba{3XBZCOHLTJcN zph4p?*SvH^I(@1ym7Cp}AQg1E3H;V!E-NqbB_tGJPoTZccCfjiUKn5A%3#daCXC1b z`@Y=Q&5va*r%r|O^!4!9DOjB|#PkbegpK|i;UuV}Nf*}w+VMEsM#S#jP( zB4>I;d9xjWyWjjHn(9ds`H_nT4!1cJer|)XhZC>YQ0x#CD}Ho01@Hu$ZJ{B0__Uc~ z+q1(;<@4T0c6nKD3eA`@HwU-U(_nHEoM({ke`jhrib z@Qc?yZHl9hF7zA5eby{!#d#$wC0k;?6|c2OjkV}+Sg|=?H$f8x+6pD`mF0?PzU@=l z15N*sr5ofz)hB-puk2jcp%MjsJNKH%zr7!JXVeEDVVQWxo@Ct3pb>u&*!Pxn4bj%w>R)oDmhV&;+vIAur zYd=t`QXilZ^SW)pR!DPbtZ7Pm3cEz}=9pBQRoa9mQ_ zxPPy6ho4qfMS4m9Z#_{VX@-qi!_{UyJr2B&WQpeQ^)560+q?fgJN9f1QKaMtspk_M zm$-2F*E@o3;9*VT$rS|*Kfs$vCifiW{O5MTPE?icMnCw`KYSX4{raujhNg59QjWdn zWxGM2ml<=dGwFv|1=ZlT7pZRF)4BYDo<0PhOZ=KM%p%pBeM$h&vvK+m!|^d1TP_6G z*7={1W}dL5KKaP6=(}&Sq;)Qw(F!zMJ_MvVbt>=O^#LH&mn*c&c=|yTx-Dr}XYQmm zQ!GD2>aql;AK9}{+_wFBN~52lC>jaEn)RqK8aq94(q1P6&REm`mikfso}!Xts#SzvMqH;2z-1_CDaaV6@mu9LWm={i`uSv9;Km*GD)dJr za_LG?=67T@8!;=(KTb$UJ;Su-K*zAoJbj~7r)pI}jf*Pf9xna^A6wTq8`6kvz4`^x z$*d7%4aXr!1e@-#l2ve;=Z?1zyYbW%>sK^@siXvlH1(^WF;V?L=ip!^T9dIAHRd>% zp^U1)V9-PFKxCY+3)Fls%Rhwi?a$~qukfTECdv|D-*Or{OEWS93y_XR@dw$6B0x9C zZS$Dhw9dWt8r;GAl>_T-1^&tY`BkM-SsWkpa;n=Xm_AUjF!2LjgOP4+i-xn;WPr zp)HO1{N(y)pRd@B$h>B%vbo?0t+7}K>5}C1Gb|XNz%?a-u^a%I$X^nf&kfJyJNN;!WoA>jW^8zov~1 za!F&Sf(5vXwM1L0&BLjv|Ls`A_lIeF}D!)D9Sgd%j{8FDC_h1v8E`xss&m zkj=Gqb!xD$#NC*)AQTh>Lx&7_dKe67YCx#N`TXxvt|a|%NRffRo7^33y29WIhZKjL zX}%I6tHLGGG|iRbi0y&08H}cly?x|JJ)P{5c9Paz{i(RCP*IlV;~H_}cmZzJ3sPAf z%NRp38g`YdBY#Qd32jQrQ08lYcVuH&cuR3J_@t;zMMg1c65mDraoyk9Zi=0lE%`3w zv@o@#Y0pdHGD>Pimi|{EI;xp%RII8qU)JtWAJ4taD|w?4Z-$(XG_!!a=Chavz136 zm2=n5_Hea0LzUXKAqVl_YJLB(p8x7K`$A1v}nV37e^&$*9DGUDCrpE_rtR| zNLDGcq;$!`UiaTnPbVBa>2se&+n8csZwAoffk5a>bL=?rIofe4!ZwTl)<3_LUdbYb z9(zPZa)cy&z)-sId+;*Umf_`GBzz1ndJm(G1=t2!!m@+s6+#li^@Obd1T%fy(~#Uf z_06K2{k7A-i`ZI~EAP2AXq~QLjhIU?nmHq~eKb#=#|sa{QuxnlAjI;cgw0yxo^+(@ zyhdH@hyor;QoMA-JUL{VuUvlX!wd5rjYr1+g_)7}ps%P1to4@g`QV;*7G(9S8E4~W|Vwn%9g)%39v!=}U{9v~^lt1=S zdHOJtOThCBaF)q+SN3r5|gZUL^Z_j5aS>dlAYVP6T;xA}jdq~)l zzXBXLeYT#$Pm0Q0dKbGmcJnhF((TcPCqM_fYepbYEX*O-XY0@3cfaU+8i+Em3hdx z<=srw1<=-Ei#IO; zie1z3@Sw!bn~7VEpT6%_L9HnCnUDeD+aA5!$6_xsT7Rn_)0Of`2(ROVi>`QVuLV{6 zwfMb^9jQ86=8Q8ejH&wWw*8evFwvE?u4G#Z^E3CB zC%%PcpDrpkOmY6;V&Qtspueo(*VY=N8ZDC{g6vbB+S4|pgOc5*s&DfzH~NU{5o{x# zc=aUxIi3o{p9QH7T*|2rlv&jA9a&^3HrsJYhsbnazS#zv!kL>XAc~VQ)*Um{zo2Sn zmu%5ive5g;X<}I|uC1+n``V#F0u2=sJnA192o{VpwGAKu7#N7QP>qHQ-T;oP-X{@^ zQ@7E1{tSM1wGAZ%RG*mJpOWQtCliy`JA89jK3fBq+ijOIIWyy1B&p=iVzjad@_Mu2 zr+rp!jy?F~x7K2ZGEFKWru)~NY(ne#kfR&5=A$rgD{#hmddYZtD~gHuQ^2#k#FcRv zTprD=F5MbIgERd22HqdsC)yo<*Nv0k3J@d-Wx?2HnW&W`SB={vRpS|UzMV+%{e34F z)8ZRdF`PZ=&C~mCt#wa^jMyfyECw)7=&Oiv)?{zRJ}z;8i&g>;fU}cJxa02X1Sd3a z(oY#*loBGH$2IFuCrZPZ)I}FO)dG|uR`OBr%*?msK1ao8%x08bHxQkVc^3weoowgO z<)4Tl6h(?H`u0xRaRX!%I^VF@O7Sxks+t{0_1$Ce!mwAH;_Qdn4MhirVJYYNrvaK~ z-kXMaQkpi2$8v7q@&d{JAj?wwM26u!*NpE^`ea`;p-qnj^=c|+Tk`NrytY?>$>BP6 zX^L$7U?!a5&=07s*K)71XK**Cpv1!lH{QQ+eoDO+_V1Dx&S#z!l`Nha7|X}D)>x8L0kdLKdsYF}-+ z2k}8W%KBqChsf;!7Lj5NBO@(X5v`PBqNp-YP7EJ9i}eBZ`wnUD;t>w{7^h*Ei(iPw z&1?Bl-eequ?~XLyzZ42fB?mN2?XHSN@m~s+-$u~fCr!9>4!UJd+l=*mg3vi9 z(#}juXH?;?I>W{{2<1RuGQ~uziZ6V)o=rP#i&qtVt;;441-df4my0Nkv*YT%7^!;k z{fn(hX>~;%NFknjo<4j9bdg1xBfK8OZy~b_%d}k6mW|Yh$U2BVQrB&}bMlzFfRPc| zZ0}?;$6Smcmumr{7_NZ+G&1Bl)N9+ppegYvM)705D6N`f_KVW|2>Q&`5YQKyrKt)n z*qwn8i#&fdOzJj+OVUO#0kEv*VVZeOF1k!zUU2a7WdWDGwF-~TIT5@vchij${yzSD zhBk~~_K193$V;LR_;tkKlTs`0`h?s$`?o2j;@R^0m~{@EUjTPy6YtYFictY9PebTR z)W7J#G__E2@nW5iOlDffJ;4F&yGoZ5wx0>v-VNS{H+?9VHq4<&E0LpaopMQD;+rli zB^Q(q74=e)kMK&9jn|3(tQs?+i#yCzg*tEVbBv)i_PiUFEN=c;xmuul4O`vjb$gX< zNO7O3ry`=O6PW(ZMp(%Z*PJU#f_>;q&SoX-#73GZt^EgTumSf)Ot#7=~ z_&!WQ`kCi$jXG>F)rxojyz?S&ImthHRtjI*CgW_OkC*P zrYdzHqkJx0p5HI8m36PV9V>#a564}JQFh!;SD`;tcvlM{Jm+Z^bF624kB#B286f&u zYWwqI66I^GdUj@jLO8zFl$TKXuZB^be*mYzD~b-ix5=nq2u_1%PSd@3V}%j^md)sh zkwh)ywF?@pG<#&cG-GV;AHkl6b%`>$!z8V{Nw@ECNC>4XS(uN&Yk}SUP~s1C9`D1c z*XtRRj}Vy+!d>H_k!C5p=P$@K#Z%aqI~aGyY+npEeuC3dO@_Wh<^TOr6*k{!I5DYb zGS10GSx|eQuCtq_e}Pe4-?vrA$V7i;A(tx?_ck>Yn{h1jwH@Y8)l{9^fHRv#>LGG3 zBK<=>7i#P-@UAEzr&dP=*6l;g^Mhtl?36ci-gEZN>yxL zoIHuY;=DbES^egCvi3xBE{QbOGr1QIH%ifzqJHcXZuiuuvZ!<`{lkwdk4tTfccXEsG{OF%eQi56R{nDAi=L&_`khdXY$L0Nijoo4 z^OB^Fqg5ZCCI_2fQY@lDj24I;ic>o4F3_!F-L42rEC1Dj*Q!cY!ouJR3?9T}q6Z(^ zo#V!y9zg3)O#WTd^psooxE0*K0Hr0!gZ5~D3BQcNq5f0y7TV1Z`3HBmCX`qs^zOc# zFJgfQDi*1hr0QHdKjEn$5_g04Hw@vi&llVHiWZlSf`3~&r>i|sK6&huTZ#AD>ej$_#TCg4 zW)5IfZd`BJs+3o*AwxSSNYFmq&tyN8%1d5s{%QZtrD#udEe;KdZ%|-27>$2sNIlGi zd=;m?O*EV~AO|!`rBz!_P3D3Njp!(g%PjdkS^N0kH38?2`AZ>*@VR@4|IhnYLjQf0 zrl?Ow{Ny7|QdWg=^%$-=#-A83K`ZLAhs3OP&N;JvG$5y8$Sjyyo&eZ}p-N7}ssd*i zH{vUnm{o|QcHyb!9R5K(8_V^(0Qu)NZ95gtuy?pbW~Jy*z)uNE&IjrWSM#pFHp`-| zgvCm^SJE8~rF*21ia!PPZJ-@KYJ)uIBV~nOQxgIit|r96c;YX)@%;*n{#ZnphOwyq zsBtTu@%C5k^d#XPY}#NNM+dn0iJync75ej7VD-N2t9+U}yYK4cMnpybo7iruJ0#haX3PnEHTkoiXo8Rxdy;#u*b znx(R)_rn;>uDm~{8_PDS+avqRAb9((@5wCABDS}=Hz8A0Bp zRnUPe2MLg(+t7pPAYtl>6;E|=s36AI^CvF>_js)_&u#7+qjSfr0KEuk#;B6nsSZN) zIr!)Y7%`;~ZTh2Dwck@8JU}X*0*hns1{K5}&WQV#}mceqJ1cL2VTy{~$qTp57)Bj(6=+_Z4^`yK1i4_<>$ zBJGi}2JuTvTvqjk7`$)&4H4ln;Li1m64Sd!LKB*s-L?C<}|NTH-t9 zWs94EY}^xM8`PZyEi@zRR%u&2q~XovSo?vt(cO3xY2476mFTpJ01W9z7PYJ$^|<{U zmYg42)}f!LSp|pWY@RRu6TJacUv#xPuAWDFbSA-a+F0k#XDVUX;y=1Lj5;IiN6K0|Pyg zutaIt%X9R_DOcB z0tIa>)N?KT@#m!w!}#!E>Rs9}1$<^5j?gy`o|qf2aHsQzZ6xdONWjI6D)a(o&p3a@ zJ*Gkc%+9swSezrm4cWri4>Wb@HYESRim`eoFY)A3{qQ}00_U_eG3K=h4`$;U=P=4U z$5iRv42XspZkYdOOKw(PN9SqL><^95=%gS@Xc9}(`$8A0GeIXSsb zW?7KZ7?5##t5I%ZBwr+yPRN$L61_7_-S_7ko6J{`qvg9^n$AzcMP7!W`7F%k7<@Sy zgG8hPnIj@dDulgMsEkydIhwHjWrti+)gT!rN}>Ff?1}$1aC;(J-SUPO+e4WS8^Nf# zrpG%V`{K)YIi7;;Pnw@wRiOX&faL`^Wud9uy?_+K-f%r7{9hA}w8)3eFks1n7;dCq zv>N)qHco`&-@Ov_aC1nFD~ptgDl!9SE3FPyI9g>A?SM2e!7h zbc!bB`ja(DIs08tf7pCCGuM)JZaZWByY&6HJHBR-NAt>0GD^6Q!oL4`DRc2_{IWxh=jGpQ(@iZQl~ zr9m&Z01Gw%5_rfS`)z#8kq8E25qQ5y0Dx)!Fi6Z*t7rh&Cgy;(_QXHU@}c^A`0RWx zrlFt)@e{JcOZUpULLhe1kg%-U{gv_u&xZl~F!q5w4dA&l5 z=UciseAX@E#hiKR%3uZAKIiRZEl!dPb*8d!7>RT8>j<*FdFy-`x-h|6Gox+<`Xz1t z+vASP+0t#+3*riQbK5%L#W%%|hM#^rKT$<oGVv7K4+@2CG-!X+EPG8<;fhN`PmM-G` z(%n_g(kG|1rfwdWx&7&jl#N>m4ud_FR3%^~RoB=hUq$uDxE#hlv7GXKxxn4M-QOfd zO2SDDV26_H~gS z5@Gkpuq2=@DyJjHt(752HoEd?TQ(69cjR(ZdAMVNeF z$?+~8Pjo$F4Q~8SLQCSv{avk0XoqvZ%A7|9+VQJt>|UA3k?dO=p}1}rtK9-GE;en9 zmYXz+<@3e_b*cg+Kj)yJDy9-hMy~mU0JY7d`re1avk2{_%ZA!Kh1Y?ib&P(M2eru6 zbLuW<$2K3h|M7Yi()Ow@ZC5#xv^PA;Csk2LH+$L)QT6-a!}|N>^6Ytb;C?C#oCg71MjwyxG^q*(UW>y=J~vfxTXR zMclv~b0uecDmPqv>{DFY+~Kq&>WOsu<`JeRqD^bA)JPD^l(v>^70 zm*Xs&XFpCvZG{*XxRR@nR^%MC(qHR-J^Tf4(ztn~@Lc~xYvs60gGRSZ2gafOmn5!2 z>Q53Pl)4MqM=(#2x30)&bhLgwNWD%BJRigLu?o{qZHf{NRaX3NUX{7r!67&qK7O7- zpv1+t0Kx-!l!3qF8h%xI&-G)TO=@9+YXred;|Ep;?8l*5LMgt3x>q!qoEM(=t`s;i zXA2sieg>LE9trw9h(6kqsK4+@gv;NxL+G<&M*?4MaWFoi4b5XFuGcwY&74h%-J1ZEcJ@bi-1#~^*kq=quy9t!1c6-2`oS#xAV)r(w;fM^4WRc zM%D7ZO-ut0hwW^e8+s_mT}J+lhP2b1S6s?YGvC%jicc&=Ud5G2W>}o%4$86}iVm#R zHG8dicMZH0x2u0KFrjrUI_BD;;?b_P=FR11!fDlyG{l)3l5=-utuaF-{u_<4EBTMM zx(L$}M&?E6yIX5cVaA6>YU!RgPFIYq>IHmRe8Ijqy|1oowSu43F;d|#Ra+Y^FTHep z%40TeJ^J#Jf9Z#lCukG5OB9yme%IH zLzJ;8DqHKr3W)6ZNymeFk_;ehZ1O8D`QVcGPfK3z4nQz9oD3cxPNTEJ85DRhF`7zZ z&?Djh`7v-JF_;vDBAFT*A;~240TZ$z$uJm!2o6FR8ztXZQ-5s`IfjIj)|WMb^bnhcFG!&t^LW6K&MWQ&MO_AT2aLWvd> zBcf4mZW7l%6+-Cd`MKvg=jplUJpaIR?m6Gj`JC_f`}({;-~F3vYi-KUBf$dz06*Hy z1Os}#edA)=Z#ki82s(CeBP$~Spk?v?z;S?e77E7H7-)QTbP=pbr{-jJ$Q8lq%^J06A7+pxFkOtuZCy-lh^OYM_-MNbY(-hSWbj@&b)7ka5jc19G5>M{A^g{j1ldPA2?+upaIG_}LgwwkJ;+2Pn5;s(}s>6ikAGjyqCC}CL zAYFd@`Qyb|yC%e=0mZA7!A9|p=Ou+gc@sK^s{V+cn}KJBmu@fL`?EaA$6$TK zlA8MI*ijKDkB~NpjDkeDSzGljf6=6C&v03lCPpe2JM;9X+mj2*AEHd%ggjVR!RfPj zT9}%AQ)eiHPXoXmWOj}M0BW-P#u8C!5C#C86tszvgIRxu^P-1{x8N(0S;0#jax%h6 zhfpTa6Q@j7WJ*{yuOx(+pae&pY-h92B(W+Tb7^q>!Y1@6QP`HHw#GrJ&A6e>(YK+^ zmr>j{WH4ft-$SG<#G+$c*6F&s@L~F+qnV`#J{IxAA2i>WAnQNv8_xvhvB!HpJPEE4 z$@-#l7%|XW2%$;^Fy}JEVL-^${&&H}GhOl#Hs4ln%iSyVXKM8tTo`b8|KO>SC9mjO zVggF$OkI4$PE={Ja1*pvQ5!0+=h;U;m$PyvzGh*9^>P1hpG}GiG1I$VXv;8dZf7_h zF03mZOYQl=!S~iMq=U~wT3A^2+BNRIGV z+dQI|ntg44+*cWqA*{@cYs;o`=i5h96j7bs=IdXhODKIx3Stt1It_GOnqgxVt&Y%v z)Xd2)@F+=4W)>NDG|QvL-I;%Q^y0$=ByUj?8Z=Ud0Eu+0}1rrsPcrpC1qr zNzdmim;D3!Sx-C1$S9}p$!2OLw*=PB$CoZe+j2Pjk*FNiszaFe47xUNiJ0E#o6E;a zbPJ>$V|)_~3b0mdE0-HhFIdsRSrstU%X(yXrAwX7C0%VeTJ7r6Rx>d#qD88%XV>_3 z8;2@nGWYCYvK;idB!6IjSgvrQs3hBGexoO55PJ9c%VmZ2!0nlGZ^ z!fdN|+x_$oyUeK^N*0z72`P)wIKtF#neT~tx7LcBO4!9}G22=V+3Am9BZ|54FU6TP zF0pZ$I*Y#gAB(l)yAUifD1mtGpJ$Pdxjc*F!sb42qj_vAU^f*XJ*1DUX17h%o5WH0 zvyCdvtq*a3eb!~F#3)~$c;n&1xc0SZP~~tEeHeHRIoF5@Q2LBQn?oy|V0D>eTJxre zGPU-$@ikf%5Q7no;s4Ni`?2oSrK0WzgKb8-P@yh{yHk&Vb?kf&tj@X-EHWA`FNQ}S zFoIXm%dbep+MdSR^tLi0#qL_X(Mrm^5PooUkV2iDk)VB=AM36`bFZgt@gvyo6B<-- zTlJZ?{e_OGUgq%l<_P2Oei)NS=NmWSp>n`cp`&Ime`jxv=i*D0tk;KXau z-v>5EEV|H){4i2br(F!9$JGYE=2xWBO=DvvqfE5$XVUm8h+Sm8@=nfE-v@HA(CbaP zH_o5(pQnjSOv$TmJ1>7e9VFPMuxuU@dt7-mCkf^Agwe?kFYuD`5--sSRH5i3hSZC# zJQ00%7IR9ynH8yz?Vrqc-7BHRb;92E4?Z0`@n=~{dvSLQBZezr{IOd`*PM19;R=3l zN#kC^bLZWxALpaA8E$$!Q(i=dfD^#Ao*tMfCppbhwsW%3eKoOF)=?>$-(B2r;2E1+ zSB3{Q{s3i4ud8fC@?E^8=%8{2A_mP8zN6`Gzs?@XHDiI^C8dv=um4vP9uplM>ptc*cBJpvLzQ%Nx{mnFLU0;D0Yko5#GE&d`aZl||cj}igMadq@ zQ1si4DgCHTOPjDjNgVsOf!XN!K#Fwx8u%xjq@rA?UN|ZNi4P%w4p4`}bW~w5RhX88 zIvfepM8edSp-?0g`u1fa^}hlF0=-DY$p0Nsm8bgx3^===ff7ihhT}pA06GBYO|Zgw zlkk4hnrd2V+NwIzU`h>DC_)vcE^PpPRrw<7rQ~d+IAw*ml2_HzNK>o8a z5FCz(_fp4e!8Kq6ypFae0gi_gp-`e16amL;XnU%G5o+N0W`z{k!3+QzWo^=Ed?Ddq D&bNIk diff --git a/website/static/favicons/apple-icon-72x72.png b/website/static/favicons/apple-icon-72x72.png deleted file mode 100644 index 1992e5213189a2bd864a555dbd70e74cf130b0b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3797 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 diff --git a/website/static/favicons/apple-icon-76x76.png b/website/static/favicons/apple-icon-76x76.png deleted file mode 100644 index 69ccd37b219783d90531a121b7b45e11a0210385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3973 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 diff --git a/website/static/favicons/apple-icon.png b/website/static/favicons/apple-icon.png deleted file mode 100644 index ede631d45f1bfe001faa816e0ec19d4208eb3881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13442 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 diff --git a/website/static/favicons/browserconfig.xml b/website/static/favicons/browserconfig.xml deleted file mode 100644 index c5541482230..00000000000 --- a/website/static/favicons/browserconfig.xml +++ /dev/null @@ -1,2 +0,0 @@ - -#ffffff \ No newline at end of file diff --git a/website/static/favicons/favicon-16x16.png b/website/static/favicons/favicon-16x16.png deleted file mode 100644 index d4ac65e16797967e31eaa2df70c3bf07068ad774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5)F&R` z6XFU~V4YbvijYI#|NsBH_OzP=gC@Ep$PXCiOe($+Axhk?ZnEs+a_-Jt{@RRMCy%P? z`h9cKOUbkH5Rx&IWRv%amM3hJ0+4Jw-Tm^KFHl+VYyMK8HH=B#?k+K}ZZJ#-aySb-B8wRq^pruEv0|xx8Bp+v zr;B5V#AV(7mqCXd1X`9)*D(~IkP`aDsKd*~F~E6>w*#xqf#@fH?;qw({O5BvB)q)d zg=Jbmh0#gTsf|w(oGK%Je{c9|Z`1EAXZh>CzB?U}sd>X)ea?}Mg&RM7 z){YVHUY&j4esk$p(U_;#HQC*GwjVnG@o1BFz2HCl-8Us2_H20@4)m{TiEBhjN@7W> zRdP`(kYX@0FtpS)G}JXT4>2;fGBmR?G}1OOure^XezLg)MMG|WN@iLmZVk((Sf2oD za0A&;oS#-wo>-L1;F+74p6Z*Jo|&AjV5VoTXQ6AU0JPFX*T7WQ&`2TB&`cqtq@=(~ zU%$M(TrU%(8i;|a_413-@3g%I8pt34GBG5hG&jl0$|XO!G&eP`#L6lFsI-{DaQXk; z`eCdx65q_+)RM}A zR0goC^b7LR?Kg$_p_$_w0#wCdXlia^U~FV+Zq%>(@;guoKax4YnN_I_22M^>7TLW4 zN`)awg$8*tq-Ex$0==)Fn^%&PpRS*lSeBWbpI5Aph#39E#I)oTqhxbq6T{SGOAE79 p<7DGB1B0{_15@K<6N@B0pbkBt`<@7@vjA;i@O1TaS?83{1OQD0x03(> diff --git a/website/static/favicons/favicon-32x32.png b/website/static/favicons/favicon-32x32.png deleted file mode 100644 index 435a361f54218371130a047d0e40f045478d0431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2057 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyacIC_6YK2V5m}KU}$JzVE6?TYIwoGP-?)y@G60U!DAm>|}c1o;I66PkL$gxOQ3_C_l)^MrIZWkuK<8ad{) zba-VPscfwM`RlE#MQK_ViH~e^qknzhC*q(+g{pJpP7Gwlo%e zaC>f8nVgS%x0z?8lTL%Afs3{(Tf1Ufn|_D5M$^YejXhv#p)C?B-?lCoE0wSq*3uJg&*`ovjZAJ=VI>Y(qY*>s0R z5$JHnByV?@bvv^sF9&is3p^r=85s1GL71^(seKtR&9C=#aSX9Iog4fzUMNsxZnN|$ zhOW#74HLQ=H9B@SY*WaJYHMB5sWR)qJ`uN!Y15YNOz950wP@wkrAPnYkWN#(82|qC zo$_b{i$4{WXKy?ila!dJu{R(rE>P0c_gakXkMC)- z6}T3yvJ%>L5Z^|X>pRslhckVjheQPVo@UKCrYWLRl`|A?~BqjwqalUwXOK=@uPv6bm z3pVy1U-|Cq9sL$v58sS{4+>ul=FWDmFuJ4O@!e-?yWGlUuOHU>tYmLL&0+1Imf>Le z&QthhTKn&+c|tF4-q~~GuH(x2*V|64&CEH-el{sAqVw9Ss_)!vQJZE?vtH3Tbz*3d z_XkU1})oPjfuC&N^U;mw(TK-<$Ziktnz>==& z#=yx823AZm&p+Jg*1Dc%_E=Y{I~5bo+HHFnQxK^TR1H@;+Xh>?Zk#TmKG;fKhIZfefLd>z3|Yd{e{VQAIj+5dzN`uGU<}@)ue~46FzRW z+Oq5Le|hm;H`jT+F;U-{a;fgFp8n3gwR%${?2dMRlU{t%)o;r|8D05GJ<}5@jDPMc zPn73f^M;>kTJqADVpsDvSzP#4|F6if?Nh*uj=OeD9>FuOHaGByE^bfz+4XOVQ0Zj$ zuD#nnTnxPUZrYV!*1zq4=l9YLnCbi11kfA>nEE_P&DM`r(~v8;?}TiiuDPg z1~-rm#rbI^<%vb944%1(>8ZYn>6yvd3TArddKS8t3P3AObPY^(4UH564b2oXN=gc> z^!3Zj%k?rrs(~1&S}(sS{Z89kpn(h$AQM9}N^_H}tX%SwOLJ56O028`fJ%!Q4441k zt&gS#Y^Rk~MrvkyMhSzVr4c_vQ7cf5IFdO~HQ|{lB^e+km)9tA0F_80De=wBO)aS` zNM!)KO1~g4-F{P;ADTJ7AwX3OhNk8w2F6CF=0^RhFTVqo@FSTMoLQC1VBq95Ws%(* zpi~%=RA`VVLt17|D$x7-xp^fy`RV#;iDj9|`FX|qh=|coOiW8oF-kT!HZe?1wzM!y pHBL58GcZU?F)%ewHnB+31M1KNy6=ggIt$PS22WQ%mvv4FO#taZBv=3d diff --git a/website/static/favicons/favicon-96x96.png b/website/static/favicons/favicon-96x96.png deleted file mode 100644 index 5aafae0f5e220f7c268e27e21d99c9940507cb30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6350 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 diff --git a/website/static/favicons/favicon.ico b/website/static/favicons/favicon.ico deleted file mode 100644 index 89b7ce2edc874c6b5f88b44c290b035ca42ed959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZA1NiQ8x7=YnVQ9=nZhHD-ornZUHlxSj>7($F&EU>V$uo4SDrT?IRpqp;GuIb0N8XH)KeQj9694e5FVF~*kJA@+GW~@g%U<|g| zHv;p^#-KDG*K}^m#c~|~@h?{|>>H(R9>(j3^9%cJH?DodFjgJX82jBlo8}NHI&PJO2Z7aE8#i0_wSg+Pu#)rp3624PzBGb7Aa>-&tMnzn1=gZfw?up zz30y_|EQ?YF3;JRzNc?!K{Gz01IFt^{{D=?-!lJWoWu3XkopSm&${#9zaP)|DaXC1 zxt5-b@7TF%E%#xJ)HX={4}QZO9cSPB_nYFHuWOo%@5y|9C!Uk_c6hgM{(sV$(QX{y zp6_NI-i!B>?#TP^hGWvSxGRhJRUC2C6_J_XJEJ+`>owmQNI%t7W{{!JF^+YPb6)^y CC`nHM diff --git a/website/static/favicons/manifest.json b/website/static/favicons/manifest.json deleted file mode 100644 index 013d4a6a533..00000000000 --- a/website/static/favicons/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "App", - "icons": [ - { - "src": "\/android-icon-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": "0.75" - }, - { - "src": "\/android-icon-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": "1.0" - }, - { - "src": "\/android-icon-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": "1.5" - }, - { - "src": "\/android-icon-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": "2.0" - }, - { - "src": "\/android-icon-144x144.png", - "sizes": "144x144", - "type": "image\/png", - "density": "3.0" - }, - { - "src": "\/android-icon-192x192.png", - "sizes": "192x192", - "type": "image\/png", - "density": "4.0" - } - ] -} \ No newline at end of file diff --git a/website/static/favicons/ms-icon-144x144.png b/website/static/favicons/ms-icon-144x144.png deleted file mode 100644 index bc49781eab13e9eb0f7e135e02c85b212f74c08e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10858 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 diff --git a/website/static/favicons/ms-icon-150x150.png b/website/static/favicons/ms-icon-150x150.png deleted file mode 100644 index b70a1eec6bb6ffd6af300e7ef6df2ab74b899bc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11569 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 diff --git a/website/static/favicons/ms-icon-310x310.png b/website/static/favicons/ms-icon-310x310.png deleted file mode 100644 index 9a18c173bc35677d6d82563551d4d6a6ea236abd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32525 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 IY8m-|0L;r}bpQYW diff --git a/website/static/favicons/ms-icon-70x70.png b/website/static/favicons/ms-icon-70x70.png deleted file mode 100644 index 1556bb13c105cb8b4bcfc45335651a8c865f6dab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3729 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 diff --git a/website/static/images/architecture.png b/website/static/images/architecture.png deleted file mode 100644 index aa6dec8b2f2e028545e6687d3602bc91d963aeea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76137 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 diff --git a/website/static/images/blocks-storage/architecture.png b/website/static/images/blocks-storage/architecture.png deleted file mode 100644 index 21b1d8ff68bdf5e479deec2c82ec2bd952ea717d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72709 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 V>yOY5F(AN8Tv$e^SU}I`{{yGv4;ugg diff --git a/website/static/images/case-studies/bcloud-cortex-homepage.png b/website/static/images/case-studies/bcloud-cortex-homepage.png deleted file mode 100644 index b22f99c738ba61f822e3c70f8b074c432d99ad98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77478 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

O$PH*z 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

*n)3p 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

Y~%jlUd3>D`kvYa1*eh@?6Mdk_h;z7gb2 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

B8Pp6jt2Yud6YD4Zz%I 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 oOA1_F63tcX+gH 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⪻mDsN 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 )RLWzvid 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

#ui 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^Rs^c`4bcJ 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­qu=Hx#s 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�su%!>beDZAk(}J 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 LC`(sKnuh*A%pi!# diff --git a/website/static/images/case-studies/gojek-throughput.png b/website/static/images/case-studies/gojek-throughput.png deleted file mode 100644 index 1d99f1e62b59b7fcf1f399c9beb64a885947f0fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33763 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 TlASo?^M4g&Rb{?NL4y7tknMsI diff --git a/website/static/images/case-studies/rewe-cortex-reads.png b/website/static/images/case-studies/rewe-cortex-reads.png deleted file mode 100644 index 676c3ac09305c850d81286815525c3c9bc04eb42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194990 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

    lE=-A?QR1Gb#>mk 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[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%0Dqdozta>nRE0*by1L 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 Hr-UW|N;gUo diff --git a/website/static/images/case-studies/rewe-workplace.jpg b/website/static/images/case-studies/rewe-workplace.jpg deleted file mode 100644 index 9fb02b9314626f83c180740bb2c921b923cd1ce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154664 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�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 Z6k(PUk?5}Ds$MZOjR6g7+K_)&{vR+dU~B*Y diff --git a/website/static/images/chunks-storage/schema-config-periodic-tables.png b/website/static/images/chunks-storage/schema-config-periodic-tables.png deleted file mode 100644 index 816c0b865efe607f9ff695c48ebfa33299efdf12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25483 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 Rpub=*X>kRy3K2v9{{fd1G+O`w diff --git a/website/static/images/cncf_color.png b/website/static/images/cncf_color.png deleted file mode 100644 index 6cd54c471eb5baf8ee800afd13a852b131dd1aca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40699 zcmeFX^;?wR^FPimODtUi(p?fucQ?|lATA9Gf^@S;BP}H@pfoHXAicD7DXEk+NOyj2 zpRf1N-@o8{uD$N-=H{H4IdjgLGxL~<*40+U$DzVOLqo$?S5wkQL&HL#p@E&T(Sa|^ zxjBSrXy|CVnuf}%uA11`*kCZYrKJUU;^5#wAdr^U*72#Ifq{V-7#Q6>Jv}2oe$4%n zmX^lH#|J(F6#my-U0wSJ2GG&bRaI48TwLPg0 zoyy6`$Py9~l9Q7oBcmuODM?95wY0PbmUoMbi>axpv9PcR2?=?5dFkotBO@ax<`&r4 z*t~jwDl04V^Ya58JUl!A0hpMW0D{1uw6wI9m6gDM3knKkWMp)7bbyZlM_*rG1*dX= z6z~LoxVX3$78U?0;QjIA#{kEem>7U82n6c+J^;*uh=>SykBW){NCBhR+1ZtplPD4i0wh{^8p<4R8RUI5D>MrWe!lInrkH>;k(@LS{~Id@$F5kJD(bU z=GOfH^aG3nh67Roe2t8Z+}zxNfdJFz&z}RsSy)(rci;!;8F(JbCg2m>n<$ zV7|Z}0H$wXV9?pw1&6}{nK?N*fo_1P!0K38Sy@_IdV6~VD+u%imWG6cq-Jrmy1E*e zBcKyMKflg_p-(fb0Qb(dz0Y%hfbG<@vJ*GV;PVt zX<`xJ0)xSVf`S0$aBy&x%&q}a@$m52+1UYd0(c|IC8V z{gr1=(W_@t7Z(Nlc{;2*dy?Nm76QfWThn${NLYI-Q==M-Xws6YQn+78jfZJe`6aj$ z*A?(R7aBLW7mT@oR*9(Q8A48F^_%=!I`dl0g;_?avqy*3;=VwKBTDA^aK7HEVC^ zwdRZB9uaK;?HB%T%~SJlet&e#(oD|DYVbeUT?`cI&&k@~-@PZgC+-)?K1lLlkxm|M z2|UYdkL_WOZj>3jxCx{KtTKLFSl_Aa?R&LD7v@e;rlYLerMdi1{~EEx!}dco+QZVr z&9lp^yWrc+rSLn^tHF*-dU?fvjoIdV2VQa2KF;L{^5)`X>0u_A;KAiM^+BB!8S$@C z^~51$ryv#oQB!mP8%MFh|FOi^LS-U^fnzUZMWcnnnfPCiPf*kUjZ=v&gqkw`Uk@SB zYw+|q(4yW7fu1P+A7wVU7K-X$l=133T<84HL4V}>uDj+>mY zd(+-5Pw~ve$X=JQUEt=9-5JlQns9Zroi_Hz6Kt>t3-f7*GQ3?26mIIU-0$xAjkMd+ zFfj?-PcOMDxs9BezWsYK%3H-VGAh`+O#)EwLC-`y>Iy^L9Xo417C&#(nvt0=DI8Ms zYg;Vsh*ol8-lhw*c9^P`mC8mTfP3U7C!hQRMGmg4{}c(w5r;>&S6_%O|8w zFWJY)*4S4*MOiU*267~ZtKO?05(NZme&-{lJKoDgphseW76k1&+C4vsrJp>VDJ?E% z5*Huk+>x30IA3oRpdljjeffYc-rjWaA__D9wyodmjjv+y4BtciWZ4sBtAcjmeyW!J z%a4QJ2r8lzv!#?5$=%PquyJmBT-GRVq?OpLpLCdtRny$}uCzIp-aY2!gDFj0G_l`h z>4O0Nw|{jU1H zoJBlSL<&mW|NMH$WO0v!uGWHuneYfZP?d6$DjuLv85dC^mo4z(8(;wz>)EhzriPXZ+-?U%`9bNs zj>;F<5!o2O7yD}OPZDU~sDpoZ`olhC0Uo@`moRZ*!3ybsX+LoR& zkX^<~_=2j{anlh=kYCS@_KO%9^d=If99|DOa*FwGO|A(Rx9NR=@xsd%qz58-;arh1 z;Ek!6oa3P-w;vR-h%99)@t#zSVJt2*tK8OjL}fD@F_S|)vr!O0=z!~p%I%P zh4Hs7v_JSIeZY)c^lI~k3ysm$fj3V2WUd?=lXgsw__UM%UQe>7N6Q^1a^TFyv%=Z& zY1N-waJ;bg9y$_T=x~wGoGIXd*Btc_$k;)gzQul&`<8eRr3bnpMe@Qx-MJbBz9rcw zykN#v=Pgta^Fjfq1eort1DGJg0h*Daoxoi$6fGp=@w>kletXZDSTxa8i%lrE9- ztBSc7KVLEMb1ct1P`ZN3qZ7^C11{t=M2;h((-5T|f%D2%%BZVq{n!NR)(TwHr3N=J zfjO#52d7jjoc%`qdz{OHd#O~jaNT(c_GL^11}#L71X=3AQum8va-3L{cckg$GJ_O0 zKqqOsz4F5pWIvNG;Ju;IFu7BCME&?Vl{-?rX+@SnCkFnYR8fE zVN_UvHx``9KIL~}ed^RP+$oi6IFX6c22W=q-!X83H+UQ+gEO>$%CE|lnN|oV&XOR7 zt=}ld<(7qwd+wO0aZW=jg1~)Ar`m0GuczkRi<2gm4I!EzB2-)X8R4t*yvy%@^E<%J zQP(2%5WM~0G{>e5!+O|pdm(;Y39fd7#I&H`3aA)%0VCYM&&ox@h){iozfDB)3uI4g z;aQwv5IS?4o82&xH8@@Y-2Q?j%_)_hZgdmGcntp1pj8^cjh%5&`on;1EZ~Wy8ES_W z4tu##BBg(okFKyfz{s4+exW6bn8v7t`gjJoXfDxg-+nk&XP5S(#gh{`EvrryM`K|MfUR^W&MzhTrF zdOOjW=2lt>w|-{f@feoi!(Vi#-&xZxvSSF*7EDM*sjnZil znm$M@Gc@jnV8?Cp-YgN!bA#J1l4+TREA$oE>y!^_2+HNcT>u;NgA|?ZiBpRmA1K2V z{xWi-?P_b!g1+)PXrapCJ9&IC4a30GT>KA}H4JcnIeCsQ7a{4D=f?#kT|8$3V64nrKVFxY*@caS4spQHZT$U-deU5s? z26y;voWP@cCQkRR?~Y4#y~bz_{eLUVN>hn$0+Gh2*Wd4Y&S&`yl_qWG=4e_fp7JV+ z7^KPs`m<)t+wlAu3CuGM&j&gLW-FxdFnnxv#xMmo76hT^Nw8Q||GnBHQmJ-FhW&Qq zr2gM>y8Y?%X!{V6e)_q`1gnsQ;lgJ!sOzxNHZ z1evKslqwX>jAcC|N0vcnEn3>J{abnNh`6h^XG*0K@;pw^o>P2fTYj|s+tZl|UvdPC zdl+Z7)$~dXUv#pNU0(}0G9o0%yoMY{i!_L)XP&n2V{%u=--S#@QApclTTpo>qH_|) zt>-J1zDLC3IFq=o#cw~4`#-8!jQe%sO!%_qwxJ&ZyQLBjtQ)fkujYF1JH%skR7y!^XZ$It4n|jtyjBKQV44V5y4w@yx9~bxs_9GC@<8 zeL5T{)dDsa1%)0g_pz*jp3GqSJ3C-_`5=yz9)rgJ?KD}mf$G;}jyB_QqLKR6}! z7Xkln#!XQo_0tIQ-=f{3vAmYaQNgP!EK5bQ!JqnrRGGtV7Le0Dt%$jQO8BMf&i0S$ zpn9$r$V@dxi3+U?gJP@#VWf>Ja(YeNK=b4;_HtqcArg)I%{N;%>}zjv^gK#IBriOIfjnjP`VrnJb|Z@!VZnrX;Q-_ z4Q!!1*W?~AJOl~QqS|=3mN4GygO;!{IuH*h2k$~3fh1q;N-@Q;Gz+SlL7##fGzs1c z75GRPm{P!=LT3}k`DZi$2F{WP)_SPhCjY@~u>$8^$6O;&c{U13Rr6$q3i?Uz3OvTJQKO$O6Claj!tdk-Rtn z6y3I$V~h$fFs9pAeE;u% z{9EPmlAPpj$_Z^ja>JhT5Bp02e}eIo9}Z9PS;0Zu2lw2N`~Beij&}imOP3cf0ef1B zg_AARwbi#|t%f?U!L8nP%-<53_AoLwCNMJg`nl#N1lQQ8aKg=~fwTrZ8_5r+1sVJv zuLuzb0gIiBsdjf|{67iQsNI+dx5cwCLRSCYP@Yt8B0|u5%qdQT@81UpoUbfj4qc>D zUY_LL&@ays`G|?#Z;W*ur7rO^z`K|ACE{S)?9>5!KM?B12vvmoufD-Migxe4$ zX;A2HncVt{HfGR5-!^H}EK~KzHIP*`?seWnx~!-;-ZbLD8Yad)*8VVw`z_>Uz>e^f z1MEzAZno#u+}*lpP(K1OV5(fD7OLpCdbODs{O*GT0^3C8`Qx2;BJ^8o1%ti?yYt2N zH`h;>0xy2sREv)7p0TlawA>F2l-1>lbTFzJ@;7gAk`96Gc!A@1;eiR9#?k${&r)XY zD4V5s@t83`e%fP%Q;N_RClzrT*n&>}ZY{N}AYS9%_K2P9abzA5M|JW#bRa5;SmJ3l z1P(X(WX`N{m1s_0)+QpNcLTCMU`AP_o4uSop31u~$Nl*6!}@4kqwzo#W*V( z1Ze_75jJYOk4p5jn|PkK0N|GyjVoWziq`%9-p@~>F)4h-&c#`_pvX)_ctd9LjZdLX zVgDcBA9g>)Lj_&$^e8M=w=y2$O}Yd zOvpfE=}~c8p833B%l+@OfdN9+;IrS}GsXK&x99h19Xd1HkFGAhJ4#Aoy-j52qhu|^ zvp48$Nb%O{A$ZcARqH2#o0-Dvpg*KX-wh@Z2Kf`zANV4MOzv*IhIBjggxYiIzD4Ai zTx$aR!!5NA6ENIf<{U*K%o`P+2m!UZUg;R0Vv8aH?9{*hDM;TuWm}LLL6P+kzf7;9 zT#7|^nzVOI7K9UCb9g4J7xLjXei8*tsx>?0ZSHl*W2V@24A6)AR4aya;f8vr%b&UI z9SfPx2)<6Uwt-#Mj`Puov<46MRMkD1mQa`n*=Lt8X8K!C&1Qc7u)(sbU%QauM5-GS zoA>93y!fa6UGG%!iVHZ*w6(H*Z+h))w?pzsG+oBG>eeqSt}ujw``cp@7|$;OJ9{g6@#nBRC8(2;Q)-(SvUJ#EyeU(4n< z?flA-tc1q-MAEc5wlitESC3UKoYm9+>0byDcHYE^U1JxGRXOFKkB?kSpx^A$9~+0F z9op8Dc1T^6i%K@Xhm_Hb`Qj>qzcl3(Lj}QXpNlh)H@fWz=*TNg0{F zrF!oSJ2x7{IF#snrkJ_On>8B}%?+8fDrT0?xY@OrW`@2(OY(A1uZyHXkK$U9TxOZB zGQS8eAGNP;^{@UeQL-!x~h%^Na(B@FpNF>^;`@;zN=71_fdH(;;ip(mr(+Y zIR$T0Ti>?$Du*^)5Sk6Rm-!gKzH;^wa1qgh(0woM`8dVnyItVl6yIUbPULawhKoJr zZQT<&1aveY8&IaCV-iBGfu06&vM}_5)^3T{%;3cg>@O_q6_M5a$&Lo@ibMpI1C`Wq z;pD<>r13|a;wf00YN@-9X}Mzi4HeC=w3H~E3>7^TtQiBhqCxZo%F$nzV_)ify&<*-$GTmx|Xx0m@E zCAn|2usI?cHM2`LIpSHezgrohxLDyd2DvVO=Y;9nCjU-i{#&-@m>`u6#MKYhc+5zj zw!tJ0C}jY;up!+ii8!p@Q*WHD9v@DYS71z-RDe4ju88Y~s3BiRs6Z5kr{G%F6dI($}%a-{_2*uatnBd26`fKS^K&{PkaQ+s>to z!rpqzJOz_WpVT`I11HjO*D+Cuwk*yGyhtJqlC;ZWT@!vZ{Y;MkFRQv?Zkm^i8g!Oy z3XB=K8_4RpteSiM_VF(ke#oATUXjyHeTlb@7vkQLc6jg01#>{_7BealF_2#%d5J4Y za0#9$zVHNw4j0#4@8*tyu>tjP{)l^+wTRSzt?ybWGEG=>8+u((rU2zvlO6sVh zQ%JM!k~YTY4145t^x-x^G73tG__i2)6!A{tFvoW}j0pMJ(ljYJd^hI~6PrwR`lm|# zVrbpE8Yh|}n60W#IfkHWziyV%wU+OZ*dt{)R@Ogn?9brW~8_>IXe^dep zWHy#6<~UB4z}f=J~5g23KJ`(d~}CrR;4zNdvHmP%JK)vIE^$i2q3MV+;k(U(2f>$&iCk%19d> zyZLM~=ungGzkm_LaLez6EmnGb zL!h<=!9&U32=;A+6!O5Iz7#h?ye;9HH8VXS;9KA6FyvZjUL@d#X4quIV!j1S5@dw7 zuUn?SlR%n|>-H5PjC4?9X#+Xp>SUiCyD1I8U*dA!$jpPiDk@hT4#gH4{M4;HDo4p)WqZTb7FFge*rP$e)Ai4WlnK>TMd-ZrjtN)Eh5mwQ;6)F zjsae@9y%t>NhX>*ZC2zD8mp;SDz0JfF(yJu2j#sP@)kXdR2~&y`b2`&BsanX{q?zF zFU5l3jR6`EdskOQSw;O8tS6HC5^bPN(#tVxZK;P^QA3ICOHeBhtctaSsY0rg+Y)#>hGU9v^#>K z5W)fK-B#!2RXTKQ@WxGJ6j^t}vX>n8niltCPL)3aobSN|szBVcXNF=%R{h}t*8EG~ zBAHB?J1W446d!+I!Lfh^&R}Gp4P4lB^$uW~sWtVaLF<-R<0OXy@sUd=UR>)5v~T&~ z0ySR}3p~OD)Y*moQOg-L3MQID zqqcRd@KVQ{_L5Q1!6i>5Po_Z+Z$%x81~_6Khc>m}rxQc05=&G+Y*1S1DN1x@D8*)( zS~SBCnvbJ#J;fP5= zDf?lj6@`@5%}`)|`U}1$LXG*<8cH^q9pyt&rwyKVtSS_z0`7FTv3j^wDHE*hsmgBC z_3r>b@sHob_88gW$;{xYIqLD!C(7jFsuTncrp1ZU6)!yykjR|jC==oC26$no-YSBX zIi6Em>!K_*P-2UPKgr~8FSDb0Kn6AI2+>zywvA@CJ)suwjh0d=6T5#K^+x@7LBIB9 zwihU(v5cn8#dZ|uIk+9)mwYMw{G_0RLZTf*N=%7AmYscXhvu@zKR?A@8#TAt!ubv+ zr~}!ML+qjjo=(YQwhO4pTONVq-%RK+L?hUCH8FzGeE`XYJfPi@@Dx3V#934 zL|(r8fdEw;ZoC7wcYgEkK*N#BqflS)-F$;iUiSlhHp3P6{aAP4a z0v1?ZfIYezMBv;#NQ2>9i?vgOW-i_vnua*Y!fOAt6$HnPHUkwquW)o7spI}q41mu1 z4=55pCn!H9IHZ%WmX&lLMP(xj(-EC8Uwzc|9|B-mWqI7&OR&G4!Q<$N4@Gc8QtSvO zdhc(;)KQD#)XJ3fN^8E?McN8(!vUBe9?(*->>+N<8#~vYN(9AIrM>ui35pQ^C_a#V zo3rAWWHvIC>(Dxt?9>_BBqWM4uRO<;q%CgIMe z05D;io^axCcBshg`#Byx-{<5!`K-$~yC@C30KjK>osE-`*B5c_$u4TPLbs}kA{~*~ zD=b|6?ETEsnS>;y_(hm7NR=NHYF%p*Sz%fn4r7PE`XxQ68bmPbo&SE2nXas@sYW+3 zOzJ^LfTReQN^Lq8OZtWK{m+WP7HHeI*I>D)s0;bQ#bEUnDOYox3~wGXtEDh|JXgLW zR(OyzwI6g+8O&v=AsLNNd+%7518@@reW=}L;=*m*xRLS)e^HJ!Pg;8CWiJ!YZG2a0 zvl#OttekI4J&_8AChMu9vpzsugTSMR%yIbCgY_I7lt??o?zVg>S+lB#`Xb#1w#r+? z+6PDTfwK5SW7K2^jVMa`wh0rTC!G`$Z$M~9A+dt`mBnr>k3=&l$zaYE0;gP*p^+{;4~NI?*fd=#gi$Xf!-^N#QdSz zKTMX4H6d6N!{5vczq zm~GI7o%_8c$o_$9j_A=$5$Yei3#;I|=0@Alm<-vTdEua4D=pN777AHRP5irf@jH&` zh1ZR~gmMy^Ud!BmR+8hS&GScmGX|Qa|$aJI3)1 z4Kev)d#_tafh&f4yBdy<$9E1!!8-%YZ*h)`QBpTM-HTyc@6P}Hef$Mm{4d1V(%FTv zIcwQS9@P+TNRj~dk}CJ0;v9wSeTy3TBguDih<3yR@8>1d2h-^{p2E9iDktmf|6`bu z5)`ROWzPGY`N^_kRmI0QG0YyP&zMEAoVH#o-DdfB;d?JHRKv}-ieIT){Q!^`(@8xi z-f}$SzH5zmI%3zi9UujAWYH5DA2Eo9c=qrYL}!g+X$TKXE@aR7z*S%Tlp1SAepMZ{ z0a8LKu$AEC)zHp`-a8}#=Rq7~#*6#ia{cdy8g9nY%$(ZWZ;SO`qDDaWx6|tDkN0Z= z9Iri#a|Z<%;p(weFvOJuwARObefib=ux9^S+i#ptxEVWf)JxdmNA`P8IFxeRQilnH z0I$l~7Hv~O3_=nea8-`#wMvI4(T`p~WYQp`v|lX1xCs-_QOl6P{%n2vyND&N8%X^b zSCLp(G3hzBv;2v)IMXCN*pmKNum88O?$)GK1}G)o9gu$M_nKBPe(Z$0-%h2|<%T~i zO1vz;pwvR4+4SGw?4mZrNDj9hi_o6?aL^kw#6z+tqt_;${LL3|pJC;e1(<}UY1UMHb+^mRWCAE;86P5o}lwpvB`oAdAR$gTayyIZ&q86xU0ul6^!VzD#kAOWxGF8RY7N&DU-@}!K4(kTwH z3IC}%cSo2>dZ0dEpzgKD@u+NPCZaG0q4RL=tEY`>DxO|o=7WFV`l?6s$+wP~1l*8& z!5}%#if()<5dUm%WXzd!owNXVKH)$s#7gp#myRyqvrm!OZwg50>ZSZ9yzQzD`J;>) zyRDR4Cvx5d+zgw8MiU(`b$g-75VP$iiU`0De*C8CvyV&#%}^WQ$_h-p@Mj=nY5^0ZadUXYSE-dW?h5;R_qu#DFLHr z2L~NgC%H$PEixg&N6he9Gv4pjoz?W<)Y3baoWV~^YpZi407In9Zxyako7>X?2NpO? zDEpIG@}{ZdC5Dr%d5)6p#LwSLKv7bSBxF*s?w>;n^Nky1ZpayVcf)`7$oih=8IVdd z23PygW%NWM@~&QUMHW2?8Y6f@BnuY#E6uDc?nGb0yIkw36@~DIu`N5W!(9~dQ{~<6 zrv(4S?$0(~pOPty)j2>fXpn`chNJ}v33O8GU2Sc|Eu@ZbQLXi)?5Ea{{lc>! zCx&!?6gm`1k&_l%>2Ej$T%Va^Uk-Fk8;HlI8X!r4Y5IK5{9sd@82{0b;?St*;B|Mm zR|ACRFT|;|EUAR%;nc$LpZ`=D=NF?d_QM)_LW6AFi6tdI#1T}UZYNI~wDNBe0kU*= z=J6i}r;KcamM@+6j5$kh9^nFY5UWy$anyMaw^+7E49oW)j@ibI`uxEWvTr`D=`e|> zVR2bsrQ&Y~00#3ewxke_7}nf?|(>dHvn9PlSQ3U8uf{Jz-rI`Trc9VI+ODf!`NGxjvE=L5$+B>T%zxf zh!j0#SHq{IsY^A5ROLB_^U337)u3e?E^dxPhEJtje?Xl6Zp%S#b0&MpVX5tpFhLKi zo;)Bdj^&PmS|u02OWD@UQql_>tdBT^X3(24!)>>oVO7XI7U|_`FnmT@h>2H3PP_dm z<{*yc^U1bh?iY;47o@JR6V&A$DlLNo830bB%6obU(L4hJEavB60x?h>>vH3ZLyTKD z+DGhx4+Jt!K*+LFaO`7e4lzbe$nxqvi)m;fWdVh*{DOH^CT%X>aN6OD?J;$s+l@nL zwxkZN2RA~jEl{*-_&yvfum44E=}rY{2=qs=LSeY<`JA93NZHfYlJxKzI8N{D0tO*Z ztSaSVG8Foofbblx@R71J@Z0X6ezytk)2uu ztXM*BZOpV%*F$r6C7{#;aVf9*!JWcO1CQ#Sd{Q7 zQJ!>vUs-&>X=H4_5;?_DqyX~uOHzk!nDH+_-Tpud`8xY$UlU@*wMlM0QKBth;3_h9 z{@M5|98&?_z!|y`2%hg|CN5{pmbjTl7X$o6Vy|;Ip(EIjbQXO;v4u>xCy98Ci2C z-zYX?t+tu#B<*4|mVq%(teWKXvc<9LqOQU1v%5WSlv=kE)dQzgk_PqNge2ujU@!eX zK^L?#ygRj`&N8r0)^%m7S(leLL+G16InjyPVceE#C(rzf!Z2nEf@C+BMi17q(i_^n ziVIjO&27TH0xqGtDnAy?1N3`=c4lF9GUbHF=KE|Vu%wZ~9%2JN$&_BZi71(&mYrRQIb*)P zMdk0%zy>51qNHq833Y6?tK}wJ?lsG#8DF8$&PP(2ygKi*DG-#C5gZB&zI-R(`$2Dm`px5JA5)SK#S%fQ+NlkiS45zF&~7a){R_nGr!67;C#DYy^`?#A}XZsTXYm4 z!%qT3t*XSp7Og>)3tGfD#et|4#6!?$$n8frI^XR(`@clqml(GNtE{>PsO4|7!;JKc z<#s-aJ|u@to>{-1__vKfDRd|$ zjbjTgr?x?FhN3WlJf}lqmbrgyd-SC~_~XhKVgLTS0hs5+W@uZI%aC|(X^Nf=Tezb6R$nf@GGB#1p_DIt{)Q@O} zlR0%$vi;|qrynSgi|4BHIJ380ZZU5?NRc;2#jO=GXCPc~#9l8!e1X_*!jCdG_)?M| zdvDUIfEroP;7JNw`Y!g=x$u{{J zvc|vC6!f0}g|xfbj@e^qKfjB8CS5P=8y6?7h}}-0Pp4SF55j^d-Vm zLJDd#V>cwspwK`sZ;8}m|Mzi&g$I-@M3GRRt3y>b$(qZ^hkcBPrtttxR=AZ+_?ffJ z{Vo_bgsDTCdGa&^s0uzUPPsD&a7O6H=cFS@~EruqaUop?&1qaELN@ zIaCN>gR1~gKI!4{2%c?C3Ie2pw38`yb^HOkATa?qoO&4e_GB~5=!WkpntE~uj-)uA zRo3w6=!*9Y!>JnZDI$qL9e-kS5tZ&Q)C*cEy^c`YV9cPUH_S!|9B>28tQxcGl!9y? zHgN8K<-`dIg>67(EJ$I6C#WFMQgaUM3yJH4JB_k~xL-#QpxYvkS@m^(0xfYljLWZX zPWA4^f_vpSK6nc#It_O@luvn?@>PAiO>`!L_KG6*SW#_supR{fMaTwI3S!WQ+uz|r zZmt;b)51zX=%xf@LCj3g$2=r%s=THzVE#mWdJq%p>RQeBy2yF;7#sI$Cp57y}z;HevF2-Iv_q3`%y;Mh4PEh51v>%AaJyac ztF;GNOxvX|PsZ~6MyMpAl=?GUdUq)ari?b1bH85*)&tPuhUy)r!m@w?gW(?O zYq6N+kLl&B$=y7LOFUgU<3TQ&#|>Ap5dynq7+l7f|ArIsH1Ni)VShTv@2ALVf+8b3PUiqzy)Q@;EuB7L zCjs6gB%-kzZ8s>epN17A**9HeT^;M5MF>=qnySWx!*Db3L~w<=oU-{@f#Zbue5Z*` zEY`?N$k0xDD4-)KOc)>ux@kK4xP;(3>70>S6+_dj3E&4ssTA@2V9*Z?%NlpR?h zR!*2pFmNn*rr!7f*WM(ZhGa|YD)1Ne4MRyGal+2frIfY!myl=NMyBdNW?Klsoqknl zL+j$4K!QD;c0j8u(!c;a6iT^A`luO+lc6)9Sxj8q+?h!PL{BndBHUGixFn3AI$+|W zAie{Ihczr)!1{;e=?XM(;EiFpz`J__qFq(jb58&?F+=CsqygSU-P8zH8<_KvNDO1c z&nDy$USy5=`m;@34m4|30<|t(N1#^L97{tfWkRYN5T8|dhU}K`!>b#J$J(+dNF*LlAoUq-d&XZ2fZnoxnBNp#t*I|KIe+Md~0!& z1*Blad#`4B&ht)2TIDS&AtiZKK%bnjs-9beEeL6fj>*t|wSNem)&IFtq?i9TNL2yI zd^H&=geqQGK2ZlsNXAeV!|1_Dh=b`6;0gyMsQ08RL#w(O(R%`kVQwkAlxcbtKW0n% z1)|y7FQrZvUjC7@9?Ly@Re{+^Zru)y9bf&TKexDULrnx^yLP~xQX+M|%1)a^fpm28 z7gg2kiI>NM0mo1#)A2(W>+*bMI8z+>*J1BJl=;I04L**gI2=eio>OO}Iu`kpBJt6hq8%l|KF`@MK^vnfwG1|7dWN-TP z)E7P9CYy}oovy2)<%=HyLCp7=CfN~cxU(rzwF8Qe#=l9^&ptvjI(P7Df<-E53no^s zC0+usbEiMcw*#?;=I3-IY#>2F!T=X=yE{|l`yM$k=FAmM5|@<&FHn-g*|QdOwWhJ6 z<8Ajw8ptpPD8B!&s+M5)QJDHna5lV;-n+ZImt0m>j1>6ni|D%LI6Zi1ZL3(w+joxJMcRd=Yyx(vuy2}vA-X=yc?QB;N7&AGzOC^<&s^#J!^BDBb*5mKb zc=McLKlvPbSb*?b>m+OHI@fe$p+Wl@OwFFs@xXVTe9O* zaLMdj`*D*`=|~$+EjGjp0c`VORph}7^hJPY9dx|_%f^h-EUM; z2Mz@IWD8l=i9o`wY5tm0fRH8!P}{}*0`#K}3N5}o+)!M>`e`rgg~cgdVd>Ww8Y@hTy@&(KUSx7GYX? zj*+@C{FP$lXNz z*BrCcblgU%eiiK#)>>ge`o-~;X%Wb+?KeSmI>IIAdndZW8Yz-Km_0503WAro#HnT| zuC6SMF=AiNrc?bgFCfyp#a_DtA^Ua_(xfhMonJeHnfS!%yX;zF0{wn0OQnQeil+G>RQ!UDy z?<{9po*F1e2Hjmx4xD>RCQzjKK%z0_Rz5w4%Yx8c>p@ak#cENY& z+Y+~t;*LeXtUCJJ6?)@)J1A7Wh&ROM49PiJPzTTeQS94ha z1+EW|9NStpm#h0b)(tOP2PvQ>3~;l9=*sfLPWqtcFUJ}tRSf#knD53Vx1*q-4>iBF zfcSQombu_Gd&mx(yx)fJc&b;}F+L2qx||7xz@qJcaPtu1JHwSb$hrJx;0{y7qX~xu zc++LrOM^b_nLN)HVqj^r&{6(V=>9#q9XAr?Cuerp9F*NOJ z^7@4@NU<|3>P&4eXojBxaNHfpt7SX#Mr(x>$szSnLbWF2H>W@Z!V-=P`$b4|13q!MsX8Z_)n;6u#9DGbSx*J|4PCTVgc zuA09HTQ$J#l7z!PV9e!yE-J?`;_{o;D8x@ypL%-Zh?Ku&8xC@6+S(?j4%`919_S18 zib=o8bv)im$P*;OMw1bqBA;az6PNFYnj@AH!?vG$LMmjGKUy0{B>{%){#>Mt(h#+; zZS&NOJL79a5$LqwvmibT2*}`xi4ac7`4o2cv?DlwK5%V8Vt*6HQi@3c#)jZFGyDjG z2iIC~E=v0B@6Sn(0ctUkz1s-z)a50<8(+S3;H3t4`?;ueCY@fRyzz=wp}Be>YVYD_ zjCPP#b0M|#A0$ZYqU^%jqL(ltY|zw`SrD1dkH;hhn0SevgDR`SckF?7LP1c+NYHAxs5eBDQoL~-cSk6i)I^K6e&A*r%qI2;;!WiLg7FF3l7 zZUHwy{W?Bk;0KIcoY1Zz2`o=4afo!kw;1YFMqd1XqdSt7-$ zj6K>)3E=vu=2b5~IRJw|)Rxm30sgT4dnK-?cM_x_;~9HAMYXOYl9#|qM%#5O(GN5D zOw<8xKU%$!^(7WP#QiSiN=9<{+p$O>_b*^~J&{lIlRj0xp_dbaRD5^}U_+&vI$;4_ z^}|0DbWN#nx?aI8TRXv;IHo4%>)}A8v*t~%!G%4WA`;fRKbc8Jr_dAdXknw>;%6oh z&Z7l92$vC+`b|&+vs~GxZ#yUSE@1L!cY{MONAFNh>~O>sR=Fn$zU=6ioV#Uq3A1sj z?{NJQ)VE+k1~u-@U1chf?4eXgHjLpo`a=agAf|XSUCOY$XFbcw-6ugGh9moIS&7cp zF@;4A$c*g$)h@$(tJonOj}h=^oBrd=n*my*8d1VnmSxF{|2B&@{r0#rszdnE9hxQ^ z9MM{8Kqrka`}6+*K+$5Qg_Z)v-5Q*t zK?=0Ed$A%d?haqx-~I0WGm|}gX6MY=nSJ)zIo{O7!UrSfG<+Zam7E5`bx{ia)jSvg z0YlKmN14y8Q9SU_J&cPkNg%6Pn zcYSOJcZL87V1f28vlZ9dW42mnDQos)_JFkldok8U8I_McN?!QXyvL@hNVU(s789bxj? zX}J}2^}Tfnxl?@TklaH|KlyYxt0(-k92zD?O8;+y2=ZH@VTEw_abxGy_h=gLMs!4# zodth}Zi#S;ufHW;ZTH;g|KKDZ(BYkcO^Jr~iod1B%#p*6Z1I)z@Wd+=RPEPH2{T__ zQ~u^*BJv4-uN{j?(82o4W728KWU#*uagRHP0Y9cS?&3SMB@u(wJnTKeTDyx5V@Th} z-0PP@pK|DlaiaU@+Mp~I}a6z`%7z1K(MO5m*kt+Vl%Mb3(2R3>Zz zD}?sBhH}%ho^U(5jto!4n1CkTFI|%mg`bUjQb=^vcb{B!Zq{^Thco@`x3lCkM+M6| zC~q7H>%{B@{y~b=1dU|<_bNrVPt*N)--69^%)7dXo*mX!q8wf`q@(#jpBcJx=7s~| zjcAj|>>eF7!gl(dE2Ks7LXEXip*&x^0*wLN9ASuBUFZb91`p*DMrYfQq=Yz>%aFLB;Qs!idIZ&ikaaVZKPe1x z-Y;kE!*I2hbANX_`l)L>d|nF`+E(ZLBtmIAYOo9%h~v@YMs-H7HZu^dl2jf)khYgq z8(}(iK(nn>PMSZwV!sEN!Q{b{;JC$C z1_?1vb+_VY252mpXrNIFP@w@HdDo;zqBn3w6ZI_pE4JSiB-onzL=d}fxwY6}k$APl{aW;D^}TQv%>Vrj&3W8AMFr$Ax70OKRe_YU+h%2Ps+ zw1Eb`zP~Zi`Nzi2)7%sC`*M-rSiu~?l`>G+D?VY{OHgLmMSXLN6R_xMU=Mf8rb0S$!A1%a^eac!7gnH6}O? zJv4>U*l0JuoSO*_jEQ?@yjmy59}vN4HY3*Hw(@Zw5RJ)$JNh_%)cDQ*TfL2dIodBw z&3MMJQCMx1QbZB1ek3|1g93&2W+&#FXxdmh|K0JLXVS7pLgIXAtS=!2fJ;i1ZmArf#2&erav@8)aHD5gcaBdI%|xDdd%YWj?P?7v5`ivYdr_ zs0c(|zu~3w*v#{SHJi-$?(Qu6r0T>wtRxJ<`w2YN@^jRFF`GQWokuvWF+#Kt*N1!k zx})#Ub_`3FalB)0b9qCe{2AwGIP9yg&)Be^X#&g?$QVMdLl!-Sf?1?;X<>+cwOWr0 zpqooT;nA#wbqsaA68Y%E?4kCP_%#L?a@M~?;-9=q=vV~N>Qe|b_KZ)sXdCqW6vajP ziFFjDzk+xoT{CSITC@GER7_tz+W+JiZI2!%;2nneOlD02Et+Ge`EERrgkzEH!hE+i zMH8;|WF}|+-12w137-ztN26m`t9EKc5@3efrtyiL`_lNOwlB*I{xOiT__eL&s2j*Q zRwG$=?t8r&M#j62LfGTN$KwuXU17M|c{9b0;#0dW>?1pnpOCH;Q5N^TDxvQw3OI(a z=-IiYnW@L#<*oa<$`CJG-|qD%dg<&h9(>)Rd;05hx!l=ZhZ<~K%KLKOzZ@4oUc)X) zZ7;uauM{_(m3BUhZfocGw{DEMCR%0qyO}Tcr@?cia=#*(FyaelFaSi=AQsRFbZbjL zFYcz*Y^{|y`{Nbe?d_2~YC#Tx4rMN=IyN4(4e(z9vL_JsWfRiK4F9~=&hV$DJE)Uu zR58E_#itTvF_{+5b^ceV@mBrjd!`>5zyip#0=fVLnGd?ZM7*~-pB%Ss#jZY^wS+~4 z9kE?*sa5p2=u!t7s_qW>i@qNU0_+kP@H#WQ{)U#dzIVk?Kz&4XU=yG+2oHsa_z?5W z5%4GokL<7TzP)~<#5ZgfH=H_ircx7?KO@@98rK|K4M5AjI%mHXx!OV@Lrrr@55_>rsk z90qTSWMIZYig>q+Ebc5s4?SsF(o28b7<6#f1lk*#=I6;jbz|0aV0$^%cudjSb{STj zFaE|(+S=$Dd06;WcY&k($2i?ncUUsn=%Um72v>mKy@nGLM)ZwzH+zS?7AEr!E0J36 zCDfGRd5d3~5#H)K1EXzRPZNM|Dk$^}$ux!`VMCvJtd6JuEE6DmkOMgQ?mm?Z92|1l z3U|F@M4?pta}3i^RwZEck*}H;Kd1jS(D%g9fp~ZQc7uwoO>BmDG-+RpQd+ccD4xOO zVn)A2lOHjx^?pdLbFaD-ErF0TmYNCST35YJ+}=23 zxXoi>l?WVshig{*ftw4A9U~|ezn3sjw@Q}ug_}hcB^J4<#C{w4u<#s9u^-G`sOj~z z8Y=B~Y1qa8RoT-~h>jn1$ArNlIC!uv=Fqp2_UW^9nYf9mrR!G8-R>YXnl+cCJDz2O zUiXjks)>T~QAe*g9zPSLG2u8NX#ZCEN6r|-C?|=094dgki-gfCD4Wp&;ErU-j^W6~ z?G||G3KxaU`N|%N`+CX`zMdWe$ytRQt@WUsQ6F*my|M;k$1Tu>;J!9-+?l;JyjbU# z>c>SMk+68ZKH?eO=lbaL)9U1q-#{YT(Ink7k|H1_9$x4=CGx$)MdCzBYxOUVw4`D9 zSpKFN$nR@ns*siy8Zw`dK62TVnv%c{BWeSLs>3qL+~@gJPHk|0&%S4>>$MZi9CDyx zjS|T;-xV5fmW~{&FU4DRra|6z>P^fcfQIE6D!-ochEO7b2^hdFJ_WT?@Lo1{F%qaf z1WK;>PLcpjAXXSitOaCO16xP2EoHQuo-j^y+Hq? z&B0UE_1_;#^bi{4(An85!bHf`4`DqB7^Z;3yx=sBu-}{PFX41U0hBaWx1lH;=19&0 zbiycjr`a1w$R9{ssS{jZ@@zB58zaq{5 zMEY|Gi~nE3nQ!pFMzjA z@|;1R)VKfZj)N2mf-*-E^9sA74gy!-mh?S!LmkNl`4cZp(PMkvt@Q0bW@|DfToPEc z&Pz~CprZ3kvnof{2&D*2gGfc86NnfaJ>o1iEHiXYm)`ZB0(?3a&*aU~J}}qTJfFlu zMwA%9i9@Tl|GSugJeWUjqN9-ik^RX-;>xJZ+LMq#t5EgOM4!uWdJF=5o>;_YM*$G<3@qb7 z49Z$0QRNDz`5ZQb7Y+=-^xgqzn1gtJi@MQ7DL|LSV*3A+#{N$#b0CXMBJ;AQ{mG2J z9*}|63@1jS{z2s*j#9MeXRhuQ~uw@+{d9`$HvjZJELD~3^8a0xc*P$5JuyE+-78=68icyv_&2< zD?5lP?GeiT!?l|HKj%!&fzkG_8a@`89&m#F_!{uf<3qA%*0C^#y2#LXww9#|J7IjUDl+8zpDBf7=!%fm|K0i1BoFEV*Z8ZoTHaGn z#{c^JG|q#H!fpN=aHt^l-`FA@fQ0FYX*CfWiT3|v0(ZKg!e7)6yiflTtCy1`ZVsc8 zQ%T?e)Pneh@%-a?I~M(y&Vu#NBxb^f{toLkwVnUjjdv+5-(}Luu}5!eB>OQ$LD_+g zhlcBJc{Vef^Jc3~8w&t9Z++C64qM5t`j+6n?Eua~c}h#fkIc<^6?X|Csa9j&iT-z& zjH~rjF}qHU&{uynd4%M);o}YL<-y2{lI(_zlJ0Qwv1K zqwSHQUjX9yFxk}q^@qzF_IE=6Ii_$)G`4Z$(-1P(%I5$1?=ZTni%5gtQGRs)$BG#* zSwWSS@MNL)e?`%rm@6S7jmkc1TaZ1f^0=LbAV~x_YAQwx*I!M3%4ZNHPwv+nJ%mw; zDK0!{2?@h9kDoZgc^JeX$AYk>4XyUb{zMh?m-n;J6e}xDKzsY3ieN%%oh!PlX?$en zuPN=nJ5CoTMYK<@_rCNny2n>l9Glwo>fgtWj3!%Vx9SS|U+*{xk9UfA;22DZatlpq zKWcEbB$B?z+3n!#fnPfg_ixCc?tWKdbD-?|R|FR3a5k7|qQmpNhD>zpG@hti0`Oag{ z@S-L(8m)eg?q}cI*81No=M|#8*p+2}b@b$M?)9J$0pX2kQ z)6IsBkJw3jZSUp2?uzm1VxRVQIYE9em3u86*vh7@bOiN>|JV?KoBU3g z$C46%;}%>4Y@EIbj}c<+4R3Vv+g#UHG1Z1k8LTR7>;PS$=z&XZPHKdGi$ z?$}tKHKWR|^>37Sw|C5z`(S!$-fj{(O|dnc{vncyDSQY45rm`24br>W(x2J>3P3=k zU&2emyACjD9XJ=^+LyI;X06kah^7s$&*6SY+;Q0h9s zWlBg&>eSk$D5*8^z?Guf(CjL!aNfVcb z)uo68|L8)(;iI=kat(5QL+qn}-qH6US2OWFIl7xz{SgM~3v~;Y60ZB;algZ)gV&BJ;b2UQz;_4ZDf&yj7rk!ked9PD=5f@6z=XL zZFt+adu^enaYCfUMc1V!Hbb2#SF=(nEgn$pxDG;#e)>*1^)xN$C z+!X^GozC5UUd!i{T2)xl3H`N}+!D$to~Higp+q4?R?tC_S)IOK>h73c$*God;q&va zE+ePgqT90%IJ&Q0e7jD3K0kl97QS)|%bF~{njh8mGS@EQ-cyM&WD}OoDrju6^P2uu zptBSGoZ_LgZ99p(mp8kxU3||-sIcl$>C3`nY`HcpGA8e`SYhq5Hk*}t)l~B~e1U|Z z;nK8B|FO`z@Xx+mqfwV%?N|TrCIS-0e%-A9+J%Gc1rA2Xy+51GyNwb75%|S5%1b%P3Tl}F zm{|@pzT5q1N=k5WzBOLKy9up*QxM9@dRd&7qxrDCA3 zQR-C>s2(E)r!JiBWpjKiVHm1*!pNT5AMRy*UJ8(%RlJ*Ty^==U%IUmOn=`({xU%>u z6;}`73$!>%q<*fau*IlFU$6GNP0|OjQTZn(WLhf;Q~pna%*S{OZfU&u%LfoHX!J15 z1J6O6+X7pK*H?p-pt{=eHE$P?$M=-m%?)P83*rCRlW8S~}RQy^2`{;Vv;j!;;oFkxaRORNRBE`6SkOY-M zFLF+ag$r>Ux^;VJ{RiP(RMhi)K;6nj8v{XC{2 zCs*D;f6@aNm@VKCLXGnK%RNKuC4kGQog4-riw2COV#3rb-QCv}Wo>Bc)j~xG;By%K z3C45;5EZjbe@ABSXyA)b#$H4XuYG8}Xi8C$@U~2gLk}}XbNE%>5TP?_0^or*iPm0P zWQ?kA*vnC3R4?Op3NDY#Llh$kWyc$uZ&Nfm!Y`$vPUJdJ9HAe`z_}P-c~H7iL=N!L z_%)u@;T%aVQKf`~*gH0I7WG4Pjl*~%YE&*!WqVe*BJGg}3o{{*z>)R-u+w&)@yckW zk6#{OYt}6j{}#3;AjJ=9d6}0g#5;LFj7$6PpTDD~cqFhwoe8Ti4=cbbo3kH5p+uNJ znJtlO_s$d$^bGJ#2rh)nIOw=5c{+83ksd3ah#Bd3wJ{G=I8(uM4o=$cbNfiJBg=%c)JNk&cSy2m?2m6qg(iJ zH~1H#yUmrGEl}qX&`nDEF(n0AuxwV-!so@5(RV4Q!Lb+H@Udht>WIL2Z}DdV@gIg) zA9ko=Y{zz%yQvKFe(hf1z0Hri%y%FC2Srx1dR%kLak=vc(kLKLj*rDwvr?OWiFYUE zGkbUS2|;1rfJI}7v4;0!&(4dHbdnwVt1^@PVGq&E758dn+L4JM!MJs zy%M!n{acwcvS|;7>DDLyZ7Ku?0deWPWRLI}P&bi_L2=SrN!k9?7}07YdtG{8%JcTk zU({HGLD8vSCks}g(I=$p!VqZwl9|ayUkwaSgqxWST7$w6wCZC@(}mwHgIIhQqw7` zb{&EbC-(!;e)wii9>>!hZ}9ZZ7vKxJ5Zs$8CzNcPZ65VZ)Ps~K{gpByymI$&l61bU zt}|2BXUU?;)xJNnzgF7L76y;CDa#~cMqz(t`voQ-IlXLtqSIm*m&94dZG#& zIj^cD`M-e^d~HLtSg7oMUEcxwrx8LUP0n%Vq*Aly#o|!dvy_!@pQ%wC$##*BDB|%B zf%$Y*~c3KF5F;7ZyGqj)yDiRYweCm8AJ zi!LwBCJ`hPbx)A9;phBLfL#~%1~%!`h9}OVzuJ1=VB->v3)E(?tsvskXKipOvFlg~ zNkJg?>=xVGmznd3o+_YX^Noq74(PyI1imLbTZVI(F6|q?sfPA=T&6a_miP9XA#{f_ zRr83Qh;PdEfn!v3`a8&pfoG#zeo%P%a0B^Q)bMHUM#RZ)>|H@P<`+UfMxfP@AX zaf+Bfp5m)x_xcx{3@xSQa#zs!19UqX51RWSt@qC^Kj=c=a$~8`Oya zy3uk^eZcWb9XfK7DKCiXBG>#Gh^r^2UwjF1wxfj!P*s=fpi5S=;?)X(38?A)I?2H= zNcT@S#qmVo28W#958a*?j7_>@Ch-kj5mBdk1fmgcBR~4vzyxL7>V`iBSMA8dfr`Bg zLs;4B6yQ(dDPwDRF;SX!sPg&D1^BSx1U3fU^LEidAkV^fWx#V9Bo&M?{hg;QaxDrU zem}s$?K_Oe>85jJoFMaxnehcBNJrnn^l z70J_{-hpQj2KS7_YSIM8!k;a@Hew;h(`J>?$+S(xXIf*iG7yG=>29B`3Z+lh&PWq^FiXJrnEjdpO%$onGJa z;d|fs-PQ^eJ-0o0%{hzsexAs`yrzSBDpL)oDdfP^Ued=7Om3u<$v^4mP{D)U)cdN? zSVLhW;`xxV+^^I9gakPuZwdxyv9s?hYwKq6*o152%_AxS>`5t@J(MEwNKEvT?K3(J zx2gpE4&*+XVyJ3wE_6Cb_6*xKTUiJzWLxQutG{a(@i?hy95K>QG<_L-bexI5iJ>rO zC&=7eQk>=dl>n*Zb8cGT24ZjU4*%3sD^p8Mng@)>y6rrNG?|*kYrLzV$XDYml_K=~ zBfT1~T1C$H`E_s3*^MDyeER_sJr#DeGbuTs+PKFC43l?;_$9+G_S{aCUY~UT%PiUE z!rQ&mYF?ixhbX(D@>|B5q^x3d?hn;H|J{%SU0R=b=KLJ9jtnF_$se_lNii9Yn<|-N zt;?9Bg%uvXp>zeryA|Z}KB*ct`8{J~?(j!RAQzMzF&{)cJ?Au*^8D7Hg-gt1obR)2 ze0?StuS=0Ylsz`mV~lUYwe`pCC|@DoK+Mmg(U%o6n!y?PpU~^1q6VusMt0H3VLF zeNJv@l)#DVUB^r_2eB_?DuR`sG({-6p|(<7M>FeM%gTa^AMgA<{q=}MJ*SbczzOG? z!eB1C39Tz7vP27oD=NH!ZFmGZx#|mKB z90iFkR**it@LZJ(Dl(I+91@uvE_&GbLWg9TIBRd$_{WwzSRF8h$dl%E%6CDnJ3YT_ zY5X#_7GGTf#eTX;j1vjUnbVC+$~iVjD$=%h#-I7F0Miks#y`zYR(ky@}OaME>} zk(G7wJNcH6>xu251E$<_`p%MKQ~AyFSItAs>ISlnOFZ47>XkCM|{&^&=9zK&;v1)FZI`t(JrriId`v*LfmOWhS94u#v@$hv1pGH`; zsMm`!-ge1Mwr7ELkfBX|dhx?92N+!Yl!Pj2OM11pF$DbJikYVJ@$`OH54-Oo?7{g> zZpmsQC#L?jDQQBj^Nkt23zMJ9BJpfl+B5A`7`cRwSp51$qOG2DX|@>c8SK85w*27% zg!Inn$ZbA9uhOOrF&+tq_r#N;=Gs@N!iXIo9QFMn6G2Xu>KW;tgY2Vgk`8y;(Lq6= zaIXt)XHl{c{Ne;s$ zT^~+@Vzq=J=}sKUG~M5Tw!2l53i2s(hxmdxVg4@rtXRj^)!4S@&~4ybz=Mj3z}?3Y zC1rYGzy$x-0TCUm0+(Q&N_OJv{HGTp@YwHxUPi*I^6{T9)XlK^BK8lij@q>?FLl0k zS<3dh{q&Y$<6KzWfY#W6fG>V?slNOJMtWp4isKuF*fXPIe`Fm?`IV2!jt%0&yD4Um z%%%|`tz?4J;hm=yom*D#0gVmyUvQPoLcVm&a;aowMZKLiJt1(i zlN_+rJfm2_t4+8{3?>-QM(QTl>Le^7$U=ZGx@5o{bOAj0DYJ-8Y?w9vYAFru*vWH+ zs#_Fp5LOdoIQ(ySSddvV*zizK=yKXv45BbDuu3=Yz0I#v9-RG=-Xh%pcyT=U)+)O|!YNOJO>0!(m(Bu_w;@HOhtmn_db<&!WC3_to zk+V$BGp^H^aK85Uk#C*nGM=OW{xSTsr-hZhPyx7MsZtjMD=^M}V68@Y*RP_p)wn32 zqRTgjNDGh$k6r-hU4(?>=X#!;bpu~y9L|WVkFqG9o1RO=V`~wKQ`B0UZCB)h#N>nr zMB%3c2*B2#w9+4(G%zK(EDnv^bt%5P2`FrCGN~Qx<|LyIkojDq0M2i1a^b=MF^JG~ zexi}y8E8R6r;s)I32rtu<9}N74XBuU@%?ouD*<#uJnP%hGxfG;-Dg+3G7O}6+tVk_ z*j_Vm>OGH(-?jO~sYKnfV{SP!F$8e&g2BfB>@TzUfU?A8x#yT{P zI#p+bKpa9Uqo-e)hrn?TV@i%`A6$=yQ(L4e)Ah9#k5@I_5F>iLlct_BJSoQ!FrJ9 z2%Tbd_J}hERA3`-&C%b2IF=Hn&Vx|Cc8@AB7Qo&?Q2{NB=de-$d?$y-azY)no*U}BYWKG8`KA}D+ym_A#JX~Z68dq z9V>^6YRlc*2%sf0#ZjN%Z5I7}k}JW*K_wamy!Ehh6iG>rh(^z^&NlNn)yw15zq?=%z78wj1Bi+dhlrIt(C7**1-!?tzHlQvE=mo5VnBlj)-2^fh0(-2|yKa?-+M?X*fvt=h z-{?+N#VpxD?7er+iJE?pbZrkNmgD~BtS(l+d_YKsCvcVjZwt|oWikju8C<5mxBgZ3XIIU?F@>062`s`sN& zf#T?zk>_i>0?3@#%W|HrJ6e8y2$aCoQ3!siIEO)7eTw7$8btX{yqVokFge{x5+lRS zZ~STthW<>8_;ynF|J+uXzLb@;mS|7O=WHAGQtrIHxX)S&`YVJ>tQt5}G96Jo?k%63 z4%`3Brgw7dUJFVWSBZXUHjC(7V7!t_I1O*|0I<%sa;%Nyl9AA*9F5_8o-}^uwrW97 zH&^6lItoX587Vv_Uj2-wMdlUB2mgem6Dy|}ct8T~Qpsk3*u+AwXt0LG&g0-~L#G~O zHr-7F_f^Na z0(Qe(3*C4ISVhhIyNv4n`EUmb;mIwW)Sea~l~_l#E$u;b!sm1HY~)I8s8(6fW&JRd z7zW6Xhm_vPFA4_N!f$=w7&?9Wxv=ZiJPU`)JmQ>p3}LlHgBro1BLzG+Vl%l@a2 zn!Y4(s-s2zO$;W^W5pHiRTFGGIBB^OhayX-CuXp|2rA3s(aa#2H7QnI`1bHpKNY}H z-Yc>UC5GW?K3}~h>G}bF%ep;9BYGsPje)E?nSvI~1nK%@Y8SvuN>TK(W5zcx%zCaI zm=JoJM2$KAl1)SIh;r_{!#W3HERk`T;s?HLxn2b?>7z)VHdOIFT))RD_@D;!lgxKR z&FstY8$pb9#}t=|+jK1<0lwruV&}JG#bWTqY(18|gA=|4=u@jfcGA7sIFKnJ=yvi;l2b!v#!8(Z9I z%tp#(QM?LV5?X&r`s^=5&wrW|?A?Mq#{r_g&N34_Em`3#a0;HczNH2aPS9%+qC-z^EJnIVQNTGo(aqMrF1I@}0%A8M9;qPrxcj@$J4~JX%nw}{2 zQ<;gn8Sik_N@&X)#3dtVe~lR2cf8G_FfCkP49@Em`!`es8l_zI$;P1j3CWa7%zLVk z6q;ZP4xd*9t1EM9@RvInHdx!1U~I_`-PjQL@m7z!3I^=5=u0CK$XaNdL9}O<@^&Qy z=;mZZifg~P%!x4~s@8-2{_7nHx5O=l#$UT^0W&WU-^2c^Qq;)x>lZm~tBUipnN;?m zY-6pk?*wy}LQ0G0^CqdxCE&^x&`sF6BK?BXYA8y^Xe3)EXv>XQi@#E6sntqtG)AZ>ZxbKFbTrt+lOUz* zR4B2~{M3u^cs}YfZ;Vt9S(kB4qSZ#R>SR&`$L(vr-`(ILaoWH99Se*B&%sC4s!G3{ zzTqjO7KbNT^#6irZP*=eSnR1{a>0Aox%NZr;jUq9I6K^ahMaM!?UU7=Bn7T0=Z_BS z$yWjYl&gVq60TB4cx2+^vYu(ys7=@0f8RpiCPx9EQ_Sg^E?l1zohL_B?Dm<_MA^=CDNCxk)hY8kDTND3$iwTXoN1*`@y~OsBrcBz;+?kz znxVga43{wGeCm_bN<%q&T-+QhiY(L}TX~fLk2af;Uj;=v-$?p$)4~+MGm=M)M}`Ee zCsGd1sy@zm%H2(&7^32Vipl9D(F{RswJn!37P6(lu&MP3vK!_7aEk%#=pT~Z=S6#0 zMbPDj+-W`?VII-X#+!p4jxUL|OlI^LtrpTD;v3ox@ShPqoRnam9|bSD zWHhwl%}K7(Z@?X*co+f1gSe~vSgT)#J=fu=g+mrQ`d}7PM94@~K|7^zZ{vObA6FP( z2?`*ZXr$IKv2pjN160t|&tln}li%qJR zZ8e=&G}Z!H*X)iBFIQnY#X{E?& z9IMt}=fy@=N??}SpKkh~4*leR5S`aTmd^yoW_=<69eHsfkgG9ml650NXV!p)3#WYa z(3A{L2sZ`> zr7L!*TNSjzzGC<=s;%b(&kEAE?@f$o@eEHsF&!iB z8B*hZC!zN)NAJ8)kB^F6l>@PsJuopU@l+B97YMk$$kyI;P5(; zN_OLg#CgT++5y|Ce$c>1zUyL?ti@fBpXJjcJ-x~;)B)2a?&($FC6TiC;9G@sXXvCj*dDi^PWc`{3G9Bx*y$dfqXGh21G4Q^}x6H z;cvxZoj)+3P^4h3>R7A;iiQp3PmyxM41+^aCOufG9C_cnuP9iN1{V#n!B3G0T=o4Mh zW(oy*cUsjUxtXE*p+kN~dUe&}ZKu@q$E!f=Kk4EKzoKUPsG zL)eDygrFoOc<2zLfo5~m4$BMd_442rlbcA)`Z=} zbUyO0om4zh;D()l4YOMvd?Yz2xxIa)i2*PK41ydW_jJnL*QOYT>OxEoS6?)cjB8b` z1mJ`hROQxluTwQ!7--(pfj;F6%UNY~DPl~{d{gC@hs@#UEN1X3V2{w&)eM0;xag0| z=&6bN5#Q5kU@jO^fT=2KVyT%17jei_5AdGiitI0vXYOg!_2I7atcyMI%#ieNPbs=y zbbI`X@sQ%Qan;^W&<6BGiJv$SOJ&Tvdod^RM5D)&^(sn~*tK4TDjTTyuqGGtvomD- zkY%0GCWqVe z;zB;>bhAo;3626%f9HIAh`}u8^QLR311G$P)fX}$S~^TXT38}*V$}TVcV+(oaPSIo ztL|7w8dB-!G2bUvKf~$+a9yZ_=5aaj7WLg=I91TA%bEK(iUy5Ae9>!RbBt!1f7wF8 zY2V-zBq!^xhd-06wy{Bi>VE69y331U!@m83L-p?IvWG1iP=F03(6Io1=wKSB|bq!ft2zStFjJ>+r2SUgz}O1s~(Umswe!d{aqgS#@g=ezw0zYcJe!dZ_lT zK|7|-m;g%6XRPLw_11%J5wY1b{rp0>WExQy0Y(N9Lyy*rh2d78b@3>SeJJf=l~^Gt zjKW>n-*@1Az1*q-*jgZYGel(6UhTo$tYXI!&qhSccX2l^qEL;`&*LD ze>tj|Xa51@Kd9$EG=wd&`!{GEN9zV@}Z%O@GI-`j>;wOP<={y|3~vaFN7? zI38FKhlde9xD97R!;w8{nymsbxJh!ZCUyM0ohuYMYKxvKc1*lu=&-652~|hycWiY) zggpqU87!}fhmUZMYXOFu?iIl4Byap?DA1esAiW1uJoINyq0$|0eh7)9Sa110P+ z92u?leXmu*2zcGS34wc?gRZP>NKv$b1n3dHR4jzX3+h~@Q*sr3NfUp=DDbgn7}U}p z!o`l>3&+PJ!VM4M#s7gq?D7%ea7F@WvrTbj8Sb>T*0r5mJ-lgP-QSg6FpmB->?j;! zF99&Fgp8oz%4ILm%taOcDxFTxllg5(EJcqm(?bxp{;?$F0~k4B90ug zK=aN%lc;$cY(!UKx&Pvgx&_|ms7!Y};l1O_nwQO*A1wpLTgOdrM+RUXkp~#<|AF+r zdn%!yYN-}NmR^H4j<1qD;9cf@a-0V3F<;K*Wb$?kA&TH^>zPA!3r7aN``A;bNoTJ{V zr_3TO3rgYan6vWZzmcvh+_?d5uRf(V>3z#;P4R0!GOYzN-zKvH+pnTK3ptaGwHWe7aJV*g#17uJrBwY{c5V+3-yl zV)mVK*;akxJTYxRF}d2rjwj4i^^o(pe@Te8t=v3?uZq24_YXC!`zbvh6lK2sH3DLa zFL|CsMlhFV9s|npW_wW|)=`K+uFY32P#D!>XW51IrA0k~GjPQA3vuIW)Dz z^0HHsK^Q&QMfz(zTd_l!Wvuxu8K_`Uws0sTp`-J&#F;==>FE;ou2mI1;srQ}vZ2Vx zDJaEHBz_|6yQe}piDB0-mMF!{83c*xmnJfV6OTA~H^S&(D&oQ6m7}o;+;T=5J~r}N z#|vro2P!zc`s=%1k_on41Xa#Z)=8%TP)s;Zu{amFRCcbm{p;W66e7gwCVm+6y>Z2I zF3nMhj&HSDc6VrrOY=*%we_oIE&V-^@eUSCZn`-IFF`1^&nE4YT&Jx_GLP5 z?#Mwf1uBK)9N^b9OZv2d%7-)fq9HC<+;8j$@zITJVJ7p^Rp&H7MPmzJ%b`!||`Z$o)q;@jpf6 zKM9-TQP$;TI`C?P*At56oy;qU6qv43rd}hntNbo_pQYJETXDCB&r}UFmi4E?9%ydH z5+ECELrq!C6wDf&WXDH4#f;7>7+Y%8_bUKNlH)|HeGP)|iuSDEw8*JnvfsMn7H84POVm5e1nA4mX3DL@AzG2Fg* zt7{G3GG$FI`eTKn8Du%M@r0)d;Jw2vpTKtyreimuP||;!uR427oi^0i$O&3(8Bq!v z0#km28MHNL;W`LUj#8K+WG-i_3w(+mj_5cMe0Yx&$l1i3`(Ak2#c+lp6KnYs#R!sV z-APkTMu32#hheyROJxtdrw^CHML2!2{Om7<-p^k8ky0_K?f7=teur`D=a<*Zko$6< zx%M*j9?ERKVk3}svO)UFLIlldDh3aEpvG+Fo&X%jN5-T)Ms!8L4M=fapG6nsa&O&C zU|1#kKRb=Mm7IV;`$(&HlhEVH!1`r4F-%l@cLyI+U{TPmA-x5tRI{pJaJD5WFc1BI z<$dQ@6v4ChE(;5imL!sqASi+?Ip-XdB!a{x2}l;nX^9e+MY2d15d_60OAr>2EKyL& zIj1EqnLEGtz4vdpAMSjZ(`V+)IbA)~Pjyv4T{Wf>UfQ&{N)1TDF27Wu2F!N@o^vp& z>st;tayy8u(7rrq#FmHiUbu0!9AN<~Bk6U_QSMB7k$@%|%w^nn@6kNf`s}eBPLQ@k z2;p`jbNyOA^fFR`RWiia=dP;sqQo_gyWuO#XaYAu??5Zm@3tw*I1QpHyv)8ZGpg_wpbjc z%>Y9r6XpfqZ`+u;3((0{F81hE1F$<{%Z@F(&aOFr=V(9zjnAoRc&bTI3nd@&xGFRO zv$%Z#lCxfmPfEA2mbblt*qI+tC!CIZ_MnY>O*|$IY`H-@qiGLHZ+HY{7S=q2Gve(T z;Z=``8$tDB3RVCIs?qoSXrkItFYGX1s~Js`M;* zfn@B=pj!4cFguRovf7aMj(kVy4=r4NW;X!K-Ow*|JfEx1k0? zVBJt{FZ9UZCTujakD4;DRMCZ!Q@t<1ss#x+<#=<6m`AmRj_=&D??_%1)cWRx3IS!m z5-jQXls{YfKGFd3^g;hXnvtO~np%g#ltBF6vNr%0eX0t`k->iTWY8E_5CJ;7o6qDT z)-3qXx%vySQO%n)#TQn#?v z0rEXg%q^EJZi$3;vuKs&|1)qJ31)G3QhZYfTj{EQA!@MJI5lTn}2!h9vtD*Ox7h|>#S1AskiofuQG zl9HvER($wC3jBe)u*}u+@FC-TGJ8d&I%j8*sNSFNkkFVyHR}Q36V`s14JWji=Dbu*MCNyU676?&ya&Z6V3K1Wxp(gEuJO~%@ z;#d_!kXX6>HatmqWS&FvPNw0|SD7OW3KqpL_&i|Rd)!v^^G}ux*%j@?5cn+BsN+xr(Zr}Q#$bj9A4LV(%o!^@}<_=jwKxy>d0T%}u*z+kA&far(` z&V7tL{QuIy-5Ygt{jkSRW#wFvH_iKNci3bad_po0k;@r#Z}mNRKuI5VroTfChS}W( zpCu3$4Cn#z1dM$$L?rxO|FbhVIRg|!8r@IofQ&xl)I|*Z3|8WF;J2p*91+xM+AnF~ z=kklB zlRCd9qAc3^Qdz#(;j!=GFDQ8{HT;4%&_#(X(dbIeSD^5%!m^)dqZn}KE@c^>| zU=$Z+mGp4nxkV-#ujL;9neC@YBMK-lId&prfD0czdSK54ABBy36WWTSt*qo+Axp4l zq4F7LI%08t6bv?@g^`oa(!76DzRLFG#+}^T^s!;fQWAaXRO_YF`?h~iai-Up=p}*Y zvkmHUunG?AP{Mm)Fbp80>qCW{nNU~JDP54~z)}%npQ*Cq%Uwx&98EXGavRt@{8TSEC86HpK>a6CIOJL1VBnNtWcL*^yhZ_d0EDVjBl_) zZ$Fxq7RENy^z;)|8#1emymimIr$^LqPAI5meSMIdBB}Ms>&GeO^-g1-x#>_@O9Zwe zh+c<>hJ4-<Hrk;q-N$ggfN*b&Hq=m;b_#o#KmylzYjF?sW*jl2b+2-+iEN z262~pUz67)L%HYjyh(1d;6%S8cgq}iDB1B^m4l=U5fv4EE6MhL(#oBtr)R-?VprA69@2q}ha;f+N!#nU&}bX1(_b(FhUImk zKQsJg^ZUp5Jx_WcuAxJlF3j+?Av>8{JDi2X%`X(q+mY0JFKh3wFv5i$YW~njcQv0s zjD($p_ynTmCH=M%&YSa8qWnpK&^Lo&XhGI+DuF?^*K=(~$NBJ>%~{a-3HNt3?$R^ro(uZ~X%TW?|x!&L*iK z&*I3$PzqNz0iQ>N-M`Jf5_xPQa#G3E1f%&;*#c5;j#}5?c57k~SW=(9i z&dA`;N~4QrQ~eKU$w`C&edF1(7y?!;!oaGf*&|z%;4aVm^v#)!89CnCxVX5eCyS|S zt(6C+bFbtFZn*EsnEGt2ac+X0SEmSHKOiA+Aw|;meaq`5zUz8-#yIBZMn=Y z4jPXuX#45P23PGV)u-i)i>r<1s#mzg`K^WF7w%+*L{G#;p(~w~6`$f1iH`Nv22JPX zI6~4{JM-RT7GKo=^IBJwo{>&_7kZKWGxn3x&$=;`82ZCQeL@+)IJ?gqj(~vr0_N3nn=w{tv4s#KPoFP+B z<^cgq7({)y?PYRkM0yUadSbiqCPc3ZSr-fD`o+HU8!CZ_Z3+9SR2pkV)8M$K@gN2C zZpjwgBg*`JdB>0xccr;Qfzwj%f>{clhia3r?NUiGmP zQOKYj@2BTcUGUgHd3ULSnu7?~?%hHu7cc>YcAdHHZa~nMeFJQWz|WhZ*_o>vuVNce znA^8CRI9X;*wS0Ql6G-bL`3A>pU?xPYE4n?krxIuD6>EII;u}!DRGV7*5_B-P%hVO zuxw8$jT6^ad~T*0{*mk@O|J>Ju}8tfd*ggF7G{fr|2W+IwgTF`U%=fT&%WZ!OIAKETd*REb7YDK!rd4*OzkUspb2C73G$<-JP{RK8otl7?5OdX2DHCH@ z{B~ps!}@-!aZ<%cN{vnyLinhpVdln)iih^_fL&cY(!Lprs#G*iQUvGR+oH$XdcxfU zud3@z$l=5BKdjP(T|Up(!KenI4{Ce6#Fb_I#S1yJuKik|B|YBo|l)dR?#7=z6}8HV6q1rP zwdD-Y^|7>}rmFbQ%;8)F#u5s2b!AY-Dfp~uYSFR$TPbZieaDvJp;Rjg<`a}$1}0V< zN)y=8IdANYz3Z{_Qlc);H`?K!69t3mPIk09GaS=3h~9b7k9V)(Zx(Up_E8>c9OT1>3(S4~*(YNarTO;>z*L5Gnbtg9v>dV=)=|E? zp2bAiZL#hEg|;>Y#f9e!m*upa#n^psl)=Bme}v6GVvxQUbuqrusfjQhyH z?zs?#wEct`wP~`rdK)}3M7&2+H@IqQkabg8r5n*o61xB;XPe8&r)vURBOCNB&^j&+4}sVX%7wxRb^3d&V8xlVn{IRB6#`qU~^MHu(_iu2>+z2T{A z79uzgy+Xw@`|pS`Igz^%+hr!W?{R@DxY>6ChOkhI@sr>_n=KuG`nr)}ePTSId^&I0 zg=nRoQW7Kt%or%>n<3;`08Pi8ZLPdRFGrD5aa+i<$HswDOz;%HMfdx?jP}aGbzkY< zvIN5zD$k%LQd2=ypNq;F7;q^U#1HSGjcntl84p0VAHjBU=A+VT{A0g|YF1 zVg(_)kp_&Xgn@e>l1&;O4;q8)Dn7>_>}a)6hu{a(n5pdkB8B`ss#6L42LSNOZ!Yn! zo6c*;?G1!^lKW#O<0kU-wKIR%*Ey7s#Ew8wKWu?A5DkI(nE^&wQZ6renUrdUfXrJZ z#W6)-yOFq!Sh-@4-q0hd$?}wHC@Mg_)vIv0-1>slJ@5NASjA#5Y|i_Y*4p=--vTz! z*h(m>FuT~n@lMU~>|wAy*%w#yETp@xLMJkHy@_@doxYiDDMg0ReUx`9@2<5mX(euU zoA4)248bpJ`tBphsvNKq7{#512{Io>g(rt6of^bL;_+BDN_vw4@x9x^YXOHXWs4w4 zk1r&~7c7Zc75-Pt^HZPxYuj%?;@WWRtMVPX%e&T6@J0r{-g~GpH(PQ5+kefV~Fmb&6&{W;Hc9CK9 z=mj5=wUKNsE|7Gd9}CV2*}ZO_D%x-4v`Ie_*b2Csrf(&`jJPV%n?{Xk&EAH6{~;Y} ze_A7WKjP8U=jQ{{HG|ns*zNvSXJ*{YZ6=(O8)P<-3FCZ?=ds%Ryg~cSB7al+MLA6( zCqs?%Gv?I41ETX}lE|BnSMu5^T*!$!gQEzOB~X{DPjj=6h@qRcRR5QVry)l@o{p}m zB(ZVOFI5?q(?l+g%yXl{Ge*zspPPAUSdJvFPGt15Qo>PjZU4qhhY};w(c9^yNl(I> z9W21C+o>Op-tgYwV8b1CXwgEDd_LkW+HxF*C`W8OEKSIq&dHU!nni;mjajgMbOKV_ zVE09AOH7)&kueo9=A=&G&!J2rF{ap#c-=0svROq#yR80OGc@lDI%#${(QDvL;6mkn zF9Sd&H5lBjHUc?9DCf70y6jYvy0tfpW8NNyDR8$g`H6NiChcf- zq0U!Zu0a=7yfSg0BxBh3a|aSH|zwJ}y@il=XfH8YSQy|VeP`HC+9{hv!6O-Hj)?I+{4 zH(IW%NdgJjJ9Ua*?=vdkaHv)ZpKnzaR-~UDyU%Zes3do$ins0&x4L9A`#~U4es^kC z1JdO$dh9_h`iov z`bY~Q&aT46Aw|9I%u7@@$%I~O!^%^1zR0lg$AvHGPPX)?aWUNaLD?o9;nu6_hP{3S)gad8VXtRgrt z>}7>Q8PW^Ya8=n5eSv=@mlY;%ZGU_s7jm*)tAjt7qPGiW_OuN$+gmGXxWUmuI(&^+ zTwt`&uXbP0n7ZrZ->T&~-ApUD1ghr^&QX0SWIoi(w>UqV9<%?ohd@LW9Zy}pUZW}K z_5od`cdK4;DQM$9j%)-cY7kFj)iUI+!+U4DGY4h;&6aB)9quM7gd8l+c9VHmnh}3d z!(9a@zL6)YQjLpQqvvI7{eCdN5p01myFTCEh!hcI!`BTQ6Wcsitq)vg?@pN6{E`*+ zEMQgbI!!v9K-d$J&A#Gdv2u&@2;*U1Z%ZGbOaIMJee~ax)dl`SR{>jn>`SM03mv7EC(_lf!J7$nW z_C>}7BI&&~7jgp-a|D6EoDj%C&&{^f&1+#uP=NmlWmHjoWVn{D@BN_QxbWV(-ssFX zF3g%ymTb=*5EQSRfy0oi=tfbxn452M6`}^2B+onF@oOZ|rlzL4ZQgpO*Q2j2*MVr9 z46tA_U|y%TG;_~UBhU9`Ubhp!d?_^FsaSV5zVLw(o3DFuR<53c_MNZdvWc?-zWMT#Ir zD3fq7(-6UV|6dDW8j&JU1n;PnNr-TQqe$yS7d((vOkBKf%dY{4w>Y(Ygpxr5Z-I~h u*KXHSY%C-o;37GwXR`?>{ZI4%-lgsiwXi*2rsMjL=vrz|R4bGb5&s33K*9+C diff --git a/website/static/images/cortex-horizontal.svg b/website/static/images/cortex-horizontal.svg deleted file mode 100644 index f6b79366717..00000000000 --- a/website/static/images/cortex-horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/static/images/cortex-stacked-white.png b/website/static/images/cortex-stacked-white.png deleted file mode 100644 index 5d14e3c5211da22fec52e0f9b7d8d8e0103fd59f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93847 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 D>jk9L diff --git a/website/static/images/guides/shuffle-sharding-probability.png b/website/static/images/guides/shuffle-sharding-probability.png deleted file mode 100644 index 658b1c928e9e152260952f6fffb2ef8a4ff0238b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32049 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 diff --git a/website/static/images/logo.png b/website/static/images/logo.png deleted file mode 100755 index 672533ca45b0b245d503b258907a3c0ba3078191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25288 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%0Dg~_IX$=&#+axrMg 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 Y2btTPXx-;R(EtDd07*qoM6N<$f>^>7SpWb4 diff --git a/website/static/images/proposals/parallel-compaction-design.png b/website/static/images/proposals/parallel-compaction-design.png deleted file mode 100644 index 774f7aad7d302e3643ea38108c2678b81c20d61e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20148 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 diff --git a/website/static/images/proposals/parallel-compaction-grouping.png b/website/static/images/proposals/parallel-compaction-grouping.png deleted file mode 100644 index 8fdc7d19836b72787abb40127f84f4c0ee983b60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27544 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 CXBABV diff --git a/website/static/images/proposals/parallel-compaction-kubernetes-jobs.png b/website/static/images/proposals/parallel-compaction-kubernetes-jobs.png deleted file mode 100644 index 66852d8bafc5b846fdd0c5a65329327bd52e868f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19082 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 diff --git a/website/static/images/proposals/parallel-compaction-without-scheduler.png b/website/static/images/proposals/parallel-compaction-without-scheduler.png deleted file mode 100644 index 032d68acaa846a544c70ed78eee49bb5e99972f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22698 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 PW5?CYHqciWy&nG?v7atZ diff --git a/website/static/images/proposals/scalable-am.png b/website/static/images/proposals/scalable-am.png deleted file mode 100644 index 734f61ce4c306890310fd160bb6749cf3ca10bc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41736 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 diff --git a/website/static/logos/AWS_logo_RGB.png b/website/static/logos/AWS_logo_RGB.png deleted file mode 100644 index 4ff85d172c80d655207b4ca70d0086fd028e4736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106064 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 Q{GWNc`z|kD8vM - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/static/logos/aspen_mesh.png b/website/static/logos/aspen_mesh.png deleted file mode 100644 index 4a1280a2908c90682d5ec5774ac9d2f8c00243af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9677 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 diff --git a/website/static/logos/buoyant.svg b/website/static/logos/buoyant.svg deleted file mode 100644 index bc2b4f8e89a..00000000000 --- a/website/static/logos/buoyant.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/static/logos/digital_ocean.png b/website/static/logos/digital_ocean.png deleted file mode 100644 index c380cb4be83597923b95ec3e56fc09f81054b727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79486 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 diff --git a/website/static/logos/ea.png b/website/static/logos/ea.png deleted file mode 100644 index c85a897613ab0425cac7ef3e4572a210a7b494da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216743 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 NowSlvndFCn{{s$?czgf= literal 0 HcmV?d00001 diff --git a/docs/sources/images/dashboards/mimir-writes.png b/docs/sources/images/dashboards/mimir-writes.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba1243a1f4afa06d99a26d3cf96c44de534ca88 GIT binary patch literal 133337 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