From 1fecfa19cff341e7900e4400c138ec054d3f4d8c Mon Sep 17 00:00:00 2001 From: Aksel Allas Date: Thu, 19 Mar 2026 10:02:44 +0100 Subject: [PATCH] Add error-tracking monitor option to DatadogMonitor CRD. #2775 --- .../v1alpha1/datadogmonitor_types.go | 4 +- .../datadoghq.com_datadogmonitors.yaml | 1 + .../v1/datadoghq.com_datadogmonitors.yaml | 1 + ...atadoghq.com_datadogmonitors_v1alpha1.json | 3 +- .../controller/datadogmonitor/controller.go | 1 + .../datadogmonitor/controller_test.go | 39 +++++++++++++++++++ 6 files changed, 47 insertions(+), 2 deletions(-) diff --git a/api/datadoghq/v1alpha1/datadogmonitor_types.go b/api/datadoghq/v1alpha1/datadogmonitor_types.go index b07a6d5c1..103f1747b 100644 --- a/api/datadoghq/v1alpha1/datadogmonitor_types.go +++ b/api/datadoghq/v1alpha1/datadogmonitor_types.go @@ -38,7 +38,7 @@ type DatadogMonitorSpec struct { Tags []string `json:"tags,omitempty"` // Type is the monitor type // +kubebuilder:validation:Required - // +kubebuilder:validation:Enum=metric alert;query alert;service check;event alert;log alert;process alert;rum alert;trace-analytics alert;slo alert;event-v2 alert;audit alert;composite + // +kubebuilder:validation:Enum=metric alert;query alert;service check;event alert;log alert;process alert;rum alert;trace-analytics alert;slo alert;event-v2 alert;audit alert;composite;error-tracking alert Type DatadogMonitorType `json:"type,omitempty"` // Options are the optional parameters associated with your monitor Options DatadogMonitorOptions `json:"options,omitempty"` @@ -75,6 +75,8 @@ const ( DatadogMonitorTypeAudit DatadogMonitorType = "audit alert" // DatadogMonitorTypeComposite is the composite alert monitor type DatadogMonitorTypeComposite DatadogMonitorType = "composite" + // DatadogMonitorTypeErrorTracking is the error-tracking alert monitor type + DatadogMonitorTypeErrorTracking DatadogMonitorType = "error-tracking alert" ) // DatadogMonitorOptionsNotificationPreset toggles the display of additional content sent in the monitor notification. diff --git a/bundle/manifests/datadoghq.com_datadogmonitors.yaml b/bundle/manifests/datadoghq.com_datadogmonitors.yaml index aa5db1269..07fed403b 100644 --- a/bundle/manifests/datadoghq.com_datadogmonitors.yaml +++ b/bundle/manifests/datadoghq.com_datadogmonitors.yaml @@ -315,6 +315,7 @@ spec: - event-v2 alert - audit alert - composite + - error-tracking alert type: string required: - message diff --git a/config/crd/bases/v1/datadoghq.com_datadogmonitors.yaml b/config/crd/bases/v1/datadoghq.com_datadogmonitors.yaml index 3be5f6986..0f56f73c9 100644 --- a/config/crd/bases/v1/datadoghq.com_datadogmonitors.yaml +++ b/config/crd/bases/v1/datadoghq.com_datadogmonitors.yaml @@ -284,6 +284,7 @@ spec: - event-v2 alert - audit alert - composite + - error-tracking alert type: string required: - message diff --git a/config/crd/bases/v1/datadoghq.com_datadogmonitors_v1alpha1.json b/config/crd/bases/v1/datadoghq.com_datadogmonitors_v1alpha1.json index a46a6fd80..4f40e89e9 100644 --- a/config/crd/bases/v1/datadoghq.com_datadogmonitors_v1alpha1.json +++ b/config/crd/bases/v1/datadoghq.com_datadogmonitors_v1alpha1.json @@ -276,7 +276,8 @@ "slo alert", "event-v2 alert", "audit alert", - "composite" + "composite", + "error-tracking alert" ], "type": "string" } diff --git a/internal/controller/datadogmonitor/controller.go b/internal/controller/datadogmonitor/controller.go index caf3722b9..bca13aa4c 100644 --- a/internal/controller/datadogmonitor/controller.go +++ b/internal/controller/datadogmonitor/controller.go @@ -58,6 +58,7 @@ var supportedMonitorTypes = map[string]bool{ string(datadogV1.MONITORTYPE_SLO_ALERT): true, string(datadogV1.MONITORTYPE_EVENT_V2_ALERT): true, string(datadogV1.MONITORTYPE_AUDIT_ALERT): true, + string(datadogV1.MONITORTYPE_ERROR_TRACKING_ALERT): true, } const requiredTag = "generated:kubernetes" diff --git a/internal/controller/datadogmonitor/controller_test.go b/internal/controller/datadogmonitor/controller_test.go index 08f4a64b2..b88cac1ae 100644 --- a/internal/controller/datadogmonitor/controller_test.go +++ b/internal/controller/datadogmonitor/controller_test.go @@ -368,6 +368,24 @@ func TestReconcileDatadogMonitor_Reconcile(t *testing.T) { return nil }, }, + { + name: "DatadogMonitor, error-tracking alert", + args: args{ + request: newRequest(resourcesNamespace, resourcesName), + loadFunc: testErrorTrackingMonitor, + firstReconcileCount: 10, + }, + wantResult: reconcile.Result{RequeueAfter: defaultRequeuePeriod}, + wantErr: false, + wantFunc: func(c client.Client) error { + dm := &datadoghqv1alpha1.DatadogMonitor{} + if err := c.Get(context.TODO(), types.NamespacedName{Name: resourcesName, Namespace: resourcesNamespace}, dm); err != nil { + return err + } + assert.NotContains(t, dm.Status.Conditions[0].Message, "error") + return nil + }, + }, { name: "DatadogMonitor of unsupported type (composite)", args: args{ @@ -960,6 +978,27 @@ func testAuditMonitor(c client.Client) *datadoghqv1alpha1.DatadogMonitor { return dm } +func testErrorTrackingMonitor(c client.Client) *datadoghqv1alpha1.DatadogMonitor { + dm := &datadoghqv1alpha1.DatadogMonitor{ + TypeMeta: metav1.TypeMeta{ + Kind: "DatadogMonitor", + APIVersion: fmt.Sprintf("%s/%s", datadoghqv1alpha1.GroupVersion.Group, datadoghqv1alpha1.GroupVersion.Version), + }, + ObjectMeta: metav1.ObjectMeta{ + Namespace: resourcesNamespace, + Name: resourcesName, + }, + Spec: datadoghqv1alpha1.DatadogMonitorSpec{ + Query: "error-tracking-query", + Type: datadoghqv1alpha1.DatadogMonitorTypeErrorTracking, + Name: "test error tracking monitor", + Message: "something is wrong", + }, + } + _ = c.Create(context.TODO(), dm) + return dm +} + // TestReconciler_UpdateDatadogClient tests the UpdateDatadogClient method of the Reconciler func TestReconciler_UpdateDatadogClient(t *testing.T) { testLogger := zap.New(zap.UseDevMode(true))