Skip to content

Commit

Permalink
mimirtool config: GEM conversions & ring.instance_id (#1513)
Browse files Browse the repository at this point in the history
* Add GEM-specific conversions

Signed-off-by: Dimitar Dimitrov <dimitar.dimitrov@grafana.com>

* Update tests for GEM

Signed-off-by: Dimitar Dimitrov <dimitar.dimitrov@grafana.com>

* Update GEM descriptor

Signed-off-by: Dimitar Dimitrov <dimitar.dimitrov@grafana.com>

* Update descriptors with hidden fields

Signed-off-by: Dimitar Dimitrov <dimitar.dimitrov@grafana.com>

* Set instance-ids for GEM's admin-api too

Signed-off-by: Dimitar Dimitrov <dimitar.dimitrov@grafana.com>

* Make tests pass & move GEM removed options to gem.go

Signed-off-by: Dimitar Dimitrov <dimitar.dimitrov@grafana.com>
  • Loading branch information
dimitarvdimitrov committed Mar 21, 2022
1 parent 667224f commit 8e34a5f
Show file tree
Hide file tree
Showing 21 changed files with 1,088 additions and 203 deletions.
303 changes: 199 additions & 104 deletions pkg/mimirtool/config/convert_test.go

Large diffs are not rendered by default.

94 changes: 56 additions & 38 deletions pkg/mimirtool/config/cortex.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
func CortexToMimirMapper() Mapper {
return MultiMapper{
mapCortexInstanceInterfaceNames(),
// first try to naively map keys from old config to same keys from new config
// Try to naively map keys from old config to same keys from new config
BestEffortDirectMapper{},
// next map alertmanager URL in the ruler config
MapperFunc(alertmanagerURLMapperFunc),
Expand All @@ -31,13 +31,15 @@ func CortexToMimirMapper() Mapper {
// Remap sharding configs
MapperFunc(updateKVStoreValue),
// Convert provided memcached service and host to the DNS service discovery format
MapperFunc(mapMemcachedAddresses),
mapMemcachedAddresses("query_range.results_cache.cache.memcached_client", "frontend.results_cache.memcached"),
// Map `-*.s3.url` to `-*.s3.(endpoint|access_key_id|secret_access_key)`
mapRulerAlertmanagerS3URL("alertmanager.storage", "alertmanager_storage"), mapRulerAlertmanagerS3URL("ruler.storage", "ruler_storage"),
// Map `-*.s3.bucketnames` and (maybe part of `-*s3.s3.url`) to `-*.s3.bucket-name`
mapRulerAlertmanagerS3Buckets("alertmanager.storage", "alertmanager_storage"), mapRulerAlertmanagerS3Buckets("ruler.storage", "ruler_storage"),
// Prevent server.http_listen_port from being updated with a new default and always output it.
MapperFunc(mapServerHTTPListenPort),
setOldDefaultExplicitly("server.http_listen_port"),
// Manually override the dynamic fields' default values.
MapperFunc(mapCortexRingInstanceIDDefaults),
// Set frontend.results_cache.backend when results cache was enabled in cortex
MapperFunc(mapQueryFrontendBackend),
}
Expand Down Expand Up @@ -130,6 +132,7 @@ var cortexRenameMappings = map[string]Mapping{
"ingester.lifecycler.ring.zone_awareness_enabled": RenameMapping("ingester.ring.zone_awareness_enabled"),
"ingester.lifecycler.tokens_file_path": RenameMapping("ingester.ring.tokens_file_path"),
"ingester.lifecycler.unregister_on_shutdown": RenameMapping("ingester.ring.unregister_on_shutdown"),
notInYaml + ".ingester-lifecycler-id": RenameMapping("ingester.ring.instance_id"),

"auth_enabled": RenameMapping("multitenancy_enabled"),
}
Expand Down Expand Up @@ -453,26 +456,25 @@ func mapRulerAlertmanagerS3Buckets(dotStoragePath, storagePath string) Mapper {
// mapMemcachedAddresses maps query_range...memcached_client.host and .service to a DNS Service Discovery format
// address. This should preserve the behaviour in cortex v1.11.0:
// https://github.com/cortexproject/cortex/blob/43c646ba3ff906e80a6a1812f2322a0c276e9deb/pkg/chunk/cache/memcached_client.go#L242-L258
func mapMemcachedAddresses(source, target Parameters) error {
const (
oldPrefix = "query_range.results_cache.cache.memcached_client"
newPrefix = "frontend.results_cache.memcached"
)
presetAddressesVal, err := source.GetValue(oldPrefix + ".addresses")
if err != nil {
return err
}
if presetAddressesVal.AsString() != "" {
return nil // respect already set values of addresses
}
// Also applies to GEM and graphite querier caches
func mapMemcachedAddresses(oldPrefix, newPrefix string) MapperFunc {
return func(source, target Parameters) error {
presetAddressesVal, err := source.GetValue(oldPrefix + ".addresses")
if err != nil {
return err
}
if presetAddressesVal.AsString() != "" {
return nil // respect already set values of addresses
}

service, hostname := source.MustGetValue(oldPrefix+".service"), source.MustGetValue(oldPrefix+".host")
if service.IsUnset() || hostname.IsUnset() {
return nil
}
newAddress := fmt.Sprintf("dnssrvnoa+_%s._tcp.%s", service.AsString(), hostname.AsString())
service, hostname := source.MustGetValue(oldPrefix+".service"), source.MustGetValue(oldPrefix+".host")
if service.IsUnset() || hostname.IsUnset() {
return nil
}
newAddress := fmt.Sprintf("dnssrvnoa+_%s._tcp.%s", service.AsString(), hostname.AsString())

return target.SetValue(newPrefix+".addresses", StringValue(newAddress))
return target.SetValue(newPrefix+".addresses", StringValue(newAddress))
}
}

func mapCortexInstanceInterfaceNames() Mapper {
Expand Down Expand Up @@ -503,7 +505,8 @@ func mapInstanceInterfaceNames(ifaceNames map[string]string) Mapper {
}
instanceNamesVal, _ := source.GetValue(sourcePath)
if !instanceNamesVal.IsUnset() {
// The user has set the value to something, we want to keep that
// The user has set the value to something, we want to keep that.
// But also when mapping defaults this restores the old default when mapping defaults after we've set it to Nil above.
errs.Add(target.SetValue(targetPath, instanceNamesVal))
continue
}
Expand All @@ -513,21 +516,24 @@ func mapInstanceInterfaceNames(ifaceNames map[string]string) Mapper {
})
}

func mapServerHTTPListenPort(source, target Parameters) error {
portVal, err := source.GetValue("server.http_listen_port")
if err != nil {
return err
}
// If the port wasn't set, or it was set to the default
if portVal.IsUnset() || !differentFromDefault(source, "server.http_listen_port") {
err = target.SetValue("server.http_listen_port", IntValue(80))
// We set the default after the value itself because when mapping defaults
// calling `SetValue` actually modifies the default value. So we want to retain the target default as it is.
err2 := target.SetDefaultValue("server.http_listen_port", IntValue(8080))
return multierror.New(err, err2).Err()
}
func setOldDefaultExplicitly(path string) Mapper {
return MapperFunc(func(source, target Parameters) error {
v, err := source.GetValue(path)
if err != nil {
return err
}

return nil
if v.IsUnset() || !differentFromDefault(source, path) {
err = target.SetValue(path, source.MustGetDefaultValue(path))
// We set the default again after the value itself because when prepareSourceDefaults is mapping defaults
// `SetValue` actually sets the default value.
// Also set the source default to Nil, so that when updating defaults this parameter isn't affected
err2 := target.SetDefaultValue(path, Nil)
return multierror.New(err, err2).Err()
}

return nil
})
}

func mapQueryFrontendBackend(source, target Parameters) error {
Expand All @@ -538,8 +544,19 @@ func mapQueryFrontendBackend(source, target Parameters) error {
return nil
}

func mapCortexRingInstanceIDDefaults(source, target Parameters) error {
return multierror.New(
target.SetDefaultValue("alertmanager.sharding_ring.instance_id", Nil),
target.SetDefaultValue("compactor.sharding_ring.instance_id", Nil),
target.SetDefaultValue("distributor.ring.instance_id", Nil),
target.SetDefaultValue("ingester.ring.instance_id", Nil),
target.SetDefaultValue("ruler.ring.instance_id", Nil),
target.SetDefaultValue("store_gateway.sharding_ring.instance_id", Nil),
).Err()
}

// YAML Paths for config options removed since Cortex 1.11.0.
var removedConfigPaths = []string{
var removedConfigPaths = append(gemRemovedConfigPath, []string{
"flusher.concurrent_flushes", // -flusher.concurrent-flushes
"flusher.flush_op_timeout", // -flusher.flush-op-timeout
"flusher.wal_dir", // -flusher.wal-dir
Expand Down Expand Up @@ -1007,6 +1024,7 @@ var removedConfigPaths = []string{
"alertmanager.auto_webhook_root", // -alertmanager.configs.auto-webhook-root
"api.response_compression_enabled", // -api.response-compression-enabled
"compactor.sharding_enabled", // -compactor.sharding-enabled
"compactor.sharding_strategy", // -compactor.sharding-strategy
"distributor.extra_queue_delay", // -distributor.extra-query-delay
"distributor.shard_by_all_labels", // -distributor.shard-by-all-labels
"distributor.sharding_strategy", // -distributor.sharding-strategy
Expand All @@ -1027,7 +1045,7 @@ var removedConfigPaths = []string{
"ruler.sharding_strategy", // -ruler.sharding-strategy
"store_gateway.sharding_enabled", // -store-gateway.sharding-enabled
"store_gateway.sharding_strategy", // -store-gateway.sharding-strategy
}
}...)

// CLI options removed since Cortex 1.10.0. These flags only existed as CLI Flags, and were not included in YAML Config.
var removedCLIOptions = []string{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,15 @@
"fieldDefaultValue": 0,
"fieldFlag": "event.sample-rate",
"fieldType": "int"
},
{
"kind": "field",
"name": "ingester-lifecycler-id",
"required": false,
"desc": "ID to register in the ring.",
"fieldDefaultValue": null,
"fieldFlag": "ingester.lifecycler.id",
"fieldType": "string"
}
]
}
Loading

0 comments on commit 8e34a5f

Please sign in to comment.