Skip to content
This repository was archived by the owner on Apr 11, 2024. It is now read-only.

Commit e655aa9

Browse files
dlipovetskyjimmidyson
authored andcommitted
feat: Add patch to configure containerd metrics (#44)
* feat: Add patch to configure containerd metrics
1 parent 5800608 commit e655aa9

File tree

6 files changed

+205
-0
lines changed

6 files changed

+205
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
+++
2+
title = "Containerd metrics"
3+
+++
4+
5+
Containerd exports metrics to a Prometheus endpoint. The metrics cover
6+
containerd itself, its plugins, e.g. CRI, and information about the
7+
containers managed by containerd.
8+
9+
There are currently no configuration options for metrics, and this
10+
customization will be automatically applied when the [provider-specific
11+
cluster configuration patch]({{< ref ".." >}}) is included in the
12+
`ClusterClass`.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[metrics]
2+
address = "0.0.0.0:1338"
3+
grpc_histogram = false
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright 2023 D2iQ, Inc. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package containerdmetrics
4+
5+
import (
6+
"context"
7+
8+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
9+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
10+
bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1"
11+
controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1"
12+
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
13+
ctrl "sigs.k8s.io/controller-runtime"
14+
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
15+
16+
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/patches"
17+
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/patches/selectors"
18+
)
19+
20+
type containerdMetricsPatchHandler struct{}
21+
22+
func NewPatch() *containerdMetricsPatchHandler {
23+
return &containerdMetricsPatchHandler{}
24+
}
25+
26+
func (h *containerdMetricsPatchHandler) Mutate(
27+
ctx context.Context,
28+
obj *unstructured.Unstructured,
29+
vars map[string]apiextensionsv1.JSON,
30+
holderRef runtimehooksv1.HolderReference,
31+
_ ctrlclient.ObjectKey,
32+
) error {
33+
log := ctrl.LoggerFrom(ctx).WithValues(
34+
"holderRef", holderRef,
35+
)
36+
37+
metricsConfigDropIn := generateMetricsConfigDropIn()
38+
39+
if err := patches.MutateIfApplicable(
40+
obj, vars, &holderRef, selectors.ControlPlane(), log,
41+
func(obj *controlplanev1.KubeadmControlPlaneTemplate) error {
42+
log.WithValues(
43+
"patchedObjectKind", obj.GetObjectKind().GroupVersionKind().String(),
44+
"patchedObjectName", ctrlclient.ObjectKeyFromObject(obj),
45+
).Info("adding containerd metrics config to control plane kubeadm config spec")
46+
obj.Spec.Template.Spec.KubeadmConfigSpec.Files = append(
47+
obj.Spec.Template.Spec.KubeadmConfigSpec.Files,
48+
metricsConfigDropIn,
49+
)
50+
51+
return nil
52+
}); err != nil {
53+
return err
54+
}
55+
56+
if err := patches.MutateIfApplicable(
57+
obj, vars, &holderRef, selectors.WorkersKubeadmConfigTemplateSelector(), log,
58+
func(obj *bootstrapv1.KubeadmConfigTemplate) error {
59+
log.WithValues(
60+
"patchedObjectKind", obj.GetObjectKind().GroupVersionKind().String(),
61+
"patchedObjectName", ctrlclient.ObjectKeyFromObject(obj),
62+
).Info("adding containerd metrics config to worker node kubeadm config template")
63+
obj.Spec.Template.Spec.Files = append(
64+
obj.Spec.Template.Spec.Files,
65+
metricsConfigDropIn)
66+
67+
return nil
68+
}); err != nil {
69+
return err
70+
}
71+
72+
return nil
73+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Copyright 2023 D2iQ, Inc. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package containerdmetrics
5+
6+
import (
7+
"testing"
8+
9+
. "github.com/onsi/ginkgo/v2"
10+
"github.com/onsi/gomega"
11+
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
12+
13+
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation"
14+
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/testutils/capitest"
15+
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/testutils/capitest/request"
16+
)
17+
18+
func TestContainerdMetricsPatch(t *testing.T) {
19+
gomega.RegisterFailHandler(Fail)
20+
RunSpecs(t, "Containerd metrics mutator suite")
21+
}
22+
23+
var _ = Describe("Generate containerd metrics patches", func() {
24+
// only add aws region patch
25+
patchGenerator := func() mutation.GeneratePatches {
26+
return mutation.NewMetaGeneratePatchesHandler("", NewPatch()).(mutation.GeneratePatches)
27+
}
28+
29+
testDefs := []capitest.PatchTestDef{
30+
{
31+
Name: "containerd metrics config added to control plane kubeadm config spec",
32+
RequestItem: request.NewKubeadmControlPlaneTemplateRequestItem(""),
33+
ExpectedPatchMatchers: []capitest.JSONPatchMatcher{
34+
{
35+
Operation: "add",
36+
Path: "/spec/template/spec/kubeadmConfigSpec/files",
37+
ValueMatcher: gomega.ContainElements(
38+
gomega.HaveKeyWithValue(
39+
"path", metricsConfigDropInFileOnRemote,
40+
),
41+
),
42+
},
43+
},
44+
},
45+
{
46+
Name: "containerd metrics config added to worker node kubeadm config template",
47+
Vars: []runtimehooksv1.Variable{
48+
capitest.VariableWithValue(
49+
"builtin",
50+
map[string]any{
51+
"machineDeployment": map[string]any{
52+
"class": "*",
53+
},
54+
},
55+
),
56+
},
57+
RequestItem: request.NewKubeadmConfigTemplateRequestItem(""),
58+
ExpectedPatchMatchers: []capitest.JSONPatchMatcher{
59+
{
60+
Operation: "add",
61+
Path: "/spec/template/spec/files",
62+
ValueMatcher: gomega.ContainElements(
63+
gomega.HaveKeyWithValue(
64+
"path", metricsConfigDropInFileOnRemote,
65+
),
66+
),
67+
},
68+
},
69+
},
70+
}
71+
72+
// create test node for each case
73+
for testIdx := range testDefs {
74+
tt := testDefs[testIdx]
75+
It(tt.Name, func() {
76+
capitest.AssertGeneratePatches(
77+
GinkgoT(),
78+
patchGenerator,
79+
&tt,
80+
)
81+
})
82+
}
83+
})
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright 2024 D2iQ, Inc. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package containerdmetrics
4+
5+
import (
6+
_ "embed"
7+
"path"
8+
9+
cabpkv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1"
10+
)
11+
12+
const (
13+
// TODO Factor out this constant to a common package.
14+
containerdPatchesDirOnRemote = "/etc/containerd/cre.d"
15+
)
16+
17+
var (
18+
//go:embed files/metrics-config.toml
19+
metricsConfigDropIn []byte
20+
metricsConfigDropInFileOnRemote = path.Join(
21+
containerdPatchesDirOnRemote,
22+
"metrics-config.toml",
23+
)
24+
)
25+
26+
func generateMetricsConfigDropIn() cabpkv1.File {
27+
return cabpkv1.File{
28+
Path: metricsConfigDropInFileOnRemote,
29+
Content: string(metricsConfigDropIn),
30+
Permissions: "0600",
31+
}
32+
}

pkg/handlers/generic/mutation/handlers.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation"
1010
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/cni/calico"
1111
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/auditpolicy"
12+
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/containerdmetrics"
1213
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/containerdrestart"
1314
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/etcd"
1415
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/extraapiservercertsans"
@@ -31,6 +32,7 @@ func MetaMutators(mgr manager.Manager) []mutation.MetaMutator {
3132
mirrors.NewPatch(mgr.GetClient()),
3233
calico.NewPatch(),
3334
users.NewPatch(),
35+
containerdmetrics.NewPatch(),
3436

3537
// Some patches may have changed containerd configuration.
3638
// We must restart containerd for the configuration to take effect.

0 commit comments

Comments
 (0)