Skip to content

Commit ac5b1d6

Browse files
Merge pull request #563 from vyzigold/mysqld_exporter_scrapeconfig
[OSPRH-11074] Add mysqld_exporter scrapeconfig
2 parents acb0410 + 20c9fa5 commit ac5b1d6

File tree

4 files changed

+209
-14
lines changed

4 files changed

+209
-14
lines changed

controllers/metricstorage_controller.go

Lines changed: 98 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ import (
6363
"github.com/openstack-k8s-operators/telemetry-operator/pkg/dashboards"
6464
metricstorage "github.com/openstack-k8s-operators/telemetry-operator/pkg/metricstorage"
6565
telemetry "github.com/openstack-k8s-operators/telemetry-operator/pkg/telemetry"
66+
utils "github.com/openstack-k8s-operators/telemetry-operator/pkg/utils"
6667
rabbitmqv1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
6768
monv1 "github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring/v1"
6869
monv1alpha1 "github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring/v1alpha1"
@@ -515,8 +516,7 @@ func (r *MetricStorageReconciler) createServiceScrapeConfig(
515516
log logr.Logger,
516517
description string,
517518
serviceName string,
518-
targets interface{},
519-
tlsEnabled bool,
519+
desiredScrapeConfig *monv1alpha1.ScrapeConfig,
520520
) error {
521521
scrapeConfig := &monv1alpha1.ScrapeConfig{
522522
ObjectMeta: metav1.ObjectMeta{
@@ -525,10 +525,6 @@ func (r *MetricStorageReconciler) createServiceScrapeConfig(
525525
},
526526
}
527527
op, err := controllerutil.CreateOrPatch(ctx, r.Client, scrapeConfig, func() error {
528-
desiredScrapeConfig := metricstorage.ScrapeConfig(instance,
529-
serviceLabels,
530-
targets,
531-
tlsEnabled)
532528
desiredScrapeConfig.Spec.DeepCopyInto(&scrapeConfig.Spec)
533529
scrapeConfig.ObjectMeta.Labels = desiredScrapeConfig.ObjectMeta.Labels
534530
err := controllerutil.SetControllerReference(instance, scrapeConfig, r.Scheme)
@@ -562,8 +558,14 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
562558
ceilometerRoute := fmt.Sprintf("%s-internal.%s.svc", ceilometer.ServiceName, instance.Namespace)
563559
ceilometerTarget := []string{fmt.Sprintf("%s:%d", ceilometerRoute, ceilometer.CeilometerPrometheusPort)}
564560
ceilometerCfgName := fmt.Sprintf("%s-ceilometer", telemetry.ServiceName)
561+
desiredScrapeConfig := metricstorage.ScrapeConfig(
562+
instance,
563+
serviceLabels,
564+
ceilometerTarget,
565+
instance.Spec.PrometheusTLS.Enabled(),
566+
)
565567
err = r.createServiceScrapeConfig(ctx, instance, Log, "Ceilometer",
566-
ceilometerCfgName, ceilometerTarget, instance.Spec.PrometheusTLS.Enabled())
568+
ceilometerCfgName, desiredScrapeConfig)
567569
if err != nil {
568570
return ctrl.Result{}, err
569571
}
@@ -572,8 +574,14 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
572574
ksmRoute := fmt.Sprintf("%s.%s.svc", availability.KSMServiceName, instance.Namespace)
573575
ksmTarget := []string{fmt.Sprintf("%s:%d", ksmRoute, availability.KSMMetricsPort)}
574576
ksmCfgName := fmt.Sprintf("%s-ksm", telemetry.ServiceName)
577+
desiredScrapeConfig = metricstorage.ScrapeConfig(
578+
instance,
579+
serviceLabels,
580+
ksmTarget,
581+
instance.Spec.PrometheusTLS.Enabled(),
582+
)
575583
err = r.createServiceScrapeConfig(ctx, instance, Log, "kube-state-metrics",
576-
ksmCfgName, ksmTarget, instance.Spec.PrometheusTLS.Enabled())
584+
ksmCfgName, desiredScrapeConfig)
577585
if err != nil {
578586
return ctrl.Result{}, err
579587
}
@@ -596,8 +604,14 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
596604
rabbitTargets = append(rabbitTargets, fmt.Sprintf("%s:%d", rabbitServerName, metricstorage.RabbitMQPrometheusPort))
597605
}
598606
rabbitCfgName := fmt.Sprintf("%s-rabbitmq", telemetry.ServiceName)
607+
desiredScrapeConfig = metricstorage.ScrapeConfig(
608+
instance,
609+
serviceLabels,
610+
rabbitTargets,
611+
instance.Spec.PrometheusTLS.Enabled(),
612+
)
599613
err = r.createServiceScrapeConfig(ctx, instance, Log, "RabbitMQ",
600-
rabbitCfgName, rabbitTargets, instance.Spec.PrometheusTLS.Enabled())
614+
rabbitCfgName, desiredScrapeConfig)
601615
if err != nil {
602616
return ctrl.Result{}, err
603617
}
@@ -611,16 +625,28 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
611625
neTargetsTLS, neTargetsNonTLS := getNodeExporterTargets(connectionInfo)
612626
// ScrapeConfig for non-tls nodes
613627
neServiceName := fmt.Sprintf("%s-node-exporter", telemetry.ServiceName)
628+
desiredScrapeConfig = metricstorage.ScrapeConfig(
629+
instance,
630+
serviceLabels,
631+
neTargetsNonTLS,
632+
false,
633+
)
614634
err = r.createServiceScrapeConfig(ctx, instance, Log, "Node Exporter",
615-
neServiceName, neTargetsNonTLS, false)
635+
neServiceName, desiredScrapeConfig)
616636
if err != nil {
617637
return ctrl.Result{}, err
618638
}
619639

