loki: Fix common config net interface name overwritten by ring common config (#5888)

In the case where `instance_interface_names` is declared in the common
configuration AND the common ring configuration is also present,
`instance_interface_names` from common configuration is overwritten by
default ring configuration for all ring components.

This commit fix this issue by overwriting common ring net interface
config IF it is deeply equal to the default one.

Example:

```
common:
  instance_interface_names:
  - interface
  ring:
    kvstore:
      store: inmemory
```

Then,
```
Distributor.DistributorRing.InstanceInterfaceNames ==
defaults.Common.Ring.InstanceInterfaceNames
```

but should be

```
Distributor.DistributorRing.InstanceInterfaceNames == []string{"interface"}
```
pull/5900/head
Mathias Chapelain 3 years ago committed by GitHub
parent bbebc6b2fb
commit e5ed1578c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      CHANGELOG.md
  2. 16
      pkg/loki/config_wrapper.go
  3. 38
      pkg/loki/config_wrapper_test.go

@ -1,4 +1,5 @@
## Main
* [5888](https://github.com/grafana/loki/pull/5888) **Papawy** Fix common config net interface name overwritten by ring common config
* [5799](https://github.com/grafana/loki/pull/5799) **cyriltovena** Fix deduping issues when multiple entries with the same timestamp exist.
* [5799](https://github.com/grafana/loki/pull/5799) **cyriltovena** Fixes deduping issues when multiple entries exists with the same timestamp.
* [5780](https://github.com/grafana/loki/pull/5780) **simonswine**: Update alpine image to 3.15.4.

@ -121,20 +121,16 @@ func (c *ConfigWrapper) ApplyDynamicConfig() cfg.Source {
// - "instance-interface-names", a list of net interfaces used when looking for addresses.
func applyInstanceConfigs(r, defaults *ConfigWrapper) {
if !reflect.DeepEqual(r.Common.InstanceAddr, defaults.Common.InstanceAddr) {
r.Ingester.LifecyclerConfig.Addr = r.Common.InstanceAddr
r.CompactorConfig.CompactorRing.InstanceAddr = r.Common.InstanceAddr
r.Distributor.DistributorRing.InstanceAddr = r.Common.InstanceAddr
r.Ruler.Ring.InstanceAddr = r.Common.InstanceAddr
r.QueryScheduler.SchedulerRing.InstanceAddr = r.Common.InstanceAddr
if reflect.DeepEqual(r.Common.Ring.InstanceAddr, defaults.Common.Ring.InstanceAddr) {
r.Common.Ring.InstanceAddr = r.Common.InstanceAddr
}
r.Frontend.FrontendV2.Addr = r.Common.InstanceAddr
}
if !reflect.DeepEqual(r.Common.InstanceInterfaceNames, defaults.Common.InstanceInterfaceNames) {
r.Ingester.LifecyclerConfig.InfNames = r.Common.InstanceInterfaceNames
r.CompactorConfig.CompactorRing.InstanceInterfaceNames = r.Common.InstanceInterfaceNames
r.Distributor.DistributorRing.InstanceInterfaceNames = r.Common.InstanceInterfaceNames
r.Ruler.Ring.InstanceInterfaceNames = r.Common.InstanceInterfaceNames
r.QueryScheduler.SchedulerRing.InstanceInterfaceNames = r.Common.InstanceInterfaceNames
if reflect.DeepEqual(r.Common.Ring.InstanceInterfaceNames, defaults.Common.Ring.InstanceInterfaceNames) {
r.Common.Ring.InstanceInterfaceNames = r.Common.InstanceInterfaceNames
}
r.Frontend.FrontendV2.InfNames = r.Common.InstanceInterfaceNames
}
}

@ -1484,4 +1484,42 @@ common:
assert.Equal(t, []string{"ringsshouldntusethis"}, config.Frontend.FrontendV2.InfNames) // not a ring.
assert.Equal(t, []string{"ringsshouldusethis"}, config.CompactorConfig.CompactorRing.InstanceInterfaceNames)
})
t.Run("common instance net interface doesn't get overwritten by common ring config", func(t *testing.T) {
yamlContent := `common:
instance_interface_names:
- interface
ring:
kvstore:
store: inmemory`
config, _, err := configWrapperFromYAML(t, yamlContent, nil)
assert.NoError(t, err)
assert.Equal(t, []string{"interface"}, config.Distributor.DistributorRing.InstanceInterfaceNames)
assert.Equal(t, []string{"interface"}, config.Ingester.LifecyclerConfig.InfNames)
assert.Equal(t, []string{"interface"}, config.Ruler.Ring.InstanceInterfaceNames)
assert.Equal(t, []string{"interface"}, config.QueryScheduler.SchedulerRing.InstanceInterfaceNames)
assert.Equal(t, []string{"interface"}, config.Frontend.FrontendV2.InfNames)
assert.Equal(t, []string{"interface"}, config.CompactorConfig.CompactorRing.InstanceInterfaceNames)
})
t.Run("common instance net interface doesn't supersede net interface from common ring with additional config", func(t *testing.T) {
yamlContent := `common:
instance_interface_names:
- ringsshouldntusethis
ring:
instance_interface_names:
- ringsshouldusethis
kvstore:
store: inmemory`
config, _, err := configWrapperFromYAML(t, yamlContent, nil)
assert.NoError(t, err)
assert.Equal(t, []string{"ringsshouldusethis"}, config.Distributor.DistributorRing.InstanceInterfaceNames)
assert.Equal(t, []string{"ringsshouldusethis"}, config.Ingester.LifecyclerConfig.InfNames)
assert.Equal(t, []string{"ringsshouldusethis"}, config.Ruler.Ring.InstanceInterfaceNames)
assert.Equal(t, []string{"ringsshouldusethis"}, config.QueryScheduler.SchedulerRing.InstanceInterfaceNames)
assert.Equal(t, []string{"ringsshouldntusethis"}, config.Frontend.FrontendV2.InfNames) // not a ring.
assert.Equal(t, []string{"ringsshouldusethis"}, config.CompactorConfig.CompactorRing.InstanceInterfaceNames)
})
}

Loading…
Cancel
Save