diff --git a/pkg/config/env/environment_container_features.go b/pkg/config/env/environment_container_features.go index f965ca7a9208bc..0e7c22bed2b52a 100644 --- a/pkg/config/env/environment_container_features.go +++ b/pkg/config/env/environment_container_features.go @@ -37,4 +37,7 @@ const ( PodResources Feature = "podresources" // NVML library present for GPU detection NVML Feature = "nvml" + // NonstandardCRIRuntime is a fallback value for when customers supply a CRI compliant runtime via the + // cri_socket_path configuration field + NonstandardCRIRuntime = "nonstandard-cri-runtime" ) diff --git a/pkg/config/env/environment_containers.go b/pkg/config/env/environment_containers.go index 36099b74659c62..42297ef7cdb72c 100644 --- a/pkg/config/env/environment_containers.go +++ b/pkg/config/env/environment_containers.go @@ -51,6 +51,7 @@ func init() { registerFeature(Podman) registerFeature(PodResources) registerFeature(NVML) + registerFeature(NonstandardCRIRuntime) } // IsAnyContainerFeaturePresent checks if any of known container features is present @@ -65,7 +66,8 @@ func IsAnyContainerFeaturePresent() bool { IsFeaturePresent(ECSManagedInstances) || IsFeaturePresent(EKSFargate) || IsFeaturePresent(CloudFoundry) || - IsFeaturePresent(Podman) + IsFeaturePresent(Podman) || + IsFeaturePresent(NonstandardCRIRuntime) } func detectContainerFeatures(features FeatureMap, cfg model.Reader) { @@ -144,6 +146,8 @@ func detectCriRuntimes(features FeatureMap, cfg model.Reader) { mergeContainerdNamespaces(cfg) } else if strings.Contains(criSocket, "crio") { features[Crio] = struct{}{} + } else { + features[NonstandardCRIRuntime] = struct{}{} } } } diff --git a/pkg/util/containers/metrics/cri/collector.go b/pkg/util/containers/metrics/cri/collector.go index 8c6b746f7bd6ba..0c989d68e9ecf3 100644 --- a/pkg/util/containers/metrics/cri/collector.go +++ b/pkg/util/containers/metrics/cri/collector.go @@ -58,7 +58,8 @@ func newCRICollector(cache *provider.Cache) (provider.CollectorMetadata, error) return provider.CollectorMetadata{ ID: collectorID, Collectors: provider.CollectorCatalog{ - provider.NewRuntimeMetadata(string(provider.RuntimeNameCRIO), ""): provider.MakeCached(collectorID, cache, collectors), + provider.NewRuntimeMetadata(string(provider.RuntimeNameCRIO), ""): provider.MakeCached(collectorID, cache, collectors), + provider.NewRuntimeMetadata(string(provider.RuntimeNameCRINonstandard), ""): provider.MakeCached(collectorID, cache, collectors), }, }, nil } diff --git a/pkg/util/containers/metrics/kubelet/collector.go b/pkg/util/containers/metrics/kubelet/collector.go index 3d438bca4cbb96..bf069a5436b29d 100644 --- a/pkg/util/containers/metrics/kubelet/collector.go +++ b/pkg/util/containers/metrics/kubelet/collector.go @@ -89,6 +89,7 @@ func newKubeletCollector(_ *provider.Cache, wmeta workloadmeta.Component) (provi provider.NewRuntimeMetadata(string(provider.RuntimeNameContainerd), string(provider.RuntimeFlavorKata)): collectors, provider.NewRuntimeMetadata(string(provider.RuntimeNameCRIO), ""): collectors, provider.NewRuntimeMetadata(string(provider.RuntimeNameDocker), ""): collectors, + provider.NewRuntimeMetadata(string(provider.RuntimeNameCRINonstandard), ""): collectors, }, }, nil } diff --git a/pkg/util/containers/metrics/provider/provider.go b/pkg/util/containers/metrics/provider/provider.go index b73cd8ad0daf8d..8026d96086c51a 100644 --- a/pkg/util/containers/metrics/provider/provider.go +++ b/pkg/util/containers/metrics/provider/provider.go @@ -14,6 +14,8 @@ import ( "sync" workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def" + "github.com/DataDog/datadog-agent/pkg/config/env" + "github.com/DataDog/datadog-agent/pkg/util/log" "github.com/DataDog/datadog-agent/pkg/util/option" "github.com/DataDog/datadog-agent/pkg/util/retry" ) @@ -30,6 +32,7 @@ const ( RuntimeNamePodman Runtime = "podman" RuntimeNameECSFargate Runtime = "ecsfargate" RuntimeNameECSManagedInstances Runtime = "ecsmanagedinstances" + RuntimeNameCRINonstandard Runtime = "cri-nonstandard" ) var ( @@ -58,6 +61,7 @@ var ( RuntimeNamePodman, RuntimeNameECSFargate, RuntimeNameECSManagedInstances, + RuntimeNameCRINonstandard, } // AllWindowsRuntimes lists all runtimes available on Windows @@ -67,7 +71,11 @@ var ( RuntimeNameContainerd, RuntimeNameECSFargate, RuntimeNameECSManagedInstances, + RuntimeNameCRINonstandard, } + + // nonstandardMetadata is used as a map key in GetCollector() when the NonstandardCRIRuntime feature is present + nonstandardMetadata = NewRuntimeMetadata(string(RuntimeNameCRINonstandard), "") ) // RuntimeFlavor is a typed string for supported container runtime flavors @@ -148,6 +156,17 @@ func (mp *GenericProvider) GetCollector(r RuntimeMetadata) Collector { return runtime } + // if the nonstandard runtime feature is present that means + // the user supplied a runtime socket that does not map to any of our known + // runtimes: containerd, cri-o + if env.IsFeaturePresent(env.NonstandardCRIRuntime) { + log.Debugf("Overriding collector runtime from %s to %s", r.String(), nonstandardMetadata.String()) + + if runtime, found := mp.collectors[nonstandardMetadata]; found { + return runtime + } + } + return nil } diff --git a/releasenotes/notes/nonstandard-cri-runtime-support-1c3fdee8ea681fda.yaml b/releasenotes/notes/nonstandard-cri-runtime-support-1c3fdee8ea681fda.yaml new file mode 100644 index 00000000000000..cffe1bcc4a252a --- /dev/null +++ b/releasenotes/notes/nonstandard-cri-runtime-support-1c3fdee8ea681fda.yaml @@ -0,0 +1,12 @@ +# Each section from every release note are combined when the +# CHANGELOG.rst is rendered. So the text needs to be worded so that +# it does not depend on any information only available in another +# section. This may mean repeating some details, but each section +# must be readable independently of the other. +# +# Each section note must be formatted as reStructuredText. +--- +enhancements: + - | + Add container metric support for any CRI compliant runtime specified in + the `cri_socket_path` configuration.