Skip to content

Commit 272a47c

Browse files
add controllerrevisions collection in ksm check for agents > 7.72.x (#2249)
* add controllerrevisions collection for agents > 7.72.x * add test coverage for controller revisions * fix version check, expected to fail e2e if no image override is available and agent is >7.72 * use default agent images if override not present * removes logging * Remove explicit controllerrevisions setting * remove logging * pass default value to min version func * controller revisions enabled by default --------- Co-authored-by: Fanny Jiang <[email protected]>
1 parent 24f1c33 commit 272a47c

File tree

16 files changed

+326
-100
lines changed

16 files changed

+326
-100
lines changed

cmd/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ func run(opts *options) error {
378378

379379
if versionInfo != nil {
380380
gitVersion := versionInfo.GitVersion
381-
if !utils.IsAboveMinVersion(gitVersion, "1.16-0") {
381+
if !utils.IsAboveMinVersion(gitVersion, "1.16-0", nil) {
382382
setupLog.Error(nil, "Detected Kubernetes version <1.16 which requires CRD version apiextensions.k8s.io/v1beta1. "+
383383
"CRDs of this version were removed in v1.10.0.")
384384
}

config/rbac/role.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,13 @@ rules:
9797
- apiservices
9898
verbs:
9999
- '*'
100+
- apiGroups:
101+
- apps
102+
resources:
103+
- controllerrevisions
104+
verbs:
105+
- list
106+
- watch
100107
- apiGroups:
101108
- apps
102109
resources:

internal/controller/datadogagent/common/utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,5 +142,5 @@ func ShouldCreateAgentLocalService(versionInfo *version.Info, forceEnableLocalSe
142142
return false
143143
}
144144
// Service Internal Traffic Policy is enabled by default since 1.22
145-
return utils.IsAboveMinVersion(versionInfo.GitVersion, localServiceDefaultMinimumVersion) || forceEnableLocalService
145+
return utils.IsAboveMinVersion(versionInfo.GitVersion, localServiceDefaultMinimumVersion, nil) || forceEnableLocalService
146146
}

internal/controller/datadogagent/feature/apm/feature.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,10 +388,10 @@ func supportsInstrumentationTargets(ddaSpec *v2alpha1.DatadogAgentSpec) bool {
388388
// Agent version must >= 7.64.0 to run feature in core agent
389389
if nodeAgent, ok := ddaSpec.Override[v2alpha1.ClusterAgentComponentName]; ok {
390390
if nodeAgent.Image != nil {
391-
return utils.IsAboveMinVersion(common.GetAgentVersionFromImage(*nodeAgent.Image), minInstrumentationTargetsVersion)
391+
return utils.IsAboveMinVersion(common.GetAgentVersionFromImage(*nodeAgent.Image), minInstrumentationTargetsVersion, nil)
392392
}
393393
}
394-
return utils.IsAboveMinVersion(images.ClusterAgentLatestVersion, minInstrumentationTargetsVersion)
394+
return utils.IsAboveMinVersion(images.ClusterAgentLatestVersion, minInstrumentationTargetsVersion, nil)
395395
}
396396

397397
// ManageSingleContainerNodeAgent allows a feature to configure the Agent container for the Node Agent's corev1.PodTemplateSpec

internal/controller/datadogagent/feature/kubernetesstatecore/configmap.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ instances:
9292
config.WriteString(" - apiservices\n")
9393
}
9494

95+
if collectorOpts.enableControllerRevisions {
96+
config.WriteString(" - controllerrevisions\n")
97+
}
98+
9599
if collectorOpts.enableCRD {
96100
config.WriteString(" - customresourcedefinitions\n")
97101
}

internal/controller/datadogagent/feature/kubernetesstatecore/configmap_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ instances:
3030
optionsWithVPA := collectorOptions{enableVPA: true}
3131
optionsWithCRD := collectorOptions{enableCRD: true}
3232
optionsWithAPIService := collectorOptions{enableAPIService: true}
33+
optionsWithControllerRevisions := collectorOptions{enableControllerRevisions: true}
3334

3435
// Test custom resources
3536
optionsWithCustomResources := collectorOptions{
@@ -159,6 +160,17 @@ instances:
159160
},
160161
want: buildDefaultConfigMap(owner.GetNamespace(), defaultKubeStateMetricsCoreConf, ksmCheckConfig(true, optionsWithAPIService)),
161162
},
163+
{
164+
name: "with ControllerRevisions",
165+
fields: fields{
166+
owner: owner,
167+
enable: true,
168+
runInClusterChecksRunner: true,
169+
configConfigMapName: defaultKubeStateMetricsCoreConf,
170+
collectorOpts: optionsWithControllerRevisions,
171+
},
172+
want: buildDefaultConfigMap(owner.GetNamespace(), defaultKubeStateMetricsCoreConf, ksmCheckConfig(true, optionsWithControllerRevisions)),
173+
},
162174
{
163175
name: "with custom resources",
164176
fields: fields{

internal/controller/datadogagent/feature/kubernetesstatecore/feature.go

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,11 @@ func buildKSMFeature(options *feature.Options) feature.Feature {
4646
}
4747

4848
type ksmFeature struct {
49-
runInClusterChecksRunner bool
50-
collectCRDMetrics bool
51-
collectCrMetrics []v2alpha1.Resource
52-
collectAPIServiceMetrics bool
49+
runInClusterChecksRunner bool
50+
collectCRDMetrics bool
51+
collectCrMetrics []v2alpha1.Resource
52+
collectAPIServiceMetrics bool
53+
collectControllerRevisions bool
5354

5455
rbacSuffix string
5556
serviceAccountName string
@@ -63,9 +64,14 @@ type ksmFeature struct {
6364
logger logr.Logger
6465
}
6566

66-
// Minimum agent version that supports collection of CRD and APIService data
67-
// Add "-0" so that prerelase versions are considered sufficient. https://github.com/Masterminds/semver#working-with-prerelease-versions
68-
const crdAPIServiceCollectionMinVersion = "7.46.0-0"
67+
const (
68+
// Minimum agent version that supports collection of CRD and APIService data
69+
// Add "-0" so that prerelase versions are considered sufficient. https://github.com/Masterminds/semver#working-with-prerelease-versions
70+
crdAPIServiceCollectionMinVersion = "7.46.0-0"
71+
72+
// Minimum agent version that supports collection of controllerrevisions
73+
controllerRevisionsCollectionMinVersion = "7.72.0-0"
74+
)
6975

7076
// ID returns the ID of the Feature
7177
func (f *ksmFeature) ID() feature.IDType {
@@ -88,6 +94,10 @@ func (f *ksmFeature) Configure(dda metav1.Object, ddaSpec *v2alpha1.DatadogAgent
8894
f.collectCrMetrics = ddaSpec.Features.KubeStateMetricsCore.CollectCrMetrics
8995
f.serviceAccountName = constants.GetClusterAgentServiceAccount(dda.GetName(), ddaSpec)
9096

97+
// Determine CollectControllerRevisions setting
98+
// Default to true, then check version requirements
99+
f.collectControllerRevisions = true
100+
91101
// This check will only run in the Cluster Checks Runners or Cluster Agent (not the Node Agent)
92102
if ddaSpec.Features.ClusterChecks != nil && apiutils.BoolValue(ddaSpec.Features.ClusterChecks.Enabled) && apiutils.BoolValue(ddaSpec.Features.ClusterChecks.UseClusterChecksRunners) {
93103
f.runInClusterChecksRunner = true
@@ -97,17 +107,39 @@ func (f *ksmFeature) Configure(dda metav1.Object, ddaSpec *v2alpha1.DatadogAgent
97107
output.ClusterChecksRunner.Containers = []apicommon.AgentContainerName{apicommon.CoreAgentContainerName}
98108

99109
if ccrOverride, ok := ddaSpec.Override[v2alpha1.ClusterChecksRunnerComponentName]; ok {
100-
if ccrOverride.Image != nil && !utils.IsAboveMinVersion(common.GetAgentVersionFromImage(*ccrOverride.Image), crdAPIServiceCollectionMinVersion) {
101-
// Disable if image is overridden to an unsupported version
102-
f.collectAPIServiceMetrics = false
103-
f.collectCRDMetrics = false
110+
if ccrOverride.Image != nil {
111+
agentVersion := common.GetAgentVersionFromImage(*ccrOverride.Image)
112+
113+
// CRD and APIService version checks
114+
if !utils.IsAboveMinVersion(agentVersion, crdAPIServiceCollectionMinVersion, nil) {
115+
f.collectAPIServiceMetrics = false
116+
f.collectCRDMetrics = false
117+
}
118+
119+
// ControllerRevisions version check - enable if version supports it
120+
fallback := false
121+
if !utils.IsAboveMinVersion(agentVersion, controllerRevisionsCollectionMinVersion, &fallback) {
122+
f.collectControllerRevisions = false
123+
}
104124
}
105125
}
106-
} else if clusterAgentOverride, ok := ddaSpec.Override[v2alpha1.ClusterAgentComponentName]; ok {
107-
if clusterAgentOverride.Image != nil && !utils.IsAboveMinVersion(common.GetAgentVersionFromImage(*clusterAgentOverride.Image), crdAPIServiceCollectionMinVersion) {
108-
// Disable if image is overridden to an unsupported version
109-
f.collectAPIServiceMetrics = false
110-
f.collectCRDMetrics = false
126+
} else {
127+
if clusterAgentOverride, ok := ddaSpec.Override[v2alpha1.ClusterAgentComponentName]; ok {
128+
if clusterAgentOverride.Image != nil {
129+
agentVersion := common.GetAgentVersionFromImage(*clusterAgentOverride.Image)
130+
131+
// CRD and APIService version checks
132+
if !utils.IsAboveMinVersion(agentVersion, crdAPIServiceCollectionMinVersion, nil) {
133+
f.collectAPIServiceMetrics = false
134+
f.collectCRDMetrics = false
135+
}
136+
137+
// ControllerRevisions version check - enable if version supports it
138+
fallback := false
139+
if !utils.IsAboveMinVersion(agentVersion, controllerRevisionsCollectionMinVersion, &fallback) {
140+
f.collectControllerRevisions = false
141+
}
142+
}
111143
}
112144
}
113145

@@ -146,10 +178,11 @@ func (f *ksmFeature) Configure(dda metav1.Object, ddaSpec *v2alpha1.DatadogAgent
146178
}
147179

148180
type collectorOptions struct {
149-
enableVPA bool
150-
enableAPIService bool
151-
enableCRD bool
152-
customResources []v2alpha1.Resource
181+
enableVPA bool
182+
enableAPIService bool
183+
enableCRD bool
184+
enableControllerRevisions bool
185+
customResources []v2alpha1.Resource
153186
}
154187

155188
// ManageDependencies allows a feature to manage its dependencies.
@@ -159,10 +192,11 @@ func (f *ksmFeature) ManageDependencies(managers feature.ResourceManagers, provi
159192
// OR if the default configMap is needed.
160193
pInfo := managers.Store().GetPlatformInfo()
161194
collectorOpts := collectorOptions{
162-
enableVPA: pInfo.IsResourceSupported("VerticalPodAutoscaler"),
163-
enableAPIService: f.collectAPIServiceMetrics,
164-
enableCRD: f.collectCRDMetrics,
165-
customResources: f.collectCrMetrics,
195+
enableVPA: pInfo.IsResourceSupported("VerticalPodAutoscaler"),
196+
enableAPIService: f.collectAPIServiceMetrics,
197+
enableCRD: f.collectCRDMetrics,
198+
enableControllerRevisions: f.collectControllerRevisions,
199+
customResources: f.collectCrMetrics,
166200
}
167201
configCM, err := f.buildKSMCoreConfigMap(collectorOpts)
168202
if err != nil {

internal/controller/datadogagent/feature/kubernetesstatecore/feature_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,50 @@ func Test_ksmFeature_Configure(t *testing.T) {
9090
ClusterAgent: ksmClusterAgentWantFunc(true),
9191
Agent: test.NewDefaultComponentTest().WithWantFunc(ksmAgentSingleAgentWantFunc),
9292
},
93+
{
94+
Name: "ksm-core enabled, cluster agent with image >= 7.72.0",
95+
DDA: testutils.NewDatadogAgentBuilder().
96+
WithKSMEnabled(true).
97+
WithClusterAgentImage("gcr.io/datadoghq/agent:7.72.0").
98+
Build(),
99+
WantConfigure: true,
100+
ClusterAgent: ksmClusterAgentWantFunc(false),
101+
Agent: test.NewDefaultComponentTest().WithWantFunc(ksmAgentNodeWantFunc),
102+
},
103+
{
104+
Name: "ksm-core enabled, cluster agent with image < 7.72.0",
105+
DDA: testutils.NewDatadogAgentBuilder().
106+
WithKSMEnabled(true).
107+
WithClusterAgentImage("gcr.io/datadoghq/agent:7.71.0").
108+
Build(),
109+
WantConfigure: true,
110+
ClusterAgent: ksmClusterAgentWantFunc(false),
111+
Agent: test.NewDefaultComponentTest().WithWantFunc(ksmAgentNodeWantFunc),
112+
},
113+
{
114+
Name: "ksm-core enabled, cluster checks runner with image >= 7.72.0",
115+
DDA: testutils.NewDatadogAgentBuilder().
116+
WithKSMEnabled(true).
117+
WithClusterChecks(true, true).
118+
WithClusterChecksRunnerImage("gcr.io/datadoghq/agent:7.72.0").
119+
Build(),
120+
WantConfigure: true,
121+
Agent: test.NewDefaultComponentTest().WithWantFunc(ksmAgentNodeWantFunc),
122+
ClusterAgent: test.NewDefaultComponentTest().WithWantFunc(func(t testing.TB, mgrInterface feature.PodTemplateManagers) {}),
123+
ClusterChecksRunner: test.NewDefaultComponentTest().WithWantFunc(func(t testing.TB, mgrInterface feature.PodTemplateManagers) {}),
124+
},
125+
{
126+
Name: "ksm-core enabled, cluster checks runner with image < 7.72.0",
127+
DDA: testutils.NewDatadogAgentBuilder().
128+
WithKSMEnabled(true).
129+
WithClusterChecks(true, true).
130+
WithClusterChecksRunnerImage("gcr.io/datadoghq/agent:7.71.0").
131+
Build(),
132+
WantConfigure: true,
133+
Agent: test.NewDefaultComponentTest().WithWantFunc(ksmAgentNodeWantFunc),
134+
ClusterAgent: test.NewDefaultComponentTest().WithWantFunc(func(t testing.TB, mgrInterface feature.PodTemplateManagers) {}),
135+
ClusterChecksRunner: test.NewDefaultComponentTest().WithWantFunc(func(t testing.TB, mgrInterface feature.PodTemplateManagers) {}),
136+
},
93137
}
94138

95139
tests.Run(t, buildKSMFeature)

internal/controller/datadogagent/feature/kubernetesstatecore/rbac.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ func getRBACPolicyRules(collectorOpts collectorOptions) []rbacv1.PolicyRule {
4444
rbac.DeploymentsResource,
4545
rbac.ReplicasetsResource,
4646
rbac.StatefulsetsResource,
47+
rbac.ControllerRevisionsResource,
4748
},
4849
},
4950
{

internal/controller/datadogagent/feature/orchestratorexplorer/feature.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ func (f *orchestratorExplorerFeature) Configure(dda metav1.Object, ddaSpec *v2al
149149
reqContainers := []apicommon.AgentContainerName{apicommon.CoreAgentContainerName}
150150
// Process Agent is not required as of agent version 7.51.0
151151
if nodeAgent, ok := ddaSpec.Override[v2alpha1.NodeAgentComponentName]; ok {
152-
if nodeAgent.Image != nil && !utils.IsAboveMinVersion(common.GetAgentVersionFromImage(*nodeAgent.Image), NoProcessAgentMinVersion) {
152+
if nodeAgent.Image != nil && !utils.IsAboveMinVersion(common.GetAgentVersionFromImage(*nodeAgent.Image), NoProcessAgentMinVersion, nil) {
153153
f.processAgentRequired = true
154154
reqContainers = append(reqContainers, apicommon.ProcessAgentContainerName)
155155
}

0 commit comments

Comments
 (0)