Skip to content

Commit 9329f2f

Browse files
committed
Add mysqld_exporter scrapeconfig
1 parent 92f9bd1 commit 9329f2f

File tree

4 files changed

+206
-14
lines changed

4 files changed

+206
-14
lines changed

controllers/metricstorage_controller.go

Lines changed: 98 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import (
6262
"github.com/openstack-k8s-operators/telemetry-operator/pkg/dashboards"
6363
metricstorage "github.com/openstack-k8s-operators/telemetry-operator/pkg/metricstorage"
6464
telemetry "github.com/openstack-k8s-operators/telemetry-operator/pkg/telemetry"
65+
utils "github.com/openstack-k8s-operators/telemetry-operator/pkg/utils"
6566
rabbitmqv1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
6667
monv1 "github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring/v1"
6768
monv1alpha1 "github.com/rhobs/obo-prometheus-operator/pkg/apis/monitoring/v1alpha1"
@@ -514,8 +515,7 @@ func (r *MetricStorageReconciler) createServiceScrapeConfig(
514515
log logr.Logger,
515516
description string,
516517
serviceName string,
517-
targets interface{},
518-
tlsEnabled bool,
518+
desiredScrapeConfig *monv1alpha1.ScrapeConfig,
519519
) error {
520520
scrapeConfig := &monv1alpha1.ScrapeConfig{
521521
ObjectMeta: metav1.ObjectMeta{
@@ -524,10 +524,6 @@ func (r *MetricStorageReconciler) createServiceScrapeConfig(
524524
},
525525
}
526526
op, err := controllerutil.CreateOrPatch(ctx, r.Client, scrapeConfig, func() error {
527-
desiredScrapeConfig := metricstorage.ScrapeConfig(instance,
528-
serviceLabels,
529-
targets,
530-
tlsEnabled)
531527
desiredScrapeConfig.Spec.DeepCopyInto(&scrapeConfig.Spec)
532528
scrapeConfig.ObjectMeta.Labels = desiredScrapeConfig.ObjectMeta.Labels
533529
err := controllerutil.SetControllerReference(instance, scrapeConfig, r.Scheme)
@@ -561,8 +557,14 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
561557
ceilometerRoute := fmt.Sprintf("%s-internal.%s.svc", ceilometer.ServiceName, instance.Namespace)
562558
ceilometerTarget := []string{fmt.Sprintf("%s:%d", ceilometerRoute, ceilometer.CeilometerPrometheusPort)}
563559
ceilometerCfgName := fmt.Sprintf("%s-ceilometer", telemetry.ServiceName)
560+
desiredScrapeConfig := metricstorage.ScrapeConfig(
561+
instance,
562+
serviceLabels,
563+
ceilometerTarget,
564+
instance.Spec.PrometheusTLS.Enabled(),
565+
)
564566
err = r.createServiceScrapeConfig(ctx, instance, Log, "Ceilometer",
565-
ceilometerCfgName, ceilometerTarget, instance.Spec.PrometheusTLS.Enabled())
567+
ceilometerCfgName, desiredScrapeConfig)
566568
if err != nil {
567569
return ctrl.Result{}, err
568570
}
@@ -571,8 +573,14 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
571573
ksmRoute := fmt.Sprintf("%s.%s.svc", availability.KSMServiceName, instance.Namespace)
572574
ksmTarget := []string{fmt.Sprintf("%s:%d", ksmRoute, availability.KSMMetricsPort)}
573575
ksmCfgName := fmt.Sprintf("%s-ksm", telemetry.ServiceName)
576+
desiredScrapeConfig = metricstorage.ScrapeConfig(
577+
instance,
578+
serviceLabels,
579+
ksmTarget,
580+
instance.Spec.PrometheusTLS.Enabled(),
581+
)
574582
err = r.createServiceScrapeConfig(ctx, instance, Log, "kube-state-metrics",
575-
ksmCfgName, ksmTarget, instance.Spec.PrometheusTLS.Enabled())
583+
ksmCfgName, desiredScrapeConfig)
576584
if err != nil {
577585
return ctrl.Result{}, err
578586
}
@@ -595,8 +603,14 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
595603
rabbitTargets = append(rabbitTargets, fmt.Sprintf("%s:%d", rabbitServerName, metricstorage.RabbitMQPrometheusPort))
596604
}
597605
rabbitCfgName := fmt.Sprintf("%s-rabbitmq", telemetry.ServiceName)
606+
desiredScrapeConfig = metricstorage.ScrapeConfig(
607+
instance,
608+
serviceLabels,
609+
rabbitTargets,
610+
instance.Spec.PrometheusTLS.Enabled(),
611+
)
598612
err = r.createServiceScrapeConfig(ctx, instance, Log, "RabbitMQ",
599-
rabbitCfgName, rabbitTargets, instance.Spec.PrometheusTLS.Enabled())
613+
rabbitCfgName, desiredScrapeConfig)
600614
if err != nil {
601615
return ctrl.Result{}, err
602616
}
@@ -610,16 +624,28 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
610624
neTargetsTLS, neTargetsNonTLS := getNodeExporterTargets(connectionInfo)
611625
// ScrapeConfig for non-tls nodes
612626
neServiceName := fmt.Sprintf("%s-node-exporter", telemetry.ServiceName)
627+
desiredScrapeConfig = metricstorage.ScrapeConfig(
628+
instance,
629+
serviceLabels,
630+
neTargetsNonTLS,
631+
false,
632+
)
613633
err = r.createServiceScrapeConfig(ctx, instance, Log, "Node Exporter",
614-
neServiceName, neTargetsNonTLS, false)
634+
neServiceName, desiredScrapeConfig)
615635
if err != nil {
616636
return ctrl.Result{}, err
617637
}
618638

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

