Repository: DataDog/datadog-operator

Issue:
:warning: Action Required: Replace Deprecated gcr.io/kubebuilder/kube-rbac-proxy

## Description

:warning: **The image `gcr.io/kubebuilder/kube-rbac-proxy` is deprecated and will become unavailable.**
**You must move as soon as possible, sometime from early 2025, the GCR will go away.**

> _Unfortunately, we're unable to provide any guarantees regarding timelines or potential extensions at this time. Images provided under GRC will be unavailable from March 18, 2025, [as per announcement](https://cloud.google.com/artifact-registry/docs/transition/transition-from-gcr). However, `gcr.io/kubebuilder/`may be unavailable before this date due [to efforts to deprecate infrastructure](https://github.com/kubernetes/k8s.io/issues/2647)._

- **If your project uses `gcr.io/kubebuilder/kube-rbac-proxy`, it will be affected.**
  Your project may fail to work if the image cannot be pulled. **You must take action as soon as possible.**

- However, if your project is **no longer using this image**, **no action is required**, and you can close this issue.

## Using the image `gcr.io/kubebuilder/kube-rbac-proxy`?

[kube-rbac-proxy](https://github.com/brancz/kube-rbac-proxy) was historically used to protect the metrics endpoint. However, its usage has been discontinued in [Kubebuilder](https://github.com/kubernetes-sigs/kubebuilder). The default scaffold now leverages the [`WithAuthenticationAndAuthorization`](https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/metrics/filters#WithAuthenticationAndAuthorization) feature provided by [Controller-Runtime](https://github.com/kubernetes-sigs/controller-runtime).

This feature provides integrated support for securing metrics endpoints by embedding authentication (`authn`) and authorization (`authz`) mechanisms directly into the controller manager's metrics server, replacing the need for (https://github.com/brancz/kube-rbac-proxy) to secure metrics endpoints.

### What To Do?

**You must replace the deprecated image `gcr.io/kubebuilder/kube-rbac-proxy` with an alternative approach. For example:**
- Update your project to use [`WithAuthenticationAndAuthorization`](https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/metrics/filters#WithAuthenticationAndAuthorization):
  > _You can fully upgrade your project to use the latest scaffolds provided by the tool or manually make the necessary changes. Refer to the [FAQ and Discussion](https://github.com/kubernetes-sigs/kubebuilder/discussions/3907) for detailed instructions on how to manually update your project and test the changes._
- Alternatively, replace the image with another trusted source at your own risk, as its usage has been discontinued in Kubebuilder.

**For further information, suggestions, and guidance:**
- 📖 [FAQ and Discussion](https://github.com/kubernetes-sigs/kubebuilder/discussions/3907)
- 💬 Join the Slack channel: [#kubebuilder](https://communityinviter.com/apps/kubernetes/community#kubebuilder).

> **NOTE:** _This issue was opened automatically as part of our efforts to identify projects that might be affected and to raise awareness about this change within the community. If your project is no longer using this image, **feel free to close this issue**._

We sincerely apologize for any inconvenience this may cause.

**Thank you for your cooperation and understanding!** :pray:


Discussion:
@khewonc: Closing since this was done in #1551 

Solution patch:
diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv
index 074c2d40..12a5345a 100644
--- a/LICENSE-3rdparty.csv
+++ b/LICENSE-3rdparty.csv
@@ -25,9 +25,13 @@ core,github.com/DataDog/viper,MIT
 core,github.com/DataDog/zstd,BSD-3-Clause
 core,github.com/Masterminds/semver,MIT
 core,github.com/Masterminds/semver/v3,MIT
+core,github.com/antlr4-go/antlr/v4,BSD-3-Clause
+core,github.com/asaskevich/govalidator,MIT
 core,github.com/benbjohnson/clock,MIT
 core,github.com/beorn7/perks/quantile,MIT
+core,github.com/blang/semver/v4,MIT
 core,github.com/cenkalti/backoff,MIT
+core,github.com/cenkalti/backoff/v4,MIT
 core,github.com/cespare/xxhash/v2,MIT
 core,github.com/cihub/seelog,BSD-3-Clause
 core,github.com/davecgh/go-spew/spew,ISC
@@ -35,9 +39,11 @@ core,github.com/dustin/go-humanize,MIT
 core,github.com/ebitengine/purego,Apache-2.0
 core,github.com/emicklei/go-restful/v3,MIT
 core,github.com/evanphx/json-patch/v5,BSD-3-Clause
+core,github.com/felixge/httpsnoop,MIT
 core,github.com/fsnotify/fsnotify,BSD-3-Clause
 core,github.com/fxamacker/cbor/v2,MIT
 core,github.com/go-logr/logr,Apache-2.0
+core,github.com/go-logr/stdr,Apache-2.0
 core,github.com/go-logr/zapr,Apache-2.0
 core,github.com/go-openapi/jsonpointer,Apache-2.0
 core,github.com/go-openapi/jsonreference,Apache-2.0
@@ -46,6 +52,7 @@ core,github.com/gobwas/glob,MIT
 core,github.com/gogo/protobuf,BSD-3-Clause
 core,github.com/golang/groupcache/lru,Apache-2.0
 core,github.com/golang/protobuf,BSD-3-Clause
+core,github.com/google/cel-go,Apache-2.0
 core,github.com/google/gnostic-models,Apache-2.0
 core,github.com/google/go-cmp/cmp,BSD-3-Clause
 core,github.com/google/gofuzz,Apache-2.0
@@ -53,6 +60,7 @@ core,github.com/google/pprof/profile,Apache-2.0
 core,github.com/google/uuid,BSD-3-Clause
 core,github.com/grpc-ecosystem/go-grpc-middleware,Apache-2.0
 core,github.com/grpc-ecosystem/grpc-gateway,BSD-3-Clause
+core,github.com/grpc-ecosystem/grpc-gateway/v2,BSD-3-Clause
 core,github.com/hashicorp/hcl,MPL-2.0
 core,github.com/imdario/mergo,BSD-3-Clause
 core,github.com/josharian/intern,MIT
@@ -83,14 +91,24 @@ core,github.com/shirou/gopsutil/v3,BSD-3-Clause
 core,github.com/spaolacci/murmur3,BSD-3-Clause
 core,github.com/spf13/afero,Apache-2.0
 core,github.com/spf13/cast,MIT
+core,github.com/spf13/cobra,Apache-2.0
 core,github.com/spf13/jwalterweatherman,MIT
 core,github.com/spf13/pflag,BSD-3-Clause
+core,github.com/stoewer/go-strcase,MIT
 core,github.com/stretchr/objx,MIT
 core,github.com/stretchr/testify,MIT
 core,github.com/tinylib/msgp/msgp,MIT
 core,github.com/x448/float16,MIT
 core,github.com/zorkian/go-datadog-api,BSD-3-Clause
 core,go.etcd.io/bbolt,MIT
+core,go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp,Apache-2.0
+core,go.opentelemetry.io/otel,Apache-2.0
+core,go.opentelemetry.io/otel/exporters/otlp/otlptrace,Apache-2.0
+core,go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc,Apache-2.0
+core,go.opentelemetry.io/otel/metric,Apache-2.0
+core,go.opentelemetry.io/otel/sdk,Apache-2.0
+core,go.opentelemetry.io/otel/trace,Apache-2.0
+core,go.opentelemetry.io/proto/otlp,Apache-2.0
 core,go.uber.org/atomic,MIT
 core,go.uber.org/multierr,MIT
 core,go.uber.org/zap,MIT
@@ -98,6 +116,7 @@ core,golang.org/x/exp,BSD-3-Clause
 core,golang.org/x/mod/semver,BSD-3-Clause
 core,golang.org/x/net,BSD-3-Clause
 core,golang.org/x/oauth2,BSD-3-Clause
+core,golang.org/x/sync/singleflight,BSD-3-Clause
 core,golang.org/x/sys/unix,BSD-3-Clause
 core,golang.org/x/term,BSD-3-Clause
 core,golang.org/x/text,BSD-3-Clause
@@ -105,7 +124,7 @@ core,golang.org/x/time/rate,BSD-3-Clause
 core,golang.org/x/xerrors,BSD-3-Clause
 core,gomodules.xyz/jsonpatch/v2,Apache-2.0
 core,google.golang.org/genproto/googleapis/api,Apache-2.0
-core,google.golang.org/genproto/googleapis/rpc/status,Apache-2.0
+core,google.golang.org/genproto/googleapis/rpc,Apache-2.0
 core,google.golang.org/genproto/protobuf/field_mask,Apache-2.0
 core,google.golang.org/grpc,Apache-2.0
 core,google.golang.org/protobuf,BSD-3-Clause
@@ -117,14 +136,19 @@ core,k8s.io/api,Apache-2.0
 core,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions,Apache-2.0
 core,k8s.io/apimachinery/pkg,Apache-2.0
 core,k8s.io/apimachinery/third_party/forked/golang,BSD-3-Clause
+core,k8s.io/apiserver,Apache-2.0
 core,k8s.io/client-go,Apache-2.0
+core,k8s.io/component-base,Apache-2.0
 core,k8s.io/klog/v2,Apache-2.0
 core,k8s.io/kube-aggregator/pkg/apis/apiregistration,Apache-2.0
 core,k8s.io/kube-openapi/pkg,Apache-2.0
 core,k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json,BSD-3-Clause
+core,k8s.io/kube-openapi/pkg/validation/errors,Apache-2.0
 core,k8s.io/kube-openapi/pkg/validation/spec,Apache-2.0
+core,k8s.io/kube-openapi/pkg/validation/strfmt,Apache-2.0
 core,k8s.io/utils,Apache-2.0
-core,k8s.io/utils/internal/third_party/forked/golang/net,BSD-3-Clause
+core,k8s.io/utils/internal/third_party/forked/golang,BSD-3-Clause
+core,sigs.k8s.io/apiserver-network-proxy/konnectivity-client,Apache-2.0
 core,sigs.k8s.io/controller-runtime,Apache-2.0
 core,sigs.k8s.io/json,Apache-2.0
 core,sigs.k8s.io/structured-merge-diff/v4,Apache-2.0
diff --git a/api/datadoghq/common/const.go b/api/datadoghq/common/const.go
index 4572bae7..8faba335 100644
--- a/api/datadoghq/common/const.go
+++ b/api/datadoghq/common/const.go
@@ -5,146 +5,12 @@
 
 package common
 
-// TODO move most of these constants out of common
-
-// This file tracks constants related to setting up the Datadog Agents
+// This file tracks common constants used across API versions
 
+// // Labels
 const (
 	// AgentDeploymentNameLabelKey label key use to link a Resource to a DatadogAgent
 	AgentDeploymentNameLabelKey = "agent.datadoghq.com/name"
 	// AgentDeploymentComponentLabelKey label key use to know with component is it
 	AgentDeploymentComponentLabelKey = "agent.datadoghq.com/component"
-	// MD5AgentDeploymentProviderLabelKey label key is used to identify which provider is being used
-	MD5AgentDeploymentProviderLabelKey = "agent.datadoghq.com/provider"
-	// MD5AgentDeploymentAnnotationKey annotation key used on a Resource in order to identify which AgentDeployment have been used to generate it.
-	MD5AgentDeploymentAnnotationKey = "agent.datadoghq.com/agentspechash"
-	// MD5ChecksumAnnotationKey annotation key is used to identify customConfig configurations
-	MD5ChecksumAnnotationKey = "checksum/%s-custom-config"
-)
-
-// Annotations
-const (
-	SystemProbeAppArmorAnnotationKey   = "container.apparmor.security.beta.kubernetes.io/system-probe"
-	SystemProbeAppArmorAnnotationValue = "unconfined"
-
-	AgentAppArmorAnnotationKey   = "container.apparmor.security.beta.kubernetes.io/agent"
-	AgentAppArmorAnnotationValue = "unconfined"
-)
-
-// Datadog volume names and mount paths
-const (
-	ConfdVolumeName   = "confd"
-	ConfdVolumePath   = "/conf.d"
-	ConfigVolumeName  = "config"
-	ConfigVolumePath  = "/etc/datadog-agent"
-	ChecksdVolumeName = "checksd"
-	ChecksdVolumePath = "/checks.d"
-
-	HostRootVolumeName = "hostroot"
-	HostRootHostPath   = "/"
-	HostRootMountPath  = "/host/root"
-
-	GroupVolumeName = "group"
-	GroupHostPath   = "/etc/group"
-	GroupMountPath  = "/etc/group"
-
-	PasswdVolumeName = "passwd"
-	PasswdHostPath   = "/etc/passwd"
-	PasswdMountPath  = "/etc/passwd"
-
-	ProcdirVolumeName = "procdir"
-	ProcdirHostPath   = "/proc"
-	ProcdirMountPath  = "/host/proc"
-
-	CgroupsVolumeName = "cgroups"
-	CgroupsHostPath   = "/sys/fs/cgroup"
-	CgroupsMountPath  = "/host/sys/fs/cgroup"
-
-	SystemProbeOSReleaseDirVolumeName = "host-osrelease"
-	SystemProbeOSReleaseDirVolumePath = "/etc/os-release"
-	SystemProbeOSReleaseDirMountPath  = "/host/etc/os-release"
-
-	SystemProbeSocketVolumeName = "sysprobe-socket-dir"
-	SystemProbeSocketVolumePath = "/var/run/sysprobe"
-
-	DebugfsVolumeName = "debugfs"
-	// same path on host and container
-	DebugfsPath = "/sys/kernel/debug"
-
-	ModulesVolumeName = "modules"
-	// same path on host and container
-	ModulesVolumePath = "/lib/modules"
-
-	SrcVolumeName = "src"
-	// same path on host and container
-	SrcVolumePath = "/usr/src"
-
-	AgentCustomConfigVolumePath = "/etc/datadog-agent/datadog.yaml"
-	SystemProbeConfigVolumePath = "/etc/datadog-agent/system-probe.yaml"
-	OtelCustomConfigVolumePath  = "/etc/datadog-agent/otel-config.yaml"
-
-	LogDatadogVolumeName      = "logdatadog"
-	LogDatadogVolumePath      = "/var/log/datadog"
-	DefaultLogTempStoragePath = "/var/lib/datadog-agent/logs"
-	TmpVolumeName             = "tmp"
-	TmpVolumePath             = "/tmp"
-	CertificatesVolumeName    = "certificates"
-	CertificatesVolumePath    = "/etc/datadog-agent/certificates"
-	AuthVolumeName            = "datadog-agent-auth"
-	AuthVolumePath            = "/etc/datadog-agent/auth"
-	InstallInfoVolumeName     = "installinfo"
-	InstallInfoVolumeSubPath  = "install_info"
-	InstallInfoVolumePath     = "/etc/datadog-agent/install_info"
-	InstallInfoVolumeReadOnly = true
-
-	DogstatsdHostPortName      = "dogstatsdport"
-	DogstatsdHostPortHostPort  = 8125
-	DogstatsdSocketVolumeName  = "dsdsocket"
-	DogstatsdAPMSocketHostPath = "/var/run/datadog"
-	DogstatsdSocketLocalPath   = "/var/run/datadog"
-	DogstatsdSocketName        = "dsd.socket"
-
-	HostCriSocketPathPrefix = "/host"
-	CriSocketVolumeName     = "runtimesocketdir"
-	RuntimeDirVolumePath    = "/var/run"
-
-	KubeletAgentCAPath  = "/var/run/host-kubelet-ca.crt"
-	KubeletCAVolumeName = "kubelet-ca"
-
-	APMSocketName = "apm.socket"
-
-	ExternalMetricsAPIServiceName = "v1beta1.external.metrics.k8s.io"
-
-	SeccompSecurityVolumeName                   = "datadog-agent-security"
-	SeccompSecurityVolumePath                   = "/etc/config"
-	SeccompRootVolumeName                       = "seccomp-root"
-	SeccompRootVolumePath                       = "/host/var/lib/kubelet/seccomp"
-	SeccompRootPath                             = "/var/lib/kubelet/seccomp"
-	SystemProbeSeccompKey                       = "system-probe-seccomp.json"
-	SystemProbeAgentSecurityConfigMapSuffixName = "system-probe-seccomp"
-	SystemProbeSeccompProfileName               = "system-probe"
-
-	AppArmorAnnotationKey = "container.apparmor.security.beta.kubernetes.io"
-
-	AgentCustomConfigVolumeName        = "custom-datadog-yaml"
-	ClusterAgentCustomConfigVolumeName = "custom-cluster-agent-yaml"
-
-	FIPSProxyCustomConfigVolumeName = "fips-proxy-cfg"
-	FIPSProxyCustomConfigFileName   = "datadog-fips-proxy.cfg"
-	FIPSProxyCustomConfigMapName    = "%s-fips-config"
-	FIPSProxyCustomConfigMountPath  = "/etc/datadog-fips-proxy/datadog-fips-proxy.cfg"
-)
-
-const (
-	// FieldPathSpecNodeName used as FieldPath for selecting the NodeName
-	FieldPathSpecNodeName = "spec.nodeName"
-
-	// FieldPathStatusHostIP used as FieldPath to retrieve the host ip
-	FieldPathStatusHostIP = "status.hostIP"
-
-	// FieldPathStatusPodIP used as FieldPath to retrieve the pod ip
-	FieldPathStatusPodIP = "status.podIP"
-
-	// FieldPathMetaName used as FieldPath to retrieve the pod name
-	FieldPathMetaName = "metadata.name"
 )
diff --git a/api/datadoghq/common/envvar.go b/api/datadoghq/common/envvar.go
index b25e2ff8..f01e8258 100644
--- a/api/datadoghq/common/envvar.go
+++ b/api/datadoghq/common/envvar.go
@@ -5,193 +5,6 @@
 
 package common
 
-// TODO move most of these out of common
-
-// Datadog env var names
-const (
-	DatadogHost                                          = "DATADOG_HOST"
-	DDAdmissionControllerAgentSidecarEnabled             = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_ENABLED"
-	DDAdmissionControllerAgentSidecarClusterAgentEnabled = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_CLUSTER_AGENT_ENABLED"
-	DDAdmissionControllerAgentSidecarProvider            = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_PROVIDER"
-	DDAdmissionControllerAgentSidecarRegistry            = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_CONTAINER_REGISTRY"
-	DDAdmissionControllerAgentSidecarImageName           = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_IMAGE_NAME"
-	DDAdmissionControllerAgentSidecarImageTag            = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_IMAGE_TAG"
-	DDAdmissionControllerAgentSidecarSelectors           = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_SELECTORS"
-	DDAdmissionControllerAgentSidecarProfiles            = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_PROFILES"
-	DDAdmissionControllerEnabled                         = "DD_ADMISSION_CONTROLLER_ENABLED"
-	DDAdmissionControllerValidationEnabled               = "DD_ADMISSION_CONTROLLER_VALIDATION_ENABLED"
-	DDAdmissionControllerMutationEnabled                 = "DD_ADMISSION_CONTROLLER_MUTATION_ENABLED"
-	DDAdmissionControllerInjectConfig                    = "DD_ADMISSION_CONTROLLER_INJECT_CONFIG_ENABLED"
-	DDAdmissionControllerInjectConfigMode                = "DD_ADMISSION_CONTROLLER_INJECT_CONFIG_MODE"
-	DDAdmissionControllerInjectTags                      = "DD_ADMISSION_CONTROLLER_INJECT_TAGS_ENABLED"
-	DDAdmissionControllerLocalServiceName                = "DD_ADMISSION_CONTROLLER_INJECT_CONFIG_LOCAL_SERVICE_NAME"
-	DDAdmissionControllerMutateUnlabelled                = "DD_ADMISSION_CONTROLLER_MUTATE_UNLABELLED"
-	DDAdmissionControllerServiceName                     = "DD_ADMISSION_CONTROLLER_SERVICE_NAME"
-	DDAdmissionControllerFailurePolicy                   = "DD_ADMISSION_CONTROLLER_FAILURE_POLICY"
-	DDAdmissionControllerWebhookName                     = "DD_ADMISSION_CONTROLLER_WEBHOOK_NAME"
-	DDAdmissionControllerRegistryName                    = "DD_ADMISSION_CONTROLLER_CONTAINER_REGISTRY"
-	DDAdmissionControllerCWSInstrumentationEnabled       = "DD_ADMISSION_CONTROLLER_CWS_INSTRUMENTATION_ENABLED"
-	DDAdmissionControllerCWSInstrumentationMode          = "DD_ADMISSION_CONTROLLER_CWS_INSTRUMENTATION_MODE"
-	DDAdmissionControllerAppsecEnabled                   = "DD_ADMISSION_CONTROLLER_AUTO_INSTRUMENTATION_APPSEC_ENABLED"
-	DDAdmissionControllerAppsecSCAEnabled                = "DD_ADMISSION_CONTROLLER_AUTO_INSTRUMENTATION_APPSEC_SCA_ENABLED"
-	DDAdmissionControllerIASTEnabled                     = "DD_ADMISSION_CONTROLLER_AUTO_INSTRUMENTATION_IAST_ENABLED"
-	DDAPIKey                                             = "DD_API_KEY"
-	DDAPMEnabled                                         = "DD_APM_ENABLED"
-	DDAPMInstrumentationInstallTime                      = "DD_INSTRUMENTATION_INSTALL_TIME"
-	DDAPMInstrumentationInstallId                        = "DD_INSTRUMENTATION_INSTALL_ID"
-	DDAPMInstrumentationInstallType                      = "DD_INSTRUMENTATION_INSTALL_TYPE"
-	DDAPMNonLocalTraffic                                 = "DD_APM_NON_LOCAL_TRAFFIC"
-	DDAPMReceiverPort                                    = "DD_APM_RECEIVER_PORT"
-	DDAPMReceiverSocket                                  = "DD_APM_RECEIVER_SOCKET"
-	DDAPMInstrumentationEnabled                          = "DD_APM_INSTRUMENTATION_ENABLED"
-	DDAPMInstrumentationEnabledNamespaces                = "DD_APM_INSTRUMENTATION_ENABLED_NAMESPACES"
-	DDAPMInstrumentationDisabledNamespaces               = "DD_APM_INSTRUMENTATION_DISABLED_NAMESPACES"
-	DDAPMInstrumentationLibVersions                      = "DD_APM_INSTRUMENTATION_LIB_VERSIONS"
-	DDAppKey                                             = "DD_APP_KEY"
-	DDAuthTokenFilePath                                  = "DD_AUTH_TOKEN_FILE_PATH"
-	DDChecksTagCardinality                               = "DD_CHECKS_TAG_CARDINALITY"
-	DDClcRunnerEnabled                                   = "DD_CLC_RUNNER_ENABLED"
-	DDClcRunnerHost                                      = "DD_CLC_RUNNER_HOST"
-	DDClcRunnerID                                        = "DD_CLC_RUNNER_ID"
-	DDClusterAgentAuthToken                              = "DD_CLUSTER_AGENT_AUTH_TOKEN"
-	DDClusterAgentEnabled                                = "DD_CLUSTER_AGENT_ENABLED"
-	DDClusterAgentKubeServiceName                        = "DD_CLUSTER_AGENT_KUBERNETES_SERVICE_NAME"
-	DDClusterAgentServiceAccountName                     = "DD_CLUSTER_AGENT_SERVICE_ACCOUNT_NAME"
-	DDClusterAgentTokenName                              = "DD_CLUSTER_AGENT_TOKEN_NAME"
-	DDClusterChecksEnabled                               = "DD_CLUSTER_CHECKS_ENABLED"
-	DDClusterName                                        = "DD_CLUSTER_NAME"
-	DDCollectKubernetesEvents                            = "DD_COLLECT_KUBERNETES_EVENTS"
-	DDComplianceConfigCheckInterval                      = "DD_COMPLIANCE_CONFIG_CHECK_INTERVAL"
-	DDComplianceConfigDir                                = "DD_COMPLIANCE_CONFIG_DIR"
-	DDComplianceConfigEnabled                            = "DD_COMPLIANCE_CONFIG_ENABLED"
-	DDComplianceHostBenchmarksEnabled                    = "DD_COMPLIANCE_HOST_BENCHMARKS_ENABLED"
-	DDContainerCollectionEnabled                         = "DD_PROCESS_CONFIG_CONTAINER_COLLECTION_ENABLED"
-	DDCriSocketPath                                      = "DD_CRI_SOCKET_PATH"
-	DDddURL                                              = "DD_DD_URL"
-	DDURL                                                = "DD_URL"
-	DDDogstatsdEnabled                                   = "DD_USE_DOGSTATSD"
-	DDDogstatsdMapperProfiles                            = "DD_DOGSTATSD_MAPPER_PROFILES"
-	DDDogstatsdNonLocalTraffic                           = "DD_DOGSTATSD_NON_LOCAL_TRAFFIC"
-	DDDogstatsdOriginDetection                           = "DD_DOGSTATSD_ORIGIN_DETECTION"
-	DDDogstatsdOriginDetectionClient                     = "DD_DOGSTATSD_ORIGIN_DETECTION_CLIENT"
-	DDDogstatsdTagCardinality                            = "DD_DOGSTATSD_TAG_CARDINALITY"
-	DDDogstatsdPort                                      = "DD_DOGSTATSD_PORT"
-	DDDogstatsdSocket                                    = "DD_DOGSTATSD_SOCKET"
-	DDEnableMetadataCollection                           = "DD_ENABLE_METADATA_COLLECTION"
-	DDEnableOOMKillEnvVar                                = "DD_SYSTEM_PROBE_CONFIG_ENABLE_OOM_KILL"
-	DDEnableTCPQueueLengthEnvVar                         = "DD_SYSTEM_PROBE_CONFIG_ENABLE_TCP_QUEUE_LENGTH"
-	DDEnableEBPFCheckEnvVar                              = "DD_EBPF_CHECK_ENABLED"
-	DDExternalMetricsProviderAPIKey                      = "DD_EXTERNAL_METRICS_PROVIDER_API_KEY"
-	DDExternalMetricsProviderAppKey                      = "DD_EXTERNAL_METRICS_PROVIDER_APP_KEY"
-	DDExternalMetricsProviderEndpoint                    = "DD_EXTERNAL_METRICS_PROVIDER_ENDPOINT"
-	DDExternalMetricsProviderEnabled                     = "DD_EXTERNAL_METRICS_PROVIDER_ENABLED"
-	DDExternalMetricsProviderPort                        = "DD_EXTERNAL_METRICS_PROVIDER_PORT"
-	DDExternalMetricsProviderUseDatadogMetric            = "DD_EXTERNAL_METRICS_PROVIDER_USE_DATADOGMETRIC_CRD"
-	DDExternalMetricsProviderWPAController               = "DD_EXTERNAL_METRICS_PROVIDER_WPA_CONTROLLER"
-	DDAutoscalingWorkloadEnabled                         = "DD_AUTOSCALING_WORKLOAD_ENABLED"
-	DDExtraConfigProviders                               = "DD_EXTRA_CONFIG_PROVIDERS"
-	DDExtraListeners                                     = "DD_EXTRA_LISTENERS"
-	DDFIPSEnabled                                        = "DD_FIPS_ENABLED"
-	DDFIPSPortRangeStart                                 = "DD_FIPS_PORT_RANGE_START"
-	DDFIPSUseHTTPS                                       = "DD_FIPS_HTTPS"
-	DDFIPSLocalAddress                                   = "DD_FIPS_LOCAL_ADDRESS"
-	DDHealthPort                                         = "DD_HEALTH_PORT"
-	DDHostname                                           = "DD_HOSTNAME"
-	DDHostRootEnvVar                                     = "HOST_ROOT"
-	DDIgnoreAutoConf                                     = "DD_IGNORE_AUTOCONF"
-	DDKubeletCAPath                                      = "DD_KUBELET_CLIENT_CA"
-	DDKubeletHost                                        = "DD_KUBERNETES_KUBELET_HOST"
-	DDKubeletTLSVerify                                   = "DD_KUBELET_TLS_VERIFY"
-	DDKubeResourcesNamespace                             = "DD_KUBE_RESOURCES_NAMESPACE"
-	DDKubeStateMetricsCoreConfigMap                      = "DD_KUBE_STATE_METRICS_CORE_CONFIGMAP_NAME"
-	DDKubeStateMetricsCoreEnabled                        = "DD_KUBE_STATE_METRICS_CORE_ENABLED"
-	DDLanguageDetectionEnabled                           = "DD_LANGUAGE_DETECTION_ENABLED"
-	DDLeaderElection                                     = "DD_LEADER_ELECTION"
-	DDLeaderLeaseName                                    = "DD_LEADER_LEASE_NAME"
-	DDLogLevel                                           = "DD_LOG_LEVEL"
-	DDLogsConfigContainerCollectAll                      = "DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL"
-	DDLogsConfigOpenFilesLimit                           = "DD_LOGS_CONFIG_OPEN_FILES_LIMIT"
-	DDLogsContainerCollectUsingFiles                     = "DD_LOGS_CONFIG_K8S_CONTAINER_USE_FILE"
-	DDLogsEnabled                                        = "DD_LOGS_ENABLED"
-	DDNamespaceLabelsAsTags                              = "DD_KUBERNETES_NAMESPACE_LABELS_AS_TAGS"
-	DDNamespaceAnnotationsAsTags                         = "DD_KUBERNETES_NAMESPACE_ANNOTATIONS_AS_TAGS"
-	DDNodeLabelsAsTags                                   = "DD_KUBERNETES_NODE_LABELS_AS_TAGS"
-	DDKubernetesResourcesLabelsAsTags                    = "DD_KUBERNETES_RESOURCES_LABELS_AS_TAGS"
-	DDKubernetesResourcesAnnotationsAsTags               = "DD_KUBERNETES_RESOURCES_ANNOTATIONS_AS_TAGS"
-	DDOrchestratorExplorerEnabled                        = "DD_ORCHESTRATOR_EXPLORER_ENABLED"
-	DDOrchestratorExplorerExtraTags                      = "DD_ORCHESTRATOR_EXPLORER_EXTRA_TAGS"
-	DDOrchestratorExplorerDDUrl                          = "DD_ORCHESTRATOR_EXPLORER_ORCHESTRATOR_DD_URL"
-	DDOrchestratorExplorerAdditionalEndpoints            = "DD_ORCHESTRATOR_ADDITIONAL_ENDPOINTS"
-	DDOrchestratorExplorerContainerScrubbingEnabled      = "DD_ORCHESTRATOR_EXPLORER_CONTAINER_SCRUBBING_ENABLED"
-	DDOriginDetectionUnified                             = "DD_ORIGIN_DETECTION_UNIFIED"
-	DDPodAnnotationsAsTags                               = "DD_KUBERNETES_POD_ANNOTATIONS_AS_TAGS"
-	DDPodLabelsAsTags                                    = "DD_KUBERNETES_POD_LABELS_AS_TAGS"
-	DDPodName                                            = "DD_POD_NAME"
-	DDPPMReceiverSocket                                  = "DD_APM_RECEIVER_SOCKET"
-	DDProcessCollectionEnabled                           = "DD_PROCESS_CONFIG_PROCESS_COLLECTION_ENABLED"
-	DDProcessConfigScrubArgs                             = "DD_PROCESS_CONFIG_SCRUB_ARGS"
-	DDProcessConfigStripArgs                             = "DD_PROCESS_CONFIG_STRIP_PROC_ARGUMENTS"
-	DDProcessDiscoveryEnabled                            = "DD_PROCESS_CONFIG_PROCESS_DISCOVERY_ENABLED"
-	DDProcessConfigRunInCoreAgent                        = "DD_PROCESS_CONFIG_RUN_IN_CORE_AGENT_ENABLED"
-	DDPrometheusScrapeChecks                             = "DD_PROMETHEUS_SCRAPE_CHECKS"
-	DDPrometheusScrapeEnabled                            = "DD_PROMETHEUS_SCRAPE_ENABLED"
-	DDPrometheusScrapeServiceEndpoints                   = "DD_PROMETHEUS_SCRAPE_SERVICE_ENDPOINTS"
-	DDPrometheusScrapeVersion                            = "DD_PROMETHEUS_SCRAPE_VERSION"
-	DDRemoteConfigurationEnabled                         = "DD_REMOTE_CONFIGURATION_ENABLED"
-	DDRuntimeSecurityConfigEnabled                       = "DD_RUNTIME_SECURITY_CONFIG_ENABLED"
-	DDRuntimeSecurityConfigPoliciesDir                   = "DD_RUNTIME_SECURITY_CONFIG_POLICIES_DIR"
-	DDRuntimeSecurityConfigRemoteTaggerEnabled           = "DD_RUNTIME_SECURITY_CONFIG_REMOTE_TAGGER"
-	DDRuntimeSecurityConfigSocket                        = "DD_RUNTIME_SECURITY_CONFIG_SOCKET"
-	DDRuntimeSecurityConfigSyscallMonitorEnabled         = "DD_RUNTIME_SECURITY_CONFIG_SYSCALL_MONITOR_ENABLED"
-	DDRuntimeSecurityConfigNetworkEnabled                = "DD_RUNTIME_SECURITY_CONFIG_NETWORK_ENABLED"
-	DDRuntimeSecurityConfigActivityDumpEnabled           = "DD_RUNTIME_SECURITY_CONFIG_ACTIVITY_DUMP_ENABLED"
-	DDRuntimeSecurityConfigRemoteConfigurationEnabled    = "DD_RUNTIME_SECURITY_CONFIG_REMOTE_CONFIGURATION_ENABLED"
-	DDContainerImageEnabled                              = "DD_CONTAINER_IMAGE_ENABLED"
-	DDSBOMEnabled                                        = "DD_SBOM_ENABLED"
-	DDSBOMContainerImageEnabled                          = "DD_SBOM_CONTAINER_IMAGE_ENABLED"
-	DDSBOMContainerImageAnalyzers                        = "DD_SBOM_CONTAINER_IMAGE_ANALYZERS"
-	DDSBOMContainerUseMount                              = "DD_SBOM_CONTAINER_IMAGE_USE_MOUNT"
-	DDSBOMContainerOverlayFSDirectScan                   = "DD_SBOM_CONTAINER_IMAGE_OVERLAYFS_DIRECT_SCAN"
-	DDSBOMHostEnabled                                    = "DD_SBOM_HOST_ENABLED"
-	DDSBOMHostAnalyzers                                  = "DD_SBOM_HOST_ANALYZERS"
-	DDSecretBackendCommand                               = "DD_SECRET_BACKEND_COMMAND"
-	DDSecretBackendArguments                             = "DD_SECRET_BACKEND_ARGUMENTS"
-	DDSecretBackendTimeout                               = "DD_SECRET_BACKEND_TIMEOUT"
-	DDServiceDiscoveryEnabled                            = "DD_DISCOVERY_ENABLED"
-	DDSite                                               = "DD_SITE"
-	DDSystemProbeAgentEnabled                            = "DD_SYSTEM_PROBE_ENABLED"
-	DDSystemProbeBPFDebugEnabled                         = DDSystemProbeEnvPrefix + "BPF_DEBUG"
-	DDSystemProbeCollectDNSStatsEnabled                  = "DD_COLLECT_DNS_STATS"
-	DDSystemProbeConntrackEnabled                        = DDSystemProbeEnvPrefix + "ENABLE_CONNTRACK"
-	DDSystemProbeDebugPort                               = DDSystemProbeEnvPrefix + "DEBUG_PORT"
-	DDSystemProbeEnabled                                 = "DD_SYSTEM_PROBE_ENABLED"
-	DDSystemProbeEnvPrefix                               = "DD_SYSTEM_PROBE_CONFIG_"
-	DDSystemProbeExternal                                = "DD_SYSTEM_PROBE_EXTERNAL"
-	DDSystemProbeNPMEnabled                              = "DD_SYSTEM_PROBE_NETWORK_ENABLED"
-	DDSystemProbeServiceMonitoringEnabled                = "DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED"
-	DDSystemProbeSocket                                  = "DD_SYSPROBE_SOCKET"
-	DDSystemProbeOOMKillEnabled                          = DDSystemProbeEnvPrefix + "ENABLE_OOM_KILL"
-	DDSystemProbeTCPQueueLengthEnabled                   = DDSystemProbeEnvPrefix + "ENABLE_TCP_QUEUE_LENGTH"
-	DDTags                                               = "DD_TAGS"
-	DockerHost                                           = "DOCKER_HOST"
-
-	DDOTLPgRPCEndpoint = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT"
-	DDOTLPHTTPEndpoint = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT"
-
-	// KubernetesEnvvarName Env var used by the Datadog Agent container entrypoint
-	// to add kubelet config provider and listener
-	KubernetesEnvVar = "KUBERNETES"
-
-	ClusterChecksConfigProvider = "clusterchecks"
-
-	EnvVarTrueValue  = "true"
-	EnvVarFalseValue = "false"
-
-	// InstallInfoToolVersion is used by the Operator to override the tool
-	// version value in the Agent's install info
-	InstallInfoToolVersion = "DD_TOOL_VERSION"
-)
-
 // DatadogAgentProfile env var names
 const (
 	CreateStrategyEnabled = "DD_DAP_CREATE_STRATEGY_ENABLED"
diff --git a/api/datadoghq/v1alpha1/datadogagent_types.go b/api/datadoghq/v1alpha1/datadogagent_types.go
deleted file mode 100644
index 05228b7e..00000000
--- a/api/datadoghq/v1alpha1/datadogagent_types.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Unless explicitly stated otherwise all files in this repository are licensed
-// under the Apache License Version 2.0.
-// This product includes software developed at Datadog (https://www.datadoghq.com/).
-// Copyright 2016-present Datadog, Inc.
-
-package v1alpha1
-
-// TODO move these to a different file
-
-// DatadogAgentConditionType type use to represent a DatadogAgent condition.
-type DatadogAgentConditionType string
-
-const (
-	// DatadogMetricsActive forwarding metrics and events to Datadog is active.
-	DatadogMetricsActive DatadogAgentConditionType = "ActiveDatadogMetrics"
-	// DatadogMetricsError cannot forward deployment metrics and events to Datadog.
-	DatadogMetricsError DatadogAgentConditionType = "DatadogMetricsError"
-)
diff --git a/api/datadoghq/v1alpha1/datadogagentprofile_types.go b/api/datadoghq/v1alpha1/datadogagentprofile_types.go
index 2413d2e8..74534e95 100644
--- a/api/datadoghq/v1alpha1/datadogagentprofile_types.go
+++ b/api/datadoghq/v1alpha1/datadogagentprofile_types.go
@@ -54,6 +54,12 @@ type Override struct {
 	// +optional
 	PriorityClassName *string `json:"priorityClassName,omitempty"`
 
+	// If specified, indicates the pod's RuntimeClass kubelet should use to run the pod.
+	// If the named RuntimeClass does not exist, or the CRI cannot run the corresponding handler, the pod enters the Failed terminal phase.
+	// If no runtimeClassName is specified, the default RuntimeHandler is used, which is equivalent to the behavior when the RuntimeClass feature is disabled.
+	// +optional
+	RuntimeClassName *string `json:"runtimeClassName,omitempty"`
+
 	// The deployment strategy to use to replace existing pods with new ones.
 	// Valid types are `RollingUpdate` or `OnDelete` for DaemonSets
 	// +optional
diff --git a/api/datadoghq/v1alpha1/datadogpodautoscaler_types.go b/api/datadoghq/v1alpha1/datadogpodautoscaler_types.go
index 4500d4ee..b442ccd7 100644
--- a/api/datadoghq/v1alpha1/datadogpodautoscaler_types.go
+++ b/api/datadoghq/v1alpha1/datadogpodautoscaler_types.go
@@ -191,6 +191,13 @@ type DatadogPodAutoscalerScalingPolicy struct {
 	// +listType=atomic
 	// +optional
 	Rules []DatadogPodAutoscalerScalingRule `json:"rules,omitempty"`
+
+	// StabilizationWindowSeconds is the number of seconds the controller should lookback at previous recommendations
+	// before deciding to apply a new one. Defaults to 0.
+	// +optional
+	// +kubebuilder:validation:Minimum=0
+	// +kubebuilder:validation:Maximum=1800
+	StabilizationWindowSeconds int32 `json:"stabilizationWindowSeconds,omitempty"`
 }
 
 // DatadogPodAutoscalerScalingRuleType defines how scaling rule value should be interpreted.
diff --git a/api/datadoghq/v1alpha1/zz_generated.deepcopy.go b/api/datadoghq/v1alpha1/zz_generated.deepcopy.go
index 490cdf21..ed91413b 100644
--- a/api/datadoghq/v1alpha1/zz_generated.deepcopy.go
+++ b/api/datadoghq/v1alpha1/zz_generated.deepcopy.go
@@ -1696,6 +1696,11 @@ func (in *Override) DeepCopyInto(out *Override) {
 		*out = new(string)
 		**out = **in
 	}
+	if in.RuntimeClassName != nil {
+		in, out := &in.RuntimeClassName, &out.RuntimeClassName
+		*out = new(string)
+		**out = **in
+	}
 	if in.UpdateStrategy != nil {
 		in, out := &in.UpdateStrategy, &out.UpdateStrategy
 		*out = new(common.UpdateStrategy)
diff --git a/api/datadoghq/v2alpha1/condition.go b/api/datadoghq/v2alpha1/condition.go
index e8632247..d2a69cab 100644
--- a/api/datadoghq/v2alpha1/condition.go
+++ b/api/datadoghq/v2alpha1/condition.go
@@ -1,10 +1,13 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
 package v2alpha1
 
 import (
 	"fmt"
 
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
-
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -124,7 +127,7 @@ func UpdateDeploymentStatus(dep *appsv1.Deployment, depStatus *DeploymentStatus,
 		return depStatus
 	}
 
-	if hash, ok := dep.Annotations[apicommon.MD5AgentDeploymentAnnotationKey]; ok {
+	if hash, ok := dep.Annotations[MD5AgentDeploymentAnnotationKey]; ok {
 		depStatus.CurrentHash = hash
 	}
 	if updateTime != nil {
@@ -186,7 +189,7 @@ func UpdateDaemonSetStatus(ds *appsv1.DaemonSet, dsStatus []*DaemonSetStatus, up
 	if updateTime != nil {
 		newStatus.LastUpdate = updateTime
 	}
-	if hash, ok := ds.Annotations[apicommon.MD5AgentDeploymentAnnotationKey]; ok {
+	if hash, ok := ds.Annotations[MD5AgentDeploymentAnnotationKey]; ok {
 		newStatus.CurrentHash = hash
 	}
 
@@ -236,7 +239,7 @@ func UpdateExtendedDaemonSetStatus(eds *edsdatadoghqv1alpha1.ExtendedDaemonSet,
 	if updateTime != nil {
 		newStatus.LastUpdate = updateTime
 	}
-	if hash, ok := eds.Annotations[apicommon.MD5AgentDeploymentAnnotationKey]; ok {
+	if hash, ok := eds.Annotations[MD5AgentDeploymentAnnotationKey]; ok {
 		newStatus.CurrentHash = hash
 	}
 
@@ -325,3 +328,13 @@ func assignNumeralState(state string) int {
 		return 0
 	}
 }
+
+// DatadogForwarderConditionType type use to represent a Datadog Metrics Forwarder condition.
+type DatadogForwarderConditionType string
+
+const (
+	// DatadogMetricsActive forwarding metrics and events to Datadog is active.
+	DatadogMetricsActive DatadogForwarderConditionType = "ActiveDatadogMetrics"
+	// DatadogMetricsError cannot forward deployment metrics and events to Datadog.
+	DatadogMetricsError DatadogForwarderConditionType = "DatadogMetricsError"
+)
diff --git a/api/datadoghq/v2alpha1/const.go b/api/datadoghq/v2alpha1/const.go
index 3c26823c..d1434159 100644
--- a/api/datadoghq/v2alpha1/const.go
+++ b/api/datadoghq/v2alpha1/const.go
@@ -5,7 +5,7 @@
 
 package v2alpha1
 
-// This file tracks constants closely related to the DatadogAgent CRD
+// This file tracks constants related to the DatadogAgent CRD
 
 const (
 
@@ -98,12 +98,12 @@ const (
 	DefaultAdmissionControllerTargetPort = 8000
 	// DefaultAdmissionControllerWebhookName default admission controller webhook name
 	DefaultAdmissionControllerWebhookName string = "datadog-webhook"
-	// DefaultDogstatsdOriginDetection default Origin Detection
-	// DefaultDogstatsdOriginDetection = "false" // CELENE NOT USED!
 	// DefaultDogstatsdPort default dogstatsd port
 	DefaultDogstatsdPort = 8125
 	// DefaultDogstatsdPortName default dogstatsd port name
 	DefaultDogstatsdPortName = "dogstatsdport"
+	// DefaultOTelAgentConf default otel agent ConfigMap name
+	DefaultOTelAgentConf string = "otel-agent-config"
 	// DefaultKubeStateMetricsCoreConf default ksm core ConfigMap name
 	DefaultKubeStateMetricsCoreConf string = "kube-state-metrics-core-config"
 	// DefaultOrchestratorExplorerConf default orchestrator explorer ConfigMap name
@@ -133,3 +133,141 @@ const (
 	EndpointsChecksConfigProvider           = "endpointschecks"
 	ClusterAndEndpointsConfigProviders      = "clusterchecks endpointschecks"
 )
+
+// Labels
+const (
+	// MD5AgentDeploymentProviderLabelKey label key is used to identify which provider is being used
+	MD5AgentDeploymentProviderLabelKey = "agent.datadoghq.com/provider"
+	// MD5AgentDeploymentAnnotationKey annotation key used on a Resource in order to identify which AgentDeployment have been used to generate it.
+	MD5AgentDeploymentAnnotationKey = "agent.datadoghq.com/agentspechash"
+	// MD5ChecksumAnnotationKey annotation key is used to identify customConfig configurations
+	MD5ChecksumAnnotationKey = "checksum/%s-custom-config"
+)
+
+// Annotations
+const (
+	AppArmorAnnotationKey = "container.apparmor.security.beta.kubernetes.io"
+
+	SystemProbeAppArmorAnnotationKey   = "container.apparmor.security.beta.kubernetes.io/system-probe"
+	SystemProbeAppArmorAnnotationValue = "unconfined"
+
+	AgentAppArmorAnnotationKey   = "container.apparmor.security.beta.kubernetes.io/agent"
+	AgentAppArmorAnnotationValue = "unconfined"
+)
+
+// Volumes and paths
+const (
+	ConfdVolumeName   = "confd"
+	ConfdVolumePath   = "/conf.d"
+	ConfigVolumeName  = "config"
+	ConfigVolumePath  = "/etc/datadog-agent"
+	ChecksdVolumeName = "checksd"
+	ChecksdVolumePath = "/checks.d"
+
+	HostRootVolumeName = "hostroot"
+	HostRootHostPath   = "/"
+	HostRootMountPath  = "/host/root"
+
+	GroupVolumeName = "group"
+	GroupHostPath   = "/etc/group"
+	GroupMountPath  = "/etc/group"
+
+	PasswdVolumeName = "passwd"
+	PasswdHostPath   = "/etc/passwd"
+	PasswdMountPath  = "/etc/passwd"
+
+	ProcdirVolumeName = "procdir"
+	ProcdirHostPath   = "/proc"
+	ProcdirMountPath  = "/host/proc"
+
+	CgroupsVolumeName = "cgroups"
+	CgroupsHostPath   = "/sys/fs/cgroup"
+	CgroupsMountPath  = "/host/sys/fs/cgroup"
+
+	SystemProbeOSReleaseDirVolumeName = "host-osrelease"
+	SystemProbeOSReleaseDirVolumePath = "/etc/os-release"
+	SystemProbeOSReleaseDirMountPath  = "/host/etc/os-release"
+
+	SystemProbeSocketVolumeName = "sysprobe-socket-dir"
+	SystemProbeSocketVolumePath = "/var/run/sysprobe"
+
+	DebugfsVolumeName = "debugfs"
+	// same path on host and container
+	DebugfsPath = "/sys/kernel/debug"
+
+	ModulesVolumeName = "modules"
+	// same path on host and container
+	ModulesVolumePath = "/lib/modules"
+
+	SrcVolumeName = "src"
+	// same path on host and container
+	SrcVolumePath = "/usr/src"
+
+	AgentCustomConfigVolumePath = "/etc/datadog-agent/datadog.yaml"
+	SystemProbeConfigVolumePath = "/etc/datadog-agent/system-probe.yaml"
+	OtelCustomConfigVolumePath  = "/etc/datadog-agent/otel-config.yaml"
+
+	LogDatadogVolumeName      = "logdatadog"
+	LogDatadogVolumePath      = "/var/log/datadog"
+	DefaultLogTempStoragePath = "/var/lib/datadog-agent/logs"
+	TmpVolumeName             = "tmp"
+	TmpVolumePath             = "/tmp"
+	CertificatesVolumeName    = "certificates"
+	CertificatesVolumePath    = "/etc/datadog-agent/certificates"
+	AuthVolumeName            = "datadog-agent-auth"
+	AuthVolumePath            = "/etc/datadog-agent/auth"
+	InstallInfoVolumeName     = "installinfo"
+	InstallInfoVolumeSubPath  = "install_info"
+	InstallInfoVolumePath     = "/etc/datadog-agent/install_info"
+	InstallInfoVolumeReadOnly = true
+
+	DogstatsdHostPortName      = "dogstatsdport"
+	DogstatsdHostPortHostPort  = 8125
+	DogstatsdSocketVolumeName  = "dsdsocket"
+	DogstatsdAPMSocketHostPath = "/var/run/datadog"
+	DogstatsdSocketLocalPath   = "/var/run/datadog"
+	DogstatsdSocketName        = "dsd.socket"
+
+	HostCriSocketPathPrefix = "/host"
+	CriSocketVolumeName     = "runtimesocketdir"
+	RuntimeDirVolumePath    = "/var/run"
+
+	KubeletAgentCAPath  = "/var/run/host-kubelet-ca.crt"
+	KubeletCAVolumeName = "kubelet-ca"
+
+	APMSocketName = "apm.socket"
+
+	ExternalMetricsAPIServiceName = "v1beta1.external.metrics.k8s.io"
+
+	SeccompSecurityVolumeName                   = "datadog-agent-security"
+	SeccompSecurityVolumePath                   = "/etc/config"
+	SeccompRootVolumeName                       = "seccomp-root"
+	SeccompRootVolumePath                       = "/host/var/lib/kubelet/seccomp"
+	SeccompRootPath                             = "/var/lib/kubelet/seccomp"
+	SystemProbeSeccompKey                       = "system-probe-seccomp.json"
+	SystemProbeAgentSecurityConfigMapSuffixName = "system-probe-seccomp"
+	SystemProbeSeccompProfileName               = "system-probe"
+
+	AgentCustomConfigVolumeName        = "custom-datadog-yaml"
+	ClusterAgentCustomConfigVolumeName = "custom-cluster-agent-yaml"
+
+	FIPSProxyCustomConfigVolumeName = "fips-proxy-cfg"
+	FIPSProxyCustomConfigFileName   = "datadog-fips-proxy.cfg"
+	FIPSProxyCustomConfigMapName    = "%s-fips-config"
+	FIPSProxyCustomConfigMountPath  = "/etc/datadog-fips-proxy/datadog-fips-proxy.cfg"
+)
+
+// Field paths
+const (
+	// FieldPathSpecNodeName used as FieldPath for selecting the NodeName
+	FieldPathSpecNodeName = "spec.nodeName"
+
+	// FieldPathStatusHostIP used as FieldPath to retrieve the host ip
+	FieldPathStatusHostIP = "status.hostIP"
+
+	// FieldPathStatusPodIP used as FieldPath to retrieve the pod ip
+	FieldPathStatusPodIP = "status.podIP"
+
+	// FieldPathMetaName used as FieldPath to retrieve the pod name
+	FieldPathMetaName = "metadata.name"
+)
diff --git a/api/datadoghq/v2alpha1/datadogagent_default.go b/api/datadoghq/v2alpha1/datadogagent_default.go
index ccaf1602..97d54f89 100644
--- a/api/datadoghq/v2alpha1/datadogagent_default.go
+++ b/api/datadoghq/v2alpha1/datadogagent_default.go
@@ -6,7 +6,6 @@
 package v2alpha1
 
 import (
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	apiutils "github.com/DataDog/datadog-operator/api/utils"
 	"github.com/DataDog/datadog-operator/pkg/defaulting"
 )
@@ -26,6 +25,7 @@ const (
 	defaultLogPodLogsPath                string = "/var/log/pods"
 	defaultLogContainerSymlinksPath      string = "/var/log/containers"
 
+	defaultOtelCollectorEnabled           bool = false
 	defaultLiveProcessCollectionEnabled   bool = false
 	defaultLiveContainerCollectionEnabled bool = true
 	defaultProcessDiscoveryEnabled        bool = true
@@ -42,7 +42,7 @@ const (
 	defaultAPMHostPortEnabled         bool   = false
 	defaultAPMHostPort                int32  = 8126
 	defaultAPMSocketEnabled           bool   = true
-	defaultAPMSocketHostPath          string = apicommon.DogstatsdAPMSocketHostPath + "/" + apicommon.APMSocketName
+	defaultAPMSocketHostPath          string = DogstatsdAPMSocketHostPath + "/" + APMSocketName
 	defaultAPMSingleStepInstrEnabled  bool   = false
 	defaultLanguageDetectionEnabled   bool   = true
 	defaultCSPMEnabled                bool   = false
@@ -61,7 +61,7 @@ const (
 	defaultDogstatsdOriginDetectionEnabled bool   = false
 	defaultDogstatsdHostPortEnabled        bool   = false
 	defaultDogstatsdSocketEnabled          bool   = true
-	defaultDogstatsdHostSocketPath         string = apicommon.DogstatsdAPMSocketHostPath + "/" + apicommon.DogstatsdSocketName
+	defaultDogstatsdHostSocketPath         string = DogstatsdAPMSocketHostPath + "/" + DogstatsdSocketName
 
 	defaultOTLPGRPCEnabled         bool   = false
 	defaultOTLPGRPCHostPortEnabled bool   = true
@@ -80,6 +80,9 @@ const (
 	defaultAdmissionControllerMutationEnabled                 bool   = true
 	defaultAdmissionControllerMutateUnlabelled                bool   = false
 	defaultAdmissionServiceName                               string = "datadog-admission-controller"
+
+	defaultAdmissionControllerKubernetesAdmissionEventsEnabled bool = false
+
 	// DefaultAdmissionControllerCWSInstrumentationEnabled default CWS Instrumentation enabled value
 	DefaultAdmissionControllerCWSInstrumentationEnabled bool = false
 	// DefaultAdmissionControllerCWSInstrumentationMode default CWS Instrumentation mode
@@ -211,7 +214,7 @@ func defaultFeaturesConfig(ddaSpec *DatadogAgentSpec) {
 
 		apiutils.DefaultStringIfUnset(&ddaSpec.Features.LogCollection.ContainerSymlinksPath, defaultLogContainerSymlinksPath)
 
-		apiutils.DefaultStringIfUnset(&ddaSpec.Features.LogCollection.TempStoragePath, apicommon.DefaultLogTempStoragePath)
+		apiutils.DefaultStringIfUnset(&ddaSpec.Features.LogCollection.TempStoragePath, DefaultLogTempStoragePath)
 	}
 
 	// LiveContainerCollection Feature
@@ -220,6 +223,12 @@ func defaultFeaturesConfig(ddaSpec *DatadogAgentSpec) {
 	}
 	apiutils.DefaultBooleanIfUnset(&ddaSpec.Features.LiveContainerCollection.Enabled, defaultLiveContainerCollectionEnabled)
 
+	// OTelCollector Feature
+	if ddaSpec.Features.OtelCollector == nil {
+		ddaSpec.Features.OtelCollector = &OtelCollectorFeatureConfig{}
+	}
+	apiutils.DefaultBooleanIfUnset(&ddaSpec.Features.OtelCollector.Enabled, defaultOtelCollectorEnabled)
+
 	// LiveProcessCollection Feature
 	if ddaSpec.Features.LiveProcessCollection == nil {
 		ddaSpec.Features.LiveProcessCollection = &LiveProcessCollectionFeatureConfig{}
@@ -496,6 +505,12 @@ func defaultFeaturesConfig(ddaSpec *DatadogAgentSpec) {
 		apiutils.DefaultBooleanIfUnset(&agentSidecarInjection.ClusterAgentCommunicationEnabled, defaultAdmissionControllerAgentSidecarClusterAgentEnabled)
 	}
 
+	// K8s Admission Events in AdmissonController Feature
+	if ddaSpec.Features.AdmissionController.KubernetesAdmissionEvents == nil {
+		ddaSpec.Features.AdmissionController.KubernetesAdmissionEvents = &KubernetesAdmissionEventsConfig{}
+	}
+	apiutils.DefaultBooleanIfUnset(&ddaSpec.Features.AdmissionController.KubernetesAdmissionEvents.Enabled, defaultAdmissionControllerKubernetesAdmissionEventsEnabled)
+
 	// CWS Instrumentation in AdmissionController Feature
 	if ddaSpec.Features.AdmissionController.CWSInstrumentation == nil {
 		ddaSpec.Features.AdmissionController.CWSInstrumentation = &CWSInstrumentationConfig{}
diff --git a/api/datadoghq/v2alpha1/datadogagent_types.go b/api/datadoghq/v2alpha1/datadogagent_types.go
index 1c118710..5a0a39a5 100644
--- a/api/datadoghq/v2alpha1/datadogagent_types.go
+++ b/api/datadoghq/v2alpha1/datadogagent_types.go
@@ -44,6 +44,8 @@ type DatadogAgentSpec struct {
 type DatadogFeatures struct {
 	// Application-level features
 
+	// OtelCollector configuration.
+	OtelCollector *OtelCollectorFeatureConfig `json:"otelCollector,omitempty"`
 	// LogCollection configuration.
 	LogCollection *LogCollectionFeatureConfig `json:"logCollection,omitempty"`
 	// LiveProcessCollection configuration.
@@ -682,6 +684,51 @@ type KubeStateMetricsCoreFeatureConfig struct {
 	Conf *CustomConfig `json:"conf,omitempty"`
 }
 
+// OtelCollectorFeatureConfig contains the configuration for the otel-agent.
+// +k8s:openapi-gen=true
+type OtelCollectorFeatureConfig struct {
+	// Enabled enables the OTel Agent.
+	// Default: true
+	// +optional
+	Enabled *bool `json:"enabled,omitempty"`
+
+	// Conf overrides the configuration for the default Kubernetes State Metrics Core check.
+	// This must point to a ConfigMap containing a valid cluster check configuration.
+	// When passing a configmap, file name *must* be otel-config.yaml.
+	// +optional
+	Conf *CustomConfig `json:"conf,omitempty"`
+
+	// Ports contains the ports for the otel-agent.
+	// Defaults: otel-grpc:4317 / otel-http:4318. Note: setting 4317
+	// or 4318 manually is *only* supported if name match default names (otel-grpc, otel-http).
+	// If not, this will lead to a port conflict.
+	// This limitation will be lifted once annotations support is removed.
+	// +optional
+	Ports []*corev1.ContainerPort `json:"ports,omitempty"`
+
+	// OTelCollector Config Relevant to the Core agent
+	// +optional
+	CoreConfig *CoreConfig `json:"coreConfig,omitempty"`
+}
+
+// CoreConfig exposes the otel collector configs relevant to the core agent.
+// +k8s:openapi-gen=true
+type CoreConfig struct {
+	// Enabled marks otelcollector as enabled in core agent.
+	// +optional
+	Enabled *bool `json:"enabled,omitempty"`
+
+	// +optional
+	// Extension URL provides the URL of the ddflareextension to
+	// the core agent.
+	ExtensionURL *string `json:"extension_url,omitempty"`
+
+	// +optional
+	// Extension URL provides the timout of the ddflareextension to
+	// the core agent.
+	ExtensionTimeout *int `json:"extension_timeout,omitempty"`
+}
+
 // AdmissionControllerFeatureConfig contains the Admission Controller feature configuration.
 // The Admission Controller runs in the Cluster Agent.
 type AdmissionControllerFeatureConfig struct {
@@ -729,6 +776,10 @@ type AdmissionControllerFeatureConfig struct {
 	// +optional
 	Registry *string `json:"registry,omitempty"`
 
+	// KubernetesAdmissionEvents holds the Kubernetes Admission Events configuration.
+	// +optional
+	KubernetesAdmissionEvents *KubernetesAdmissionEventsConfig `json:"kubernetesAdmissionEvents,omitempty"`
+
 	// CWSInstrumentation holds the CWS Instrumentation endpoint configuration
 	// +optional
 	CWSInstrumentation *CWSInstrumentationConfig `json:"cwsInstrumentation,omitempty"`
@@ -809,6 +860,13 @@ type Profile struct {
 	ResourceRequirements *corev1.ResourceRequirements `json:"resources,omitempty"`
 }
 
+type KubernetesAdmissionEventsConfig struct {
+	// Enable the Kubernetes Admission Events feature.
+	// Default: false
+	// +optional
+	Enabled *bool `json:"enabled,omitempty"`
+}
+
 // CWSInstrumentationConfig contains the configuration of the CWS Instrumentation admission controller endpoint.
 type CWSInstrumentationConfig struct {
 	// Enable the CWS Instrumentation admission controller endpoint.
@@ -1539,6 +1597,12 @@ type DatadogAgentComponentOverride struct {
 	// the pod priority is default, or zero if there is no default.
 	PriorityClassName *string `json:"priorityClassName,omitempty"`
 
+	// If specified, indicates the pod's RuntimeClass kubelet should use to run the pod.
+	// If the named RuntimeClass does not exist, or the CRI cannot run the corresponding handler, the pod enters the Failed terminal phase.
+	// If no runtimeClassName is specified, the default RuntimeHandler is used, which is equivalent to the behavior when the RuntimeClass feature is disabled.
+	// +optional
+	RuntimeClassName *string `json:"runtimeClassName,omitempty"`
+
 	// If specified, the pod's scheduling constraints.
 	// +optional
 	Affinity *corev1.Affinity `json:"affinity,omitempty"`
diff --git a/api/datadoghq/v2alpha1/envvar.go b/api/datadoghq/v2alpha1/envvar.go
new file mode 100644
index 00000000..dee11f31
--- /dev/null
+++ b/api/datadoghq/v2alpha1/envvar.go
@@ -0,0 +1,74 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package v2alpha1
+
+const (
+	DDAPIKey      = "DD_API_KEY"
+	DDAppKey      = "DD_APP_KEY"
+	DDddURL       = "DD_DD_URL"
+	DDURL         = "DD_URL"
+	DDSite        = "DD_SITE"
+	DDLogLevel    = "DD_LOG_LEVEL"
+	DDClusterName = "DD_CLUSTER_NAME"
+
+	DDAPMEnabled                           = "DD_APM_ENABLED"
+	DDAPMInstrumentationInstallTime        = "DD_INSTRUMENTATION_INSTALL_TIME"
+	DDAPMInstrumentationInstallId          = "DD_INSTRUMENTATION_INSTALL_ID"
+	DDAPMInstrumentationInstallType        = "DD_INSTRUMENTATION_INSTALL_TYPE"
+	DDAuthTokenFilePath                    = "DD_AUTH_TOKEN_FILE_PATH"
+	DDChecksTagCardinality                 = "DD_CHECKS_TAG_CARDINALITY"
+	DDClcRunnerEnabled                     = "DD_CLC_RUNNER_ENABLED"
+	DDClcRunnerHost                        = "DD_CLC_RUNNER_HOST"
+	DDClcRunnerID                          = "DD_CLC_RUNNER_ID"
+	DDClusterAgentEnabled                  = "DD_CLUSTER_AGENT_ENABLED"
+	DDClusterAgentKubeServiceName          = "DD_CLUSTER_AGENT_KUBERNETES_SERVICE_NAME"
+	DDClusterAgentTokenName                = "DD_CLUSTER_AGENT_TOKEN_NAME"
+	DDContainerCollectionEnabled           = "DD_PROCESS_CONFIG_CONTAINER_COLLECTION_ENABLED"
+	DDContainerImageEnabled                = "DD_CONTAINER_IMAGE_ENABLED"
+	DDCriSocketPath                        = "DD_CRI_SOCKET_PATH"
+	DDDogstatsdEnabled                     = "DD_USE_DOGSTATSD"
+	DDEnableMetadataCollection             = "DD_ENABLE_METADATA_COLLECTION"
+	DDFIPSEnabled                          = "DD_FIPS_ENABLED"
+	DDFIPSPortRangeStart                   = "DD_FIPS_PORT_RANGE_START"
+	DDFIPSUseHTTPS                         = "DD_FIPS_HTTPS"
+	DDFIPSLocalAddress                     = "DD_FIPS_LOCAL_ADDRESS"
+	DDHealthPort                           = "DD_HEALTH_PORT"
+	DDHostname                             = "DD_HOSTNAME"
+	DDHostRootEnvVar                       = "HOST_ROOT"
+	DDKubeletCAPath                        = "DD_KUBELET_CLIENT_CA"
+	DDKubeletHost                          = "DD_KUBERNETES_KUBELET_HOST"
+	DDKubeletTLSVerify                     = "DD_KUBELET_TLS_VERIFY"
+	DDKubeResourcesNamespace               = "DD_KUBE_RESOURCES_NAMESPACE"
+	DDKubernetesResourcesLabelsAsTags      = "DD_KUBERNETES_RESOURCES_LABELS_AS_TAGS"
+	DDKubernetesResourcesAnnotationsAsTags = "DD_KUBERNETES_RESOURCES_ANNOTATIONS_AS_TAGS"
+	DDLeaderElection                       = "DD_LEADER_ELECTION"
+	DDLogsEnabled                          = "DD_LOGS_ENABLED"
+	DDNamespaceLabelsAsTags                = "DD_KUBERNETES_NAMESPACE_LABELS_AS_TAGS"
+	DDNamespaceAnnotationsAsTags           = "DD_KUBERNETES_NAMESPACE_ANNOTATIONS_AS_TAGS"
+	DDNodeLabelsAsTags                     = "DD_KUBERNETES_NODE_LABELS_AS_TAGS"
+	DDOriginDetectionUnified               = "DD_ORIGIN_DETECTION_UNIFIED"
+	DDPodAnnotationsAsTags                 = "DD_KUBERNETES_POD_ANNOTATIONS_AS_TAGS"
+	DDPodLabelsAsTags                      = "DD_KUBERNETES_POD_LABELS_AS_TAGS"
+	DDPodName                              = "DD_POD_NAME"
+	DDProcessCollectionEnabled             = "DD_PROCESS_CONFIG_PROCESS_COLLECTION_ENABLED"
+	DDProcessConfigRunInCoreAgent          = "DD_PROCESS_CONFIG_RUN_IN_CORE_AGENT_ENABLED"
+	DDSecretBackendCommand                 = "DD_SECRET_BACKEND_COMMAND"
+	DDSecretBackendArguments               = "DD_SECRET_BACKEND_ARGUMENTS"
+	DDSecretBackendTimeout                 = "DD_SECRET_BACKEND_TIMEOUT"
+	DDSystemProbeEnabled                   = "DD_SYSTEM_PROBE_ENABLED"
+	DDSystemProbeExternal                  = "DD_SYSTEM_PROBE_EXTERNAL"
+	DDSystemProbeSocket                    = "DD_SYSPROBE_SOCKET"
+	DDTags                                 = "DD_TAGS"
+	// otelcollector core agent configs
+	DDOtelCollectorCoreConfigEnabled          = "DD_OTELCOLLECTOR_ENABLED"
+	DDOtelCollectorCoreConfigExtensionURL     = "DD_OTELCOLLECTOR_EXTENSION_URL"
+	DDOtelCollectorCoreConfigExtensionTimeout = "DD_OTELCOLLECTOR_EXTENSION_TIMEOUT"
+
+	DockerHost = "DOCKER_HOST"
+	// KubernetesEnvvarName Env var used by the Datadog Agent container entrypoint
+	// to add kubelet config provider and listener
+	KubernetesEnvVar = "KUBERNETES"
+)
diff --git a/api/datadoghq/v2alpha1/zz_generated.deepcopy.go b/api/datadoghq/v2alpha1/zz_generated.deepcopy.go
index 2e038d62..a36ac977 100644
--- a/api/datadoghq/v2alpha1/zz_generated.deepcopy.go
+++ b/api/datadoghq/v2alpha1/zz_generated.deepcopy.go
@@ -194,6 +194,11 @@ func (in *AdmissionControllerFeatureConfig) DeepCopyInto(out *AdmissionControlle
 		*out = new(string)
 		**out = **in
 	}
+	if in.KubernetesAdmissionEvents != nil {
+		in, out := &in.KubernetesAdmissionEvents, &out.KubernetesAdmissionEvents
+		*out = new(KubernetesAdmissionEventsConfig)
+		(*in).DeepCopyInto(*out)
+	}
 	if in.CWSInstrumentation != nil {
 		in, out := &in.CWSInstrumentation, &out.CWSInstrumentation
 		*out = new(CWSInstrumentationConfig)
@@ -594,6 +599,36 @@ func (in *ConfigMapConfig) DeepCopy() *ConfigMapConfig {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CoreConfig) DeepCopyInto(out *CoreConfig) {
+	*out = *in
+	if in.Enabled != nil {
+		in, out := &in.Enabled, &out.Enabled
+		*out = new(bool)
+		**out = **in
+	}
+	if in.ExtensionURL != nil {
+		in, out := &in.ExtensionURL, &out.ExtensionURL
+		*out = new(string)
+		**out = **in
+	}
+	if in.ExtensionTimeout != nil {
+		in, out := &in.ExtensionTimeout, &out.ExtensionTimeout
+		*out = new(int)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CoreConfig.
+func (in *CoreConfig) DeepCopy() *CoreConfig {
+	if in == nil {
+		return nil
+	}
+	out := new(CoreConfig)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *CustomConfig) DeepCopyInto(out *CustomConfig) {
 	*out = *in
@@ -769,6 +804,11 @@ func (in *DatadogAgentComponentOverride) DeepCopyInto(out *DatadogAgentComponent
 		*out = new(string)
 		**out = **in
 	}
+	if in.RuntimeClassName != nil {
+		in, out := &in.RuntimeClassName, &out.RuntimeClassName
+		*out = new(string)
+		**out = **in
+	}
 	if in.Affinity != nil {
 		in, out := &in.Affinity, &out.Affinity
 		*out = new(corev1.Affinity)
@@ -1097,6 +1137,11 @@ func (in *DatadogCredentials) DeepCopy() *DatadogCredentials {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *DatadogFeatures) DeepCopyInto(out *DatadogFeatures) {
 	*out = *in
+	if in.OtelCollector != nil {
+		in, out := &in.OtelCollector, &out.OtelCollector
+		*out = new(OtelCollectorFeatureConfig)
+		(*in).DeepCopyInto(*out)
+	}
 	if in.LogCollection != nil {
 		in, out := &in.LogCollection, &out.LogCollection
 		*out = new(LogCollectionFeatureConfig)
@@ -1805,6 +1850,26 @@ func (in *KubeletConfig) DeepCopy() *KubeletConfig {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *KubernetesAdmissionEventsConfig) DeepCopyInto(out *KubernetesAdmissionEventsConfig) {
+	*out = *in
+	if in.Enabled != nil {
+		in, out := &in.Enabled, &out.Enabled
+		*out = new(bool)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubernetesAdmissionEventsConfig.
+func (in *KubernetesAdmissionEventsConfig) DeepCopy() *KubernetesAdmissionEventsConfig {
+	if in == nil {
+		return nil
+	}
+	out := new(KubernetesAdmissionEventsConfig)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *LanguageDetectionConfig) DeepCopyInto(out *LanguageDetectionConfig) {
 	*out = *in
@@ -2241,6 +2306,47 @@ func (in *OriginDetectionUnified) DeepCopy() *OriginDetectionUnified {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *OtelCollectorFeatureConfig) DeepCopyInto(out *OtelCollectorFeatureConfig) {
+	*out = *in
+	if in.Enabled != nil {
+		in, out := &in.Enabled, &out.Enabled
+		*out = new(bool)
+		**out = **in
+	}
+	if in.Conf != nil {
+		in, out := &in.Conf, &out.Conf
+		*out = new(CustomConfig)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Ports != nil {
+		in, out := &in.Ports, &out.Ports
+		*out = make([]*corev1.ContainerPort, len(*in))
+		for i := range *in {
+			if (*in)[i] != nil {
+				in, out := &(*in)[i], &(*out)[i]
+				*out = new(corev1.ContainerPort)
+				**out = **in
+			}
+		}
+	}
+	if in.CoreConfig != nil {
+		in, out := &in.CoreConfig, &out.CoreConfig
+		*out = new(CoreConfig)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OtelCollectorFeatureConfig.
+func (in *OtelCollectorFeatureConfig) DeepCopy() *OtelCollectorFeatureConfig {
+	if in == nil {
+		return nil
+	}
+	out := new(OtelCollectorFeatureConfig)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ProcessDiscoveryFeatureConfig) DeepCopyInto(out *ProcessDiscoveryFeatureConfig) {
 	*out = *in
diff --git a/api/datadoghq/v2alpha1/zz_generated.openapi.go b/api/datadoghq/v2alpha1/zz_generated.openapi.go
index 813a4d3b..0568f4e9 100644
--- a/api/datadoghq/v2alpha1/zz_generated.openapi.go
+++ b/api/datadoghq/v2alpha1/zz_generated.openapi.go
@@ -18,6 +18,7 @@ import (
 func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition {
 	return map[string]common.OpenAPIDefinition{
 		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CSPMHostBenchmarksConfig":          schema_datadog_operator_api_datadoghq_v2alpha1_CSPMHostBenchmarksConfig(ref),
+		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CoreConfig":                        schema_datadog_operator_api_datadoghq_v2alpha1_CoreConfig(ref),
 		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CustomConfig":                      schema_datadog_operator_api_datadoghq_v2alpha1_CustomConfig(ref),
 		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.DaemonSetStatus":                   schema_datadog_operator_api_datadoghq_v2alpha1_DaemonSetStatus(ref),
 		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.DatadogAgent":                      schema_datadog_operator_api_datadoghq_v2alpha1_DatadogAgent(ref),
@@ -40,6 +41,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OTLPProtocolsConfig":               schema_datadog_operator_api_datadoghq_v2alpha1_OTLPProtocolsConfig(ref),
 		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OTLPReceiverConfig":                schema_datadog_operator_api_datadoghq_v2alpha1_OTLPReceiverConfig(ref),
 		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OrchestratorExplorerFeatureConfig": schema_datadog_operator_api_datadoghq_v2alpha1_OrchestratorExplorerFeatureConfig(ref),
+		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OtelCollectorFeatureConfig":        schema_datadog_operator_api_datadoghq_v2alpha1_OtelCollectorFeatureConfig(ref),
 		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.PrometheusScrapeFeatureConfig":     schema_datadog_operator_api_datadoghq_v2alpha1_PrometheusScrapeFeatureConfig(ref),
 		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.RemoteConfigConfiguration":         schema_datadog_operator_api_datadoghq_v2alpha1_RemoteConfigConfiguration(ref),
 		"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.SeccompConfig":                     schema_datadog_operator_api_datadoghq_v2alpha1_SeccompConfig(ref),
@@ -69,6 +71,40 @@ func schema_datadog_operator_api_datadoghq_v2alpha1_CSPMHostBenchmarksConfig(ref
 	}
 }
 
+func schema_datadog_operator_api_datadoghq_v2alpha1_CoreConfig(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "CoreConfig exposes the otel collector configs relevant to the core agent.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"enabled": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Enabled marks otelcollector as enabled in core agent.",
+							Type:        []string{"boolean"},
+							Format:      "",
+						},
+					},
+					"extension_url": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Extension URL provides the URL of the ddflareextension to the core agent.",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"extension_timeout": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Extension URL provides the timout of the ddflareextension to the core agent.",
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+				},
+			},
+		},
+	}
+}
+
 func schema_datadog_operator_api_datadoghq_v2alpha1_CustomConfig(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -525,6 +561,12 @@ func schema_datadog_operator_api_datadoghq_v2alpha1_DatadogFeatures(ref common.R
 				Description: "DatadogFeatures are features running on the Agent and Cluster Agent.",
 				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
+					"otelCollector": {
+						SchemaProps: spec.SchemaProps{
+							Description: "OtelCollector configuration.",
+							Ref:         ref("github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OtelCollectorFeatureConfig"),
+						},
+					},
 					"logCollection": {
 						SchemaProps: spec.SchemaProps{
 							Description: "LogCollection configuration.",
@@ -691,7 +733,7 @@ func schema_datadog_operator_api_datadoghq_v2alpha1_DatadogFeatures(ref common.R
 			},
 		},
 		Dependencies: []string{
-			"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.APMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ASMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.AdmissionControllerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.AutoscalingFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CSPMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CWSFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ClusterChecksFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.DogstatsdFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.EBPFCheckFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.EventCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ExternalMetricsServerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.HelmCheckFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.KubeStateMetricsCoreFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LiveContainerCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LiveProcessCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LogCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.NPMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OOMKillFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OTLPFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OrchestratorExplorerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ProcessDiscoveryFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.PrometheusScrapeFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.RemoteConfigurationFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.SBOMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ServiceDiscoveryFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.TCPQueueLengthFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.USMFeatureConfig"},
+			"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.APMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ASMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.AdmissionControllerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.AutoscalingFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CSPMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CWSFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ClusterChecksFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.DogstatsdFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.EBPFCheckFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.EventCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ExternalMetricsServerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.HelmCheckFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.KubeStateMetricsCoreFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LiveContainerCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LiveProcessCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LogCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.NPMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OOMKillFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OTLPFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OrchestratorExplorerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OtelCollectorFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ProcessDiscoveryFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.PrometheusScrapeFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.RemoteConfigurationFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.SBOMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ServiceDiscoveryFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.TCPQueueLengthFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.USMFeatureConfig"},
 	}
 }
 
@@ -1355,6 +1397,53 @@ func schema_datadog_operator_api_datadoghq_v2alpha1_OrchestratorExplorerFeatureC
 	}
 }
 
+func schema_datadog_operator_api_datadoghq_v2alpha1_OtelCollectorFeatureConfig(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "OtelCollectorFeatureConfig contains the configuration for the otel-agent.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"enabled": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Enabled enables the OTel Agent. Default: true",
+							Type:        []string{"boolean"},
+							Format:      "",
+						},
+					},
+					"conf": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Conf overrides the configuration for the default Kubernetes State Metrics Core check. This must point to a ConfigMap containing a valid cluster check configuration. When passing a configmap, file name *must* be otel-config.yaml.",
+							Ref:         ref("github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CustomConfig"),
+						},
+					},
+					"ports": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Ports contains the ports for the otel-agent. Defaults: otel-grpc:4317 / otel-http:4318. Note: setting 4317 or 4318 manually is *only* supported if name match default names (otel-grpc, otel-http). If not, this will lead to a port conflict. This limitation will be lifted once annotations support is removed.",
+							Type:        []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Ref: ref("k8s.io/api/core/v1.ContainerPort"),
+									},
+								},
+							},
+						},
+					},
+					"coreConfig": {
+						SchemaProps: spec.SchemaProps{
+							Description: "OTelCollector Config Relevant to the Core agent",
+							Ref:         ref("github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CoreConfig"),
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CoreConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CustomConfig", "k8s.io/api/core/v1.ContainerPort"},
+	}
+}
+
 func schema_datadog_operator_api_datadoghq_v2alpha1_PrometheusScrapeFeatureConfig(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
diff --git a/check-operator.Dockerfile b/check-operator.Dockerfile
index ab377851..d2c80f46 100644
--- a/check-operator.Dockerfile
+++ b/check-operator.Dockerfile
@@ -20,7 +20,7 @@ ARG LDFLAGS
 ARG GOARCH
 RUN CGO_ENABLED=0 GOOS=linux GOARCH=${GOARCH} GO111MODULE=on go build -a -ldflags "${LDFLAGS}" -o check-operator cmd/check-operator/main.go
 
-FROM registry.access.redhat.com/ubi8/ubi-minimal:latest
+FROM registry.access.redhat.com/ubi9/ubi-minimal:latest
 WORKDIR /
 COPY --from=builder /workspace/check-operator .
 USER 1001
diff --git a/cmd/main.go b/cmd/main.go
index 5fe587c1..089aa3e7 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -24,6 +24,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	ctrlzap "sigs.k8s.io/controller-runtime/pkg/log/zap"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
+	"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
 
 	"go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
@@ -93,6 +94,7 @@ const (
 type options struct {
 	// Observability options
 	metricsAddr      string
+	secureMetrics    bool
 	profilingEnabled bool
 	logLevel         *zapcore.Level
 	logEncoder       string
@@ -123,7 +125,6 @@ type options struct {
 	introspectionEnabled                   bool
 	datadogAgentProfileEnabled             bool
 	remoteConfigEnabled                    bool
-	otelAgentEnabled                       bool
 	datadogDashboardEnabled                bool
 
 	// Secret Backend options
@@ -134,6 +135,7 @@ type options struct {
 func (opts *options) Parse() {
 	// Observability flags
 	flag.StringVar(&opts.metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.")
+	flag.BoolVar(&opts.secureMetrics, "metrics-secure", false, "If true, the metrics endpoint is served securely via HTTPS. Use false to use HTTP instead.")
 	flag.BoolVar(&opts.profilingEnabled, "profiling-enabled", false, "Enable Datadog profile in the Datadog Operator process.")
 	opts.logLevel = zap.LevelFlag("loglevel", zapcore.InfoLevel, "Set log level")
 	flag.StringVar(&opts.logEncoder, "logEncoder", "json", "log encoding ('json' or 'console')")
@@ -157,7 +159,6 @@ func (opts *options) Parse() {
 	flag.BoolVar(&opts.introspectionEnabled, "introspectionEnabled", false, "Enable introspection (beta)")
 	flag.BoolVar(&opts.datadogAgentProfileEnabled, "datadogAgentProfileEnabled", false, "Enable DatadogAgentProfile controller (beta)")
 	flag.BoolVar(&opts.remoteConfigEnabled, "remoteConfigEnabled", false, "Enable RemoteConfig capabilities in the Operator (beta)")
-	flag.BoolVar(&opts.otelAgentEnabled, "otelAgentEnabled", false, "Enable the OTel agent container (beta)")
 	flag.BoolVar(&opts.datadogDashboardEnabled, "datadogDashboardEnabled", false, "Enable the DatadogDashboard controller")
 
 	// ExtendedDaemonset configuration
@@ -230,14 +231,23 @@ func run(opts *options) error {
 	renewDeadline := opts.leaderElectionLeaseDuration / 2
 	retryPeriod := opts.leaderElectionLeaseDuration / 4
 
+	metricsServerOptions := metricsserver.Options{
+		BindAddress:   opts.metricsAddr,
+		SecureServing: opts.secureMetrics,
+		ExtraHandlers: debug.GetExtraMetricHandlers(),
+	}
+
+	if opts.secureMetrics {
+		// FilterProvider is used to protect the metrics endpoint with authn/authz.
+		metricsServerOptions.FilterProvider = filters.WithAuthenticationAndAuthorization
+	}
+
 	restConfig := ctrl.GetConfigOrDie()
 	restConfig.UserAgent = "datadog-operator"
 	mgr, err := ctrl.NewManager(restConfig, ctrl.Options{
-		Scheme: scheme,
-		Metrics: metricsserver.Options{
-			BindAddress:   opts.metricsAddr,
-			ExtraHandlers: debug.GetExtraMetricHandlers(),
-		}, HealthProbeBindAddress: ":8081",
+		Scheme:                     scheme,
+		Metrics:                    metricsServerOptions,
+		HealthProbeBindAddress:     ":8081",
 		LeaderElection:             opts.enableLeaderElection,
 		LeaderElectionID:           "datadog-operator-lock",
 		LeaderElectionResourceLock: resourcelock.LeasesResourceLock,
@@ -301,7 +311,6 @@ func run(opts *options) error {
 		V2APIEnabled:               true,
 		IntrospectionEnabled:       opts.introspectionEnabled,
 		DatadogAgentProfileEnabled: opts.datadogAgentProfileEnabled,
-		OtelAgentEnabled:           opts.otelAgentEnabled,
 		DatadogDashboardEnabled:    opts.datadogDashboardEnabled,
 	}
 
diff --git a/config/crd/bases/v1/datadoghq.com_datadogagentprofiles.yaml b/config/crd/bases/v1/datadoghq.com_datadogagentprofiles.yaml
index 5c4ed60b..d0e4501c 100644
--- a/config/crd/bases/v1/datadoghq.com_datadogagentprofiles.yaml
+++ b/config/crd/bases/v1/datadoghq.com_datadogagentprofiles.yaml
@@ -254,6 +254,12 @@ spec:
                               If not specified, the pod priority will be default or zero if there is no
                               default.
                             type: string
+                          runtimeClassName:
+                            description: |-
+                              If specified, indicates the pod's RuntimeClass kubelet should use to run the pod.
+                              If the named RuntimeClass does not exist, or the CRI cannot run the corresponding handler, the pod enters the Failed terminal phase.
+                              If no runtimeClassName is specified, the default RuntimeHandler is used, which is equivalent to the behavior when the RuntimeClass feature is disabled.
+                            type: string
                           updateStrategy:
                             description: |-
                               The deployment strategy to use to replace existing pods with new ones.
diff --git a/config/crd/bases/v1/datadoghq.com_datadogagentprofiles_v1alpha1.json b/config/crd/bases/v1/datadoghq.com_datadogagentprofiles_v1alpha1.json
index 14c8026c..dbbf7f0b 100644
--- a/config/crd/bases/v1/datadoghq.com_datadogagentprofiles_v1alpha1.json
+++ b/config/crd/bases/v1/datadoghq.com_datadogagentprofiles_v1alpha1.json
@@ -242,6 +242,10 @@
                     "description": "If specified, indicates the pod's priority. \"system-node-critical\" and\n\"system-cluster-critical\" are two special keywords which indicate the\nhighest priorities with the former being the highest priority. Any other\nname must be defined by creating a PriorityClass object with that name.\nIf not specified, the pod priority will be default or zero if there is no\ndefault.",
                     "type": "string"
                   },
+                  "runtimeClassName": {
+                    "description": "If specified, indicates the pod's RuntimeClass kubelet should use to run the pod.\nIf the named RuntimeClass does not exist, or the CRI cannot run the corresponding handler, the pod enters the Failed terminal phase.\nIf no runtimeClassName is specified, the default RuntimeHandler is used, which is equivalent to the behavior when the RuntimeClass feature is disabled.",
+                    "type": "string"
+                  },
                   "updateStrategy": {
                     "additionalProperties": false,
                     "description": "The deployment strategy to use to replace existing pods with new ones.\nValid types are `RollingUpdate` or `OnDelete` for DaemonSets",
diff --git a/config/crd/bases/v1/datadoghq.com_datadogagents.yaml b/config/crd/bases/v1/datadoghq.com_datadogagents.yaml
index 01c9cc54..ee4066cf 100644
--- a/config/crd/bases/v1/datadoghq.com_datadogagents.yaml
+++ b/config/crd/bases/v1/datadoghq.com_datadogagents.yaml
@@ -435,6 +435,15 @@ spec:
                         failurePolicy:
                           description: FailurePolicy determines how unrecognized and timeout errors are handled.
                           type: string
+                        kubernetesAdmissionEvents:
+                          description: KubernetesAdmissionEvents holds the Kubernetes Admission Events configuration.
+                          properties:
+                            enabled:
+                              description: |-
+                                Enable the Kubernetes Admission Events feature.
+                                Default: false
+                              type: boolean
+                          type: object
                         mutateUnlabelled:
                           description: |-
                             MutateUnlabelled enables config injection without the need of pod label 'admission.datadoghq.com/enabled="true"'.
@@ -1284,6 +1293,125 @@ spec:
                             Default: true
                           type: boolean
                       type: object
+                    otelCollector:
+                      description: OtelCollector configuration.
+                      properties:
+                        conf:
+                          description: |-
+                            Conf overrides the configuration for the default Kubernetes State Metrics Core check.
+                            This must point to a ConfigMap containing a valid cluster check configuration.
+                            When passing a configmap, file name *must* be otel-config.yaml.
+                          properties:
+                            configData:
+                              description: ConfigData corresponds to the configuration file content.
+                              type: string
+                            configMap:
+                              description: ConfigMap references an existing ConfigMap with the configuration file content.
+                              properties:
+                                items:
+                                  description: Items maps a ConfigMap data `key` to a file `path` mount.
+                                  items:
+                                    description: Maps a string key to a path within a volume.
+                                    properties:
+                                      key:
+                                        description: key is the key to project.
+                                        type: string
+                                      mode:
+                                        description: |-
+                                          mode is Optional: mode bits used to set permissions on this file.
+                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.
+                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.
+                                          If not specified, the volume defaultMode will be used.
+                                          This might be in conflict with other options that affect the file
+                                          mode, like fsGroup, and the result can be other mode bits set.
+                                        format: int32
+                                        type: integer
+                                      path:
+                                        description: |-
+                                          path is the relative path of the file to map the key to.
+                                          May not be an absolute path.
+                                          May not contain the path element '..'.
+                                          May not start with the string '..'.
+                                        type: string
+                                    required:
+                                      - key
+                                      - path
+                                    type: object
+                                  type: array
+                                  x-kubernetes-list-map-keys:
+                                    - key
+                                  x-kubernetes-list-type: map
+                                name:
+                                  description: Name is the name of the ConfigMap.
+                                  type: string
+                              type: object
+                          type: object
+                        coreConfig:
+                          description: OTelCollector Config Relevant to the Core agent
+                          properties:
+                            enabled:
+                              description: Enabled marks otelcollector as enabled in core agent.
+                              type: boolean
+                            extension_timeout:
+                              description: |-
+                                Extension URL provides the timout of the ddflareextension to
+                                the core agent.
+                              type: integer
+                            extension_url:
+                              description: |-
+                                Extension URL provides the URL of the ddflareextension to
+                                the core agent.
+                              type: string
+                          type: object
+                        enabled:
+                          description: |-
+                            Enabled enables the OTel Agent.
+                            Default: true
+                          type: boolean
+                        ports:
+                          description: |-
+                            Ports contains the ports for the otel-agent.
+                            Defaults: otel-grpc:4317 / otel-http:4318. Note: setting 4317
+                            or 4318 manually is *only* supported if name match default names (otel-grpc, otel-http).
+                            If not, this will lead to a port conflict.
+                            This limitation will be lifted once annotations support is removed.
+                          items:
+                            description: ContainerPort represents a network port in a single container.
+                            properties:
+                              containerPort:
+                                description: |-
+                                  Number of port to expose on the pod's IP address.
+                                  This must be a valid port number, 0 < x < 65536.
+                                format: int32
+                                type: integer
+                              hostIP:
+                                description: What host IP to bind the external port to.
+                                type: string
+                              hostPort:
+                                description: |-
+                                  Number of port to expose on the host.
+                                  If specified, this must be a valid port number, 0 < x < 65536.
+                                  If HostNetwork is specified, this must match ContainerPort.
+                                  Most containers do not need this.
+                                format: int32
+                                type: integer
+                              name:
+                                description: |-
+                                  If specified, this must be an IANA_SVC_NAME and unique within the pod. Each
+                                  named port in a pod must have a unique name. Name for the port that can be
+                                  referred to by services.
+                                type: string
+                              protocol:
+                                default: TCP
+                                description: |-
+                                  Protocol for port. Must be UDP, TCP, or SCTP.
+                                  Defaults to "TCP".
+                                type: string
+                            required:
+                              - containerPort
+                            type: object
+                          type: array
+                      type: object
                     otlp:
                       description: OTLP ingest configuration
                       properties:
@@ -4572,6 +4700,12 @@ spec:
                           Not applicable for a DaemonSet/ExtendedDaemonSet deployment
                         format: int32
                         type: integer
+                      runtimeClassName:
+                        description: |-
+                          If specified, indicates the pod's RuntimeClass kubelet should use to run the pod.
+                          If the named RuntimeClass does not exist, or the CRI cannot run the corresponding handler, the pod enters the Failed terminal phase.
+                          If no runtimeClassName is specified, the default RuntimeHandler is used, which is equivalent to the behavior when the RuntimeClass feature is disabled.
+                        type: string
                       securityContext:
                         description: Pod-level SecurityContext.
                         properties:
@@ -7164,6 +7298,15 @@ spec:
                             failurePolicy:
                               description: FailurePolicy determines how unrecognized and timeout errors are handled.
                               type: string
+                            kubernetesAdmissionEvents:
+                              description: KubernetesAdmissionEvents holds the Kubernetes Admission Events configuration.
+                              properties:
+                                enabled:
+                                  description: |-
+                                    Enable the Kubernetes Admission Events feature.
+                                    Default: false
+                                  type: boolean
+                              type: object
                             mutateUnlabelled:
                               description: |-
                                 MutateUnlabelled enables config injection without the need of pod label 'admission.datadoghq.com/enabled="true"'.
@@ -8013,6 +8156,125 @@ spec:
                                 Default: true
                               type: boolean
                           type: object
+                        otelCollector:
+                          description: OtelCollector configuration.
+                          properties:
+                            conf:
+                              description: |-
+                                Conf overrides the configuration for the default Kubernetes State Metrics Core check.
+                                This must point to a ConfigMap containing a valid cluster check configuration.
+                                When passing a configmap, file name *must* be otel-config.yaml.
+                              properties:
+                                configData:
+                                  description: ConfigData corresponds to the configuration file content.
+                                  type: string
+                                configMap:
+                                  description: ConfigMap references an existing ConfigMap with the configuration file content.
+                                  properties:
+                                    items:
+                                      description: Items maps a ConfigMap data `key` to a file `path` mount.
+                                      items:
+                                        description: Maps a string key to a path within a volume.
+                                        properties:
+                                          key:
+                                            description: key is the key to project.
+                                            type: string
+                                          mode:
+                                            description: |-
+                                              mode is Optional: mode bits used to set permissions on this file.
+                                              Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.
+                                              YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.
+                                              If not specified, the volume defaultMode will be used.
+                                              This might be in conflict with other options that affect the file
+                                              mode, like fsGroup, and the result can be other mode bits set.
+                                            format: int32
+                                            type: integer
+                                          path:
+                                            description: |-
+                                              path is the relative path of the file to map the key to.
+                                              May not be an absolute path.
+                                              May not contain the path element '..'.
+                                              May not start with the string '..'.
+                                            type: string
+                                        required:
+                                          - key
+                                          - path
+                                        type: object
+                                      type: array
+                                      x-kubernetes-list-map-keys:
+                                        - key
+                                      x-kubernetes-list-type: map
+                                    name:
+                                      description: Name is the name of the ConfigMap.
+                                      type: string
+                                  type: object
+                              type: object
+                            coreConfig:
+                              description: OTelCollector Config Relevant to the Core agent
+                              properties:
+                                enabled:
+                                  description: Enabled marks otelcollector as enabled in core agent.
+                                  type: boolean
+                                extension_timeout:
+                                  description: |-
+                                    Extension URL provides the timout of the ddflareextension to
+                                    the core agent.
+                                  type: integer
+                                extension_url:
+                                  description: |-
+                                    Extension URL provides the URL of the ddflareextension to
+                                    the core agent.
+                                  type: string
+                              type: object
+                            enabled:
+                              description: |-
+                                Enabled enables the OTel Agent.
+                                Default: true
+                              type: boolean
+                            ports:
+                              description: |-
+                                Ports contains the ports for the otel-agent.
+                                Defaults: otel-grpc:4317 / otel-http:4318. Note: setting 4317
+                                or 4318 manually is *only* supported if name match default names (otel-grpc, otel-http).
+                                If not, this will lead to a port conflict.
+                                This limitation will be lifted once annotations support is removed.
+                              items:
+                                description: ContainerPort represents a network port in a single container.
+                                properties:
+                                  containerPort:
+                                    description: |-
+                                      Number of port to expose on the pod's IP address.
+                                      This must be a valid port number, 0 < x < 65536.
+                                    format: int32
+                                    type: integer
+                                  hostIP:
+                                    description: What host IP to bind the external port to.
+                                    type: string
+                                  hostPort:
+                                    description: |-
+                                      Number of port to expose on the host.
+                                      If specified, this must be a valid port number, 0 < x < 65536.
+                                      If HostNetwork is specified, this must match ContainerPort.
+                                      Most containers do not need this.
+                                    format: int32
+                                    type: integer
+                                  name:
+                                    description: |-
+                                      If specified, this must be an IANA_SVC_NAME and unique within the pod. Each
+                                      named port in a pod must have a unique name. Name for the port that can be
+                                      referred to by services.
+                                    type: string
+                                  protocol:
+                                    default: TCP
+                                    description: |-
+                                      Protocol for port. Must be UDP, TCP, or SCTP.
+                                      Defaults to "TCP".
+                                    type: string
+                                required:
+                                  - containerPort
+                                type: object
+                              type: array
+                          type: object
                         otlp:
                           description: OTLP ingest configuration
                           properties:
diff --git a/config/crd/bases/v1/datadoghq.com_datadogagents_v2alpha1.json b/config/crd/bases/v1/datadoghq.com_datadogagents_v2alpha1.json
index a89741b9..944437b6 100644
--- a/config/crd/bases/v1/datadoghq.com_datadogagents_v2alpha1.json
+++ b/config/crd/bases/v1/datadoghq.com_datadogagents_v2alpha1.json
@@ -430,6 +430,17 @@
                   "description": "FailurePolicy determines how unrecognized and timeout errors are handled.",
                   "type": "string"
                 },
+                "kubernetesAdmissionEvents": {
+                  "additionalProperties": false,
+                  "description": "KubernetesAdmissionEvents holds the Kubernetes Admission Events configuration.",
+                  "properties": {
+                    "enabled": {
+                      "description": "Enable the Kubernetes Admission Events feature.\nDefault: false",
+                      "type": "boolean"
+                    }
+                  },
+                  "type": "object"
+                },
                 "mutateUnlabelled": {
                   "description": "MutateUnlabelled enables config injection without the need of pod label 'admission.datadoghq.com/enabled=\"true\"'.\nDefault: false",
                   "type": "boolean"
@@ -1330,6 +1341,127 @@
               },
               "type": "object"
             },
+            "otelCollector": {
+              "additionalProperties": false,
+              "description": "OtelCollector configuration.",
+              "properties": {
+                "conf": {
+                  "additionalProperties": false,
+                  "description": "Conf overrides the configuration for the default Kubernetes State Metrics Core check.\nThis must point to a ConfigMap containing a valid cluster check configuration.\nWhen passing a configmap, file name *must* be otel-config.yaml.",
+                  "properties": {
+                    "configData": {
+                      "description": "ConfigData corresponds to the configuration file content.",
+                      "type": "string"
+                    },
+                    "configMap": {
+                      "additionalProperties": false,
+                      "description": "ConfigMap references an existing ConfigMap with the configuration file content.",
+                      "properties": {
+                        "items": {
+                          "description": "Items maps a ConfigMap data `key` to a file `path` mount.",
+                          "items": {
+                            "additionalProperties": false,
+                            "description": "Maps a string key to a path within a volume.",
+                            "properties": {
+                              "key": {
+                                "description": "key is the key to project.",
+                                "type": "string"
+                              },
+                              "mode": {
+                                "description": "mode is Optional: mode bits used to set permissions on this file.\nMust be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\nYAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\nIf not specified, the volume defaultMode will be used.\nThis might be in conflict with other options that affect the file\nmode, like fsGroup, and the result can be other mode bits set.",
+                                "format": "int32",
+                                "type": "integer"
+                              },
+                              "path": {
+                                "description": "path is the relative path of the file to map the key to.\nMay not be an absolute path.\nMay not contain the path element '..'.\nMay not start with the string '..'.",
+                                "type": "string"
+                              }
+                            },
+                            "required": [
+                              "key",
+                              "path"
+                            ],
+                            "type": "object"
+                          },
+                          "type": "array",
+                          "x-kubernetes-list-map-keys": [
+                            "key"
+                          ],
+                          "x-kubernetes-list-type": "map"
+                        },
+                        "name": {
+                          "description": "Name is the name of the ConfigMap.",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    }
+                  },
+                  "type": "object"
+                },
+                "coreConfig": {
+                  "additionalProperties": false,
+                  "description": "OTelCollector Config Relevant to the Core agent",
+                  "properties": {
+                    "enabled": {
+                      "description": "Enabled marks otelcollector as enabled in core agent.",
+                      "type": "boolean"
+                    },
+                    "extension_timeout": {
+                      "description": "Extension URL provides the timout of the ddflareextension to\nthe core agent.",
+                      "type": "integer"
+                    },
+                    "extension_url": {
+                      "description": "Extension URL provides the URL of the ddflareextension to\nthe core agent.",
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                },
+                "enabled": {
+                  "description": "Enabled enables the OTel Agent.\nDefault: true",
+                  "type": "boolean"
+                },
+                "ports": {
+                  "description": "Ports contains the ports for the otel-agent.\nDefaults: otel-grpc:4317 / otel-http:4318. Note: setting 4317\nor 4318 manually is *only* supported if name match default names (otel-grpc, otel-http).\nIf not, this will lead to a port conflict.\nThis limitation will be lifted once annotations support is removed.",
+                  "items": {
+                    "additionalProperties": false,
+                    "description": "ContainerPort represents a network port in a single container.",
+                    "properties": {
+                      "containerPort": {
+                        "description": "Number of port to expose on the pod's IP address.\nThis must be a valid port number, 0 \u003c x \u003c 65536.",
+                        "format": "int32",
+                        "type": "integer"
+                      },
+                      "hostIP": {
+                        "description": "What host IP to bind the external port to.",
+                        "type": "string"
+                      },
+                      "hostPort": {
+                        "description": "Number of port to expose on the host.\nIf specified, this must be a valid port number, 0 \u003c x \u003c 65536.\nIf HostNetwork is specified, this must match ContainerPort.\nMost containers do not need this.",
+                        "format": "int32",
+                        "type": "integer"
+                      },
+                      "name": {
+                        "description": "If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\nnamed port in a pod must have a unique name. Name for the port that can be\nreferred to by services.",
+                        "type": "string"
+                      },
+                      "protocol": {
+                        "default": "TCP",
+                        "description": "Protocol for port. Must be UDP, TCP, or SCTP.\nDefaults to \"TCP\".",
+                        "type": "string"
+                      }
+                    },
+                    "required": [
+                      "containerPort"
+                    ],
+                    "type": "object"
+                  },
+                  "type": "array"
+                }
+              },
+              "type": "object"
+            },
             "otlp": {
               "additionalProperties": false,
               "description": "OTLP ingest configuration",
@@ -4639,6 +4771,10 @@
                 "format": "int32",
                 "type": "integer"
               },
+              "runtimeClassName": {
+                "description": "If specified, indicates the pod's RuntimeClass kubelet should use to run the pod.\nIf the named RuntimeClass does not exist, or the CRI cannot run the corresponding handler, the pod enters the Failed terminal phase.\nIf no runtimeClassName is specified, the default RuntimeHandler is used, which is equivalent to the behavior when the RuntimeClass feature is disabled.",
+                "type": "string"
+              },
               "securityContext": {
                 "additionalProperties": false,
                 "description": "Pod-level SecurityContext.",
@@ -7099,6 +7235,17 @@
                       "description": "FailurePolicy determines how unrecognized and timeout errors are handled.",
                       "type": "string"
                     },
+                    "kubernetesAdmissionEvents": {
+                      "additionalProperties": false,
+                      "description": "KubernetesAdmissionEvents holds the Kubernetes Admission Events configuration.",
+                      "properties": {
+                        "enabled": {
+                          "description": "Enable the Kubernetes Admission Events feature.\nDefault: false",
+                          "type": "boolean"
+                        }
+                      },
+                      "type": "object"
+                    },
                     "mutateUnlabelled": {
                       "description": "MutateUnlabelled enables config injection without the need of pod label 'admission.datadoghq.com/enabled=\"true\"'.\nDefault: false",
                       "type": "boolean"
@@ -7999,6 +8146,127 @@
                   },
                   "type": "object"
                 },
+                "otelCollector": {
+                  "additionalProperties": false,
+                  "description": "OtelCollector configuration.",
+                  "properties": {
+                    "conf": {
+                      "additionalProperties": false,
+                      "description": "Conf overrides the configuration for the default Kubernetes State Metrics Core check.\nThis must point to a ConfigMap containing a valid cluster check configuration.\nWhen passing a configmap, file name *must* be otel-config.yaml.",
+                      "properties": {
+                        "configData": {
+                          "description": "ConfigData corresponds to the configuration file content.",
+                          "type": "string"
+                        },
+                        "configMap": {
+                          "additionalProperties": false,
+                          "description": "ConfigMap references an existing ConfigMap with the configuration file content.",
+                          "properties": {
+                            "items": {
+                              "description": "Items maps a ConfigMap data `key` to a file `path` mount.",
+                              "items": {
+                                "additionalProperties": false,
+                                "description": "Maps a string key to a path within a volume.",
+                                "properties": {
+                                  "key": {
+                                    "description": "key is the key to project.",
+                                    "type": "string"
+                                  },
+                                  "mode": {
+                                    "description": "mode is Optional: mode bits used to set permissions on this file.\nMust be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\nYAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\nIf not specified, the volume defaultMode will be used.\nThis might be in conflict with other options that affect the file\nmode, like fsGroup, and the result can be other mode bits set.",
+                                    "format": "int32",
+                                    "type": "integer"
+                                  },
+                                  "path": {
+                                    "description": "path is the relative path of the file to map the key to.\nMay not be an absolute path.\nMay not contain the path element '..'.\nMay not start with the string '..'.",
+                                    "type": "string"
+                                  }
+                                },
+                                "required": [
+                                  "key",
+                                  "path"
+                                ],
+                                "type": "object"
+                              },
+                              "type": "array",
+                              "x-kubernetes-list-map-keys": [
+                                "key"
+                              ],
+                              "x-kubernetes-list-type": "map"
+                            },
+                            "name": {
+                              "description": "Name is the name of the ConfigMap.",
+                              "type": "string"
+                            }
+                          },
+                          "type": "object"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "coreConfig": {
+                      "additionalProperties": false,
+                      "description": "OTelCollector Config Relevant to the Core agent",
+                      "properties": {
+                        "enabled": {
+                          "description": "Enabled marks otelcollector as enabled in core agent.",
+                          "type": "boolean"
+                        },
+                        "extension_timeout": {
+                          "description": "Extension URL provides the timout of the ddflareextension to\nthe core agent.",
+                          "type": "integer"
+                        },
+                        "extension_url": {
+                          "description": "Extension URL provides the URL of the ddflareextension to\nthe core agent.",
+                          "type": "string"
+                        }
+                      },
+                      "type": "object"
+                    },
+                    "enabled": {
+                      "description": "Enabled enables the OTel Agent.\nDefault: true",
+                      "type": "boolean"
+                    },
+                    "ports": {
+                      "description": "Ports contains the ports for the otel-agent.\nDefaults: otel-grpc:4317 / otel-http:4318. Note: setting 4317\nor 4318 manually is *only* supported if name match default names (otel-grpc, otel-http).\nIf not, this will lead to a port conflict.\nThis limitation will be lifted once annotations support is removed.",
+                      "items": {
+                        "additionalProperties": false,
+                        "description": "ContainerPort represents a network port in a single container.",
+                        "properties": {
+                          "containerPort": {
+                            "description": "Number of port to expose on the pod's IP address.\nThis must be a valid port number, 0 \u003c x \u003c 65536.",
+                            "format": "int32",
+                            "type": "integer"
+                          },
+                          "hostIP": {
+                            "description": "What host IP to bind the external port to.",
+                            "type": "string"
+                          },
+                          "hostPort": {
+                            "description": "Number of port to expose on the host.\nIf specified, this must be a valid port number, 0 \u003c x \u003c 65536.\nIf HostNetwork is specified, this must match ContainerPort.\nMost containers do not need this.",
+                            "format": "int32",
+                            "type": "integer"
+                          },
+                          "name": {
+                            "description": "If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\nnamed port in a pod must have a unique name. Name for the port that can be\nreferred to by services.",
+                            "type": "string"
+                          },
+                          "protocol": {
+                            "default": "TCP",
+                            "description": "Protocol for port. Must be UDP, TCP, or SCTP.\nDefaults to \"TCP\".",
+                            "type": "string"
+                          }
+                        },
+                        "required": [
+                          "containerPort"
+                        ],
+                        "type": "object"
+                      },
+                      "type": "array"
+                    }
+                  },
+                  "type": "object"
+                },
                 "otlp": {
                   "additionalProperties": false,
                   "description": "OTLP ingest configuration",
diff --git a/config/crd/bases/v1/datadoghq.com_datadogpodautoscalers.yaml b/config/crd/bases/v1/datadoghq.com_datadogpodautoscalers.yaml
index 148d8420..5a30875d 100644
--- a/config/crd/bases/v1/datadoghq.com_datadogpodautoscalers.yaml
+++ b/config/crd/bases/v1/datadoghq.com_datadogpodautoscalers.yaml
@@ -225,6 +225,14 @@ spec:
                             type: object
                           type: array
                           x-kubernetes-list-type: atomic
+                        stabilizationWindowSeconds:
+                          description: |-
+                            StabilizationWindowSeconds is the number of seconds the controller should lookback at previous recommendations
+                            before deciding to apply a new one. Defaults to 0.
+                          format: int32
+                          maximum: 1800
+                          minimum: 0
+                          type: integer
                         strategy:
                           description: |-
                             Strategy is used to specify which policy should be used.
@@ -291,6 +299,14 @@ spec:
                             type: object
                           type: array
                           x-kubernetes-list-type: atomic
+                        stabilizationWindowSeconds:
+                          description: |-
+                            StabilizationWindowSeconds is the number of seconds the controller should lookback at previous recommendations
+                            before deciding to apply a new one. Defaults to 0.
+                          format: int32
+                          maximum: 1800
+                          minimum: 0
+                          type: integer
                         strategy:
                           description: |-
                             Strategy is used to specify which policy should be used.
diff --git a/config/crd/bases/v1/datadoghq.com_datadogpodautoscalers_v1alpha1.json b/config/crd/bases/v1/datadoghq.com_datadogpodautoscalers_v1alpha1.json
index 4bd00a7d..984898c8 100644
--- a/config/crd/bases/v1/datadoghq.com_datadogpodautoscalers_v1alpha1.json
+++ b/config/crd/bases/v1/datadoghq.com_datadogpodautoscalers_v1alpha1.json
@@ -263,6 +263,13 @@
                   "type": "array",
                   "x-kubernetes-list-type": "atomic"
                 },
+                "stabilizationWindowSeconds": {
+                  "description": "StabilizationWindowSeconds is the number of seconds the controller should lookback at previous recommendations\nbefore deciding to apply a new one. Defaults to 0.",
+                  "format": "int32",
+                  "maximum": 1800,
+                  "minimum": 0,
+                  "type": "integer"
+                },
                 "strategy": {
                   "description": "Strategy is used to specify which policy should be used.\nIf not set, the default value Max is used.",
                   "enum": [
@@ -340,6 +347,13 @@
                   "type": "array",
                   "x-kubernetes-list-type": "atomic"
                 },
+                "stabilizationWindowSeconds": {
+                  "description": "StabilizationWindowSeconds is the number of seconds the controller should lookback at previous recommendations\nbefore deciding to apply a new one. Defaults to 0.",
+                  "format": "int32",
+                  "maximum": 1800,
+                  "minimum": 0,
+                  "type": "integer"
+                },
                 "strategy": {
                   "description": "Strategy is used to specify which policy should be used.\nIf not set, the default value Max is used.",
                   "enum": [
diff --git a/config/crd/bases/v1beta1/datadoghq.com_datadogpodautoscalers.yaml b/config/crd/bases/v1beta1/datadoghq.com_datadogpodautoscalers.yaml
index 37792418..2eca96e6 100644
--- a/config/crd/bases/v1beta1/datadoghq.com_datadogpodautoscalers.yaml
+++ b/config/crd/bases/v1beta1/datadoghq.com_datadogpodautoscalers.yaml
@@ -200,6 +200,11 @@ spec:
                         type: object
                       type: array
                       x-kubernetes-list-type: atomic
+                    stabilizationWindowSeconds:
+                      description: StabilizationWindowSeconds is used to specify the number of seconds to lookback to stabilize new recommendations before deciding to apply a new one. Defaults to 0.
+                      format: int32
+                      minimum: 0
+                      type: integer
                     strategy:
                       description: Strategy is used to specify which policy should be used. If not set, the default value Max is used.
                       enum:
@@ -256,6 +261,11 @@ spec:
                         type: object
                       type: array
                       x-kubernetes-list-type: atomic
+                    stabilizationWindowSeconds:
+                      description: StabilizationWindowSeconds is used to specify the number of seconds to lookback to stabilize new recommendations. Defaults to 0.
+                      format: int32
+                      minimum: 0
+                      type: integer
                     strategy:
                       description: Strategy is used to specify which policy should be used. If not set, the default value Max is used.
                       enum:
diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml
index 702be870..267f62b4 100644
--- a/config/default/kustomization.yaml
+++ b/config/default/kustomization.yaml
@@ -24,12 +24,15 @@ resources:
 #- ../certmanager
 # [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'.
 #- ../prometheus
+# [METRICS] Expose the controller manager metrics service.
+#- metrics_service.yaml
 
 #patches:
-# Protect the /metrics endpoint by putting it behind auth.
-# If you want your controller-manager to expose the /metrics
-# endpoint w/o any authn/z, please comment the following line.
-#- path: manager_auth_proxy_patch.yaml
+# [METRICS] The following patch will enable the metrics endpoint using HTTPS and the port :8443.
+# More info: https://book.kubebuilder.io/reference/metrics
+#- path: manager_metrics_patch.yaml
+#  target:
+#    kind: Deployment
 # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
 # crd/kustomization.yaml
 #- path: manager_webhook_patch.yaml
diff --git a/config/default/manager_auth_proxy_patch.yaml b/config/default/manager_auth_proxy_patch.yaml
deleted file mode 100644
index 02b5c2f4..00000000
--- a/config/default/manager_auth_proxy_patch.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-# This patch inject a sidecar container which is a HTTP proxy for the 
-# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews.
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: manager
-  namespace: system
-spec:
-  template:
-    spec:
-      containers:
-      - name: kube-rbac-proxy
-        image: gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0
-        args:
-        - "--secure-listen-address=0.0.0.0:8443"
-        - "--upstream=http://127.0.0.1:8080/"
-        - "--logtostderr=true"
-        - "--v=10"
-        ports:
-        - containerPort: 8443
-          name: https
-      - name: manager
-        args:
-        - "--metrics-addr=127.0.0.1:8080"
-        - "--enable-leader-election"
diff --git a/config/default/manager_metrics_patch.yaml b/config/default/manager_metrics_patch.yaml
new file mode 100644
index 00000000..07d1b544
--- /dev/null
+++ b/config/default/manager_metrics_patch.yaml
@@ -0,0 +1,4 @@
+# This patch adds the args to allow exposing the metrics endpoint using HTTPS
+- op: add
+  path: /spec/template/spec/containers/0/args/0
+  value: --metrics-addr=:8443
diff --git a/config/rbac/auth_proxy_service.yaml b/config/default/metrics_service.yaml
similarity index 86%
rename from config/rbac/auth_proxy_service.yaml
rename to config/default/metrics_service.yaml
index 6cf656be..ef414742 100644
--- a/config/rbac/auth_proxy_service.yaml
+++ b/config/default/metrics_service.yaml
@@ -9,6 +9,7 @@ spec:
   ports:
   - name: https
     port: 8443
-    targetPort: https
+    protocol: TCP
+    targetPort: 8443
   selector:
     control-plane: controller-manager
diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml
index 312196f0..9158f9cd 100644
--- a/config/manager/manager.yaml
+++ b/config/manager/manager.yaml
@@ -22,6 +22,7 @@ spec:
     metadata:
       labels:
         app.kubernetes.io/name: datadog-operator
+        control-plane: controller-manager
       annotations:
         ad.datadoghq.com/manager.check_names: '["openmetrics"]'
         ad.datadoghq.com/manager.init_configs: '[{}]'
diff --git a/config/rbac/auth_proxy_client_clusterrole.yaml b/config/rbac/auth_proxy_client_clusterrole.yaml
deleted file mode 100644
index 7d62534c..00000000
--- a/config/rbac/auth_proxy_client_clusterrole.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: ClusterRole
-metadata:
-  name: metrics-reader
-rules:
-- nonResourceURLs: ["/metrics"]
-  verbs: ["get"]
diff --git a/config/rbac/kustomization.yaml b/config/rbac/kustomization.yaml
index 9de34894..711b0f70 100644
--- a/config/rbac/kustomization.yaml
+++ b/config/rbac/kustomization.yaml
@@ -4,12 +4,12 @@ resources:
 - role_binding.yaml
 - leader_election_role.yaml
 - leader_election_role_binding.yaml
-# Comment the following 4 lines if you want to disable
-# the auth proxy (https://github.com/brancz/kube-rbac-proxy)
-# which protects your /metrics endpoint.
-#- auth_proxy_service.yaml
-#- auth_proxy_role.yaml
-#- auth_proxy_role_binding.yaml
-#- auth_proxy_client_clusterrole.yaml
+# The following RBAC configurations are used to protect
+# the metrics endpoint with authn/authz. These configurations
+# ensure that only authorized users and service accounts
+# can access the metrics endpoint.
+# - metrics_auth_role.yaml
+# - metrics_auth_role_binding.yaml
+# - metrics_reader_role.yaml
 apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
\ No newline at end of file
diff --git a/config/rbac/auth_proxy_role.yaml b/config/rbac/metrics_auth_role.yaml
similarity index 50%
rename from config/rbac/auth_proxy_role.yaml
rename to config/rbac/metrics_auth_role.yaml
index 618f5e41..32d2e4ec 100644
--- a/config/rbac/auth_proxy_role.yaml
+++ b/config/rbac/metrics_auth_role.yaml
@@ -1,13 +1,17 @@
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
 metadata:
-  name: proxy-role
+  name: metrics-auth-role
 rules:
-- apiGroups: ["authentication.k8s.io"]
+- apiGroups:
+  - authentication.k8s.io
   resources:
   - tokenreviews
-  verbs: ["create"]
-- apiGroups: ["authorization.k8s.io"]
+  verbs:
+  - create
+- apiGroups:
+  - authorization.k8s.io
   resources:
   - subjectaccessreviews
-  verbs: ["create"]
+  verbs:
+  - create
diff --git a/config/rbac/auth_proxy_role_binding.yaml b/config/rbac/metrics_auth_role_binding.yaml
similarity index 69%
rename from config/rbac/auth_proxy_role_binding.yaml
rename to config/rbac/metrics_auth_role_binding.yaml
index 48ed1e4b..e775d67f 100644
--- a/config/rbac/auth_proxy_role_binding.yaml
+++ b/config/rbac/metrics_auth_role_binding.yaml
@@ -1,12 +1,12 @@
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
 metadata:
-  name: proxy-rolebinding
+  name: metrics-auth-rolebinding
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
-  name: proxy-role
+  name: metrics-auth-role
 subjects:
 - kind: ServiceAccount
-  name: default
+  name: controller-manager
   namespace: system
diff --git a/config/rbac/metrics_reader_role.yaml b/config/rbac/metrics_reader_role.yaml
new file mode 100644
index 00000000..51a75db4
--- /dev/null
+++ b/config/rbac/metrics_reader_role.yaml
@@ -0,0 +1,9 @@
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: metrics-reader
+rules:
+- nonResourceURLs:
+  - "/metrics"
+  verbs:
+  - get
diff --git a/config/test-v1/kustomization.yaml b/config/test-v1/kustomization.yaml
index c38863cd..869ebd6a 100644
--- a/config/test-v1/kustomization.yaml
+++ b/config/test-v1/kustomization.yaml
@@ -43,11 +43,6 @@ resources:
 #    namespace: system
 #    version: v1
 
-# Protect the /metrics endpoint by putting it behind auth.
-# If you want your controller-manager to expose the /metrics
-# endpoint w/o any authn/z, please comment the following line.
-#- path: manager_auth_proxy_patch.yaml
-
 # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
 # crd/kustomization.yaml
 #- path: manager_webhook_patch.yaml
diff --git a/config/test-v1/manager_auth_proxy_patch.yaml b/config/test-v1/manager_auth_proxy_patch.yaml
deleted file mode 100644
index 02b5c2f4..00000000
--- a/config/test-v1/manager_auth_proxy_patch.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-# This patch inject a sidecar container which is a HTTP proxy for the 
-# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews.
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: manager
-  namespace: system
-spec:
-  template:
-    spec:
-      containers:
-      - name: kube-rbac-proxy
-        image: gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0
-        args:
-        - "--secure-listen-address=0.0.0.0:8443"
-        - "--upstream=http://127.0.0.1:8080/"
-        - "--logtostderr=true"
-        - "--v=10"
-        ports:
-        - containerPort: 8443
-          name: https
-      - name: manager
-        args:
-        - "--metrics-addr=127.0.0.1:8080"
-        - "--enable-leader-election"
diff --git a/docs/configuration.v2alpha1.md b/docs/configuration.v2alpha1.md
index c9907272..121c51d5 100644
--- a/docs/configuration.v2alpha1.md
+++ b/docs/configuration.v2alpha1.md
@@ -49,6 +49,7 @@ spec:
 | features.admissionController.cwsInstrumentation.mode | Defines the behavior of the CWS Instrumentation endpoint, and can be either "init_container" or "remote_copy". Default: "remote_copy" |
 | features.admissionController.enabled | Enables the Admission Controller. Default: true |
 | features.admissionController.failurePolicy | FailurePolicy determines how unrecognized and timeout errors are handled. |
+| features.admissionController.kubernetesAdmissionEvents.enabled | Enable the Kubernetes Admission Events feature. Default: false |
 | features.admissionController.mutateUnlabelled | MutateUnlabelled enables config injection without the need of pod label 'admission.datadoghq.com/enabled="true"'. Default: false |
 | features.admissionController.mutation.enabled | Enables the Admission Controller mutation webhook. Default: true |
 | features.admissionController.registry | Defines an image registry for the admission controller. |
@@ -141,6 +142,14 @@ spec:
 | features.orchestratorExplorer.enabled | Enables the Orchestrator Explorer. Default: true |
 | features.orchestratorExplorer.extraTags | Additional tags to associate with the collected data in the form of `a b c`. This is a Cluster Agent option distinct from DD_TAGS that is used in the Orchestrator Explorer. |
 | features.orchestratorExplorer.scrubContainers | ScrubContainers enables scrubbing of sensitive container data (passwords, tokens, etc. ). Default: true |
+| features.otelCollector.conf.configData | ConfigData corresponds to the configuration file content. |
+| features.otelCollector.conf.configMap.items | Maps a ConfigMap data `key` to a file `path` mount. |
+| features.otelCollector.conf.configMap.name | Is the name of the ConfigMap. |
+| features.otelCollector.coreConfig.enabled | Marks otelcollector as enabled in core agent. |
+| features.otelCollector.coreConfig.extension_timeout | Extension URL provides the timout of the ddflareextension to the core agent. |
+| features.otelCollector.coreConfig.extension_url | Extension URL provides the URL of the ddflareextension to the core agent. |
+| features.otelCollector.enabled | Enables the OTel Agent. Default: true |
+| features.otelCollector.ports | Contains the ports for the otel-agent. Defaults: otel-grpc:4317 / otel-http:4318. Note: setting 4317 or 4318 manually is *only* supported if name match default names (otel-grpc, otel-http). If not, this will lead to a port conflict. This limitation will be lifted once annotations support is removed. |
 | features.otlp.receiver.protocols.grpc.enabled | Enable the OTLP/gRPC endpoint. Host port is enabled by default and can be disabled. |
 | features.otlp.receiver.protocols.grpc.endpoint | For OTLP/gRPC. gRPC supports several naming schemes: https://github.com/grpc/grpc/blob/master/doc/naming.md The Datadog Operator supports only 'host:port' (usually `0.0.0.0:port`). Default: `0.0.0.0:4317`. |
 | features.otlp.receiver.protocols.grpc.hostPortConfig.enabled | Enables host port configuration |
@@ -396,6 +405,7 @@ In the table, `spec.override.nodeAgent.image.name` and `spec.override.nodeAgent.
 | [key].nodeSelector `map[string]string` | A map of key-value pairs. For this pod to run on a specific node, the node must have these key-value pairs as labels. See https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ |
 | [key].priorityClassName | If specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority is default, or zero if there is no default. |
 | [key].replicas | Number of the replicas. Not applicable for a DaemonSet/ExtendedDaemonSet deployment |
+| [key].runtimeClassName | If specified, indicates the pod's RuntimeClass kubelet should use to run the pod. If the named RuntimeClass does not exist, or the CRI cannot run the corresponding handler, the pod enters the Failed terminal phase. If no runtimeClassName is specified, the default RuntimeHandler is used, which is equivalent to the behavior when the RuntimeClass feature is disabled. |
 | [key].securityContext.appArmorProfile.localhostProfile | localhostProfile indicates a profile loaded on the node that should be used. The profile must be preconfigured on the node to work. Must match the loaded name of the profile. Must be set if and only if type is "Localhost". |
 | [key].securityContext.appArmorProfile.type | type indicates which kind of AppArmor profile will be applied. Valid options are:   Localhost - a profile pre-loaded on the node.   RuntimeDefault - the container runtime's default profile.   Unconfined - no AppArmor enforcement. |
 | [key].securityContext.fsGroup | A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod:  1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw----  If unset, the Kubelet will not modify the ownership and permissions of any volume. Note that this field cannot be set when spec.os.name is windows. |
diff --git a/docs/datadog_agent_profiles.md b/docs/datadog_agent_profiles.md
index 74e4cff3..2c020cf9 100644
--- a/docs/datadog_agent_profiles.md
+++ b/docs/datadog_agent_profiles.md
@@ -67,3 +67,4 @@ DAP is disabled by default. To enable DAP using the [datadog-operator helm chart
 | override.[nodeAgent].containers.[\*].env | v1.8.0 |
 | override.[nodeAgent].labels | v1.8.0 |
 | override.[nodeAgent].updateStrategy | v1.9.0 |
+| override.[nodeAgent].runtimeClassName | v1.12.0 |
diff --git a/docs/secret_management.md b/docs/secret_management.md
index 267d5b8b..3c6894ba 100644
--- a/docs/secret_management.md
+++ b/docs/secret_management.md
@@ -23,9 +23,9 @@ spec:
 
 The credentials provided here will be stored in a Secret created by the Operator. By properly setting the `RBAC` on the `DatadogAgent` CRD, one can limit who is able to see those credentials.
 
-## 2. Use secret(s) references
+## 2. Use Secret(s) references
 
-Another solution is to provide the name of the secret(s) that contains the credentials:
+Another solution is to provide the name of the Secret(s) that contains the credentials:
 
 ```yaml
 apiVersion: datadoghq.com/v2alpha1
@@ -44,7 +44,7 @@ spec:
   # ...
 ```
 
-Create the secret(s) before applying the DatadogAgent manifest, or the deployment will fail.
+Create the Secret(s) before applying the DatadogAgent manifest, or the deployment will fail.
 
 ```yaml
 apiVersion: v1
@@ -65,7 +65,7 @@ data:
 
 **Note:**
 
-It is possible to use the same secret to store both credentials:
+It is possible to use the same Secret to store both credentials:
 
     ```yaml
     ---
@@ -110,15 +110,15 @@ success
 
 #### Using the secret helper
 
-Kubernetes supports exposing secrets as files inside a pod, and we provide a helper script in the Datadog Operator image to read the secrets from files.
+Kubernetes supports exposing Secrets as files inside a pod, and we provide a helper script in the Datadog Operator image to read the Secrets from files.
 
-First, mount the secret in the Operator container, for instance at `/etc/secret-volume`. Then install or update the Datadog Operator deployment with the `.Values.secretBackend.command` parameter set to `/readsecret.sh` and the `.Values.secretBackend.arguments` parameter set to `/etc/secret-volume`.
+First, mount the Secret in the Operator container, for instance at `/etc/secret-volume`. Then install or update the Datadog Operator deployment with the `.Values.secretBackend.command` parameter set to `/readsecret.sh` and the `.Values.secretBackend.arguments` parameter set to `/etc/secret-volume`.
 
 **Note:** This secret helper requires Datadog Operator v0.5.0+
 
-### How to deploy the agent components using the secret backend feature with DatadogAgent
+### How to deploy Agent components using the secret backend feature with the DatadogAgent (Operator 1.11+)
 
-If using a custom script, create a Datadog Agent (or Cluster Agent) image following the example for the Datadog Operator above. Then, to activate the secret backend feature in the `DatadogAgent` configuration, the `spec.credentials.useSecretBackend` parameter should be set to `true`.
+If using a custom script, create a Datadog Agent (or Cluster Agent) image following the example for the Datadog Operator above, and specify credentials using `ENC[<placeholder>]`.
 
 ```yaml
 apiVersion: datadoghq.com/v2alpha1
@@ -133,7 +133,7 @@ spec:
   # ...
 ```
 
-Then inside the `spec.agent` configuration, the secret backend command can be specified by adding a new environment variable: "DD_SECRET_BACKEND_COMMAND".
+The secret backend command can be specified in the `spec.global.secretBackend.command`:
 
 ```yaml
 apiVersion: datadoghq.com/v2alpha1
@@ -141,45 +141,17 @@ kind: DatadogAgent
 metadata:
   name: datadog
 spec:
+  global:
+    secretBackend:
+      command: "/my-secret-backend.sh"
   # ...
-  override:
-    nodeAgent:
-      containers:
-        agent:
-          env:
-            - name: DD_SECRET_BACKEND_COMMAND
-              value: "/my-secret-backend.sh"
 ```
 
-If the "Cluster Agent" and the "Cluster Check Runner" are also deployed, the environment variable needs to be added also in the other environment variables configuration.
-
-```yaml
-apiVersion: datadoghq.com/v2alpha1
-kind: DatadogAgent
-metadata:
-  name: datadog
-spec:
-  # ...
-  override:
-    clusterAgent:
-      # ...
-      containers:
-        cluster-agent:
-          env:
-            - name: DD_SECRET_BACKEND_COMMAND
-              value: "/my-secret-backend.sh"
-    clusterChecksRunner:
-      # ...
-      containers:
-        agent:
-          env:
-            - name: DD_SECRET_BACKEND_COMMAND
-              value: "/my-secret-backend.sh"
-```
+The environment variable `DD_SECRET_BACKEND_COMMAND` from this configuration is automatically applied to all the deployed components: node Agent, Cluster Agent, and Cluster Checks Runners. Ensure the image you are using for all the components includes your command.
 
-As in the Datadog Operator, the Datadog Agent image includes a helper function `readsecret.sh` that can be used to read mounted secrets. After creating the secret and setting the volume mount (in any container that requires it), set the `DD_SECRET_BACKEND_COMMAND` and `DD_SECRET_BACKEND_ARGUMENTS` environmental variables.
+For convenience, the Datadog Agent and its sibling Cluster Agent images already include a `readsecret_multiple_providers.sh` [helper function][2] that can be used to read from both files as well as Kubernetes Secrets. After creating the Secret, set `spec.global.secretBackend.command` to `"/readsecret_multiple_providers.sh"`.
 
-For instance, to use the secret backend for the Agent and Cluster Agent, create a secret called "test-secret":
+For instance, to use the secret backend for the Agent and Cluster Agent, create a Secret called "test-secret":
 
 `kubectl create secret generic test-secret --from-literal=api_key='<api-key>' --from-literal=app_key='<app-key>'`
 
@@ -192,68 +164,55 @@ metadata:
   name: datadog
 spec:
   global:
-    credentials:
-      apiKey: ENC[api_key]
-      appKey: ENC[app_key]
-  override:
-    nodeAgent:
-      env:
-        - name: DD_SECRET_BACKEND_COMMAND
-          value: "/readsecret.sh"
-        - name: DD_SECRET_BACKEND_ARGUMENTS
-          value: "/etc/secret-volume"
-      containers:
-        agent:
-          volumeMounts:
-            - name: secret-volume
-              mountPath: "/etc/secret-volume"
-      volumes:
-        - name: secret-volume
-          secret:
-            secretName: test-secret
-    clusterAgent:
-      containers:
-        cluster-agent:
-          env:
-            - name: DD_SECRET_BACKEND_COMMAND
-              value: "/readsecret.sh"
-            - name: DD_SECRET_BACKEND_ARGUMENTS
-              value: "/etc/secret-volume"
-          volumeMounts:
-            - name: secret-volume
-              mountPath: "/etc/secret-volume"
-      volumes:
-        - name: secret-volume
-          secret:
-            secretName: test-secret
-```
-
-The Datadog Agent also includes a script that can be used to read secrets from files mounted from Kubernetes secrets, or directly from Kubernetes secrets. This script can be used by setting `DD_SECRET_BACKEND_COMMAND` to `/readsecret_multiple_providers.sh`. An example of how to configure the DatadogAgent spec is provided below. For more details, see [Secrets Management][2].
-
-```yaml
-apiVersion: datadoghq.com/v2alpha1
-kind: DatadogAgent
-metadata:
-  name: datadog
-spec:
-  global:
+    secretBackend:
+      command: "/readsecret_multiple_providers.sh"
     credentials:
       apiKey: ENC[k8s_secret@default/test-secret/api_key]
       appKey: ENC[k8s_secret@default/test-secret/app_key]
-  override:
-    nodeAgent:
-      env:
-        - name: DD_SECRET_BACKEND_COMMAND
-          value: "/readsecret_multiple_providers.sh"
 ```
 
 **Remarks:**
 
-* For the "Agent" and "Cluster Agent", others options exist to configure secret backend command:
+* The `"/readsecret_multiple_providers.sh"` helper enables the Agent to directly read Kubernetes Secrets across both its own and other namespaces. Ensure that the associated ServiceAccount has the necessary permissions by assigning the appropriate Roles and RoleBindings, which can be set manually or using the following options:
+    * `global.secretBackend.enableGlobalPermissions`: Determines if a ClusterRole is created that enables the Agents to read **all** Kubernetes Secrets.
+      ```yaml
+      apiVersion: datadoghq.com/v2alpha1
+      kind: DatadogAgent
+      metadata:
+        name: datadog
+      spec:
+        global:
+          secretBackend:
+            command: "/readsecret_multiple_providers.sh"
+            enableGlobalPermissions: true
+      # ...
+      ```
+    * `global.secretBackend.roles`: Replaces `enableGlobalPermissions`, detailing the list of namespace/secrets to which the Agents should have access.
+      ```yaml
+      apiVersion: datadoghq.com/v2alpha1
+      kind: DatadogAgent
+      metadata:
+        name: datadog
+      spec:
+        global:
+          secretBackend:
+            command: "/readsecret_multiple_providers.sh"
+            roles:
+            - namespace: rabbitmq-system
+              secrets:
+              - "rabbitmqcluster-sample-default-user"
+      # ...
+      ```
+      In this example, a Role is created granting read access to the Secret `rabbitmqcluster-sample-default-user` in the `rabbitmq-system` namespace.
+
+      **Note**: Each namespace in the `roles` list must also be configured in the `WATCH_NAMESPACE` or `DD_AGENT_WATCH_NAMESPACE` environment variable on the **Datadog Operator** deployment.
+
 
-  * **DD_SECRET_BACKEND_ARGUMENTS**: those arguments will be specified to the command when the agent executes the secret backend command.
-  * **DD_SECRET_BACKEND_OUTPUT_MAX_SIZE**: maximum output size of the secret backend command. The default value is 1048576 (1Mb).
-  * **DD_SECRET_BACKEND_TIMEOUT**: secret backend execution timeout in second. The default value is 5 seconds.
+* For the Agent and Cluster Agent, there are other configuration options for the secret backend command:
+  * `global.secretBackend.args`: these arguments are supplied to the command when the Agent executes the secret backend command.
+  * `global.secretBackend.timeout`: secret backend execution timeout in seconds. The default value is 30 seconds.
+* For versions prior to Operator 1.11, `spec.global.secretBackend` is unavailable. You should follow [these instructions][3] instead.
 
 [1]: https://docs.datadoghq.com/agent/guide/secrets-management
 [2]: https://docs.datadoghq.com/agent/guide/secrets-management/?tab=linux#script-for-reading-from-multiple-secret-providers
+[3]: https://github.com/DataDog/datadog-operator/blob/2bbda7adace27de3d397b3d76d87fbd49fa304e3/docs/secret_management.md#how-to-deploy-the-agent-components-using-the-secret-backend-feature-with-datadogagent
diff --git a/examples/datadogagent/datadog-agent-with-otel-agent-annotations.yaml b/examples/datadogagent/datadog-agent-with-otel-agent-annotations.yaml
new file mode 100644
index 00000000..e4970e7d
--- /dev/null
+++ b/examples/datadogagent/datadog-agent-with-otel-agent-annotations.yaml
@@ -0,0 +1,89 @@
+apiVersion: datadoghq.com/v2alpha1
+kind: DatadogAgent
+metadata:
+  annotations:
+    # Note: annotations support is temporary and will be removed in the future.
+    # Please use otelCollector Feature instead.
+    agent.datadoghq.com/otel-agent-enabled: "true"
+  name: datadog
+spec:
+  global:
+    credentials:
+      apiKey: <DATADOG_API_KEY>
+  override:
+    nodeAgent:
+      customConfigurations:
+        otel-config.yaml:
+          configMap:
+            name: my-datadog-otel-config
+            items:
+              - key: otel-config.yaml
+                path: otel-config.yaml
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: my-datadog-otel-config
+  labels:
+    app.kubernetes.io/name: "my-datadog"
+    app.kubernetes.io/version: "7"
+data:
+  otel-config.yaml: |-
+    receivers:
+      prometheus:
+        config:
+          scrape_configs:
+            - job_name: "otel-agent"
+              scrape_interval: 10s
+              static_configs:
+                - targets: ["0.0.0.0:8888"]
+      otlp:
+        protocols:
+          grpc:
+            endpoint: 0.0.0.0:4317
+          http:
+            endpoint: 0.0.0.0:4318
+    exporters:
+      debug:
+        verbosity: detailed
+      datadog:
+        api:
+          key: ${env:DD_API_KEY}
+    processors:
+      infraattributes:
+        cardinality: 2
+      probabilistic_sampler:
+        hash_seed: 22
+        sampling_percentage: 15.3
+      batch:
+        timeout: 10s
+    connectors:
+      datadog/connector:
+        traces:
+          compute_top_level_by_span_kind: true
+          peer_tags_aggregation: true
+          compute_stats_by_span_kind: true
+    extensions:
+      health_check:
+    service:
+      extensions: [health_check]
+      telemetry:
+        logs:
+          level: debug
+      pipelines:
+        traces:
+          receivers: [otlp]
+          processors: [batch]
+          exporters: [datadog/connector]
+        traces/sampled:
+          receivers: [otlp]
+          processors: [probabilistic_sampler, infraattributes, batch]
+          exporters: [datadog]
+        metrics:
+          receivers: [otlp, datadog/connector, prometheus]
+          processors: [infraattributes, batch]
+          exporters: [datadog]
+        logs:
+          receivers: [otlp]
+          processors: [infraattributes, batch]
+          exporters: [datadog]
\ No newline at end of file
diff --git a/examples/datadogagent/datadog-agent-with-otel-agent-configmap.yaml b/examples/datadogagent/datadog-agent-with-otel-agent-configmap.yaml
new file mode 100644
index 00000000..9ac53828
--- /dev/null
+++ b/examples/datadogagent/datadog-agent-with-otel-agent-configmap.yaml
@@ -0,0 +1,58 @@
+apiVersion: datadoghq.com/v2alpha1
+kind: DatadogAgent
+metadata:
+  name: datadog
+spec:
+  global:
+    credentials:
+      apiKey: <DATADOG_API_KEY>
+  features:
+    otelCollector:
+      enabled: true
+      ports:
+        - containerPort: 4317
+          name: otel-grpc
+        - containerPort: 4318
+          name: otel-http
+      conf: 
+        configMap: 
+          name: custom-config-map
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: custom-config-map
+  namespace: system
+data:
+  # must be named otel-config.yaml.
+  otel-config.yaml: |-
+    receivers:
+      otlp:
+        protocols:
+          grpc:
+            endpoint: 0.0.0.0:4317
+          http:
+            endpoint: 0.0.0.0:4318
+    exporters:
+      debug:
+        verbosity: detailed
+      datadog:
+        api:
+          key: ${env:DD_API_KEY}
+    processors:
+      batch:
+    connectors:
+    service:
+      pipelines:
+        traces:
+          receivers: [otlp]
+          processors: [batch]
+          exporters: [datadog]
+        metrics:
+          receivers: [otlp]
+          processors: [batch]
+          exporters: [datadog]
+        logs:
+          receivers: [otlp]
+          processors: [batch]
+          exporters: [datadog]
diff --git a/examples/datadogagent/datadog-agent-with-otel-agent.yaml b/examples/datadogagent/datadog-agent-with-otel-agent.yaml
new file mode 100644
index 00000000..6f4236e3
--- /dev/null
+++ b/examples/datadogagent/datadog-agent-with-otel-agent.yaml
@@ -0,0 +1,48 @@
+apiVersion: datadoghq.com/v2alpha1
+kind: DatadogAgent
+metadata:
+  name: datadog
+spec:
+  global:
+    credentials:
+      apiKey: <DATADOG_API_KEY>
+  features:
+    otelCollector:
+      enabled: true
+      ports:
+        - containerPort: 4317
+          name: otel-grpc
+        - containerPort: 4318
+          name: otel-http
+      conf: 
+        configData: |-
+            receivers:
+              otlp:
+                protocols:
+                  grpc:
+                    endpoint: 0.0.0.0:4317
+                  http:
+                    endpoint: 0.0.0.0:4318
+            exporters:
+              debug:
+                verbosity: detailed
+              datadog:
+                api:
+                  key: ${env:DD_API_KEY}
+            processors:
+              batch:
+            connectors:
+            service:
+              pipelines:
+                traces:
+                  receivers: [otlp]
+                  processors: [batch]
+                  exporters: [datadog]
+                metrics:
+                  receivers: [otlp]
+                  processors: [batch]
+                  exporters: [datadog]
+                logs:
+                  receivers: [otlp]
+                  processors: [batch]
+                  exporters: [datadog]
diff --git a/go.mod b/go.mod
index 43f484ff..ee0b9c75 100644
--- a/go.mod
+++ b/go.mod
@@ -72,9 +72,12 @@ require (
 	github.com/Masterminds/semver v1.5.0 // indirect
 	github.com/Microsoft/go-winio v0.6.1 // indirect
 	github.com/andybalholm/brotli v1.0.6 // indirect
+	github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
+	github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect
 	github.com/benbjohnson/clock v1.3.5 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/blang/semver/v4 v4.0.0 // indirect
+	github.com/cenkalti/backoff/v4 v4.3.0 // indirect
 	github.com/cespare/xxhash/v2 v2.3.0 // indirect
 	github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
@@ -83,9 +86,11 @@ require (
 	github.com/ebitengine/purego v0.6.0-alpha.5 // indirect
 	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
 	github.com/evanphx/json-patch/v5 v5.9.0 // indirect
+	github.com/felixge/httpsnoop v1.0.4 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/fxamacker/cbor/v2 v2.7.0 // indirect
 	github.com/go-errors/errors v1.4.2 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-logr/zapr v1.3.0 // indirect
 	github.com/go-ole/go-ole v1.2.6 // indirect
 	github.com/go-openapi/jsonpointer v0.19.6 // indirect
@@ -97,6 +102,7 @@ require (
 	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
 	github.com/google/btree v1.0.1 // indirect
+	github.com/google/cel-go v0.20.1 // indirect
 	github.com/google/gnostic-models v0.6.8 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
 	github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af // indirect
@@ -105,6 +111,7 @@ require (
 	github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
 	github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
 	github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
 	github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
 	github.com/imdario/mergo v0.3.16 // indirect
 	github.com/inconshreveable/mousetrap v1.1.0 // indirect
@@ -149,6 +156,7 @@ require (
 	github.com/spf13/afero v1.11.0 // indirect
 	github.com/spf13/cast v1.6.0 // indirect
 	github.com/spf13/jwalterweatherman v1.1.0 // indirect
+	github.com/stoewer/go-strcase v1.2.0 // indirect
 	github.com/stretchr/objx v0.5.2 // indirect
 	github.com/tinylib/msgp v1.1.8 // indirect
 	github.com/tklauser/go-sysconf v0.3.12 // indirect
@@ -159,6 +167,14 @@ require (
 	github.com/xlab/treeprint v1.2.0 // indirect
 	github.com/yusufpapurcu/wmi v1.2.3 // indirect
 	go.etcd.io/bbolt v1.3.9 // indirect
+	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
+	go.opentelemetry.io/otel v1.28.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect
+	go.opentelemetry.io/otel/metric v1.28.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.28.0 // indirect
+	go.opentelemetry.io/otel/trace v1.28.0 // indirect
+	go.opentelemetry.io/proto/otlp v1.3.1 // indirect
 	go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
 	go.uber.org/atomic v1.11.0 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
@@ -180,9 +196,12 @@ require (
 	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
+	k8s.io/apiserver v0.31.1 // indirect
+	k8s.io/component-base v0.31.1 // indirect
 	k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect
 	k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
 	modernc.org/sqlite v1.29.5 // indirect
+	sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect
 	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
 	sigs.k8s.io/kustomize/api v0.17.2 // indirect
 	sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect
diff --git a/go.sum b/go.sum
index 6e8170a0..593524c0 100644
--- a/go.sum
+++ b/go.sum
@@ -70,9 +70,13 @@ github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sx
 github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
 github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
+github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
+github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
+github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
 github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -83,6 +87,8 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM
 github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
 github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -136,6 +142,8 @@ github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCv
 github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg=
 github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
 github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
@@ -152,8 +160,11 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
 github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
 github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
 github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
@@ -207,6 +218,8 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
 github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
+github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84=
+github.com/google/cel-go v0.20.1/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg=
 github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
 github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -247,6 +260,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t
 github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
 github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4=
 github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0=
 github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 h1:UpiO20jno/eV1eVZcxqWnUohyKRe1g8FPV/xH1s/2qs=
@@ -457,6 +472,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
+github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU=
+github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
@@ -509,6 +526,22 @@ github.com/zorkian/go-datadog-api v2.30.0+incompatible/go.mod h1:PkXwHX9CUQa/FpB
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI=
 go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
+go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
+go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ=
+go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
+go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
+go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
+go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
+go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
+go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
+go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
+go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
 go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
 go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -747,10 +780,14 @@ k8s.io/apiextensions-apiserver v0.31.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/
 k8s.io/apiextensions-apiserver v0.31.1/go.mod h1:tWMPR3sgW+jsl2xm9v7lAyRF1rYEK71i9G5dRtkknoQ=
 k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U=
 k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
+k8s.io/apiserver v0.31.1 h1:Sars5ejQDCRBY5f7R3QFHdqN3s61nhkpaX8/k1iEw1c=
+k8s.io/apiserver v0.31.1/go.mod h1:lzDhpeToamVZJmmFlaLwdYZwd7zB+WYRYIboqA1kGxM=
 k8s.io/cli-runtime v0.31.1 h1:/ZmKhmZ6hNqDM+yf9s3Y4KEYakNXUn5sod2LWGGwCuk=
 k8s.io/cli-runtime v0.31.1/go.mod h1:pKv1cDIaq7ehWGuXQ+A//1OIF+7DI+xudXtExMCbe9U=
 k8s.io/client-go v0.31.1 h1:f0ugtWSbWpxHR7sjVpQwuvw9a3ZKLXX0u0itkFXufb0=
 k8s.io/client-go v0.31.1/go.mod h1:sKI8871MJN2OyeqRlmA4W4KM9KBdBUpDLu/43eGemCg=
+k8s.io/component-base v0.31.1 h1:UpOepcrX3rQ3ab5NB6g5iP0tvsgJWzxTyAo20sgYSy8=
+k8s.io/component-base v0.31.1/go.mod h1:WGeaw7t/kTsqpVTaCoVEtillbqAhF2/JgvO0LDOMa0w=
 k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo=
 k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
@@ -777,6 +814,8 @@ modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
 modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
 modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
 modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
 sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q=
 sigs.k8s.io/controller-runtime v0.19.0/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4=
 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
diff --git a/hack/publish-community-bundles.sh b/hack/publish-community-bundles.sh
index e9e581ac..f17a242c 100755
--- a/hack/publish-community-bundles.sh
+++ b/hack/publish-community-bundles.sh
@@ -68,7 +68,7 @@ do
     certified-operators)
       ORG="redhat-openshift-ecosystem"
       OPERATOR_SUBPATH="datadog-operator-certified"
-      BUNDLE_NAME="bundle-redhat"
+      BUNDLE_NAME="bundle-redhat-certified"
       ;;
     redhat-marketplace-operators)
       ORG="redhat-openshift-ecosystem"
diff --git a/internal/controller/datadogagent/common/utils.go b/internal/controller/datadogagent/common/utils.go
index 91f2b887..b6e71640 100644
--- a/internal/controller/datadogagent/common/utils.go
+++ b/internal/controller/datadogagent/common/utils.go
@@ -76,7 +76,7 @@ func GetAgentVersion(dda metav1.Object) string {
 
 // GetDefaultSeccompConfigMapName returns the default seccomp configmap name based on the DatadogAgent name
 func GetDefaultSeccompConfigMapName(dda metav1.Object) string {
-	return fmt.Sprintf("%s-%s", dda.GetName(), apicommon.SystemProbeAgentSecurityConfigMapSuffixName)
+	return fmt.Sprintf("%s-%s", dda.GetName(), v2alpha1.SystemProbeAgentSecurityConfigMapSuffixName)
 }
 
 // GetAgentVersionFromImage returns the Agent version based on the AgentImageConfig
diff --git a/internal/controller/datadogagent/common/volumes.go b/internal/controller/datadogagent/common/volumes.go
index ea306af1..82b529f6 100644
--- a/internal/controller/datadogagent/common/volumes.go
+++ b/internal/controller/datadogagent/common/volumes.go
@@ -11,7 +11,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
+	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 )
 
 // This file contains definitions of volumes used in the agent specs
@@ -19,7 +19,7 @@ import (
 // GetVolumeForConfig return the volume that contains the agent config
 func GetVolumeForConfig() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.ConfigVolumeName,
+		Name: v2alpha1.ConfigVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			EmptyDir: &corev1.EmptyDirVolumeSource{},
 		},
@@ -29,7 +29,7 @@ func GetVolumeForConfig() corev1.Volume {
 // GetVolumeForConfd return the volume that contains the agent confd config files
 func GetVolumeForConfd() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.ConfdVolumeName,
+		Name: v2alpha1.ConfdVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			EmptyDir: &corev1.EmptyDirVolumeSource{},
 		},
@@ -39,7 +39,7 @@ func GetVolumeForConfd() corev1.Volume {
 // GetVolumeForChecksd return the volume that contains the agent confd config files
 func GetVolumeForChecksd() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.ChecksdVolumeName,
+		Name: v2alpha1.ChecksdVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			EmptyDir: &corev1.EmptyDirVolumeSource{},
 		},
@@ -59,7 +59,7 @@ func GetVolumeForRmCorechecks() corev1.Volume {
 // GetVolumeForAuth return the Volume container authentication information
 func GetVolumeForAuth() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.AuthVolumeName,
+		Name: v2alpha1.AuthVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			EmptyDir: &corev1.EmptyDirVolumeSource{},
 		},
@@ -69,7 +69,7 @@ func GetVolumeForAuth() corev1.Volume {
 // GetVolumeForLogs return the Volume that should container generated logs
 func GetVolumeForLogs() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.LogDatadogVolumeName,
+		Name: v2alpha1.LogDatadogVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			EmptyDir: &corev1.EmptyDirVolumeSource{},
 		},
@@ -79,7 +79,7 @@ func GetVolumeForLogs() corev1.Volume {
 // GetVolumeInstallInfo return the Volume that should install-info file
 func GetVolumeInstallInfo(owner metav1.Object) corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.InstallInfoVolumeName,
+		Name: v2alpha1.InstallInfoVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			ConfigMap: &corev1.ConfigMapVolumeSource{
 				LocalObjectReference: corev1.LocalObjectReference{
@@ -93,10 +93,10 @@ func GetVolumeInstallInfo(owner metav1.Object) corev1.Volume {
 // GetVolumeForProc returns the volume with /proc
 func GetVolumeForProc() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.ProcdirVolumeName,
+		Name: v2alpha1.ProcdirVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			HostPath: &corev1.HostPathVolumeSource{
-				Path: apicommon.ProcdirHostPath,
+				Path: v2alpha1.ProcdirHostPath,
 			},
 		},
 	}
@@ -105,7 +105,7 @@ func GetVolumeForProc() corev1.Volume {
 // GetVolumeForCgroups returns the volume that contains the cgroup directory
 func GetVolumeForCgroups() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.CgroupsVolumeName,
+		Name: v2alpha1.CgroupsVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			HostPath: &corev1.HostPathVolumeSource{
 				Path: "/sys/fs/cgroup",
@@ -117,7 +117,7 @@ func GetVolumeForCgroups() corev1.Volume {
 // GetVolumeForDogstatsd returns the volume with the Dogstatsd socket
 func GetVolumeForDogstatsd() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.DogstatsdSocketVolumeName,
+		Name: v2alpha1.DogstatsdSocketVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			EmptyDir: &corev1.EmptyDirVolumeSource{},
 		},
@@ -132,16 +132,16 @@ func GetInstallInfoConfigMapName(dda metav1.Object) string {
 // GetVolumeMountForConfig return the VolumeMount that contains the agent config
 func GetVolumeMountForConfig() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.ConfigVolumeName,
-		MountPath: apicommon.ConfigVolumePath,
+		Name:      v2alpha1.ConfigVolumeName,
+		MountPath: v2alpha1.ConfigVolumePath,
 	}
 }
 
 // GetVolumeMountForConfd return the VolumeMount that contains the agent confd config files
 func GetVolumeMountForConfd() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.ConfdVolumeName,
-		MountPath: apicommon.ConfdVolumePath,
+		Name:      v2alpha1.ConfdVolumeName,
+		MountPath: v2alpha1.ConfdVolumePath,
 		ReadOnly:  true,
 	}
 }
@@ -149,8 +149,8 @@ func GetVolumeMountForConfd() corev1.VolumeMount {
 // GetVolumeMountForChecksd return the VolumeMount that contains the agent checksd config files
 func GetVolumeMountForChecksd() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.ChecksdVolumeName,
-		MountPath: apicommon.ChecksdVolumePath,
+		Name:      v2alpha1.ChecksdVolumeName,
+		MountPath: v2alpha1.ChecksdVolumePath,
 		ReadOnly:  true,
 	}
 }
@@ -159,15 +159,15 @@ func GetVolumeMountForChecksd() corev1.VolumeMount {
 func GetVolumeMountForRmCorechecks() corev1.VolumeMount {
 	return corev1.VolumeMount{
 		Name:      "remove-corechecks",
-		MountPath: fmt.Sprintf("%s/%s", apicommon.ConfigVolumePath, "conf.d"),
+		MountPath: fmt.Sprintf("%s/%s", v2alpha1.ConfigVolumePath, "conf.d"),
 	}
 }
 
 // GetVolumeMountForAuth returns the VolumeMount that contains the authentication information
 func GetVolumeMountForAuth(readOnly bool) corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.AuthVolumeName,
-		MountPath: apicommon.AuthVolumePath,
+		Name:      v2alpha1.AuthVolumeName,
+		MountPath: v2alpha1.AuthVolumePath,
 		ReadOnly:  readOnly,
 	}
 }
@@ -175,8 +175,8 @@ func GetVolumeMountForAuth(readOnly bool) corev1.VolumeMount {
 // GetVolumeMountForLogs return the VolumeMount for the container generated logs
 func GetVolumeMountForLogs() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.LogDatadogVolumeName,
-		MountPath: apicommon.LogDatadogVolumePath,
+		Name:      v2alpha1.LogDatadogVolumeName,
+		MountPath: v2alpha1.LogDatadogVolumePath,
 		ReadOnly:  false,
 	}
 }
@@ -184,7 +184,7 @@ func GetVolumeMountForLogs() corev1.VolumeMount {
 // GetVolumeForTmp return the Volume use for /tmp
 func GetVolumeForTmp() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.TmpVolumeName,
+		Name: v2alpha1.TmpVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			EmptyDir: &corev1.EmptyDirVolumeSource{},
 		},
@@ -194,8 +194,8 @@ func GetVolumeForTmp() corev1.Volume {
 // GetVolumeMountForTmp return the VolumeMount for /tmp
 func GetVolumeMountForTmp() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.TmpVolumeName,
-		MountPath: apicommon.TmpVolumePath,
+		Name:      v2alpha1.TmpVolumeName,
+		MountPath: v2alpha1.TmpVolumePath,
 		ReadOnly:  false,
 	}
 }
@@ -203,7 +203,7 @@ func GetVolumeMountForTmp() corev1.VolumeMount {
 // GetVolumeForCertificates return the Volume use to store certificates
 func GetVolumeForCertificates() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.CertificatesVolumeName,
+		Name: v2alpha1.CertificatesVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			EmptyDir: &corev1.EmptyDirVolumeSource{},
 		},
@@ -213,8 +213,8 @@ func GetVolumeForCertificates() corev1.Volume {
 // GetVolumeMountForCertificates return the VolumeMount use to store certificates
 func GetVolumeMountForCertificates() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.CertificatesVolumeName,
-		MountPath: apicommon.CertificatesVolumePath,
+		Name:      v2alpha1.CertificatesVolumeName,
+		MountPath: v2alpha1.CertificatesVolumePath,
 		ReadOnly:  false,
 	}
 }
@@ -222,18 +222,18 @@ func GetVolumeMountForCertificates() corev1.VolumeMount {
 // GetVolumeMountForInstallInfo return the VolumeMount that contains the agent install-info file
 func GetVolumeMountForInstallInfo() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.InstallInfoVolumeName,
-		MountPath: apicommon.InstallInfoVolumePath,
-		SubPath:   apicommon.InstallInfoVolumeSubPath,
-		ReadOnly:  apicommon.InstallInfoVolumeReadOnly,
+		Name:      v2alpha1.InstallInfoVolumeName,
+		MountPath: v2alpha1.InstallInfoVolumePath,
+		SubPath:   v2alpha1.InstallInfoVolumeSubPath,
+		ReadOnly:  v2alpha1.InstallInfoVolumeReadOnly,
 	}
 }
 
 // GetVolumeMountForProc returns the VolumeMount that contains /proc
 func GetVolumeMountForProc() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.ProcdirVolumeName,
-		MountPath: apicommon.ProcdirMountPath,
+		Name:      v2alpha1.ProcdirVolumeName,
+		MountPath: v2alpha1.ProcdirMountPath,
 		ReadOnly:  true,
 	}
 }
@@ -241,8 +241,8 @@ func GetVolumeMountForProc() corev1.VolumeMount {
 // GetVolumeMountForCgroups returns the VolumeMount that contains the cgroups info
 func GetVolumeMountForCgroups() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.CgroupsVolumeName,
-		MountPath: apicommon.CgroupsMountPath,
+		Name:      v2alpha1.CgroupsVolumeName,
+		MountPath: v2alpha1.CgroupsMountPath,
 		ReadOnly:  true,
 	}
 }
@@ -250,8 +250,8 @@ func GetVolumeMountForCgroups() corev1.VolumeMount {
 // GetVolumeMountForDogstatsdSocket returns the VolumeMount with the Dogstatsd socket
 func GetVolumeMountForDogstatsdSocket(readOnly bool) corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.DogstatsdSocketVolumeName,
-		MountPath: apicommon.DogstatsdSocketLocalPath,
+		Name:      v2alpha1.DogstatsdSocketVolumeName,
+		MountPath: v2alpha1.DogstatsdSocketLocalPath,
 		ReadOnly:  readOnly,
 	}
 }
@@ -259,10 +259,10 @@ func GetVolumeMountForDogstatsdSocket(readOnly bool) corev1.VolumeMount {
 // GetVolumeForRuntimeSocket returns the Volume for the runtime socket
 func GetVolumeForRuntimeSocket() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.CriSocketVolumeName,
+		Name: v2alpha1.CriSocketVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			HostPath: &corev1.HostPathVolumeSource{
-				Path: apicommon.RuntimeDirVolumePath,
+				Path: v2alpha1.RuntimeDirVolumePath,
 			},
 		},
 	}
@@ -271,8 +271,8 @@ func GetVolumeForRuntimeSocket() corev1.Volume {
 // GetVolumeMountForRuntimeSocket returns the VolumeMount with the runtime socket
 func GetVolumeMountForRuntimeSocket(readOnly bool) corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.CriSocketVolumeName,
-		MountPath: apicommon.HostCriSocketPathPrefix + apicommon.RuntimeDirVolumePath,
+		Name:      v2alpha1.CriSocketVolumeName,
+		MountPath: v2alpha1.HostCriSocketPathPrefix + v2alpha1.RuntimeDirVolumePath,
 		ReadOnly:  readOnly,
 	}
 }
@@ -280,15 +280,15 @@ func GetVolumeMountForRuntimeSocket(readOnly bool) corev1.VolumeMount {
 // GetVolumeMountForSecurity returns the VolumeMount for datadog-agent-security
 func GetVolumeMountForSecurity() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.SeccompSecurityVolumeName,
-		MountPath: apicommon.SeccompSecurityVolumePath,
+		Name:      v2alpha1.SeccompSecurityVolumeName,
+		MountPath: v2alpha1.SeccompSecurityVolumePath,
 	}
 }
 
 // GetVolumeForSecurity returns the Volume for datadog-agent-security
 func GetVolumeForSecurity(owner metav1.Object) corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.SeccompSecurityVolumeName,
+		Name: v2alpha1.SeccompSecurityVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			ConfigMap: &corev1.ConfigMapVolumeSource{
 				LocalObjectReference: corev1.LocalObjectReference{
@@ -302,18 +302,18 @@ func GetVolumeForSecurity(owner metav1.Object) corev1.Volume {
 // GetVolumeMountForSeccomp returns the VolumeMount for seccomp root
 func GetVolumeMountForSeccomp() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.SeccompRootVolumeName,
-		MountPath: apicommon.SeccompRootVolumePath,
+		Name:      v2alpha1.SeccompRootVolumeName,
+		MountPath: v2alpha1.SeccompRootVolumePath,
 	}
 }
 
 // GetVolumeForSeccomp returns the volume for seccomp root
 func GetVolumeForSeccomp() corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.SeccompRootVolumeName,
+		Name: v2alpha1.SeccompRootVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			HostPath: &corev1.HostPathVolumeSource{
-				Path: apicommon.SeccompRootPath,
+				Path: v2alpha1.SeccompRootPath,
 			},
 		},
 	}
diff --git a/internal/controller/datadogagent/component/agent/default.go b/internal/controller/datadogagent/component/agent/default.go
index e16a9bb0..1461f4b4 100644
--- a/internal/controller/datadogagent/component/agent/default.go
+++ b/internal/controller/datadogagent/component/agent/default.go
@@ -104,6 +104,12 @@ func agentImage() string {
 	return fmt.Sprintf("%s/%s:%s", v2alpha1.DefaultImageRegistry, v2alpha1.DefaultAgentImageName, defaulting.AgentLatestVersion)
 }
 
+func otelAgentImage() string {
+	// todo(mackjmr): make this dynamic once we have otel agent image which releases with regular agent.
+	return fmt.Sprintf("%s:%s", defaulting.AgentDevImageName, defaulting.OTelAgentNightlyTag)
+
+}
+
 func initContainers(dda metav1.Object, requiredContainers []apicommon.AgentContainerName) []corev1.Container {
 	initContainers := []corev1.Container{
 		initVolumeContainer(),
@@ -180,7 +186,7 @@ func traceAgentContainer(dda metav1.Object) corev1.Container {
 		Image: agentImage(),
 		Command: []string{
 			"trace-agent",
-			fmt.Sprintf("--config=%s", apicommon.AgentCustomConfigVolumePath),
+			fmt.Sprintf("--config=%s", v2alpha1.AgentCustomConfigVolumePath),
 		},
 		Env:           envVarsForTraceAgent(dda),
 		VolumeMounts:  volumeMountsForTraceAgent(),
@@ -193,33 +199,38 @@ func processAgentContainer(dda metav1.Object) corev1.Container {
 		Name:  string(apicommon.ProcessAgentContainerName),
 		Image: agentImage(),
 		Command: []string{
-			"process-agent", fmt.Sprintf("--config=%s", apicommon.AgentCustomConfigVolumePath),
-			fmt.Sprintf("--sysprobe-config=%s", apicommon.SystemProbeConfigVolumePath),
+			"process-agent", fmt.Sprintf("--config=%s", v2alpha1.AgentCustomConfigVolumePath),
+			fmt.Sprintf("--sysprobe-config=%s", v2alpha1.SystemProbeConfigVolumePath),
 		},
 		Env:          commonEnvVars(dda),
 		VolumeMounts: volumeMountsForProcessAgent(),
 	}
 }
 
-func otelAgentContainer(dda metav1.Object) corev1.Container {
+func otelAgentContainer(_ metav1.Object) corev1.Container {
 	return corev1.Container{
 		Name:  string(apicommon.OtelAgent),
-		Image: agentImage(),
+		Image: otelAgentImage(),
 		Command: []string{
-			"/otel-agent",
-			fmt.Sprintf("--config=%s", apicommon.OtelCustomConfigVolumePath),
+			"otel-agent",
+			"--config=" + v2alpha1.OtelCustomConfigVolumePath,
+			"--core-config=" + v2alpha1.AgentCustomConfigVolumePath,
+			"--sync-delay=30s",
 		},
-		Env:          envVarsForOtelAgent(dda),
+		Env:          []corev1.EnvVar{},
 		VolumeMounts: volumeMountsForOtelAgent(),
+		// todo(mackjmr): remove once support for annotations is removed.
+		// the otel-agent feature adds these ports if none are supplied by
+		// the user.
 		Ports: []corev1.ContainerPort{
 			{
-				Name:          "grpc",
+				Name:          "otel-grpc",
 				ContainerPort: 4317,
 				HostPort:      4317,
 				Protocol:      corev1.ProtocolTCP,
 			},
 			{
-				Name:          "http",
+				Name:          "otel-http",
 				ContainerPort: 4318,
 				HostPort:      4318,
 				Protocol:      corev1.ProtocolTCP,
@@ -234,7 +245,7 @@ func securityAgentContainer(dda metav1.Object) corev1.Container {
 		Image: agentImage(),
 		Command: []string{
 			"security-agent",
-			"start", fmt.Sprintf("-c=%s", apicommon.AgentCustomConfigVolumePath),
+			"start", fmt.Sprintf("-c=%s", v2alpha1.AgentCustomConfigVolumePath),
 		},
 		Env:          envVarsForSecurityAgent(dda),
 		VolumeMounts: volumeMountsForSecurityAgent(),
@@ -247,14 +258,14 @@ func systemProbeContainer(dda metav1.Object) corev1.Container {
 		Image: agentImage(),
 		Command: []string{
 			"system-probe",
-			fmt.Sprintf("--config=%s", apicommon.SystemProbeConfigVolumePath),
+			fmt.Sprintf("--config=%s", v2alpha1.SystemProbeConfigVolumePath),
 		},
 		Env:          commonEnvVars(dda),
 		VolumeMounts: volumeMountsForSystemProbe(),
 		SecurityContext: &corev1.SecurityContext{
 			SeccompProfile: &corev1.SeccompProfile{
 				Type:             corev1.SeccompProfileTypeLocalhost,
-				LocalhostProfile: apiutils.NewStringPointer(apicommon.SystemProbeSeccompProfileName),
+				LocalhostProfile: apiutils.NewStringPointer(v2alpha1.SystemProbeSeccompProfileName),
 			},
 		},
 	}
@@ -267,7 +278,7 @@ func agentDataPlaneContainer(dda metav1.Object) corev1.Container {
 		Command: []string{
 			"agent-data-plane",
 			"run",
-			fmt.Sprintf("--config=%s", apicommon.AgentCustomConfigVolumePath),
+			fmt.Sprintf("--config=%s", v2alpha1.AgentCustomConfigVolumePath),
 		},
 		Env:            commonEnvVars(dda),
 		VolumeMounts:   volumeMountsForAgentDataPlane(),
@@ -284,7 +295,7 @@ func initVolumeContainer() corev1.Container {
 		Args:    []string{"cp -vnr /etc/datadog-agent /opt"},
 		VolumeMounts: []corev1.VolumeMount{
 			{
-				Name:      apicommon.ConfigVolumeName,
+				Name:      v2alpha1.ConfigVolumeName,
 				MountPath: "/opt/datadog-agent",
 			},
 		},
@@ -310,8 +321,8 @@ func initSeccompSetupContainer() corev1.Container {
 		Image: agentImage(),
 		Command: []string{
 			"cp",
-			fmt.Sprintf("%s/%s", apicommon.SeccompSecurityVolumePath, apicommon.SystemProbeSeccompKey),
-			fmt.Sprintf("%s/%s", apicommon.SeccompRootVolumePath, apicommon.SystemProbeSeccompProfileName),
+			fmt.Sprintf("%s/%s", v2alpha1.SeccompSecurityVolumePath, v2alpha1.SystemProbeSeccompKey),
+			fmt.Sprintf("%s/%s", v2alpha1.SeccompRootVolumePath, v2alpha1.SystemProbeSeccompProfileName),
 		},
 		VolumeMounts: volumeMountsForSeccompSetup(),
 	}
@@ -320,26 +331,26 @@ func initSeccompSetupContainer() corev1.Container {
 func commonEnvVars(dda metav1.Object) []corev1.EnvVar {
 	return []corev1.EnvVar{
 		{
-			Name:  apicommon.KubernetesEnvVar,
+			Name:  v2alpha1.KubernetesEnvVar,
 			Value: "yes",
 		},
 		{
-			Name:  apicommon.DDClusterAgentEnabled,
+			Name:  v2alpha1.DDClusterAgentEnabled,
 			Value: strconv.FormatBool(true),
 		},
 		{
-			Name:  apicommon.DDClusterAgentKubeServiceName,
+			Name:  v2alpha1.DDClusterAgentKubeServiceName,
 			Value: componentdca.GetClusterAgentServiceName(dda),
 		},
 		{
-			Name:  apicommon.DDClusterAgentTokenName,
+			Name:  v2alpha1.DDClusterAgentTokenName,
 			Value: v2alpha1.GetDefaultDCATokenSecretName(dda),
 		},
 		{
-			Name: apicommon.DDKubeletHost,
+			Name: v2alpha1.DDKubeletHost,
 			ValueFrom: &corev1.EnvVarSource{
 				FieldRef: &corev1.ObjectFieldSelector{
-					FieldPath: apicommon.FieldPathStatusHostIP,
+					FieldPath: v2alpha1.FieldPathStatusHostIP,
 				},
 			},
 		},
@@ -349,18 +360,18 @@ func commonEnvVars(dda metav1.Object) []corev1.EnvVar {
 func envVarsForCoreAgent(dda metav1.Object) []corev1.EnvVar {
 	envs := []corev1.EnvVar{
 		{
-			Name:  apicommon.DDHealthPort,
+			Name:  v2alpha1.DDHealthPort,
 			Value: strconv.Itoa(int(v2alpha1.DefaultAgentHealthPort)),
 		},
 		{
-			Name:  apicommon.DDLeaderElection,
-			Value: apicommon.EnvVarTrueValue,
+			Name:  v2alpha1.DDLeaderElection,
+			Value: "true",
 		},
 		{
 			// we want to default it in 7.49.0
 			// but in 7.50.0 it will be already defaulted in the agent process.
-			Name:  apicommon.DDContainerImageEnabled,
-			Value: apicommon.EnvVarTrueValue,
+			Name:  v2alpha1.DDContainerImageEnabled,
+			Value: "true",
 		},
 	}
 
@@ -370,15 +381,15 @@ func envVarsForCoreAgent(dda metav1.Object) []corev1.EnvVar {
 func envVarsForTraceAgent(dda metav1.Object) []corev1.EnvVar {
 	envs := []corev1.EnvVar{
 		{
-			Name:  apicommon.DDAPMInstrumentationInstallId,
+			Name:  v2alpha1.DDAPMInstrumentationInstallId,
 			Value: utils.GetDatadogAgentResourceUID(dda),
 		},
 		{
-			Name:  apicommon.DDAPMInstrumentationInstallTime,
+			Name:  v2alpha1.DDAPMInstrumentationInstallTime,
 			Value: utils.GetDatadogAgentResourceCreationTime(dda),
 		},
 		{
-			Name:  apicommon.DDAPMInstrumentationInstallType,
+			Name:  v2alpha1.DDAPMInstrumentationInstallType,
 			Value: common.DefaultAgentInstallType,
 		},
 	}
@@ -390,21 +401,13 @@ func envVarsForSecurityAgent(dda metav1.Object) []corev1.EnvVar {
 	envs := []corev1.EnvVar{
 		{
 			Name:  "HOST_ROOT",
-			Value: apicommon.HostRootMountPath,
+			Value: v2alpha1.HostRootMountPath,
 		},
 	}
 
 	return append(envs, commonEnvVars(dda)...)
 }
 
-func envVarsForOtelAgent(dda metav1.Object) []corev1.EnvVar {
-	envs := []corev1.EnvVar{
-		// TODO: add additional env vars here
-	}
-
-	return append(envs, commonEnvVars(dda)...)
-}
-
 func volumeMountsForInitConfig() []corev1.VolumeMount {
 	return []corev1.VolumeMount{
 		common.GetVolumeMountForLogs(),
@@ -507,13 +510,9 @@ func volumeMountsForSeccompSetup() []corev1.VolumeMount {
 
 func volumeMountsForOtelAgent() []corev1.VolumeMount {
 	return []corev1.VolumeMount{
-		// TODO: add/remove volume mounts
 		common.GetVolumeMountForLogs(),
-		common.GetVolumeMountForAuth(true),
 		common.GetVolumeMountForConfig(),
-		common.GetVolumeMountForDogstatsdSocket(false),
-		common.GetVolumeMountForRuntimeSocket(true),
-		common.GetVolumeMountForProc(),
+		common.GetVolumeMountForAuth(true),
 	}
 }
 
diff --git a/internal/controller/datadogagent/component/clusteragent/default.go b/internal/controller/datadogagent/component/clusteragent/default.go
index 73503a86..4742536a 100644
--- a/internal/controller/datadogagent/component/clusteragent/default.go
+++ b/internal/controller/datadogagent/component/clusteragent/default.go
@@ -151,7 +151,7 @@ func defaultPodSpec(dda metav1.Object, volumes []corev1.Volume, volumeMounts []c
 func defaultEnvVars(dda metav1.Object) []corev1.EnvVar {
 	envVars := []corev1.EnvVar{
 		{
-			Name: apicommon.DDPodName,
+			Name: v2alpha1.DDPodName,
 			ValueFrom: &corev1.EnvVarSource{
 				FieldRef: &corev1.ObjectFieldSelector{
 					FieldPath: "metadata.name",
@@ -159,36 +159,36 @@ func defaultEnvVars(dda metav1.Object) []corev1.EnvVar {
 			},
 		},
 		{
-			Name:  apicommon.DDClusterAgentKubeServiceName,
+			Name:  v2alpha1.DDClusterAgentKubeServiceName,
 			Value: GetClusterAgentServiceName(dda),
 		},
 		{
-			Name:  apicommon.DDKubeResourcesNamespace,
+			Name:  v2alpha1.DDKubeResourcesNamespace,
 			Value: utils.GetDatadogAgentResourceNamespace(dda),
 		},
 		{
-			Name:  apicommon.DDLeaderElection,
+			Name:  v2alpha1.DDLeaderElection,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDHealthPort,
+			Name:  v2alpha1.DDHealthPort,
 			Value: strconv.Itoa(int(v2alpha1.DefaultAgentHealthPort)),
 		},
 		{
-			Name:  apicommon.DDAPMInstrumentationInstallId,
+			Name:  v2alpha1.DDAPMInstrumentationInstallId,
 			Value: utils.GetDatadogAgentResourceUID(dda),
 		},
 		{
-			Name:  apicommon.DDAPMInstrumentationInstallTime,
+			Name:  v2alpha1.DDAPMInstrumentationInstallTime,
 			Value: utils.GetDatadogAgentResourceCreationTime(dda),
 		},
 		{
-			Name:  apicommon.DDAPMInstrumentationInstallType,
+			Name:  v2alpha1.DDAPMInstrumentationInstallType,
 			Value: common.DefaultAgentInstallType,
 		},
 		{
-			Name:  apicommon.DDAuthTokenFilePath,
-			Value: filepath.Join(apicommon.AuthVolumePath, "token"),
+			Name:  v2alpha1.DDAuthTokenFilePath,
+			Value: filepath.Join(v2alpha1.AuthVolumePath, "token"),
 		},
 	}
 
diff --git a/internal/controller/datadogagent/component/clusteragent/utils.go b/internal/controller/datadogagent/component/clusteragent/utils.go
index b608c621..1f3db4d3 100644
--- a/internal/controller/datadogagent/component/clusteragent/utils.go
+++ b/internal/controller/datadogagent/component/clusteragent/utils.go
@@ -13,9 +13,11 @@ import (
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/object"
 	"github.com/DataDog/datadog-operator/pkg/controller/utils/comparison"
+	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	corev1 "k8s.io/api/core/v1"
 	policyv1 "k8s.io/api/policy/v1"
+	policyv1beta1 "k8s.io/api/policy/v1beta1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 	"k8s.io/apimachinery/pkg/version"
@@ -58,13 +60,27 @@ func GetClusterAgentService(dda metav1.Object) *corev1.Service {
 	return service
 }
 
-func GetClusterAgentPodDisruptionBudget(dda metav1.Object) *policyv1.PodDisruptionBudget {
+func GetClusterAgentPodDisruptionBudget(dda metav1.Object, useV1BetaPDB bool) client.Object {
 	// labels and annotations
 	minAvailableStr := intstr.FromInt(pdbMinAvailableInstances)
 	matchLabels := map[string]string{
 		apicommon.AgentDeploymentNameLabelKey:      dda.GetName(),
 		apicommon.AgentDeploymentComponentLabelKey: v2alpha1.DefaultClusterAgentResourceSuffix}
-	pdb := &policyv1.PodDisruptionBudget{
+	if useV1BetaPDB {
+		return &policyv1beta1.PodDisruptionBudget{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      GetClusterAgentPodDisruptionBudgetName(dda),
+				Namespace: dda.GetNamespace(),
+			},
+			Spec: policyv1beta1.PodDisruptionBudgetSpec{
+				MinAvailable: &minAvailableStr,
+				Selector: &metav1.LabelSelector{
+					MatchLabels: matchLabels,
+				},
+			},
+		}
+	}
+	return &policyv1.PodDisruptionBudget{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      GetClusterAgentPodDisruptionBudgetName(dda),
 			Namespace: dda.GetNamespace(),
@@ -76,7 +92,6 @@ func GetClusterAgentPodDisruptionBudget(dda metav1.Object) *policyv1.PodDisrupti
 			},
 		},
 	}
-	return pdb
 }
 
 // GetMetricsServerServiceName returns the external metrics provider service name
@@ -86,7 +101,7 @@ func GetMetricsServerServiceName(dda metav1.Object) string {
 
 // GetMetricsServerAPIServiceName returns the external metrics provider apiservice name
 func GetMetricsServerAPIServiceName() string {
-	return apicommon.ExternalMetricsAPIServiceName
+	return v2alpha1.ExternalMetricsAPIServiceName
 }
 
 // GetDefaultExternalMetricSecretName returns the external metrics provider secret name
diff --git a/internal/controller/datadogagent/component/clusterchecksrunner/default.go b/internal/controller/datadogagent/component/clusterchecksrunner/default.go
index f554834d..13a85b1e 100644
--- a/internal/controller/datadogagent/component/clusterchecksrunner/default.go
+++ b/internal/controller/datadogagent/component/clusterchecksrunner/default.go
@@ -12,8 +12,10 @@ import (
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	policyv1 "k8s.io/api/policy/v1"
+	policyv1beta1 "k8s.io/api/policy/v1beta1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
+	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
@@ -92,12 +94,26 @@ func GetClusterChecksRunnerPodDisruptionBudgetName(dda metav1.Object) string {
 	return fmt.Sprintf("%s-%s-pdb", dda.GetName(), v2alpha1.DefaultClusterChecksRunnerResourceSuffix)
 }
 
-func GetClusterChecksRunnerPodDisruptionBudget(dda metav1.Object) *policyv1.PodDisruptionBudget {
+func GetClusterChecksRunnerPodDisruptionBudget(dda metav1.Object, useV1BetaPDB bool) client.Object {
 	maxUnavailableStr := intstr.FromInt(pdbMaxUnavailableInstances)
 	matchLabels := map[string]string{
 		apicommon.AgentDeploymentNameLabelKey:      dda.GetName(),
 		apicommon.AgentDeploymentComponentLabelKey: v2alpha1.DefaultClusterChecksRunnerResourceSuffix}
-	pdb := &policyv1.PodDisruptionBudget{
+	if useV1BetaPDB {
+		return &policyv1beta1.PodDisruptionBudget{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      GetClusterChecksRunnerPodDisruptionBudgetName(dda),
+				Namespace: dda.GetNamespace(),
+			},
+			Spec: policyv1beta1.PodDisruptionBudgetSpec{
+				MaxUnavailable: &maxUnavailableStr,
+				Selector: &metav1.LabelSelector{
+					MatchLabels: matchLabels,
+				},
+			},
+		}
+	}
+	return &policyv1.PodDisruptionBudget{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      GetClusterChecksRunnerPodDisruptionBudgetName(dda),
 			Namespace: dda.GetNamespace(),
@@ -109,7 +125,6 @@ func GetClusterChecksRunnerPodDisruptionBudget(dda metav1.Object) *policyv1.PodD
 			},
 		},
 	}
-	return pdb
 }
 
 // getDefaultServiceAccountName return the default Cluster-Agent ServiceAccountName
@@ -167,70 +182,70 @@ func defaultPodSpec(dda metav1.Object, volumes []corev1.Volume, volumeMounts []c
 func defaultEnvVars(dda metav1.Object) []corev1.EnvVar {
 	envVars := []corev1.EnvVar{
 		{
-			Name:  apicommon.DDClusterAgentKubeServiceName,
+			Name:  v2alpha1.DDClusterAgentKubeServiceName,
 			Value: componentdca.GetClusterAgentServiceName(dda),
 		},
 		{
-			Name:  apicommon.DDClusterAgentEnabled,
+			Name:  v2alpha1.DDClusterAgentEnabled,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDHealthPort,
+			Name:  v2alpha1.DDHealthPort,
 			Value: strconv.Itoa(int(v2alpha1.DefaultAgentHealthPort)),
 		},
 		{
-			Name:  apicommon.KubernetesEnvVar,
+			Name:  v2alpha1.KubernetesEnvVar,
 			Value: "yes",
 		},
 		{
-			Name:  apicommon.DDEnableMetadataCollection,
+			Name:  v2alpha1.DDEnableMetadataCollection,
 			Value: "false",
 		},
 		{
-			Name:  apicommon.DDClcRunnerEnabled,
+			Name:  v2alpha1.DDClcRunnerEnabled,
 			Value: "true",
 		},
 		{
-			Name: apicommon.DDClcRunnerHost,
+			Name: v2alpha1.DDClcRunnerHost,
 			ValueFrom: &corev1.EnvVarSource{
 				FieldRef: &corev1.ObjectFieldSelector{
-					FieldPath: apicommon.FieldPathStatusPodIP,
+					FieldPath: v2alpha1.FieldPathStatusPodIP,
 				},
 			},
 		},
 		{
-			Name: apicommon.DDClcRunnerID,
+			Name: v2alpha1.DDClcRunnerID,
 			ValueFrom: &corev1.EnvVarSource{
 				FieldRef: &corev1.ObjectFieldSelector{
-					FieldPath: apicommon.FieldPathMetaName,
+					FieldPath: v2alpha1.FieldPathMetaName,
 				},
 			},
 		},
 		{
-			Name:  apicommon.DDDogstatsdEnabled,
+			Name:  v2alpha1.DDDogstatsdEnabled,
 			Value: "false",
 		},
 		{
-			Name:  apicommon.DDProcessCollectionEnabled,
+			Name:  v2alpha1.DDProcessCollectionEnabled,
 			Value: "false",
 		},
 		{
-			Name:  apicommon.DDContainerCollectionEnabled,
+			Name:  v2alpha1.DDContainerCollectionEnabled,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDLogsEnabled,
+			Name:  v2alpha1.DDLogsEnabled,
 			Value: "false",
 		},
 		{
-			Name:  apicommon.DDAPMEnabled,
+			Name:  v2alpha1.DDAPMEnabled,
 			Value: "false",
 		},
 		{
-			Name: apicommon.DDHostname,
+			Name: v2alpha1.DDHostname,
 			ValueFrom: &corev1.EnvVarSource{
 				FieldRef: &corev1.ObjectFieldSelector{
-					FieldPath: apicommon.FieldPathSpecNodeName,
+					FieldPath: v2alpha1.FieldPathSpecNodeName,
 				},
 			},
 		},
diff --git a/internal/controller/datadogagent/controller.go b/internal/controller/datadogagent/controller.go
index d498e6be..7c29bdd3 100644
--- a/internal/controller/datadogagent/controller.go
+++ b/internal/controller/datadogagent/controller.go
@@ -42,6 +42,7 @@ import (
 	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/npm"
 	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/oomkill"
 	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/orchestratorexplorer"
+	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/otelcollector"
 	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/otlp"
 	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/processdiscovery"
 	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/prometheusscrape"
@@ -63,7 +64,6 @@ type ReconcilerOptions struct {
 	OperatorMetricsEnabled     bool
 	IntrospectionEnabled       bool
 	DatadogAgentProfileEnabled bool
-	OtelAgentEnabled           bool
 }
 
 // Reconciler is the internal reconciler for Datadog Agent
@@ -107,7 +107,6 @@ func reconcilerOptionsToFeatureOptions(opts *ReconcilerOptions, logger logr.Logg
 	return &feature.Options{
 		SupportExtendedDaemonset: opts.ExtendedDaemonsetOptions.Enabled,
 		Logger:                   logger,
-		OtelAgentEnabled:         opts.OtelAgentEnabled,
 	}
 }
 
diff --git a/internal/controller/datadogagent/controller_reconcile_agent.go b/internal/controller/datadogagent/controller_reconcile_agent.go
index 26b85667..ca0114b7 100644
--- a/internal/controller/datadogagent/controller_reconcile_agent.go
+++ b/internal/controller/datadogagent/controller_reconcile_agent.go
@@ -92,7 +92,7 @@ func (r *Reconciler) reconcileV2Agent(logger logr.Logger, requiredComponents fea
 			overrideFromProvider := kubernetes.ComponentOverrideFromProvider(overrideName, provider, providerList)
 			componentOverrides = append(componentOverrides, &overrideFromProvider)
 		} else {
-			eds.Labels[apicommon.MD5AgentDeploymentProviderLabelKey] = kubernetes.LegacyProvider
+			eds.Labels[datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey] = kubernetes.LegacyProvider
 		}
 
 		for _, componentOverride := range componentOverrides {
@@ -167,7 +167,7 @@ func (r *Reconciler) reconcileV2Agent(logger logr.Logger, requiredComponents fea
 		overrideFromProvider := kubernetes.ComponentOverrideFromProvider(overrideName, provider, providerList)
 		componentOverrides = append(componentOverrides, &overrideFromProvider)
 	} else {
-		daemonset.Labels[apicommon.MD5AgentDeploymentProviderLabelKey] = kubernetes.LegacyProvider
+		daemonset.Labels[datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey] = kubernetes.LegacyProvider
 	}
 
 	for _, componentOverride := range componentOverrides {
diff --git a/internal/controller/datadogagent/feature/admissioncontroller/envvar.go b/internal/controller/datadogagent/feature/admissioncontroller/envvar.go
new file mode 100644
index 00000000..da94b900
--- /dev/null
+++ b/internal/controller/datadogagent/feature/admissioncontroller/envvar.go
@@ -0,0 +1,32 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package admissioncontroller
+
+const (
+	DDAdmissionControllerAgentSidecarEnabled              = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_ENABLED"
+	DDAdmissionControllerAgentSidecarClusterAgentEnabled  = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_CLUSTER_AGENT_ENABLED"
+	DDAdmissionControllerAgentSidecarProvider             = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_PROVIDER"
+	DDAdmissionControllerAgentSidecarRegistry             = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_CONTAINER_REGISTRY"
+	DDAdmissionControllerAgentSidecarImageName            = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_IMAGE_NAME"
+	DDAdmissionControllerAgentSidecarImageTag             = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_IMAGE_TAG"
+	DDAdmissionControllerAgentSidecarSelectors            = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_SELECTORS"
+	DDAdmissionControllerAgentSidecarProfiles             = "DD_ADMISSION_CONTROLLER_AGENT_SIDECAR_PROFILES"
+	DDAdmissionControllerEnabled                          = "DD_ADMISSION_CONTROLLER_ENABLED"
+	DDAdmissionControllerValidationEnabled                = "DD_ADMISSION_CONTROLLER_VALIDATION_ENABLED"
+	DDAdmissionControllerMutationEnabled                  = "DD_ADMISSION_CONTROLLER_MUTATION_ENABLED"
+	DDAdmissionControllerInjectConfig                     = "DD_ADMISSION_CONTROLLER_INJECT_CONFIG_ENABLED"
+	DDAdmissionControllerInjectConfigMode                 = "DD_ADMISSION_CONTROLLER_INJECT_CONFIG_MODE"
+	DDAdmissionControllerInjectTags                       = "DD_ADMISSION_CONTROLLER_INJECT_TAGS_ENABLED"
+	DDAdmissionControllerLocalServiceName                 = "DD_ADMISSION_CONTROLLER_INJECT_CONFIG_LOCAL_SERVICE_NAME"
+	DDAdmissionControllerMutateUnlabelled                 = "DD_ADMISSION_CONTROLLER_MUTATE_UNLABELLED"
+	DDAdmissionControllerServiceName                      = "DD_ADMISSION_CONTROLLER_SERVICE_NAME"
+	DDAdmissionControllerFailurePolicy                    = "DD_ADMISSION_CONTROLLER_FAILURE_POLICY"
+	DDAdmissionControllerWebhookName                      = "DD_ADMISSION_CONTROLLER_WEBHOOK_NAME"
+	DDAdmissionControllerRegistryName                     = "DD_ADMISSION_CONTROLLER_CONTAINER_REGISTRY"
+	DDAdmissionControllerCWSInstrumentationEnabled        = "DD_ADMISSION_CONTROLLER_CWS_INSTRUMENTATION_ENABLED"
+	DDAdmissionControllerCWSInstrumentationMode           = "DD_ADMISSION_CONTROLLER_CWS_INSTRUMENTATION_MODE"
+	DDAdmissionControllerKubernetesAdmissionEventsEnabled = "DD_ADMISSION_CONTROLLER_KUBERNETES_ADMISSION_EVENTS_ENABLED"
+)
diff --git a/internal/controller/datadogagent/feature/admissioncontroller/feature.go b/internal/controller/datadogagent/feature/admissioncontroller/feature.go
index 3bf2ce50..f2720a2f 100644
--- a/internal/controller/datadogagent/feature/admissioncontroller/feature.go
+++ b/internal/controller/datadogagent/feature/admissioncontroller/feature.go
@@ -48,6 +48,8 @@ type admissionControllerFeature struct {
 
 	cwsInstrumentationEnabled bool
 	cwsInstrumentationMode    string
+
+	kubernetesAdmissionEvents *KubernetesAdmissionEventConfig
 }
 
 type ValidationConfig struct {
@@ -69,6 +71,10 @@ type AgentSidecarInjectionConfig struct {
 	profiles                         []*v2alpha1.Profile
 }
 
+type KubernetesAdmissionEventConfig struct {
+	enabled bool
+}
+
 func buildAdmissionControllerFeature(options *feature.Options) feature.Feature {
 	return &admissionControllerFeature{}
 }
@@ -140,6 +146,10 @@ func (f *admissionControllerFeature) Configure(dda *v2alpha1.DatadogAgent) (reqC
 			f.cwsInstrumentationMode = apiutils.StringValue(ac.CWSInstrumentation.Mode)
 		}
 
+		if ac.KubernetesAdmissionEvents != nil && apiutils.BoolValue(ac.KubernetesAdmissionEvents.Enabled) {
+			f.kubernetesAdmissionEvents = &KubernetesAdmissionEventConfig{enabled: true}
+		}
+
 		_, f.networkPolicy = v2alpha1.IsNetworkPolicyEnabled(dda)
 
 		sidecarConfig := dda.Spec.Features.AdmissionController.AgentSidecarInjection
@@ -308,111 +318,118 @@ func (f *admissionControllerFeature) ManageDependencies(managers feature.Resourc
 
 func (f *admissionControllerFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error {
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDAdmissionControllerEnabled,
+		Name:  DDAdmissionControllerEnabled,
 		Value: "true",
 	})
 
 	if f.validationWebhookConfig != nil {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerValidationEnabled,
+			Name:  DDAdmissionControllerValidationEnabled,
 			Value: apiutils.BoolToString(&f.validationWebhookConfig.enabled),
 		})
 	}
 
 	if f.mutationWebhookConfig != nil {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerMutationEnabled,
+			Name:  DDAdmissionControllerMutationEnabled,
 			Value: apiutils.BoolToString(&f.mutationWebhookConfig.enabled),
 		})
 	}
 
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDAdmissionControllerMutateUnlabelled,
+		Name:  DDAdmissionControllerMutateUnlabelled,
 		Value: apiutils.BoolToString(&f.mutateUnlabelled),
 	})
 
 	if f.registry != "" {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerRegistryName,
+			Name:  DDAdmissionControllerRegistryName,
 			Value: f.registry,
 		})
 	}
 
 	if f.serviceName != "" {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerServiceName,
+			Name:  DDAdmissionControllerServiceName,
 			Value: f.serviceName,
 		})
 	}
 
 	if f.cwsInstrumentationEnabled {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerCWSInstrumentationEnabled,
+			Name:  DDAdmissionControllerCWSInstrumentationEnabled,
 			Value: apiutils.BoolToString(&f.cwsInstrumentationEnabled),
 		})
 
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerCWSInstrumentationMode,
+			Name:  DDAdmissionControllerCWSInstrumentationMode,
 			Value: f.cwsInstrumentationMode,
 		})
 	}
 
+	if f.kubernetesAdmissionEvents != nil {
+		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
+			Name:  DDAdmissionControllerKubernetesAdmissionEventsEnabled,
+			Value: apiutils.BoolToString(&f.kubernetesAdmissionEvents.enabled),
+		})
+	}
+
 	if f.agentCommunicationMode != "" {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerInjectConfigMode,
+			Name:  DDAdmissionControllerInjectConfigMode,
 			Value: f.agentCommunicationMode,
 		})
 	}
 
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDAdmissionControllerLocalServiceName,
+		Name:  DDAdmissionControllerLocalServiceName,
 		Value: f.localServiceName,
 	})
 
 	if f.failurePolicy != "" {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerFailurePolicy,
+			Name:  DDAdmissionControllerFailurePolicy,
 			Value: f.failurePolicy,
 		})
 	}
 
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDAdmissionControllerWebhookName,
+		Name:  DDAdmissionControllerWebhookName,
 		Value: f.webhookName,
 	})
 
 	if f.agentSidecarConfig != nil {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerAgentSidecarEnabled,
+			Name:  DDAdmissionControllerAgentSidecarEnabled,
 			Value: apiutils.BoolToString(&f.agentSidecarConfig.enabled),
 		})
 
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerAgentSidecarClusterAgentEnabled,
+			Name:  DDAdmissionControllerAgentSidecarClusterAgentEnabled,
 			Value: apiutils.BoolToString(&f.agentSidecarConfig.clusterAgentCommunicationEnabled),
 		})
 		if f.agentSidecarConfig.provider != "" {
 			managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDAdmissionControllerAgentSidecarProvider,
+				Name:  DDAdmissionControllerAgentSidecarProvider,
 				Value: f.agentSidecarConfig.provider,
 			})
 		}
 		if f.agentSidecarConfig.registry != "" {
 			managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDAdmissionControllerAgentSidecarRegistry,
+				Name:  DDAdmissionControllerAgentSidecarRegistry,
 				Value: f.agentSidecarConfig.registry,
 			})
 		}
 
 		if f.agentSidecarConfig.imageName != "" {
 			managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDAdmissionControllerAgentSidecarImageName,
+				Name:  DDAdmissionControllerAgentSidecarImageName,
 				Value: f.agentSidecarConfig.imageName,
 			})
 		}
 		if f.agentSidecarConfig.imageTag != "" {
 			managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDAdmissionControllerAgentSidecarImageTag,
+				Name:  DDAdmissionControllerAgentSidecarImageTag,
 				Value: f.agentSidecarConfig.imageTag,
 			})
 		}
@@ -423,7 +440,7 @@ func (f *admissionControllerFeature) ManageClusterAgent(managers feature.PodTemp
 				return err
 			}
 			managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDAdmissionControllerAgentSidecarSelectors,
+				Name:  DDAdmissionControllerAgentSidecarSelectors,
 				Value: string(selectorsJSON),
 			})
 		}
@@ -434,7 +451,7 @@ func (f *admissionControllerFeature) ManageClusterAgent(managers feature.PodTemp
 				return err
 			}
 			managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDAdmissionControllerAgentSidecarProfiles,
+				Name:  DDAdmissionControllerAgentSidecarProfiles,
 				Value: string(profilesJSON),
 			})
 		}
diff --git a/internal/controller/datadogagent/feature/apm/envvar.go b/internal/controller/datadogagent/feature/apm/envvar.go
new file mode 100644
index 00000000..1eba11cd
--- /dev/null
+++ b/internal/controller/datadogagent/feature/apm/envvar.go
@@ -0,0 +1,17 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package apm
+
+const (
+	DDAPMNonLocalTraffic                   = "DD_APM_NON_LOCAL_TRAFFIC"
+	DDAPMReceiverPort                      = "DD_APM_RECEIVER_PORT"
+	DDAPMReceiverSocket                    = "DD_APM_RECEIVER_SOCKET"
+	DDAPMInstrumentationEnabled            = "DD_APM_INSTRUMENTATION_ENABLED"
+	DDAPMInstrumentationEnabledNamespaces  = "DD_APM_INSTRUMENTATION_ENABLED_NAMESPACES"
+	DDAPMInstrumentationDisabledNamespaces = "DD_APM_INSTRUMENTATION_DISABLED_NAMESPACES"
+	DDAPMInstrumentationLibVersions        = "DD_APM_INSTRUMENTATION_LIB_VERSIONS"
+	DDLanguageDetectionEnabled             = "DD_LANGUAGE_DETECTION_ENABLED"
+)
diff --git a/internal/controller/datadogagent/feature/apm/feature.go b/internal/controller/datadogagent/feature/apm/feature.go
index 0c5e57d8..0390dbc2 100644
--- a/internal/controller/datadogagent/feature/apm/feature.go
+++ b/internal/controller/datadogagent/feature/apm/feature.go
@@ -267,13 +267,13 @@ func (f *apmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) er
 			return fmt.Errorf("`spec.features.apm.instrumentation.enabledNamespaces` and `spec.features.apm.instrumentation.disabledNamespaces` cannot be set together")
 		}
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAPMInstrumentationEnabled,
+			Name:  DDAPMInstrumentationEnabled,
 			Value: apiutils.BoolToString(&f.singleStepInstrumentation.enabled),
 		})
 
 		if f.shouldEnableLanguageDetection() {
 			managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDLanguageDetectionEnabled,
+				Name:  DDLanguageDetectionEnabled,
 				Value: "true",
 			})
 		}
@@ -284,7 +284,7 @@ func (f *apmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) er
 				return err
 			}
 			managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDAPMInstrumentationDisabledNamespaces,
+				Name:  DDAPMInstrumentationDisabledNamespaces,
 				Value: string(ns),
 			})
 		}
@@ -294,7 +294,7 @@ func (f *apmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) er
 				return err
 			}
 			managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDAPMInstrumentationEnabledNamespaces,
+				Name:  DDAPMInstrumentationEnabledNamespaces,
 				Value: string(ns),
 			})
 		}
@@ -304,7 +304,7 @@ func (f *apmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) er
 				return err
 			}
 			managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDAPMInstrumentationLibVersions,
+				Name:  DDAPMInstrumentationLibVersions,
 				Value: string(libs),
 			})
 		}
@@ -331,7 +331,7 @@ func (f *apmFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 func (f *apmFeature) manageNodeAgent(agentContainerName apicommon.AgentContainerName, managers feature.PodTemplateManagers, provider string) error {
 
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDAPMEnabled,
+		Name:  v2alpha1.DDAPMEnabled,
 		Value: "true",
 	})
 
@@ -350,11 +350,11 @@ func (f *apmFeature) manageNodeAgent(agentContainerName apicommon.AgentContainer
 			receiverPortEnvVarValue = int(f.hostPortHostPort)
 		}
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAPMNonLocalTraffic,
+			Name:  DDAPMNonLocalTraffic,
 			Value: "true",
 		})
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAPMReceiverPort,
+			Name:  DDAPMReceiverPort,
 			Value: strconv.Itoa(receiverPortEnvVarValue),
 		})
 	}
@@ -365,19 +365,19 @@ func (f *apmFeature) manageNodeAgent(agentContainerName apicommon.AgentContainer
 
 		// Enable language detection in core agent
 		managers.EnvVar().AddEnvVarToContainer(apicommon.CoreAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDLanguageDetectionEnabled,
+			Name:  DDLanguageDetectionEnabled,
 			Value: "true",
 		})
 
 		// Enable language detection in process agent
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ProcessAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDLanguageDetectionEnabled,
+			Name:  DDLanguageDetectionEnabled,
 			Value: "true",
 		})
 
 		// Always add this envvar to Core and Process containers
 		runInCoreAgentEnvVar := &corev1.EnvVar{
-			Name:  apicommon.DDProcessConfigRunInCoreAgent,
+			Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 			Value: apiutils.BoolToString(&f.processCheckRunsInCoreAgent),
 		}
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ProcessAgentContainerName, runInCoreAgentEnvVar)
@@ -389,7 +389,7 @@ func (f *apmFeature) manageNodeAgent(agentContainerName apicommon.AgentContainer
 		udsHostFolder := filepath.Dir(f.udsHostFilepath)
 		sockName := filepath.Base(f.udsHostFilepath)
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAPMReceiverSocket,
+			Name:  DDAPMReceiverSocket,
 			Value: filepath.Join(apmSocketVolumeLocalPath, sockName),
 		})
 		socketVol, socketVolMount := volume.GetVolumes(apmSocketVolumeName, udsHostFolder, apmSocketVolumeLocalPath, false)
diff --git a/internal/controller/datadogagent/feature/asm/envvar.go b/internal/controller/datadogagent/feature/asm/envvar.go
new file mode 100644
index 00000000..9b1d78d3
--- /dev/null
+++ b/internal/controller/datadogagent/feature/asm/envvar.go
@@ -0,0 +1,12 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package asm
+
+const (
+	DDAdmissionControllerAppsecEnabled    = "DD_ADMISSION_CONTROLLER_AUTO_INSTRUMENTATION_APPSEC_ENABLED"
+	DDAdmissionControllerAppsecSCAEnabled = "DD_ADMISSION_CONTROLLER_AUTO_INSTRUMENTATION_APPSEC_SCA_ENABLED"
+	DDAdmissionControllerIASTEnabled      = "DD_ADMISSION_CONTROLLER_AUTO_INSTRUMENTATION_IAST_ENABLED"
+)
diff --git a/internal/controller/datadogagent/feature/asm/feature.go b/internal/controller/datadogagent/feature/asm/feature.go
index 2f73a591..bc22dc85 100644
--- a/internal/controller/datadogagent/feature/asm/feature.go
+++ b/internal/controller/datadogagent/feature/asm/feature.go
@@ -83,7 +83,7 @@ func (f *asmFeature) ManageDependencies(_ feature.ResourceManagers, _ feature.Re
 func (f *asmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error {
 	if f.threatsEnabled {
 		if err := managers.EnvVar().AddEnvVarToContainerWithMergeFunc(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerAppsecEnabled,
+			Name:  DDAdmissionControllerAppsecEnabled,
 			Value: "true",
 		}, merger.IgnoreNewEnvVarMergeFunction); err != nil {
 			return err
@@ -92,7 +92,7 @@ func (f *asmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) er
 
 	if f.iastEnabled {
 		if err := managers.EnvVar().AddEnvVarToContainerWithMergeFunc(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerIASTEnabled,
+			Name:  DDAdmissionControllerIASTEnabled,
 			Value: "true",
 		}, merger.IgnoreNewEnvVarMergeFunction); err != nil {
 			return err
@@ -101,7 +101,7 @@ func (f *asmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) er
 
 	if f.scaEnabled {
 		if err := managers.EnvVar().AddEnvVarToContainerWithMergeFunc(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerAppsecSCAEnabled,
+			Name:  DDAdmissionControllerAppsecSCAEnabled,
 			Value: "true",
 		}, merger.IgnoreNewEnvVarMergeFunction); err != nil {
 			return err
diff --git a/internal/controller/datadogagent/feature/autoscaling/envvar.go b/internal/controller/datadogagent/feature/autoscaling/envvar.go
new file mode 100644
index 00000000..8eb8d740
--- /dev/null
+++ b/internal/controller/datadogagent/feature/autoscaling/envvar.go
@@ -0,0 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package autoscaling
+
+const DDAutoscalingWorkloadEnabled = "DD_AUTOSCALING_WORKLOAD_ENABLED"
diff --git a/internal/controller/datadogagent/feature/autoscaling/feature.go b/internal/controller/datadogagent/feature/autoscaling/feature.go
index 0c9a0d40..56b10792 100644
--- a/internal/controller/datadogagent/feature/autoscaling/feature.go
+++ b/internal/controller/datadogagent/feature/autoscaling/feature.go
@@ -85,7 +85,7 @@ func (f *autoscalingFeature) ManageDependencies(managers feature.ResourceManager
 // It should do nothing if the feature doesn't need to configure it.
 func (f *autoscalingFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error {
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDAutoscalingWorkloadEnabled,
+		Name:  DDAutoscalingWorkloadEnabled,
 		Value: "true",
 	})
 
diff --git a/internal/controller/datadogagent/feature/clusterchecks/const.go b/internal/controller/datadogagent/feature/clusterchecks/const.go
new file mode 100644
index 00000000..42342bb8
--- /dev/null
+++ b/internal/controller/datadogagent/feature/clusterchecks/const.go
@@ -0,0 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package clusterchecks
+
+const ClusterChecksConfigProvider = "clusterchecks"
diff --git a/internal/controller/datadogagent/feature/clusterchecks/envvar.go b/internal/controller/datadogagent/feature/clusterchecks/envvar.go
new file mode 100644
index 00000000..34d717b8
--- /dev/null
+++ b/internal/controller/datadogagent/feature/clusterchecks/envvar.go
@@ -0,0 +1,12 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package clusterchecks
+
+const (
+	DDClusterChecksEnabled = "DD_CLUSTER_CHECKS_ENABLED"
+	DDExtraConfigProviders = "DD_EXTRA_CONFIG_PROVIDERS"
+	DDExtraListeners       = "DD_EXTRA_LISTENERS"
+)
diff --git a/internal/controller/datadogagent/feature/clusterchecks/feature.go b/internal/controller/datadogagent/feature/clusterchecks/feature.go
index 168c56eb..e688aff2 100644
--- a/internal/controller/datadogagent/feature/clusterchecks/feature.go
+++ b/internal/controller/datadogagent/feature/clusterchecks/feature.go
@@ -140,7 +140,7 @@ func (f *clusterChecksFeature) ManageClusterAgent(managers feature.PodTemplateMa
 	managers.EnvVar().AddEnvVarToContainer(
 		apicommon.ClusterAgentContainerName,
 		&corev1.EnvVar{
-			Name:  apicommon.DDClusterChecksEnabled,
+			Name:  DDClusterChecksEnabled,
 			Value: "true",
 		},
 	)
@@ -148,7 +148,7 @@ func (f *clusterChecksFeature) ManageClusterAgent(managers feature.PodTemplateMa
 	managers.EnvVar().AddEnvVarToContainer(
 		apicommon.ClusterAgentContainerName,
 		&corev1.EnvVar{
-			Name:  apicommon.DDExtraConfigProviders,
+			Name:  DDExtraConfigProviders,
 			Value: v2alpha1.KubeServicesAndEndpointsConfigProviders,
 		},
 	)
@@ -156,7 +156,7 @@ func (f *clusterChecksFeature) ManageClusterAgent(managers feature.PodTemplateMa
 	managers.EnvVar().AddEnvVarToContainer(
 		apicommon.ClusterAgentContainerName,
 		&corev1.EnvVar{
-			Name:  apicommon.DDExtraListeners,
+			Name:  DDExtraListeners,
 			Value: v2alpha1.KubeServicesAndEndpointsListeners,
 		},
 	)
@@ -186,7 +186,7 @@ func (f *clusterChecksFeature) manageNodeAgent(agentContainerName apicommon.Agen
 		managers.EnvVar().AddEnvVarToContainer(
 			agentContainerName,
 			&corev1.EnvVar{
-				Name:  apicommon.DDExtraConfigProviders,
+				Name:  DDExtraConfigProviders,
 				Value: v2alpha1.EndpointsChecksConfigProvider,
 			},
 		)
@@ -194,7 +194,7 @@ func (f *clusterChecksFeature) manageNodeAgent(agentContainerName apicommon.Agen
 		managers.EnvVar().AddEnvVarToContainer(
 			agentContainerName,
 			&corev1.EnvVar{
-				Name:  apicommon.DDExtraConfigProviders,
+				Name:  DDExtraConfigProviders,
 				Value: v2alpha1.ClusterAndEndpointsConfigProviders,
 			},
 		)
@@ -208,7 +208,7 @@ func (f *clusterChecksFeature) ManageClusterChecksRunner(managers feature.PodTem
 		managers.EnvVar().AddEnvVarToContainer(
 			apicommon.ClusterChecksRunnersContainerName,
 			&corev1.EnvVar{
-				Name:  apicommon.DDClusterChecksEnabled,
+				Name:  DDClusterChecksEnabled,
 				Value: "true",
 			},
 		)
@@ -216,8 +216,8 @@ func (f *clusterChecksFeature) ManageClusterChecksRunner(managers feature.PodTem
 		managers.EnvVar().AddEnvVarToContainer(
 			apicommon.ClusterChecksRunnersContainerName,
 			&corev1.EnvVar{
-				Name:  apicommon.DDExtraConfigProviders,
-				Value: apicommon.ClusterChecksConfigProvider,
+				Name:  DDExtraConfigProviders,
+				Value: ClusterChecksConfigProvider,
 			},
 		)
 	}
diff --git a/internal/controller/datadogagent/feature/cspm/envvar.go b/internal/controller/datadogagent/feature/cspm/envvar.go
new file mode 100644
index 00000000..627ac823
--- /dev/null
+++ b/internal/controller/datadogagent/feature/cspm/envvar.go
@@ -0,0 +1,13 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package cspm
+
+const (
+	DDComplianceConfigDir             = "DD_COMPLIANCE_CONFIG_DIR"
+	DDComplianceConfigCheckInterval   = "DD_COMPLIANCE_CONFIG_CHECK_INTERVAL"
+	DDComplianceConfigEnabled         = "DD_COMPLIANCE_CONFIG_ENABLED"
+	DDComplianceHostBenchmarksEnabled = "DD_COMPLIANCE_HOST_BENCHMARKS_ENABLED"
+)
diff --git a/internal/controller/datadogagent/feature/cspm/feature.go b/internal/controller/datadogagent/feature/cspm/feature.go
index 8216cbaa..0848231c 100644
--- a/internal/controller/datadogagent/feature/cspm/feature.go
+++ b/internal/controller/datadogagent/feature/cspm/feature.go
@@ -199,14 +199,14 @@ func (f *cspmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) e
 	}
 
 	enabledEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDComplianceConfigEnabled,
+		Name:  DDComplianceConfigEnabled,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, enabledEnvVar)
 
 	if f.checkInterval != "" {
 		intervalEnvVar := &corev1.EnvVar{
-			Name:  apicommon.DDComplianceConfigCheckInterval,
+			Name:  DDComplianceConfigCheckInterval,
 			Value: f.checkInterval,
 		}
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, intervalEnvVar)
@@ -291,53 +291,53 @@ func (f *cspmFeature) ManageNodeAgent(managers feature.PodTemplateManagers, prov
 	}
 
 	// cgroups volume mount
-	cgroupsVol, cgroupsVolMount := volume.GetVolumes(apicommon.CgroupsVolumeName, apicommon.CgroupsHostPath, apicommon.CgroupsMountPath, true)
+	cgroupsVol, cgroupsVolMount := volume.GetVolumes(v2alpha1.CgroupsVolumeName, v2alpha1.CgroupsHostPath, v2alpha1.CgroupsMountPath, true)
 	volMountMgr.AddVolumeMountToContainer(&cgroupsVolMount, apicommon.SecurityAgentContainerName)
 	VolMgr.AddVolume(&cgroupsVol)
 
 	// passwd volume mount
-	passwdVol, passwdVolMount := volume.GetVolumes(apicommon.PasswdVolumeName, apicommon.PasswdHostPath, apicommon.PasswdMountPath, true)
+	passwdVol, passwdVolMount := volume.GetVolumes(v2alpha1.PasswdVolumeName, v2alpha1.PasswdHostPath, v2alpha1.PasswdMountPath, true)
 	volMountMgr.AddVolumeMountToContainer(&passwdVolMount, apicommon.SecurityAgentContainerName)
 	VolMgr.AddVolume(&passwdVol)
 
 	// procdir volume mount
-	procdirVol, procdirVolMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true)
+	procdirVol, procdirVolMount := volume.GetVolumes(v2alpha1.ProcdirVolumeName, v2alpha1.ProcdirHostPath, v2alpha1.ProcdirMountPath, true)
 	volMountMgr.AddVolumeMountToContainer(&procdirVolMount, apicommon.SecurityAgentContainerName)
 	VolMgr.AddVolume(&procdirVol)
 
 	// host root volume mount
-	hostRootVol, hostRootVolMount := volume.GetVolumes(apicommon.HostRootVolumeName, apicommon.HostRootHostPath, apicommon.HostRootMountPath, true)
+	hostRootVol, hostRootVolMount := volume.GetVolumes(v2alpha1.HostRootVolumeName, v2alpha1.HostRootHostPath, v2alpha1.HostRootMountPath, true)
 	volMountMgr.AddVolumeMountToContainer(&hostRootVolMount, apicommon.SecurityAgentContainerName)
 	VolMgr.AddVolume(&hostRootVol)
 
 	// group volume mount
-	groupVol, groupVolMount := volume.GetVolumes(apicommon.GroupVolumeName, apicommon.GroupHostPath, apicommon.GroupMountPath, true)
+	groupVol, groupVolMount := volume.GetVolumes(v2alpha1.GroupVolumeName, v2alpha1.GroupHostPath, v2alpha1.GroupMountPath, true)
 	volMountMgr.AddVolumeMountToContainer(&groupVolMount, apicommon.SecurityAgentContainerName)
 	VolMgr.AddVolume(&groupVol)
 
 	// env vars
 	enabledEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDComplianceConfigEnabled,
+		Name:  DDComplianceConfigEnabled,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainers([]apicommon.AgentContainerName{apicommon.CoreAgentContainerName, apicommon.SecurityAgentContainerName}, enabledEnvVar)
 
 	hostRootEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDHostRootEnvVar,
-		Value: apicommon.HostRootMountPath,
+		Name:  v2alpha1.DDHostRootEnvVar,
+		Value: v2alpha1.HostRootMountPath,
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.SecurityAgentContainerName, hostRootEnvVar)
 
 	if f.checkInterval != "" {
 		intervalEnvVar := &corev1.EnvVar{
-			Name:  apicommon.DDComplianceConfigCheckInterval,
+			Name:  DDComplianceConfigCheckInterval,
 			Value: f.checkInterval,
 		}
 		managers.EnvVar().AddEnvVarToContainer(apicommon.SecurityAgentContainerName, intervalEnvVar)
 	}
 
 	hostBenchmarksEnabledEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDComplianceHostBenchmarksEnabled,
+		Name:  DDComplianceHostBenchmarksEnabled,
 		Value: apiutils.BoolToString(&f.hostBenchmarksEnabled),
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.SecurityAgentContainerName, hostBenchmarksEnabledEnvVar)
diff --git a/internal/controller/datadogagent/feature/cws/envvar.go b/internal/controller/datadogagent/feature/cws/envvar.go
new file mode 100644
index 00000000..8a1269ba
--- /dev/null
+++ b/internal/controller/datadogagent/feature/cws/envvar.go
@@ -0,0 +1,17 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package cws
+
+const (
+	DDRuntimeSecurityConfigEnabled                    = "DD_RUNTIME_SECURITY_CONFIG_ENABLED"
+	DDRuntimeSecurityConfigPoliciesDir                = "DD_RUNTIME_SECURITY_CONFIG_POLICIES_DIR"
+	DDRuntimeSecurityConfigRemoteTaggerEnabled        = "DD_RUNTIME_SECURITY_CONFIG_REMOTE_TAGGER"
+	DDRuntimeSecurityConfigSocket                     = "DD_RUNTIME_SECURITY_CONFIG_SOCKET"
+	DDRuntimeSecurityConfigSyscallMonitorEnabled      = "DD_RUNTIME_SECURITY_CONFIG_SYSCALL_MONITOR_ENABLED"
+	DDRuntimeSecurityConfigNetworkEnabled             = "DD_RUNTIME_SECURITY_CONFIG_NETWORK_ENABLED"
+	DDRuntimeSecurityConfigActivityDumpEnabled        = "DD_RUNTIME_SECURITY_CONFIG_ACTIVITY_DUMP_ENABLED"
+	DDRuntimeSecurityConfigRemoteConfigurationEnabled = "DD_RUNTIME_SECURITY_CONFIG_REMOTE_CONFIGURATION_ENABLED"
+)
diff --git a/internal/controller/datadogagent/feature/cws/feature.go b/internal/controller/datadogagent/feature/cws/feature.go
index 03d35aa1..aa863106 100644
--- a/internal/controller/datadogagent/feature/cws/feature.go
+++ b/internal/controller/datadogagent/feature/cws/feature.go
@@ -175,7 +175,7 @@ func (f *cwsFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplate
 // It should do nothing if the feature doesn't need to configure it.
 func (f *cwsFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	// annotations
-	managers.Annotation().AddAnnotation(apicommon.SystemProbeAppArmorAnnotationKey, apicommon.SystemProbeAppArmorAnnotationValue)
+	managers.Annotation().AddAnnotation(v2alpha1.SystemProbeAppArmorAnnotationKey, v2alpha1.SystemProbeAppArmorAnnotationValue)
 
 	// security context capabilities
 	managers.SecurityContext().AddCapabilitiesToContainer(agent.DefaultCapabilitiesForSystemProbe(), apicommon.SystemProbeContainerName)
@@ -190,20 +190,20 @@ func (f *cwsFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 	}
 
 	enabledEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDRuntimeSecurityConfigEnabled,
+		Name:  DDRuntimeSecurityConfigEnabled,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainers(containersForEnvVars, enabledEnvVar)
 
 	runtimeSocketEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDRuntimeSecurityConfigSocket,
-		Value: filepath.Join(apicommon.SystemProbeSocketVolumePath, "runtime-security.sock"),
+		Name:  DDRuntimeSecurityConfigSocket,
+		Value: filepath.Join(v2alpha1.SystemProbeSocketVolumePath, "runtime-security.sock"),
 	}
 	managers.EnvVar().AddEnvVarToContainers(containersForEnvVars, runtimeSocketEnvVar)
 
 	if f.syscallMonitorEnabled {
 		monitorEnvVar := &corev1.EnvVar{
-			Name:  apicommon.DDRuntimeSecurityConfigSyscallMonitorEnabled,
+			Name:  DDRuntimeSecurityConfigSyscallMonitorEnabled,
 			Value: "true",
 		}
 		managers.EnvVar().AddEnvVarToContainers(containersForEnvVars, monitorEnvVar)
@@ -211,7 +211,7 @@ func (f *cwsFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 
 	if f.networkEnabled {
 		networkEnvVar := &corev1.EnvVar{
-			Name:  apicommon.DDRuntimeSecurityConfigNetworkEnabled,
+			Name:  DDRuntimeSecurityConfigNetworkEnabled,
 			Value: "true",
 		}
 		managers.EnvVar().AddEnvVarToContainer(apicommon.SystemProbeContainerName, networkEnvVar)
@@ -219,7 +219,7 @@ func (f *cwsFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 
 	if f.activityDumpEnabled {
 		adEnvVar := &corev1.EnvVar{
-			Name:  apicommon.DDRuntimeSecurityConfigActivityDumpEnabled,
+			Name:  DDRuntimeSecurityConfigActivityDumpEnabled,
 			Value: "true",
 		}
 		managers.EnvVar().AddEnvVarToContainer(apicommon.SystemProbeContainerName, adEnvVar)
@@ -227,21 +227,21 @@ func (f *cwsFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 
 	if f.remoteConfigurationEnabled {
 		rcEnvVar := &corev1.EnvVar{
-			Name:  apicommon.DDRuntimeSecurityConfigRemoteConfigurationEnabled,
+			Name:  DDRuntimeSecurityConfigRemoteConfigurationEnabled,
 			Value: "true",
 		}
 		managers.EnvVar().AddEnvVarToContainer(apicommon.SystemProbeContainerName, rcEnvVar)
 	}
 
 	policiesDirEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDRuntimeSecurityConfigPoliciesDir,
+		Name:  DDRuntimeSecurityConfigPoliciesDir,
 		Value: securityAgentRuntimePoliciesDirVolumePath,
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.SystemProbeContainerName, policiesDirEnvVar)
 
 	hostRootEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDHostRootEnvVar,
-		Value: apicommon.HostRootMountPath,
+		Name:  v2alpha1.DDHostRootEnvVar,
+		Value: v2alpha1.HostRootMountPath,
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.SecurityAgentContainerName, hostRootEnvVar)
 
@@ -249,7 +249,7 @@ func (f *cwsFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 	volMgr := managers.Volume()
 
 	// debugfs volume mount
-	debugfsVol, debugfsVolMount := volume.GetVolumes(apicommon.DebugfsVolumeName, apicommon.DebugfsPath, apicommon.DebugfsPath, false)
+	debugfsVol, debugfsVolMount := volume.GetVolumes(v2alpha1.DebugfsVolumeName, v2alpha1.DebugfsPath, v2alpha1.DebugfsPath, false)
 	volMountMgr.AddVolumeMountToContainer(&debugfsVolMount, apicommon.SystemProbeContainerName)
 	volMgr.AddVolume(&debugfsVol)
 
@@ -264,10 +264,10 @@ func (f *cwsFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 	volMgr.AddVolume(&securityfsVol)
 
 	// socket volume mount (needs write perms for the system probe container but not the others)
-	socketVol, socketVolMount := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, false)
+	socketVol, socketVolMount := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, false)
 	volMountMgr.AddVolumeMountToContainer(&socketVolMount, apicommon.SystemProbeContainerName)
 
-	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, true)
+	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, true)
 	managers.VolumeMount().AddVolumeMountToContainers(
 		&socketVolMountReadOnly,
 		[]apicommon.AgentContainerName{
@@ -278,27 +278,27 @@ func (f *cwsFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 	volMgr.AddVolume(&socketVol)
 
 	// procdir volume mount
-	procdirVol, procdirVolMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true)
+	procdirVol, procdirVolMount := volume.GetVolumes(v2alpha1.ProcdirVolumeName, v2alpha1.ProcdirHostPath, v2alpha1.ProcdirMountPath, true)
 	volMountMgr.AddVolumeMountToContainer(&procdirVolMount, apicommon.SystemProbeContainerName)
 	volMgr.AddVolume(&procdirVol)
 
 	// passwd volume mount
-	passwdVol, passwdVolMount := volume.GetVolumes(apicommon.PasswdVolumeName, apicommon.PasswdHostPath, apicommon.PasswdMountPath, true)
+	passwdVol, passwdVolMount := volume.GetVolumes(v2alpha1.PasswdVolumeName, v2alpha1.PasswdHostPath, v2alpha1.PasswdMountPath, true)
 	volMountMgr.AddVolumeMountToContainer(&passwdVolMount, apicommon.SystemProbeContainerName)
 	volMgr.AddVolume(&passwdVol)
 
 	// group volume mount
-	groupVol, groupVolMount := volume.GetVolumes(apicommon.GroupVolumeName, apicommon.GroupHostPath, apicommon.GroupMountPath, true)
+	groupVol, groupVolMount := volume.GetVolumes(v2alpha1.GroupVolumeName, v2alpha1.GroupHostPath, v2alpha1.GroupMountPath, true)
 	volMountMgr.AddVolumeMountToContainer(&groupVolMount, apicommon.SystemProbeContainerName)
 	volMgr.AddVolume(&groupVol)
 
 	// osRelease volume mount
-	osReleaseVol, osReleaseVolMount := volume.GetVolumes(apicommon.SystemProbeOSReleaseDirVolumeName, apicommon.SystemProbeOSReleaseDirVolumePath, apicommon.SystemProbeOSReleaseDirMountPath, true)
+	osReleaseVol, osReleaseVolMount := volume.GetVolumes(v2alpha1.SystemProbeOSReleaseDirVolumeName, v2alpha1.SystemProbeOSReleaseDirVolumePath, v2alpha1.SystemProbeOSReleaseDirMountPath, true)
 	volMountMgr.AddVolumeMountToContainer(&osReleaseVolMount, apicommon.SystemProbeContainerName)
 	volMgr.AddVolume(&osReleaseVol)
 
 	// hostroot volume mount
-	hostrootVol, hostrootVolMount := volume.GetVolumes(apicommon.HostRootVolumeName, apicommon.HostRootHostPath, apicommon.HostRootMountPath, true)
+	hostrootVol, hostrootVolMount := volume.GetVolumes(v2alpha1.HostRootVolumeName, v2alpha1.HostRootHostPath, v2alpha1.HostRootMountPath, true)
 	volMountMgr.AddVolumeMountToContainer(&hostrootVolMount, apicommon.SecurityAgentContainerName)
 	volMgr.AddVolume(&hostrootVol)
 
diff --git a/internal/controller/datadogagent/feature/dogstatsd/envvar.go b/internal/controller/datadogagent/feature/dogstatsd/envvar.go
new file mode 100644
index 00000000..dc7f7b3f
--- /dev/null
+++ b/internal/controller/datadogagent/feature/dogstatsd/envvar.go
@@ -0,0 +1,16 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package dogstatsd
+
+const (
+	DDDogstatsdMapperProfiles        = "DD_DOGSTATSD_MAPPER_PROFILES"
+	DDDogstatsdNonLocalTraffic       = "DD_DOGSTATSD_NON_LOCAL_TRAFFIC"
+	DDDogstatsdOriginDetection       = "DD_DOGSTATSD_ORIGIN_DETECTION"
+	DDDogstatsdOriginDetectionClient = "DD_DOGSTATSD_ORIGIN_DETECTION_CLIENT"
+	DDDogstatsdTagCardinality        = "DD_DOGSTATSD_TAG_CARDINALITY"
+	DDDogstatsdPort                  = "DD_DOGSTATSD_PORT"
+	DDDogstatsdSocket                = "DD_DOGSTATSD_SOCKET"
+)
diff --git a/internal/controller/datadogagent/feature/dogstatsd/feature.go b/internal/controller/datadogagent/feature/dogstatsd/feature.go
index 180cf41f..7521270e 100644
--- a/internal/controller/datadogagent/feature/dogstatsd/feature.go
+++ b/internal/controller/datadogagent/feature/dogstatsd/feature.go
@@ -117,7 +117,7 @@ func (f *dogstatsdFeature) ManageDependencies(managers feature.ResourceManagers,
 		}
 		if f.hostPortEnabled {
 			dsdPort.Port = f.hostPortHostPort
-			dsdPort.Name = apicommon.DogstatsdHostPortName
+			dsdPort.Name = v2alpha1.DogstatsdHostPortName
 			if f.useHostNetwork {
 				dsdPort.TargetPort = intstr.FromInt(int(f.hostPortHostPort))
 			}
@@ -150,7 +150,7 @@ func (f *dogstatsdFeature) ManageSingleContainerNodeAgent(managers feature.PodTe
 	// Cluster Checks Runner.
 	if f.adpEnabled {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.CoreAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDDogstatsdEnabled,
+			Name:  v2alpha1.DDDogstatsdEnabled,
 			Value: "false",
 		})
 	}
@@ -174,7 +174,7 @@ func (f *dogstatsdFeature) ManageNodeAgent(managers feature.PodTemplateManagers,
 		f.manageNodeAgent(apicommon.AgentDataPlaneContainerName, managers, provider)
 
 		managers.EnvVar().AddEnvVarToContainer(apicommon.CoreAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDDogstatsdEnabled,
+			Name:  v2alpha1.DDDogstatsdEnabled,
 			Value: "false",
 		})
 	} else {
@@ -205,11 +205,11 @@ func (f *dogstatsdFeature) manageNodeAgent(agentContainerName apicommon.AgentCon
 		}
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
 			// defaults to 8125 in datadog-agent code
-			Name:  apicommon.DDDogstatsdPort,
+			Name:  DDDogstatsdPort,
 			Value: strconv.Itoa(dsdPortEnvVarValue),
 		})
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDDogstatsdNonLocalTraffic,
+			Name:  DDDogstatsdNonLocalTraffic,
 			Value: "true",
 		})
 	}
@@ -219,25 +219,25 @@ func (f *dogstatsdFeature) manageNodeAgent(agentContainerName apicommon.AgentCon
 	if f.udsEnabled {
 		udsHostFolder := filepath.Dir(f.udsHostFilepath)
 		sockName := filepath.Base(f.udsHostFilepath)
-		socketVol, socketVolMount := volume.GetVolumes(apicommon.DogstatsdSocketVolumeName, udsHostFolder, apicommon.DogstatsdSocketLocalPath, false)
+		socketVol, socketVolMount := volume.GetVolumes(v2alpha1.DogstatsdSocketVolumeName, udsHostFolder, v2alpha1.DogstatsdSocketLocalPath, false)
 		volType := corev1.HostPathDirectoryOrCreate // We need to create the directory on the host if it does not exist.
 
 		socketVol.VolumeSource.HostPath.Type = &volType
 		managers.VolumeMount().AddVolumeMountToContainerWithMergeFunc(&socketVolMount, agentContainerName, merger.OverrideCurrentVolumeMountMergeFunction)
 		managers.Volume().AddVolume(&socketVol)
 		managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-			Name:  apicommon.DDDogstatsdSocket,
-			Value: filepath.Join(apicommon.DogstatsdSocketLocalPath, sockName),
+			Name:  DDDogstatsdSocket,
+			Value: filepath.Join(v2alpha1.DogstatsdSocketLocalPath, sockName),
 		})
 	}
 
 	if f.originDetectionEnabled {
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDDogstatsdOriginDetection,
+			Name:  DDDogstatsdOriginDetection,
 			Value: "true",
 		})
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDDogstatsdOriginDetectionClient,
+			Name:  DDDogstatsdOriginDetectionClient,
 			Value: "true",
 		})
 		if f.udsEnabled {
@@ -247,7 +247,7 @@ func (f *dogstatsdFeature) manageNodeAgent(agentContainerName apicommon.AgentCon
 		// The value validation happens at the Agent level - if the lower(string) is not `low`, `orchestrator` or `high`, the Agent defaults to `low`.
 		if f.tagCardinality != "" {
 			managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDDogstatsdTagCardinality,
+				Name:  DDDogstatsdTagCardinality,
 				Value: f.tagCardinality,
 			})
 		}
@@ -258,7 +258,7 @@ func (f *dogstatsdFeature) manageNodeAgent(agentContainerName apicommon.AgentCon
 		// configdata
 		if f.mapperProfiles.ConfigData != nil {
 			managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDDogstatsdMapperProfiles,
+				Name:  DDDogstatsdMapperProfiles,
 				Value: apiutils.YAMLToJSONString(*f.mapperProfiles.ConfigData),
 			})
 			// ignore configmap if configdata is set
@@ -270,7 +270,7 @@ func (f *dogstatsdFeature) manageNodeAgent(agentContainerName apicommon.AgentCon
 			cmSelector.Name = f.mapperProfiles.ConfigMap.Name
 			cmSelector.Key = f.mapperProfiles.ConfigMap.Items[0].Key
 			managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-				Name:      apicommon.DDDogstatsdMapperProfiles,
+				Name:      DDDogstatsdMapperProfiles,
 				ValueFrom: &corev1.EnvVarSource{ConfigMapKeyRef: &cmSelector},
 			})
 		}
diff --git a/internal/controller/datadogagent/feature/ebpfcheck/envvar.go b/internal/controller/datadogagent/feature/ebpfcheck/envvar.go
new file mode 100644
index 00000000..edd313be
--- /dev/null
+++ b/internal/controller/datadogagent/feature/ebpfcheck/envvar.go
@@ -0,0 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package ebpfcheck
+
+const DDEnableEBPFCheckEnvVar = "DD_EBPF_CHECK_ENABLED"
diff --git a/internal/controller/datadogagent/feature/ebpfcheck/feature.go b/internal/controller/datadogagent/feature/ebpfcheck/feature.go
index 89d46893..0a9bcc2b 100644
--- a/internal/controller/datadogagent/feature/ebpfcheck/feature.go
+++ b/internal/controller/datadogagent/feature/ebpfcheck/feature.go
@@ -1,3 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
 package ebpfcheck
 
 import (
@@ -62,21 +67,21 @@ func (f *ebpfCheckFeature) ManageNodeAgent(managers feature.PodTemplateManagers,
 	managers.SecurityContext().AddCapabilitiesToContainer(agent.DefaultCapabilitiesForSystemProbe(), apicommon.SystemProbeContainerName)
 
 	// debugfs volume mount
-	debugfsVol, debugfsVolMount := volume.GetVolumes(apicommon.DebugfsVolumeName, apicommon.DebugfsPath, apicommon.DebugfsPath, false)
+	debugfsVol, debugfsVolMount := volume.GetVolumes(v2alpha1.DebugfsVolumeName, v2alpha1.DebugfsPath, v2alpha1.DebugfsPath, false)
 	managers.Volume().AddVolume(&debugfsVol)
 	managers.VolumeMount().AddVolumeMountToContainers(&debugfsVolMount, []apicommon.AgentContainerName{apicommon.SystemProbeContainerName})
 
 	// socket volume mount (needs write perms for the system probe container but not the others)
-	socketVol, socketVolMount := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, false)
+	socketVol, socketVolMount := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, false)
 	managers.Volume().AddVolume(&socketVol)
 	managers.VolumeMount().AddVolumeMountToContainer(&socketVolMount, apicommon.SystemProbeContainerName)
 
-	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, true)
+	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&socketVolMountReadOnly, apicommon.CoreAgentContainerName)
 
 	// env vars
 	enableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDEnableEBPFCheckEnvVar,
+		Name:  DDEnableEBPFCheckEnvVar,
 		Value: "true",
 	}
 
@@ -84,7 +89,7 @@ func (f *ebpfCheckFeature) ManageNodeAgent(managers feature.PodTemplateManagers,
 	managers.EnvVar().AddEnvVarToInitContainer(apicommon.InitConfigContainerName, enableEnvVar)
 
 	socketEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeSocket,
+		Name:  v2alpha1.DDSystemProbeSocket,
 		Value: v2alpha1.DefaultSystemProbeSocketPath,
 	}
 
diff --git a/internal/controller/datadogagent/feature/enabledefault/envvar.go b/internal/controller/datadogagent/feature/enabledefault/envvar.go
new file mode 100644
index 00000000..01948b3f
--- /dev/null
+++ b/internal/controller/datadogagent/feature/enabledefault/envvar.go
@@ -0,0 +1,15 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package enabledefault
+
+const (
+	DDClusterAgentAuthToken          = "DD_CLUSTER_AGENT_AUTH_TOKEN"
+	DDClusterAgentServiceAccountName = "DD_CLUSTER_AGENT_SERVICE_ACCOUNT_NAME"
+
+	// InstallInfoToolVersion is used by the Operator to override the tool
+	// version value in the Agent's install info
+	InstallInfoToolVersion = "DD_TOOL_VERSION"
+)
diff --git a/internal/controller/datadogagent/feature/enabledefault/feature.go b/internal/controller/datadogagent/feature/enabledefault/feature.go
index 762decf4..8532429f 100644
--- a/internal/controller/datadogagent/feature/enabledefault/feature.go
+++ b/internal/controller/datadogagent/feature/enabledefault/feature.go
@@ -52,7 +52,6 @@ func buildDefaultFeature(options *feature.Options) feature.Feature {
 
 	if options != nil {
 		dF.logger = options.Logger
-		dF.otelAgentEnabled = options.OtelAgentEnabled
 	}
 
 	return dF
@@ -68,7 +67,6 @@ type defaultFeature struct {
 	clusterChecksRunner     clusterChecksRunnerConfig
 	logger                  logr.Logger
 	disableNonResourceRules bool
-	otelAgentEnabled        bool
 	adpEnabled              bool
 
 	customConfigAnnotationKey   string
@@ -134,10 +132,6 @@ func (f *defaultFeature) Configure(dda *v2alpha1.DatadogAgent) feature.RequiredC
 	f.agent.serviceAccountAnnotations = v2alpha1.GetAgentServiceAccountAnnotations(dda)
 	f.clusterChecksRunner.serviceAccountAnnotations = v2alpha1.GetClusterChecksRunnerServiceAccountAnnotations(dda)
 
-	if dda.ObjectMeta.Annotations != nil {
-		f.otelAgentEnabled = f.otelAgentEnabled || featureutils.HasOtelAgentAnnotation(dda)
-	}
-
 	if dda.ObjectMeta.Annotations != nil {
 		f.adpEnabled = featureutils.HasAgentDataPlaneAnnotation(dda)
 	}
@@ -216,7 +210,7 @@ func (f *defaultFeature) Configure(dda *v2alpha1.DatadogAgent) feature.RequiredC
 	// feature.
 	//
 	// NOTE: This is a temporary solution until the OTel Agent is fully integrated into the Operator via a dedicated feature.
-	if f.otelAgentEnabled {
+	if dda.ObjectMeta.Annotations != nil && featureutils.HasOtelAgentAnnotation(dda) {
 		agentContainers = append(agentContainers, apicommon.OtelAgent)
 	}
 
@@ -405,7 +399,7 @@ func (f *defaultFeature) ManageClusterAgent(managers feature.PodTemplateManagers
 		managers.Annotation().AddAnnotation(f.customConfigAnnotationKey, f.customConfigAnnotationValue)
 	}
 	managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-		Name:  apicommon.DDClusterAgentServiceAccountName,
+		Name:  DDClusterAgentServiceAccountName,
 		Value: f.clusterAgent.serviceAccountName,
 	})
 	managers.EnvVar().AddEnvVar(&corev1.EnvVar{
@@ -457,17 +451,17 @@ func (f *defaultFeature) ManageClusterChecksRunner(managers feature.PodTemplateM
 
 func (f *defaultFeature) addDefaultCommonEnvs(managers feature.PodTemplateManagers) {
 	if f.dcaTokenInfo.token.SecretName != "" {
-		tokenEnvVar := common.BuildEnvVarFromSource(apicommon.DDClusterAgentAuthToken, common.BuildEnvVarFromSecret(f.dcaTokenInfo.token.SecretName, f.dcaTokenInfo.token.SecretKey))
+		tokenEnvVar := common.BuildEnvVarFromSource(DDClusterAgentAuthToken, common.BuildEnvVarFromSecret(f.dcaTokenInfo.token.SecretName, f.dcaTokenInfo.token.SecretKey))
 		managers.EnvVar().AddEnvVar(tokenEnvVar)
 	}
 
 	if f.credentialsInfo.apiKey.SecretName != "" {
-		apiKeyEnvVar := common.BuildEnvVarFromSource(apicommon.DDAPIKey, common.BuildEnvVarFromSecret(f.credentialsInfo.apiKey.SecretName, f.credentialsInfo.apiKey.SecretKey))
+		apiKeyEnvVar := common.BuildEnvVarFromSource(v2alpha1.DDAPIKey, common.BuildEnvVarFromSecret(f.credentialsInfo.apiKey.SecretName, f.credentialsInfo.apiKey.SecretKey))
 		managers.EnvVar().AddEnvVar(apiKeyEnvVar)
 	}
 
 	if f.credentialsInfo.appKey.SecretName != "" {
-		appKeyEnvVar := common.BuildEnvVarFromSource(apicommon.DDAppKey, common.BuildEnvVarFromSecret(f.credentialsInfo.appKey.SecretName, f.credentialsInfo.appKey.SecretKey))
+		appKeyEnvVar := common.BuildEnvVarFromSource(v2alpha1.DDAppKey, common.BuildEnvVarFromSecret(f.credentialsInfo.appKey.SecretName, f.credentialsInfo.appKey.SecretKey))
 		managers.EnvVar().AddEnvVar(appKeyEnvVar)
 	}
 
@@ -477,7 +471,7 @@ func (f *defaultFeature) addDefaultCommonEnvs(managers feature.PodTemplateManage
 			f.logger.Error(err, "Failed to unmarshal json input")
 		} else {
 			managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDKubernetesResourcesLabelsAsTags,
+				Name:  v2alpha1.DDKubernetesResourcesLabelsAsTags,
 				Value: string(kubernetesResourceLabelsAsTags),
 			})
 		}
@@ -489,7 +483,7 @@ func (f *defaultFeature) addDefaultCommonEnvs(managers feature.PodTemplateManage
 			f.logger.Error(err, "Failed to unmarshal json input")
 		} else {
 			managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDKubernetesResourcesAnnotationsAsTags,
+				Name:  v2alpha1.DDKubernetesResourcesAnnotationsAsTags,
 				Value: string(kubernetesResourceAnnotationsAsTags),
 			})
 		}
@@ -512,7 +506,7 @@ func buildInstallInfoConfigMap(dda metav1.Object) *corev1.ConfigMap {
 
 func getInstallInfoValue() string {
 	toolVersion := "unknown"
-	if envVar := os.Getenv(apicommon.InstallInfoToolVersion); envVar != "" {
+	if envVar := os.Getenv(InstallInfoToolVersion); envVar != "" {
 		toolVersion = envVar
 	}
 
diff --git a/internal/controller/datadogagent/feature/eventcollection/envvar.go b/internal/controller/datadogagent/feature/eventcollection/envvar.go
new file mode 100644
index 00000000..e9ee0776
--- /dev/null
+++ b/internal/controller/datadogagent/feature/eventcollection/envvar.go
@@ -0,0 +1,11 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package eventcollection
+
+const (
+	DDLeaderLeaseName         = "DD_LEADER_LEASE_NAME"
+	DDCollectKubernetesEvents = "DD_COLLECT_KUBERNETES_EVENTS"
+)
diff --git a/internal/controller/datadogagent/feature/eventcollection/feature.go b/internal/controller/datadogagent/feature/eventcollection/feature.go
index 61671e17..e6c58c20 100644
--- a/internal/controller/datadogagent/feature/eventcollection/feature.go
+++ b/internal/controller/datadogagent/feature/eventcollection/feature.go
@@ -143,22 +143,22 @@ func (f *eventCollectionFeature) ManageDependencies(managers feature.ResourceMan
 func (f *eventCollectionFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error {
 	// Env vars
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDCollectKubernetesEvents,
+		Name:  DDCollectKubernetesEvents,
 		Value: "true",
 	})
 
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDLeaderElection,
+		Name:  v2alpha1.DDLeaderElection,
 		Value: "true",
 	})
 
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDLeaderLeaseName,
+		Name:  DDLeaderLeaseName,
 		Value: utils.GetDatadogLeaderElectionResourceName(f.owner),
 	})
 
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDClusterAgentTokenName,
+		Name:  v2alpha1.DDClusterAgentTokenName,
 		Value: v2alpha1.GetDefaultDCATokenSecretName(f.owner),
 	})
 
@@ -167,7 +167,7 @@ func (f *eventCollectionFeature) ManageClusterAgent(managers feature.PodTemplate
 		vol := volume.GetBasicVolume(f.configMapName, kubernetesAPIServerCheckConfigVolumeName)
 		volMount := corev1.VolumeMount{
 			Name:      kubernetesAPIServerCheckConfigVolumeName,
-			MountPath: fmt.Sprintf("%s%s/%s", apicommon.ConfigVolumePath, apicommon.ConfdVolumePath, kubeAPIServerConfigFolderName),
+			MountPath: fmt.Sprintf("%s%s/%s", v2alpha1.ConfigVolumePath, v2alpha1.ConfdVolumePath, kubeAPIServerConfigFolderName),
 			ReadOnly:  true,
 		}
 
@@ -200,22 +200,22 @@ func (f *eventCollectionFeature) ManageNodeAgent(managers feature.PodTemplateMan
 
 func (f *eventCollectionFeature) manageNodeAgent(agentContainerName apicommon.AgentContainerName, managers feature.PodTemplateManagers, _ string) error {
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDCollectKubernetesEvents,
+		Name:  DDCollectKubernetesEvents,
 		Value: "true",
 	})
 
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDLeaderElection,
+		Name:  v2alpha1.DDLeaderElection,
 		Value: "true",
 	})
 
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDLeaderLeaseName,
+		Name:  DDLeaderLeaseName,
 		Value: utils.GetDatadogLeaderElectionResourceName(f.owner),
 	})
 
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDClusterAgentTokenName,
+		Name:  v2alpha1.DDClusterAgentTokenName,
 		Value: v2alpha1.GetDefaultDCATokenSecretName(f.owner),
 	})
 
diff --git a/internal/controller/datadogagent/feature/externalmetrics/envvar.go b/internal/controller/datadogagent/feature/externalmetrics/envvar.go
new file mode 100644
index 00000000..233721c3
--- /dev/null
+++ b/internal/controller/datadogagent/feature/externalmetrics/envvar.go
@@ -0,0 +1,16 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package externalmetrics
+
+const (
+	DDExternalMetricsProviderAPIKey           = "DD_EXTERNAL_METRICS_PROVIDER_API_KEY"
+	DDExternalMetricsProviderAppKey           = "DD_EXTERNAL_METRICS_PROVIDER_APP_KEY"
+	DDExternalMetricsProviderEndpoint         = "DD_EXTERNAL_METRICS_PROVIDER_ENDPOINT"
+	DDExternalMetricsProviderEnabled          = "DD_EXTERNAL_METRICS_PROVIDER_ENABLED"
+	DDExternalMetricsProviderPort             = "DD_EXTERNAL_METRICS_PROVIDER_PORT"
+	DDExternalMetricsProviderUseDatadogMetric = "DD_EXTERNAL_METRICS_PROVIDER_USE_DATADOGMETRIC_CRD"
+	DDExternalMetricsProviderWPAController    = "DD_EXTERNAL_METRICS_PROVIDER_WPA_CONTROLLER"
+)
diff --git a/internal/controller/datadogagent/feature/externalmetrics/feature.go b/internal/controller/datadogagent/feature/externalmetrics/feature.go
index b39a8036..7602f10e 100644
--- a/internal/controller/datadogagent/feature/externalmetrics/feature.go
+++ b/internal/controller/datadogagent/feature/externalmetrics/feature.go
@@ -89,8 +89,8 @@ func (f *externalMetricsFeature) Configure(dda *v2alpha1.DatadogAgent) (reqComp
 			creds := em.Endpoint.Credentials
 			if creds != nil {
 				f.keySecret = make(map[string]secret)
-				if !v2alpha1.CheckAPIKeySufficiency(creds, apicommon.DDExternalMetricsProviderAPIKey) ||
-					!v2alpha1.CheckAppKeySufficiency(creds, apicommon.DDExternalMetricsProviderAppKey) {
+				if !v2alpha1.CheckAPIKeySufficiency(creds, DDExternalMetricsProviderAPIKey) ||
+					!v2alpha1.CheckAppKeySufficiency(creds, DDExternalMetricsProviderAppKey) {
 					// for one of api or app keys, neither secrets nor external metrics key env vars
 					// are defined, so store key data to create secret later
 					for keyType, keyData := range v2alpha1.GetKeysFromCredentials(creds) {
@@ -261,25 +261,25 @@ func (f *externalMetricsFeature) ManageDependencies(managers feature.ResourceMan
 // It should do nothing if the feature doesn't need to configure it.
 func (f *externalMetricsFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error {
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDExternalMetricsProviderEnabled,
+		Name:  DDExternalMetricsProviderEnabled,
 		Value: "true",
 	})
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDExternalMetricsProviderPort,
+		Name:  DDExternalMetricsProviderPort,
 		Value: strconv.FormatInt(int64(f.port), 10),
 	})
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDExternalMetricsProviderUseDatadogMetric,
+		Name:  DDExternalMetricsProviderUseDatadogMetric,
 		Value: apiutils.BoolToString(&f.useDDM),
 	})
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDExternalMetricsProviderWPAController,
+		Name:  DDExternalMetricsProviderWPAController,
 		Value: apiutils.BoolToString(&f.useWPA),
 	})
 
 	if f.url != "" {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDExternalMetricsProviderEndpoint,
+			Name:  DDExternalMetricsProviderEndpoint,
 			Value: f.url,
 		})
 	}
@@ -291,13 +291,13 @@ func (f *externalMetricsFeature) ManageClusterAgent(managers feature.PodTemplate
 			// api key from existing secret
 			if s.name != "" {
 				apiKeyEnvVar = common.BuildEnvVarFromSource(
-					apicommon.DDExternalMetricsProviderAPIKey,
+					DDExternalMetricsProviderAPIKey,
 					common.BuildEnvVarFromSecret(s.name, s.key),
 				)
 			} else {
 				// api key from secret created by operator
 				apiKeyEnvVar = common.BuildEnvVarFromSource(
-					apicommon.DDExternalMetricsProviderAPIKey,
+					DDExternalMetricsProviderAPIKey,
 					common.BuildEnvVarFromSecret(componentdca.GetDefaultExternalMetricSecretName(f.owner), v2alpha1.DefaultAPIKeyKey),
 				)
 			}
@@ -309,13 +309,13 @@ func (f *externalMetricsFeature) ManageClusterAgent(managers feature.PodTemplate
 			// app key from existing secret
 			if s.name != "" {
 				appKeyEnvVar = common.BuildEnvVarFromSource(
-					apicommon.DDExternalMetricsProviderAppKey,
+					DDExternalMetricsProviderAppKey,
 					common.BuildEnvVarFromSecret(s.name, s.key),
 				)
 			} else {
 				// api key from secret created by operator
 				appKeyEnvVar = common.BuildEnvVarFromSource(
-					apicommon.DDExternalMetricsProviderAppKey,
+					DDExternalMetricsProviderAppKey,
 					common.BuildEnvVarFromSecret(componentdca.GetDefaultExternalMetricSecretName(f.owner), v2alpha1.DefaultAPPKeyKey),
 				)
 			}
diff --git a/internal/controller/datadogagent/feature/helmcheck/feature.go b/internal/controller/datadogagent/feature/helmcheck/feature.go
index 7b16acf0..047fb8e3 100644
--- a/internal/controller/datadogagent/feature/helmcheck/feature.go
+++ b/internal/controller/datadogagent/feature/helmcheck/feature.go
@@ -136,7 +136,7 @@ func (f *helmCheckFeature) ManageClusterAgent(managers feature.PodTemplateManage
 	vol = volume.GetBasicVolume(f.configMapName, helmCheckConfigVolumeName)
 	volMount = corev1.VolumeMount{
 		Name:      helmCheckConfigVolumeName,
-		MountPath: fmt.Sprintf("%s%s/%s", apicommon.ConfigVolumePath, apicommon.ConfdVolumePath, helmCheckFolderName),
+		MountPath: fmt.Sprintf("%s%s/%s", v2alpha1.ConfigVolumePath, v2alpha1.ConfdVolumePath, helmCheckFolderName),
 		ReadOnly:  true,
 	}
 
diff --git a/internal/controller/datadogagent/feature/ids.go b/internal/controller/datadogagent/feature/ids.go
index 812a00a7..b395d720 100644
--- a/internal/controller/datadogagent/feature/ids.go
+++ b/internal/controller/datadogagent/feature/ids.go
@@ -25,6 +25,8 @@ const (
 	LiveContainerIDType = "live_container"
 	// LiveProcessIDType Live Process feature.
 	LiveProcessIDType = "live_process"
+	// OtelAgentIDType Otel Agent feature.
+	OtelAgentIDType = "otel_agent"
 	// ProcessDiscoveryIDType Process Discovery feature.
 	ProcessDiscoveryIDType = "process_discovery"
 	// KubernetesAPIServerIDType Kube APIServer feature.
diff --git a/internal/controller/datadogagent/feature/kubernetesstatecore/envvar.go b/internal/controller/datadogagent/feature/kubernetesstatecore/envvar.go
new file mode 100644
index 00000000..0841128e
--- /dev/null
+++ b/internal/controller/datadogagent/feature/kubernetesstatecore/envvar.go
@@ -0,0 +1,12 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package kubernetesstatecore
+
+const (
+	DDKubeStateMetricsCoreConfigMap = "DD_KUBE_STATE_METRICS_CORE_CONFIGMAP_NAME"
+	DDKubeStateMetricsCoreEnabled   = "DD_KUBE_STATE_METRICS_CORE_ENABLED"
+	DDIgnoreAutoConf                = "DD_IGNORE_AUTOCONF"
+)
diff --git a/internal/controller/datadogagent/feature/kubernetesstatecore/feature.go b/internal/controller/datadogagent/feature/kubernetesstatecore/feature.go
index 7e29eb0c..855be7e9 100644
--- a/internal/controller/datadogagent/feature/kubernetesstatecore/feature.go
+++ b/internal/controller/datadogagent/feature/kubernetesstatecore/feature.go
@@ -182,7 +182,7 @@ func (f *ksmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) er
 		vol = volume.GetBasicVolume(f.configConfigMapName, ksmCoreVolumeName)
 		volMount = corev1.VolumeMount{
 			Name:      ksmCoreVolumeName,
-			MountPath: fmt.Sprintf("%s%s/%s", apicommon.ConfigVolumePath, apicommon.ConfdVolumePath, ksmCoreCheckFolderName),
+			MountPath: fmt.Sprintf("%s%s/%s", v2alpha1.ConfigVolumePath, v2alpha1.ConfdVolumePath, ksmCoreCheckFolderName),
 			ReadOnly:  true,
 		}
 	}
@@ -193,12 +193,12 @@ func (f *ksmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) er
 	managers.Volume().AddVolume(&vol)
 
 	managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-		Name:  apicommon.DDKubeStateMetricsCoreEnabled,
+		Name:  DDKubeStateMetricsCoreEnabled,
 		Value: "true",
 	})
 
 	managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-		Name:  apicommon.DDKubeStateMetricsCoreConfigMap,
+		Name:  DDKubeStateMetricsCoreConfigMap,
 		Value: f.configConfigMapName,
 	})
 
@@ -211,7 +211,7 @@ func (f *ksmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) er
 func (f *ksmFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	// Remove ksm v1 conf if the cluster checks are enabled and the ksm core is enabled
 	ignoreAutoConf := &corev1.EnvVar{
-		Name:  apicommon.DDIgnoreAutoConf,
+		Name:  DDIgnoreAutoConf,
 		Value: "kubernetes_state",
 	}
 
@@ -223,7 +223,7 @@ func (f *ksmFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplate
 func (f *ksmFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	// Remove ksm v1 conf if the cluster checks are enabled and the ksm core is enabled
 	ignoreAutoConf := &corev1.EnvVar{
-		Name:  apicommon.DDIgnoreAutoConf,
+		Name:  DDIgnoreAutoConf,
 		Value: "kubernetes_state",
 	}
 
diff --git a/internal/controller/datadogagent/feature/livecontainer/feature.go b/internal/controller/datadogagent/feature/livecontainer/feature.go
index 8e7d403d..6af550e2 100644
--- a/internal/controller/datadogagent/feature/livecontainer/feature.go
+++ b/internal/controller/datadogagent/feature/livecontainer/feature.go
@@ -80,7 +80,7 @@ func (f *liveContainerFeature) ManageClusterAgent(managers feature.PodTemplateMa
 // It should do nothing if the feature doesn't need to configure it.
 func (f *liveContainerFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	runInCoreAgentEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDProcessConfigRunInCoreAgent,
+		Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 		Value: apiutils.BoolToString(&f.runInCoreAgent),
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.UnprivilegedSingleAgentContainerName, runInCoreAgentEnvVar)
@@ -93,7 +93,7 @@ func (f *liveContainerFeature) ManageSingleContainerNodeAgent(managers feature.P
 func (f *liveContainerFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	// Always add this envvar to Core and Process containers
 	runInCoreAgentEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDProcessConfigRunInCoreAgent,
+		Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 		Value: apiutils.BoolToString(&f.runInCoreAgent),
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ProcessAgentContainerName, runInCoreAgentEnvVar)
@@ -110,17 +110,17 @@ func (f *liveContainerFeature) ManageNodeAgent(managers feature.PodTemplateManag
 func (f *liveContainerFeature) manageNodeAgent(agentContainerName apicommon.AgentContainerName, managers feature.PodTemplateManagers, provider string) error {
 
 	// cgroups volume mount
-	cgroupsVol, cgroupsVolMount := volume.GetVolumes(apicommon.CgroupsVolumeName, apicommon.CgroupsHostPath, apicommon.CgroupsMountPath, true)
+	cgroupsVol, cgroupsVolMount := volume.GetVolumes(v2alpha1.CgroupsVolumeName, v2alpha1.CgroupsHostPath, v2alpha1.CgroupsMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&cgroupsVolMount, agentContainerName)
 	managers.Volume().AddVolume(&cgroupsVol)
 
 	// procdir volume mount
-	procdirVol, procdirVolMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true)
+	procdirVol, procdirVolMount := volume.GetVolumes(v2alpha1.ProcdirVolumeName, v2alpha1.ProcdirHostPath, v2alpha1.ProcdirMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&procdirVolMount, agentContainerName)
 	managers.Volume().AddVolume(&procdirVol)
 
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDContainerCollectionEnabled,
+		Name:  v2alpha1.DDContainerCollectionEnabled,
 		Value: "true",
 	})
 
diff --git a/internal/controller/datadogagent/feature/liveprocess/envvar.go b/internal/controller/datadogagent/feature/liveprocess/envvar.go
new file mode 100644
index 00000000..4073d10b
--- /dev/null
+++ b/internal/controller/datadogagent/feature/liveprocess/envvar.go
@@ -0,0 +1,11 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package liveprocess
+
+const (
+	DDProcessConfigScrubArgs = "DD_PROCESS_CONFIG_SCRUB_ARGS"
+	DDProcessConfigStripArgs = "DD_PROCESS_CONFIG_STRIP_PROC_ARGUMENTS"
+)
diff --git a/internal/controller/datadogagent/feature/liveprocess/feature.go b/internal/controller/datadogagent/feature/liveprocess/feature.go
index 1a3f06b8..ce44ffc1 100644
--- a/internal/controller/datadogagent/feature/liveprocess/feature.go
+++ b/internal/controller/datadogagent/feature/liveprocess/feature.go
@@ -88,7 +88,7 @@ func (f *liveProcessFeature) ManageClusterAgent(managers feature.PodTemplateMana
 // It should do nothing if the feature doesn't need to configure it.
 func (f *liveProcessFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	runInCoreAgentEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDProcessConfigRunInCoreAgent,
+		Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 		Value: apiutils.BoolToString(&f.runInCoreAgent),
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.UnprivilegedSingleAgentContainerName, runInCoreAgentEnvVar)
@@ -101,7 +101,7 @@ func (f *liveProcessFeature) ManageSingleContainerNodeAgent(managers feature.Pod
 func (f *liveProcessFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	// Always add this envvar to Core and Process containers
 	runInCoreAgentEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDProcessConfigRunInCoreAgent,
+		Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 		Value: apiutils.BoolToString(&f.runInCoreAgent),
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ProcessAgentContainerName, runInCoreAgentEnvVar)
@@ -118,22 +118,22 @@ func (f *liveProcessFeature) ManageNodeAgent(managers feature.PodTemplateManager
 func (f *liveProcessFeature) manageNodeAgent(agentContainerName apicommon.AgentContainerName, managers feature.PodTemplateManagers, provider string) error {
 
 	// passwd volume mount
-	passwdVol, passwdVolMount := volume.GetVolumes(apicommon.PasswdVolumeName, apicommon.PasswdHostPath, apicommon.PasswdMountPath, true)
+	passwdVol, passwdVolMount := volume.GetVolumes(v2alpha1.PasswdVolumeName, v2alpha1.PasswdHostPath, v2alpha1.PasswdMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&passwdVolMount, agentContainerName)
 	managers.Volume().AddVolume(&passwdVol)
 
 	// cgroups volume mount
-	cgroupsVol, cgroupsVolMount := volume.GetVolumes(apicommon.CgroupsVolumeName, apicommon.CgroupsHostPath, apicommon.CgroupsMountPath, true)
+	cgroupsVol, cgroupsVolMount := volume.GetVolumes(v2alpha1.CgroupsVolumeName, v2alpha1.CgroupsHostPath, v2alpha1.CgroupsMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&cgroupsVolMount, agentContainerName)
 	managers.Volume().AddVolume(&cgroupsVol)
 
 	// procdir volume mount
-	procdirVol, procdirVolMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true)
+	procdirVol, procdirVolMount := volume.GetVolumes(v2alpha1.ProcdirVolumeName, v2alpha1.ProcdirHostPath, v2alpha1.ProcdirMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&procdirVolMount, agentContainerName)
 	managers.Volume().AddVolume(&procdirVol)
 
 	enableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDProcessCollectionEnabled,
+		Name:  v2alpha1.DDProcessCollectionEnabled,
 		Value: "true",
 	}
 
@@ -141,7 +141,7 @@ func (f *liveProcessFeature) manageNodeAgent(agentContainerName apicommon.AgentC
 
 	if f.scrubArgs != nil {
 		scrubArgsEnvVar := &corev1.EnvVar{
-			Name:  apicommon.DDProcessConfigScrubArgs,
+			Name:  DDProcessConfigScrubArgs,
 			Value: apiutils.BoolToString(f.scrubArgs),
 		}
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, scrubArgsEnvVar)
@@ -149,7 +149,7 @@ func (f *liveProcessFeature) manageNodeAgent(agentContainerName apicommon.AgentC
 
 	if f.stripArgs != nil {
 		stripArgsEnvVar := &corev1.EnvVar{
-			Name:  apicommon.DDProcessConfigStripArgs,
+			Name:  DDProcessConfigStripArgs,
 			Value: apiutils.BoolToString(f.stripArgs),
 		}
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, stripArgsEnvVar)
diff --git a/internal/controller/datadogagent/feature/logcollection/envvar.go b/internal/controller/datadogagent/feature/logcollection/envvar.go
new file mode 100644
index 00000000..3e64c744
--- /dev/null
+++ b/internal/controller/datadogagent/feature/logcollection/envvar.go
@@ -0,0 +1,12 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package logcollection
+
+const (
+	DDLogsConfigContainerCollectAll  = "DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL"
+	DDLogsConfigOpenFilesLimit       = "DD_LOGS_CONFIG_OPEN_FILES_LIMIT"
+	DDLogsContainerCollectUsingFiles = "DD_LOGS_CONFIG_K8S_CONTAINER_USE_FILE"
+)
diff --git a/internal/controller/datadogagent/feature/logcollection/feature.go b/internal/controller/datadogagent/feature/logcollection/feature.go
index 41539edf..248f590e 100644
--- a/internal/controller/datadogagent/feature/logcollection/feature.go
+++ b/internal/controller/datadogagent/feature/logcollection/feature.go
@@ -130,20 +130,20 @@ func (f *logCollectionFeature) manageNodeAgent(agentContainerName apicommon.Agen
 
 	// envvars
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDLogsEnabled,
+		Name:  v2alpha1.DDLogsEnabled,
 		Value: "true",
 	})
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDLogsConfigContainerCollectAll,
+		Name:  DDLogsConfigContainerCollectAll,
 		Value: strconv.FormatBool(f.containerCollectAll),
 	})
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDLogsContainerCollectUsingFiles,
+		Name:  DDLogsContainerCollectUsingFiles,
 		Value: strconv.FormatBool(f.containerCollectUsingFiles),
 	})
 	if f.openFilesLimit != 0 {
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDLogsConfigOpenFilesLimit,
+			Name:  DDLogsConfigOpenFilesLimit,
 			Value: strconv.FormatInt(int64(f.openFilesLimit), 10),
 		})
 	}
diff --git a/internal/controller/datadogagent/feature/npm/envvar.go b/internal/controller/datadogagent/feature/npm/envvar.go
new file mode 100644
index 00000000..7e2ac4fd
--- /dev/null
+++ b/internal/controller/datadogagent/feature/npm/envvar.go
@@ -0,0 +1,12 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package npm
+
+const (
+	DDSystemProbeNPMEnabled             = "DD_SYSTEM_PROBE_NETWORK_ENABLED"
+	DDSystemProbeCollectDNSStatsEnabled = "DD_COLLECT_DNS_STATS"
+	DDSystemProbeConntrackEnabled       = "DD_SYSTEM_PROBE_CONFIG_ENABLE_CONNTRACK"
+)
diff --git a/internal/controller/datadogagent/feature/npm/feature.go b/internal/controller/datadogagent/feature/npm/feature.go
index a85a8aeb..69ea564d 100644
--- a/internal/controller/datadogagent/feature/npm/feature.go
+++ b/internal/controller/datadogagent/feature/npm/feature.go
@@ -88,32 +88,32 @@ func (f *npmFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplate
 // It should do nothing if the feature doesn't need to configure it.
 func (f *npmFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	// annotations
-	managers.Annotation().AddAnnotation(apicommon.SystemProbeAppArmorAnnotationKey, apicommon.SystemProbeAppArmorAnnotationValue)
+	managers.Annotation().AddAnnotation(v2alpha1.SystemProbeAppArmorAnnotationKey, v2alpha1.SystemProbeAppArmorAnnotationValue)
 
 	// security context capabilities
 	managers.SecurityContext().AddCapabilitiesToContainer(agent.DefaultCapabilitiesForSystemProbe(), apicommon.SystemProbeContainerName)
 
 	// procdir volume mount
-	procdirVol, procdirVolMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true)
+	procdirVol, procdirVolMount := volume.GetVolumes(v2alpha1.ProcdirVolumeName, v2alpha1.ProcdirHostPath, v2alpha1.ProcdirMountPath, true)
 	managers.Volume().AddVolume(&procdirVol)
 	managers.VolumeMount().AddVolumeMountToContainers(&procdirVolMount, []apicommon.AgentContainerName{apicommon.ProcessAgentContainerName, apicommon.SystemProbeContainerName})
 
 	// cgroups volume mount
-	cgroupsVol, cgroupsVolMount := volume.GetVolumes(apicommon.CgroupsVolumeName, apicommon.CgroupsHostPath, apicommon.CgroupsMountPath, true)
+	cgroupsVol, cgroupsVolMount := volume.GetVolumes(v2alpha1.CgroupsVolumeName, v2alpha1.CgroupsHostPath, v2alpha1.CgroupsMountPath, true)
 	managers.Volume().AddVolume(&cgroupsVol)
 	managers.VolumeMount().AddVolumeMountToContainers(&cgroupsVolMount, []apicommon.AgentContainerName{apicommon.ProcessAgentContainerName, apicommon.SystemProbeContainerName})
 
 	// debugfs volume mount
-	debugfsVol, debugfsVolMount := volume.GetVolumes(apicommon.DebugfsVolumeName, apicommon.DebugfsPath, apicommon.DebugfsPath, false)
+	debugfsVol, debugfsVolMount := volume.GetVolumes(v2alpha1.DebugfsVolumeName, v2alpha1.DebugfsPath, v2alpha1.DebugfsPath, false)
 	managers.Volume().AddVolume(&debugfsVol)
 	managers.VolumeMount().AddVolumeMountToContainers(&debugfsVolMount, []apicommon.AgentContainerName{apicommon.ProcessAgentContainerName, apicommon.SystemProbeContainerName})
 
 	// socket volume mount (needs write perms for the system probe container but not the others)
-	socketVol, socketVolMount := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, false)
+	socketVol, socketVolMount := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, false)
 	managers.Volume().AddVolume(&socketVol)
 	managers.VolumeMount().AddVolumeMountToContainer(&socketVolMount, apicommon.SystemProbeContainerName)
 
-	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, true)
+	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, true)
 	managers.VolumeMount().AddVolumeMountToContainers(
 		&socketVolMountReadOnly,
 		[]apicommon.AgentContainerName{
@@ -132,38 +132,38 @@ func (f *npmFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 	}
 
 	enableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeNPMEnabled,
+		Name:  DDSystemProbeNPMEnabled,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainers(containersForEnvVars, enableEnvVar)
 
 	sysProbeEnableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeEnabled,
+		Name:  v2alpha1.DDSystemProbeEnabled,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainers(containersForEnvVars, sysProbeEnableEnvVar)
 
 	socketEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeSocket,
+		Name:  v2alpha1.DDSystemProbeSocket,
 		Value: v2alpha1.DefaultSystemProbeSocketPath,
 	}
 	managers.EnvVar().AddEnvVarToContainers(containersForEnvVars, socketEnvVar)
 
 	collectDNSStatsEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeCollectDNSStatsEnabled,
+		Name:  DDSystemProbeCollectDNSStatsEnabled,
 		Value: apiutils.BoolToString(&f.collectDNSStats),
 	}
 	managers.EnvVar().AddEnvVarToContainers([]apicommon.AgentContainerName{apicommon.CoreAgentContainerName, apicommon.SystemProbeContainerName}, collectDNSStatsEnvVar)
 
 	connTrackEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeConntrackEnabled,
+		Name:  DDSystemProbeConntrackEnabled,
 		Value: apiutils.BoolToString(&f.enableConntrack),
 	}
 	managers.EnvVar().AddEnvVarToContainers([]apicommon.AgentContainerName{apicommon.CoreAgentContainerName, apicommon.SystemProbeContainerName}, connTrackEnvVar)
 
 	// env vars for Process Agent only
 	sysProbeExternalEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeExternal,
+		Name:  v2alpha1.DDSystemProbeExternal,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ProcessAgentContainerName, sysProbeExternalEnvVar)
diff --git a/internal/controller/datadogagent/feature/oomkill/envvar.go b/internal/controller/datadogagent/feature/oomkill/envvar.go
new file mode 100644
index 00000000..1ae71ffd
--- /dev/null
+++ b/internal/controller/datadogagent/feature/oomkill/envvar.go
@@ -0,0 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package oomkill
+
+const DDEnableOOMKillEnvVar = "DD_SYSTEM_PROBE_CONFIG_ENABLE_OOM_KILL"
diff --git a/internal/controller/datadogagent/feature/oomkill/feature.go b/internal/controller/datadogagent/feature/oomkill/feature.go
index ad8e0ee4..4bf8c71f 100644
--- a/internal/controller/datadogagent/feature/oomkill/feature.go
+++ b/internal/controller/datadogagent/feature/oomkill/feature.go
@@ -76,41 +76,41 @@ func (f *oomKillFeature) ManageNodeAgent(managers feature.PodTemplateManagers, p
 	managers.SecurityContext().AddCapabilitiesToContainer(agent.DefaultCapabilitiesForSystemProbe(), apicommon.SystemProbeContainerName)
 
 	// modules volume mount
-	modulesVol, modulesVolMount := volume.GetVolumes(apicommon.ModulesVolumeName, apicommon.ModulesVolumePath, apicommon.ModulesVolumePath, true)
+	modulesVol, modulesVolMount := volume.GetVolumes(v2alpha1.ModulesVolumeName, v2alpha1.ModulesVolumePath, v2alpha1.ModulesVolumePath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&modulesVolMount, apicommon.SystemProbeContainerName)
 	managers.Volume().AddVolume(&modulesVol)
 
 	// src volume mount
 	_, providerValue := kubernetes.GetProviderLabelKeyValue(provider)
 	if providerValue != kubernetes.GKECosType {
-		srcVol, srcVolMount := volume.GetVolumes(apicommon.SrcVolumeName, apicommon.SrcVolumePath, apicommon.SrcVolumePath, true)
+		srcVol, srcVolMount := volume.GetVolumes(v2alpha1.SrcVolumeName, v2alpha1.SrcVolumePath, v2alpha1.SrcVolumePath, true)
 		managers.VolumeMount().AddVolumeMountToContainer(&srcVolMount, apicommon.SystemProbeContainerName)
 		managers.Volume().AddVolume(&srcVol)
 	}
 
 	// debugfs volume mount
-	debugfsVol, debugfsVolMount := volume.GetVolumes(apicommon.DebugfsVolumeName, apicommon.DebugfsPath, apicommon.DebugfsPath, false)
+	debugfsVol, debugfsVolMount := volume.GetVolumes(v2alpha1.DebugfsVolumeName, v2alpha1.DebugfsPath, v2alpha1.DebugfsPath, false)
 	managers.Volume().AddVolume(&debugfsVol)
 	managers.VolumeMount().AddVolumeMountToContainers(&debugfsVolMount, []apicommon.AgentContainerName{apicommon.ProcessAgentContainerName, apicommon.SystemProbeContainerName})
 
 	// socket volume mount (needs write perms for the system probe container but not the others)
-	socketVol, socketVolMount := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, false)
+	socketVol, socketVolMount := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, false)
 	managers.Volume().AddVolume(&socketVol)
 	managers.VolumeMount().AddVolumeMountToContainer(&socketVolMount, apicommon.SystemProbeContainerName)
 
-	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, true)
+	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&socketVolMountReadOnly, apicommon.CoreAgentContainerName)
 
 	// env vars
 	enableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDEnableOOMKillEnvVar,
+		Name:  DDEnableOOMKillEnvVar,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainers([]apicommon.AgentContainerName{apicommon.CoreAgentContainerName, apicommon.SystemProbeContainerName}, enableEnvVar)
 	managers.EnvVar().AddEnvVarToInitContainer(apicommon.InitConfigContainerName, enableEnvVar)
 
 	sysProbeEnableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeEnabled,
+		Name:  v2alpha1.DDSystemProbeEnabled,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainers(
@@ -119,7 +119,7 @@ func (f *oomKillFeature) ManageNodeAgent(managers feature.PodTemplateManagers, p
 	)
 
 	socketEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeSocket,
+		Name:  v2alpha1.DDSystemProbeSocket,
 		Value: v2alpha1.DefaultSystemProbeSocketPath,
 	}
 	managers.EnvVar().AddEnvVarToContainers([]apicommon.AgentContainerName{apicommon.CoreAgentContainerName, apicommon.SystemProbeContainerName}, socketEnvVar)
diff --git a/internal/controller/datadogagent/feature/orchestratorexplorer/env.go b/internal/controller/datadogagent/feature/orchestratorexplorer/envvar.go
similarity index 56%
rename from internal/controller/datadogagent/feature/orchestratorexplorer/env.go
rename to internal/controller/datadogagent/feature/orchestratorexplorer/envvar.go
index 1aaef527..4f253128 100644
--- a/internal/controller/datadogagent/feature/orchestratorexplorer/env.go
+++ b/internal/controller/datadogagent/feature/orchestratorexplorer/envvar.go
@@ -10,18 +10,25 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	apiutils "github.com/DataDog/datadog-operator/api/utils"
 )
 
+const (
+	DDOrchestratorExplorerEnabled                   = "DD_ORCHESTRATOR_EXPLORER_ENABLED"
+	DDOrchestratorExplorerExtraTags                 = "DD_ORCHESTRATOR_EXPLORER_EXTRA_TAGS"
+	DDOrchestratorExplorerDDUrl                     = "DD_ORCHESTRATOR_EXPLORER_ORCHESTRATOR_DD_URL"
+	DDOrchestratorExplorerAdditionalEndpoints       = "DD_ORCHESTRATOR_ADDITIONAL_ENDPOINTS"
+	DDOrchestratorExplorerContainerScrubbingEnabled = "DD_ORCHESTRATOR_EXPLORER_CONTAINER_SCRUBBING_ENABLED"
+)
+
 func (f *orchestratorExplorerFeature) getEnvVars() []*corev1.EnvVar {
 	envVarsList := []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDOrchestratorExplorerEnabled,
+			Name:  DDOrchestratorExplorerEnabled,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDOrchestratorExplorerContainerScrubbingEnabled,
+			Name:  DDOrchestratorExplorerContainerScrubbingEnabled,
 			Value: apiutils.BoolToString(&f.scrubContainers),
 		},
 	}
@@ -29,14 +36,14 @@ func (f *orchestratorExplorerFeature) getEnvVars() []*corev1.EnvVar {
 	if len(f.extraTags) > 0 {
 		tags, _ := json.Marshal(f.extraTags)
 		envVarsList = append(envVarsList, &corev1.EnvVar{
-			Name:  apicommon.DDOrchestratorExplorerExtraTags,
+			Name:  DDOrchestratorExplorerExtraTags,
 			Value: string(tags),
 		})
 	}
 
 	if f.ddURL != "" {
 		envVarsList = append(envVarsList, &corev1.EnvVar{
-			Name:  apicommon.DDOrchestratorExplorerDDUrl,
+			Name:  DDOrchestratorExplorerDDUrl,
 			Value: f.ddURL,
 		})
 	}
diff --git a/internal/controller/datadogagent/feature/orchestratorexplorer/feature.go b/internal/controller/datadogagent/feature/orchestratorexplorer/feature.go
index 7a41b10a..e0fd74cb 100644
--- a/internal/controller/datadogagent/feature/orchestratorexplorer/feature.go
+++ b/internal/controller/datadogagent/feature/orchestratorexplorer/feature.go
@@ -198,7 +198,7 @@ func (f *orchestratorExplorerFeature) ManageClusterAgent(managers feature.PodTem
 
 		volMount = corev1.VolumeMount{
 			Name:      orchestratorExplorerVolumeName,
-			MountPath: fmt.Sprintf("%s%s/%s", apicommon.ConfigVolumePath, apicommon.ConfdVolumePath, orchestratorExplorerFolderName),
+			MountPath: fmt.Sprintf("%s%s/%s", v2alpha1.ConfigVolumePath, v2alpha1.ConfdVolumePath, orchestratorExplorerFolderName),
 			ReadOnly:  true,
 		}
 	}
diff --git a/internal/controller/datadogagent/feature/otelcollector/defaultconfig/defaultconfig.go b/internal/controller/datadogagent/feature/otelcollector/defaultconfig/defaultconfig.go
new file mode 100644
index 00000000..5ec9362e
--- /dev/null
+++ b/internal/controller/datadogagent/feature/otelcollector/defaultconfig/defaultconfig.go
@@ -0,0 +1,49 @@
+// package defaultconfig exposes the otel-agent default config
+package defaultconfig
+
+var DefaultOtelCollectorConfig = `
+receivers:
+  prometheus:
+    config:
+      scrape_configs:
+        - job_name: "otelcol"
+          scrape_interval: 10s
+          static_configs:
+            - targets: ["0.0.0.0:8888"]
+  otlp:
+    protocols:
+      grpc:
+        endpoint: 0.0.0.0:4317
+      http:
+        endpoint: 0.0.0.0:4318
+exporters:
+  debug:
+    verbosity: detailed
+  datadog:
+    api:
+      key: ""
+processors:
+  infraattributes:
+    cardinality: 2
+  batch:
+    timeout: 10s
+connectors:
+  datadog/connector:
+    traces:
+      compute_top_level_by_span_kind: true
+      peer_tags_aggregation: true
+      compute_stats_by_span_kind: true
+service:
+  pipelines:
+    traces:
+      receivers: [otlp]
+      processors: [infraattributes, batch]
+      exporters: [datadog, datadog/connector]
+    metrics:
+      receivers: [otlp, datadog/connector, prometheus]
+      processors: [infraattributes, batch]
+      exporters: [datadog]
+    logs:
+      receivers: [otlp]
+      processors: [infraattributes, batch]
+      exporters: [datadog]`
diff --git a/internal/controller/datadogagent/feature/otelcollector/feature.go b/internal/controller/datadogagent/feature/otelcollector/feature.go
new file mode 100644
index 00000000..8c091d96
--- /dev/null
+++ b/internal/controller/datadogagent/feature/otelcollector/feature.go
@@ -0,0 +1,212 @@
+package otelcollector
+
+import (
+	"strconv"
+	"strings"
+
+	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
+	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
+	apiutils "github.com/DataDog/datadog-operator/api/utils"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/otelcollector/defaultconfig"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/object/configmap"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/object/volume"
+	"github.com/DataDog/datadog-operator/pkg/kubernetes"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+const (
+	otelAgentVolumeName = "otel-agent-config-volume"
+	otelConfigFileName  = "otel-config.yaml"
+)
+
+func init() {
+	err := feature.Register(feature.OtelAgentIDType, buildOtelCollectorFeature)
+	if err != nil {
+		panic(err)
+	}
+}
+
+func buildOtelCollectorFeature(options *feature.Options) feature.Feature {
+	return &otelCollectorFeature{}
+}
+
+type otelCollectorFeature struct {
+	customConfig    *v2alpha1.CustomConfig
+	owner           metav1.Object
+	configMapName   string
+	ports           []*corev1.ContainerPort
+	coreAgentConfig coreAgentConfig
+}
+
+type coreAgentConfig struct {
+	extension_timeout *int
+	extension_url     *string
+	enabled           *bool
+}
+
+func (o otelCollectorFeature) ID() feature.IDType {
+	return feature.OtelAgentIDType
+}
+
+func (o *otelCollectorFeature) Configure(dda *v2alpha1.DatadogAgent) feature.RequiredComponents {
+	o.owner = dda
+	if dda.Spec.Features.OtelCollector.Conf != nil {
+		o.customConfig = dda.Spec.Features.OtelCollector.Conf
+	}
+	o.configMapName = v2alpha1.GetConfName(dda, o.customConfig, v2alpha1.DefaultOTelAgentConf)
+
+	if dda.Spec.Features.OtelCollector.CoreConfig != nil {
+		o.coreAgentConfig.enabled = dda.Spec.Features.OtelCollector.CoreConfig.Enabled
+		o.coreAgentConfig.extension_timeout = dda.Spec.Features.OtelCollector.CoreConfig.ExtensionTimeout
+		o.coreAgentConfig.extension_url = dda.Spec.Features.OtelCollector.CoreConfig.ExtensionURL
+	}
+
+	if len(dda.Spec.Features.OtelCollector.Ports) == 0 {
+		o.ports = []*corev1.ContainerPort{
+			{
+				Name:          "otel-http",
+				ContainerPort: 4318,
+				HostPort:      4318,
+				Protocol:      corev1.ProtocolTCP,
+			},
+			{
+				Name:          "otel-grpc",
+				ContainerPort: 4317,
+				HostPort:      4317,
+				Protocol:      corev1.ProtocolTCP,
+			},
+		}
+	} else {
+		o.ports = dda.Spec.Features.OtelCollector.Ports
+	}
+
+	var reqComp feature.RequiredComponents
+	if apiutils.BoolValue(dda.Spec.Features.OtelCollector.Enabled) {
+		reqComp = feature.RequiredComponents{
+			Agent: feature.RequiredComponent{
+				IsRequired: apiutils.NewBoolPointer(true),
+				Containers: []apicommon.AgentContainerName{
+					apicommon.CoreAgentContainerName,
+					apicommon.OtelAgent,
+				},
+			},
+		}
+
+	}
+	return reqComp
+}
+
+func (o *otelCollectorFeature) buildOTelAgentCoreConfigMap() (*corev1.ConfigMap, error) {
+	if o.customConfig != nil && o.customConfig.ConfigData != nil {
+		return configmap.BuildConfigMapConfigData(o.owner.GetNamespace(), o.customConfig.ConfigData, o.configMapName, otelConfigFileName)
+	}
+	return nil, nil
+}
+
+func (o otelCollectorFeature) ManageDependencies(managers feature.ResourceManagers, components feature.RequiredComponents) error {
+	// check if an otel collector config was provided. If not, use default.
+	if o.customConfig == nil {
+		o.customConfig = &v2alpha1.CustomConfig{}
+	}
+	if o.customConfig.ConfigData == nil && o.customConfig.ConfigMap == nil {
+		var defaultConfig = defaultconfig.DefaultOtelCollectorConfig
+		for _, port := range o.ports {
+			if port.Name == "otel-grpc" {
+				defaultConfig = strings.Replace(defaultConfig, "4317", strconv.Itoa(int(port.ContainerPort)), 1)
+			}
+			if port.Name == "otel-http" {
+				defaultConfig = strings.Replace(defaultConfig, "4318", strconv.Itoa(int(port.ContainerPort)), 1)
+			}
+		}
+		o.customConfig.ConfigData = &defaultConfig
+	}
+
+	// create configMap if customConfig is provided
+	configMap, err := o.buildOTelAgentCoreConfigMap()
+	if err != nil {
+		return err
+	}
+
+	if configMap != nil {
+		if err := managers.Store().AddOrUpdate(kubernetes.ConfigMapKind, configMap); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func (o otelCollectorFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error {
+	return nil
+}
+
+func (o otelCollectorFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provider string) error {
+	var vol corev1.Volume
+	if o.customConfig != nil && o.customConfig.ConfigMap != nil {
+		// Custom config is referenced via ConfigMap
+		vol = volume.GetVolumeFromConfigMap(
+			o.customConfig.ConfigMap,
+			o.configMapName,
+			otelAgentVolumeName,
+		)
+	} else {
+		// Otherwise, configMap was created in ManageDependencies (whether from CustomConfig.ConfigData or using defaults, so mount default volume)
+		vol = volume.GetBasicVolume(o.configMapName, otelAgentVolumeName)
+	}
+
+	// create volume
+	managers.Volume().AddVolume(&vol)
+
+	// [investigation needed]: When the user provides a custom config map, the file name *must be* otel-config.yaml. If we choose to allow
+	// any file name, we would need to update both the volume mount here, as well as the otel-agent container command. I haven't seen this
+	// done for other containers, which is why I think it's acceptable to force users to use the `otel-config.yaml` name.
+	volMount := volume.GetVolumeMountWithSubPath(otelAgentVolumeName, v2alpha1.ConfigVolumePath+"/"+otelConfigFileName, otelConfigFileName)
+	managers.VolumeMount().AddVolumeMountToContainer(&volMount, apicommon.OtelAgent)
+
+	// add ports
+	for _, port := range o.ports {
+		// bind container port to host port.
+		port.HostPort = port.ContainerPort
+		managers.Port().AddPortToContainer(apicommon.OtelAgent, port)
+	}
+
+	var enableEnvVar *corev1.EnvVar
+	if o.coreAgentConfig.enabled != nil {
+		if *o.coreAgentConfig.enabled {
+			// only need to set env var if true, as it will default to false.
+			enableEnvVar = &corev1.EnvVar{
+				Name:  v2alpha1.DDOtelCollectorCoreConfigEnabled,
+				Value: apiutils.BoolToString(o.coreAgentConfig.enabled),
+			}
+			managers.EnvVar().AddEnvVarToContainers([]apicommon.AgentContainerName{apicommon.CoreAgentContainerName}, enableEnvVar)
+		}
+	} else {
+		managers.EnvVar().AddEnvVarToContainers([]apicommon.AgentContainerName{apicommon.CoreAgentContainerName}, &corev1.EnvVar{
+			Name:  v2alpha1.DDOtelCollectorCoreConfigEnabled,
+			Value: "true",
+		})
+	}
+
+	if o.coreAgentConfig.extension_timeout != nil {
+		managers.EnvVar().AddEnvVarToContainers([]apicommon.AgentContainerName{apicommon.CoreAgentContainerName}, &corev1.EnvVar{
+			Name:  v2alpha1.DDOtelCollectorCoreConfigExtensionTimeout,
+			Value: strconv.Itoa(*o.coreAgentConfig.extension_timeout),
+		})
+	}
+	if o.coreAgentConfig.extension_url != nil {
+		managers.EnvVar().AddEnvVarToContainers([]apicommon.AgentContainerName{apicommon.CoreAgentContainerName}, &corev1.EnvVar{
+			Name:  v2alpha1.DDOtelCollectorCoreConfigExtensionURL,
+			Value: *o.coreAgentConfig.extension_url,
+		})
+	}
+	return nil
+}
+
+func (o otelCollectorFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplateManagers, provider string) error {
+	return nil
+}
+
+func (o otelCollectorFeature) ManageClusterChecksRunner(managers feature.PodTemplateManagers) error {
+	return nil
+}
diff --git a/internal/controller/datadogagent/feature/otlp/envvar.go b/internal/controller/datadogagent/feature/otlp/envvar.go
new file mode 100644
index 00000000..abb1ab7d
--- /dev/null
+++ b/internal/controller/datadogagent/feature/otlp/envvar.go
@@ -0,0 +1,11 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2022-present Datadog, Inc.
+
+package otlp
+
+const (
+	DDOTLPgRPCEndpoint = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT"
+	DDOTLPHTTPEndpoint = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT"
+)
diff --git a/internal/controller/datadogagent/feature/otlp/feature.go b/internal/controller/datadogagent/feature/otlp/feature.go
index a725c866..9512f0ae 100644
--- a/internal/controller/datadogagent/feature/otlp/feature.go
+++ b/internal/controller/datadogagent/feature/otlp/feature.go
@@ -370,7 +370,7 @@ func (f *otlpFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplat
 			}
 		}
 		envVar := &corev1.EnvVar{
-			Name:  apicommon.DDOTLPgRPCEndpoint,
+			Name:  DDOTLPgRPCEndpoint,
 			Value: f.grpcEndpoint,
 		}
 		managers.Port().AddPortToContainer(apicommon.UnprivilegedSingleAgentContainerName, otlpgrpcPort)
@@ -395,7 +395,7 @@ func (f *otlpFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplat
 			}
 		}
 		envVar := &corev1.EnvVar{
-			Name:  apicommon.DDOTLPHTTPEndpoint,
+			Name:  DDOTLPHTTPEndpoint,
 			Value: f.httpEndpoint,
 		}
 		managers.Port().AddPortToContainer(apicommon.UnprivilegedSingleAgentContainerName, otlphttpPort)
@@ -430,7 +430,7 @@ func (f *otlpFeature) ManageNodeAgent(managers feature.PodTemplateManagers, prov
 			}
 		}
 		envVar := &corev1.EnvVar{
-			Name:  apicommon.DDOTLPgRPCEndpoint,
+			Name:  DDOTLPgRPCEndpoint,
 			Value: f.grpcEndpoint,
 		}
 		managers.Port().AddPortToContainer(apicommon.CoreAgentContainerName, otlpgrpcPort)
@@ -458,7 +458,7 @@ func (f *otlpFeature) ManageNodeAgent(managers feature.PodTemplateManagers, prov
 			}
 		}
 		envVar := &corev1.EnvVar{
-			Name:  apicommon.DDOTLPHTTPEndpoint,
+			Name:  DDOTLPHTTPEndpoint,
 			Value: f.httpEndpoint,
 		}
 		managers.Port().AddPortToContainer(apicommon.CoreAgentContainerName, otlphttpPort)
diff --git a/internal/controller/datadogagent/feature/processdiscovery/envvar.go b/internal/controller/datadogagent/feature/processdiscovery/envvar.go
new file mode 100644
index 00000000..404a7a0b
--- /dev/null
+++ b/internal/controller/datadogagent/feature/processdiscovery/envvar.go
@@ -0,0 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package processdiscovery
+
+const DDProcessDiscoveryEnabled = "DD_PROCESS_CONFIG_PROCESS_DISCOVERY_ENABLED"
diff --git a/internal/controller/datadogagent/feature/processdiscovery/feature.go b/internal/controller/datadogagent/feature/processdiscovery/feature.go
index 38bce2fe..03be9ed0 100644
--- a/internal/controller/datadogagent/feature/processdiscovery/feature.go
+++ b/internal/controller/datadogagent/feature/processdiscovery/feature.go
@@ -1,3 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
 package processdiscovery
 
 import (
@@ -64,7 +69,7 @@ func (p processDiscoveryFeature) ManageClusterAgent(managers feature.PodTemplate
 func (p processDiscoveryFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	// Always add this envvar to Core and Process containers
 	runInCoreAgentEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDProcessConfigRunInCoreAgent,
+		Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 		Value: apiutils.BoolToString(&p.runInCoreAgent),
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ProcessAgentContainerName, runInCoreAgentEnvVar)
@@ -80,7 +85,7 @@ func (p processDiscoveryFeature) ManageNodeAgent(managers feature.PodTemplateMan
 
 func (p processDiscoveryFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	runInCoreAgentEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDProcessConfigRunInCoreAgent,
+		Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 		Value: apiutils.BoolToString(&p.runInCoreAgent),
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.UnprivilegedSingleAgentContainerName, runInCoreAgentEnvVar)
@@ -90,22 +95,22 @@ func (p processDiscoveryFeature) ManageSingleContainerNodeAgent(managers feature
 
 func (p processDiscoveryFeature) manageNodeAgent(agentContainerName apicommon.AgentContainerName, managers feature.PodTemplateManagers, provider string) error {
 	// passwd volume mount
-	passwdVol, passwdVolMount := volume.GetVolumes(apicommon.PasswdVolumeName, apicommon.PasswdHostPath, apicommon.PasswdMountPath, true)
+	passwdVol, passwdVolMount := volume.GetVolumes(v2alpha1.PasswdVolumeName, v2alpha1.PasswdHostPath, v2alpha1.PasswdMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&passwdVolMount, agentContainerName)
 	managers.Volume().AddVolume(&passwdVol)
 
 	// cgroups volume mount
-	cgroupsVol, cgroupsVolMount := volume.GetVolumes(apicommon.CgroupsVolumeName, apicommon.CgroupsHostPath, apicommon.CgroupsMountPath, true)
+	cgroupsVol, cgroupsVolMount := volume.GetVolumes(v2alpha1.CgroupsVolumeName, v2alpha1.CgroupsHostPath, v2alpha1.CgroupsMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&cgroupsVolMount, agentContainerName)
 	managers.Volume().AddVolume(&cgroupsVol)
 
 	// procdir volume mount
-	procdirVol, procdirVolMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true)
+	procdirVol, procdirVolMount := volume.GetVolumes(v2alpha1.ProcdirVolumeName, v2alpha1.ProcdirHostPath, v2alpha1.ProcdirMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&procdirVolMount, agentContainerName)
 	managers.Volume().AddVolume(&procdirVol)
 
 	enableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDProcessDiscoveryEnabled,
+		Name:  DDProcessDiscoveryEnabled,
 		Value: "true",
 	}
 
diff --git a/internal/controller/datadogagent/feature/prometheusscrape/envvar.go b/internal/controller/datadogagent/feature/prometheusscrape/envvar.go
new file mode 100644
index 00000000..d0bcf3c9
--- /dev/null
+++ b/internal/controller/datadogagent/feature/prometheusscrape/envvar.go
@@ -0,0 +1,13 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package prometheusscrape
+
+const (
+	DDPrometheusScrapeChecks           = "DD_PROMETHEUS_SCRAPE_CHECKS"
+	DDPrometheusScrapeEnabled          = "DD_PROMETHEUS_SCRAPE_ENABLED"
+	DDPrometheusScrapeServiceEndpoints = "DD_PROMETHEUS_SCRAPE_SERVICE_ENDPOINTS"
+	DDPrometheusScrapeVersion          = "DD_PROMETHEUS_SCRAPE_VERSION"
+)
diff --git a/internal/controller/datadogagent/feature/prometheusscrape/feature.go b/internal/controller/datadogagent/feature/prometheusscrape/feature.go
index 26ea8ab6..3a939027 100644
--- a/internal/controller/datadogagent/feature/prometheusscrape/feature.go
+++ b/internal/controller/datadogagent/feature/prometheusscrape/feature.go
@@ -86,22 +86,22 @@ func (f *prometheusScrapeFeature) ManageDependencies(managers feature.ResourceMa
 // It should do nothing if the feature doesn't need to configure it.
 func (f *prometheusScrapeFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error {
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDPrometheusScrapeEnabled,
+		Name:  DDPrometheusScrapeEnabled,
 		Value: "true",
 	})
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDPrometheusScrapeServiceEndpoints,
+		Name:  DDPrometheusScrapeServiceEndpoints,
 		Value: strconv.FormatBool(f.enableServiceEndpoints),
 	})
 	if f.additionalConfigs != "" {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDPrometheusScrapeChecks,
+			Name:  DDPrometheusScrapeChecks,
 			Value: apiutils.YAMLToJSONString(f.additionalConfigs),
 		})
 	}
 	if f.openmetricsVersion != 0 {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDPrometheusScrapeVersion,
+			Name:  DDPrometheusScrapeVersion,
 			Value: strconv.Itoa(f.openmetricsVersion),
 		})
 	}
@@ -126,22 +126,22 @@ func (f *prometheusScrapeFeature) ManageNodeAgent(managers feature.PodTemplateMa
 
 func (f *prometheusScrapeFeature) manageNodeAgent(agentContainerName apicommon.AgentContainerName, managers feature.PodTemplateManagers, provider string) error {
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDPrometheusScrapeEnabled,
+		Name:  DDPrometheusScrapeEnabled,
 		Value: "true",
 	})
 	managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-		Name:  apicommon.DDPrometheusScrapeServiceEndpoints,
+		Name:  DDPrometheusScrapeServiceEndpoints,
 		Value: strconv.FormatBool(f.enableServiceEndpoints),
 	})
 	if f.additionalConfigs != "" {
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDPrometheusScrapeChecks,
+			Name:  DDPrometheusScrapeChecks,
 			Value: apiutils.YAMLToJSONString(f.additionalConfigs),
 		})
 	}
 	if f.openmetricsVersion != 0 {
 		managers.EnvVar().AddEnvVarToContainer(agentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDPrometheusScrapeVersion,
+			Name:  DDPrometheusScrapeVersion,
 			Value: strconv.Itoa(f.openmetricsVersion),
 		})
 	}
diff --git a/internal/controller/datadogagent/feature/remoteconfig/envvar.go b/internal/controller/datadogagent/feature/remoteconfig/envvar.go
new file mode 100644
index 00000000..c867ced8
--- /dev/null
+++ b/internal/controller/datadogagent/feature/remoteconfig/envvar.go
@@ -0,0 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package remoteconfig
+
+const DDRemoteConfigurationEnabled = "DD_REMOTE_CONFIGURATION_ENABLED"
diff --git a/internal/controller/datadogagent/feature/remoteconfig/feature.go b/internal/controller/datadogagent/feature/remoteconfig/feature.go
index ae122900..c86470be 100644
--- a/internal/controller/datadogagent/feature/remoteconfig/feature.go
+++ b/internal/controller/datadogagent/feature/remoteconfig/feature.go
@@ -102,7 +102,7 @@ func (f *rcFeature) ManageDependencies(managers feature.ResourceManagers, compon
 // It should do nothing if the feature doesn't need to configure it.
 func (f *rcFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error {
 	enabledEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDRemoteConfigurationEnabled,
+		Name:  DDRemoteConfigurationEnabled,
 		Value: apiutils.BoolToString(&f.enabled),
 	}
 	managers.EnvVar().AddEnvVar(enabledEnvVar)
@@ -129,7 +129,7 @@ func (f *rcFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplateM
 // It should do nothing if the feature doesn't need to configure it.
 func (f *rcFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	enabledEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDRemoteConfigurationEnabled,
+		Name:  DDRemoteConfigurationEnabled,
 		Value: apiutils.BoolToString(&f.enabled),
 	}
 	managers.EnvVar().AddEnvVar(enabledEnvVar)
diff --git a/internal/controller/datadogagent/feature/sbom/envvar.go b/internal/controller/datadogagent/feature/sbom/envvar.go
new file mode 100644
index 00000000..f11f6d9a
--- /dev/null
+++ b/internal/controller/datadogagent/feature/sbom/envvar.go
@@ -0,0 +1,16 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package sbom
+
+const (
+	DDSBOMEnabled                      = "DD_SBOM_ENABLED"
+	DDSBOMContainerImageEnabled        = "DD_SBOM_CONTAINER_IMAGE_ENABLED"
+	DDSBOMContainerImageAnalyzers      = "DD_SBOM_CONTAINER_IMAGE_ANALYZERS"
+	DDSBOMContainerUseMount            = "DD_SBOM_CONTAINER_IMAGE_USE_MOUNT"
+	DDSBOMContainerOverlayFSDirectScan = "DD_SBOM_CONTAINER_IMAGE_OVERLAYFS_DIRECT_SCAN"
+	DDSBOMHostEnabled                  = "DD_SBOM_HOST_ENABLED"
+	DDSBOMHostAnalyzers                = "DD_SBOM_HOST_ANALYZERS"
+)
diff --git a/internal/controller/datadogagent/feature/sbom/feature.go b/internal/controller/datadogagent/feature/sbom/feature.go
index a41732ca..8a284d19 100644
--- a/internal/controller/datadogagent/feature/sbom/feature.go
+++ b/internal/controller/datadogagent/feature/sbom/feature.go
@@ -144,29 +144,29 @@ func (p sbomFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplate
 // It should do nothing if the feature doesn't need to configure it.
 func (f *sbomFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-		Name:  apicommon.DDSBOMEnabled,
+		Name:  DDSBOMEnabled,
 		Value: apiutils.BoolToString(&f.enabled),
 	})
 
 	managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-		Name:  apicommon.DDSBOMContainerImageEnabled,
+		Name:  DDSBOMContainerImageEnabled,
 		Value: apiutils.BoolToString(&f.containerImageEnabled),
 	})
 	if len(f.containerImageAnalyzers) > 0 {
 		managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-			Name:  apicommon.DDSBOMContainerImageAnalyzers,
+			Name:  DDSBOMContainerImageAnalyzers,
 			Value: strings.Join(f.containerImageAnalyzers, " "),
 		})
 	}
 	if f.containerImageUncompressedLayersSupport {
 		if f.containerImageOverlayFSDirectScan {
 			managers.EnvVar().AddEnvVarToContainer(apicommon.CoreAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDSBOMContainerOverlayFSDirectScan,
+				Name:  DDSBOMContainerOverlayFSDirectScan,
 				Value: "true",
 			})
 		} else {
 			managers.EnvVar().AddEnvVarToContainer(apicommon.CoreAgentContainerName, &corev1.EnvVar{
-				Name:  apicommon.DDSBOMContainerUseMount,
+				Name:  DDSBOMContainerUseMount,
 				Value: "true",
 			})
 
@@ -175,7 +175,7 @@ func (f *sbomFeature) ManageNodeAgent(managers feature.PodTemplateManagers, prov
 				apicommon.CoreAgentContainerName,
 			)
 
-			managers.Annotation().AddAnnotation(apicommon.AgentAppArmorAnnotationKey, apicommon.AgentAppArmorAnnotationValue)
+			managers.Annotation().AddAnnotation(v2alpha1.AgentAppArmorAnnotationKey, v2alpha1.AgentAppArmorAnnotationValue)
 		}
 
 		volMgr := managers.Volume()
@@ -187,26 +187,26 @@ func (f *sbomFeature) ManageNodeAgent(managers feature.PodTemplateManagers, prov
 	}
 
 	managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-		Name:  apicommon.DDSBOMHostEnabled,
+		Name:  DDSBOMHostEnabled,
 		Value: apiutils.BoolToString(&f.hostEnabled),
 	})
 	if len(f.hostAnalyzers) > 0 {
 		managers.EnvVar().AddEnvVar(&corev1.EnvVar{
-			Name:  apicommon.DDSBOMHostAnalyzers,
+			Name:  DDSBOMHostAnalyzers,
 			Value: strings.Join(f.hostAnalyzers, " "),
 		})
 	}
 
 	if f.hostEnabled {
 		managers.EnvVar().AddEnvVarToContainer(apicommon.CoreAgentContainerName, &corev1.EnvVar{
-			Name:  apicommon.DDHostRootEnvVar,
+			Name:  v2alpha1.DDHostRootEnvVar,
 			Value: "/host",
 		})
 
 		volMgr := managers.Volume()
 		volMountMgr := managers.VolumeMount()
 
-		osReleaseVol, osReleaseVolMount := volume.GetVolumes(apicommon.SystemProbeOSReleaseDirVolumeName, apicommon.SystemProbeOSReleaseDirVolumePath, apicommon.SystemProbeOSReleaseDirMountPath, true)
+		osReleaseVol, osReleaseVolMount := volume.GetVolumes(v2alpha1.SystemProbeOSReleaseDirVolumeName, v2alpha1.SystemProbeOSReleaseDirVolumePath, v2alpha1.SystemProbeOSReleaseDirMountPath, true)
 		volMountMgr.AddVolumeMountToContainer(&osReleaseVolMount, apicommon.CoreAgentContainerName)
 		volMgr.AddVolume(&osReleaseVol)
 
diff --git a/internal/controller/datadogagent/feature/servicediscovery/envvar.go b/internal/controller/datadogagent/feature/servicediscovery/envvar.go
new file mode 100644
index 00000000..01388485
--- /dev/null
+++ b/internal/controller/datadogagent/feature/servicediscovery/envvar.go
@@ -0,0 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package servicediscovery
+
+const DDServiceDiscoveryEnabled = "DD_DISCOVERY_ENABLED"
diff --git a/internal/controller/datadogagent/feature/servicediscovery/feature.go b/internal/controller/datadogagent/feature/servicediscovery/feature.go
index 44396d4c..55f4d95a 100644
--- a/internal/controller/datadogagent/feature/servicediscovery/feature.go
+++ b/internal/controller/datadogagent/feature/servicediscovery/feature.go
@@ -1,3 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
 package servicediscovery
 
 import (
@@ -56,26 +61,26 @@ func (f *serviceDiscoveryFeature) ManageClusterAgent(feature.PodTemplateManagers
 // It should do nothing if the feature doesn't need to configure it.
 func (f *serviceDiscoveryFeature) ManageNodeAgent(managers feature.PodTemplateManagers, _ string) error {
 	// annotations
-	managers.Annotation().AddAnnotation(apicommon.SystemProbeAppArmorAnnotationKey, apicommon.SystemProbeAppArmorAnnotationValue)
+	managers.Annotation().AddAnnotation(v2alpha1.SystemProbeAppArmorAnnotationKey, v2alpha1.SystemProbeAppArmorAnnotationValue)
 
 	// security context capabilities
 	managers.SecurityContext().AddCapabilitiesToContainer(agent.DefaultCapabilitiesForSystemProbe(), apicommon.SystemProbeContainerName)
 
 	// socket volume mount (needs write perms for the system probe container but not the others)
-	procdirVol, procdirMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true)
+	procdirVol, procdirMount := volume.GetVolumes(v2alpha1.ProcdirVolumeName, v2alpha1.ProcdirHostPath, v2alpha1.ProcdirMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&procdirMount, apicommon.SystemProbeContainerName)
 	managers.Volume().AddVolume(&procdirVol)
 
-	socketVol, socketVolMount := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, false)
+	socketVol, socketVolMount := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, false)
 	managers.Volume().AddVolume(&socketVol)
 	managers.VolumeMount().AddVolumeMountToContainer(&socketVolMount, apicommon.SystemProbeContainerName)
 
-	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, true)
+	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&socketVolMountReadOnly, apicommon.CoreAgentContainerName)
 
 	// env vars
 	enableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDServiceDiscoveryEnabled,
+		Name:  DDServiceDiscoveryEnabled,
 		Value: "true",
 	}
 
@@ -83,7 +88,7 @@ func (f *serviceDiscoveryFeature) ManageNodeAgent(managers feature.PodTemplateMa
 	managers.EnvVar().AddEnvVarToInitContainer(apicommon.InitConfigContainerName, enableEnvVar)
 
 	socketEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeSocket,
+		Name:  v2alpha1.DDSystemProbeSocket,
 		Value: v2alpha1.DefaultSystemProbeSocketPath,
 	}
 
diff --git a/internal/controller/datadogagent/feature/tcpqueuelength/envvar.go b/internal/controller/datadogagent/feature/tcpqueuelength/envvar.go
new file mode 100644
index 00000000..64bfa85b
--- /dev/null
+++ b/internal/controller/datadogagent/feature/tcpqueuelength/envvar.go
@@ -0,0 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package tcpqueuelength
+
+const DDEnableTCPQueueLengthEnvVar = "DD_SYSTEM_PROBE_CONFIG_ENABLE_TCP_QUEUE_LENGTH"
diff --git a/internal/controller/datadogagent/feature/tcpqueuelength/feature.go b/internal/controller/datadogagent/feature/tcpqueuelength/feature.go
index 8fa1c557..36c3129c 100644
--- a/internal/controller/datadogagent/feature/tcpqueuelength/feature.go
+++ b/internal/controller/datadogagent/feature/tcpqueuelength/feature.go
@@ -80,34 +80,34 @@ func (f *tcpQueueLengthFeature) ManageNodeAgent(managers feature.PodTemplateMana
 	managers.SecurityContext().AddCapabilitiesToContainer(agent.DefaultCapabilitiesForSystemProbe(), apicommon.SystemProbeContainerName)
 
 	// modules volume mount
-	modulesVol, modulesVolMount := volume.GetVolumes(apicommon.ModulesVolumeName, apicommon.ModulesVolumePath, apicommon.ModulesVolumePath, true)
+	modulesVol, modulesVolMount := volume.GetVolumes(v2alpha1.ModulesVolumeName, v2alpha1.ModulesVolumePath, v2alpha1.ModulesVolumePath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&modulesVolMount, apicommon.SystemProbeContainerName)
 	managers.Volume().AddVolume(&modulesVol)
 
 	// src volume mount
 	_, providerValue := kubernetes.GetProviderLabelKeyValue(provider)
 	if providerValue != kubernetes.GKECosType {
-		srcVol, srcVolMount := volume.GetVolumes(apicommon.SrcVolumeName, apicommon.SrcVolumePath, apicommon.SrcVolumePath, true)
+		srcVol, srcVolMount := volume.GetVolumes(v2alpha1.SrcVolumeName, v2alpha1.SrcVolumePath, v2alpha1.SrcVolumePath, true)
 		managers.VolumeMount().AddVolumeMountToContainer(&srcVolMount, apicommon.SystemProbeContainerName)
 		managers.Volume().AddVolume(&srcVol)
 	}
 
 	// debugfs volume mount
-	debugfsVol, debugfsVolMount := volume.GetVolumes(apicommon.DebugfsVolumeName, apicommon.DebugfsPath, apicommon.DebugfsPath, false)
+	debugfsVol, debugfsVolMount := volume.GetVolumes(v2alpha1.DebugfsVolumeName, v2alpha1.DebugfsPath, v2alpha1.DebugfsPath, false)
 	managers.Volume().AddVolume(&debugfsVol)
 	managers.VolumeMount().AddVolumeMountToContainers(&debugfsVolMount, []apicommon.AgentContainerName{apicommon.ProcessAgentContainerName, apicommon.SystemProbeContainerName})
 
 	// socket volume mount (needs write perms for the system probe container but not the others)
-	socketVol, socketVolMount := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, false)
+	socketVol, socketVolMount := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, false)
 	managers.Volume().AddVolume(&socketVol)
 	managers.VolumeMount().AddVolumeMountToContainer(&socketVolMount, apicommon.SystemProbeContainerName)
 
-	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, true)
+	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&socketVolMountReadOnly, apicommon.CoreAgentContainerName)
 
 	// env vars
 	enableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDEnableTCPQueueLengthEnvVar,
+		Name:  DDEnableTCPQueueLengthEnvVar,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainers(
@@ -117,7 +117,7 @@ func (f *tcpQueueLengthFeature) ManageNodeAgent(managers feature.PodTemplateMana
 	managers.EnvVar().AddEnvVarToInitContainer(apicommon.InitConfigContainerName, enableEnvVar)
 
 	sysProbeEnableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeEnabled,
+		Name:  v2alpha1.DDSystemProbeEnabled,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainers(
@@ -126,7 +126,7 @@ func (f *tcpQueueLengthFeature) ManageNodeAgent(managers feature.PodTemplateMana
 	)
 
 	socketEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeSocket,
+		Name:  v2alpha1.DDSystemProbeSocket,
 		Value: v2alpha1.DefaultSystemProbeSocketPath,
 	}
 	managers.EnvVar().AddEnvVarToContainers(
diff --git a/internal/controller/datadogagent/feature/types.go b/internal/controller/datadogagent/feature/types.go
index 04767246..c0d34f17 100644
--- a/internal/controller/datadogagent/feature/types.go
+++ b/internal/controller/datadogagent/feature/types.go
@@ -150,8 +150,6 @@ type Options struct {
 	SupportExtendedDaemonset bool
 
 	Logger logr.Logger
-
-	OtelAgentEnabled bool
 }
 
 // BuildFunc function type used by each Feature during its factory registration.
diff --git a/internal/controller/datadogagent/feature/usm/envvar.go b/internal/controller/datadogagent/feature/usm/envvar.go
new file mode 100644
index 00000000..93c27fc1
--- /dev/null
+++ b/internal/controller/datadogagent/feature/usm/envvar.go
@@ -0,0 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package usm
+
+const DDSystemProbeServiceMonitoringEnabled = "DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED"
diff --git a/internal/controller/datadogagent/feature/usm/feature.go b/internal/controller/datadogagent/feature/usm/feature.go
index 3a6f289b..fb4e499c 100644
--- a/internal/controller/datadogagent/feature/usm/feature.go
+++ b/internal/controller/datadogagent/feature/usm/feature.go
@@ -101,26 +101,26 @@ func (f *usmFeature) ManageSingleContainerNodeAgent(managers feature.PodTemplate
 // It should do nothing if the feature doesn't need to configure it.
 func (f *usmFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provider string) error {
 	// annotations
-	managers.Annotation().AddAnnotation(apicommon.SystemProbeAppArmorAnnotationKey, apicommon.SystemProbeAppArmorAnnotationValue)
+	managers.Annotation().AddAnnotation(v2alpha1.SystemProbeAppArmorAnnotationKey, v2alpha1.SystemProbeAppArmorAnnotationValue)
 
 	// security context capabilities
 	managers.SecurityContext().AddCapabilitiesToContainer(agent.DefaultCapabilitiesForSystemProbe(), apicommon.SystemProbeContainerName)
 
 	// volume mounts
-	procdirVol, procdirMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true)
+	procdirVol, procdirMount := volume.GetVolumes(v2alpha1.ProcdirVolumeName, v2alpha1.ProcdirHostPath, v2alpha1.ProcdirMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&procdirMount, apicommon.SystemProbeContainerName)
 	managers.Volume().AddVolume(&procdirVol)
 
-	cgroupsVol, cgroupsMount := volume.GetVolumes(apicommon.CgroupsVolumeName, apicommon.CgroupsHostPath, apicommon.CgroupsMountPath, true)
+	cgroupsVol, cgroupsMount := volume.GetVolumes(v2alpha1.CgroupsVolumeName, v2alpha1.CgroupsHostPath, v2alpha1.CgroupsMountPath, true)
 	managers.VolumeMount().AddVolumeMountToContainer(&cgroupsMount, apicommon.SystemProbeContainerName)
 	managers.Volume().AddVolume(&cgroupsVol)
 
-	debugfsVol, debugfsMount := volume.GetVolumes(apicommon.DebugfsVolumeName, apicommon.DebugfsPath, apicommon.DebugfsPath, false)
+	debugfsVol, debugfsMount := volume.GetVolumes(v2alpha1.DebugfsVolumeName, v2alpha1.DebugfsPath, v2alpha1.DebugfsPath, false)
 	managers.VolumeMount().AddVolumeMountToContainer(&debugfsMount, apicommon.SystemProbeContainerName)
 	managers.Volume().AddVolume(&debugfsVol)
 
 	// socket volume mount (needs write perms for the system probe container but not the others)
-	socketDirVol, socketDirMount := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, false)
+	socketDirVol, socketDirMount := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, false)
 	managers.VolumeMount().AddVolumeMountToContainers(
 		&socketDirMount,
 		[]apicommon.AgentContainerName{
@@ -129,7 +129,7 @@ func (f *usmFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 	)
 	managers.Volume().AddVolume(&socketDirVol)
 
-	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath, true)
+	_, socketVolMountReadOnly := volume.GetVolumesEmptyDir(v2alpha1.SystemProbeSocketVolumeName, v2alpha1.SystemProbeSocketVolumePath, true)
 	managers.VolumeMount().AddVolumeMountToContainers(
 		&socketVolMountReadOnly,
 		[]apicommon.AgentContainerName{
@@ -146,13 +146,13 @@ func (f *usmFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 	}
 
 	enabledEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeServiceMonitoringEnabled,
+		Name:  DDSystemProbeServiceMonitoringEnabled,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainers(containersForEnvVars, enabledEnvVar)
 
 	sysProbeEnableEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeEnabled,
+		Name:  v2alpha1.DDSystemProbeEnabled,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainers(
@@ -161,14 +161,14 @@ func (f *usmFeature) ManageNodeAgent(managers feature.PodTemplateManagers, provi
 	)
 
 	sysProbeSocketEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeSocket,
+		Name:  v2alpha1.DDSystemProbeSocket,
 		Value: v2alpha1.DefaultSystemProbeSocketPath,
 	}
 	managers.EnvVar().AddEnvVarToContainers(containersForEnvVars, sysProbeSocketEnvVar)
 
 	// env vars for Process Agent only
 	sysProbeExternalEnvVar := &corev1.EnvVar{
-		Name:  apicommon.DDSystemProbeExternal,
+		Name:  v2alpha1.DDSystemProbeExternal,
 		Value: "true",
 	}
 	managers.EnvVar().AddEnvVarToContainer(apicommon.ProcessAgentContainerName, sysProbeExternalEnvVar)
diff --git a/internal/controller/datadogagent/feature/utils/utils.go b/internal/controller/datadogagent/feature/utils/utils.go
index d298f5ff..bbe1195f 100644
--- a/internal/controller/datadogagent/feature/utils/utils.go
+++ b/internal/controller/datadogagent/feature/utils/utils.go
@@ -8,7 +8,6 @@ package utils
 import (
 	"strconv"
 
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	"github.com/DataDog/datadog-operator/pkg/defaulting"
 	"github.com/DataDog/datadog-operator/pkg/utils"
@@ -35,7 +34,7 @@ func agentSupportsRunInCoreAgent(dda *v2alpha1.DatadogAgent) bool {
 func OverrideRunInCoreAgent(dda *v2alpha1.DatadogAgent, currentVal bool) bool {
 	if nodeAgent, ok := dda.Spec.Override[v2alpha1.NodeAgentComponentName]; ok {
 		for _, env := range nodeAgent.Env {
-			if env.Name == apicommon.DDProcessConfigRunInCoreAgent {
+			if env.Name == v2alpha1.DDProcessConfigRunInCoreAgent {
 				val, err := strconv.ParseBool(env.Value)
 				if err == nil {
 					return val
diff --git a/internal/controller/datadogagent/object/labels.go b/internal/controller/datadogagent/object/labels.go
index d903706d..4675a161 100644
--- a/internal/controller/datadogagent/object/labels.go
+++ b/internal/controller/datadogagent/object/labels.go
@@ -9,7 +9,7 @@ import (
 	"fmt"
 	"strings"
 
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
+	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	"github.com/DataDog/datadog-operator/pkg/kubernetes"
 
 	"github.com/go-logr/logr"
@@ -75,5 +75,5 @@ func GetChecksumAnnotationKey(keyName string) string {
 		return ""
 	}
 
-	return fmt.Sprintf(apicommon.MD5ChecksumAnnotationKey, keyName)
+	return fmt.Sprintf(v2alpha1.MD5ChecksumAnnotationKey, keyName)
 }
diff --git a/internal/controller/datadogagent/object/volume/volumes.go b/internal/controller/datadogagent/object/volume/volumes.go
index 2438d697..9006b51d 100644
--- a/internal/controller/datadogagent/object/volume/volumes.go
+++ b/internal/controller/datadogagent/object/volume/volumes.go
@@ -12,7 +12,6 @@ import (
 	"gopkg.in/yaml.v2"
 	corev1 "k8s.io/api/core/v1"
 
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 )
 
@@ -70,7 +69,7 @@ func GetVolumesFromConfigMap(configMap *v2alpha1.ConfigMapConfig, volumeName, de
 
 	volumeMount := corev1.VolumeMount{
 		Name:      volumeName,
-		MountPath: fmt.Sprintf("%s%s/%s", apicommon.ConfigVolumePath, apicommon.ConfdVolumePath, configFolder),
+		MountPath: fmt.Sprintf("%s%s/%s", v2alpha1.ConfigVolumePath, v2alpha1.ConfdVolumePath, configFolder),
 		ReadOnly:  true,
 	}
 	return volume, volumeMount
diff --git a/internal/controller/datadogagent/override/container.go b/internal/controller/datadogagent/override/container.go
index ceee2364..8a7d91e5 100644
--- a/internal/controller/datadogagent/override/container.go
+++ b/internal/controller/datadogagent/override/container.go
@@ -9,7 +9,7 @@ import (
 	"fmt"
 	"strconv"
 
-	"github.com/DataDog/datadog-operator/api/datadoghq/common"
+	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature"
 
@@ -18,7 +18,7 @@ import (
 )
 
 // Container use to override a corev1.Container with a v2alpha1.DatadogAgentGenericContainer.
-func Container(containerName common.AgentContainerName, manager feature.PodTemplateManagers, override *v2alpha1.DatadogAgentGenericContainer) {
+func Container(containerName apicommon.AgentContainerName, manager feature.PodTemplateManagers, override *v2alpha1.DatadogAgentGenericContainer) {
 	if override == nil {
 		return
 	}
@@ -53,17 +53,17 @@ func Container(containerName common.AgentContainerName, manager feature.PodTempl
 	}
 }
 
-func overrideLogLevel(containerName common.AgentContainerName, manager feature.PodTemplateManagers, logLevel string) {
+func overrideLogLevel(containerName apicommon.AgentContainerName, manager feature.PodTemplateManagers, logLevel string) {
 	manager.EnvVar().AddEnvVarToContainer(
 		containerName,
 		&corev1.EnvVar{
-			Name:  common.DDLogLevel,
+			Name:  v2alpha1.DDLogLevel,
 			Value: logLevel,
 		},
 	)
 }
 
-func addEnvsToContainer(containerName common.AgentContainerName, manager feature.PodTemplateManagers, envs []corev1.EnvVar) {
+func addEnvsToContainer(containerName apicommon.AgentContainerName, manager feature.PodTemplateManagers, envs []corev1.EnvVar) {
 	for _, env := range envs {
 		e := env
 		manager.EnvVar().AddEnvVarToContainer(containerName, &e)
@@ -71,21 +71,21 @@ func addEnvsToContainer(containerName common.AgentContainerName, manager feature
 
 }
 
-func addEnvsToInitContainer(containerName common.AgentContainerName, manager feature.PodTemplateManagers, envs []corev1.EnvVar) {
+func addEnvsToInitContainer(containerName apicommon.AgentContainerName, manager feature.PodTemplateManagers, envs []corev1.EnvVar) {
 	for _, env := range envs {
 		e := env
 		manager.EnvVar().AddEnvVarToInitContainer(containerName, &e)
 	}
 }
 
-func addVolMountsToContainer(containerName common.AgentContainerName, manager feature.PodTemplateManagers, mounts []corev1.VolumeMount) {
+func addVolMountsToContainer(containerName apicommon.AgentContainerName, manager feature.PodTemplateManagers, mounts []corev1.VolumeMount) {
 	for _, mount := range mounts {
 		m := mount
 		manager.VolumeMount().AddVolumeMountToContainer(&m, containerName)
 	}
 }
 
-func addVolMountsToInitContainer(containerName common.AgentContainerName, manager feature.PodTemplateManagers, mounts []corev1.VolumeMount) {
+func addVolMountsToInitContainer(containerName apicommon.AgentContainerName, manager feature.PodTemplateManagers, mounts []corev1.VolumeMount) {
 	for _, mount := range mounts {
 		m := mount
 		manager.VolumeMount().AddVolumeMountToInitContainer(&m, containerName)
@@ -93,11 +93,11 @@ func addVolMountsToInitContainer(containerName common.AgentContainerName, manage
 	}
 }
 
-func addHealthPort(containerName common.AgentContainerName, manager feature.PodTemplateManagers, healthPort int32) {
+func addHealthPort(containerName apicommon.AgentContainerName, manager feature.PodTemplateManagers, healthPort int32) {
 	manager.EnvVar().AddEnvVarToContainer(
 		containerName,
 		&corev1.EnvVar{
-			Name:  common.DDHealthPort,
+			Name:  v2alpha1.DDHealthPort,
 			Value: strconv.Itoa(int(healthPort)),
 		},
 	)
@@ -167,12 +167,12 @@ func overrideInitContainer(initContainer *corev1.Container, override *v2alpha1.D
 	}
 }
 
-func overrideSeccompProfile(containerName common.AgentContainerName, manager feature.PodTemplateManagers, override *v2alpha1.DatadogAgentGenericContainer) {
+func overrideSeccompProfile(containerName apicommon.AgentContainerName, manager feature.PodTemplateManagers, override *v2alpha1.DatadogAgentGenericContainer) {
 	// NOTE: for now, only support custom Seccomp Profiles on the System Probe
-	if containerName == common.SystemProbeContainerName {
+	if containerName == apicommon.SystemProbeContainerName {
 		if override.SeccompConfig != nil && override.SeccompConfig.CustomRootPath != nil {
 			vol := corev1.Volume{
-				Name: common.SeccompRootVolumeName,
+				Name: v2alpha1.SeccompRootVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
 						Path: *override.SeccompConfig.CustomRootPath,
@@ -185,7 +185,7 @@ func overrideSeccompProfile(containerName common.AgentContainerName, manager fea
 		// TODO support ConfigMap creation when ConfigData is used.
 		if override.SeccompConfig != nil && override.SeccompConfig.CustomProfile != nil && override.SeccompConfig.CustomProfile.ConfigMap != nil {
 			vol := corev1.Volume{
-				Name: common.SeccompSecurityVolumeName,
+				Name: v2alpha1.SeccompSecurityVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					ConfigMap: &corev1.ConfigMapVolumeSource{
 						LocalObjectReference: corev1.LocalObjectReference{
@@ -210,13 +210,13 @@ func overrideSeccompProfile(containerName common.AgentContainerName, manager fea
 	}
 }
 
-func overrideAppArmorProfile(containerName common.AgentContainerName, manager feature.PodTemplateManagers, override *v2alpha1.DatadogAgentGenericContainer) {
+func overrideAppArmorProfile(containerName apicommon.AgentContainerName, manager feature.PodTemplateManagers, override *v2alpha1.DatadogAgentGenericContainer) {
 	if override.AppArmorProfileName != nil {
 		var annotation string
 		if override.Name != nil {
-			annotation = fmt.Sprintf("%s/%s", common.AppArmorAnnotationKey, *override.Name)
+			annotation = fmt.Sprintf("%s/%s", v2alpha1.AppArmorAnnotationKey, *override.Name)
 		} else {
-			annotation = fmt.Sprintf("%s/%s", common.AppArmorAnnotationKey, containerName)
+			annotation = fmt.Sprintf("%s/%s", v2alpha1.AppArmorAnnotationKey, containerName)
 		}
 
 		manager.Annotation().AddAnnotation(annotation, *override.AppArmorProfileName)
diff --git a/internal/controller/datadogagent/override/dependencies.go b/internal/controller/datadogagent/override/dependencies.go
index 18006de1..dc284b96 100644
--- a/internal/controller/datadogagent/override/dependencies.go
+++ b/internal/controller/datadogagent/override/dependencies.go
@@ -53,15 +53,17 @@ func Dependencies(logger logr.Logger, manager feature.ResourceManagers, dda *v2a
 
 func overridePodDisruptionBudget(logger logr.Logger, manager feature.ResourceManagers, dda *v2alpha1.DatadogAgent, createPdb *bool, component v2alpha1.ComponentName) (errs []error) {
 	if createPdb != nil && *createPdb {
+		platformInfo := manager.Store().GetPlatformInfo()
+		useV1BetaPDB := platformInfo.UseV1Beta1PDB()
 		if component == v2alpha1.ClusterAgentComponentName {
-			pdb := componentdca.GetClusterAgentPodDisruptionBudget(dda)
+			pdb := componentdca.GetClusterAgentPodDisruptionBudget(dda, useV1BetaPDB)
 			if err := manager.Store().AddOrUpdate(kubernetes.PodDisruptionBudgetsKind, pdb); err != nil {
 				errs = append(errs, err)
 			}
 		} else if component == v2alpha1.ClusterChecksRunnerComponentName &&
 			(dda.Spec.Features.ClusterChecks.UseClusterChecksRunners == nil ||
 				*dda.Spec.Features.ClusterChecks.UseClusterChecksRunners) {
-			pdb := componentccr.GetClusterChecksRunnerPodDisruptionBudget(dda)
+			pdb := componentccr.GetClusterChecksRunnerPodDisruptionBudget(dda, useV1BetaPDB)
 			if err := manager.Store().AddOrUpdate(kubernetes.PodDisruptionBudgetsKind, pdb); err != nil {
 				errs = append(errs, err)
 			}
diff --git a/internal/controller/datadogagent/override/fips.go b/internal/controller/datadogagent/override/fips.go
index 4ec143b0..1c56f312 100644
--- a/internal/controller/datadogagent/override/fips.go
+++ b/internal/controller/datadogagent/override/fips.go
@@ -33,19 +33,19 @@ func applyFIPSConfig(logger logr.Logger, manager feature.PodTemplateManagers, dd
 	for _, cont := range manager.PodTemplateSpec().Spec.Containers {
 		if cont.Name != string(apicommon.SystemProbeContainerName) {
 			manager.EnvVar().AddEnvVarToContainer(apicommon.AgentContainerName(cont.Name), &corev1.EnvVar{
-				Name:  apicommon.DDFIPSEnabled,
+				Name:  v2alpha1.DDFIPSEnabled,
 				Value: "true",
 			})
 			manager.EnvVar().AddEnvVarToContainer(apicommon.AgentContainerName(cont.Name), &corev1.EnvVar{
-				Name:  apicommon.DDFIPSPortRangeStart,
+				Name:  v2alpha1.DDFIPSPortRangeStart,
 				Value: strconv.Itoa(int(*fipsConfig.Port)),
 			})
 			manager.EnvVar().AddEnvVarToContainer(apicommon.AgentContainerName(cont.Name), &corev1.EnvVar{
-				Name:  apicommon.DDFIPSUseHTTPS,
+				Name:  v2alpha1.DDFIPSUseHTTPS,
 				Value: apiutils.BoolToString(fipsConfig.UseHTTPS),
 			})
 			manager.EnvVar().AddEnvVarToContainer(apicommon.AgentContainerName(cont.Name), &corev1.EnvVar{
-				Name:  apicommon.DDFIPSLocalAddress,
+				Name:  v2alpha1.DDFIPSLocalAddress,
 				Value: *fipsConfig.LocalAddress,
 			})
 		}
@@ -75,18 +75,18 @@ func applyFIPSConfig(logger logr.Logger, manager feature.PodTemplateManagers, dd
 	vol := getFIPSDefaultVolume(dda.Name)
 	if fipsConfig.CustomFIPSConfig != nil {
 		volMount := corev1.VolumeMount{
-			Name:      apicommon.FIPSProxyCustomConfigVolumeName,
-			MountPath: apicommon.FIPSProxyCustomConfigMountPath,
-			SubPath:   apicommon.FIPSProxyCustomConfigFileName,
+			Name:      v2alpha1.FIPSProxyCustomConfigVolumeName,
+			MountPath: v2alpha1.FIPSProxyCustomConfigMountPath,
+			SubPath:   v2alpha1.FIPSProxyCustomConfigFileName,
 			ReadOnly:  true,
 		}
 
 		// Add md5 hash annotation to component for custom config
 		hash, err := comparison.GenerateMD5ForSpec(fipsConfig.CustomFIPSConfig)
 		if err != nil {
-			logger.Error(err, "couldn't generate hash for custom config", "filename", apicommon.FIPSProxyCustomConfigFileName)
+			logger.Error(err, "couldn't generate hash for custom config", "filename", v2alpha1.FIPSProxyCustomConfigFileName)
 		}
-		annotationKey := object.GetChecksumAnnotationKey(string(apicommon.FIPSProxyCustomConfigFileName))
+		annotationKey := object.GetChecksumAnnotationKey(string(v2alpha1.FIPSProxyCustomConfigFileName))
 		if annotationKey != "" && hash != "" {
 			manager.Annotation().AddAnnotation(annotationKey, hash)
 		}
@@ -95,15 +95,15 @@ func applyFIPSConfig(logger logr.Logger, manager feature.PodTemplateManagers, dd
 		if fipsConfig.CustomFIPSConfig.ConfigMap != nil {
 			vol = volume.GetVolumeFromConfigMap(
 				fipsConfig.CustomFIPSConfig.ConfigMap,
-				fmt.Sprintf(apicommon.FIPSProxyCustomConfigMapName, dda.Name),
-				apicommon.FIPSProxyCustomConfigVolumeName,
+				fmt.Sprintf(v2alpha1.FIPSProxyCustomConfigMapName, dda.Name),
+				v2alpha1.FIPSProxyCustomConfigVolumeName,
 			)
 			// configData
 		} else if fipsConfig.CustomFIPSConfig.ConfigData != nil {
 			cm, err := configmap.BuildConfigMapMulti(
 				dda.Namespace,
-				map[string]string{apicommon.FIPSProxyCustomConfigFileName: *fipsConfig.CustomFIPSConfig.ConfigData},
-				fmt.Sprintf(apicommon.FIPSProxyCustomConfigMapName, dda.Name),
+				map[string]string{v2alpha1.FIPSProxyCustomConfigFileName: *fipsConfig.CustomFIPSConfig.ConfigData},
+				fmt.Sprintf(v2alpha1.FIPSProxyCustomConfigMapName, dda.Name),
 				false,
 			)
 			if err != nil {
@@ -135,7 +135,7 @@ func getFIPSProxyContainer(fipsConfig *v2alpha1.FIPSConfig) corev1.Container {
 		Ports:           getFIPSPorts(fipsConfig),
 		Env: []corev1.EnvVar{
 			{
-				Name:  apicommon.DDFIPSLocalAddress,
+				Name:  v2alpha1.DDFIPSLocalAddress,
 				Value: *fipsConfig.LocalAddress,
 			},
 		},
@@ -161,16 +161,16 @@ func getFIPSPorts(fipsConfig *v2alpha1.FIPSConfig) []corev1.ContainerPort {
 
 func getFIPSDefaultVolume(name string) corev1.Volume {
 	return corev1.Volume{
-		Name: apicommon.FIPSProxyCustomConfigVolumeName,
+		Name: v2alpha1.FIPSProxyCustomConfigVolumeName,
 		VolumeSource: corev1.VolumeSource{
 			ConfigMap: &corev1.ConfigMapVolumeSource{
 				LocalObjectReference: corev1.LocalObjectReference{
-					Name: fmt.Sprintf(apicommon.FIPSProxyCustomConfigMapName, name),
+					Name: fmt.Sprintf(v2alpha1.FIPSProxyCustomConfigMapName, name),
 				},
 				Items: []corev1.KeyToPath{
 					{
-						Key:  apicommon.FIPSProxyCustomConfigFileName,
-						Path: apicommon.FIPSProxyCustomConfigFileName,
+						Key:  v2alpha1.FIPSProxyCustomConfigFileName,
+						Path: v2alpha1.FIPSProxyCustomConfigFileName,
 					},
 				},
 			},
diff --git a/internal/controller/datadogagent/override/global.go b/internal/controller/datadogagent/override/global.go
index 90d0f7bf..e74007f4 100644
--- a/internal/controller/datadogagent/override/global.go
+++ b/internal/controller/datadogagent/override/global.go
@@ -50,21 +50,21 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 	// ClusterName sets a unique cluster name for the deployment to easily scope monitoring data in the Datadog app.
 	if config.ClusterName != nil {
 		manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-			Name:  apicommon.DDClusterName,
+			Name:  v2alpha1.DDClusterName,
 			Value: *config.ClusterName,
 		})
 	}
 
 	// Site is the Datadog intake site Agent data are sent to.
 	manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-		Name:  apicommon.DDSite,
+		Name:  v2alpha1.DDSite,
 		Value: *config.Site,
 	})
 
 	// Endpoint is the Datadog intake URL the Agent data are sent to.
 	if config.Endpoint != nil && config.Endpoint.URL != nil {
 		manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-			Name:  apicommon.DDddURL,
+			Name:  v2alpha1.DDddURL,
 			Value: *config.Endpoint.URL,
 		})
 	}
@@ -90,7 +90,7 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 
 	// LogLevel sets logging verbosity. This can be overridden by container.
 	manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-		Name:  apicommon.DDLogLevel,
+		Name:  v2alpha1.DDLogLevel,
 		Value: *config.LogLevel,
 	})
 
@@ -134,7 +134,7 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 			logger.Error(err, "Failed to unmarshal json input")
 		} else {
 			manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDTags,
+				Name:  v2alpha1.DDTags,
 				Value: string(tags),
 			})
 		}
@@ -153,7 +153,7 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 			// The value validation happens at the Agent level - if the lower(string) is not `low`, `orchestrator` or `high`, the Agent defaults to `low`.
 			// Ref: https://github.com/DataDog/datadog-agent/blob/1d08a6a9783fe271ea3813ddf9abf60244abdf2c/comp/core/tagger/taggerimpl/tagger.go#L173-L177
 			manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDChecksTagCardinality,
+				Name:  v2alpha1.DDChecksTagCardinality,
 				Value: *config.ChecksTagCardinality,
 			})
 		}
@@ -161,7 +161,7 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 
 	if config.OriginDetectionUnified != nil && config.OriginDetectionUnified.Enabled != nil {
 		manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-			Name:  apicommon.DDOriginDetectionUnified,
+			Name:  v2alpha1.DDOriginDetectionUnified,
 			Value: apiutils.BoolToString(config.OriginDetectionUnified.Enabled),
 		})
 	}
@@ -173,7 +173,7 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 			logger.Error(err, "Failed to unmarshal json input")
 		} else {
 			manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDPodLabelsAsTags,
+				Name:  v2alpha1.DDPodLabelsAsTags,
 				Value: string(podLabelsAsTags),
 			})
 		}
@@ -186,7 +186,7 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 			logger.Error(err, "Failed to unmarshal json input")
 		} else {
 			manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDPodAnnotationsAsTags,
+				Name:  v2alpha1.DDPodAnnotationsAsTags,
 				Value: string(podAnnotationsAsTags),
 			})
 		}
@@ -199,7 +199,7 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 			logger.Error(err, "Failed to unmarshal json input")
 		} else {
 			manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDNodeLabelsAsTags,
+				Name:  v2alpha1.DDNodeLabelsAsTags,
 				Value: string(nodeLabelsAsTags),
 			})
 		}
@@ -212,7 +212,7 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 			logger.Error(err, "Failed to unmarshal json input")
 		} else {
 			manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDNamespaceLabelsAsTags,
+				Name:  v2alpha1.DDNamespaceLabelsAsTags,
 				Value: string(namespaceLabelsAsTags),
 			})
 		}
@@ -225,7 +225,7 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 			logger.Error(err, "Failed to unmarshal json input")
 		} else {
 			manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDNamespaceAnnotationsAsTags,
+				Name:  v2alpha1.DDNamespaceAnnotationsAsTags,
 				Value: string(namespaceAnnotationsAsTags),
 			})
 		}
@@ -237,13 +237,13 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 		if config.Kubelet != nil {
 			if config.Kubelet.Host != nil {
 				manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-					Name:      apicommon.DDKubeletHost,
+					Name:      v2alpha1.DDKubeletHost,
 					ValueFrom: config.Kubelet.Host,
 				})
 			}
 			if config.Kubelet.TLSVerify != nil {
 				manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-					Name:  apicommon.DDKubeletTLSVerify,
+					Name:  v2alpha1.DDKubeletTLSVerify,
 					Value: apiutils.BoolToString(config.Kubelet.TLSVerify),
 				})
 			}
@@ -254,9 +254,9 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 				if config.Kubelet.AgentCAPath != "" {
 					agentCAPath = config.Kubelet.AgentCAPath
 				} else {
-					agentCAPath = apicommon.KubeletAgentCAPath
+					agentCAPath = v2alpha1.KubeletAgentCAPath
 				}
-				kubeletVol, kubeletVolMount := volume.GetVolumes(apicommon.KubeletCAVolumeName, config.Kubelet.HostCAPath, agentCAPath, true)
+				kubeletVol, kubeletVolMount := volume.GetVolumes(v2alpha1.KubeletCAVolumeName, config.Kubelet.HostCAPath, agentCAPath, true)
 				if singleContainerStrategyEnabled {
 					manager.VolumeMount().AddVolumeMountToContainers(
 						&kubeletVolMount,
@@ -280,7 +280,7 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 				}
 				// If the HostCAPath is overridden, set the environment variable `DD_KUBELET_CLIENT_CA`. The default value in the Agent is `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`.
 				manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-					Name:  apicommon.DDKubeletCAPath,
+					Name:  v2alpha1.DDKubeletCAPath,
 					Value: agentCAPath,
 				})
 			}
@@ -290,20 +290,20 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 		var runtimeVolMount corev1.VolumeMount
 		// Path to the docker runtime socket.
 		if config.DockerSocketPath != nil {
-			dockerMountPath := filepath.Join(apicommon.HostCriSocketPathPrefix, *config.DockerSocketPath)
+			dockerMountPath := filepath.Join(v2alpha1.HostCriSocketPathPrefix, *config.DockerSocketPath)
 			manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DockerHost,
+				Name:  v2alpha1.DockerHost,
 				Value: "unix://" + dockerMountPath,
 			})
-			runtimeVol, runtimeVolMount = volume.GetVolumes(apicommon.CriSocketVolumeName, *config.DockerSocketPath, dockerMountPath, true)
+			runtimeVol, runtimeVolMount = volume.GetVolumes(v2alpha1.CriSocketVolumeName, *config.DockerSocketPath, dockerMountPath, true)
 		} else if config.CriSocketPath != nil {
 			// Path to the container runtime socket (if different from Docker).
-			criSocketMountPath := filepath.Join(apicommon.HostCriSocketPathPrefix, *config.CriSocketPath)
+			criSocketMountPath := filepath.Join(v2alpha1.HostCriSocketPathPrefix, *config.CriSocketPath)
 			manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDCriSocketPath,
+				Name:  v2alpha1.DDCriSocketPath,
 				Value: criSocketMountPath,
 			})
-			runtimeVol, runtimeVolMount = volume.GetVolumes(apicommon.CriSocketVolumeName, *config.CriSocketPath, criSocketMountPath, true)
+			runtimeVol, runtimeVolMount = volume.GetVolumes(v2alpha1.CriSocketVolumeName, *config.CriSocketPath, criSocketMountPath, true)
 		}
 		if runtimeVol.Name != "" && runtimeVolMount.Name != "" {
 
@@ -335,20 +335,20 @@ func applyGlobalSettings(logger logr.Logger, manager feature.PodTemplateManagers
 	if config.SecretBackend != nil {
 		// Set secret backend command
 		manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-			Name:  apicommon.DDSecretBackendCommand,
+			Name:  v2alpha1.DDSecretBackendCommand,
 			Value: apiutils.StringValue(config.SecretBackend.Command),
 		})
 
 		// Set secret backend arguments
 		manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-			Name:  apicommon.DDSecretBackendArguments,
+			Name:  v2alpha1.DDSecretBackendArguments,
 			Value: apiutils.StringValue(config.SecretBackend.Args),
 		})
 
 		// Set secret backend timeout
 		if config.SecretBackend.Timeout != nil {
 			manager.EnvVar().AddEnvVar(&corev1.EnvVar{
-				Name:  apicommon.DDSecretBackendTimeout,
+				Name:  v2alpha1.DDSecretBackendTimeout,
 				Value: strconv.FormatInt(int64(*config.SecretBackend.Timeout), 10),
 			})
 		}
diff --git a/internal/controller/datadogagent/override/podtemplatespec.go b/internal/controller/datadogagent/override/podtemplatespec.go
index b055b337..04aad9eb 100644
--- a/internal/controller/datadogagent/override/podtemplatespec.go
+++ b/internal/controller/datadogagent/override/podtemplatespec.go
@@ -92,7 +92,7 @@ func PodTemplateSpec(logger logr.Logger, manager feature.PodTemplateManagers, ov
 	// If both ConfigMap and ConfigData exist, ConfigMap has higher priority.
 	if override.ExtraConfd != nil {
 		cmName := fmt.Sprintf(extraConfdConfigMapName, strings.ToLower((string(componentName))))
-		vol := volume.GetVolumeFromMultiCustomConfig(override.ExtraConfd, apicommon.ConfdVolumeName, cmName)
+		vol := volume.GetVolumeFromMultiCustomConfig(override.ExtraConfd, v2alpha1.ConfdVolumeName, cmName)
 		manager.Volume().AddVolume(&vol)
 
 		// Add md5 hash annotation for custom config
@@ -109,7 +109,7 @@ func PodTemplateSpec(logger logr.Logger, manager feature.PodTemplateManagers, ov
 	// If both ConfigMap and ConfigData exist, ConfigMap has higher priority.
 	if override.ExtraChecksd != nil {
 		cmName := fmt.Sprintf(extraChecksdConfigMapName, strings.ToLower((string(componentName))))
-		vol := volume.GetVolumeFromMultiCustomConfig(override.ExtraChecksd, apicommon.ChecksdVolumeName, cmName)
+		vol := volume.GetVolumeFromMultiCustomConfig(override.ExtraChecksd, v2alpha1.ChecksdVolumeName, cmName)
 		manager.Volume().AddVolume(&vol)
 
 		// Add md5 hash annotation for custom config
@@ -140,6 +140,10 @@ func PodTemplateSpec(logger logr.Logger, manager feature.PodTemplateManagers, ov
 		manager.PodTemplateSpec().Spec.PriorityClassName = *override.PriorityClassName
 	}
 
+	if override.RuntimeClassName != nil {
+		manager.PodTemplateSpec().Spec.RuntimeClassName = override.RuntimeClassName
+	}
+
 	if override.Affinity != nil {
 		manager.PodTemplateSpec().Spec.Affinity = mergeAffinities(manager.PodTemplateSpec().Spec.Affinity, override.Affinity)
 	}
@@ -200,7 +204,7 @@ func overrideCustomConfigVolumes(logger logr.Logger, manager feature.PodTemplate
 			manager.VolumeMount().AddVolumeMount(&volumeMount)
 		case v2alpha1.ClusterAgentComponentName:
 			// For the Cluster Agent, there is only one possible config file so can use a simple volume name.
-			volumeName := apicommon.ClusterAgentCustomConfigVolumeName
+			volumeName := v2alpha1.ClusterAgentCustomConfigVolumeName
 			vol := volume.GetVolumeFromCustomConfig(customConfig, defaultConfigMapName, volumeName)
 			manager.Volume().AddVolume(&vol)
 
diff --git a/internal/controller/datadogagent_controller.go b/internal/controller/datadogagent_controller.go
index 2e80cdf2..031ff6c3 100644
--- a/internal/controller/datadogagent_controller.go
+++ b/internal/controller/datadogagent_controller.go
@@ -13,7 +13,6 @@ import (
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	networkingv1 "k8s.io/api/networking/v1"
-	policyv1 "k8s.io/api/policy/v1"
 	rbacv1 "k8s.io/api/rbac/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
@@ -195,7 +194,8 @@ func (r *DatadogAgentReconciler) SetupWithManager(mgr ctrl.Manager, metricForwar
 		Owns(&rbacv1.Role{}).
 		Owns(&rbacv1.RoleBinding{}).
 		Owns(&corev1.ServiceAccount{}).
-		Owns(&policyv1.PodDisruptionBudget{}).
+		// We let PlatformInfo supply PDB object based on the current API version
+		Owns(r.PlatformInfo.CreatePDBObject()).
 		Owns(&networkingv1.NetworkPolicy{})
 
 	if r.Options.DatadogAgentProfileEnabled {
diff --git a/internal/controller/setup.go b/internal/controller/setup.go
index b7e580fc..7f3eef8a 100644
--- a/internal/controller/setup.go
+++ b/internal/controller/setup.go
@@ -47,7 +47,6 @@ type SetupOptions struct {
 	V2APIEnabled               bool
 	IntrospectionEnabled       bool
 	DatadogAgentProfileEnabled bool
-	OtelAgentEnabled           bool
 	DatadogDashboardEnabled    bool
 }
 
@@ -160,7 +159,6 @@ func startDatadogAgent(logger logr.Logger, mgr manager.Manager, pInfo kubernetes
 			OperatorMetricsEnabled:     options.OperatorMetricsEnabled,
 			IntrospectionEnabled:       options.IntrospectionEnabled,
 			DatadogAgentProfileEnabled: options.DatadogAgentProfileEnabled,
-			OtelAgentEnabled:           options.OtelAgentEnabled,
 		},
 	}).SetupWithManager(mgr, metricForwardersMgr)
 }
diff --git a/pkg/agentprofile/agent_profile.go b/pkg/agentprofile/agent_profile.go
index 7c53db87..2f1ecb72 100644
--- a/pkg/agentprofile/agent_profile.go
+++ b/pkg/agentprofile/agent_profile.go
@@ -183,6 +183,7 @@ func OverrideFromProfile(profile *v1alpha1.DatadogAgentProfile) v2alpha1.Datadog
 		if nodeAgentOverride, ok := profile.Spec.Config.Override[v1alpha1.NodeAgentComponentName]; ok {
 			profileComponentOverride.Containers = containersOverride(nodeAgentOverride)
 			profileComponentOverride.PriorityClassName = nodeAgentOverride.PriorityClassName
+			profileComponentOverride.RuntimeClassName = nodeAgentOverride.RuntimeClassName
 			profileComponentOverride.UpdateStrategy = nodeAgentOverride.UpdateStrategy
 		}
 	}
diff --git a/pkg/config/creds.go b/pkg/config/creds.go
index 7e2e1669..027559ba 100644
--- a/pkg/config/creds.go
+++ b/pkg/config/creds.go
@@ -11,7 +11,7 @@ import (
 	"sync"
 	"time"
 
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
+	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	"github.com/DataDog/datadog-operator/pkg/secrets"
 
 	"k8s.io/apimachinery/pkg/util/wait"
@@ -54,8 +54,8 @@ func (cm *CredentialManager) GetCredentials() (Creds, error) {
 		return creds, nil
 	}
 
-	apiKey := os.Getenv(apicommon.DDAPIKey)
-	appKey := os.Getenv(apicommon.DDAppKey)
+	apiKey := os.Getenv(v2alpha1.DDAPIKey)
+	appKey := os.Getenv(v2alpha1.DDAppKey)
 
 	if apiKey == "" || appKey == "" {
 		return Creds{}, errors.New("empty API key and/or App key")
diff --git a/pkg/controller/utils/comparison/comparison.go b/pkg/controller/utils/comparison/comparison.go
index 0f0545e0..4dfbc8d3 100644
--- a/pkg/controller/utils/comparison/comparison.go
+++ b/pkg/controller/utils/comparison/comparison.go
@@ -15,12 +15,12 @@ import (
 
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
-	"github.com/DataDog/datadog-operator/api/datadoghq/common"
+	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 )
 
 // IsSameSpecMD5Hash used to compare the DatadogAgent.spec md5 hash with the one set in annotations
 func IsSameSpecMD5Hash(hash string, annotations map[string]string) bool {
-	return IsSameMD5Hash(hash, annotations, common.MD5AgentDeploymentAnnotationKey)
+	return IsSameMD5Hash(hash, annotations, v2alpha1.MD5AgentDeploymentAnnotationKey)
 }
 
 // IsSameMD5Hash used to compare a md5 hash with the one set in annotations
@@ -50,7 +50,7 @@ func GenerateMD5ForSpec(spec interface{}) (string, error) {
 
 // SetMD5DatadogAgentGenerationAnnotation is used to set the md5 annotation key/value from spec
 func SetMD5DatadogAgentGenerationAnnotation(obj *metav1.ObjectMeta, spec interface{}) (string, error) {
-	return SetMD5GenerationAnnotation(obj, spec, common.MD5AgentDeploymentAnnotationKey)
+	return SetMD5GenerationAnnotation(obj, spec, v2alpha1.MD5AgentDeploymentAnnotationKey)
 }
 
 // SetMD5GenerationAnnotation is used to set the md5 annotation key/value from spec
diff --git a/pkg/controller/utils/datadog/metrics_forwarder.go b/pkg/controller/utils/datadog/metrics_forwarder.go
index 0910783f..8c157df3 100644
--- a/pkg/controller/utils/datadog/metrics_forwarder.go
+++ b/pkg/controller/utils/datadog/metrics_forwarder.go
@@ -14,7 +14,6 @@ import (
 	"sync"
 	"time"
 
-	"github.com/DataDog/datadog-operator/api/datadoghq/v1alpha1"
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	"github.com/DataDog/datadog-operator/pkg/config"
 	"github.com/DataDog/datadog-operator/pkg/kubernetes"
@@ -669,14 +668,17 @@ func (mf *metricsForwarder) updateStatusIfNeeded(err error) {
 	conditionStatus := true
 	message := "Datadog metrics forwarding ok"
 	reason := "MetricsForwardingSucceeded"
+	conditionType := string(v2alpha1.DatadogMetricsActive)
+
 	if err != nil {
 		conditionStatus = false
 		message = "Datadog metrics forwarding error"
 		reason = "MetricsForwardingError"
+		conditionType = string(v2alpha1.DatadogMetricsError)
 	}
 
 	newConditionStatus := &ConditionCommon{
-		ConditionType:  string(v1alpha1.DatadogMetricsActive),
+		ConditionType:  conditionType,
 		Status:         conditionStatus,
 		LastUpdateTime: now,
 		Message:        message,
diff --git a/pkg/datadogclient/client.go b/pkg/datadogclient/client.go
index 2db5c7c2..7c1d560a 100644
--- a/pkg/datadogclient/client.go
+++ b/pkg/datadogclient/client.go
@@ -19,7 +19,7 @@ import (
 
 	datadogapi "github.com/DataDog/datadog-api-client-go/v2/api/datadog"
 	datadogV1 "github.com/DataDog/datadog-api-client-go/v2/api/datadogV1"
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
+	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 )
 
 const prefix = "https://api."
@@ -111,11 +111,11 @@ func setupAuth(logger logr.Logger, creds config.Creds) (context.Context, error)
 	)
 
 	apiURL := ""
-	if os.Getenv(apicommon.DDddURL) != "" {
-		apiURL = os.Getenv(apicommon.DDddURL)
-	} else if os.Getenv(apicommon.DDURL) != "" {
-		apiURL = os.Getenv(apicommon.DDURL)
-	} else if site := os.Getenv(apicommon.DDSite); site != "" {
+	if os.Getenv(v2alpha1.DDddURL) != "" {
+		apiURL = os.Getenv(v2alpha1.DDddURL)
+	} else if os.Getenv(v2alpha1.DDURL) != "" {
+		apiURL = os.Getenv(v2alpha1.DDURL)
+	} else if site := os.Getenv(v2alpha1.DDSite); site != "" {
 		apiURL = prefix + strings.TrimSpace(site)
 	}
 
diff --git a/pkg/defaulting/images.go b/pkg/defaulting/images.go
index 0a1e5af0..70fcdebb 100644
--- a/pkg/defaulting/images.go
+++ b/pkg/defaulting/images.go
@@ -16,9 +16,9 @@ type ContainerRegistry string
 
 const (
 	// AgentLatestVersion corresponds to the latest stable agent release
-	AgentLatestVersion = "7.59.0"
+	AgentLatestVersion = "7.60.0"
 	// ClusterAgentLatestVersion corresponds to the latest stable cluster-agent release
-	ClusterAgentLatestVersion = "7.59.0"
+	ClusterAgentLatestVersion = "7.60.0"
 	// FIPSProxyLatestVersion corresponds to the latest stable fips-proxy release
 	FIPSProxyLatestVersion = "1.1.6"
 	// GCRContainerRegistry corresponds to the datadoghq GCR registry
@@ -30,7 +30,10 @@ const (
 	// DefaultImageRegistry corresponds to the datadoghq containers registry
 	DefaultImageRegistry = GCRContainerRegistry // TODO: this is also defined elsewhere and not used; consolidate
 	// JMXTagSuffix prefix tag for agent JMX images
-	JMXTagSuffix = "-jmx"
+	JMXTagSuffix      = "-jmx"
+	AgentDevImageName = "datadog/agent-dev"
+	// Nightly dev image tag for otel agent
+	OTelAgentNightlyTag = "nightly-ot-beta-main"
 
 	agentImageName        = "agent"
 	clusterAgentImageName = "cluster-agent"
diff --git a/pkg/equality/equality.go b/pkg/equality/equality.go
index aa4fce45..fe50d6a5 100644
--- a/pkg/equality/equality.go
+++ b/pkg/equality/equality.go
@@ -10,6 +10,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	networkingv1 "k8s.io/api/networking/v1"
 	policyv1 "k8s.io/api/policy/v1"
+	policyv1beta1 "k8s.io/api/policy/v1beta1"
 	rbacv1 "k8s.io/api/rbac/v1"
 	apiequality "k8s.io/apimachinery/pkg/api/equality"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -181,9 +182,16 @@ func IsEqualServiceAccounts(objA, objB client.Object) bool {
 func IsEqualPodDisruptionBudgets(objA, objB client.Object) bool {
 	a, okA := objA.(*policyv1.PodDisruptionBudget)
 	b, okB := objB.(*policyv1.PodDisruptionBudget)
+
 	if okA && okB && a != nil && b != nil {
 		return apiequality.Semantic.DeepEqual(a.Spec, b.Spec)
 	}
+	ax, okA := objA.(*policyv1beta1.PodDisruptionBudget)
+	bx, okB := objB.(*policyv1beta1.PodDisruptionBudget)
+	if okA && okB && ax != nil && bx != nil {
+		return apiequality.Semantic.DeepEqual(ax.Spec, bx.Spec)
+	}
+
 	return false
 }
 
diff --git a/pkg/kubernetes/objects.go b/pkg/kubernetes/objects.go
index d4d356f4..7a862805 100644
--- a/pkg/kubernetes/objects.go
+++ b/pkg/kubernetes/objects.go
@@ -9,7 +9,6 @@ import (
 	admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
 	corev1 "k8s.io/api/core/v1"
 	networkingv1 "k8s.io/api/networking/v1"
-	policyv1 "k8s.io/api/policy/v1"
 	rbacv1 "k8s.io/api/rbac/v1"
 	apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
@@ -43,7 +42,7 @@ func ObjectFromKind(kind ObjectKind, platformInfo PlatformInfo) client.Object {
 	case ServiceAccountsKind:
 		return &corev1.ServiceAccount{}
 	case PodDisruptionBudgetsKind:
-		return &policyv1.PodDisruptionBudget{}
+		return platformInfo.CreatePDBObject()
 	case NetworkPoliciesKind:
 		return &networkingv1.NetworkPolicy{}
 	case CiliumNetworkPoliciesKind:
diff --git a/pkg/kubernetes/objectslist.go b/pkg/kubernetes/objectslist.go
index 39a638bf..13deb20e 100644
--- a/pkg/kubernetes/objectslist.go
+++ b/pkg/kubernetes/objectslist.go
@@ -9,7 +9,6 @@ import (
 	admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
 	corev1 "k8s.io/api/core/v1"
 	networkingv1 "k8s.io/api/networking/v1"
-	policyv1 "k8s.io/api/policy/v1"
 	rbacv1 "k8s.io/api/rbac/v1"
 	apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
@@ -43,7 +42,7 @@ func ObjectListFromKind(kind ObjectKind, platformInfo PlatformInfo) client.Objec
 	case ServiceAccountsKind:
 		return &corev1.ServiceAccountList{}
 	case PodDisruptionBudgetsKind:
-		return &policyv1.PodDisruptionBudgetList{}
+		return platformInfo.CreatePDBObjectList()
 	case NetworkPoliciesKind:
 		return &networkingv1.NetworkPolicyList{}
 	case CiliumNetworkPoliciesKind:
diff --git a/pkg/kubernetes/platforminfo.go b/pkg/kubernetes/platforminfo.go
index 74f10f6f..c66c120d 100644
--- a/pkg/kubernetes/platforminfo.go
+++ b/pkg/kubernetes/platforminfo.go
@@ -1,8 +1,11 @@
 package kubernetes
 
 import (
+	policyv1 "k8s.io/api/policy/v1"
+	policyv1beta1 "k8s.io/api/policy/v1beta1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/version"
+	"sigs.k8s.io/controller-runtime/pkg/client"
 )
 
 type PlatformInfo struct {
@@ -58,6 +61,27 @@ func NewPlatformInfoFromVersionMaps(versionInfo *version.Info, apiPreferredVersi
 	}
 }
 
+func (platformInfo *PlatformInfo) UseV1Beta1PDB() bool {
+	preferredVersion := platformInfo.apiPreferredVersions["PodDisruptionBudget"]
+
+	// If policy isn't v1beta1 version, we default to v1.
+	return preferredVersion == "policy/v1beta1"
+}
+
+func (platformInfo *PlatformInfo) CreatePDBObject() client.Object {
+	if platformInfo.UseV1Beta1PDB() {
+		return &policyv1beta1.PodDisruptionBudget{}
+	}
+	return &policyv1.PodDisruptionBudget{}
+}
+
+func (platformInfo *PlatformInfo) CreatePDBObjectList() client.ObjectList {
+	if platformInfo.UseV1Beta1PDB() {
+		return &policyv1beta1.PodDisruptionBudgetList{}
+	}
+	return &policyv1.PodDisruptionBudgetList{}
+}
+
 func (platformInfo *PlatformInfo) GetAgentResourcesKind(withCiliumResources bool) []ObjectKind {
 	return getResourcesKind(withCiliumResources)
 }
diff --git a/pkg/kubernetes/provider.go b/pkg/kubernetes/provider.go
index f330f71f..c56feed2 100644
--- a/pkg/kubernetes/provider.go
+++ b/pkg/kubernetes/provider.go
@@ -12,7 +12,6 @@ import (
 	"github.com/go-logr/logr"
 	corev1 "k8s.io/api/core/v1"
 
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 )
 
@@ -167,7 +166,7 @@ func ComponentOverrideFromProvider(overrideName, provider string, providerList m
 	return v2alpha1.DatadogAgentComponentOverride{
 		Name:     &overrideDSName,
 		Affinity: getProviderNodeAffinity(provider, providerList),
-		Labels:   map[string]string{apicommon.MD5AgentDeploymentProviderLabelKey: provider},
+		Labels:   map[string]string{v2alpha1.MD5AgentDeploymentProviderLabelKey: provider},
 	}
 }
 
diff --git a/pkg/remoteconfig/updater.go b/pkg/remoteconfig/updater.go
index 770fd6a9..1ad21f9e 100644
--- a/pkg/remoteconfig/updater.go
+++ b/pkg/remoteconfig/updater.go
@@ -28,7 +28,6 @@ import (
 	"github.com/DataDog/datadog-agent/pkg/config/remote/service"
 	"github.com/DataDog/datadog-agent/pkg/remoteconfig/state"
 
-	"github.com/DataDog/datadog-operator/api/datadoghq/common"
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	"github.com/DataDog/datadog-operator/pkg/config"
 	"github.com/DataDog/datadog-operator/pkg/version"
@@ -130,8 +129,8 @@ func (r *RemoteConfigUpdater) Setup(creds config.Creds) error {
 		return errors.New("error obtaining API key")
 	}
 
-	site := os.Getenv(common.DDSite) // TODO support DD_URL as well
-	clusterName := os.Getenv(common.DDClusterName)
+	site := os.Getenv(v2alpha1.DDSite) // TODO support DD_URL as well
+	clusterName := os.Getenv(v2alpha1.DDClusterName)
 	directorRoot := os.Getenv("DD_REMOTE_CONFIGURATION_DIRECTOR_ROOT")
 	configRoot := os.Getenv("DD_REMOTE_CONFIGURATION_CONFIG_ROOT")
 	endpoint := os.Getenv("DD_REMOTE_CONFIGURATION_RC_DD_URL")



Test patch:
diff --git a/api/datadoghq/v2alpha1/condition_test.go b/api/datadoghq/v2alpha1/condition_test.go
index ac63f0cd..d24ffd98 100644
--- a/api/datadoghq/v2alpha1/condition_test.go
+++ b/api/datadoghq/v2alpha1/condition_test.go
@@ -1,3 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
 package v2alpha1
 
 import (
diff --git a/api/datadoghq/v2alpha1/datadogagent_default_test.go b/api/datadoghq/v2alpha1/datadogagent_default_test.go
index ee4b32bb..35804fce 100644
--- a/api/datadoghq/v2alpha1/datadogagent_default_test.go
+++ b/api/datadoghq/v2alpha1/datadogagent_default_test.go
@@ -8,7 +8,6 @@ package v2alpha1
 import (
 	"testing"
 
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	apiutils "github.com/DataDog/datadog-operator/api/utils"
 
 	"github.com/google/go-cmp/cmp"
@@ -213,6 +212,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -289,6 +291,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -330,6 +335,9 @@ func Test_defaultFeatures(t *testing.T) {
 					APM: &APMFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(valueFalse),
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(valueFalse),
@@ -417,6 +425,9 @@ func Test_defaultFeatures(t *testing.T) {
 					APM: &APMFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(valueFalse),
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(valueFalse),
@@ -480,6 +491,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(valueFalse),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(valueFalse),
+						},
 					},
 					ExternalMetricsServer: &ExternalMetricsServerFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(valueFalse),
@@ -549,6 +563,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -625,6 +642,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -652,7 +672,7 @@ func Test_defaultFeatures(t *testing.T) {
 						ContainerLogsPath:          apiutils.NewStringPointer(defaultLogContainerLogsPath),
 						PodLogsPath:                apiutils.NewStringPointer(defaultLogPodLogsPath),
 						ContainerSymlinksPath:      apiutils.NewStringPointer(defaultLogContainerSymlinksPath),
-						TempStoragePath:            apiutils.NewStringPointer(apicommon.DefaultLogTempStoragePath),
+						TempStoragePath:            apiutils.NewStringPointer(DefaultLogTempStoragePath),
 					},
 					LiveProcessCollection: &LiveProcessCollectionFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultLiveProcessCollectionEnabled),
@@ -690,6 +710,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -766,6 +789,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -826,6 +852,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -902,6 +931,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -962,6 +994,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -1040,6 +1075,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -1107,6 +1145,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -1183,6 +1224,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -1243,6 +1287,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -1322,6 +1369,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -1382,6 +1432,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -1458,6 +1511,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -1484,6 +1540,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(true),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 				},
 			},
@@ -1513,6 +1572,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -1606,6 +1668,9 @@ func Test_defaultFeatures(t *testing.T) {
 							Enabled: apiutils.NewBoolPointer(valueTrue),
 							Mode:    apiutils.NewStringPointer(DefaultAdmissionControllerCWSInstrumentationMode),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -1666,6 +1731,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -1743,6 +1811,152 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
+					},
+					PrometheusScrape: &PrometheusScrapeFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
+					},
+					HelmCheck: &HelmCheckFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultHelmCheckEnabled),
+					},
+				},
+			},
+		},
+
+		{
+			name: "OTel Collector is enabled",
+			ddaSpec: &DatadogAgentSpec{
+				Features: &DatadogFeatures{
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(valueTrue),
+					},
+				},
+			},
+			want: &DatadogAgentSpec{
+				Features: &DatadogFeatures{
+					LogCollection: &LogCollectionFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultLogCollectionEnabled),
+					},
+					LiveProcessCollection: &LiveProcessCollectionFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultLiveProcessCollectionEnabled),
+					},
+					LiveContainerCollection: &LiveContainerCollectionFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultLiveContainerCollectionEnabled),
+					},
+					ProcessDiscovery: &ProcessDiscoveryFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultProcessDiscoveryEnabled),
+					},
+					OOMKill: &OOMKillFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOOMKillEnabled),
+					},
+					TCPQueueLength: &TCPQueueLengthFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultTCPQueueLengthEnabled),
+					},
+					EBPFCheck: &EBPFCheckFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultEBPFCheckEnabled),
+					},
+					ServiceDiscovery: &ServiceDiscoveryFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultServiceDiscoveryEnabled),
+					},
+					APM: &APMFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultAPMEnabled),
+						HostPortConfig: &HostPortConfig{
+							Port:    apiutils.NewInt32Pointer(defaultAPMHostPort),
+							Enabled: apiutils.NewBoolPointer(defaultAPMHostPortEnabled),
+						},
+						UnixDomainSocketConfig: &UnixDomainSocketConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAPMSocketEnabled),
+							Path:    apiutils.NewStringPointer(defaultAPMSocketHostPath),
+						},
+						SingleStepInstrumentation: &SingleStepInstrumentation{
+							Enabled:           apiutils.NewBoolPointer(defaultAPMSingleStepInstrEnabled),
+							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
+						},
+					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(valueTrue),
+					},
+					ASM: &ASMFeatureConfig{
+						Threats: &ASMThreatsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
+						},
+						SCA: &ASMSCAConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMSCAEnabled),
+						},
+						IAST: &ASMIASTConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMIASTEnabled),
+						},
+					},
+					CSPM: &CSPMFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultCSPMEnabled),
+					},
+					CWS: &CWSFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultCWSEnabled),
+					},
+					NPM: &NPMFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultNPMEnabled),
+					},
+					USM: &USMFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultUSMEnabled),
+					},
+					Dogstatsd: &DogstatsdFeatureConfig{
+						OriginDetectionEnabled: apiutils.NewBoolPointer(defaultDogstatsdOriginDetectionEnabled),
+						HostPortConfig:         &HostPortConfig{Enabled: apiutils.NewBoolPointer(defaultDogstatsdHostPortEnabled)},
+						UnixDomainSocketConfig: &UnixDomainSocketConfig{
+							Enabled: apiutils.NewBoolPointer(defaultDogstatsdSocketEnabled),
+							Path:    apiutils.NewStringPointer(defaultDogstatsdHostSocketPath),
+						},
+					},
+					OTLP: &OTLPFeatureConfig{Receiver: OTLPReceiverConfig{Protocols: OTLPProtocolsConfig{
+						GRPC: &OTLPGRPCConfig{
+							Enabled:        apiutils.NewBoolPointer(defaultOTLPGRPCEnabled),
+							HostPortConfig: nil,
+							Endpoint:       apiutils.NewStringPointer(defaultOTLPGRPCEndpoint),
+						},
+						HTTP: &OTLPHTTPConfig{
+							Enabled:        apiutils.NewBoolPointer(defaultOTLPHTTPEnabled),
+							HostPortConfig: nil,
+							Endpoint:       apiutils.NewStringPointer(defaultOTLPHTTPEndpoint),
+						},
+					}}},
+					RemoteConfiguration: &RemoteConfigurationFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultRemoteConfigurationEnabled),
+					},
+					EventCollection: &EventCollectionFeatureConfig{
+						CollectKubernetesEvents: apiutils.NewBoolPointer(defaultCollectKubernetesEvents),
+					},
+					OrchestratorExplorer: &OrchestratorExplorerFeatureConfig{
+						Enabled:         apiutils.NewBoolPointer(defaultOrchestratorExplorerEnabled),
+						ScrubContainers: apiutils.NewBoolPointer(defaultOrchestratorExplorerScrubContainers),
+					},
+					ExternalMetricsServer: &ExternalMetricsServerFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultExternalMetricsServerEnabled),
+					},
+					KubeStateMetricsCore: &KubeStateMetricsCoreFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultKubeStateMetricsCoreEnabled),
+					},
+					ClusterChecks: &ClusterChecksFeatureConfig{
+						Enabled:                 apiutils.NewBoolPointer(defaultClusterChecksEnabled),
+						UseClusterChecksRunners: apiutils.NewBoolPointer(defaultUseClusterChecksRunners),
+					},
+					AdmissionController: &AdmissionControllerFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerEnabled),
+						Validation: &AdmissionControllerValidationConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerValidationEnabled),
+						},
+						Mutation: &AdmissionControllerMutationConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerMutationEnabled),
+						},
+						MutateUnlabelled: apiutils.NewBoolPointer(defaultAdmissionControllerMutateUnlabelled),
+						ServiceName:      apiutils.NewStringPointer(defaultAdmissionServiceName),
+						CWSInstrumentation: &CWSInstrumentationConfig{
+							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
+						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -1825,6 +2039,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -1901,6 +2118,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
@@ -1964,6 +2184,9 @@ func Test_defaultFeatures(t *testing.T) {
 							LanguageDetection: &LanguageDetectionConfig{Enabled: apiutils.NewBoolPointer(defaultLanguageDetectionEnabled)},
 						},
 					},
+					OtelCollector: &OtelCollectorFeatureConfig{
+						Enabled: apiutils.NewBoolPointer(defaultOtelCollectorEnabled),
+					},
 					ASM: &ASMFeatureConfig{
 						Threats: &ASMThreatsConfig{
 							Enabled: apiutils.NewBoolPointer(defaultAdmissionASMThreatsEnabled),
@@ -2050,6 +2273,9 @@ func Test_defaultFeatures(t *testing.T) {
 						CWSInstrumentation: &CWSInstrumentationConfig{
 							Enabled: apiutils.NewBoolPointer(DefaultAdmissionControllerCWSInstrumentationEnabled),
 						},
+						KubernetesAdmissionEvents: &KubernetesAdmissionEventsConfig{
+							Enabled: apiutils.NewBoolPointer(defaultAdmissionControllerKubernetesAdmissionEventsEnabled),
+						},
 					},
 					PrometheusScrape: &PrometheusScrapeFeatureConfig{
 						Enabled: apiutils.NewBoolPointer(defaultPrometheusScrapeEnabled),
diff --git a/api/datadoghq/v2alpha1/test/builder.go b/api/datadoghq/v2alpha1/test/builder.go
index 26091989..b8d75493 100644
--- a/api/datadoghq/v2alpha1/test/builder.go
+++ b/api/datadoghq/v2alpha1/test/builder.go
@@ -9,6 +9,7 @@ import (
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	"github.com/DataDog/datadog-operator/api/utils"
 	apiutils "github.com/DataDog/datadog-operator/api/utils"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/otelcollector/defaultconfig"
 	defaulting "github.com/DataDog/datadog-operator/pkg/defaulting"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
@@ -374,6 +375,74 @@ func (builder *DatadogAgentBuilder) WithProcessDiscoveryEnabled(enabled bool) *D
 	return builder
 }
 
+// OTel Agent
+func (builder *DatadogAgentBuilder) initOtelCollector() {
+	if builder.datadogAgent.Spec.Features.OtelCollector == nil {
+		builder.datadogAgent.Spec.Features.OtelCollector = &v2alpha1.OtelCollectorFeatureConfig{}
+	}
+}
+
+func (builder *DatadogAgentBuilder) WithOTelCollectorEnabled(enabled bool) *DatadogAgentBuilder {
+	builder.initOtelCollector()
+	builder.datadogAgent.Spec.Features.OtelCollector.Enabled = apiutils.NewBoolPointer(enabled)
+	return builder
+}
+
+func (builder *DatadogAgentBuilder) WithOTelCollectorConfig() *DatadogAgentBuilder {
+	builder.datadogAgent.Spec.Features.OtelCollector.Conf = &v2alpha1.CustomConfig{}
+	builder.datadogAgent.Spec.Features.OtelCollector.Conf.ConfigData =
+		apiutils.NewStringPointer(defaultconfig.DefaultOtelCollectorConfig)
+	return builder
+}
+
+func (builder *DatadogAgentBuilder) WithOTelCollectorCoreConfigEnabled(enabled bool) *DatadogAgentBuilder {
+	if builder.datadogAgent.Spec.Features.OtelCollector.CoreConfig == nil {
+		builder.datadogAgent.Spec.Features.OtelCollector.CoreConfig = &v2alpha1.CoreConfig{}
+	}
+	builder.datadogAgent.Spec.Features.OtelCollector.CoreConfig.Enabled = apiutils.NewBoolPointer(enabled)
+	return builder
+}
+
+func (builder *DatadogAgentBuilder) WithOTelCollectorCoreConfigExtensionTimeout(timeout int) *DatadogAgentBuilder {
+	if builder.datadogAgent.Spec.Features.OtelCollector.CoreConfig == nil {
+		builder.datadogAgent.Spec.Features.OtelCollector.CoreConfig = &v2alpha1.CoreConfig{}
+	}
+	builder.datadogAgent.Spec.Features.OtelCollector.CoreConfig.ExtensionTimeout = apiutils.NewIntPointer(timeout)
+	return builder
+}
+
+func (builder *DatadogAgentBuilder) WithOTelCollectorCoreConfigExtensionURL(url string) *DatadogAgentBuilder {
+	if builder.datadogAgent.Spec.Features.OtelCollector.CoreConfig == nil {
+		builder.datadogAgent.Spec.Features.OtelCollector.CoreConfig = &v2alpha1.CoreConfig{}
+	}
+	builder.datadogAgent.Spec.Features.OtelCollector.CoreConfig.ExtensionURL = apiutils.NewStringPointer(url)
+	return builder
+}
+
+func (builder *DatadogAgentBuilder) WithOTelCollectorConfigMap() *DatadogAgentBuilder {
+	builder.datadogAgent.Spec.Features.OtelCollector.Conf = &v2alpha1.CustomConfig{}
+	builder.datadogAgent.Spec.Features.OtelCollector.Conf.ConfigMap = &v2alpha1.ConfigMapConfig{
+		Name: "user-provided-config-map",
+	}
+	return builder
+}
+
+func (builder *DatadogAgentBuilder) WithOTelCollectorPorts(grpcPort int32, httpPort int32) *DatadogAgentBuilder {
+	builder.datadogAgent.Spec.Features.OtelCollector.Ports = []*corev1.ContainerPort{
+		{
+			Name:          "otel-http",
+			ContainerPort: httpPort,
+			Protocol:      corev1.ProtocolTCP,
+		},
+		{
+			Name:          "otel-grpc",
+			ContainerPort: grpcPort,
+			Protocol:      corev1.ProtocolTCP,
+		},
+	}
+	return builder
+}
+
 // Log Collection
 func (builder *DatadogAgentBuilder) initLogCollection() {
 	if builder.datadogAgent.Spec.Features.LogCollection == nil {
diff --git a/internal/controller/datadogagent/component/clusteragent/default_test.go b/internal/controller/datadogagent/component/clusteragent/default_test.go
index 567fb7d0..cffbda84 100644
--- a/internal/controller/datadogagent/component/clusteragent/default_test.go
+++ b/internal/controller/datadogagent/component/clusteragent/default_test.go
@@ -14,6 +14,7 @@ import (
 	"github.com/stretchr/testify/assert"
 
 	corev1 "k8s.io/api/core/v1"
+	policyv1 "k8s.io/api/policy/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 )
@@ -46,7 +47,7 @@ func Test_getPodDisruptionBudget(t *testing.T) {
 			Namespace: "some-namespace",
 		},
 	}
-	testpdb := GetClusterAgentPodDisruptionBudget(&dda)
+	testpdb := GetClusterAgentPodDisruptionBudget(&dda, false).(*policyv1.PodDisruptionBudget)
 	assert.Equal(t, "my-datadog-agent-cluster-agent-pdb", testpdb.Name)
 	assert.Equal(t, intstr.FromInt(pdbMinAvailableInstances), *testpdb.Spec.MinAvailable)
 	assert.Nil(t, testpdb.Spec.MaxUnavailable)
diff --git a/internal/controller/datadogagent/component/clusterchecksrunner/default_test.go b/internal/controller/datadogagent/component/clusterchecksrunner/default_test.go
index eb1177de..0b43ec1c 100644
--- a/internal/controller/datadogagent/component/clusterchecksrunner/default_test.go
+++ b/internal/controller/datadogagent/component/clusterchecksrunner/default_test.go
@@ -10,6 +10,7 @@ import (
 
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	"github.com/stretchr/testify/assert"
+	policyv1 "k8s.io/api/policy/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 )
@@ -32,7 +33,7 @@ func Test_getPodDisruptionBudget(t *testing.T) {
 			Namespace: "some-namespace",
 		},
 	}
-	testpdb := GetClusterChecksRunnerPodDisruptionBudget(&dda)
+	testpdb := GetClusterChecksRunnerPodDisruptionBudget(&dda, false).(*policyv1.PodDisruptionBudget)
 	assert.Equal(t, "my-datadog-agent-cluster-checks-runner-pdb", testpdb.Name)
 	assert.Equal(t, intstr.FromInt(pdbMaxUnavailableInstances), *testpdb.Spec.MaxUnavailable)
 	assert.Nil(t, testpdb.Spec.MinAvailable)
diff --git a/internal/controller/datadogagent/controller_reconcile_agent_test.go b/internal/controller/datadogagent/controller_reconcile_agent_test.go
index 9a28fdbc..edf517bc 100644
--- a/internal/controller/datadogagent/controller_reconcile_agent_test.go
+++ b/internal/controller/datadogagent/controller_reconcile_agent_test.go
@@ -339,9 +339,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -367,9 +367,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-								kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+								kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 							},
 							ResourceVersion: "999",
 						},
@@ -387,9 +387,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "dda-foo-agent-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -416,9 +416,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "dda-foo-agent-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-								kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+								kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 							},
 							ResourceVersion: "999",
 						},
@@ -454,9 +454,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -482,9 +482,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-								kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+								kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 							},
 							ResourceVersion: "999",
 						},
@@ -522,9 +522,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -533,9 +533,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "dda-foo-agent-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -544,9 +544,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -572,9 +572,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-								kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+								kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 							},
 							ResourceVersion: "999",
 						},
@@ -588,9 +588,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "dda-foo-agent-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-								kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+								kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 							},
 							ResourceVersion: "999",
 						},
@@ -616,9 +616,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "dda-foo-agent-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						}},
 				},
 				&appsv1.DaemonSet{
@@ -636,9 +636,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -664,9 +664,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "dda-foo-agent-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-								kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+								kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 							},
 							ResourceVersion: "999",
 						},
@@ -704,9 +704,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -715,9 +715,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "dda-foo-agent-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -726,9 +726,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -757,9 +757,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "dda-foo-agent-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-								kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+								kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 							},
 							ResourceVersion: "999",
 						},
@@ -795,9 +795,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -879,9 +879,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -890,9 +890,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "dda-foo-agent-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -901,9 +901,9 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -993,8 +993,8 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -1036,8 +1036,8 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 							},
 							ResourceVersion: "999",
 						},
@@ -1077,8 +1077,8 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -1087,8 +1087,8 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "dda-foo-agent-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
 						},
 					},
 				},
@@ -1097,8 +1097,8 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 						Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 						Namespace: "ns-1",
 						Labels: map[string]string{
-							apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-							kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+							datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+							kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 						},
 					},
 				},
@@ -1149,8 +1149,8 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 							},
 							ResourceVersion: "999",
 						},
@@ -1174,8 +1174,8 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "datadog-agent-with-profile-ns-1-profile-1-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								kubernetes.AppKubernetesManageByLabelKey:     "datadog-operator",
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								kubernetes.AppKubernetesManageByLabelKey:             "datadog-operator",
 							},
 							ResourceVersion: "999",
 						},
@@ -1192,8 +1192,8 @@ func Test_cleanupExtraneousDaemonSets(t *testing.T) {
 							Name:      "dda-foo-agent-gke-cos",
 							Namespace: "ns-1",
 							Labels: map[string]string{
-								apicommon.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
-								apicommon.AgentDeploymentComponentLabelKey:   datadoghqv2alpha1.DefaultAgentResourceSuffix,
+								datadoghqv2alpha1.MD5AgentDeploymentProviderLabelKey: gkeCosProvider,
+								apicommon.AgentDeploymentComponentLabelKey:           datadoghqv2alpha1.DefaultAgentResourceSuffix,
 							},
 							ResourceVersion: "999",
 						},
diff --git a/internal/controller/datadogagent/controller_v2_test.go b/internal/controller/datadogagent/controller_v2_test.go
index f7b5b533..42706c93 100644
--- a/internal/controller/datadogagent/controller_v2_test.go
+++ b/internal/controller/datadogagent/controller_v2_test.go
@@ -581,7 +581,7 @@ func verifyDaemonsetContainers(c client.Client, resourcesNamespace, dsName strin
 
 func verifyDaemonsetNames(t *testing.T, c client.Client, resourcesNamespace, dsName string, expectedDSNames []string) error {
 	daemonSetList := appsv1.DaemonSetList{}
-	if err := c.List(context.TODO(), &daemonSetList, client.HasLabels{apicommon.MD5AgentDeploymentProviderLabelKey}); err != nil {
+	if err := c.List(context.TODO(), &daemonSetList, client.HasLabels{v2alpha1.MD5AgentDeploymentProviderLabelKey}); err != nil {
 		return err
 	}
 
diff --git a/internal/controller/datadogagent/feature/admissioncontroller/feature_test.go b/internal/controller/datadogagent/feature/admissioncontroller/feature_test.go
index 2642822e..9e2963b9 100644
--- a/internal/controller/datadogagent/feature/admissioncontroller/feature_test.go
+++ b/internal/controller/datadogagent/feature/admissioncontroller/feature_test.go
@@ -208,56 +208,56 @@ func testDCAResources(acm string, registry string, cwsInstrumentationEnabled boo
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[apicommon.ClusterAgentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDAdmissionControllerEnabled,
+					Name:  DDAdmissionControllerEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAdmissionControllerValidationEnabled,
+					Name:  DDAdmissionControllerValidationEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAdmissionControllerMutationEnabled,
+					Name:  DDAdmissionControllerMutationEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAdmissionControllerMutateUnlabelled,
+					Name:  DDAdmissionControllerMutateUnlabelled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAdmissionControllerServiceName,
+					Name:  DDAdmissionControllerServiceName,
 					Value: "testServiceName",
 				},
 				{
-					Name:  apicommon.DDAdmissionControllerLocalServiceName,
+					Name:  DDAdmissionControllerLocalServiceName,
 					Value: "-agent",
 				},
 				{
-					Name:  apicommon.DDAdmissionControllerWebhookName,
+					Name:  DDAdmissionControllerWebhookName,
 					Value: "datadog-webhook",
 				},
 			}
 			if cwsInstrumentationEnabled {
 				expectedAgentEnvs = append(expectedAgentEnvs, []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDAdmissionControllerCWSInstrumentationEnabled,
+						Name:  DDAdmissionControllerCWSInstrumentationEnabled,
 						Value: apiutils.BoolToString(&cwsInstrumentationEnabled),
 					},
 					{
-						Name:  apicommon.DDAdmissionControllerCWSInstrumentationMode,
+						Name:  DDAdmissionControllerCWSInstrumentationMode,
 						Value: "test-mode",
 					},
 				}...)
 			}
 			if acm != "" {
 				acmEnv := corev1.EnvVar{
-					Name:  apicommon.DDAdmissionControllerInjectConfigMode,
+					Name:  DDAdmissionControllerInjectConfigMode,
 					Value: acm,
 				}
 				expectedAgentEnvs = append(expectedAgentEnvs, &acmEnv)
 			}
 			if registry != "" {
 				registryEnv := corev1.EnvVar{
-					Name:  apicommon.DDAdmissionControllerRegistryName,
+					Name:  DDAdmissionControllerRegistryName,
 					Value: registry,
 				}
 				expectedAgentEnvs = append(expectedAgentEnvs, &registryEnv)
@@ -276,26 +276,26 @@ func testDCAResources(acm string, registry string, cwsInstrumentationEnabled boo
 func getACEnvVars(validation, mutation bool, acm, registry string, cws bool) []*corev1.EnvVar {
 	envVars := []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDAdmissionControllerEnabled,
+			Name:  DDAdmissionControllerEnabled,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDAdmissionControllerMutateUnlabelled,
+			Name:  DDAdmissionControllerMutateUnlabelled,
 			Value: "false",
 		},
 		{
-			Name:  apicommon.DDAdmissionControllerLocalServiceName,
+			Name:  DDAdmissionControllerLocalServiceName,
 			Value: "-agent",
 		},
 		{
-			Name:  apicommon.DDAdmissionControllerWebhookName,
+			Name:  DDAdmissionControllerWebhookName,
 			Value: "datadog-webhook",
 		},
 	}
 
 	if validation {
 		validationEnv := corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerValidationEnabled,
+			Name:  DDAdmissionControllerValidationEnabled,
 			Value: apiutils.BoolToString(&validation),
 		}
 		envVars = append(envVars, &validationEnv)
@@ -303,7 +303,7 @@ func getACEnvVars(validation, mutation bool, acm, registry string, cws bool) []*
 
 	if mutation {
 		mutationEnv := corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerMutationEnabled,
+			Name:  DDAdmissionControllerMutationEnabled,
 			Value: apiutils.BoolToString(&mutation),
 		}
 		envVars = append(envVars, &mutationEnv)
@@ -311,14 +311,14 @@ func getACEnvVars(validation, mutation bool, acm, registry string, cws bool) []*
 
 	if acm != "" {
 		acmEnv := corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerInjectConfigMode,
+			Name:  DDAdmissionControllerInjectConfigMode,
 			Value: acm,
 		}
 		envVars = append(envVars, &acmEnv)
 	}
 	if registry != "" {
 		registryEnv := corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerRegistryName,
+			Name:  DDAdmissionControllerRegistryName,
 			Value: registry,
 		}
 		envVars = append(envVars, &registryEnv)
@@ -327,11 +327,11 @@ func getACEnvVars(validation, mutation bool, acm, registry string, cws bool) []*
 	if cws {
 		cwsEnv := []corev1.EnvVar{
 			{
-				Name:  apicommon.DDAdmissionControllerCWSInstrumentationEnabled,
+				Name:  DDAdmissionControllerCWSInstrumentationEnabled,
 				Value: apiutils.BoolToString(&cws),
 			},
 			{
-				Name:  apicommon.DDAdmissionControllerCWSInstrumentationMode,
+				Name:  DDAdmissionControllerCWSInstrumentationMode,
 				Value: "test-mode",
 			},
 		}
@@ -369,36 +369,36 @@ func sidecarHelperFunc(admissionControllerConfig, sidecarConfig []*corev1.EnvVar
 func getSidecarEnvVars(imageName, imageTag, registry string, selectors, profiles bool) []*corev1.EnvVar {
 	envVars := []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDAdmissionControllerAgentSidecarEnabled,
+			Name:  DDAdmissionControllerAgentSidecarEnabled,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDAdmissionControllerAgentSidecarClusterAgentEnabled,
+			Name:  DDAdmissionControllerAgentSidecarClusterAgentEnabled,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDAdmissionControllerAgentSidecarProvider,
+			Name:  DDAdmissionControllerAgentSidecarProvider,
 			Value: "fargate",
 		},
 		{
-			Name:  apicommon.DDAdmissionControllerAgentSidecarImageName,
+			Name:  DDAdmissionControllerAgentSidecarImageName,
 			Value: imageName,
 		},
 		{
-			Name:  apicommon.DDAdmissionControllerAgentSidecarImageTag,
+			Name:  DDAdmissionControllerAgentSidecarImageTag,
 			Value: imageTag,
 		},
 	}
 	if registry != "" {
 		registryEnv := corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerAgentSidecarRegistry,
+			Name:  DDAdmissionControllerAgentSidecarRegistry,
 			Value: registry,
 		}
 		envVars = append(envVars, &registryEnv)
 	}
 	if selectors {
 		selectorEnv := corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerAgentSidecarSelectors,
+			Name:  DDAdmissionControllerAgentSidecarSelectors,
 			Value: "[{\"namespaceSelector\":{\"matchLabels\":{\"testKey\":\"testValue\"}},\"objectSelector\":{\"matchLabels\":{\"testKey\":\"testValue\"}}}]",
 		}
 		envVars = append(envVars, &selectorEnv)
@@ -406,7 +406,7 @@ func getSidecarEnvVars(imageName, imageTag, registry string, selectors, profiles
 
 	if profiles {
 		profileEnv := corev1.EnvVar{
-			Name:  apicommon.DDAdmissionControllerAgentSidecarProfiles,
+			Name:  DDAdmissionControllerAgentSidecarProfiles,
 			Value: "[{\"env\":[{\"name\":\"testName\",\"value\":\"testValue\"}],\"resources\":{\"requests\":{\"cpu\":\"500m\",\"memory\":\"1Gi\"}}}]",
 		}
 		envVars = append(envVars, &profileEnv)
diff --git a/internal/controller/datadogagent/feature/apm/feature_test.go b/internal/controller/datadogagent/feature/apm/feature_test.go
index ea0d3673..69b9aa0f 100644
--- a/internal/controller/datadogagent/feature/apm/feature_test.go
+++ b/internal/controller/datadogagent/feature/apm/feature_test.go
@@ -26,8 +26,8 @@ import (
 )
 
 const (
-	apmSocketHostPath  = apicommon.DogstatsdAPMSocketHostPath + "/" + apicommon.APMSocketName
-	apmSocketLocalPath = apmSocketVolumeLocalPath + "/" + apicommon.APMSocketName
+	apmSocketHostPath  = v2alpha1.DogstatsdAPMSocketHostPath + "/" + v2alpha1.APMSocketName
+	apmSocketLocalPath = apmSocketVolumeLocalPath + "/" + v2alpha1.APMSocketName
 )
 
 func TestShouldEnableAPM(t *testing.T) {
@@ -375,19 +375,19 @@ func testTraceAgentEnabled(containerName apicommon.AgentContainerName) *test.Com
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[containerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDAPMEnabled,
+					Name:  v2alpha1.DDAPMEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAPMNonLocalTraffic,
+					Name:  DDAPMNonLocalTraffic,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAPMReceiverPort,
+					Name:  DDAPMReceiverPort,
 					Value: "8126",
 				},
 				{
-					Name:  apicommon.DDAPMReceiverSocket,
+					Name:  DDAPMReceiverSocket,
 					Value: apmSocketLocalPath,
 				},
 			}
@@ -408,15 +408,15 @@ func testAgentHostPortOnly() *test.ComponentTest {
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[apicommon.TraceAgentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDAPMEnabled,
+					Name:  v2alpha1.DDAPMEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAPMNonLocalTraffic,
+					Name:  DDAPMNonLocalTraffic,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAPMReceiverPort,
+					Name:  DDAPMReceiverPort,
 					Value: "8126",
 				},
 			}
@@ -452,11 +452,11 @@ func testAgentUDSOnly(agentContainerName apicommon.AgentContainerName) *test.Com
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[agentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDAPMEnabled,
+					Name:  v2alpha1.DDAPMEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAPMReceiverSocket,
+					Name:  DDAPMReceiverSocket,
 					Value: apmSocketLocalPath,
 				},
 			}
@@ -487,7 +487,7 @@ func testAgentUDSOnly(agentContainerName apicommon.AgentContainerName) *test.Com
 					Name: apmSocketVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.DogstatsdAPMSocketHostPath,
+							Path: v2alpha1.DogstatsdAPMSocketHostPath,
 							Type: &volType,
 						},
 					},
@@ -524,15 +524,15 @@ func testAPMInstrumentationFull() *test.ComponentTest {
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[apicommon.ClusterAgentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDAPMInstrumentationEnabled,
+					Name:  DDAPMInstrumentationEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAPMInstrumentationDisabledNamespaces,
+					Name:  DDAPMInstrumentationDisabledNamespaces,
 					Value: "[\"foo\",\"bar\"]",
 				},
 				{
-					Name:  apicommon.DDAPMInstrumentationLibVersions,
+					Name:  DDAPMInstrumentationLibVersions,
 					Value: "{\"java\":\"1.2.4\"}",
 				},
 			}
@@ -570,15 +570,15 @@ func testAPMInstrumentationNamespaces() *test.ComponentTest {
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[apicommon.ClusterAgentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDAPMInstrumentationEnabled,
+					Name:  DDAPMInstrumentationEnabled,
 					Value: "false",
 				},
 				{
-					Name:  apicommon.DDAPMInstrumentationEnabledNamespaces,
+					Name:  DDAPMInstrumentationEnabledNamespaces,
 					Value: "[\"foo\",\"bar\"]",
 				},
 				{
-					Name:  apicommon.DDAPMInstrumentationLibVersions,
+					Name:  DDAPMInstrumentationLibVersions,
 					Value: "{\"java\":\"1.2.4\"}",
 				},
 			}
@@ -599,7 +599,7 @@ func testAPMInstrumentation() *test.ComponentTest {
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[apicommon.ClusterAgentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDAPMInstrumentationEnabled,
+					Name:  DDAPMInstrumentationEnabled,
 					Value: "true",
 				},
 			}
@@ -621,11 +621,11 @@ func testAPMInstrumentationWithLanguageDetectionEnabledForClusterAgent() *test.C
 			clusterAgentEnvs := mgr.EnvVarMgr.EnvVarsByC[apicommon.ClusterAgentContainerName]
 			expectedClusterAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDAPMInstrumentationEnabled,
+					Name:  DDAPMInstrumentationEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDLanguageDetectionEnabled,
+					Name:  DDLanguageDetectionEnabled,
 					Value: "true",
 				},
 			}
@@ -650,11 +650,11 @@ func testAPMInstrumentationWithLanguageDetectionForNodeAgent(languageDetectionEn
 			if languageDetectionEnabled {
 				expectedEnvVars = []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDLanguageDetectionEnabled,
+						Name:  DDLanguageDetectionEnabled,
 						Value: "true",
 					},
 					{
-						Name:  apicommon.DDProcessConfigRunInCoreAgent,
+						Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 						Value: utils.BoolToString(&processChecksInCoreAgent),
 					},
 				}
@@ -690,19 +690,19 @@ func testAgentHostPortUDS(agentContainerName apicommon.AgentContainerName, hostP
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[agentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDAPMEnabled,
+					Name:  v2alpha1.DDAPMEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAPMNonLocalTraffic,
+					Name:  DDAPMNonLocalTraffic,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDAPMReceiverPort,
+					Name:  DDAPMReceiverPort,
 					Value: strconv.Itoa(int(receiverPortValue)),
 				},
 				{
-					Name:  apicommon.DDAPMReceiverSocket,
+					Name:  DDAPMReceiverSocket,
 					Value: apmSocketLocalPath,
 				},
 			}
@@ -733,7 +733,7 @@ func testAgentHostPortUDS(agentContainerName apicommon.AgentContainerName, hostP
 					Name: apmSocketVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.DogstatsdAPMSocketHostPath,
+							Path: v2alpha1.DogstatsdAPMSocketHostPath,
 							Type: &volType,
 						},
 					},
diff --git a/internal/controller/datadogagent/feature/asm/feature_test.go b/internal/controller/datadogagent/feature/asm/feature_test.go
index a9da36f4..f4a33c48 100644
--- a/internal/controller/datadogagent/feature/asm/feature_test.go
+++ b/internal/controller/datadogagent/feature/asm/feature_test.go
@@ -66,7 +66,7 @@ func TestASMFeature(t *testing.T) {
 				Build(),
 
 			WantConfigure: true,
-			ClusterAgent:  assertEnv(envVar{name: apicommon.DDAdmissionControllerAppsecEnabled, value: "true", present: true}),
+			ClusterAgent:  assertEnv(envVar{name: DDAdmissionControllerAppsecEnabled, value: "true", present: true}),
 		},
 		{
 			Name: "ASM Threats enabled, admission controller not enabled",
@@ -93,7 +93,7 @@ func TestASMFeature(t *testing.T) {
 				Build(),
 
 			WantConfigure: true,
-			ClusterAgent:  assertEnv(envVar{name: apicommon.DDAdmissionControllerAppsecSCAEnabled, value: "true", present: true}),
+			ClusterAgent:  assertEnv(envVar{name: DDAdmissionControllerAppsecSCAEnabled, value: "true", present: true}),
 		},
 		{
 			Name: "ASM IAST enabled",
@@ -103,7 +103,7 @@ func TestASMFeature(t *testing.T) {
 				Build(),
 
 			WantConfigure: true,
-			ClusterAgent:  assertEnv(envVar{name: apicommon.DDAdmissionControllerIASTEnabled, value: "true", present: true}),
+			ClusterAgent:  assertEnv(envVar{name: DDAdmissionControllerIASTEnabled, value: "true", present: true}),
 		},
 		{
 			Name: "ASM all enabled",
@@ -115,15 +115,15 @@ func TestASMFeature(t *testing.T) {
 			WantConfigure: true,
 			ClusterAgent: assertEnv(
 				envVar{
-					name:    apicommon.DDAdmissionControllerAppsecEnabled,
+					name:    DDAdmissionControllerAppsecEnabled,
 					value:   "true",
 					present: true,
 				}, envVar{
-					name:    apicommon.DDAdmissionControllerAppsecSCAEnabled,
+					name:    DDAdmissionControllerAppsecSCAEnabled,
 					value:   "true",
 					present: true,
 				}, envVar{
-					name:    apicommon.DDAdmissionControllerIASTEnabled,
+					name:    DDAdmissionControllerIASTEnabled,
 					value:   "true",
 					present: true,
 				}),
diff --git a/internal/controller/datadogagent/feature/autoscaling/feature_test.go b/internal/controller/datadogagent/feature/autoscaling/feature_test.go
index 31e84e97..625e629b 100644
--- a/internal/controller/datadogagent/feature/autoscaling/feature_test.go
+++ b/internal/controller/datadogagent/feature/autoscaling/feature_test.go
@@ -152,7 +152,7 @@ func testDCAResources(enabled bool) *test.ComponentTest {
 			if enabled {
 				expectedAgentEnvs = append(expectedAgentEnvs,
 					&corev1.EnvVar{
-						Name:  apicommon.DDAutoscalingWorkloadEnabled,
+						Name:  DDAutoscalingWorkloadEnabled,
 						Value: "true",
 					},
 				)
diff --git a/internal/controller/datadogagent/feature/clusterchecks/feature_test.go b/internal/controller/datadogagent/feature/clusterchecks/feature_test.go
index 2a87930b..adf2ecd6 100644
--- a/internal/controller/datadogagent/feature/clusterchecks/feature_test.go
+++ b/internal/controller/datadogagent/feature/clusterchecks/feature_test.go
@@ -110,7 +110,7 @@ func TestClusterAgentChecksumsDifferentForDifferentConfig(t *testing.T) {
 	logf.SetLogger(zap.New(zap.UseDevMode(true)))
 	logger := logf.Log.WithName("checksum unique")
 
-	annotationKey := fmt.Sprintf(apicommon.MD5ChecksumAnnotationKey, feature.ClusterChecksIDType)
+	annotationKey := fmt.Sprintf(v2alpha1.MD5ChecksumAnnotationKey, feature.ClusterChecksIDType)
 	feature := buildClusterChecksFeature(&feature.Options{
 		Logger: logger,
 	})
@@ -166,15 +166,15 @@ func wantClusterAgentHasExpectedEnvs(t testing.TB, mgrInterface feature.PodTempl
 	clusterAgentEnvs := mgr.EnvVarMgr.EnvVarsByC[apicommon.ClusterAgentContainerName]
 	expectedClusterAgentEnvs := []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDClusterChecksEnabled,
+			Name:  DDClusterChecksEnabled,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDExtraConfigProviders,
+			Name:  DDExtraConfigProviders,
 			Value: v2alpha1.KubeServicesAndEndpointsConfigProviders,
 		},
 		{
-			Name:  apicommon.DDExtraListeners,
+			Name:  DDExtraListeners,
 			Value: v2alpha1.KubeServicesAndEndpointsListeners,
 		},
 	}
@@ -188,7 +188,7 @@ func wantClusterAgentHasExpectedEnvs(t testing.TB, mgrInterface feature.PodTempl
 
 func wantClusterAgentHasNonEmptyChecksumAnnotation(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 	mgr := mgrInterface.(*fake.PodTemplateManagers)
-	annotationKey := fmt.Sprintf(apicommon.MD5ChecksumAnnotationKey, feature.ClusterChecksIDType)
+	annotationKey := fmt.Sprintf(v2alpha1.MD5ChecksumAnnotationKey, feature.ClusterChecksIDType)
 	annotations := mgr.AnnotationMgr.Annotations
 	assert.NotEmpty(t, annotations[annotationKey])
 }
@@ -201,12 +201,12 @@ func testClusterChecksRunnerHasExpectedEnvs() *test.ComponentTest {
 			clusterRunnerEnvs := mgr.EnvVarMgr.EnvVarsByC[apicommon.ClusterChecksRunnersContainerName]
 			expectedClusterRunnerEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDClusterChecksEnabled,
+					Name:  DDClusterChecksEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDExtraConfigProviders,
-					Value: apicommon.ClusterChecksConfigProvider,
+					Name:  DDExtraConfigProviders,
+					Value: ClusterChecksConfigProvider,
 				},
 			}
 
@@ -227,7 +227,7 @@ func testAgentHasExpectedEnvsWithRunners(agentContainerName apicommon.AgentConta
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[agentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDExtraConfigProviders,
+					Name:  DDExtraConfigProviders,
 					Value: v2alpha1.EndpointsChecksConfigProvider,
 				},
 			}
@@ -249,7 +249,7 @@ func testAgentHasExpectedEnvsWithNoRunners(agentContainerName apicommon.AgentCon
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[agentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDExtraConfigProviders,
+					Name:  DDExtraConfigProviders,
 					Value: v2alpha1.ClusterAndEndpointsConfigProviders,
 				},
 			}
diff --git a/internal/controller/datadogagent/feature/cspm/feature_test.go b/internal/controller/datadogagent/feature/cspm/feature_test.go
index 3c670804..45de5c1c 100644
--- a/internal/controller/datadogagent/feature/cspm/feature_test.go
+++ b/internal/controller/datadogagent/feature/cspm/feature_test.go
@@ -92,11 +92,11 @@ func cspmClusterAgentWantFunc() *test.ComponentTest {
 
 			want := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDComplianceConfigEnabled,
+					Name:  DDComplianceConfigEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDComplianceConfigCheckInterval,
+					Name:  DDComplianceConfigCheckInterval,
 					Value: "1200000000000",
 				},
 			}
@@ -134,7 +134,7 @@ func cspmClusterAgentWantFunc() *test.ComponentTest {
 			hash, err := comparison.GenerateMD5ForSpec(customConfig)
 			assert.NoError(t, err)
 			wantAnnotations := map[string]string{
-				fmt.Sprintf(apicommon.MD5ChecksumAnnotationKey, feature.CSPMIDType): hash,
+				fmt.Sprintf(v2alpha1.MD5ChecksumAnnotationKey, feature.CSPMIDType): hash,
 			}
 			annotations := mgr.AnnotationMgr.Annotations
 			assert.True(t, apiutils.IsEqualStruct(annotations, wantAnnotations), "Annotations \ndiff = %s", cmp.Diff(annotations, wantAnnotations))
@@ -150,19 +150,19 @@ func cspmAgentNodeWantFunc() *test.ComponentTest {
 
 			want := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDComplianceConfigEnabled,
+					Name:  DDComplianceConfigEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDHostRootEnvVar,
-					Value: apicommon.HostRootMountPath,
+					Name:  v2alpha1.DDHostRootEnvVar,
+					Value: v2alpha1.HostRootMountPath,
 				},
 				{
-					Name:  apicommon.DDComplianceConfigCheckInterval,
+					Name:  DDComplianceConfigCheckInterval,
 					Value: "1200000000000",
 				},
 				{
-					Name:  apicommon.DDComplianceHostBenchmarksEnabled,
+					Name:  DDComplianceHostBenchmarksEnabled,
 					Value: "true",
 				},
 			}
@@ -178,28 +178,28 @@ func cspmAgentNodeWantFunc() *test.ComponentTest {
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.CgroupsVolumeName,
-					MountPath: apicommon.CgroupsMountPath,
+					Name:      v2alpha1.CgroupsVolumeName,
+					MountPath: v2alpha1.CgroupsMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.PasswdVolumeName,
-					MountPath: apicommon.PasswdMountPath,
+					Name:      v2alpha1.PasswdVolumeName,
+					MountPath: v2alpha1.PasswdMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.ProcdirVolumeName,
-					MountPath: apicommon.ProcdirMountPath,
+					Name:      v2alpha1.ProcdirVolumeName,
+					MountPath: v2alpha1.ProcdirMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.HostRootVolumeName,
-					MountPath: apicommon.HostRootMountPath,
+					Name:      v2alpha1.HostRootVolumeName,
+					MountPath: v2alpha1.HostRootMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.GroupVolumeName,
-					MountPath: apicommon.GroupMountPath,
+					Name:      v2alpha1.GroupVolumeName,
+					MountPath: v2alpha1.GroupMountPath,
 					ReadOnly:  true,
 				},
 			}
@@ -227,42 +227,42 @@ func cspmAgentNodeWantFunc() *test.ComponentTest {
 					},
 				},
 				{
-					Name: apicommon.CgroupsVolumeName,
+					Name: v2alpha1.CgroupsVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.CgroupsHostPath,
+							Path: v2alpha1.CgroupsHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.PasswdVolumeName,
+					Name: v2alpha1.PasswdVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.PasswdHostPath,
+							Path: v2alpha1.PasswdHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.ProcdirVolumeName,
+					Name: v2alpha1.ProcdirVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.ProcdirHostPath,
+							Path: v2alpha1.ProcdirHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.HostRootVolumeName,
+					Name: v2alpha1.HostRootVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.HostRootHostPath,
+							Path: v2alpha1.HostRootHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.GroupVolumeName,
+					Name: v2alpha1.GroupVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.GroupHostPath,
+							Path: v2alpha1.GroupHostPath,
 						},
 					},
 				},
@@ -275,7 +275,7 @@ func cspmAgentNodeWantFunc() *test.ComponentTest {
 			hash, err := comparison.GenerateMD5ForSpec(customConfig)
 			assert.NoError(t, err)
 			wantAnnotations := map[string]string{
-				fmt.Sprintf(apicommon.MD5ChecksumAnnotationKey, feature.CSPMIDType): hash,
+				fmt.Sprintf(v2alpha1.MD5ChecksumAnnotationKey, feature.CSPMIDType): hash,
 			}
 			annotations := mgr.AnnotationMgr.Annotations
 			assert.True(t, apiutils.IsEqualStruct(annotations, wantAnnotations), "Annotations \ndiff = %s", cmp.Diff(annotations, wantAnnotations))
diff --git a/internal/controller/datadogagent/feature/cws/feature_test.go b/internal/controller/datadogagent/feature/cws/feature_test.go
index d30b1328..d6634117 100644
--- a/internal/controller/datadogagent/feature/cws/feature_test.go
+++ b/internal/controller/datadogagent/feature/cws/feature_test.go
@@ -111,37 +111,37 @@ func cwsAgentNodeWantFunc(withSubFeatures bool) *test.ComponentTest {
 
 			securityWant := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDRuntimeSecurityConfigEnabled,
+					Name:  DDRuntimeSecurityConfigEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDRuntimeSecurityConfigSocket,
+					Name:  DDRuntimeSecurityConfigSocket,
 					Value: "/var/run/sysprobe/runtime-security.sock",
 				},
 				{
-					Name:  apicommon.DDRuntimeSecurityConfigSyscallMonitorEnabled,
+					Name:  DDRuntimeSecurityConfigSyscallMonitorEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDHostRootEnvVar,
-					Value: apicommon.HostRootMountPath,
+					Name:  v2alpha1.DDHostRootEnvVar,
+					Value: v2alpha1.HostRootMountPath,
 				},
 				{
-					Name:  apicommon.DDRuntimeSecurityConfigPoliciesDir,
+					Name:  DDRuntimeSecurityConfigPoliciesDir,
 					Value: securityAgentRuntimePoliciesDirVolumePath,
 				},
 			}
 			sysProbeWant := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDRuntimeSecurityConfigEnabled,
+					Name:  DDRuntimeSecurityConfigEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDRuntimeSecurityConfigSocket,
+					Name:  DDRuntimeSecurityConfigSocket,
 					Value: "/var/run/sysprobe/runtime-security.sock",
 				},
 				{
-					Name:  apicommon.DDRuntimeSecurityConfigSyscallMonitorEnabled,
+					Name:  DDRuntimeSecurityConfigSyscallMonitorEnabled,
 					Value: "true",
 				},
 			}
@@ -149,15 +149,15 @@ func cwsAgentNodeWantFunc(withSubFeatures bool) *test.ComponentTest {
 				sysProbeWant = append(
 					sysProbeWant,
 					&corev1.EnvVar{
-						Name:  apicommon.DDRuntimeSecurityConfigNetworkEnabled,
+						Name:  DDRuntimeSecurityConfigNetworkEnabled,
 						Value: "true",
 					},
 					&corev1.EnvVar{
-						Name:  apicommon.DDRuntimeSecurityConfigActivityDumpEnabled,
+						Name:  DDRuntimeSecurityConfigActivityDumpEnabled,
 						Value: "true",
 					},
 					&corev1.EnvVar{
-						Name:  apicommon.DDRuntimeSecurityConfigRemoteConfigurationEnabled,
+						Name:  DDRuntimeSecurityConfigRemoteConfigurationEnabled,
 						Value: "true",
 					},
 				)
@@ -165,7 +165,7 @@ func cwsAgentNodeWantFunc(withSubFeatures bool) *test.ComponentTest {
 			sysProbeWant = append(
 				sysProbeWant,
 				&corev1.EnvVar{
-					Name:  apicommon.DDRuntimeSecurityConfigPoliciesDir,
+					Name:  DDRuntimeSecurityConfigPoliciesDir,
 					Value: securityAgentRuntimePoliciesDirVolumePath,
 				},
 			)
@@ -178,13 +178,13 @@ func cwsAgentNodeWantFunc(withSubFeatures bool) *test.ComponentTest {
 			// check volume mounts
 			securityWantVolumeMount := []corev1.VolumeMount{
 				{
-					Name:      apicommon.SystemProbeSocketVolumeName,
-					MountPath: apicommon.SystemProbeSocketVolumePath,
+					Name:      v2alpha1.SystemProbeSocketVolumeName,
+					MountPath: v2alpha1.SystemProbeSocketVolumePath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.HostRootVolumeName,
-					MountPath: apicommon.HostRootMountPath,
+					Name:      v2alpha1.HostRootVolumeName,
+					MountPath: v2alpha1.HostRootMountPath,
 					ReadOnly:  true,
 				},
 				{
@@ -195,8 +195,8 @@ func cwsAgentNodeWantFunc(withSubFeatures bool) *test.ComponentTest {
 			}
 			sysprobeWantVolumeMount := []corev1.VolumeMount{
 				{
-					Name:      apicommon.DebugfsVolumeName,
-					MountPath: apicommon.DebugfsPath,
+					Name:      v2alpha1.DebugfsVolumeName,
+					MountPath: v2alpha1.DebugfsPath,
 					ReadOnly:  false,
 				},
 				{
@@ -210,28 +210,28 @@ func cwsAgentNodeWantFunc(withSubFeatures bool) *test.ComponentTest {
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.SystemProbeSocketVolumeName,
-					MountPath: apicommon.SystemProbeSocketVolumePath,
+					Name:      v2alpha1.SystemProbeSocketVolumeName,
+					MountPath: v2alpha1.SystemProbeSocketVolumePath,
 					ReadOnly:  false,
 				},
 				{
-					Name:      apicommon.ProcdirVolumeName,
-					MountPath: apicommon.ProcdirMountPath,
+					Name:      v2alpha1.ProcdirVolumeName,
+					MountPath: v2alpha1.ProcdirMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.PasswdVolumeName,
-					MountPath: apicommon.PasswdMountPath,
+					Name:      v2alpha1.PasswdVolumeName,
+					MountPath: v2alpha1.PasswdMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.GroupVolumeName,
-					MountPath: apicommon.GroupMountPath,
+					Name:      v2alpha1.GroupVolumeName,
+					MountPath: v2alpha1.GroupMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.SystemProbeOSReleaseDirVolumeName,
-					MountPath: apicommon.SystemProbeOSReleaseDirMountPath,
+					Name:      v2alpha1.SystemProbeOSReleaseDirVolumeName,
+					MountPath: v2alpha1.SystemProbeOSReleaseDirMountPath,
 					ReadOnly:  true,
 				},
 				{
@@ -249,10 +249,10 @@ func cwsAgentNodeWantFunc(withSubFeatures bool) *test.ComponentTest {
 			// check volumes
 			wantVolumes := []corev1.Volume{
 				{
-					Name: apicommon.DebugfsVolumeName,
+					Name: v2alpha1.DebugfsVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.DebugfsPath,
+							Path: v2alpha1.DebugfsPath,
 						},
 					},
 				},
@@ -273,48 +273,48 @@ func cwsAgentNodeWantFunc(withSubFeatures bool) *test.ComponentTest {
 					},
 				},
 				{
-					Name: apicommon.SystemProbeSocketVolumeName,
+					Name: v2alpha1.SystemProbeSocketVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						EmptyDir: &corev1.EmptyDirVolumeSource{},
 					},
 				},
 				{
-					Name: apicommon.ProcdirVolumeName,
+					Name: v2alpha1.ProcdirVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.ProcdirHostPath,
+							Path: v2alpha1.ProcdirHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.PasswdVolumeName,
+					Name: v2alpha1.PasswdVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.PasswdHostPath,
+							Path: v2alpha1.PasswdHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.GroupVolumeName,
+					Name: v2alpha1.GroupVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.GroupHostPath,
+							Path: v2alpha1.GroupHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.SystemProbeOSReleaseDirVolumeName,
+					Name: v2alpha1.SystemProbeOSReleaseDirVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.SystemProbeOSReleaseDirVolumePath,
+							Path: v2alpha1.SystemProbeOSReleaseDirVolumePath,
 						},
 					},
 				},
 				{
-					Name: apicommon.HostRootVolumeName,
+					Name: v2alpha1.HostRootVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.HostRootHostPath,
+							Path: v2alpha1.HostRootHostPath,
 						},
 					},
 				},
@@ -355,8 +355,8 @@ func cwsAgentNodeWantFunc(withSubFeatures bool) *test.ComponentTest {
 			hash, err := comparison.GenerateMD5ForSpec(customConfig)
 			assert.NoError(t, err)
 			wantAnnotations := map[string]string{
-				fmt.Sprintf(apicommon.MD5ChecksumAnnotationKey, feature.CWSIDType): hash,
-				apicommon.SystemProbeAppArmorAnnotationKey:                         apicommon.SystemProbeAppArmorAnnotationValue,
+				fmt.Sprintf(v2alpha1.MD5ChecksumAnnotationKey, feature.CWSIDType): hash,
+				v2alpha1.SystemProbeAppArmorAnnotationKey:                         v2alpha1.SystemProbeAppArmorAnnotationValue,
 			}
 			annotations := mgr.AnnotationMgr.Annotations
 			assert.True(t, apiutils.IsEqualStruct(annotations, wantAnnotations), "Annotations \ndiff = %s", cmp.Diff(annotations, wantAnnotations))
diff --git a/internal/controller/datadogagent/feature/dogstatsd/feature_test.go b/internal/controller/datadogagent/feature/dogstatsd/feature_test.go
index 8bbc3d05..4d39aec7 100644
--- a/internal/controller/datadogagent/feature/dogstatsd/feature_test.go
+++ b/internal/controller/datadogagent/feature/dogstatsd/feature_test.go
@@ -63,18 +63,18 @@ func Test_DogstatsdFeature_Configure(t *testing.T) {
 					// custom udp envvar
 					wantCustomUDPEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDDogstatsdPort,
+							Name:  DDDogstatsdPort,
 							Value: "8125",
 						},
 						{
-							Name:  apicommon.DDDogstatsdNonLocalTraffic,
+							Name:  DDDogstatsdNonLocalTraffic,
 							Value: "true",
 						},
 					}
 
 					customPorts := []*corev1.ContainerPort{
 						{
-							Name:          apicommon.DogstatsdHostPortName,
+							Name:          v2alpha1.DogstatsdHostPortName,
 							HostPort:      8125,
 							ContainerPort: 8125,
 							Protocol:      corev1.ProtocolUDP,
@@ -101,18 +101,18 @@ func Test_DogstatsdFeature_Configure(t *testing.T) {
 					// custom udp envvar
 					wantCustomUDPEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDDogstatsdPort,
+							Name:  DDDogstatsdPort,
 							Value: "1234",
 						},
 						{
-							Name:  apicommon.DDDogstatsdNonLocalTraffic,
+							Name:  DDDogstatsdNonLocalTraffic,
 							Value: "true",
 						},
 					}
 
 					customPorts := []*corev1.ContainerPort{
 						{
-							Name:          apicommon.DogstatsdHostPortName,
+							Name:          v2alpha1.DogstatsdHostPortName,
 							HostPort:      1234,
 							ContainerPort: 1234,
 							Protocol:      corev1.ProtocolUDP,
@@ -135,20 +135,20 @@ func Test_DogstatsdFeature_Configure(t *testing.T) {
 					// custom udp envvar
 					wantCustomUDPEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDDogstatsdPort,
+							Name:  DDDogstatsdPort,
 							Value: "8125",
 						},
 						{
-							Name:  apicommon.DDDogstatsdNonLocalTraffic,
+							Name:  DDDogstatsdNonLocalTraffic,
 							Value: "true",
 						},
 					}
 
 					customPorts := []*corev1.ContainerPort{
 						{
-							Name:          apicommon.DogstatsdHostPortName,
+							Name:          v2alpha1.DogstatsdHostPortName,
 							HostPort:      1234,
-							ContainerPort: apicommon.DogstatsdHostPortHostPort,
+							ContainerPort: v2alpha1.DogstatsdHostPortHostPort,
 							Protocol:      corev1.ProtocolUDP,
 						},
 					}
@@ -169,18 +169,18 @@ func Test_DogstatsdFeature_Configure(t *testing.T) {
 					// custom udp envvar
 					wantCustomUDPEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDDogstatsdPort,
+							Name:  DDDogstatsdPort,
 							Value: "8125",
 						},
 						{
-							Name:  apicommon.DDDogstatsdNonLocalTraffic,
+							Name:  DDDogstatsdNonLocalTraffic,
 							Value: "true",
 						},
 					}
 
 					customPorts := []*corev1.ContainerPort{
 						{
-							Name:          apicommon.DogstatsdHostPortName,
+							Name:          v2alpha1.DogstatsdHostPortName,
 							HostPort:      8125,
 							ContainerPort: v2alpha1.DefaultDogstatsdPort,
 							Protocol:      corev1.ProtocolUDP,
@@ -225,14 +225,14 @@ func Test_DogstatsdFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					customVolumeMounts := []*corev1.VolumeMount{
 						{
-							Name:      apicommon.DogstatsdSocketVolumeName,
-							MountPath: apicommon.DogstatsdSocketLocalPath,
+							Name:      v2alpha1.DogstatsdSocketVolumeName,
+							MountPath: v2alpha1.DogstatsdSocketLocalPath,
 							ReadOnly:  false,
 						},
 					}
 					customVolumes := []*corev1.Volume{
 						{
-							Name: apicommon.DogstatsdSocketVolumeName,
+							Name: v2alpha1.DogstatsdSocketVolumeName,
 							VolumeSource: corev1.VolumeSource{
 								HostPath: &corev1.HostPathVolumeSource{
 									Path: customVolumePath,
@@ -269,7 +269,7 @@ func Test_DogstatsdFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					// mapper profiles envvar
 					mapperProfilesEnvVar := corev1.EnvVar{
-						Name:  apicommon.DDDogstatsdMapperProfiles,
+						Name:  DDDogstatsdMapperProfiles,
 						Value: customMapperProfilesJSON,
 					}
 
@@ -286,7 +286,7 @@ func Test_DogstatsdFeature_Configure(t *testing.T) {
 			Agent: test.NewDefaultComponentTest().WithWantFunc(
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					wantTagCardinalityEnvVar := corev1.EnvVar{
-						Name:  apicommon.DDDogstatsdTagCardinality,
+						Name:  DDDogstatsdTagCardinality,
 						Value: "orchestrator",
 					}
 					customEnvVars := append(getWantUDPEnvVars(), getOriginDetectionEnvVar(), getOriginDetectionClientEnvVar(), &wantTagCardinalityEnvVar)
@@ -307,9 +307,9 @@ func getVolType() *corev1.HostPathType {
 func getWantHostPorts() []*corev1.ContainerPort {
 	wantHostPorts := []*corev1.ContainerPort{
 		{
-			Name:          apicommon.DogstatsdHostPortName,
-			HostPort:      apicommon.DogstatsdHostPortHostPort,
-			ContainerPort: apicommon.DogstatsdHostPortHostPort,
+			Name:          v2alpha1.DogstatsdHostPortName,
+			HostPort:      v2alpha1.DogstatsdHostPortHostPort,
+			ContainerPort: v2alpha1.DogstatsdHostPortHostPort,
 			Protocol:      corev1.ProtocolUDP,
 		},
 	}
@@ -319,8 +319,8 @@ func getWantHostPorts() []*corev1.ContainerPort {
 func getWantContainerPorts() []*corev1.ContainerPort {
 	wantContainerPorts := []*corev1.ContainerPort{
 		{
-			Name:          apicommon.DogstatsdHostPortName,
-			ContainerPort: apicommon.DogstatsdHostPortHostPort,
+			Name:          v2alpha1.DogstatsdHostPortName,
+			ContainerPort: v2alpha1.DogstatsdHostPortHostPort,
 			Protocol:      corev1.ProtocolUDP,
 		},
 	}
@@ -329,7 +329,7 @@ func getWantContainerPorts() []*corev1.ContainerPort {
 
 func getOriginDetectionEnvVar() *corev1.EnvVar {
 	originDetectionEnvVar := corev1.EnvVar{
-		Name:  apicommon.DDDogstatsdOriginDetection,
+		Name:  DDDogstatsdOriginDetection,
 		Value: "true",
 	}
 	return &originDetectionEnvVar
@@ -337,7 +337,7 @@ func getOriginDetectionEnvVar() *corev1.EnvVar {
 
 func getOriginDetectionClientEnvVar() *corev1.EnvVar {
 	originDetectionClientEnvVar := corev1.EnvVar{
-		Name:  apicommon.DDDogstatsdOriginDetectionClient,
+		Name:  DDDogstatsdOriginDetectionClient,
 		Value: "true",
 	}
 	return &originDetectionClientEnvVar
@@ -346,8 +346,8 @@ func getOriginDetectionClientEnvVar() *corev1.EnvVar {
 func getCustomEnvVar() []*corev1.EnvVar {
 	customEnvVar := []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDDogstatsdSocket,
-			Value: apicommon.DogstatsdSocketLocalPath + "/" + customSock,
+			Name:  DDDogstatsdSocket,
+			Value: v2alpha1.DogstatsdSocketLocalPath + "/" + customSock,
 		},
 	}
 	return customEnvVar
@@ -356,8 +356,8 @@ func getCustomEnvVar() []*corev1.EnvVar {
 func getWantUDSEnvVars() []*corev1.EnvVar {
 	wantUDSEnvVars := []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDDogstatsdSocket,
-			Value: apicommon.DogstatsdSocketLocalPath + "/" + apicommon.DogstatsdSocketName,
+			Name:  DDDogstatsdSocket,
+			Value: v2alpha1.DogstatsdSocketLocalPath + "/" + v2alpha1.DogstatsdSocketName,
 		},
 	}
 	return wantUDSEnvVars
@@ -366,11 +366,11 @@ func getWantUDSEnvVars() []*corev1.EnvVar {
 func getWantUDPEnvVars() []*corev1.EnvVar {
 	wantUDPEnvVars := []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDDogstatsdPort,
+			Name:  DDDogstatsdPort,
 			Value: strconv.Itoa(v2alpha1.DefaultDogstatsdPort),
 		},
 		{
-			Name:  apicommon.DDDogstatsdNonLocalTraffic,
+			Name:  DDDogstatsdNonLocalTraffic,
 			Value: "true",
 		},
 	}
@@ -381,10 +381,10 @@ func getWantVolumes() []*corev1.Volume {
 	volType := corev1.HostPathDirectoryOrCreate
 	wantVolumes := []*corev1.Volume{
 		{
-			Name: apicommon.DogstatsdSocketVolumeName,
+			Name: v2alpha1.DogstatsdSocketVolumeName,
 			VolumeSource: corev1.VolumeSource{
 				HostPath: &corev1.HostPathVolumeSource{
-					Path: apicommon.DogstatsdAPMSocketHostPath,
+					Path: v2alpha1.DogstatsdAPMSocketHostPath,
 					Type: &volType,
 				},
 			},
@@ -396,8 +396,8 @@ func getWantVolumes() []*corev1.Volume {
 func getWantVolumeMounts() []*corev1.VolumeMount {
 	wantVolumeMounts := []*corev1.VolumeMount{
 		{
-			Name:      apicommon.DogstatsdSocketVolumeName,
-			MountPath: apicommon.DogstatsdSocketLocalPath,
+			Name:      v2alpha1.DogstatsdSocketVolumeName,
+			MountPath: v2alpha1.DogstatsdSocketLocalPath,
 			ReadOnly:  false,
 		},
 	}
diff --git a/internal/controller/datadogagent/feature/ebpfcheck/feature_test.go b/internal/controller/datadogagent/feature/ebpfcheck/feature_test.go
index c91543cf..0efbedd3 100644
--- a/internal/controller/datadogagent/feature/ebpfcheck/feature_test.go
+++ b/internal/controller/datadogagent/feature/ebpfcheck/feature_test.go
@@ -1,3 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
 package ebpfcheck
 
 import (
@@ -46,21 +51,21 @@ func Test_ebpfCheckFeature_Configure(t *testing.T) {
 		// check volume mounts
 		wantCoreAgentVolMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  true,
 			},
 		}
 
 		wantSystemProbeVolMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.DebugfsVolumeName,
-				MountPath: apicommon.DebugfsPath,
+				Name:      v2alpha1.DebugfsVolumeName,
+				MountPath: v2alpha1.DebugfsPath,
 				ReadOnly:  false,
 			},
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  false,
 			},
 		}
@@ -74,15 +79,15 @@ func Test_ebpfCheckFeature_Configure(t *testing.T) {
 		// check volumes
 		wantVolumes := []corev1.Volume{
 			{
-				Name: apicommon.DebugfsVolumeName,
+				Name: v2alpha1.DebugfsVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.DebugfsPath,
+						Path: v2alpha1.DebugfsPath,
 					},
 				},
 			},
 			{
-				Name: apicommon.SystemProbeSocketVolumeName,
+				Name: v2alpha1.SystemProbeSocketVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					EmptyDir: &corev1.EmptyDirVolumeSource{},
 				},
@@ -95,11 +100,11 @@ func Test_ebpfCheckFeature_Configure(t *testing.T) {
 		// check env vars
 		wantEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDEnableEBPFCheckEnvVar,
+				Name:  DDEnableEBPFCheckEnvVar,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeSocket,
+				Name:  v2alpha1.DDSystemProbeSocket,
 				Value: v2alpha1.DefaultSystemProbeSocketPath,
 			},
 		}
diff --git a/internal/controller/datadogagent/feature/enabledefault/feature_test.go b/internal/controller/datadogagent/feature/enabledefault/feature_test.go
index c6f756e9..f660d1cc 100644
--- a/internal/controller/datadogagent/feature/enabledefault/feature_test.go
+++ b/internal/controller/datadogagent/feature/enabledefault/feature_test.go
@@ -52,7 +52,7 @@ func Test_getInstallInfoValue(t *testing.T) {
 
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			t.Setenv(apicommon.InstallInfoToolVersion, tt.toolVersionEnvVarValue)
+			t.Setenv(InstallInfoToolVersion, tt.toolVersionEnvVarValue)
 			installInfo := InstallInfoData{}
 
 			test := getInstallInfoValue()
@@ -88,7 +88,7 @@ func defaultFeatureManageClusterAgentWantFunc(t testing.TB, mgrInterface feature
 	dcaEnvVars := mgr.EnvVarMgr.EnvVarsByC[apicommon.AllContainers]
 
 	want := &corev1.EnvVar{
-		Name:  apicommon.DDClusterAgentServiceAccountName,
+		Name:  DDClusterAgentServiceAccountName,
 		Value: "datadog-cluster-agent",
 	}
 	wantJSON, err := json.Marshal(want)
diff --git a/internal/controller/datadogagent/feature/eventcollection/feature_test.go b/internal/controller/datadogagent/feature/eventcollection/feature_test.go
index 3cc570d7..bbdf67ee 100644
--- a/internal/controller/datadogagent/feature/eventcollection/feature_test.go
+++ b/internal/controller/datadogagent/feature/eventcollection/feature_test.go
@@ -73,19 +73,19 @@ func eventCollectionClusterAgentWantFunc(t testing.TB, mgrInterface feature.PodT
 
 	want := []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDCollectKubernetesEvents,
+			Name:  DDCollectKubernetesEvents,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDLeaderElection,
+			Name:  v2alpha1.DDLeaderElection,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDLeaderLeaseName,
+			Name:  DDLeaderLeaseName,
 			Value: "ddaDCA-leader-election",
 		},
 		{
-			Name:  apicommon.DDClusterAgentTokenName,
+			Name:  v2alpha1.DDClusterAgentTokenName,
 			Value: "ddaDCA-token",
 		},
 	}
diff --git a/internal/controller/datadogagent/feature/externalmetrics/feature_test.go b/internal/controller/datadogagent/feature/externalmetrics/feature_test.go
index 97ed4c4a..fe011c0b 100644
--- a/internal/controller/datadogagent/feature/externalmetrics/feature_test.go
+++ b/internal/controller/datadogagent/feature/externalmetrics/feature_test.go
@@ -130,26 +130,26 @@ func testDCAResources(useDDM, wpaController, keySecrets bool) *test.ComponentTes
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[apicommon.ClusterAgentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDExternalMetricsProviderEnabled,
+					Name:  DDExternalMetricsProviderEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDExternalMetricsProviderPort,
+					Name:  DDExternalMetricsProviderPort,
 					Value: "8443",
 				},
 				{
-					Name:  apicommon.DDExternalMetricsProviderUseDatadogMetric,
+					Name:  DDExternalMetricsProviderUseDatadogMetric,
 					Value: apiutils.BoolToString(&useDDM),
 				},
 				{
-					Name:  apicommon.DDExternalMetricsProviderWPAController,
+					Name:  DDExternalMetricsProviderWPAController,
 					Value: apiutils.BoolToString(&wpaController),
 				},
 			}
 			if keySecrets {
 				secretEnvs := []*corev1.EnvVar{
 					{
-						Name: apicommon.DDExternalMetricsProviderAPIKey,
+						Name: DDExternalMetricsProviderAPIKey,
 						ValueFrom: &corev1.EnvVarSource{
 							SecretKeyRef: &corev1.SecretKeySelector{
 								LocalObjectReference: corev1.LocalObjectReference{
@@ -160,7 +160,7 @@ func testDCAResources(useDDM, wpaController, keySecrets bool) *test.ComponentTes
 						},
 					},
 					{
-						Name: apicommon.DDExternalMetricsProviderAppKey,
+						Name: DDExternalMetricsProviderAppKey,
 						ValueFrom: &corev1.EnvVarSource{
 							SecretKeyRef: &corev1.SecretKeySelector{
 								LocalObjectReference: corev1.LocalObjectReference{
diff --git a/internal/controller/datadogagent/feature/helmcheck/feature_test.go b/internal/controller/datadogagent/feature/helmcheck/feature_test.go
index 0e9e911f..a0f39abb 100644
--- a/internal/controller/datadogagent/feature/helmcheck/feature_test.go
+++ b/internal/controller/datadogagent/feature/helmcheck/feature_test.go
@@ -195,7 +195,7 @@ instances:
 			assert.NoError(t, err)
 
 			wantAnnotations := map[string]string{
-				fmt.Sprintf(apicommon.MD5ChecksumAnnotationKey, feature.HelmCheckIDType): hash,
+				fmt.Sprintf(v2alpha1.MD5ChecksumAnnotationKey, feature.HelmCheckIDType): hash,
 			}
 
 			annotations := mgr.AnnotationMgr.Annotations
diff --git a/internal/controller/datadogagent/feature/kubernetesstatecore/feature_test.go b/internal/controller/datadogagent/feature/kubernetesstatecore/feature_test.go
index 207ad097..83f9e013 100644
--- a/internal/controller/datadogagent/feature/kubernetesstatecore/feature_test.go
+++ b/internal/controller/datadogagent/feature/kubernetesstatecore/feature_test.go
@@ -102,11 +102,11 @@ func ksmClusterAgentWantFunc(hasCustomConfig bool) *test.ComponentTest {
 
 			want := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDKubeStateMetricsCoreEnabled,
+					Name:  DDKubeStateMetricsCoreEnabled,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDKubeStateMetricsCoreConfigMap,
+					Name:  DDKubeStateMetricsCoreConfigMap,
 					Value: "-kube-state-metrics-core-config",
 				},
 			}
@@ -119,7 +119,7 @@ func ksmClusterAgentWantFunc(hasCustomConfig bool) *test.ComponentTest {
 				hash, err := comparison.GenerateMD5ForSpec(&customConfig)
 				assert.NoError(t, err)
 				wantAnnotations := map[string]string{
-					fmt.Sprintf(apicommon.MD5ChecksumAnnotationKey, feature.KubernetesStateCoreIDType): hash,
+					fmt.Sprintf(v2alpha1.MD5ChecksumAnnotationKey, feature.KubernetesStateCoreIDType): hash,
 				}
 				annotations := mgr.AnnotationMgr.Annotations
 				assert.True(t, apiutils.IsEqualStruct(annotations, wantAnnotations), "Annotations \ndiff = %s", cmp.Diff(annotations, wantAnnotations))
@@ -142,7 +142,7 @@ func ksmAgentWantFunc(t testing.TB, mgrInterface feature.PodTemplateManagers, ag
 
 	want := []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDIgnoreAutoConf,
+			Name:  DDIgnoreAutoConf,
 			Value: "kubernetes_state",
 		},
 	}
diff --git a/internal/controller/datadogagent/feature/livecontainer/feature_test.go b/internal/controller/datadogagent/feature/livecontainer/feature_test.go
index c1777748..6eb8d89b 100644
--- a/internal/controller/datadogagent/feature/livecontainer/feature_test.go
+++ b/internal/controller/datadogagent/feature/livecontainer/feature_test.go
@@ -115,11 +115,11 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, runInCor
 			agentEnvs := mgr.EnvVarMgr.EnvVarsByC[agentContainerName]
 			expectedAgentEnvs := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDProcessConfigRunInCoreAgent,
+					Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 					Value: utils.BoolToString(&runInCoreAgent),
 				},
 				{
-					Name:  apicommon.DDContainerCollectionEnabled,
+					Name:  v2alpha1.DDContainerCollectionEnabled,
 					Value: "true",
 				},
 			}
@@ -133,13 +133,13 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, runInCor
 			agentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[agentContainerName]
 			expectedVolumeMounts := []corev1.VolumeMount{
 				{
-					Name:      apicommon.CgroupsVolumeName,
-					MountPath: apicommon.CgroupsMountPath,
+					Name:      v2alpha1.CgroupsVolumeName,
+					MountPath: v2alpha1.CgroupsMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.ProcdirVolumeName,
-					MountPath: apicommon.ProcdirMountPath,
+					Name:      v2alpha1.ProcdirVolumeName,
+					MountPath: v2alpha1.ProcdirMountPath,
 					ReadOnly:  true,
 				},
 			}
@@ -152,18 +152,18 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, runInCor
 			agentVolumes := mgr.VolumeMgr.Volumes
 			expectedVolumes := []corev1.Volume{
 				{
-					Name: apicommon.CgroupsVolumeName,
+					Name: v2alpha1.CgroupsVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.CgroupsHostPath,
+							Path: v2alpha1.CgroupsHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.ProcdirVolumeName,
+					Name: v2alpha1.ProcdirVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.ProcdirHostPath,
+							Path: v2alpha1.ProcdirHostPath,
 						},
 					},
 				},
diff --git a/internal/controller/datadogagent/feature/liveprocess/feature_test.go b/internal/controller/datadogagent/feature/liveprocess/feature_test.go
index c38a33d0..8b7efe81 100644
--- a/internal/controller/datadogagent/feature/liveprocess/feature_test.go
+++ b/internal/controller/datadogagent/feature/liveprocess/feature_test.go
@@ -131,18 +131,18 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, runInCor
 			// check volume mounts
 			wantVolumeMounts := []corev1.VolumeMount{
 				{
-					Name:      apicommon.PasswdVolumeName,
-					MountPath: apicommon.PasswdMountPath,
+					Name:      v2alpha1.PasswdVolumeName,
+					MountPath: v2alpha1.PasswdMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.CgroupsVolumeName,
-					MountPath: apicommon.CgroupsMountPath,
+					Name:      v2alpha1.CgroupsVolumeName,
+					MountPath: v2alpha1.CgroupsMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.ProcdirVolumeName,
-					MountPath: apicommon.ProcdirMountPath,
+					Name:      v2alpha1.ProcdirVolumeName,
+					MountPath: v2alpha1.ProcdirMountPath,
 					ReadOnly:  true,
 				},
 			}
@@ -153,26 +153,26 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, runInCor
 			// check volumes
 			wantVolumes := []corev1.Volume{
 				{
-					Name: apicommon.PasswdVolumeName,
+					Name: v2alpha1.PasswdVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.PasswdHostPath,
+							Path: v2alpha1.PasswdHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.CgroupsVolumeName,
+					Name: v2alpha1.CgroupsVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.CgroupsHostPath,
+							Path: v2alpha1.CgroupsHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.ProcdirVolumeName,
+					Name: v2alpha1.ProcdirVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.ProcdirHostPath,
+							Path: v2alpha1.ProcdirHostPath,
 						},
 					},
 				},
@@ -184,11 +184,11 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, runInCor
 			// check env vars
 			wantEnvVars := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDProcessConfigRunInCoreAgent,
+					Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 					Value: utils.BoolToString(&runInCoreAgent),
 				},
 				{
-					Name:  apicommon.DDProcessCollectionEnabled,
+					Name:  v2alpha1.DDProcessCollectionEnabled,
 					Value: "true",
 				},
 			}
@@ -196,11 +196,11 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, runInCor
 			if ScrubStripArgs {
 				ScrubStripArgsEnvVar := []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDProcessConfigScrubArgs,
+						Name:  DDProcessConfigScrubArgs,
 						Value: "true",
 					},
 					{
-						Name:  apicommon.DDProcessConfigStripArgs,
+						Name:  DDProcessConfigStripArgs,
 						Value: "true",
 					},
 				}
diff --git a/internal/controller/datadogagent/feature/logcollection/feature_test.go b/internal/controller/datadogagent/feature/logcollection/feature_test.go
index 1f5c87d9..ed2dd126 100644
--- a/internal/controller/datadogagent/feature/logcollection/feature_test.go
+++ b/internal/controller/datadogagent/feature/logcollection/feature_test.go
@@ -9,6 +9,7 @@ import (
 	"testing"
 
 	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
+	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	v2alpha1test "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1/test"
 	apiutils "github.com/DataDog/datadog-operator/api/utils"
 	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature"
@@ -82,7 +83,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					wantEnvVars := createEnvVars("true", "false", "true")
 					wantEnvVars = append(wantEnvVars, &corev1.EnvVar{
-						Name:  apicommon.DDLogsConfigOpenFilesLimit,
+						Name:  DDLogsConfigOpenFilesLimit,
 						Value: "250",
 					})
 					assertWants(t, mgrInterface, getWantVolumeMounts(), getWantVolumes(), wantEnvVars)
@@ -171,7 +172,7 @@ func getWantVolumes() []*corev1.Volume {
 			Name: pointerVolumeName,
 			VolumeSource: corev1.VolumeSource{
 				HostPath: &corev1.HostPathVolumeSource{
-					Path: apicommon.DefaultLogTempStoragePath,
+					Path: v2alpha1.DefaultLogTempStoragePath,
 				},
 			},
 		},
@@ -232,15 +233,15 @@ func getWantVolumeMounts() []*corev1.VolumeMount {
 func createEnvVars(logsEnabled, collectAllEnabled, collectUsingFilesEnabled string) []*corev1.EnvVar {
 	return []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDLogsEnabled,
+			Name:  v2alpha1.DDLogsEnabled,
 			Value: logsEnabled,
 		},
 		{
-			Name:  apicommon.DDLogsConfigContainerCollectAll,
+			Name:  DDLogsConfigContainerCollectAll,
 			Value: collectAllEnabled,
 		},
 		{
-			Name:  apicommon.DDLogsContainerCollectUsingFiles,
+			Name:  DDLogsContainerCollectUsingFiles,
 			Value: collectUsingFilesEnabled,
 		},
 	}
diff --git a/internal/controller/datadogagent/feature/npm/feature_test.go b/internal/controller/datadogagent/feature/npm/feature_test.go
index d382ef55..afa5ef16 100644
--- a/internal/controller/datadogagent/feature/npm/feature_test.go
+++ b/internal/controller/datadogagent/feature/npm/feature_test.go
@@ -43,23 +43,23 @@ func Test_npmFeature_Configure(t *testing.T) {
 		// check env vars
 		sysProbeWantEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDSystemProbeNPMEnabled,
+				Name:  DDSystemProbeNPMEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeEnabled,
+				Name:  v2alpha1.DDSystemProbeEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeSocket,
+				Name:  v2alpha1.DDSystemProbeSocket,
 				Value: v2alpha1.DefaultSystemProbeSocketPath,
 			},
 			{
-				Name:  apicommon.DDSystemProbeCollectDNSStatsEnabled,
+				Name:  DDSystemProbeCollectDNSStatsEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeConntrackEnabled,
+				Name:  DDSystemProbeConntrackEnabled,
 				Value: "false",
 			},
 		}
@@ -72,7 +72,7 @@ func Test_npmFeature_Configure(t *testing.T) {
 
 		// check annotations
 		wantAnnotations := make(map[string]string)
-		wantAnnotations[apicommon.SystemProbeAppArmorAnnotationKey] = apicommon.SystemProbeAppArmorAnnotationValue
+		wantAnnotations[v2alpha1.SystemProbeAppArmorAnnotationKey] = v2alpha1.SystemProbeAppArmorAnnotationValue
 		annotations := mgr.AnnotationMgr.Annotations
 		assert.True(t, apiutils.IsEqualStruct(annotations, wantAnnotations), "Annotations \ndiff = %s", cmp.Diff(annotations, wantAnnotations))
 
@@ -83,31 +83,31 @@ func Test_npmFeature_Configure(t *testing.T) {
 		// check volume mounts
 		wantVolumeMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.ProcdirVolumeName,
-				MountPath: apicommon.ProcdirMountPath,
+				Name:      v2alpha1.ProcdirVolumeName,
+				MountPath: v2alpha1.ProcdirMountPath,
 				ReadOnly:  true,
 			},
 			{
-				Name:      apicommon.CgroupsVolumeName,
-				MountPath: apicommon.CgroupsMountPath,
+				Name:      v2alpha1.CgroupsVolumeName,
+				MountPath: v2alpha1.CgroupsMountPath,
 				ReadOnly:  true,
 			},
 			{
-				Name:      apicommon.DebugfsVolumeName,
-				MountPath: apicommon.DebugfsPath,
+				Name:      v2alpha1.DebugfsVolumeName,
+				MountPath: v2alpha1.DebugfsPath,
 				ReadOnly:  false,
 			},
 		}
 
 		wantProcessAgentVolMounts := append(wantVolumeMounts, corev1.VolumeMount{
-			Name:      apicommon.SystemProbeSocketVolumeName,
-			MountPath: apicommon.SystemProbeSocketVolumePath,
+			Name:      v2alpha1.SystemProbeSocketVolumeName,
+			MountPath: v2alpha1.SystemProbeSocketVolumePath,
 			ReadOnly:  true,
 		})
 
 		wantSystemProbeAgentVolMounts := append(wantVolumeMounts, corev1.VolumeMount{
-			Name:      apicommon.SystemProbeSocketVolumeName,
-			MountPath: apicommon.SystemProbeSocketVolumePath,
+			Name:      v2alpha1.SystemProbeSocketVolumeName,
+			MountPath: v2alpha1.SystemProbeSocketVolumePath,
 			ReadOnly:  false,
 		})
 
@@ -119,8 +119,8 @@ func Test_npmFeature_Configure(t *testing.T) {
 
 		coreWantVolumeMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  true,
 			},
 		}
@@ -130,31 +130,31 @@ func Test_npmFeature_Configure(t *testing.T) {
 		// check volumes
 		wantVolumes := []corev1.Volume{
 			{
-				Name: apicommon.ProcdirVolumeName,
+				Name: v2alpha1.ProcdirVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.ProcdirHostPath,
+						Path: v2alpha1.ProcdirHostPath,
 					},
 				},
 			},
 			{
-				Name: apicommon.CgroupsVolumeName,
+				Name: v2alpha1.CgroupsVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.CgroupsHostPath,
+						Path: v2alpha1.CgroupsHostPath,
 					},
 				},
 			},
 			{
-				Name: apicommon.DebugfsVolumeName,
+				Name: v2alpha1.DebugfsVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.DebugfsPath,
+						Path: v2alpha1.DebugfsPath,
 					},
 				},
 			},
 			{
-				Name: apicommon.SystemProbeSocketVolumeName,
+				Name: v2alpha1.SystemProbeSocketVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					EmptyDir: &corev1.EmptyDirVolumeSource{},
 				},
@@ -167,25 +167,25 @@ func Test_npmFeature_Configure(t *testing.T) {
 		// check env vars
 		sysProbeWantEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDSystemProbeNPMEnabled,
+				Name:  DDSystemProbeNPMEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeEnabled,
+				Name:  v2alpha1.DDSystemProbeEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeSocket,
+				Name:  v2alpha1.DDSystemProbeSocket,
 				Value: v2alpha1.DefaultSystemProbeSocketPath,
 			},
 		}
 		npmFeatureEnvVar := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDSystemProbeConntrackEnabled,
+				Name:  DDSystemProbeConntrackEnabled,
 				Value: "false",
 			},
 			{
-				Name:  apicommon.DDSystemProbeCollectDNSStatsEnabled,
+				Name:  DDSystemProbeCollectDNSStatsEnabled,
 				Value: "false",
 			},
 		}
@@ -194,7 +194,7 @@ func Test_npmFeature_Configure(t *testing.T) {
 		assert.True(t, apiutils.IsEqualStruct(sysProbeWantEnvVarsNPM, sysProbeWantEnvVarsNPM), "System Probe envvars \ndiff = %s", cmp.Diff(systemProbeEnvVars, sysProbeWantEnvVarsNPM))
 
 		processWantEnvVars := append(sysProbeWantEnvVars, &corev1.EnvVar{
-			Name:  apicommon.DDSystemProbeExternal,
+			Name:  v2alpha1.DDSystemProbeExternal,
 			Value: "true",
 		})
 
diff --git a/internal/controller/datadogagent/feature/oomkill/feature_test.go b/internal/controller/datadogagent/feature/oomkill/feature_test.go
index efa66105..1bf6c9c2 100644
--- a/internal/controller/datadogagent/feature/oomkill/feature_test.go
+++ b/internal/controller/datadogagent/feature/oomkill/feature_test.go
@@ -51,31 +51,31 @@ func Test_oomKillFeature_Configure(t *testing.T) {
 		// check volume mounts
 		wantCoreAgentVolMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  true,
 			},
 		}
 
 		wantSystemProbeVolMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.ModulesVolumeName,
-				MountPath: apicommon.ModulesVolumePath,
+				Name:      v2alpha1.ModulesVolumeName,
+				MountPath: v2alpha1.ModulesVolumePath,
 				ReadOnly:  true,
 			},
 			{
-				Name:      apicommon.SrcVolumeName,
-				MountPath: apicommon.SrcVolumePath,
+				Name:      v2alpha1.SrcVolumeName,
+				MountPath: v2alpha1.SrcVolumePath,
 				ReadOnly:  true,
 			},
 			{
-				Name:      apicommon.DebugfsVolumeName,
-				MountPath: apicommon.DebugfsPath,
+				Name:      v2alpha1.DebugfsVolumeName,
+				MountPath: v2alpha1.DebugfsPath,
 				ReadOnly:  false,
 			},
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  false,
 			},
 		}
@@ -89,31 +89,31 @@ func Test_oomKillFeature_Configure(t *testing.T) {
 		// check volumes
 		wantVolumes := []corev1.Volume{
 			{
-				Name: apicommon.ModulesVolumeName,
+				Name: v2alpha1.ModulesVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.ModulesVolumePath,
+						Path: v2alpha1.ModulesVolumePath,
 					},
 				},
 			},
 			{
-				Name: apicommon.SrcVolumeName,
+				Name: v2alpha1.SrcVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.SrcVolumePath,
+						Path: v2alpha1.SrcVolumePath,
 					},
 				},
 			},
 			{
-				Name: apicommon.DebugfsVolumeName,
+				Name: v2alpha1.DebugfsVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.DebugfsPath,
+						Path: v2alpha1.DebugfsPath,
 					},
 				},
 			},
 			{
-				Name: apicommon.SystemProbeSocketVolumeName,
+				Name: v2alpha1.SystemProbeSocketVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					EmptyDir: &corev1.EmptyDirVolumeSource{},
 				},
@@ -126,15 +126,15 @@ func Test_oomKillFeature_Configure(t *testing.T) {
 		// check env vars
 		wantEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDEnableOOMKillEnvVar,
+				Name:  DDEnableOOMKillEnvVar,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeEnabled,
+				Name:  v2alpha1.DDSystemProbeEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeSocket,
+				Name:  v2alpha1.DDSystemProbeSocket,
 				Value: v2alpha1.DefaultSystemProbeSocketPath,
 			},
 		}
diff --git a/internal/controller/datadogagent/feature/orchestratorexplorer/feature_test.go b/internal/controller/datadogagent/feature/orchestratorexplorer/feature_test.go
index d86f4a1c..f580951a 100644
--- a/internal/controller/datadogagent/feature/orchestratorexplorer/feature_test.go
+++ b/internal/controller/datadogagent/feature/orchestratorexplorer/feature_test.go
@@ -33,19 +33,19 @@ instances:
 
 var expectedOrchestratorEnvsV2 = []*corev1.EnvVar{
 	{
-		Name:  apicommon.DDOrchestratorExplorerEnabled,
+		Name:  DDOrchestratorExplorerEnabled,
 		Value: "true",
 	},
 	{
-		Name:  apicommon.DDOrchestratorExplorerContainerScrubbingEnabled,
+		Name:  DDOrchestratorExplorerContainerScrubbingEnabled,
 		Value: "true",
 	},
 	{
-		Name:  apicommon.DDOrchestratorExplorerExtraTags,
+		Name:  DDOrchestratorExplorerExtraTags,
 		Value: `["a:z","b:y","c:x"]`,
 	},
 	{
-		Name:  apicommon.DDOrchestratorExplorerDDUrl,
+		Name:  DDOrchestratorExplorerDDUrl,
 		Value: "https://foo.bar",
 	},
 }
@@ -155,7 +155,7 @@ func orchestratorExplorerClusterAgentWantFuncV2() *test.ComponentTest {
 			hash, err := comparison.GenerateMD5ForSpec(&orchExp)
 			assert.NoError(t, err)
 			wantAnnotations := map[string]string{
-				fmt.Sprintf(apicommon.MD5ChecksumAnnotationKey, feature.OrchestratorExplorerIDType): hash,
+				fmt.Sprintf(v2alpha1.MD5ChecksumAnnotationKey, feature.OrchestratorExplorerIDType): hash,
 			}
 			annotations := mgr.AnnotationMgr.Annotations
 			assert.True(t, apiutils.IsEqualStruct(annotations, wantAnnotations), "Annotations \ndiff = %s", cmp.Diff(annotations, wantAnnotations))
diff --git a/internal/controller/datadogagent/feature/otelcollector/configmap_test.go b/internal/controller/datadogagent/feature/otelcollector/configmap_test.go
new file mode 100644
index 00000000..3115aadc
--- /dev/null
+++ b/internal/controller/datadogagent/feature/otelcollector/configmap_test.go
@@ -0,0 +1,43 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+package otelcollector
+
+import (
+	"testing"
+
+	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/otelcollector/defaultconfig"
+	"github.com/stretchr/testify/assert"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+func Test_buildOtelCollectorConfigMap(t *testing.T) {
+	// check config map
+	configMapWant := &corev1.ConfigMap{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      "-otel-agent-config",
+		},
+		Data: map[string]string{
+			"otel-config.yaml": defaultconfig.DefaultOtelCollectorConfig,
+		},
+	}
+
+	otelCollectorFeature, ok := buildOtelCollectorFeature(&feature.Options{}).(*otelCollectorFeature)
+	assert.True(t, ok)
+
+	otelCollectorFeature.owner = &metav1.ObjectMeta{
+		Name:      "-otel-agent-config",
+	}
+	otelCollectorFeature.configMapName = "-otel-agent-config"
+	otelCollectorFeature.customConfig = &v2alpha1.CustomConfig{}
+	otelCollectorFeature.customConfig.ConfigData = &defaultconfig.DefaultOtelCollectorConfig
+
+	configMap, err := otelCollectorFeature.buildOTelAgentCoreConfigMap()
+	assert.NoError(t, err)
+	assert.Equal(t, configMapWant, configMap)
+}
diff --git a/internal/controller/datadogagent/feature/otelcollector/feature_test.go b/internal/controller/datadogagent/feature/otelcollector/feature_test.go
new file mode 100644
index 00000000..93843b2e
--- /dev/null
+++ b/internal/controller/datadogagent/feature/otelcollector/feature_test.go
@@ -0,0 +1,322 @@
+package otelcollector
+
+import (
+	"strings"
+	"testing"
+
+	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
+	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
+	v2alpha1test "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1/test"
+	apiutils "github.com/DataDog/datadog-operator/api/utils"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/fake"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/otelcollector/defaultconfig"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/test"
+	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/store"
+	"github.com/DataDog/datadog-operator/pkg/kubernetes"
+
+	"github.com/google/go-cmp/cmp"
+	"github.com/stretchr/testify/assert"
+	corev1 "k8s.io/api/core/v1"
+)
+
+type expectedPorts struct {
+	httpPort int32
+	grpcPort int32
+}
+
+type expectedEnvVars struct {
+	enabled           expectedEnvVar
+	extension_timeout expectedEnvVar
+	extension_url     expectedEnvVar
+}
+
+type expectedEnvVar struct {
+	present bool
+	value   string
+}
+
+var (
+	defaultExpectedPorts = expectedPorts{
+		httpPort: 4318,
+		grpcPort: 4317,
+	}
+	defaultLocalObjectReferenceName = "-otel-agent-config"
+	defaultExpectedEnvVars          = expectedEnvVars{
+		enabled: expectedEnvVar{
+			present: true,
+			value:   "true",
+		},
+		extension_timeout: expectedEnvVar{},
+		extension_url:     expectedEnvVar{},
+	}
+)
+
+func Test_otelCollectorFeature_Configure(t *testing.T) {
+	tests := test.FeatureTestSuite{
+		// disabled
+		{
+			Name: "otel agent disabled without config",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(false).
+				Build(),
+			WantConfigure: false,
+		},
+		{
+			Name: "otel agent disabled with config",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(false).
+				WithOTelCollectorConfig().
+				Build(),
+			WantConfigure: false,
+		},
+		// enabled
+		{
+			Name: "otel agent enabled with config",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(true).
+				WithOTelCollectorConfig().
+				Build(),
+			WantConfigure:        true,
+			WantDependenciesFunc: testExpectedDepsCreatedCM,
+			Agent:                testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, defaultExpectedEnvVars),
+		},
+		{
+			Name: "otel agent enabled with configMap",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(true).
+				WithOTelCollectorConfigMap().
+				Build(),
+			WantConfigure:        true,
+			WantDependenciesFunc: testExpectedDepsCreatedCM,
+			Agent:                testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, "user-provided-config-map", defaultExpectedEnvVars),
+		},
+		{
+			Name: "otel agent enabled without config",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(true).
+				Build(),
+			WantConfigure:        true,
+			WantDependenciesFunc: testExpectedDepsCreatedCM,
+			Agent:                testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, defaultExpectedEnvVars),
+		},
+		{
+			Name: "otel agent enabled without config non default ports",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(true).
+				WithOTelCollectorPorts(4444, 5555).
+				Build(),
+			WantConfigure:        true,
+			WantDependenciesFunc: testExpectedDepsCreatedCM,
+			Agent: testExpectedAgent(apicommon.OtelAgent, expectedPorts{
+				grpcPort: 4444,
+				httpPort: 5555,
+			},
+				defaultLocalObjectReferenceName,
+				defaultExpectedEnvVars,
+			),
+		},
+		// coreconfig
+		{
+			Name: "otel agent coreconfig enabled",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(true).
+				WithOTelCollectorCoreConfigEnabled(true).
+				Build(),
+			WantConfigure:        true,
+			WantDependenciesFunc: testExpectedDepsCreatedCM,
+			Agent:                testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, defaultExpectedEnvVars),
+		},
+		{
+			Name: "otel agent coreconfig disabled",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(true).
+				WithOTelCollectorCoreConfigEnabled(false).
+				Build(),
+			WantConfigure:        true,
+			WantDependenciesFunc: testExpectedDepsCreatedCM,
+			Agent:                testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, expectedEnvVars{}),
+		},
+		{
+			Name: "otel agent coreconfig extensionTimeout",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(true).
+				WithOTelCollectorCoreConfigEnabled(false).
+				WithOTelCollectorCoreConfigExtensionTimeout(13).
+				Build(),
+			WantConfigure:        true,
+			WantDependenciesFunc: testExpectedDepsCreatedCM,
+			Agent: testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, expectedEnvVars{
+				extension_timeout: expectedEnvVar{
+					present: true,
+					value:   "13",
+				},
+			}),
+		},
+		{
+			Name: "otel agent coreconfig extensionURL",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(true).
+				WithOTelCollectorCoreConfigEnabled(false).
+				WithOTelCollectorCoreConfigExtensionURL("https://localhost:1234").
+				Build(),
+			WantConfigure:        true,
+			WantDependenciesFunc: testExpectedDepsCreatedCM,
+			Agent: testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, expectedEnvVars{
+				extension_url: expectedEnvVar{
+					present: true,
+					value:   "https://localhost:1234",
+				},
+			}),
+		},
+		{
+			Name: "otel agent coreconfig all env vars",
+			DDA: v2alpha1test.NewDatadogAgentBuilder().
+				WithOTelCollectorEnabled(true).
+				WithOTelCollectorCoreConfigEnabled(true).
+				WithOTelCollectorCoreConfigExtensionTimeout(13).
+				WithOTelCollectorCoreConfigExtensionURL("https://localhost:1234").
+				Build(),
+			WantConfigure:        true,
+			WantDependenciesFunc: testExpectedDepsCreatedCM,
+			Agent: testExpectedAgent(apicommon.OtelAgent, defaultExpectedPorts, defaultLocalObjectReferenceName, expectedEnvVars{
+				extension_url: expectedEnvVar{
+					present: true,
+					value:   "https://localhost:1234",
+				},
+				extension_timeout: expectedEnvVar{
+					present: true,
+					value:   "13",
+				},
+				enabled: expectedEnvVar{
+					present: true,
+					value:   "true",
+				},
+			}),
+		},
+	}
+	tests.Run(t, buildOtelCollectorFeature)
+}
+
+func testExpectedAgent(agentContainerName apicommon.AgentContainerName, expectedPorts expectedPorts, localObjectReferenceName string, expectedEnvVars expectedEnvVars) *test.ComponentTest {
+	return test.NewDefaultComponentTest().WithWantFunc(
+		func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
+			mgr := mgrInterface.(*fake.PodTemplateManagers)
+			// check volume mounts
+			wantVolumeMounts := []corev1.VolumeMount{
+				{
+					Name:      otelAgentVolumeName,
+					MountPath: v2alpha1.ConfigVolumePath + "/" + otelConfigFileName,
+					SubPath:   otelConfigFileName,
+					ReadOnly:  true,
+				},
+			}
+
+			agentMounts := mgr.VolumeMountMgr.VolumeMountsByC[agentContainerName]
+			assert.True(t, apiutils.IsEqualStruct(agentMounts, wantVolumeMounts), "%s volume mounts \ndiff = %s", agentContainerName, cmp.Diff(agentMounts, wantVolumeMounts))
+
+			// check volumes "otel-agent-config"
+			wantVolumes := []corev1.Volume{
+				{
+					Name: otelAgentVolumeName,
+					VolumeSource: corev1.VolumeSource{
+						ConfigMap: &corev1.ConfigMapVolumeSource{
+							LocalObjectReference: corev1.LocalObjectReference{
+								Name: localObjectReferenceName,
+							},
+						},
+					},
+				},
+			}
+
+			volumes := mgr.VolumeMgr.Volumes
+			assert.True(t, apiutils.IsEqualStruct(volumes, wantVolumes), "Volumes \ndiff = %s", cmp.Diff(volumes, wantVolumes))
+
+			// check ports
+			wantPorts := []*corev1.ContainerPort{
+				{
+					Name:          "otel-http",
+					ContainerPort: expectedPorts.httpPort,
+					HostPort:      expectedPorts.httpPort,
+					Protocol:      corev1.ProtocolTCP,
+				},
+				{
+					Name:          "otel-grpc",
+					ContainerPort: expectedPorts.grpcPort,
+					HostPort:      expectedPorts.grpcPort,
+					Protocol:      corev1.ProtocolTCP,
+				},
+			}
+
+			ports := mgr.PortMgr.PortsByC[agentContainerName]
+			assert.Equal(t, wantPorts, ports)
+
+			// check env vars
+			wantEnvVars := []*corev1.EnvVar{}
+
+			if expectedEnvVars.enabled.present {
+				wantEnvVars = append(wantEnvVars, &corev1.EnvVar{
+					Name:  v2alpha1.DDOtelCollectorCoreConfigEnabled,
+					Value: expectedEnvVars.enabled.value,
+				})
+			}
+
+			if expectedEnvVars.extension_timeout.present {
+				wantEnvVars = append(wantEnvVars, &corev1.EnvVar{
+					Name:  v2alpha1.DDOtelCollectorCoreConfigExtensionTimeout,
+					Value: expectedEnvVars.extension_timeout.value,
+				})
+			}
+
+			if expectedEnvVars.extension_url.present {
+				wantEnvVars = append(wantEnvVars, &corev1.EnvVar{
+					Name:  v2alpha1.DDOtelCollectorCoreConfigExtensionURL,
+					Value: expectedEnvVars.extension_url.value,
+				})
+			}
+
+			if len(wantEnvVars) == 0 {
+				wantEnvVars = nil
+			}
+
+			agentEnvVars := mgr.EnvVarMgr.EnvVarsByC[apicommon.CoreAgentContainerName]
+			assert.True(t, apiutils.IsEqualStruct(agentEnvVars, wantEnvVars), "Agent envvars \ndiff = %s", cmp.Diff(agentEnvVars, wantEnvVars))
+
+		},
+	)
+}
+
+func testExpectedDepsCreatedCM(t testing.TB, store store.StoreClient) {
+	// hacky to need to hardcode test name but unaware of a better approach that doesn't require
+	// modifying WantDependenciesFunc definition.
+	if t.Name() == "Test_otelCollectorFeature_Configure/otel_agent_enabled_with_configMap" {
+		// configMap is provided by user, no need to create it.
+		_, found := store.Get(kubernetes.ConfigMapKind, "", "-otel-agent-config")
+		assert.False(t, found)
+		return
+	}
+	configMapObject, found := store.Get(kubernetes.ConfigMapKind, "", "-otel-agent-config")
+	assert.True(t, found)
+
+	configMap := configMapObject.(*corev1.ConfigMap)
+	expectedCM := map[string]string{
+		"otel-config.yaml": defaultconfig.DefaultOtelCollectorConfig}
+
+	// validate that default ports were overriden by user provided ports in default config. hacky to need to
+	// hardcode test name but unaware of a better approach that doesn't require modifying WantDependenciesFunc definition.
+	if t.Name() == "Test_otelCollectorFeature_Configure/otel_agent_enabled_without_config_non_default_ports" {
+		expectedCM["otel-config.yaml"] = strings.Replace(expectedCM["otel-config.yaml"], "4317", "4444", 1)
+		expectedCM["otel-config.yaml"] = strings.Replace(expectedCM["otel-config.yaml"], "4318", "5555", 1)
+		assert.True(
+			t,
+			apiutils.IsEqualStruct(configMap.Data, expectedCM),
+			"ConfigMap \ndiff = %s", cmp.Diff(configMap.Data, expectedCM),
+		)
+		return
+	}
+	assert.True(
+		t,
+		apiutils.IsEqualStruct(configMap.Data, expectedCM),
+		"ConfigMap \ndiff = %s", cmp.Diff(configMap.Data, expectedCM),
+	)
+}
diff --git a/internal/controller/datadogagent/feature/otlp/feature_test.go b/internal/controller/datadogagent/feature/otlp/feature_test.go
index 32e4b669..1a5bcc54 100644
--- a/internal/controller/datadogagent/feature/otlp/feature_test.go
+++ b/internal/controller/datadogagent/feature/otlp/feature_test.go
@@ -40,11 +40,11 @@ func TestOTLPFeature(t *testing.T) {
 			Agent: testExpected(Expected{
 				EnvVars: []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDOTLPgRPCEndpoint,
+						Name:  DDOTLPgRPCEndpoint,
 						Value: "0.0.0.0:4317",
 					},
 					{
-						Name:  apicommon.DDOTLPHTTPEndpoint,
+						Name:  DDOTLPHTTPEndpoint,
 						Value: "0.0.0.0:4318",
 					},
 				},
@@ -80,11 +80,11 @@ func TestOTLPFeature(t *testing.T) {
 			Agent: testExpectedSingleContainer(Expected{
 				EnvVars: []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDOTLPgRPCEndpoint,
+						Name:  DDOTLPgRPCEndpoint,
 						Value: "0.0.0.0:4317",
 					},
 					{
-						Name:  apicommon.DDOTLPHTTPEndpoint,
+						Name:  DDOTLPHTTPEndpoint,
 						Value: "0.0.0.0:4318",
 					},
 				},
@@ -120,11 +120,11 @@ func TestOTLPFeature(t *testing.T) {
 			Agent: testExpected(Expected{
 				EnvVars: []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDOTLPgRPCEndpoint,
+						Name:  DDOTLPgRPCEndpoint,
 						Value: "0.0.0.0:4317",
 					},
 					{
-						Name:  apicommon.DDOTLPHTTPEndpoint,
+						Name:  DDOTLPHTTPEndpoint,
 						Value: "0.0.0.0:4318",
 					},
 				},
@@ -158,11 +158,11 @@ func TestOTLPFeature(t *testing.T) {
 			Agent: testExpectedSingleContainer(Expected{
 				EnvVars: []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDOTLPgRPCEndpoint,
+						Name:  DDOTLPgRPCEndpoint,
 						Value: "0.0.0.0:4317",
 					},
 					{
-						Name:  apicommon.DDOTLPHTTPEndpoint,
+						Name:  DDOTLPHTTPEndpoint,
 						Value: "0.0.0.0:4318",
 					},
 				},
@@ -198,11 +198,11 @@ func TestOTLPFeature(t *testing.T) {
 			Agent: testExpected(Expected{
 				EnvVars: []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDOTLPgRPCEndpoint,
+						Name:  DDOTLPgRPCEndpoint,
 						Value: "0.0.0.0:4317",
 					},
 					{
-						Name:  apicommon.DDOTLPHTTPEndpoint,
+						Name:  DDOTLPHTTPEndpoint,
 						Value: "0.0.0.0:4318",
 					},
 				},
@@ -240,11 +240,11 @@ func TestOTLPFeature(t *testing.T) {
 			Agent: testExpectedSingleContainer(Expected{
 				EnvVars: []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDOTLPgRPCEndpoint,
+						Name:  DDOTLPgRPCEndpoint,
 						Value: "0.0.0.0:4317",
 					},
 					{
-						Name:  apicommon.DDOTLPHTTPEndpoint,
+						Name:  DDOTLPHTTPEndpoint,
 						Value: "0.0.0.0:4318",
 					},
 				},
@@ -277,7 +277,7 @@ func TestOTLPFeature(t *testing.T) {
 			Agent: testExpected(Expected{
 				EnvVars: []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDOTLPgRPCEndpoint,
+						Name:  DDOTLPgRPCEndpoint,
 						Value: "0.0.0.0:4317",
 					},
 				},
@@ -303,7 +303,7 @@ func TestOTLPFeature(t *testing.T) {
 			Agent: testExpectedSingleContainer(Expected{
 				EnvVars: []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDOTLPgRPCEndpoint,
+						Name:  DDOTLPgRPCEndpoint,
 						Value: "0.0.0.0:4317",
 					},
 				},
@@ -330,7 +330,7 @@ func TestOTLPFeature(t *testing.T) {
 			Agent: testExpected(Expected{
 				EnvVars: []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDOTLPHTTPEndpoint,
+						Name:  DDOTLPHTTPEndpoint,
 						Value: "somehostname:4318",
 					},
 				},
@@ -358,7 +358,7 @@ func TestOTLPFeature(t *testing.T) {
 			Agent: testExpectedSingleContainer(Expected{
 				EnvVars: []*corev1.EnvVar{
 					{
-						Name:  apicommon.DDOTLPHTTPEndpoint,
+						Name:  DDOTLPHTTPEndpoint,
 						Value: "somehostname:4318",
 					},
 				},
diff --git a/internal/controller/datadogagent/feature/processdiscovery/feature_test.go b/internal/controller/datadogagent/feature/processdiscovery/feature_test.go
index 2363d5a4..5a9bcbca 100644
--- a/internal/controller/datadogagent/feature/processdiscovery/feature_test.go
+++ b/internal/controller/datadogagent/feature/processdiscovery/feature_test.go
@@ -1,3 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
 package processdiscovery
 
 import (
@@ -123,18 +128,18 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, runInCor
 			// check volume mounts
 			wantVolumeMounts := []corev1.VolumeMount{
 				{
-					Name:      apicommon.PasswdVolumeName,
-					MountPath: apicommon.PasswdMountPath,
+					Name:      v2alpha1.PasswdVolumeName,
+					MountPath: v2alpha1.PasswdMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.CgroupsVolumeName,
-					MountPath: apicommon.CgroupsMountPath,
+					Name:      v2alpha1.CgroupsVolumeName,
+					MountPath: v2alpha1.CgroupsMountPath,
 					ReadOnly:  true,
 				},
 				{
-					Name:      apicommon.ProcdirVolumeName,
-					MountPath: apicommon.ProcdirMountPath,
+					Name:      v2alpha1.ProcdirVolumeName,
+					MountPath: v2alpha1.ProcdirMountPath,
 					ReadOnly:  true,
 				},
 			}
@@ -145,26 +150,26 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, runInCor
 			// check volumes
 			wantVolumes := []corev1.Volume{
 				{
-					Name: apicommon.PasswdVolumeName,
+					Name: v2alpha1.PasswdVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.PasswdHostPath,
+							Path: v2alpha1.PasswdHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.CgroupsVolumeName,
+					Name: v2alpha1.CgroupsVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.CgroupsHostPath,
+							Path: v2alpha1.CgroupsHostPath,
 						},
 					},
 				},
 				{
-					Name: apicommon.ProcdirVolumeName,
+					Name: v2alpha1.ProcdirVolumeName,
 					VolumeSource: corev1.VolumeSource{
 						HostPath: &corev1.HostPathVolumeSource{
-							Path: apicommon.ProcdirHostPath,
+							Path: v2alpha1.ProcdirHostPath,
 						},
 					},
 				},
@@ -176,11 +181,11 @@ func testExpectedAgent(agentContainerName apicommon.AgentContainerName, runInCor
 			// check env vars
 			wantEnvVars := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDProcessConfigRunInCoreAgent,
+					Name:  v2alpha1.DDProcessConfigRunInCoreAgent,
 					Value: utils.BoolToString(&runInCoreAgent),
 				},
 				{
-					Name:  apicommon.DDProcessDiscoveryEnabled,
+					Name:  DDProcessDiscoveryEnabled,
 					Value: "true",
 				},
 			}
diff --git a/internal/controller/datadogagent/feature/prometheusscrape/feature_test.go b/internal/controller/datadogagent/feature/prometheusscrape/feature_test.go
index 2c5533b6..b7e309fc 100644
--- a/internal/controller/datadogagent/feature/prometheusscrape/feature_test.go
+++ b/internal/controller/datadogagent/feature/prometheusscrape/feature_test.go
@@ -54,11 +54,11 @@ func Test_prometheusScrapeFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					wantEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDPrometheusScrapeEnabled,
+							Name:  DDPrometheusScrapeEnabled,
 							Value: "true",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeServiceEndpoints,
+							Name:  DDPrometheusScrapeServiceEndpoints,
 							Value: "false",
 						},
 					}
@@ -69,11 +69,11 @@ func Test_prometheusScrapeFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					wantEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDPrometheusScrapeEnabled,
+							Name:  DDPrometheusScrapeEnabled,
 							Value: "true",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeServiceEndpoints,
+							Name:  DDPrometheusScrapeServiceEndpoints,
 							Value: "false",
 						},
 					}
@@ -92,11 +92,11 @@ func Test_prometheusScrapeFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					wantEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDPrometheusScrapeEnabled,
+							Name:  DDPrometheusScrapeEnabled,
 							Value: "true",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeServiceEndpoints,
+							Name:  DDPrometheusScrapeServiceEndpoints,
 							Value: "true",
 						},
 					}
@@ -107,11 +107,11 @@ func Test_prometheusScrapeFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					wantEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDPrometheusScrapeEnabled,
+							Name:  DDPrometheusScrapeEnabled,
 							Value: "true",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeServiceEndpoints,
+							Name:  DDPrometheusScrapeServiceEndpoints,
 							Value: "true",
 						},
 					}
@@ -130,15 +130,15 @@ func Test_prometheusScrapeFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					wantEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDPrometheusScrapeEnabled,
+							Name:  DDPrometheusScrapeEnabled,
 							Value: "true",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeServiceEndpoints,
+							Name:  DDPrometheusScrapeServiceEndpoints,
 							Value: "false",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeChecks,
+							Name:  DDPrometheusScrapeChecks,
 							Value: jsonConfigs,
 						},
 					}
@@ -149,15 +149,15 @@ func Test_prometheusScrapeFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					wantEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDPrometheusScrapeEnabled,
+							Name:  DDPrometheusScrapeEnabled,
 							Value: "true",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeServiceEndpoints,
+							Name:  DDPrometheusScrapeServiceEndpoints,
 							Value: "false",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeChecks,
+							Name:  DDPrometheusScrapeChecks,
 							Value: jsonConfigs,
 						},
 					}
@@ -176,15 +176,15 @@ func Test_prometheusScrapeFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					wantEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDPrometheusScrapeEnabled,
+							Name:  DDPrometheusScrapeEnabled,
 							Value: "true",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeServiceEndpoints,
+							Name:  DDPrometheusScrapeServiceEndpoints,
 							Value: "false",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeVersion,
+							Name:  DDPrometheusScrapeVersion,
 							Value: "1",
 						},
 					}
@@ -195,15 +195,15 @@ func Test_prometheusScrapeFeature_Configure(t *testing.T) {
 				func(t testing.TB, mgrInterface feature.PodTemplateManagers) {
 					wantEnvVars := []*corev1.EnvVar{
 						{
-							Name:  apicommon.DDPrometheusScrapeEnabled,
+							Name:  DDPrometheusScrapeEnabled,
 							Value: "true",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeServiceEndpoints,
+							Name:  DDPrometheusScrapeServiceEndpoints,
 							Value: "false",
 						},
 						{
-							Name:  apicommon.DDPrometheusScrapeVersion,
+							Name:  DDPrometheusScrapeVersion,
 							Value: "1",
 						},
 					}
diff --git a/internal/controller/datadogagent/feature/remoteconfig/feature_test.go b/internal/controller/datadogagent/feature/remoteconfig/feature_test.go
index be4aa317..4b0aac12 100644
--- a/internal/controller/datadogagent/feature/remoteconfig/feature_test.go
+++ b/internal/controller/datadogagent/feature/remoteconfig/feature_test.go
@@ -62,7 +62,7 @@ func rcAgentNodeWantFunc(rcEnabled bool) *test.ComponentTest {
 			// Check environment variable
 			expectedEnvVars := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDRemoteConfigurationEnabled,
+					Name:  DDRemoteConfigurationEnabled,
 					Value: apiutils.BoolToString(&rcEnabled),
 				},
 			}
@@ -80,7 +80,7 @@ func rcClusterAgentNodeWantFunc(rcEnabled bool) *test.ComponentTest {
 			// Check environment variable
 			expectedEnvVars := []*corev1.EnvVar{
 				{
-					Name:  apicommon.DDRemoteConfigurationEnabled,
+					Name:  DDRemoteConfigurationEnabled,
 					Value: apiutils.BoolToString(&rcEnabled),
 				},
 			}
diff --git a/internal/controller/datadogagent/feature/sbom/feature_test.go b/internal/controller/datadogagent/feature/sbom/feature_test.go
index 3c3442ff..c9680b6e 100644
--- a/internal/controller/datadogagent/feature/sbom/feature_test.go
+++ b/internal/controller/datadogagent/feature/sbom/feature_test.go
@@ -56,15 +56,15 @@ func Test_sbomFeature_Configure(t *testing.T) {
 
 		wantEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDSBOMEnabled,
+				Name:  DDSBOMEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSBOMContainerImageEnabled,
+				Name:  DDSBOMContainerImageEnabled,
 				Value: "false",
 			},
 			{
-				Name:  apicommon.DDSBOMHostEnabled,
+				Name:  DDSBOMHostEnabled,
 				Value: "false",
 			},
 		}
@@ -78,15 +78,15 @@ func Test_sbomFeature_Configure(t *testing.T) {
 
 		wantEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDSBOMEnabled,
+				Name:  DDSBOMEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSBOMContainerImageEnabled,
+				Name:  DDSBOMContainerImageEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSBOMHostEnabled,
+				Name:  DDSBOMHostEnabled,
 				Value: "false",
 			},
 		}
@@ -100,15 +100,15 @@ func Test_sbomFeature_Configure(t *testing.T) {
 
 		wantEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDSBOMEnabled,
+				Name:  DDSBOMEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSBOMContainerImageEnabled,
+				Name:  DDSBOMContainerImageEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSBOMHostEnabled,
+				Name:  DDSBOMHostEnabled,
 				Value: "false",
 			},
 		}
@@ -118,7 +118,7 @@ func Test_sbomFeature_Configure(t *testing.T) {
 		assert.True(t, apiutils.IsEqualStruct(nodeAgentEnvVars, wantEnvVars), "Node agent envvars \ndiff = %s", cmp.Diff(nodeAgentEnvVars, wantEnvVars))
 
 		wantEnvVars = []*corev1.EnvVar{{
-			Name:  apicommon.DDSBOMContainerOverlayFSDirectScan,
+			Name:  DDSBOMContainerOverlayFSDirectScan,
 			Value: "true",
 		}}
 		assert.True(t, apiutils.IsEqualStruct(nodeCoreAgentEnvVars, wantEnvVars), "Core agent envvars \ndiff = %s", cmp.Diff(nodeCoreAgentEnvVars, wantEnvVars))
@@ -129,22 +129,22 @@ func Test_sbomFeature_Configure(t *testing.T) {
 
 		wantAllAgentsEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDSBOMEnabled,
+				Name:  DDSBOMEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSBOMContainerImageEnabled,
+				Name:  DDSBOMContainerImageEnabled,
 				Value: "false",
 			},
 			{
-				Name:  apicommon.DDSBOMHostEnabled,
+				Name:  DDSBOMHostEnabled,
 				Value: "true",
 			},
 		}
 
 		wantCoreAgentHostEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDHostRootEnvVar,
+				Name:  v2alpha1.DDHostRootEnvVar,
 				Value: "/host",
 			},
 		}
@@ -156,8 +156,8 @@ func Test_sbomFeature_Configure(t *testing.T) {
 
 		wantVolumeMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.SystemProbeOSReleaseDirVolumeName,
-				MountPath: apicommon.SystemProbeOSReleaseDirMountPath,
+				Name:      v2alpha1.SystemProbeOSReleaseDirVolumeName,
+				MountPath: v2alpha1.SystemProbeOSReleaseDirMountPath,
 				ReadOnly:  true,
 			},
 			{
@@ -202,10 +202,10 @@ func Test_sbomFeature_Configure(t *testing.T) {
 
 		wantVolumes := []corev1.Volume{
 			{
-				Name: apicommon.SystemProbeOSReleaseDirVolumeName,
+				Name: v2alpha1.SystemProbeOSReleaseDirVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.SystemProbeOSReleaseDirVolumePath,
+						Path: v2alpha1.SystemProbeOSReleaseDirVolumePath,
 					},
 				},
 			},
diff --git a/internal/controller/datadogagent/feature/servicediscovery/feature_test.go b/internal/controller/datadogagent/feature/servicediscovery/feature_test.go
index cdd00f70..177f5438 100644
--- a/internal/controller/datadogagent/feature/servicediscovery/feature_test.go
+++ b/internal/controller/datadogagent/feature/servicediscovery/feature_test.go
@@ -1,3 +1,8 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
 package servicediscovery
 
 import (
@@ -46,21 +51,21 @@ func Test_serviceDiscoveryFeature_Configure(t *testing.T) {
 		// check volume mounts
 		wantCoreAgentVolMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  true,
 			},
 		}
 
 		wantSystemProbeVolMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.ProcdirVolumeName,
-				MountPath: apicommon.ProcdirMountPath,
+				Name:      v2alpha1.ProcdirVolumeName,
+				MountPath: v2alpha1.ProcdirMountPath,
 				ReadOnly:  true,
 			},
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  false,
 			},
 		}
@@ -74,15 +79,15 @@ func Test_serviceDiscoveryFeature_Configure(t *testing.T) {
 		// check volumes
 		wantVolumes := []corev1.Volume{
 			{
-				Name: apicommon.ProcdirVolumeName,
+				Name: v2alpha1.ProcdirVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.ProcdirHostPath,
+						Path: v2alpha1.ProcdirHostPath,
 					},
 				},
 			},
 			{
-				Name: apicommon.SystemProbeSocketVolumeName,
+				Name: v2alpha1.SystemProbeSocketVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					EmptyDir: &corev1.EmptyDirVolumeSource{},
 				},
@@ -95,11 +100,11 @@ func Test_serviceDiscoveryFeature_Configure(t *testing.T) {
 		// check env vars
 		wantEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDServiceDiscoveryEnabled,
+				Name:  DDServiceDiscoveryEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeSocket,
+				Name:  v2alpha1.DDSystemProbeSocket,
 				Value: v2alpha1.DefaultSystemProbeSocketPath,
 			},
 		}
diff --git a/internal/controller/datadogagent/feature/tcpqueuelength/feature_test.go b/internal/controller/datadogagent/feature/tcpqueuelength/feature_test.go
index 25796c3e..16e9ada4 100644
--- a/internal/controller/datadogagent/feature/tcpqueuelength/feature_test.go
+++ b/internal/controller/datadogagent/feature/tcpqueuelength/feature_test.go
@@ -52,31 +52,31 @@ func Test_tcpQueueLengthFeature_Configure(t *testing.T) {
 		// check volume mounts
 		wantCoreAgentVolMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  true,
 			},
 		}
 
 		wantSystemProbeVolMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.ModulesVolumeName,
-				MountPath: apicommon.ModulesVolumePath,
+				Name:      v2alpha1.ModulesVolumeName,
+				MountPath: v2alpha1.ModulesVolumePath,
 				ReadOnly:  true,
 			},
 			{
-				Name:      apicommon.SrcVolumeName,
-				MountPath: apicommon.SrcVolumePath,
+				Name:      v2alpha1.SrcVolumeName,
+				MountPath: v2alpha1.SrcVolumePath,
 				ReadOnly:  true,
 			},
 			{
-				Name:      apicommon.DebugfsVolumeName,
-				MountPath: apicommon.DebugfsPath,
+				Name:      v2alpha1.DebugfsVolumeName,
+				MountPath: v2alpha1.DebugfsPath,
 				ReadOnly:  false,
 			},
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  false,
 			},
 		}
@@ -90,31 +90,31 @@ func Test_tcpQueueLengthFeature_Configure(t *testing.T) {
 		// check volumes
 		wantVolumes := []corev1.Volume{
 			{
-				Name: apicommon.ModulesVolumeName,
+				Name: v2alpha1.ModulesVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.ModulesVolumePath,
+						Path: v2alpha1.ModulesVolumePath,
 					},
 				},
 			},
 			{
-				Name: apicommon.SrcVolumeName,
+				Name: v2alpha1.SrcVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.SrcVolumePath,
+						Path: v2alpha1.SrcVolumePath,
 					},
 				},
 			},
 			{
-				Name: apicommon.DebugfsVolumeName,
+				Name: v2alpha1.DebugfsVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.DebugfsPath,
+						Path: v2alpha1.DebugfsPath,
 					},
 				},
 			},
 			{
-				Name: apicommon.SystemProbeSocketVolumeName,
+				Name: v2alpha1.SystemProbeSocketVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					EmptyDir: &corev1.EmptyDirVolumeSource{},
 				},
@@ -127,15 +127,15 @@ func Test_tcpQueueLengthFeature_Configure(t *testing.T) {
 		// check env vars
 		wantEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDEnableTCPQueueLengthEnvVar,
+				Name:  DDEnableTCPQueueLengthEnvVar,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeEnabled,
+				Name:  v2alpha1.DDSystemProbeEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeSocket,
+				Name:  v2alpha1.DDSystemProbeSocket,
 				Value: v2alpha1.DefaultSystemProbeSocketPath,
 			},
 		}
diff --git a/internal/controller/datadogagent/feature/test/factory_test.go b/internal/controller/datadogagent/feature/test/factory_test.go
index 0ef867e9..0fd46964 100644
--- a/internal/controller/datadogagent/feature/test/factory_test.go
+++ b/internal/controller/datadogagent/feature/test/factory_test.go
@@ -14,6 +14,7 @@ import (
 	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/enabledefault"
 	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/livecontainer"
 	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/npm"
+	_ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/otelcollector"
 )
 
 func TestBuilder(t *testing.T) {
@@ -200,9 +201,57 @@ func TestBuilder(t *testing.T) {
 			dda: v2alpha1test.NewDatadogAgentBuilder().
 				WithAnnotations(map[string]string{"agent.datadoghq.com/otel-agent-enabled": "false"}).
 				BuildWithDefaults(),
-			featureOptions: feature.Options{
-				OtelAgentEnabled: true,
+			wantAgentContainer: map[common.AgentContainerName]bool{
+				common.UnprivilegedSingleAgentContainerName: false,
+				common.CoreAgentContainerName:               true,
+				common.ProcessAgentContainerName:            true,
+				common.TraceAgentContainerName:              true,
+				common.SystemProbeContainerName:             false,
+				common.SecurityAgentContainerName:           false,
+				common.OtelAgent:                            false,
+				common.AgentDataPlaneContainerName:          false,
+			},
+		},
+		{
+			name: "Default DDA, otel annotation false, otel collector feature enabled",
+			dda: v2alpha1test.NewDatadogAgentBuilder().
+				WithAnnotations(map[string]string{"agent.datadoghq.com/otel-agent-enabled": "false"}).
+				WithOTelCollectorEnabled(true).
+				BuildWithDefaults(),
+			wantAgentContainer: map[common.AgentContainerName]bool{
+				common.UnprivilegedSingleAgentContainerName: false,
+				common.CoreAgentContainerName:               true,
+				common.ProcessAgentContainerName:            true,
+				common.TraceAgentContainerName:              true,
+				common.SystemProbeContainerName:             false,
+				common.SecurityAgentContainerName:           false,
+				common.OtelAgent:                            true,
+				common.AgentDataPlaneContainerName:          false,
+			},
+		},
+		{
+			name: "Default DDA, otel annotation true, otel collector feature disabled",
+			dda: v2alpha1test.NewDatadogAgentBuilder().
+				WithAnnotations(map[string]string{"agent.datadoghq.com/otel-agent-enabled": "true"}).
+				WithOTelCollectorEnabled(false).
+				BuildWithDefaults(),
+			wantAgentContainer: map[common.AgentContainerName]bool{
+				common.UnprivilegedSingleAgentContainerName: false,
+				common.CoreAgentContainerName:               true,
+				common.ProcessAgentContainerName:            true,
+				common.TraceAgentContainerName:              true,
+				common.SystemProbeContainerName:             false,
+				common.SecurityAgentContainerName:           false,
+				common.OtelAgent:                            true,
+				common.AgentDataPlaneContainerName:          false,
 			},
+		},
+		{
+			name: "Default DDA, otel annotation true, otel collector feature enabled",
+			dda: v2alpha1test.NewDatadogAgentBuilder().
+				WithAnnotations(map[string]string{"agent.datadoghq.com/otel-agent-enabled": "true"}).
+				WithOTelCollectorEnabled(true).
+				BuildWithDefaults(),
 			wantAgentContainer: map[common.AgentContainerName]bool{
 				common.UnprivilegedSingleAgentContainerName: false,
 				common.CoreAgentContainerName:               true,
diff --git a/internal/controller/datadogagent/feature/usm/feature_test.go b/internal/controller/datadogagent/feature/usm/feature_test.go
index 630d12ee..40ae6bbd 100644
--- a/internal/controller/datadogagent/feature/usm/feature_test.go
+++ b/internal/controller/datadogagent/feature/usm/feature_test.go
@@ -41,7 +41,7 @@ func Test_usmFeature_Configure(t *testing.T) {
 
 		// check annotations
 		wantAnnotations := make(map[string]string)
-		wantAnnotations[apicommon.SystemProbeAppArmorAnnotationKey] = apicommon.SystemProbeAppArmorAnnotationValue
+		wantAnnotations[v2alpha1.SystemProbeAppArmorAnnotationKey] = v2alpha1.SystemProbeAppArmorAnnotationValue
 		annotations := mgr.AnnotationMgr.Annotations
 		assert.True(t, apiutils.IsEqualStruct(annotations, wantAnnotations), "Annotations \ndiff = %s", cmp.Diff(annotations, wantAnnotations))
 
@@ -52,23 +52,23 @@ func Test_usmFeature_Configure(t *testing.T) {
 		// check volume mounts
 		wantVolumeMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.ProcdirVolumeName,
-				MountPath: apicommon.ProcdirMountPath,
+				Name:      v2alpha1.ProcdirVolumeName,
+				MountPath: v2alpha1.ProcdirMountPath,
 				ReadOnly:  true,
 			},
 			{
-				Name:      apicommon.CgroupsVolumeName,
-				MountPath: apicommon.CgroupsMountPath,
+				Name:      v2alpha1.CgroupsVolumeName,
+				MountPath: v2alpha1.CgroupsMountPath,
 				ReadOnly:  true,
 			},
 			{
-				Name:      apicommon.DebugfsVolumeName,
-				MountPath: apicommon.DebugfsPath,
+				Name:      v2alpha1.DebugfsVolumeName,
+				MountPath: v2alpha1.DebugfsPath,
 				ReadOnly:  false,
 			},
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  false,
 			},
 		}
@@ -78,8 +78,8 @@ func Test_usmFeature_Configure(t *testing.T) {
 
 		coreWantVolumeMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  true,
 			},
 		}
@@ -88,8 +88,8 @@ func Test_usmFeature_Configure(t *testing.T) {
 
 		processWantVolumeMounts := []corev1.VolumeMount{
 			{
-				Name:      apicommon.SystemProbeSocketVolumeName,
-				MountPath: apicommon.SystemProbeSocketVolumePath,
+				Name:      v2alpha1.SystemProbeSocketVolumeName,
+				MountPath: v2alpha1.SystemProbeSocketVolumePath,
 				ReadOnly:  true,
 			},
 		}
@@ -99,31 +99,31 @@ func Test_usmFeature_Configure(t *testing.T) {
 		// check volumes
 		wantVolumes := []corev1.Volume{
 			{
-				Name: apicommon.ProcdirVolumeName,
+				Name: v2alpha1.ProcdirVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.ProcdirHostPath,
+						Path: v2alpha1.ProcdirHostPath,
 					},
 				},
 			},
 			{
-				Name: apicommon.CgroupsVolumeName,
+				Name: v2alpha1.CgroupsVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.CgroupsHostPath,
+						Path: v2alpha1.CgroupsHostPath,
 					},
 				},
 			},
 			{
-				Name: apicommon.DebugfsVolumeName,
+				Name: v2alpha1.DebugfsVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					HostPath: &corev1.HostPathVolumeSource{
-						Path: apicommon.DebugfsPath,
+						Path: v2alpha1.DebugfsPath,
 					},
 				},
 			},
 			{
-				Name: apicommon.SystemProbeSocketVolumeName,
+				Name: v2alpha1.SystemProbeSocketVolumeName,
 				VolumeSource: corev1.VolumeSource{
 					EmptyDir: &corev1.EmptyDirVolumeSource{},
 				},
@@ -136,15 +136,15 @@ func Test_usmFeature_Configure(t *testing.T) {
 		// check env vars
 		wantEnvVars := []*corev1.EnvVar{
 			{
-				Name:  apicommon.DDSystemProbeServiceMonitoringEnabled,
+				Name:  DDSystemProbeServiceMonitoringEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeEnabled,
+				Name:  v2alpha1.DDSystemProbeEnabled,
 				Value: "true",
 			},
 			{
-				Name:  apicommon.DDSystemProbeSocket,
+				Name:  v2alpha1.DDSystemProbeSocket,
 				Value: v2alpha1.DefaultSystemProbeSocketPath,
 			},
 		}
diff --git a/internal/controller/datadogagent/override/container_test.go b/internal/controller/datadogagent/override/container_test.go
index 6799f318..efe79fdd 100644
--- a/internal/controller/datadogagent/override/container_test.go
+++ b/internal/controller/datadogagent/override/container_test.go
@@ -10,7 +10,7 @@ import (
 	"reflect"
 	"testing"
 
-	"github.com/DataDog/datadog-operator/api/datadoghq/common"
+	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	apiutils "github.com/DataDog/datadog-operator/api/utils"
 	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/fake"
@@ -23,27 +23,27 @@ import (
 
 func TestContainer(t *testing.T) {
 	agentContainer := &corev1.Container{
-		Name: string(common.CoreAgentContainerName),
+		Name: string(apicommon.CoreAgentContainerName),
 	}
 	initVolContainer := &corev1.Container{
-		Name: string(common.InitVolumeContainerName),
+		Name: string(apicommon.InitVolumeContainerName),
 	}
 	initConfigContainer := &corev1.Container{
-		Name: string(common.InitConfigContainerName),
+		Name: string(apicommon.InitConfigContainerName),
 	}
 	systemProbeContainer := &corev1.Container{
-		Name: string(common.SystemProbeContainerName),
+		Name: string(apicommon.SystemProbeContainerName),
 	}
 	tests := []struct {
 		name            string
-		containerName   common.AgentContainerName
+		containerName   apicommon.AgentContainerName
 		existingManager func() *fake.PodTemplateManagers
 		override        v2alpha1.DatadogAgentGenericContainer
 		validateManager func(t *testing.T, manager *fake.PodTemplateManagers, containerName string)
 	}{
 		{
 			name:          "override container name",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -62,7 +62,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override log level",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -74,10 +74,10 @@ func TestContainer(t *testing.T) {
 				LogLevel: apiutils.NewStringPointer("debug"),
 			},
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers, containerName string) {
-				envs := manager.EnvVarMgr.EnvVarsByC[common.CoreAgentContainerName]
+				envs := manager.EnvVarMgr.EnvVarsByC[apicommon.CoreAgentContainerName]
 				expectedEnvs := []*corev1.EnvVar{
 					{
-						Name:  common.DDLogLevel,
+						Name:  v2alpha1.DDLogLevel,
 						Value: "debug",
 					},
 				}
@@ -86,7 +86,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "add envs",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				manager := fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -94,7 +94,7 @@ func TestContainer(t *testing.T) {
 					},
 				})
 				manager.EnvVar().AddEnvVarToContainer(
-					common.CoreAgentContainerName,
+					apicommon.CoreAgentContainerName,
 					&corev1.EnvVar{
 						Name:  "existing-env",
 						Value: "some-val",
@@ -115,7 +115,7 @@ func TestContainer(t *testing.T) {
 				},
 			},
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers, containerName string) {
-				envs := manager.EnvVarMgr.EnvVarsByC[common.CoreAgentContainerName]
+				envs := manager.EnvVarMgr.EnvVarsByC[apicommon.CoreAgentContainerName]
 				expectedEnvs := []*corev1.EnvVar{
 					{
 						Name:  "existing-env",
@@ -135,7 +135,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "add volume mounts",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				manager := fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -146,7 +146,7 @@ func TestContainer(t *testing.T) {
 					&corev1.VolumeMount{
 						Name: "existing-volume-mount",
 					},
-					common.CoreAgentContainerName,
+					apicommon.CoreAgentContainerName,
 				)
 				return manager
 			},
@@ -161,7 +161,7 @@ func TestContainer(t *testing.T) {
 				},
 			},
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers, containerName string) {
-				mounts := manager.VolumeMountMgr.VolumeMountsByC[common.CoreAgentContainerName]
+				mounts := manager.VolumeMountMgr.VolumeMountsByC[apicommon.CoreAgentContainerName]
 				expectedMounts := []*corev1.VolumeMount{
 					{
 						Name: "existing-volume-mount",
@@ -178,7 +178,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override resources - when there are none defined",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -213,13 +213,13 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override resources - when there are some defined",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
 						Containers: []corev1.Container{
 							{
-								Name: string(common.CoreAgentContainerName),
+								Name: string(apicommon.CoreAgentContainerName),
 								Resources: corev1.ResourceRequirements{
 									Limits: map[corev1.ResourceName]resource.Quantity{
 										corev1.ResourceCPU:    *resource.NewQuantity(2, resource.DecimalSI), // Not overridden, should be kept
@@ -264,13 +264,13 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override resources - when the override specifies a 0",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
 						Containers: []corev1.Container{
 							{
-								Name: string(common.CoreAgentContainerName),
+								Name: string(apicommon.CoreAgentContainerName),
 								Resources: corev1.ResourceRequirements{
 									Limits: map[corev1.ResourceName]resource.Quantity{
 										corev1.ResourceCPU:    *resource.NewQuantity(2, resource.DecimalSI),    // Not overridden, should be kept
@@ -312,7 +312,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override command",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -331,7 +331,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override args",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -350,7 +350,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override health port",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -362,10 +362,10 @@ func TestContainer(t *testing.T) {
 				HealthPort: apiutils.NewInt32Pointer(1234),
 			},
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers, containerName string) {
-				envs := manager.EnvVarMgr.EnvVarsByC[common.CoreAgentContainerName]
+				envs := manager.EnvVarMgr.EnvVarsByC[apicommon.CoreAgentContainerName]
 				expectedEnvs := []*corev1.EnvVar{
 					{
-						Name:  common.DDHealthPort,
+						Name:  v2alpha1.DDHealthPort,
 						Value: "1234",
 					},
 				}
@@ -374,7 +374,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override readiness probe with default HTTPGet",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -415,7 +415,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override readiness probe with non-HTTPGet handler",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -458,7 +458,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override readiness probe",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -507,7 +507,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override liveness probe with default HTTPGet",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -548,7 +548,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override liveness probe with non-HTTPGet handler",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -591,7 +591,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override liveness probe",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -640,7 +640,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override startup probe with default HTTPGet",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -681,7 +681,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override startup probe with non-HTTPGet handler",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -724,7 +724,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override startup probe",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -773,7 +773,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override security context",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -798,7 +798,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override seccomp root path",
-			containerName: common.SystemProbeContainerName,
+			containerName: apicommon.SystemProbeContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -827,7 +827,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override seccomp profile",
-			containerName: common.SystemProbeContainerName,
+			containerName: apicommon.SystemProbeContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -862,7 +862,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override app armor profile",
-			containerName: common.CoreAgentContainerName,
+			containerName: apicommon.CoreAgentContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -874,13 +874,13 @@ func TestContainer(t *testing.T) {
 				AppArmorProfileName: apiutils.NewStringPointer("my-app-armor-profile"),
 			},
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers, containerName string) {
-				annotation := fmt.Sprintf("%s/%s", common.AppArmorAnnotationKey, common.CoreAgentContainerName)
+				annotation := fmt.Sprintf("%s/%s", v2alpha1.AppArmorAnnotationKey, apicommon.CoreAgentContainerName)
 				assert.Equal(t, "my-app-armor-profile", manager.AnnotationMgr.Annotations[annotation])
 			},
 		},
 		{
 			name:          "override initContainer name",
-			containerName: common.InitVolumeContainerName,
+			containerName: apicommon.InitVolumeContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -899,7 +899,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "add initContainer envs",
-			containerName: common.InitVolumeContainerName,
+			containerName: apicommon.InitVolumeContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				manager := fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -907,7 +907,7 @@ func TestContainer(t *testing.T) {
 					},
 				})
 				manager.EnvVar().AddEnvVarToInitContainer(
-					common.InitVolumeContainerName,
+					apicommon.InitVolumeContainerName,
 					&corev1.EnvVar{
 						Name:  "existing-env",
 						Value: "some-val",
@@ -928,7 +928,7 @@ func TestContainer(t *testing.T) {
 				},
 			},
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers, containerName string) {
-				envs := manager.EnvVarMgr.EnvVarsByC[common.InitVolumeContainerName]
+				envs := manager.EnvVarMgr.EnvVarsByC[apicommon.InitVolumeContainerName]
 				expectedEnvs := []*corev1.EnvVar{
 					{
 						Name:  "existing-env",
@@ -948,7 +948,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "add initContainer volume mounts",
-			containerName: common.InitVolumeContainerName,
+			containerName: apicommon.InitVolumeContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				manager := fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -959,7 +959,7 @@ func TestContainer(t *testing.T) {
 					&corev1.VolumeMount{
 						Name: "existing-init-container-volume-mount",
 					},
-					common.InitVolumeContainerName,
+					apicommon.InitVolumeContainerName,
 				)
 				return manager
 			},
@@ -974,7 +974,7 @@ func TestContainer(t *testing.T) {
 				},
 			},
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers, containerName string) {
-				mounts := manager.VolumeMountMgr.VolumeMountsByC[common.InitVolumeContainerName]
+				mounts := manager.VolumeMountMgr.VolumeMountsByC[apicommon.InitVolumeContainerName]
 				expectedMounts := []*corev1.VolumeMount{
 					{
 						Name: "existing-init-container-volume-mount",
@@ -991,7 +991,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override initContainer resources",
-			containerName: common.InitConfigContainerName,
+			containerName: apicommon.InitConfigContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
@@ -1030,7 +1030,7 @@ func TestContainer(t *testing.T) {
 		},
 		{
 			name:          "override initContainer security context",
-			containerName: common.InitConfigContainerName,
+			containerName: apicommon.InitConfigContainerName,
 			existingManager: func() *fake.PodTemplateManagers {
 				return fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{
 					Spec: corev1.PodSpec{
diff --git a/internal/controller/datadogagent/override/daemonset_test.go b/internal/controller/datadogagent/override/daemonset_test.go
index b965259b..9651522f 100644
--- a/internal/controller/datadogagent/override/daemonset_test.go
+++ b/internal/controller/datadogagent/override/daemonset_test.go
@@ -8,7 +8,7 @@ package override
 import (
 	"testing"
 
-	"github.com/DataDog/datadog-operator/api/datadoghq/common"
+	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	apiutils "github.com/DataDog/datadog-operator/api/utils"
 	"github.com/stretchr/testify/assert"
@@ -145,9 +145,9 @@ func makeDaemonSet(strategyType *string, strategyMaxUnavailable *string, strateg
 
 func makeOverride(strategyType *string, strategyMaxUnavailable *string, strategyMaxSurge *string) v2alpha1.DatadogAgentComponentOverride {
 	override := v2alpha1.DatadogAgentComponentOverride{
-		UpdateStrategy: &common.UpdateStrategy{
+		UpdateStrategy: &apicommon.UpdateStrategy{
 			Type: "",
-			RollingUpdate: &common.RollingUpdate{
+			RollingUpdate: &apicommon.RollingUpdate{
 				MaxUnavailable: &intstr.IntOrString{},
 				MaxSurge:       &intstr.IntOrString{},
 			},
diff --git a/internal/controller/datadogagent/override/fips_test.go b/internal/controller/datadogagent/override/fips_test.go
index 3c9a2785..b43482b7 100644
--- a/internal/controller/datadogagent/override/fips_test.go
+++ b/internal/controller/datadogagent/override/fips_test.go
@@ -262,19 +262,19 @@ defaults
 func getExpectedComponentContainerEnvVars(port int) []*corev1.EnvVar {
 	return []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDFIPSEnabled,
+			Name:  v2alpha1.DDFIPSEnabled,
 			Value: "true",
 		},
 		{
-			Name:  apicommon.DDFIPSPortRangeStart,
+			Name:  v2alpha1.DDFIPSPortRangeStart,
 			Value: strconv.Itoa(port),
 		},
 		{
-			Name:  apicommon.DDFIPSUseHTTPS,
+			Name:  v2alpha1.DDFIPSUseHTTPS,
 			Value: "false",
 		},
 		{
-			Name:  apicommon.DDFIPSLocalAddress,
+			Name:  v2alpha1.DDFIPSLocalAddress,
 			Value: "127.0.0.1",
 		},
 	}
@@ -283,16 +283,16 @@ func getExpectedComponentContainerEnvVars(port int) []*corev1.EnvVar {
 func getExpectedFIPSVolume(customConfig bool) []*corev1.Volume {
 	vol := []*corev1.Volume{
 		{
-			Name: apicommon.FIPSProxyCustomConfigVolumeName,
+			Name: v2alpha1.FIPSProxyCustomConfigVolumeName,
 			VolumeSource: corev1.VolumeSource{
 				ConfigMap: &corev1.ConfigMapVolumeSource{
 					LocalObjectReference: corev1.LocalObjectReference{
-						Name: fmt.Sprintf(apicommon.FIPSProxyCustomConfigMapName, ""),
+						Name: fmt.Sprintf(v2alpha1.FIPSProxyCustomConfigMapName, ""),
 					},
 					Items: []corev1.KeyToPath{
 						{
-							Key:  apicommon.FIPSProxyCustomConfigFileName,
-							Path: apicommon.FIPSProxyCustomConfigFileName,
+							Key:  v2alpha1.FIPSProxyCustomConfigFileName,
+							Path: v2alpha1.FIPSProxyCustomConfigFileName,
 						},
 					},
 				},
@@ -315,9 +315,9 @@ func getExpectedFIPSVolumeMounts() []*corev1.VolumeMount {
 
 func getFIPSVolumeMount() corev1.VolumeMount {
 	return corev1.VolumeMount{
-		Name:      apicommon.FIPSProxyCustomConfigVolumeName,
-		MountPath: apicommon.FIPSProxyCustomConfigMountPath,
-		SubPath:   apicommon.FIPSProxyCustomConfigFileName,
+		Name:      v2alpha1.FIPSProxyCustomConfigVolumeName,
+		MountPath: v2alpha1.FIPSProxyCustomConfigMountPath,
+		SubPath:   v2alpha1.FIPSProxyCustomConfigFileName,
 		ReadOnly:  true,
 	}
 }
@@ -325,7 +325,7 @@ func getFIPSVolumeMount() corev1.VolumeMount {
 func checkFIPSContainerEnvVars(t testing.TB, mgr *fake.PodTemplateManagers) {
 	fipsEnvVars := mgr.PodTemplateSpec().Spec.Containers[3].Env
 	expectedEnvVars := corev1.EnvVar{
-		Name:  apicommon.DDFIPSLocalAddress,
+		Name:  v2alpha1.DDFIPSLocalAddress,
 		Value: "127.0.0.1",
 	}
 	assert.Contains(t, fipsEnvVars, expectedEnvVars)
diff --git a/internal/controller/datadogagent/override/global_test.go b/internal/controller/datadogagent/override/global_test.go
index 21441418..0808b2be 100644
--- a/internal/controller/datadogagent/override/global_test.go
+++ b/internal/controller/datadogagent/override/global_test.go
@@ -73,15 +73,15 @@ func TestNodeAgentComponenGlobalSettings(t *testing.T) {
 				BuildWithDefaults(),
 			wantEnvVars: getExpectedEnvVars([]*corev1.EnvVar{
 				{
-					Name:  apicommon.DDKubeletTLSVerify,
+					Name:  v2alpha1.DDKubeletTLSVerify,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDKubeletCAPath,
+					Name:  v2alpha1.DDKubeletCAPath,
 					Value: agentCAPath,
 				},
 				{
-					Name:  apicommon.DockerHost,
+					Name:  v2alpha1.DockerHost,
 					Value: "unix:///host" + dockerSocketPath,
 				},
 			}...),
@@ -98,15 +98,15 @@ func TestNodeAgentComponenGlobalSettings(t *testing.T) {
 				BuildWithDefaults(),
 			wantEnvVars: getExpectedEnvVars([]*corev1.EnvVar{
 				{
-					Name:  apicommon.DDKubeletTLSVerify,
+					Name:  v2alpha1.DDKubeletTLSVerify,
 					Value: "true",
 				},
 				{
-					Name:  apicommon.DDKubeletCAPath,
+					Name:  v2alpha1.DDKubeletCAPath,
 					Value: agentCAPath,
 				},
 				{
-					Name:  apicommon.DockerHost,
+					Name:  v2alpha1.DockerHost,
 					Value: "unix:///host" + dockerSocketPath,
 				},
 			}...),
@@ -121,7 +121,7 @@ func TestNodeAgentComponenGlobalSettings(t *testing.T) {
 				WithChecksTagCardinality("orchestrator").
 				BuildWithDefaults(),
 			wantEnvVars: getExpectedEnvVars(&corev1.EnvVar{
-				Name:  apicommon.DDChecksTagCardinality,
+				Name:  v2alpha1.DDChecksTagCardinality,
 				Value: "orchestrator",
 			}),
 			wantVolumeMounts: emptyVolumeMounts,
@@ -135,7 +135,7 @@ func TestNodeAgentComponenGlobalSettings(t *testing.T) {
 				WithOriginDetectionUnified(true).
 				BuildWithDefaults(),
 			wantEnvVars: getExpectedEnvVars(&corev1.EnvVar{
-				Name:  apicommon.DDOriginDetectionUnified,
+				Name:  v2alpha1.DDOriginDetectionUnified,
 				Value: "true",
 			}),
 			wantVolumeMounts: emptyVolumeMounts,
@@ -183,15 +183,15 @@ func TestNodeAgentComponenGlobalSettings(t *testing.T) {
 			),
 			wantEnvVars: getExpectedEnvVars([]*corev1.EnvVar{
 				{
-					Name:  apicommon.DDSecretBackendCommand,
+					Name:  v2alpha1.DDSecretBackendCommand,
 					Value: secretBackendCommand,
 				},
 				{
-					Name:  apicommon.DDSecretBackendArguments,
+					Name:  v2alpha1.DDSecretBackendArguments,
 					Value: secretBackendArgs,
 				},
 				{
-					Name:  apicommon.DDSecretBackendTimeout,
+					Name:  v2alpha1.DDSecretBackendTimeout,
 					Value: "60",
 				},
 			}...),
@@ -212,15 +212,15 @@ func TestNodeAgentComponenGlobalSettings(t *testing.T) {
 			),
 			wantEnvVars: getExpectedEnvVars([]*corev1.EnvVar{
 				{
-					Name:  apicommon.DDSecretBackendCommand,
+					Name:  v2alpha1.DDSecretBackendCommand,
 					Value: secretBackendCommand,
 				},
 				{
-					Name:  apicommon.DDSecretBackendArguments,
+					Name:  v2alpha1.DDSecretBackendArguments,
 					Value: secretBackendArgs,
 				},
 				{
-					Name:  apicommon.DDSecretBackendTimeout,
+					Name:  v2alpha1.DDSecretBackendTimeout,
 					Value: "60",
 				},
 			}...),
@@ -283,11 +283,11 @@ func assertAllAgentSingleContainer(t testing.TB, mgrInterface feature.PodTemplat
 func getExpectedEnvVars(addedEnvVars ...*corev1.EnvVar) []*corev1.EnvVar {
 	defaultEnvVars := []*corev1.EnvVar{
 		{
-			Name:  apicommon.DDSite,
+			Name:  v2alpha1.DDSite,
 			Value: "datadoghq.com",
 		},
 		{
-			Name:  apicommon.DDLogLevel,
+			Name:  v2alpha1.DDLogLevel,
 			Value: "info",
 		},
 	}
@@ -298,7 +298,7 @@ func getExpectedEnvVars(addedEnvVars ...*corev1.EnvVar) []*corev1.EnvVar {
 func getExpectedVolumes() []*corev1.Volume {
 	return []*corev1.Volume{
 		{
-			Name: apicommon.KubeletCAVolumeName,
+			Name: v2alpha1.KubeletCAVolumeName,
 			VolumeSource: corev1.VolumeSource{
 				HostPath: &corev1.HostPathVolumeSource{
 					Path: hostCAPath,
@@ -306,7 +306,7 @@ func getExpectedVolumes() []*corev1.Volume {
 			},
 		},
 		{
-			Name: apicommon.CriSocketVolumeName,
+			Name: v2alpha1.CriSocketVolumeName,
 			VolumeSource: corev1.VolumeSource{
 				HostPath: &corev1.HostPathVolumeSource{
 					Path: dockerSocketPath,
@@ -319,12 +319,12 @@ func getExpectedVolumes() []*corev1.Volume {
 func getExpectedVolumeMounts() []*corev1.VolumeMount {
 	return []*corev1.VolumeMount{
 		{
-			Name:      apicommon.KubeletCAVolumeName,
+			Name:      v2alpha1.KubeletCAVolumeName,
 			MountPath: agentCAPath,
 			ReadOnly:  true,
 		},
 		{
-			Name:      apicommon.CriSocketVolumeName,
+			Name:      v2alpha1.CriSocketVolumeName,
 			MountPath: "/host" + dockerSocketPath,
 			ReadOnly:  true,
 		},
diff --git a/internal/controller/datadogagent/override/podtemplatespec_test.go b/internal/controller/datadogagent/override/podtemplatespec_test.go
index 053db974..07d438f5 100644
--- a/internal/controller/datadogagent/override/podtemplatespec_test.go
+++ b/internal/controller/datadogagent/override/podtemplatespec_test.go
@@ -15,7 +15,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 
-	"github.com/DataDog/datadog-operator/api/datadoghq/common"
+	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
 	"github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	apiutils "github.com/DataDog/datadog-operator/api/utils"
 	"github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/fake"
@@ -420,7 +420,7 @@ func TestPodTemplateSpec(t *testing.T) {
 						Name: "added-env-valuefrom",
 						ValueFrom: &v1.EnvVarSource{
 							FieldRef: &v1.ObjectFieldSelector{
-								FieldPath: common.FieldPathStatusPodIP,
+								FieldPath: v2alpha1.FieldPathStatusPodIP,
 							},
 						},
 					},
@@ -440,7 +440,7 @@ func TestPodTemplateSpec(t *testing.T) {
 						Name: "added-env-valuefrom",
 						ValueFrom: &v1.EnvVarSource{
 							FieldRef: &v1.ObjectFieldSelector{
-								FieldPath: common.FieldPathStatusPodIP,
+								FieldPath: v2alpha1.FieldPathStatusPodIP,
 							},
 						},
 					},
@@ -492,7 +492,7 @@ func TestPodTemplateSpec(t *testing.T) {
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers) {
 				found := false
 				for _, vol := range manager.VolumeMgr.Volumes {
-					if vol.Name == common.ConfdVolumeName {
+					if vol.Name == v2alpha1.ConfdVolumeName {
 						found = true
 						break
 					}
@@ -515,7 +515,7 @@ func TestPodTemplateSpec(t *testing.T) {
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers) {
 				found := false
 				for _, vol := range manager.VolumeMgr.Volumes {
-					if vol.Name == common.ConfdVolumeName {
+					if vol.Name == v2alpha1.ConfdVolumeName {
 						found = true
 						break
 					}
@@ -538,7 +538,7 @@ func TestPodTemplateSpec(t *testing.T) {
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers) {
 				found := false
 				for _, vol := range manager.VolumeMgr.Volumes {
-					if vol.Name == common.ChecksdVolumeName {
+					if vol.Name == v2alpha1.ChecksdVolumeName {
 						found = true
 						break
 					}
@@ -561,7 +561,7 @@ func TestPodTemplateSpec(t *testing.T) {
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers) {
 				found := false
 				for _, vol := range manager.VolumeMgr.Volumes {
-					if vol.Name == common.ChecksdVolumeName {
+					if vol.Name == v2alpha1.ChecksdVolumeName {
 						found = true
 						break
 					}
@@ -576,19 +576,19 @@ func TestPodTemplateSpec(t *testing.T) {
 				manager := fake.NewPodTemplateManagers(t, v1.PodTemplateSpec{
 					Spec: v1.PodSpec{
 						Containers: []v1.Container{
-							{Name: string(common.CoreAgentContainerName)},
-							{Name: string(common.ClusterAgentContainerName)},
+							{Name: string(apicommon.CoreAgentContainerName)},
+							{Name: string(apicommon.ClusterAgentContainerName)},
 						},
 						InitContainers: []v1.Container{
-							{Name: string(common.InitConfigContainerName)},
+							{Name: string(apicommon.InitConfigContainerName)},
 						},
 					},
 				})
 
 				manager.EnvVarMgr.AddEnvVarToContainer(
-					common.ClusterAgentContainerName,
+					apicommon.ClusterAgentContainerName,
 					&v1.EnvVar{
-						Name:  common.DDLogLevel,
+						Name:  v2alpha1.DDLogLevel,
 						Value: "info",
 					},
 				)
@@ -596,8 +596,8 @@ func TestPodTemplateSpec(t *testing.T) {
 				return manager
 			},
 			override: v2alpha1.DatadogAgentComponentOverride{
-				Containers: map[common.AgentContainerName]*v2alpha1.DatadogAgentGenericContainer{
-					common.ClusterAgentContainerName: {
+				Containers: map[apicommon.AgentContainerName]*v2alpha1.DatadogAgentGenericContainer{
+					apicommon.ClusterAgentContainerName: {
 						LogLevel: apiutils.NewStringPointer("trace"),
 					},
 				},
@@ -605,8 +605,8 @@ func TestPodTemplateSpec(t *testing.T) {
 			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers) {
 				envSet := false
 
-				for _, env := range manager.EnvVarMgr.EnvVarsByC[common.ClusterAgentContainerName] {
-					if env.Name == common.DDLogLevel && env.Value == "trace" {
+				for _, env := range manager.EnvVarMgr.EnvVarsByC[apicommon.ClusterAgentContainerName] {
+					if env.Name == v2alpha1.DDLogLevel && env.Value == "trace" {
 						envSet = true
 						break
 					}
@@ -678,6 +678,20 @@ func TestPodTemplateSpec(t *testing.T) {
 				assert.Equal(t, "new-name", manager.PodTemplateSpec().Spec.PriorityClassName)
 			},
 		},
+		{
+			name: "override runtime class name",
+			existingManager: func() *fake.PodTemplateManagers {
+				manager := fake.NewPodTemplateManagers(t, v1.PodTemplateSpec{})
+				manager.PodTemplateSpec().Spec.RuntimeClassName = apiutils.NewStringPointer("old-name")
+				return manager
+			},
+			override: v2alpha1.DatadogAgentComponentOverride{
+				RuntimeClassName: apiutils.NewStringPointer("new-name"),
+			},
+			validateManager: func(t *testing.T, manager *fake.PodTemplateManagers) {
+				assert.Equal(t, "new-name", *manager.PodTemplateSpec().Spec.RuntimeClassName)
+			},
+		},
 		{
 			name: "override affinity",
 			existingManager: func() *fake.PodTemplateManagers {
diff --git a/internal/controller/datadogagent/testutils/client_utils.go b/internal/controller/datadogagent/testutils/client_utils.go
index 86cd4cb0..f6b94794 100644
--- a/internal/controller/datadogagent/testutils/client_utils.go
+++ b/internal/controller/datadogagent/testutils/client_utils.go
@@ -12,7 +12,7 @@ import (
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	networkingv1 "k8s.io/api/networking/v1"
-	policyv1 "k8s.io/api/policy/v1"
+	policyv1 "k8s.io/api/policy/v1beta1"
 	rbacv1 "k8s.io/api/rbac/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/client-go/kubernetes/scheme"
diff --git a/internal/controller/datadogagent_controller_profiles_test.go b/internal/controller/datadogagent_controller_profiles_test.go
index ddc1aa4d..4b51ba74 100644
--- a/internal/controller/datadogagent_controller_profiles_test.go
+++ b/internal/controller/datadogagent_controller_profiles_test.go
@@ -252,7 +252,7 @@ var _ = Describe("V2 Controller - DatadogAgentProfile", func() {
 											Name: "two",
 											ValueFrom: &v1.EnvVarSource{
 												FieldRef: &v1.ObjectFieldSelector{
-													FieldPath: apicommon.FieldPathStatusPodIP,
+													FieldPath: v2alpha1.FieldPathStatusPodIP,
 												},
 											},
 										},
@@ -329,7 +329,7 @@ var _ = Describe("V2 Controller - DatadogAgentProfile", func() {
 						Name: "two",
 						ValueFrom: &v1.EnvVarSource{
 							FieldRef: &v1.ObjectFieldSelector{
-								FieldPath: apicommon.FieldPathStatusPodIP,
+								FieldPath: v2alpha1.FieldPathStatusPodIP,
 							},
 						},
 					},
diff --git a/internal/controller/datadogmonitor/finalizer_test.go b/internal/controller/datadogmonitor/finalizer_test.go
index 61898925..93e856a9 100644
--- a/internal/controller/datadogmonitor/finalizer_test.go
+++ b/internal/controller/datadogmonitor/finalizer_test.go
@@ -8,11 +8,13 @@ package datadogmonitor
 import (
 	"context"
 	"testing"
+	"time"
 
 	"github.com/go-logr/logr"
 	"github.com/stretchr/testify/assert"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes/scheme"
+	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 
@@ -27,10 +29,39 @@ var (
 func Test_handleFinalizer(t *testing.T) {
 	s := scheme.Scheme
 	s.AddKnownTypes(datadoghqv1alpha1.GroupVersion, &datadoghqv1alpha1.DatadogMonitor{})
-	// metaNow := metav1.NewTime(time.Now())
+	metaNow := metav1.NewTime(time.Now())
 
 	r := &Reconciler{
 		client: fake.NewClientBuilder().
+			WithRuntimeObjects(
+				&datadoghqv1alpha1.DatadogMonitor{
+					TypeMeta: metav1.TypeMeta{
+						Kind: "DatadogMonitor",
+					},
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      "monitor-create",
+						Namespace: "foo",
+					},
+				},
+				// Fake client preventes deletion timestamp from being set, so we init the store with an object that has:
+				// - deletion timestamp (added by running kubectl delete)
+				// - finalizer (added by the reconciler at creation time (see first test case))
+				// Ref: https://github.com/kubernetes-sigs/controller-runtime/commit/7a66d580c0c53504f5b509b45e9300cc18a1cc30#diff-20ecedbf30721c01c33fb67d911da11c277e29990497a600d20cb0ec7215affdR683-R686
+				&datadoghqv1alpha1.DatadogMonitor{
+					TypeMeta: metav1.TypeMeta{
+						Kind: "DatadogMonitor",
+					},
+					ObjectMeta: metav1.ObjectMeta{
+						Name:              "monitor-to-delete",
+						Namespace:         "foo",
+						DeletionTimestamp: &metaNow,
+						Finalizers:        []string{datadogMonitorFinalizer},
+					},
+					Status: datadoghqv1alpha1.DatadogMonitorStatus{
+						Primary: false,
+					},
+				},
+			).
 			WithStatusSubresource(&datadoghqv1alpha1.DatadogMonitor{}).Build(),
 		scheme: s,
 		log:    testLogger,
@@ -38,51 +69,34 @@ func Test_handleFinalizer(t *testing.T) {
 
 	testCases := []struct {
 		name                 string
-		dm                   *datadoghqv1alpha1.DatadogMonitor
+		objectName           string
 		finalizerShouldExist bool
 	}{
 		{
-			name: "a new DatadogMonitor object gets a finalizer added successfully",
-			dm: &datadoghqv1alpha1.DatadogMonitor{
-				TypeMeta: metav1.TypeMeta{
-					Kind: "DatadogMonitor",
-				},
-				ObjectMeta: metav1.ObjectMeta{
-					Name: "test monitor",
-				},
-			},
+			name:                 "a new DatadogMonitor object gets a finalizer added successfully",
+			objectName:           "monitor-create",
 			finalizerShouldExist: true,
 		},
-		// {
-		// 	name: "a new DatadogMonitor object has a deletion timestamp",
-		// 	dm: &datadoghqv1alpha1.DatadogMonitor{
-		// 		TypeMeta: metav1.TypeMeta{
-		// 			Kind: "DatadogMonitor",
-		// 		},
-		// 		ObjectMeta: metav1.ObjectMeta{
-		// 			Name: "test monitor",
-		// 			// https://github.com/kubernetes-sigs/controller-runtime/commit/7a66d580c0c53504f5b509b45e9300cc18a1cc30#diff-20ecedbf30721c01c33fb67d911da11c277e29990497a600d20cb0ec7215affdR683-R686
-		// 			// this is getting wiped upon creation with new controller-runtime
-		// 			DeletionTimestamp: &metaNow,
-		// 		},
-		// 		Status: datadoghqv1alpha1.DatadogMonitorStatus{
-		// 			Primary: false,
-		// 		},
-		// 	},
-		// 	finalizerShouldExist: false,
-		// },
+		{
+			name:                 "a DatadogMonitor object (with the finalizer) has a deletion timestamp",
+			objectName:           "monitor-to-delete",
+			finalizerShouldExist: false,
+		},
 	}
 
 	for _, test := range testCases {
 		t.Run(test.name, func(t *testing.T) {
 			reqLogger := testLogger.WithValues("test:", test.name)
-			_ = r.client.Create(context.TODO(), test.dm)
-			_, err := r.handleFinalizer(reqLogger, test.dm)
+			testMonitor := &datadoghqv1alpha1.DatadogMonitor{}
+			_ = r.client.Get(context.TODO(), client.ObjectKey{Namespace: "foo", Name: test.objectName}, testMonitor)
+
+			_, err := r.handleFinalizer(reqLogger, testMonitor)
+
 			assert.NoError(t, err)
 			if test.finalizerShouldExist {
-				assert.True(t, utils.ContainsString(test.dm.GetFinalizers(), datadogMonitorFinalizer))
+				assert.True(t, utils.ContainsString(testMonitor.GetFinalizers(), datadogMonitorFinalizer))
 			} else {
-				assert.False(t, utils.ContainsString(test.dm.GetFinalizers(), datadogMonitorFinalizer))
+				assert.False(t, utils.ContainsString(testMonitor.GetFinalizers(), datadogMonitorFinalizer))
 			}
 		})
 	}
diff --git a/internal/controller/testutils/agent.go b/internal/controller/testutils/agent.go
index fc4ea328..2b10da6c 100644
--- a/internal/controller/testutils/agent.go
+++ b/internal/controller/testutils/agent.go
@@ -408,7 +408,7 @@ func NewDatadogAgentWithGlobalConfigSettings(namespace string, name string) v2al
 		Kubelet: &v2alpha1.KubeletConfig{
 			Host: &v1.EnvVarSource{
 				FieldRef: &v1.ObjectFieldSelector{
-					FieldPath: apicommon.FieldPathSpecNodeName,
+					FieldPath: v2alpha1.FieldPathSpecNodeName,
 				},
 			},
 			TLSVerify:  apiutils.NewBoolPointer(true),
@@ -455,7 +455,7 @@ func NewDatadogAgentWithOverrides(namespace string, name string) v2alpha1.Datado
 				LogLevel: apiutils.NewStringPointer("debug"),
 				Env: []v1.EnvVar{
 					{
-						Name:  apicommon.DDLogLevel,
+						Name:  v2alpha1.DDLogLevel,
 						Value: "debug",
 					},
 				},
diff --git a/pkg/agentprofile/agent_profile_test.go b/pkg/agentprofile/agent_profile_test.go
index f83660e3..d6eb8c0e 100644
--- a/pkg/agentprofile/agent_profile_test.go
+++ b/pkg/agentprofile/agent_profile_test.go
@@ -350,6 +350,7 @@ func TestOverrideFromProfile(t *testing.T) {
 					},
 				},
 				PriorityClassName: apiutils.NewStringPointer("foo"),
+				RuntimeClassName:  apiutils.NewStringPointer("bar"),
 				UpdateStrategy: &apicommon.UpdateStrategy{
 					Type: "RollingUpdate",
 					RollingUpdate: &apicommon.RollingUpdate{
@@ -718,6 +719,7 @@ func configWithAllOverrides(cpuRequest string) *v1alpha1.Config {
 		Override: map[v1alpha1.ComponentName]*v1alpha1.Override{
 			v1alpha1.NodeAgentComponentName: {
 				PriorityClassName: apiutils.NewStringPointer("foo"),
+				RuntimeClassName:  apiutils.NewStringPointer("bar"),
 				UpdateStrategy: &apicommon.UpdateStrategy{
 					Type: "RollingUpdate",
 					RollingUpdate: &apicommon.RollingUpdate{
diff --git a/pkg/controller/utils/datadog/metrics_forwarder_test.go b/pkg/controller/utils/datadog/metrics_forwarder_test.go
index cb105d21..cf4e7cd5 100644
--- a/pkg/controller/utils/datadog/metrics_forwarder_test.go
+++ b/pkg/controller/utils/datadog/metrics_forwarder_test.go
@@ -15,8 +15,7 @@ import (
 	"sync"
 	"testing"
 
-	apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
-	datadoghqv2alpha1 "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
+	v2alpha1 "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1"
 	test "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1/test"
 	apiutils "github.com/DataDog/datadog-operator/api/utils"
 	"github.com/DataDog/datadog-operator/pkg/config"
@@ -162,7 +161,7 @@ func TestReconcileDatadogAgent_getCredentials(t *testing.T) {
 		client client.Client
 	}
 	type args struct {
-		dda      *datadoghqv2alpha1.DatadogAgent
+		dda      *v2alpha1.DatadogAgent
 		loadFunc func(*metricsForwarder, *secrets.DummyDecryptor)
 	}
 	tests := []struct {
@@ -179,14 +178,14 @@ func TestReconcileDatadogAgent_getCredentials(t *testing.T) {
 				client: fake.NewFakeClient(),
 			},
 			args: args{
-				dda: test.NewDatadogAgent("foo", "bar", &datadoghqv2alpha1.GlobalConfig{
-					Credentials: &datadoghqv2alpha1.DatadogCredentials{
+				dda: test.NewDatadogAgent("foo", "bar", &v2alpha1.GlobalConfig{
+					Credentials: &v2alpha1.DatadogCredentials{
 						APIKey: apiutils.NewStringPointer(apiKey),
 					},
 				}),
 				loadFunc: func(m *metricsForwarder, d *secrets.DummyDecryptor) {
-					os.Setenv(apicommon.DDAPIKey, "test123")
-					os.Setenv(apicommon.DDAppKey, "testabc")
+					os.Setenv(v2alpha1.DDAPIKey, "test123")
+					os.Setenv(v2alpha1.DDAppKey, "testabc")
 				},
 			},
 			wantAPIKey: "test123",
@@ -198,14 +197,14 @@ func TestReconcileDatadogAgent_getCredentials(t *testing.T) {
 				client: fake.NewFakeClient(),
 			},
 			args: args{
-				dda: test.NewDatadogAgent("foo", "bar", &datadoghqv2alpha1.GlobalConfig{
-					Credentials: &datadoghqv2alpha1.DatadogCredentials{
+				dda: test.NewDatadogAgent("foo", "bar", &v2alpha1.GlobalConfig{
+					Credentials: &v2alpha1.DatadogCredentials{
 						APIKey: apiutils.NewStringPointer(apiKey),
 					},
 				}),
 				loadFunc: func(m *metricsForwarder, d *secrets.DummyDecryptor) {
-					os.Unsetenv(apicommon.DDAPIKey)
-					os.Unsetenv(apicommon.DDAppKey)
+					os.Unsetenv(v2alpha1.DDAPIKey)
+					os.Unsetenv(v2alpha1.DDAppKey)
 				},
 			},
 			wantAPIKey: "foundAPIKey",
@@ -217,17 +216,17 @@ func TestReconcileDatadogAgent_getCredentials(t *testing.T) {
 				client: fake.NewFakeClient(),
 			},
 			args: args{
-				dda: test.NewDatadogAgent("foo", "bar", &datadoghqv2alpha1.GlobalConfig{
-					Credentials: &datadoghqv2alpha1.DatadogCredentials{
-						APISecret: &datadoghqv2alpha1.SecretConfig{
+				dda: test.NewDatadogAgent("foo", "bar", &v2alpha1.GlobalConfig{
+					Credentials: &v2alpha1.DatadogCredentials{
+						APISecret: &v2alpha1.SecretConfig{
 							SecretName: "datadog-creds-api",
 							KeyName:    "datadog_api_key",
 						},
 					},
 				}),
 				loadFunc: func(m *metricsForwarder, d *secrets.DummyDecryptor) {
-					os.Unsetenv(apicommon.DDAPIKey)
-					os.Unsetenv(apicommon.DDAppKey)
+					os.Unsetenv(v2alpha1.DDAPIKey)
+					os.Unsetenv(v2alpha1.DDAppKey)
 					secret := &corev1.Secret{
 						ObjectMeta: metav1.ObjectMeta{
 							Name:      "datadog-creds-api",
@@ -249,14 +248,14 @@ func TestReconcileDatadogAgent_getCredentials(t *testing.T) {
 				client: fake.NewFakeClient(),
 			},
 			args: args{
-				dda: test.NewDatadogAgent("foo", "bar", &datadoghqv2alpha1.GlobalConfig{
-					Credentials: &datadoghqv2alpha1.DatadogCredentials{
+				dda: test.NewDatadogAgent("foo", "bar", &v2alpha1.GlobalConfig{
+					Credentials: &v2alpha1.DatadogCredentials{
 						APIKey: apiutils.NewStringPointer(encAPIKey),
 					},
 				}),
 				loadFunc: func(m *metricsForwarder, d *secrets.DummyDecryptor) {
-					os.Unsetenv(apicommon.DDAPIKey)
-					os.Unsetenv(apicommon.DDAppKey)
+					os.Unsetenv(v2alpha1.DDAPIKey)
+					os.Unsetenv(v2alpha1.DDAppKey)
 					m.cleanSecretsCache()
 					m.creds.Store(encAPIKey, "cachedAPIKey")
 				},
@@ -277,14 +276,14 @@ func TestReconcileDatadogAgent_getCredentials(t *testing.T) {
 				client: fake.NewFakeClient(),
 			},
 			args: args{
-				dda: test.NewDatadogAgent("foo", "bar", &datadoghqv2alpha1.GlobalConfig{
-					Credentials: &datadoghqv2alpha1.DatadogCredentials{
+				dda: test.NewDatadogAgent("foo", "bar", &v2alpha1.GlobalConfig{
+					Credentials: &v2alpha1.DatadogCredentials{
 						APIKey: apiutils.NewStringPointer(encAPIKey),
 					},
 				}),
 				loadFunc: func(m *metricsForwarder, d *secrets.DummyDecryptor) {
-					os.Unsetenv(apicommon.DDAPIKey)
-					os.Unsetenv(apicommon.DDAppKey)
+					os.Unsetenv(v2alpha1.DDAPIKey)
+					os.Unsetenv(v2alpha1.DDAppKey)
 					m.cleanSecretsCache()
 					d.On("Decrypt", []string{encAPIKey}).Once()
 				},
@@ -306,10 +305,10 @@ func TestReconcileDatadogAgent_getCredentials(t *testing.T) {
 				client: fake.NewFakeClient(),
 			},
 			args: args{
-				dda: test.NewDatadogAgent("foo", "bar", &datadoghqv2alpha1.GlobalConfig{}),
+				dda: test.NewDatadogAgent("foo", "bar", &v2alpha1.GlobalConfig{}),
 				loadFunc: func(m *metricsForwarder, d *secrets.DummyDecryptor) {
-					os.Unsetenv(apicommon.DDAPIKey)
-					os.Unsetenv(apicommon.DDAppKey)
+					os.Unsetenv(v2alpha1.DDAPIKey)
+					os.Unsetenv(v2alpha1.DDAppKey)
 				},
 			},
 			wantErr: true,
@@ -694,7 +693,7 @@ func Test_getbaseURL(t *testing.T) {
 	euSite := "datadoghq.eu"
 
 	type args struct {
-		dda *datadoghqv2alpha1.DatadogAgent
+		dda *v2alpha1.DatadogAgent
 	}
 	tests := []struct {
 		name string
@@ -711,7 +710,7 @@ func Test_getbaseURL(t *testing.T) {
 		{
 			name: "Compute baseURL from site when passing Site",
 			args: args{
-				dda: test.NewDatadogAgent("foo", "bar", &datadoghqv2alpha1.GlobalConfig{
+				dda: test.NewDatadogAgent("foo", "bar", &v2alpha1.GlobalConfig{
 					Site: &euSite,
 				}),
 			},
@@ -720,8 +719,8 @@ func Test_getbaseURL(t *testing.T) {
 		{
 			name: "Compute baseURL from endpoint.URL when Site is not defined",
 			args: args{
-				dda: test.NewDatadogAgent("foo", "bar", &datadoghqv2alpha1.GlobalConfig{
-					Endpoint: &datadoghqv2alpha1.Endpoint{
+				dda: test.NewDatadogAgent("foo", "bar", &v2alpha1.GlobalConfig{
+					Endpoint: &v2alpha1.Endpoint{
 						URL: apiutils.NewStringPointer("https://test.url.com"),
 					},
 				}),
@@ -731,9 +730,9 @@ func Test_getbaseURL(t *testing.T) {
 		{
 			name: "Test that DDUrl takes precedence over Site",
 			args: args{
-				dda: test.NewDatadogAgent("foo", "bar", &datadoghqv2alpha1.GlobalConfig{
+				dda: test.NewDatadogAgent("foo", "bar", &v2alpha1.GlobalConfig{
 					Site: &euSite,
-					Endpoint: &datadoghqv2alpha1.Endpoint{
+					Endpoint: &v2alpha1.Endpoint{
 						URL: apiutils.NewStringPointer("https://test.url.com"),
 					},
 				}),
diff --git a/pkg/kubernetes/platforminfo_test.go b/pkg/kubernetes/platforminfo_test.go
index 50d7199f..d43d2590 100644
--- a/pkg/kubernetes/platforminfo_test.go
+++ b/pkg/kubernetes/platforminfo_test.go
@@ -7,6 +7,124 @@ import (
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
+func Test_createPlatformInfoFromAPIObjects(t *testing.T) {
+	tests := []struct {
+		name                string
+		tag                 string
+		apiGroups           []*v1.APIGroup
+		apiResourceList     []*v1.APIResourceList
+		useV1Beta1PDB       bool
+		pdbPreferredVersion string
+		pdbOtherVersion     string
+	}{
+		{
+			name: "v1 preferred, PDB v1 prferred, PDB v1beta1 not proferred",
+			apiGroups: []*v1.APIGroup{
+				newApiGroupPointer(
+					v1.APIGroup{
+						Name: "policy",
+						Versions: []v1.GroupVersionForDiscovery{
+							{
+								GroupVersion: "policy/v1",
+							},
+							{
+								GroupVersion: "policy/v1beta1",
+							},
+						},
+						PreferredVersion: v1.GroupVersionForDiscovery{
+							GroupVersion: "policy/v1",
+						},
+					},
+				),
+			},
+			apiResourceList:     createDefaultApiResourceList(),
+			useV1Beta1PDB:       false,
+			pdbPreferredVersion: "policy/v1",
+			pdbOtherVersion:     "policy/v1beta1",
+		},
+		{
+			name: "v1beta1 preferred, PDB PDB v1 not proferred",
+			tag:  "tag 1",
+			apiGroups: []*v1.APIGroup{
+				newApiGroupPointer(
+					v1.APIGroup{
+						Name: "policy",
+						Versions: []v1.GroupVersionForDiscovery{
+							{
+								GroupVersion: "policy/v1",
+							},
+							{
+								GroupVersion: "policy/v1beta1",
+							},
+						},
+						PreferredVersion: v1.GroupVersionForDiscovery{
+							GroupVersion: "policy/v1beta1",
+						},
+					},
+				),
+			},
+			apiResourceList:     createDefaultApiResourceList(),
+			useV1Beta1PDB:       true,
+			pdbPreferredVersion: "policy/v1beta1",
+			pdbOtherVersion:     "policy/v1",
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			platformInfo := NewPlatformInfo(nil, tt.apiGroups, tt.apiResourceList)
+			assert.Equal(t, tt.useV1Beta1PDB, platformInfo.UseV1Beta1PDB())
+			assert.Equal(t, tt.pdbPreferredVersion, platformInfo.apiPreferredVersions["PodDisruptionBudget"])
+			assert.Equal(t, tt.pdbOtherVersion, platformInfo.apiOtherVersions["PodDisruptionBudget"])
+		})
+	}
+}
+
+func Test_getPDBFlag(t *testing.T) {
+	tests := []struct {
+		name          string
+		preferred     map[string]string
+		other         map[string]string
+		useV1Beta1PDB bool
+	}{
+		{
+			name: "Chooses preferred version of PodDisruptionBudget",
+			preferred: map[string]string{
+				"PodDisruptionBudget": "policy/v1",
+			},
+			other: map[string]string{
+				"PodDisruptionBudget": "policy/v1beta1",
+			},
+			useV1Beta1PDB: false,
+		},
+		{
+			name: "Chooses preferred version of PodDisruptionBudget",
+			preferred: map[string]string{
+				"PodDisruptionBudget": "policy/v1beta1",
+			},
+			other: map[string]string{
+				"PodDisruptionBudget": "policy/v1",
+			},
+			useV1Beta1PDB: true,
+		},
+		{
+			name: "Unrecognized preferred version, defaults to v1",
+			preferred: map[string]string{
+				"PodDisruptionBudget": "xyz",
+			},
+			other:         map[string]string{},
+			useV1Beta1PDB: false,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			platformInfo := NewPlatformInfoFromVersionMaps(nil, tt.preferred, tt.other)
+			assert.Equal(t, tt.useV1Beta1PDB, platformInfo.UseV1Beta1PDB())
+		})
+	}
+}
+
 func Test_getDatadogAgentVersions(t *testing.T) {
 	tests := []struct {
 		name            string
@@ -92,6 +210,41 @@ func Test_getDatadogAgentVersions(t *testing.T) {
 	}
 }
 
+func createDefaultApiResourceList() []*v1.APIResourceList {
+	return []*v1.APIResourceList{
+		newApiResourceListPointer(
+			v1.APIResourceList{
+				GroupVersion: "policy/v1",
+				APIResources: []v1.APIResource{
+					{
+						Kind: "PodDisruptionBudget",
+					},
+				},
+			},
+		),
+		newApiResourceListPointer(
+			v1.APIResourceList{
+				GroupVersion: "policy/v1beta1",
+				APIResources: []v1.APIResource{
+					{
+						Kind: "PodDisruptionBudget",
+					},
+				},
+			},
+		),
+		newApiResourceListPointer(
+			v1.APIResourceList{
+				GroupVersion: "datadoghq/v1alpha1",
+				APIResources: []v1.APIResource{
+					{
+						Kind: "DatadogAgent",
+					},
+				},
+			},
+		),
+	}
+}
+
 func createDatadogAgentResourceList() []*v1.APIResourceList {
 	return []*v1.APIResourceList{
 		newApiResourceListPointer(
@@ -124,3 +277,12 @@ func newApiGroupPointer(apiGroup v1.APIGroup) *v1.APIGroup {
 func newApiResourceListPointer(apiResourceList v1.APIResourceList) *v1.APIResourceList {
 	return &apiResourceList
 }
+
+func containsObjectKind(list []ObjectKind, s ObjectKind) bool {
+	for _, v := range list {
+		if v == s {
+			return true
+		}
+	}
+	return false
+}