Skip to content

Commit 31f0ca4

Browse files
Merge pull request #804 from lilic/user-workload-config
Allow user workload monitoring configuration ConfigMap to be created in UWM ns
2 parents 81e3ed6 + 882dc1b commit 31f0ca4

16 files changed

+630
-298
lines changed

Diff for: CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
- [#714](https://github.com/openshift/cluster-monitoring-operator/pull/714) Validate new/updated PrometheusRule custom resources against the prometheus-operator rule validation API.
66
- [#799](https://github.com/openshift/cluster-monitoring-operator/pull/799) Rules federation support.
77
- [#800](https://github.com/openshift/cluster-monitoring-operator/pull/800) Collect metrics and implement alerting rules for Thanos querier.
8+
- [#804](https://github.com/openshift/cluster-monitoring-operator/pull/804) Allow user workload monitoring configuration ConfigMap to be created in openshift-user-workload-monitoring namespace.

Diff for: cmd/operator/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ func Main() int {
155155
return 1
156156
}
157157

158-
o, err := cmo.New(config, *releaseVersion, *namespace, *namespaceUserWorkload, *namespaceSelector, *configMapName, *remoteWrite, images.asMap(), telemetryConfig.Matches)
158+
userWorkloadConfigMapName := "user-workload-monitoring-config"
159+
o, err := cmo.New(config, *releaseVersion, *namespace, *namespaceUserWorkload, *namespaceSelector, *configMapName, userWorkloadConfigMapName, *remoteWrite, images.asMap(), telemetryConfig.Matches)
159160
if err != nil {
160161
fmt.Fprint(os.Stderr, err)
161162
return 1

Diff for: examples/config/config.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ prometheusK8s:
1111
cpu: 200m
1212
memory: 2Gi
1313
alertmanagerMain:
14+
volumeClaimTemplate:
15+
spec:
16+
resources:
17+
requests:
18+
storage: 15Gi
1419
baseImage: quay.io/prometheus/alertmanager
1520
externalUrl: https://monitoring-demo.staging.core-os.net/alertmanager
1621
resources:
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: user-workload-monitoring-config
5+
namespace: openshift-user-workload-monitoring
6+
data:
7+
config.yaml: |
8+
prometheusOperator:
9+
resources:
10+
requests:
11+
cpu: 200m
12+
memory: 2Gi
13+
prometheus:
14+
retention: 24h
15+
resources:
16+
requests:
17+
cpu: 200m
18+
memory: 2Gi
19+
thanosRuler:
20+
resources:
21+
requests:
22+
cpu: 20m
23+
memory: 50Mi

Diff for: pkg/manifests/config.go

+141-73
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,28 @@ type Config struct {
3131
RemoteWrite bool `json:"-"`
3232
Platform configv1.PlatformType `json:"-"`
3333

34-
PrometheusOperatorConfig *PrometheusOperatorConfig `json:"prometheusOperator"`
35-
PrometheusOperatorUserWorkloadConfig *PrometheusOperatorConfig `json:"prometheusOperatorUserWorkload"`
36-
37-
PrometheusK8sConfig *PrometheusK8sConfig `json:"prometheusK8s"`
38-
PrometheusUserWorkloadConfig *PrometheusK8sConfig `json:"prometheusUserWorkload"`
34+
ClusterMonitoringConfiguration *ClusterMonitoringConfiguration `json:"-"`
35+
UserWorkloadConfiguration *UserWorkloadConfiguration `json:"-"`
36+
}
3937

40-
AlertmanagerMainConfig *AlertmanagerMainConfig `json:"alertmanagerMain"`
41-
KubeStateMetricsConfig *KubeStateMetricsConfig `json:"kubeStateMetrics"`
42-
OpenShiftMetricsConfig *OpenShiftStateMetricsConfig `json:"openshiftStateMetrics"`
43-
GrafanaConfig *GrafanaConfig `json:"grafana"`
44-
EtcdConfig *EtcdConfig `json:"-"`
45-
HTTPConfig *HTTPConfig `json:"http"`
46-
TelemeterClientConfig *TelemeterClientConfig `json:"telemeterClient"`
47-
K8sPrometheusAdapter *K8sPrometheusAdapter `json:"k8sPrometheusAdapter"`
48-
UserWorkloadConfig *UserWorkloadConfig `json:"techPreviewUserWorkload"`
49-
ThanosRulerConfig *ThanosRulerConfig `json:"thanosRuler"`
50-
ThanosQuerierConfig *ThanosQuerierConfig `json:"thanosQuerier"`
38+
type ClusterMonitoringConfiguration struct {
39+
PrometheusOperatorConfig *PrometheusOperatorConfig `json:"prometheusOperator"`
40+
PrometheusK8sConfig *PrometheusK8sConfig `json:"prometheusK8s"`
41+
AlertmanagerMainConfig *AlertmanagerMainConfig `json:"alertmanagerMain"`
42+
KubeStateMetricsConfig *KubeStateMetricsConfig `json:"kubeStateMetrics"`
43+
OpenShiftMetricsConfig *OpenShiftStateMetricsConfig `json:"openshiftStateMetrics"`
44+
GrafanaConfig *GrafanaConfig `json:"grafana"`
45+
EtcdConfig *EtcdConfig `json:"-"`
46+
HTTPConfig *HTTPConfig `json:"http"`
47+
TelemeterClientConfig *TelemeterClientConfig `json:"telemeterClient"`
48+
K8sPrometheusAdapter *K8sPrometheusAdapter `json:"k8sPrometheusAdapter"`
49+
ThanosQuerierConfig *ThanosQuerierConfig `json:"thanosQuerier"`
50+
UserWorkloadEnabled *bool `json:"enableUserWorkload"`
51+
// TODO: Remove in 4.7 release.
52+
PrometheusUserWorkloadConfig *PrometheusK8sConfig `json:"prometheusUserWorkload"`
53+
PrometheusOperatorUserWorkloadConfig *PrometheusOperatorConfig `json:"prometheusOperatorUserWorkload"`
54+
ThanosRulerConfig *ThanosRulerConfig `json:"thanosRuler"`
55+
UserWorkloadConfig *UserWorkloadConfig `json:"techPreviewUserWorkload"`
5156
}
5257

5358
type Images struct {
@@ -75,11 +80,13 @@ type HTTPConfig struct {
7580
}
7681

7782
type PrometheusOperatorConfig struct {
83+
LogLevel string `json:"logLevel"`
7884
NodeSelector map[string]string `json:"nodeSelector"`
7985
Tolerations []v1.Toleration `json:"tolerations"`
8086
}
8187

8288
type PrometheusK8sConfig struct {
89+
LogLevel string `json:"logLevel"`
8390
Retention string `json:"retention"`
8491
NodeSelector map[string]string `json:"nodeSelector"`
8592
Tolerations []v1.Toleration `json:"tolerations"`
@@ -100,6 +107,7 @@ type AlertmanagerMainConfig struct {
100107
}
101108

102109
type ThanosRulerConfig struct {
110+
LogLevel string `json:"logLevel"`
103111
NodeSelector map[string]string `json:"nodeSelector"`
104112
Tolerations []v1.Toleration `json:"tolerations"`
105113
Resources *v1.ResourceRequirements `json:"resources"`
@@ -150,15 +158,6 @@ type UserWorkloadConfig struct {
150158
Enabled *bool `json:"enabled"`
151159
}
152160

153-
// IsEnabled returns the underlying value of the `Enabled` boolean pointer.
154-
// It defaults to false if the pointer is nil.
155-
func (c *UserWorkloadConfig) IsEnabled() bool {
156-
if c.Enabled == nil {
157-
return false
158-
}
159-
return *c.Enabled
160-
}
161-
162161
type TelemeterClientConfig struct {
163162
ClusterID string `json:"clusterID"`
164163
Enabled *bool `json:"enabled"`
@@ -184,14 +183,15 @@ func (cfg *TelemeterClientConfig) IsEnabled() bool {
184183

185184
func NewConfig(content io.Reader) (*Config, error) {
186185
c := Config{}
187-
188-
err := k8syaml.NewYAMLOrJSONDecoder(content, 100).Decode(&c)
186+
cmc := ClusterMonitoringConfiguration{}
187+
err := k8syaml.NewYAMLOrJSONDecoder(content, 4096).Decode(&cmc)
189188
if err != nil {
190189
return nil, err
191190
}
192-
191+
c.ClusterMonitoringConfiguration = &cmc
193192
res := &c
194193
res.applyDefaults()
194+
c.UserWorkloadConfiguration = NewDefaultUserWorkloadMonitoringConfig()
195195

196196
return res, nil
197197
}
@@ -200,58 +200,65 @@ func (c *Config) applyDefaults() {
200200
if c.Images == nil {
201201
c.Images = &Images{}
202202
}
203-
if c.PrometheusOperatorConfig == nil {
204-
c.PrometheusOperatorConfig = &PrometheusOperatorConfig{}
203+
if c.ClusterMonitoringConfiguration == nil {
204+
c.ClusterMonitoringConfiguration = &ClusterMonitoringConfiguration{}
205+
}
206+
if c.ClusterMonitoringConfiguration.PrometheusOperatorConfig == nil {
207+
c.ClusterMonitoringConfiguration.PrometheusOperatorConfig = &PrometheusOperatorConfig{}
205208
}
206-
if c.PrometheusOperatorUserWorkloadConfig == nil {
207-
c.PrometheusOperatorUserWorkloadConfig = &PrometheusOperatorConfig{}
209+
if c.ClusterMonitoringConfiguration.PrometheusOperatorUserWorkloadConfig == nil {
210+
c.ClusterMonitoringConfiguration.PrometheusOperatorUserWorkloadConfig = &PrometheusOperatorConfig{}
208211
}
209-
if c.PrometheusK8sConfig == nil {
210-
c.PrometheusK8sConfig = &PrometheusK8sConfig{}
212+
if c.ClusterMonitoringConfiguration.PrometheusK8sConfig == nil {
213+
c.ClusterMonitoringConfiguration.PrometheusK8sConfig = &PrometheusK8sConfig{}
211214
}
212-
if c.PrometheusK8sConfig.Retention == "" {
213-
c.PrometheusK8sConfig.Retention = "15d"
215+
if c.ClusterMonitoringConfiguration.PrometheusK8sConfig.Retention == "" {
216+
c.ClusterMonitoringConfiguration.PrometheusK8sConfig.Retention = "15d"
214217
}
215-
if c.PrometheusUserWorkloadConfig == nil {
216-
c.PrometheusUserWorkloadConfig = &PrometheusK8sConfig{}
218+
if c.ClusterMonitoringConfiguration.PrometheusUserWorkloadConfig == nil {
219+
c.ClusterMonitoringConfiguration.PrometheusUserWorkloadConfig = &PrometheusK8sConfig{}
217220
}
218-
if c.PrometheusUserWorkloadConfig.Retention == "" {
219-
c.PrometheusUserWorkloadConfig.Retention = "15d"
221+
if c.ClusterMonitoringConfiguration.PrometheusUserWorkloadConfig.Retention == "" {
222+
c.ClusterMonitoringConfiguration.PrometheusUserWorkloadConfig.Retention = "15d"
220223
}
221-
if c.AlertmanagerMainConfig == nil {
222-
c.AlertmanagerMainConfig = &AlertmanagerMainConfig{}
224+
if c.ClusterMonitoringConfiguration.AlertmanagerMainConfig == nil {
225+
c.ClusterMonitoringConfiguration.AlertmanagerMainConfig = &AlertmanagerMainConfig{}
223226
}
224-
if c.ThanosRulerConfig == nil {
225-
c.ThanosRulerConfig = &ThanosRulerConfig{}
227+
if c.ClusterMonitoringConfiguration.UserWorkloadEnabled == nil {
228+
disable := false
229+
c.ClusterMonitoringConfiguration.UserWorkloadEnabled = &disable
226230
}
227-
if c.ThanosQuerierConfig == nil {
228-
c.ThanosQuerierConfig = &ThanosQuerierConfig{}
231+
if c.ClusterMonitoringConfiguration.ThanosRulerConfig == nil {
232+
c.ClusterMonitoringConfiguration.ThanosRulerConfig = &ThanosRulerConfig{}
229233
}
230-
if c.GrafanaConfig == nil {
231-
c.GrafanaConfig = &GrafanaConfig{}
234+
if c.ClusterMonitoringConfiguration.ThanosQuerierConfig == nil {
235+
c.ClusterMonitoringConfiguration.ThanosQuerierConfig = &ThanosQuerierConfig{}
232236
}
233-
if c.KubeStateMetricsConfig == nil {
234-
c.KubeStateMetricsConfig = &KubeStateMetricsConfig{}
237+
if c.ClusterMonitoringConfiguration.GrafanaConfig == nil {
238+
c.ClusterMonitoringConfiguration.GrafanaConfig = &GrafanaConfig{}
235239
}
236-
if c.OpenShiftMetricsConfig == nil {
237-
c.OpenShiftMetricsConfig = &OpenShiftStateMetricsConfig{}
240+
if c.ClusterMonitoringConfiguration.KubeStateMetricsConfig == nil {
241+
c.ClusterMonitoringConfiguration.KubeStateMetricsConfig = &KubeStateMetricsConfig{}
238242
}
239-
if c.HTTPConfig == nil {
240-
c.HTTPConfig = &HTTPConfig{}
243+
if c.ClusterMonitoringConfiguration.OpenShiftMetricsConfig == nil {
244+
c.ClusterMonitoringConfiguration.OpenShiftMetricsConfig = &OpenShiftStateMetricsConfig{}
241245
}
242-
if c.TelemeterClientConfig == nil {
243-
c.TelemeterClientConfig = &TelemeterClientConfig{
246+
if c.ClusterMonitoringConfiguration.HTTPConfig == nil {
247+
c.ClusterMonitoringConfiguration.HTTPConfig = &HTTPConfig{}
248+
}
249+
if c.ClusterMonitoringConfiguration.TelemeterClientConfig == nil {
250+
c.ClusterMonitoringConfiguration.TelemeterClientConfig = &TelemeterClientConfig{
244251
TelemeterServerURL: "https://infogw.api.openshift.com/",
245252
}
246253
}
247-
if c.K8sPrometheusAdapter == nil {
248-
c.K8sPrometheusAdapter = &K8sPrometheusAdapter{}
254+
if c.ClusterMonitoringConfiguration.K8sPrometheusAdapter == nil {
255+
c.ClusterMonitoringConfiguration.K8sPrometheusAdapter = &K8sPrometheusAdapter{}
249256
}
250-
if c.EtcdConfig == nil {
251-
c.EtcdConfig = &EtcdConfig{}
257+
if c.ClusterMonitoringConfiguration.EtcdConfig == nil {
258+
c.ClusterMonitoringConfiguration.EtcdConfig = &EtcdConfig{}
252259
}
253-
if c.UserWorkloadConfig == nil {
254-
c.UserWorkloadConfig = &UserWorkloadConfig{}
260+
if c.ClusterMonitoringConfiguration.UserWorkloadConfig == nil {
261+
c.ClusterMonitoringConfiguration.UserWorkloadConfig = &UserWorkloadConfig{}
255262
}
256263
}
257264

@@ -274,18 +281,18 @@ func (c *Config) SetImages(images map[string]string) {
274281
}
275282

276283
func (c *Config) SetTelemetryMatches(matches []string) {
277-
c.PrometheusK8sConfig.TelemetryMatches = matches
284+
c.ClusterMonitoringConfiguration.PrometheusK8sConfig.TelemetryMatches = matches
278285
}
279286

280287
func (c *Config) SetRemoteWrite(rw bool) {
281288
c.RemoteWrite = rw
282-
if c.RemoteWrite && c.TelemeterClientConfig.TelemeterServerURL == "https://infogw.api.openshift.com/" {
283-
c.TelemeterClientConfig.TelemeterServerURL = "https://infogw.api.openshift.com/metrics/v1/receive"
289+
if c.RemoteWrite && c.ClusterMonitoringConfiguration.TelemeterClientConfig.TelemeterServerURL == "https://infogw.api.openshift.com/" {
290+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.TelemeterServerURL = "https://infogw.api.openshift.com/metrics/v1/receive"
284291
}
285292
}
286293

287294
func (c *Config) LoadClusterID(load func() (*configv1.ClusterVersion, error)) error {
288-
if c.TelemeterClientConfig.ClusterID != "" {
295+
if c.ClusterMonitoringConfiguration.TelemeterClientConfig.ClusterID != "" {
289296
return nil
290297
}
291298

@@ -294,12 +301,12 @@ func (c *Config) LoadClusterID(load func() (*configv1.ClusterVersion, error)) er
294301
return fmt.Errorf("error loading cluster version: %v", err)
295302
}
296303

297-
c.TelemeterClientConfig.ClusterID = string(cv.Spec.ClusterID)
304+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.ClusterID = string(cv.Spec.ClusterID)
298305
return nil
299306
}
300307

301308
func (c *Config) LoadToken(load func() (*v1.Secret, error)) error {
302-
if c.TelemeterClientConfig.Token != "" {
309+
if c.ClusterMonitoringConfiguration.TelemeterClientConfig.Token != "" {
303310
return nil
304311
}
305312

@@ -324,12 +331,12 @@ func (c *Config) LoadToken(load func() (*v1.Secret, error)) error {
324331
return fmt.Errorf("unmarshaling pull secret failed: %v", err)
325332
}
326333

327-
c.TelemeterClientConfig.Token = ps.Auths.COC.Auth
334+
c.ClusterMonitoringConfiguration.TelemeterClientConfig.Token = ps.Auths.COC.Auth
328335
return nil
329336
}
330337

331338
func (c *Config) LoadProxy(load func() (*configv1.Proxy, error)) error {
332-
if c.HTTPConfig.HTTPProxy != "" || c.HTTPConfig.HTTPSProxy != "" || c.HTTPConfig.NoProxy != "" {
339+
if c.ClusterMonitoringConfiguration.HTTPConfig.HTTPProxy != "" || c.ClusterMonitoringConfiguration.HTTPConfig.HTTPSProxy != "" || c.ClusterMonitoringConfiguration.HTTPConfig.NoProxy != "" {
333340
return nil
334341
}
335342

@@ -338,9 +345,9 @@ func (c *Config) LoadProxy(load func() (*configv1.Proxy, error)) error {
338345
return fmt.Errorf("error loading proxy: %v", err)
339346
}
340347

341-
c.HTTPConfig.HTTPProxy = p.Status.HTTPProxy
342-
c.HTTPConfig.HTTPSProxy = p.Status.HTTPSProxy
343-
c.HTTPConfig.NoProxy = p.Status.NoProxy
348+
c.ClusterMonitoringConfiguration.HTTPConfig.HTTPProxy = p.Status.HTTPProxy
349+
c.ClusterMonitoringConfiguration.HTTPConfig.HTTPSProxy = p.Status.HTTPSProxy
350+
c.ClusterMonitoringConfiguration.HTTPConfig.NoProxy = p.Status.NoProxy
344351

345352
return nil
346353
}
@@ -364,6 +371,67 @@ func NewConfigFromString(content string) (*Config, error) {
364371

365372
func NewDefaultConfig() *Config {
366373
c := &Config{}
374+
cmc := ClusterMonitoringConfiguration{}
375+
c.ClusterMonitoringConfiguration = &cmc
376+
c.UserWorkloadConfiguration = NewDefaultUserWorkloadMonitoringConfig()
367377
c.applyDefaults()
368378
return c
369379
}
380+
381+
type UserWorkloadConfiguration struct {
382+
PrometheusOperator *PrometheusOperatorConfig `json:"prometheusOperator"`
383+
Prometheus *PrometheusK8sConfig `json:"prometheus"`
384+
ThanosRuler *ThanosRulerConfig `json:"thanosRuler"`
385+
}
386+
387+
func (u *UserWorkloadConfiguration) applyDefaults() {
388+
if u.PrometheusOperator == nil {
389+
u.PrometheusOperator = &PrometheusOperatorConfig{}
390+
}
391+
if u.Prometheus == nil {
392+
u.Prometheus = &PrometheusK8sConfig{}
393+
}
394+
if u.ThanosRuler == nil {
395+
u.ThanosRuler = &ThanosRulerConfig{}
396+
}
397+
}
398+
399+
func NewUserConfigFromString(content string) (*UserWorkloadConfiguration, error) {
400+
if content == "" {
401+
return NewDefaultUserWorkloadMonitoringConfig(), nil
402+
}
403+
u := &UserWorkloadConfiguration{}
404+
err := k8syaml.NewYAMLOrJSONDecoder(bytes.NewBuffer([]byte(content)), 100).Decode(&u)
405+
if err != nil {
406+
return nil, err
407+
}
408+
409+
u.applyDefaults()
410+
411+
return u, nil
412+
}
413+
414+
func NewDefaultUserWorkloadMonitoringConfig() *UserWorkloadConfiguration {
415+
u := &UserWorkloadConfiguration{}
416+
u.applyDefaults()
417+
return u
418+
}
419+
420+
// IsUserWorkloadEnabled checks if user workload monitoring is
421+
// enabled on old or new configuration.
422+
func (c *Config) IsUserWorkloadEnabled() bool {
423+
if *c.ClusterMonitoringConfiguration.UserWorkloadEnabled == true {
424+
return true
425+
}
426+
427+
return c.ClusterMonitoringConfiguration.UserWorkloadConfig.isEnabled()
428+
}
429+
430+
// isEnabled returns the underlying value of the `Enabled` boolean pointer.
431+
// It defaults to false if the pointer is nil.
432+
func (c *UserWorkloadConfig) isEnabled() bool {
433+
if c.Enabled == nil {
434+
return false
435+
}
436+
return *c.Enabled
437+
}

0 commit comments

Comments
 (0)