620640
// ScrapeConfig for tls nodes
621641
neServiceName = fmt.Sprintf("%s-node-exporter-tls", telemetry.ServiceName)
642+
desiredScrapeConfig = metricstorage.ScrapeConfig(
643+
instance,
644+
serviceLabels,
645+
neTargetsTLS,
646+
true,
647+
)
622648
err = r.createServiceScrapeConfig(ctx, instance, Log, "Node Exporter",
623-
neServiceName, neTargetsTLS, true)
649+
neServiceName, desiredScrapeConfig)
624650
if err != nil {
625651
return ctrl.Result{}, err
626652
}
@@ -640,11 +666,64 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
640666
if len(keplerEndpoints) > 0 {
641667
// Kepler ScrapeConfig for non-tls nodes
642668
keplerServiceName := fmt.Sprintf("%s-kepler", telemetry.ServiceName)
669+
desiredScrapeConfig = metricstorage.ScrapeConfig(
670+
instance,
671+
serviceLabels,
672+
keplerEndpoints,
673+
false,
674+
)
643675
err = r.createServiceScrapeConfig(ctx, instance, Log, "Kepler",
644-
keplerServiceName, keplerEndpoints, false) // Currently Kepler doesn't support TLS so tlsEnabled is set to false
676+
keplerServiceName, desiredScrapeConfig) // Currently Kepler doesn't support TLS so tlsEnabled is set to false
677+
if err != nil {
678+
return ctrl.Result{}, err
679+
}
680+
}
681+
682+
// mysqld exporter
683+
ceilometerNamespacedName := types.NamespacedName{
684+
Name: ceilometer.ServiceName,
685+
Namespace: instance.Namespace,
686+
}
687+
ceilometerInstance := &telemetryv1.Ceilometer{}
688+
689+
err = r.Client.Get(ctx, ceilometerNamespacedName, ceilometerInstance)
690+
if err != nil && !k8s_errors.IsNotFound(err) {
691+
Log.Info(fmt.Sprintf("Cannot get ceilometer. Scrape configs not created. Error: %s", err))
692+
}
693+
694+
mysqldExporterCfgName := fmt.Sprintf("%s-mysqld-exporter", telemetry.ServiceName)
695+
696+
if !k8s_errors.IsNotFound(err) && len(ceilometerInstance.CeilometerStatus.MysqldExporterExportedGaleras) > 0 {
697+
exportedGaleras := ceilometerInstance.CeilometerStatus.MysqldExporterExportedGaleras
698+
mysqldExporterTargets := []string{}
699+
for _, galera := range exportedGaleras {
700+
// NOTE: the galera port is hardcoded in the mariadb-operator without
701+
// any declared constant we could use here
702+
mysqldExporterTargets = append(
703+
mysqldExporterTargets,
704+
fmt.Sprintf("%s.%s.svc:3306", galera, instance.Namespace),
705+
)
706+
}
707+
desiredScrapeConfig = metricstorage.ScrapeConfigMysqldExporter(
708+
instance,
709+
serviceLabels,
710+
mysqldExporterTargets,
711+
ceilometerInstance.Spec.MysqldExporterTLS.Enabled(),
712+
)
713+
err = r.createServiceScrapeConfig(ctx, instance, Log, "mysqld_exporter", mysqldExporterCfgName, desiredScrapeConfig)
645714
if err != nil {
646715
return ctrl.Result{}, err
647716
}
717+
} else {
718+
mysqldExporterScrapeConfig := &monv1alpha1.ScrapeConfig{
719+
ObjectMeta: metav1.ObjectMeta{
720+
Name: mysqldExporterCfgName,
721+
Namespace: instance.Namespace,
722+
},
723+
}
724+
if res, err := utils.EnsureDeleted(ctx, helper, mysqldExporterScrapeConfig); err != nil {
725+
return res, err
726+
}
648727
}
649728

650729
instance.Status.Conditions.MarkTrue(telemetryv1.ScrapeConfigReadyCondition, condition.ReadyMessage)
@@ -1068,7 +1147,7 @@ func (r *MetricStorageReconciler) SetupWithManager(ctx context.Context, mgr ctrl
10681147
return nil
10691148
}
10701149

