Skip to content

Commit 43add2d

Browse files
committed
feat(helm): add opt-in controller metrics Service
Surface the controller manager's /metrics endpoint through a dedicated Service so cluster scrapers can target it without port-forwarding to individual pods. The new resource is gated on `controller.metrics.enabled` and defaults off so existing installations are unchanged. The Service mirrors the kmcp sub-chart layout (separate metrics Service, named `https` port) to keep the umbrella chart internally consistent and to let users author one ServiceMonitor pattern that targets both controllers. RBAC and Deployment wiring follow in subsequent commits.
1 parent 526107f commit 43add2d

3 files changed

Lines changed: 124 additions & 0 deletions

File tree

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{{- if .Values.controller.metrics.enabled }}
2+
apiVersion: v1
3+
kind: Service
4+
metadata:
5+
name: {{ include "kagent.fullname" . }}-controller-metrics
6+
namespace: {{ include "kagent.namespace" . }}
7+
labels:
8+
{{- include "kagent.controller.labels" . | nindent 4 }}
9+
spec:
10+
type: {{ .Values.controller.metrics.service.type }}
11+
ports:
12+
- name: {{ ternary "https" "http-metrics" .Values.controller.metrics.secureServing }}
13+
port: {{ .Values.controller.metrics.service.port }}
14+
targetPort: {{ .Values.controller.metrics.service.targetPort }}
15+
protocol: TCP
16+
selector:
17+
{{- include "kagent.controller.selectorLabels" . | nindent 4 }}
18+
{{- end }}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
suite: test controller metrics service
2+
templates:
3+
- controller-metrics-service.yaml
4+
tests:
5+
- it: should not render by default
6+
asserts:
7+
- hasDocuments:
8+
count: 0
9+
10+
- it: should render when metrics are enabled
11+
set:
12+
controller.metrics.enabled: true
13+
asserts:
14+
- isKind:
15+
of: Service
16+
- equal:
17+
path: metadata.name
18+
value: RELEASE-NAME-controller-metrics
19+
- equal:
20+
path: spec.type
21+
value: ClusterIP
22+
- hasDocuments:
23+
count: 1
24+
25+
- it: should expose https port from values
26+
set:
27+
controller.metrics.enabled: true
28+
asserts:
29+
- equal:
30+
path: spec.ports[0].name
31+
value: https
32+
- equal:
33+
path: spec.ports[0].port
34+
value: 8443
35+
- equal:
36+
path: spec.ports[0].targetPort
37+
value: 8443
38+
- equal:
39+
path: spec.ports[0].protocol
40+
value: TCP
41+
42+
- it: should respect custom port and targetPort
43+
set:
44+
controller.metrics.enabled: true
45+
controller.metrics.service.port: 9443
46+
controller.metrics.service.targetPort: 9443
47+
asserts:
48+
- equal:
49+
path: spec.ports[0].port
50+
value: 9443
51+
- equal:
52+
path: spec.ports[0].targetPort
53+
value: 9443
54+
55+
- it: should rename port when secure serving disabled
56+
set:
57+
controller.metrics.enabled: true
58+
controller.metrics.secureServing: false
59+
asserts:
60+
- equal:
61+
path: spec.ports[0].name
62+
value: http-metrics
63+
64+
- it: should select controller pods
65+
set:
66+
controller.metrics.enabled: true
67+
asserts:
68+
- equal:
69+
path: spec.selector["app.kubernetes.io/name"]
70+
value: kagent
71+
- equal:
72+
path: spec.selector["app.kubernetes.io/instance"]
73+
value: RELEASE-NAME
74+
- equal:
75+
path: spec.selector["app.kubernetes.io/component"]
76+
value: controller
77+
78+
- it: should be in correct namespace
79+
set:
80+
controller.metrics.enabled: true
81+
asserts:
82+
- equal:
83+
path: metadata.namespace
84+
value: NAMESPACE
85+
86+
- it: should use custom namespace when overridden
87+
set:
88+
controller.metrics.enabled: true
89+
namespaceOverride: "custom-namespace"
90+
asserts:
91+
- equal:
92+
path: metadata.namespace
93+
value: custom-namespace

helm/kagent/values.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,19 @@ controller:
222222
ports:
223223
port: 8083
224224
targetPort: 8083
225+
# -- Prometheus-style /metrics endpoint for the controller manager.
226+
# When enabled, provisions a dedicated metrics Service plus the ClusterRoles
227+
# required for authenticated scrapes. Bind `<fullname>-metrics-reader` to
228+
# your Prometheus ServiceAccount to grant scrape access.
229+
# @default -- disabled
230+
metrics:
231+
enabled: false
232+
bindAddress: ":8443"
233+
secureServing: true
234+
service:
235+
type: ClusterIP
236+
port: 8443
237+
targetPort: 8443
225238
env: []
226239
envFrom: []
227240

0 commit comments

Comments
 (0)