Skip to content

Commit a2b09f3

Browse files
committed
[OSPRH-21020] Change rabbitmq to use podmonitors
RabbitMQ can be deployed with multiple replicas, while each replica will export different metrics. Having a ScrapeConfig with a service as a target means we're not scraping all metrics. PodMonitor will find all rabbitMQ pods based on a label, so all pods will get scraped everytime.
1 parent bffdcca commit a2b09f3

File tree

4 files changed

+274
-91
lines changed

4 files changed

+274
-91
lines changed

controllers/metricstorage_controller.go

Lines changed: 76 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,14 @@ func (r *MetricStorageReconciler) Reconcile(ctx context.Context, req ctrl.Reques
224224
return r.reconcileDelete(ctx, instance, helper)
225225
}
226226

227+
// Handle service update
228+
ctrlResult, err := r.reconcileUpdate(ctx, instance, helper)
229+
if err != nil {
230+
return ctrlResult, err
231+
} else if (ctrlResult != ctrl.Result{}) {
232+
return ctrlResult, nil
233+
}
234+
227235
// Handle non-deleted clusters
228236
return r.reconcileNormal(ctx, instance, helper)
229237
}
@@ -247,8 +255,6 @@ func (r *MetricStorageReconciler) reconcileDelete(
247255
return ctrl.Result{}, nil
248256
}
249257

250-
// TODO: call the function appropriately
251-
//
252258
//nolint:all
253259
func (r *MetricStorageReconciler) reconcileUpdate(
254260
ctx context.Context,
@@ -262,6 +268,10 @@ func (r *MetricStorageReconciler) reconcileUpdate(
262268
if err != nil {
263269
return ctrl.Result{}, err
264270
}
271+
err = r.deleteRabbitMQScrapeConfig(ctx, instance)
272+
if err != nil {
273+
return ctrl.Result{}, err
274+
}
265275

266276
Log.Info(fmt.Sprintf("Reconciled Service '%s' update successfully", instance.Name))
267277

@@ -295,6 +305,33 @@ func (r *MetricStorageReconciler) deleteOldServiceMonitors(
295305
return nil
296306
}
297307

308+
// Delete RabbitMQ ScrapeConfig
309+
// A ScrapeConfig for RabbitMQ was last used at the beginning of FR4
310+
func (r *MetricStorageReconciler) deleteRabbitMQScrapeConfig(
311+
ctx context.Context,
312+
instance *telemetryv1.MetricStorage,
313+
) error {
314+
namespacedName := types.NamespacedName{
315+
Name: fmt.Sprintf("%s-rabbitmq", telemetry.ServiceName),
316+
Namespace: instance.Namespace,
317+
}
318+
scrapeConfig := &monv1alpha1.ScrapeConfig{}
319+
err := r.Get(ctx, namespacedName, scrapeConfig)
320+
if err != nil {
321+
if k8s_errors.IsNotFound(err) {
322+
return nil
323+
}
324+
return err
325+
}
326+
if object.CheckOwnerRefExist(instance.UID, scrapeConfig.OwnerReferences) {
327+
err = r.Delete(ctx, scrapeConfig)
328+
if err != nil {
329+
return err
330+
}
331+
}
332+
return nil
333+
}
334+
298335
func (r *MetricStorageReconciler) reconcileNormal(
299336
ctx context.Context,
300337
instance *telemetryv1.MetricStorage,
@@ -684,6 +721,31 @@ func (r *MetricStorageReconciler) prometheusEndpointSecret(
684721
return nil
685722
}
686723

724+
func (r *MetricStorageReconciler) createPodMonitor(
725+
ctx context.Context,
726+
instance *telemetryv1.MetricStorage,
727+
log logr.Logger,
728+
desiredPodMonitor *monv1.PodMonitor,
729+
) error {
730+
podMonitor := &monv1.PodMonitor{
731+
ObjectMeta: metav1.ObjectMeta{
732+
Name: desiredPodMonitor.Name,
733+
Namespace: instance.Namespace,
734+
},
735+
}
736+
op, err := controllerutil.CreateOrPatch(ctx, r.Client, podMonitor, func() error {
737+
desiredPodMonitor.Spec.DeepCopyInto(&podMonitor.Spec)
738+
podMonitor.Labels = desiredPodMonitor.Labels
739+
err := controllerutil.SetControllerReference(instance, podMonitor, r.Scheme)
740+
return err
741+
})
742+
743+
if err == nil && op != controllerutil.OperationResultNone {
744+
log.Info(fmt.Sprintf("PodMonitor %s successfully changed - operation: %s", podMonitor.GetName(), string(op)))
745+
}
746+
return err
747+
}
748+
687749
func (r *MetricStorageReconciler) createServiceScrapeConfig(
688750
ctx context.Context,
689751
instance *telemetryv1.MetricStorage,
@@ -760,10 +822,9 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
760822
return ctrl.Result{}, err
761823
}
762824

763-
// ScrapeConfigs for RabbitMQ monitoring
825+
// PodMonitors for RabbitMQ monitoring
764826
// NOTE: We're watching Rabbits and reconciling with each of their change
765-
// that should keep the targets inside the ScrapeConfig always
766-
// up to date.
827+
// that should keep the PodMonitors always up to date.
767828
rabbitList := &rabbitmqv1.RabbitmqClusterList{}
768829
listOpts := []client.ListOption{
769830
client.InNamespace(instance.GetNamespace()),
@@ -772,22 +833,17 @@ func (r *MetricStorageReconciler) createScrapeConfigs(
772833
if err != nil && !k8s_errors.IsNotFound(err) {
773834
return ctrl.Result{}, err
774835
}
775-
rabbitTargets := []string{}
776836
for _, rabbit := range rabbitList.Items {
777-
rabbitServerName := fmt.Sprintf("%s.%s.svc", rabbit.Name, rabbit.Namespace)
778-
rabbitTargets = append(rabbitTargets, net.JoinHostPort(rabbitServerName, strconv.Itoa(metricstorage.RabbitMQPrometheusPort)))
779-
}
780-
rabbitCfgName := fmt.Sprintf("%s-rabbitmq", telemetry.ServiceName)
781-
desiredScrapeConfig = metricstorage.ScrapeConfig(
782-
instance,
783-
serviceLabels,
784-
rabbitTargets,
785-
instance.Spec.PrometheusTLS.Enabled(),
786-
)
787-
err = r.createServiceScrapeConfig(ctx, instance, Log, "RabbitMQ",
788-
rabbitCfgName, desiredScrapeConfig)
789-
if err != nil {
790-
return ctrl.Result{}, err
837+
desiredPodMonitor := metricstorage.RabbitMQPodMonitor(
838+
instance,
839+
serviceLabels,
840+
rabbit.Name,
841+
instance.Spec.PrometheusTLS.Enabled(),
842+
)
843+
err = r.createPodMonitor(ctx, instance, Log, desiredPodMonitor)
844+
if err != nil {
845+
return ctrl.Result{}, err
846+
}
791847
}
792848

793849
// mysqld exporter

0 commit comments

Comments
 (0)