From b6bd8452d6c23933ed8945def37ed65cbe3b3a95 Mon Sep 17 00:00:00 2001 From: Wassim Dhif Date: Tue, 9 Jul 2024 11:46:10 +0200 Subject: [PATCH] feat(probe): add startup probes (#1234) Signed-off-by: Wassim DHIF --- apis/datadoghq/common/common.go | 18 ++++++++++++++++++ apis/datadoghq/common/const.go | 12 +++++++++++- controllers/datadogagent/agent_test.go | 18 ++++++++++++++++++ controllers/datadogagent/clusteragent_test.go | 1 + .../datadogagent/component/agent/default.go | 1 + .../component/clusteragent/default.go | 1 + .../component/clusteragent/default_test.go | 19 +++++++++++++++++++ .../component/clusterchecksrunner/default.go | 1 + 8 files changed, 70 insertions(+), 1 deletion(-) diff --git a/apis/datadoghq/common/common.go b/apis/datadoghq/common/common.go index b64072b9c..f1b3425fc 100644 --- a/apis/datadoghq/common/common.go +++ b/apis/datadoghq/common/common.go @@ -48,6 +48,24 @@ func GetDefaultReadinessProbe() *corev1.Probe { return readinessProbe } +// GetDefaultStartupProbe creates a defaulted StartupProbe +func GetDefaultStartupProbe() *corev1.Probe { + startupProbe := &corev1.Probe{ + InitialDelaySeconds: DefaultStartupProbeInitialDelaySeconds, + PeriodSeconds: DefaultStartupProbePeriodSeconds, + TimeoutSeconds: DefaultStartupProbeTimeoutSeconds, + SuccessThreshold: DefaultStartupProbeSuccessThreshold, + FailureThreshold: DefaultStartupProbeFailureThreshold, + } + startupProbe.HTTPGet = &corev1.HTTPGetAction{ + Path: DefaultStartupProbeHTTPPath, + Port: intstr.IntOrString{ + IntVal: DefaultAgentHealthPort, + }, + } + return startupProbe +} + // GetDefaultTraceAgentProbe creates a defaulted liveness/readiness probe for the Trace Agent func GetDefaultTraceAgentProbe() *corev1.Probe { probe := &corev1.Probe{ diff --git a/apis/datadoghq/common/const.go b/apis/datadoghq/common/const.go index f5ed523a8..4be59b37c 100644 --- a/apis/datadoghq/common/const.go +++ b/apis/datadoghq/common/const.go @@ -81,13 +81,15 @@ const ( // DefaultHelmCheckConf default Helm Check ConfigMap name DefaultHelmCheckConf string = "helm-check-config" + // DefaultAgentHealthPort default agent health port + DefaultAgentHealthPort int32 = 5555 + // Liveness probe default config DefaultLivenessProbeInitialDelaySeconds int32 = 15 DefaultLivenessProbePeriodSeconds int32 = 15 DefaultLivenessProbeTimeoutSeconds int32 = 5 DefaultLivenessProbeSuccessThreshold int32 = 1 DefaultLivenessProbeFailureThreshold int32 = 6 - DefaultAgentHealthPort int32 = 5555 DefaultLivenessProbeHTTPPath = "/live" // Readiness probe default config @@ -98,6 +100,14 @@ const ( DefaultReadinessProbeFailureThreshold int32 = 6 DefaultReadinessProbeHTTPPath = "/ready" + // Startup probe default config + DefaultStartupProbeInitialDelaySeconds int32 = 15 + DefaultStartupProbePeriodSeconds int32 = 15 + DefaultStartupProbeTimeoutSeconds int32 = 5 + DefaultStartupProbeSuccessThreshold int32 = 1 + DefaultStartupProbeFailureThreshold int32 = 6 + DefaultStartupProbeHTTPPath = "/startup" + // Default Image name DefaultAgentImageName string = "agent" DefaultClusterAgentImageName string = "cluster-agent" diff --git a/controllers/datadogagent/agent_test.go b/controllers/datadogagent/agent_test.go index 366aa7b1b..5638c7d4f 100644 --- a/controllers/datadogagent/agent_test.go +++ b/controllers/datadogagent/agent_test.go @@ -126,6 +126,24 @@ func defaultReadinessProbe() *corev1.Probe { } } +func defaultStartupProbe() *corev1.Probe { + return &corev1.Probe{ + InitialDelaySeconds: 15, + PeriodSeconds: 15, + TimeoutSeconds: 5, + SuccessThreshold: 1, + FailureThreshold: 6, + ProbeHandler: corev1.ProbeHandler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/startup", + Port: intstr.IntOrString{ + IntVal: 5555, + }, + }, + }, + } +} + func defaultVolumes() []corev1.Volume { return []corev1.Volume{ { diff --git a/controllers/datadogagent/clusteragent_test.go b/controllers/datadogagent/clusteragent_test.go index 8c541d7ad..02c6d7f34 100644 --- a/controllers/datadogagent/clusteragent_test.go +++ b/controllers/datadogagent/clusteragent_test.go @@ -61,6 +61,7 @@ func clusterAgentDefaultPodSpec() corev1.PodSpec { }, LivenessProbe: defaultLivenessProbe(), ReadinessProbe: defaultReadinessProbe(), + StartupProbe: defaultStartupProbe(), SecurityContext: &corev1.SecurityContext{ ReadOnlyRootFilesystem: apiutils.NewBoolPointer(true), AllowPrivilegeEscalation: apiutils.NewBoolPointer(false), diff --git a/controllers/datadogagent/component/agent/default.go b/controllers/datadogagent/component/agent/default.go index 75dc3ea2a..704babe65 100644 --- a/controllers/datadogagent/component/agent/default.go +++ b/controllers/datadogagent/component/agent/default.go @@ -155,6 +155,7 @@ func coreAgentContainer(dda metav1.Object) corev1.Container { VolumeMounts: volumeMountsForCoreAgent(), LivenessProbe: apicommon.GetDefaultLivenessProbe(), ReadinessProbe: apicommon.GetDefaultReadinessProbe(), + StartupProbe: apicommon.GetDefaultStartupProbe(), } } diff --git a/controllers/datadogagent/component/clusteragent/default.go b/controllers/datadogagent/component/clusteragent/default.go index 3a5b379ce..277add39e 100644 --- a/controllers/datadogagent/component/clusteragent/default.go +++ b/controllers/datadogagent/component/clusteragent/default.go @@ -102,6 +102,7 @@ func defaultPodSpec(dda metav1.Object, volumes []corev1.Volume, volumeMounts []c VolumeMounts: volumeMounts, LivenessProbe: apicommon.GetDefaultLivenessProbe(), ReadinessProbe: apicommon.GetDefaultReadinessProbe(), + StartupProbe: apicommon.GetDefaultStartupProbe(), Command: nil, Args: nil, SecurityContext: &corev1.SecurityContext{ diff --git a/controllers/datadogagent/component/clusteragent/default_test.go b/controllers/datadogagent/component/clusteragent/default_test.go index f139f4149..f721d12c5 100644 --- a/controllers/datadogagent/component/clusteragent/default_test.go +++ b/controllers/datadogagent/component/clusteragent/default_test.go @@ -80,6 +80,7 @@ func clusterAgentDefaultPodSpec() corev1.PodSpec { }, LivenessProbe: defaultLivenessProbe(), ReadinessProbe: defaultReadinessProbe(), + StartupProbe: defaultStartupProbe(), SecurityContext: &corev1.SecurityContext{ ReadOnlyRootFilesystem: apiutils.NewBoolPointer(true), AllowPrivilegeEscalation: apiutils.NewBoolPointer(false), @@ -191,6 +192,24 @@ func defaultReadinessProbe() *corev1.Probe { } } +func defaultStartupProbe() *corev1.Probe { + return &corev1.Probe{ + InitialDelaySeconds: 15, + PeriodSeconds: 15, + TimeoutSeconds: 5, + SuccessThreshold: 1, + FailureThreshold: 6, + ProbeHandler: corev1.ProbeHandler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/startup", + Port: intstr.IntOrString{ + IntVal: 5555, + }, + }, + }, + } +} + func clusterAgentDefaultEnvVars() []corev1.EnvVar { return []corev1.EnvVar{ { diff --git a/controllers/datadogagent/component/clusterchecksrunner/default.go b/controllers/datadogagent/component/clusterchecksrunner/default.go index 0dd2a256c..883ee7b05 100644 --- a/controllers/datadogagent/component/clusterchecksrunner/default.go +++ b/controllers/datadogagent/component/clusterchecksrunner/default.go @@ -233,6 +233,7 @@ func defaultPodSpec(dda metav1.Object, volumes []corev1.Volume, volumeMounts []c }, LivenessProbe: apicommon.GetDefaultLivenessProbe(), ReadinessProbe: apicommon.GetDefaultReadinessProbe(), + StartupProbe: apicommon.GetDefaultStartupProbe(), SecurityContext: &corev1.SecurityContext{ ReadOnlyRootFilesystem: apiutils.NewBoolPointer(true), AllowPrivilegeEscalation: apiutils.NewBoolPointer(false),