From 22a31dce60b62da9cc9979f39c7740f524c776bb Mon Sep 17 00:00:00 2001 From: mrmcpat Date: Tue, 24 Mar 2026 10:13:12 -0400 Subject: [PATCH 1/3] implement DD_SLO_FORCE_SYNC_PERIOD for datadogslo --- config/manager/kustomization.yaml | 4 +-- docs/datadog_slo.md | 2 ++ internal/controller/datadogslo/controller.go | 26 +++++++++++++++----- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index f21b19215..32babc2e9 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -2,7 +2,7 @@ resources: - manager.yaml images: - name: controller - newName: gcr.io/datadoghq/operator - newTag: 1.24.0 + newName: mrmcpat/operator + newTag: slosyncperiod apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization diff --git a/docs/datadog_slo.md b/docs/datadog_slo.md index 1db698c21..d744f41df 100644 --- a/docs/datadog_slo.md +++ b/docs/datadog_slo.md @@ -69,6 +69,8 @@ To deploy a `DatadogSLO` with the Datadog Operator, use the [`datadog-operator` Datadog Operator occasionally reconciles and keeps SLOs in line with the given configuration. There is also a force sync every hour, so if a user deletes an SLO in the Datadog UI, Datadog Operator restores it in under an hour. +By default, the Operator ensures that the API SLO definition stays in sync with the DatadogSLO resource every **60** minutes (per SLO). This interval can be adjusted using the environment variable `DD_SLO_FORCE_SYNC_PERIOD`, which specifies the number of minutes. For example, setting this variable to `"30"` changes the interval to 30 minutes. + ## Cleanup The following commands delete the SLO from your Datadog account as well as all of the Kubernetes resources created by the previous instructions: diff --git a/internal/controller/datadogslo/controller.go b/internal/controller/datadogslo/controller.go index 9aa169689..45e8f5794 100644 --- a/internal/controller/datadogslo/controller.go +++ b/internal/controller/datadogslo/controller.go @@ -8,6 +8,8 @@ package datadogslo import ( "context" "fmt" + "os" + "strconv" "strings" "time" @@ -37,11 +39,12 @@ import ( ) const ( - defaultRequeuePeriod = 60 * time.Second - defaultErrRequeuePeriod = 5 * time.Second - defaultForceSyncPeriod = 60 * time.Minute - datadogSLOKind = "DatadogSLO" - datadogSLOFinalizer = "finalizer.slo.datadoghq.com" + defaultRequeuePeriod = 60 * time.Second + defaultErrRequeuePeriod = 5 * time.Second + defaultForceSyncPeriod = 60 * time.Minute + datadogSLOKind = "DatadogSLO" + datadogSLOFinalizer = "finalizer.slo.datadoghq.com" + DDSLOForceSyncPeriodEnvVar = "DD_SLO_FORCE_SYNC_PERIOD" ) type Reconciler struct { @@ -90,6 +93,17 @@ func (r *Reconciler) internalReconcile(ctx context.Context, req reconcile.Reques logger := r.log.WithValues("datadogslo", req.NamespacedName) logger.Info("Reconciling Datadog SLO") now := metav1.NewTime(time.Now()) + forceSyncPeriod := defaultForceSyncPeriod + + if userForceSyncPeriod, ok := os.LookupEnv(DDSLOForceSyncPeriodEnvVar); ok { + forceSyncPeriodInt, err := strconv.Atoi(userForceSyncPeriod) + if err != nil { + logger.Error(err, "Invalid value for SLO force sync period. Defaulting to 60 minutes.") + } else { + logger.V(1).Info("Setting SLO force sync period", "minutes", forceSyncPeriodInt) + forceSyncPeriod = time.Duration(forceSyncPeriodInt) * time.Minute + } + } // Get instance instance := &v1alpha1.DatadogSLO{} @@ -138,7 +152,7 @@ func (r *Reconciler) internalReconcile(ctx context.Context, req reconcile.Reques } else { if instanceSpecHash != statusSpecHash { shouldUpdate = true - } else if instance.Status.LastForceSyncTime == nil || (defaultForceSyncPeriod-now.Sub(instance.Status.LastForceSyncTime.Time)) <= 0 { + } else if instance.Status.LastForceSyncTime == nil || (forceSyncPeriod-now.Sub(instance.Status.LastForceSyncTime.Time)) <= 0 { // Periodically force a sync with the API SLO to ensure parity // Get SLO to make sure it exists before trying any updates. If it doesn't, set shouldCreate _, err = r.get(instance) From 03797fa2aa1ba99ff26baf2d379186fbe456f9dd Mon Sep 17 00:00:00 2001 From: mrmcpat <109171317+mrdoggopat@users.noreply.github.com> Date: Tue, 24 Mar 2026 10:46:06 -0400 Subject: [PATCH 2/3] Revert kustomization file --- config/manager/kustomization.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index 32babc2e9..f21b19215 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -2,7 +2,7 @@ resources: - manager.yaml images: - name: controller - newName: mrmcpat/operator - newTag: slosyncperiod + newName: gcr.io/datadoghq/operator + newTag: 1.24.0 apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization From 25b386c48a4710a836d840f922111c5fbdfc75f6 Mon Sep 17 00:00:00 2001 From: mrmcpat Date: Wed, 25 Mar 2026 11:27:07 -0400 Subject: [PATCH 3/3] change formatting in const --- internal/controller/datadogslo/controller.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/controller/datadogslo/controller.go b/internal/controller/datadogslo/controller.go index 45e8f5794..43836bca3 100644 --- a/internal/controller/datadogslo/controller.go +++ b/internal/controller/datadogslo/controller.go @@ -39,12 +39,12 @@ import ( ) const ( - defaultRequeuePeriod = 60 * time.Second - defaultErrRequeuePeriod = 5 * time.Second - defaultForceSyncPeriod = 60 * time.Minute - datadogSLOKind = "DatadogSLO" - datadogSLOFinalizer = "finalizer.slo.datadoghq.com" - DDSLOForceSyncPeriodEnvVar = "DD_SLO_FORCE_SYNC_PERIOD" + defaultRequeuePeriod = 60 * time.Second + defaultErrRequeuePeriod = 5 * time.Second + defaultForceSyncPeriod = 60 * time.Minute + datadogSLOKind = "DatadogSLO" + datadogSLOFinalizer = "finalizer.slo.datadoghq.com" + DDSLOForceSyncPeriodEnvVar = "DD_SLO_FORCE_SYNC_PERIOD" ) type Reconciler struct {