649728
instance.Status.Conditions.MarkTrue(telemetryv1.ScrapeConfigReadyCondition, condition.ReadyMessage)
@@ -1046,7 +1125,7 @@ func (r *MetricStorageReconciler) SetupWithManager(ctx context.Context, mgr ctrl
10461125
return nil
10471126
}
10481127

1049-
rabbitmqWatchFn := func(_ context.Context, o client.Object) []reconcile.Request {
1128+
reconcileAllMetricStoragesWatchFn := func(_ context.Context, o client.Object) []reconcile.Request {
10501129
result := []reconcile.Request{}
10511130

10521131
// get all metricstorage CRs
@@ -1123,7 +1202,12 @@ func (r *MetricStorageReconciler) SetupWithManager(ctx context.Context, mgr ctrl
11231202
).
11241203
Watches(
11251204
&rabbitmqv1.RabbitmqCluster{},
1126-
handler.EnqueueRequestsFromMapFunc(rabbitmqWatchFn),
1205+
handler.EnqueueRequestsFromMapFunc(reconcileAllMetricStoragesWatchFn),
1206+
).
1207+
Watches(
1208+
&telemetryv1.Ceilometer{},
1209+
handler.EnqueueRequestsFromMapFunc(reconcileAllMetricStoragesWatchFn),
1210+
builder.WithPredicates(predicate.ResourceVersionChangedPredicate{}),
11271211
).
11281212
Build(r)
11291213
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/deps/OpenStackControlPlane.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,9 @@ spec:
3131
templates:
3232
memcached:
3333
replicas: 1
34+
telemetry:
35+
enabled: true
36+
templates:
37+
ceilometer:
38+
enabled: true
39+
mysqldExporterEnabled: true

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,37 @@ 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+
replacement: mysqld-exporter.telemetry-kuttl-metricstorage.svc:9104
126+
targetLabel: __address__
127+
scrapeInterval: 30s
128+
---
98129
apiVersion: observability.openshift.io/v1alpha1
99130
kind: UIPlugin
100131
metadata:

0 commit comments

Comments
 (0)