Skip to content

Commit

Permalink
Refactor observability schemas out to file
Browse files Browse the repository at this point in the history
Signed-off-by: David Martin <[email protected]>
  • Loading branch information
david-martin committed Feb 25, 2025
1 parent 608055c commit b5d11d8
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 22 deletions.
6 changes: 3 additions & 3 deletions api/v1beta1/topology.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import (
limitadorv1alpha1 "github.com/kuadrant/limitador-operator/api/v1alpha1"
"github.com/kuadrant/policy-machinery/controller"
"github.com/kuadrant/policy-machinery/machinery"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
"github.com/samber/lo"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
gatewayapiv1 "sigs.k8s.io/gateway-api/apis/v1"

"github.com/kuadrant/kuadrant-operator/pkg/kuadrant"
observability "github.com/kuadrant/kuadrant-operator/pkg/observability"
)

var (
Expand Down Expand Up @@ -71,7 +71,7 @@ func LinkKuadrantToServiceMonitor(objs controller.Store) machinery.LinkFunc {

return machinery.LinkFunc{
From: KuadrantGroupKind,
To: schema.GroupKind{Group: monitoringv1.SchemeGroupVersion.Group, Kind: monitoringv1.ServiceMonitorsKind},
To: observability.ServiceMonitorGroupKind,
Func: func(child machinery.Object) []machinery.Object {
return lo.Filter(kuadrants, func(_ machinery.Object, _ int) bool {
if metaObj, ok := child.(metav1.Object); ok {
Expand All @@ -90,7 +90,7 @@ func LinkKuadrantToPodMonitor(objs controller.Store) machinery.LinkFunc {

return machinery.LinkFunc{
From: KuadrantGroupKind,
To: schema.GroupKind{Group: monitoringv1.SchemeGroupVersion.Group, Kind: monitoringv1.PodMonitorsKind},
To: observability.PodMonitorGroupKind,
Func: func(child machinery.Object) []machinery.Object {
return lo.Filter(kuadrants, func(_ machinery.Object, _ int) bool {
if metaObj, ok := child.(metav1.Object); ok {
Expand Down
43 changes: 26 additions & 17 deletions controllers/observability_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (

kuadrantv1beta1 "github.com/kuadrant/kuadrant-operator/api/v1beta1"
"github.com/kuadrant/kuadrant-operator/pkg/kuadrant"
"github.com/kuadrant/kuadrant-operator/pkg/observability"
)

//+kubebuilder:rbac:groups=monitoring.coreos.com,resources=servicemonitors;podmonitors,verbs=get;list;watch;create;update;patch;delete
Expand Down Expand Up @@ -308,8 +309,8 @@ func NewObservabilityReconciler(client *dynamic.DynamicClient, rm meta.RESTMappe
func (r *ObservabilityReconciler) Subscription() *controller.Subscription {
return &controller.Subscription{ReconcileFunc: r.Reconcile, Events: []controller.ResourceEventMatcher{
{Kind: &kuadrantv1beta1.KuadrantGroupKind},
{Kind: ptr.To(schema.GroupKind{Group: monitoringv1.SchemeGroupVersion.Group, Kind: monitoringv1.ServiceMonitorsKind}), EventType: ptr.To(controller.DeleteEvent)},
{Kind: ptr.To(schema.GroupKind{Group: monitoringv1.SchemeGroupVersion.Group, Kind: monitoringv1.PodMonitorsKind}), EventType: ptr.To(controller.DeleteEvent)},
{Kind: ptr.To(observability.ServiceMonitorGroupKind), EventType: ptr.To(controller.DeleteEvent)},
{Kind: ptr.To(observability.PodMonitorGroupKind), EventType: ptr.To(controller.DeleteEvent)},
{Kind: &machinery.GatewayGroupKind}, // all events
{Kind: &machinery.GatewayClassGroupKind, EventType: ptr.To(controller.CreateEvent)},
{Kind: &machinery.GatewayClassGroupKind, EventType: ptr.To(controller.DeleteEvent)},
Expand Down Expand Up @@ -343,16 +344,20 @@ func (r *ObservabilityReconciler) Reconcile(ctx context.Context, _ []controller.
logger.V(1).Info("observability enabled, creating monitors")

// Kuadrant Operator monitor
r.createMonitor(ctx, monitorObjs, kOpMonitorSpec, r.namespace, logger)
kOpMonitorSpec.SetNamespace(r.namespace)
r.createMonitor(ctx, monitorObjs, kOpMonitorSpec, observability.ServiceMonitorsResource, logger)

// DNS Operator monitor
r.createMonitor(ctx, monitorObjs, dnsOpMonitorSpec, r.namespace, logger)
dnsOpMonitorSpec.SetNamespace(r.namespace)
r.createMonitor(ctx, monitorObjs, dnsOpMonitorSpec, observability.ServiceMonitorsResource, logger)

// Authorino operator monitor
r.createMonitor(ctx, monitorObjs, authOpMonitorSpec, r.namespace, logger)
authOpMonitorSpec.SetNamespace(r.namespace)
r.createMonitor(ctx, monitorObjs, authOpMonitorSpec, observability.ServiceMonitorsResource, logger)

// Limitador operator monitor
r.createMonitor(ctx, monitorObjs, limitOpMonitorSpec, r.namespace, logger)
limitOpMonitorSpec.SetNamespace(r.namespace)
r.createMonitor(ctx, monitorObjs, limitOpMonitorSpec, observability.ServiceMonitorsResource, logger)

// Create monitors for each gateway instance of each gateway class
gatewayClasses := topology.Targetables().Items(func(o machinery.Object) bool {
Expand All @@ -363,21 +368,30 @@ func (r *ObservabilityReconciler) Reconcile(ctx context.Context, _ []controller.
gwClass := gatewayClass.(*machinery.GatewayClass)
if gwClass.GatewayClass.Spec.ControllerName == istioGatewayControllerName {
for _, gateway := range gateways {
r.createMonitor(ctx, monitorObjs, istiodMonitorSpec, istiodMonitorNS, logger)
r.createMonitor(ctx, monitorObjs, istioPodMonitorSpec, gateway.GetNamespace(), logger)
istiodMonitorSpec.SetNamespace(istiodMonitorNS)
r.createMonitor(ctx, monitorObjs, istiodMonitorSpec, observability.ServiceMonitorsResource, logger)
istioPodMonitorSpec.SetNamespace(gateway.GetNamespace())
r.createMonitor(ctx, monitorObjs, istioPodMonitorSpec, observability.PodMonitorsResource, logger)
}
} else if gwClass.GatewayClass.Spec.ControllerName == envoyGatewayGatewayControllerName {
for _, gateway := range gateways {
r.createMonitor(ctx, monitorObjs, envoyGatewayMonitorSpec, envoyGatewayMonitorNS, logger)
r.createMonitor(ctx, monitorObjs, envoyStatsMonitorSpec, gateway.GetNamespace(), logger)
envoyGatewayMonitorSpec.SetNamespace(envoyGatewayMonitorNS)
r.createMonitor(ctx, monitorObjs, envoyGatewayMonitorSpec, observability.ServiceMonitorsResource, logger)
envoyStatsMonitorSpec.SetNamespace(gateway.GetNamespace())
r.createMonitor(ctx, monitorObjs, envoyStatsMonitorSpec, observability.PodMonitorsResource, logger)
}
}
}

return nil
}

func (r *ObservabilityReconciler) createMonitor(ctx context.Context, monitorObjs []machinery.Object, monitor client.Object, ns string, logger logr.Logger) {
func (r *ObservabilityReconciler) createMonitor(ctx context.Context, monitorObjs []machinery.Object, monitor client.Object, mappingResource schema.GroupVersionResource, logger logr.Logger) {
ns := monitor.GetNamespace()
if ns == "" {
logger.V(1).Info(fmt.Sprintf("cannot create monitor '%s' as namespace is not set, skipping create", monitor.GetName()))
return
}

Check warning on line 394 in controllers/observability_reconciler.go

View check run for this annotation

Codecov / codecov/patch

controllers/observability_reconciler.go#L392-L394

Added lines #L392 - L394 were not covered by tests
_, monitorExists := lo.Find(monitorObjs, func(item machinery.Object) bool {
return item.GroupVersionKind().Kind == monitor.GetObjectKind().GroupVersionKind().Kind && item.GetName() == monitor.GetName() && item.GetNamespace() == ns
})
Expand All @@ -393,12 +407,7 @@ func (r *ObservabilityReconciler) createMonitor(ctx context.Context, monitorObjs
return
}

Check warning on line 408 in controllers/observability_reconciler.go

View check run for this annotation

Codecov / codecov/patch

controllers/observability_reconciler.go#L406-L408

Added lines #L406 - L408 were not covered by tests

mapping, err := r.restMapper.RESTMapping(monitor.GetObjectKind().GroupVersionKind().GroupKind())
if err != nil {
logger.Error(err, fmt.Sprintf("failed to get monitor restmapping %s/%s", ns, monitor.GetName()))
return
}
if _, err = r.Client.Resource(mapping.Resource).Namespace(ns).Create(ctx, obj, metav1.CreateOptions{}); err != nil {
if _, err = r.Client.Resource(mappingResource).Namespace(ns).Create(ctx, obj, metav1.CreateOptions{}); err != nil {
logger.Error(err, fmt.Sprintf("error creating monitor %s/%s", ns, monitor.GetName()))
return
}
Expand Down
5 changes: 3 additions & 2 deletions controllers/state_of_the_world.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import (
kuadrantgatewayapi "github.com/kuadrant/kuadrant-operator/pkg/gatewayapi"
"github.com/kuadrant/kuadrant-operator/pkg/istio"
"github.com/kuadrant/kuadrant-operator/pkg/kuadrant"
"github.com/kuadrant/kuadrant-operator/pkg/observability"
"github.com/kuadrant/kuadrant-operator/pkg/openshift"
"github.com/kuadrant/kuadrant-operator/pkg/openshift/consoleplugin"
"github.com/kuadrant/kuadrant-operator/pkg/utils"
Expand Down Expand Up @@ -423,8 +424,8 @@ func (b *BootOptionsBuilder) getObservabilityOptions() []controller.ControllerOp
controller.FilterResourcesByLabel[*monitoringv1.PodMonitor](kuadrant.ObservabilityLabel),
)),
controller.WithObjectKinds(
schema.GroupKind{Group: monitoringv1.SchemeGroupVersion.Group, Kind: monitoringv1.ServiceMonitorsKind},
schema.GroupKind{Group: monitoringv1.SchemeGroupVersion.Group, Kind: monitoringv1.PodMonitorsKind},
observability.ServiceMonitorGroupKind,
observability.PodMonitorGroupKind,
),
controller.WithObjectLinks(
kuadrantv1beta1.LinkKuadrantToServiceMonitor,
Expand Down
14 changes: 14 additions & 0 deletions pkg/observability/schema.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package observability

import (
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
)

var (
ServiceMonitorsResource = monitoringv1.SchemeGroupVersion.WithResource("servicemonitors")
PodMonitorsResource = monitoringv1.SchemeGroupVersion.WithResource("podmonitors")

ServiceMonitorGroupKind = schema.GroupKind{Group: monitoringv1.SchemeGroupVersion.Group, Kind: monitoringv1.ServiceMonitorsKind}
PodMonitorGroupKind = schema.GroupKind{Group: monitoringv1.SchemeGroupVersion.Group, Kind: monitoringv1.PodMonitorsKind}
)

0 comments on commit b5d11d8

Please sign in to comment.