1071-
rabbitmqWatchFn := func(_ context.Context, o client.Object) []reconcile.Request {
1150+
reconcileAllMetricStoragesWatchFn := func(_ context.Context, o client.Object) []reconcile.Request {
10721151
result := []reconcile.Request{}
10731152

10741153
// get all metricstorage CRs
@@ -1145,7 +1224,12 @@ func (r *MetricStorageReconciler) SetupWithManager(ctx context.Context, mgr ctrl
11451224
).
11461225
Watches(
11471226
&rabbitmqv1.RabbitmqCluster{},
1148-
handler.EnqueueRequestsFromMapFunc(rabbitmqWatchFn),
1227+
handler.EnqueueRequestsFromMapFunc(reconcileAllMetricStoragesWatchFn),
1228+
).
1229+
Watches(
1230+
&telemetryv1.Ceilometer{},
1231+
handler.EnqueueRequestsFromMapFunc(reconcileAllMetricStoragesWatchFn),
1232+
builder.WithPredicates(predicate.ResourceVersionChangedPredicate{}),
11491233
).
11501234
Build(r)
11511235
r.Controller = control
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
Copyright 2022.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package metricstorage
18+
19+
import (
20+
"fmt"
21+
22+
telemetryv1 "github.com/openstack-k8s-operators/telemetry-operator/api/v1beta1"
23+
mysqldexporter "github.com/openstack-k8s-operators/telemetry-operator/pkg/mysqldexporter"
24+
monv1 "github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring/v1"
25+
monv1alpha1 "github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring/v1alpha1"
26+
"k8s.io/utils/ptr"
27+
)
28+
29+
// ScrapeConfigMysqldExporter creates a ScrapeConfig CR
30+
func ScrapeConfigMysqldExporter(
31+
instance *telemetryv1.MetricStorage,
32+
labels map[string]string,
33+
targets []string,
34+
tlsEnabled bool,
35+
) *monv1alpha1.ScrapeConfig {
36+
// Use our normal scrape config as a base, which will be extended
37+
scrapeConfig := ScrapeConfig(instance, labels, targets, tlsEnabled)
38+
39+
scrapeConfig.Spec.MetricsPath = ptr.To("/probe")
40+
scrapeConfig.Spec.RelabelConfigs = []*monv1.RelabelConfig{
41+
{
42+
Action: "Replace",
43+
SourceLabels: []monv1.LabelName{
44+
"__address__",
45+
},
46+
TargetLabel: "__param_target",
47+
},
48+
{
49+
Action: "Replace",
50+
SourceLabels: []monv1.LabelName{
51+
"__address__",
52+
},
53+
TargetLabel: "__param_auth_module",
54+
Regex: "(.*):(.*)",
55+
Replacement: "client.$1",
56+
},
57+
{
58+
Action: "Replace",
59+
SourceLabels: []monv1.LabelName{
60+
"__param_target",
61+
},
62+
TargetLabel: "instance",
63+
},
64+
{
65+
Action: "Replace",
66+
TargetLabel: "__address__",
67+
Replacement: fmt.Sprintf("%s.%s.svc:%d", mysqldexporter.ServiceName, instance.Namespace, mysqldexporter.MysqldExporterPort),
68+
},
69+
}
70+
return scrapeConfig
71+
}

tests/kuttl/suites/metricstorage/tests/01-assert.yaml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,36 @@ metadata:
9595
spec:
9696
scrapeInterval: 30s
9797
---
98+
apiVersion: monitoring.rhobs/v1alpha1
99+
kind: ScrapeConfig
100+
metadata:
101+
labels:
102+
service: metricStorage
103+
name: telemetry-mysqld-exporter
104+
ownerReferences:
105+
- kind: MetricStorage
106+
name: telemetry-kuttl
107+
spec:
108+
metricsPath: /probe
109+
relabelings:
110+
- action: Replace
111+
sourceLabels:
112+
- __address__
113+
targetLabel: __param_target
114+
- action: Replace
115+
regex: (.*):(.*)
116+
replacement: client.$1
117+
sourceLabels:
118+
- __address__
119+
targetLabel: __param_auth_module
120+
- action: Replace
121+
sourceLabels:
122+
- __param_target
123+
targetLabel: instance
124+
- action: Replace
125+
targetLabel: __address__
126+
scrapeInterval: 30s
127+
---
98128
apiVersion: observability.openshift.io/v1alpha1
99129
kind: UIPlugin
100130
metadata:

tests/kuttl/suites/metricstorage/tests/01-deploy.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
---
12
apiVersion: telemetry.openstack.org/v1beta1
23
kind: MetricStorage
34
metadata:
@@ -12,3 +13,12 @@ spec:
1213
retention: 24h
1314
persistent:
1415
pvcStorageRequest: 20G
16+
---
17+
# Required, so that the mysqld_exporter scrapeconfig is created
18+
apiVersion: telemetry.openstack.org/v1beta1
19+
kind: Ceilometer
20+
metadata:
21+
name: ceilometer
22+
spec:
23+
secret: osp-secret
24+
mysqldExporterEnabled: true

0 commit comments

Comments
 (0)