Skip to content

Commit 9052910

Browse files
synthe102ptodev
andauthored
fix: add StoreBuilder to mimir.alerts.kubernetes eventProcessor (#5010)
* fix: add StoreBuilder to mimir.alerts.kubernetes eventProcessor Fixes #4975 * Add integration and unit tests * Fix lint error * Add changelog entry --------- Co-authored-by: Paulin Todev <paulin.todev@gmail.com>
1 parent 23c0acf commit 9052910

File tree

7 files changed

+105
-5
lines changed

7 files changed

+105
-5
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ Main (unreleased)
5252

5353
- Fix the `prometheus.operator.*` components internal scrape manager now having a way to enable ingesting native histograms. (@dehaansa)
5454

55+
- [`mimir.alerts.kubernetes`] Fixed a bug which caused Alloy to crash when using a Kubernetes secret or configmap in the AlertmanagerConfig CRD. (@synthe102)
56+
5557
v1.12.0
5658
-----------------
5759

internal/cmd/integration-tests-k8s/tests/mimir-alerts-kubernetes/testdata/expected_1.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ alertmanager_config: |
3434
- name: alloy-namespace/global-config/myreceiver
3535
- name: testing/alertmgr-config1/null
3636
- name: testing/alertmgr-config1/myamc
37+
slack_configs:
38+
- api_url: https://val1.com
39+
fields:
40+
- title: title
41+
value: value`
42+
actions:
43+
- type: type
44+
text: text
45+
name: my-action
46+
confirm:
47+
text: text
3748
webhook_configs:
3849
- url: http://test.url
3950
http_config:

internal/cmd/integration-tests-k8s/tests/mimir-alerts-kubernetes/testdata/expected_2.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,17 @@ alertmanager_config: |
2525
- name: alloy-namespace/global-config/myreceiver
2626
- name: testing/alertmgr-config1/null
2727
- name: testing/alertmgr-config1/myamc
28+
slack_configs:
29+
- api_url: https://val1.com
30+
fields:
31+
- title: title
32+
value: value`
33+
actions:
34+
- type: type
35+
text: text
36+
name: my-action
37+
confirm:
38+
text: text
2839
webhook_configs:
2940
- url: http://test.url
3041
http_config:

internal/cmd/integration-tests-k8s/tests/mimir-alerts-kubernetes/testdata/kubernetes.yml

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ metadata:
1717
name: grafana-alloy
1818
rules:
1919
- apiGroups: [""]
20-
resources: ["namespaces", "configmaps"]
20+
resources: ["namespaces", "configmaps", "secrets"]
2121
verbs: ["get", "list", "watch"]
2222
- apiGroups: ["monitoring.coreos.com"]
2323
resources: ["alertmanagerconfigs"]
@@ -139,6 +139,14 @@ data:
139139
templates:
140140
- 'default_template'
141141
---
142+
apiVersion: v1
143+
kind: Secret
144+
metadata:
145+
name: s-receiver-api-url
146+
namespace: testing
147+
stringData:
148+
api-url: https://val1.com
149+
---
142150
apiVersion: monitoring.coreos.com/v1alpha1
143151
kind: AlertmanagerConfig
144152
metadata:
@@ -159,6 +167,19 @@ spec:
159167
- url: http://test.url
160168
httpConfig:
161169
followRedirects: true
170+
slackConfigs:
171+
- apiURL:
172+
key: api-url
173+
name: "s-receiver-api-url"
174+
actions:
175+
- type: type
176+
text: text
177+
name: my-action
178+
confirm:
179+
text: text
180+
fields:
181+
- title: title
182+
value: value`
162183
---
163184
apiVersion: monitoring.coreos.com/v1alpha1
164185
kind: AlertmanagerConfig

internal/component/mimir/alerts/kubernetes/alerts.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"k8s.io/client-go/informers"
2929
"k8s.io/client-go/kubernetes"
3030

31+
"github.com/prometheus-operator/prometheus-operator/pkg/assets"
3132
promExternalVersions "github.com/prometheus-operator/prometheus-operator/pkg/client/informers/externalversions"
3233
promListers_v1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/client/listers/monitoring/v1alpha1"
3334
promVersioned "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned"
@@ -233,8 +234,9 @@ func (c *Component) Startup(ctx context.Context) error {
233234
if err != nil {
234235
return fmt.Errorf("failed to unmarshal global config: %w", err)
235236
}
237+
sb := assets.NewStoreBuilder(c.k8sClient.CoreV1(), c.k8sClient.CoreV1())
236238

237-
c.eventProcessor = c.newEventProcessor(queue, informerStopChan, namespaceLister, cfgLister, *baseCfg)
239+
c.eventProcessor = c.newEventProcessor(queue, informerStopChan, namespaceLister, cfgLister, *baseCfg, sb)
238240

239241
go c.eventProcessor.run(ctx)
240242
return nil
@@ -346,7 +348,7 @@ func (c *Component) startConfigInformer(queue workqueue.TypedRateLimitingInterfa
346348

347349
func (c *Component) newEventProcessor(queue workqueue.TypedRateLimitingInterface[commonK8s.Event], stopChan chan struct{},
348350
namespaceLister coreListers.NamespaceLister, cfgLister promListers_v1alpha1.AlertmanagerConfigLister,
349-
baseCfg alertmgr_cfg.Config) *eventProcessor {
351+
baseCfg alertmgr_cfg.Config, sb *assets.StoreBuilder) *eventProcessor {
350352

351353
// Deep copy to make sure that a change in arguments won't immediately propagate to the event processor.
352354
templateFiles := make(map[string]string, len(c.args.TemplateFiles))
@@ -366,5 +368,6 @@ func (c *Component) newEventProcessor(queue workqueue.TypedRateLimitingInterface
366368
logger: c.log,
367369
kclient: c.k8sClient,
368370
templateFiles: templateFiles,
371+
storeBuilder: sb,
369372
}
370373
}

internal/component/mimir/alerts/kubernetes/events.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type eventProcessor struct {
4141
namespaceSelector labels.Selector
4242
cfgSelector labels.Selector
4343
kclient go_k8s.Interface
44+
storeBuilder *assets.StoreBuilder
4445

4546
baseCfg alertmgr_cfg.Config
4647
templateFiles map[string]string
@@ -253,7 +254,7 @@ func (e *eventProcessor) desiredStateFromKubernetes(ctx context.Context) (*alert
253254
}
254255
}
255256

256-
cfg, err := e.provisionAlertmanagerConfiguration(ctx, amConfigs, nil)
257+
cfg, err := e.provisionAlertmanagerConfiguration(ctx, amConfigs, e.storeBuilder)
257258
if err != nil {
258259
return nil, fmt.Errorf("failed to provision Alertmanager configuration: %w", err)
259260
}

internal/component/mimir/alerts/kubernetes/events_test.go

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ import (
1313
"github.com/grafana/alloy/internal/mimir/alertmanager"
1414
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
1515
monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1"
16+
"github.com/prometheus-operator/prometheus-operator/pkg/assets"
1617
promListers_v1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/client/listers/monitoring/v1alpha1"
1718
"github.com/stretchr/testify/assert"
1819
"github.com/stretchr/testify/require"
1920
corev1 "k8s.io/api/core/v1"
2021
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2122
"k8s.io/apimachinery/pkg/labels"
2223
"k8s.io/apimachinery/pkg/types"
24+
"k8s.io/client-go/kubernetes/fake"
2325
coreListers "k8s.io/client-go/listers/core/v1"
2426
"k8s.io/client-go/tools/cache"
2527
"k8s.io/client-go/util/workqueue"
@@ -113,7 +115,20 @@ spec:
113115
webhookConfigs:
114116
- url: http://test.url
115117
httpConfig:
116-
followRedirects: true`
118+
followRedirects: true
119+
slackConfigs:
120+
- apiURL:
121+
key: api-url
122+
name: "s-receiver-api-url"
123+
actions:
124+
- type: type
125+
text: text
126+
name: my-action
127+
confirm:
128+
text: text
129+
fields:
130+
- title: title
131+
value: value`
117132

118133
amConfCrd1_mynamespace := fmt.Sprintf(amConfCrd1, "mynamespace", "")
119134
amConfCrd1_mynamespace_alloyLabel := fmt.Sprintf(amConfCrd1, "mynamespace", `{alloy: "yes"}`)
@@ -160,6 +175,17 @@ receivers:
160175
- name: "null"
161176
- name: mynamespace/alertmgr-config1/null
162177
- name: mynamespace/alertmgr-config1/myamc
178+
slack_configs:
179+
- api_url: https://val1.com
180+
fields:
181+
- title: title
182+
value: value
183+
actions:
184+
- type: type
185+
text: text
186+
name: my-action
187+
confirm:
188+
text: text
163189
webhook_configs:
164190
- http_config:
165191
follow_redirects: true
@@ -196,6 +222,17 @@ receivers:
196222
- name: "null"
197223
- name: mynamespace/alertmgr-config1/null
198224
- name: mynamespace/alertmgr-config1/myamc
225+
slack_configs:
226+
- api_url: https://val1.com
227+
fields:
228+
- title: title
229+
value: value
230+
actions:
231+
- type: type
232+
text: text
233+
name: my-action
234+
confirm:
235+
text: text
199236
webhook_configs:
200237
- http_config:
201238
follow_redirects: true
@@ -349,6 +386,19 @@ spec:
349386
testLogger = util.TestLogger(t)
350387
}
351388

389+
c := fake.NewSimpleClientset(
390+
&corev1.Secret{
391+
ObjectMeta: metav1.ObjectMeta{
392+
Name: "s-receiver-api-url",
393+
Namespace: "mynamespace",
394+
},
395+
Data: map[string][]byte{
396+
"api-url": []byte("https://val1.com"),
397+
},
398+
},
399+
)
400+
store := assets.NewStoreBuilder(c.CoreV1(), c.CoreV1())
401+
352402
processor := &eventProcessor{
353403
queue: workqueue.NewTypedRateLimitingQueue(workqueue.DefaultTypedControllerRateLimiter[kubernetes.Event]()),
354404
stopChan: make(chan struct{}),
@@ -361,6 +411,7 @@ spec:
361411
cfgSelector: cfgSelector,
362412
metrics: newMetrics(),
363413
logger: testLogger,
414+
storeBuilder: store,
364415
}
365416

366417
ctx := t.Context()

0 commit comments

Comments
 (0)