Skip to content

Commit e5a2446

Browse files
authored
feat(metrics): add OTEL Prometheus metrics and custom recorder (#111)
* feat(metrics): add OTEL Prometheus metrics and custom recorder - Add internal/metrics package with OTEL Prometheus exporter and custom Recorder - Instrument controllers and tokenmanager with metrics recording - Update Helm chart to support metrics port/secure config and expose /metrics - Add e2e and unit tests for metrics - Update Go version and dependencies for OTEL support * fix(helm): template image repository in deployment.yaml
1 parent 659ca0b commit e5a2446

15 files changed

Lines changed: 1117 additions & 324 deletions

File tree

cmd/manager/main.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package main
1818

1919
import (
20+
"context"
2021
"crypto/tls"
2122
"flag"
2223
"os"
@@ -39,6 +40,7 @@ import (
3940

4041
githubv1 "github.com/isometry/github-token-manager/api/v1"
4142
"github.com/isometry/github-token-manager/internal/controller"
43+
"github.com/isometry/github-token-manager/internal/metrics"
4244
// +kubebuilder:scaffold:imports
4345
)
4446

@@ -87,6 +89,8 @@ func main() {
8789

8890
ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
8991

92+
ctx := ctrl.SetupSignalHandler()
93+
9094
if disableHTTP2 {
9195
forceHTTP11 := func(c *tls.Config) {
9296
setupLog.Info("disabling http/2")
@@ -191,16 +195,29 @@ func main() {
191195
os.Exit(1)
192196
}
193197

198+
metricsRecorder, err := metrics.Setup()
199+
if err != nil {
200+
setupLog.Error(err, "unable to set up metrics")
201+
os.Exit(1)
202+
}
203+
defer func() {
204+
if err := metricsRecorder.Shutdown(context.Background()); err != nil {
205+
setupLog.Error(err, "shutting down meter provider")
206+
}
207+
}()
208+
194209
if err = (&controller.TokenReconciler{
195-
Client: mgr.GetClient(),
210+
Client: mgr.GetClient(),
211+
Metrics: metricsRecorder,
196212
// Scheme: mgr.GetScheme(),
197213
// Recorder: mgr.GetEventRecorderFor("token-controller"),
198214
}).SetupWithManager(mgr); err != nil {
199215
setupLog.Error(err, "unable to create controller", "controller", "Token")
200216
os.Exit(1)
201217
}
202218
if err = (&controller.ClusterTokenReconciler{
203-
Client: mgr.GetClient(),
219+
Client: mgr.GetClient(),
220+
Metrics: metricsRecorder,
204221
// Scheme: mgr.GetScheme(),
205222
// Recorder: mgr.GetEventRecorderFor("clustertoken-controller"),
206223
}).SetupWithManager(mgr); err != nil {
@@ -235,7 +252,7 @@ func main() {
235252
}
236253

237254
setupLog.Info("starting manager")
238-
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
255+
if err := mgr.Start(ctx); err != nil {
239256
setupLog.Error(err, "problem running manager")
240257
os.Exit(1)
241258
}

config/rbac/role.yaml

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,51 @@ kind: ClusterRole
44
metadata:
55
name: manager-role
66
rules:
7-
- apiGroups:
8-
- ""
9-
resources:
10-
- events
11-
verbs:
12-
- create
13-
- patch
14-
- apiGroups:
15-
- ""
16-
resources:
17-
- secrets
18-
verbs:
19-
- create
20-
- delete
21-
- get
22-
- list
23-
- patch
24-
- update
25-
- watch
26-
- apiGroups:
27-
- github.as-code.io
28-
resources:
29-
- clustertokens
30-
- tokens
31-
verbs:
32-
- create
33-
- delete
34-
- get
35-
- list
36-
- patch
37-
- update
38-
- watch
39-
- apiGroups:
40-
- github.as-code.io
41-
resources:
42-
- clustertokens/finalizers
43-
- tokens/finalizers
44-
verbs:
45-
- update
46-
- apiGroups:
47-
- github.as-code.io
48-
resources:
49-
- clustertokens/status
50-
- tokens/status
51-
verbs:
52-
- get
53-
- patch
54-
- update
7+
- apiGroups:
8+
- ""
9+
resources:
10+
- events
11+
verbs:
12+
- create
13+
- patch
14+
- apiGroups:
15+
- ""
16+
resources:
17+
- secrets
18+
verbs:
19+
- create
20+
- delete
21+
- get
22+
- list
23+
- patch
24+
- update
25+
- watch
26+
- apiGroups:
27+
- github.as-code.io
28+
resources:
29+
- clustertokens
30+
- tokens
31+
verbs:
32+
- create
33+
- delete
34+
- get
35+
- list
36+
- patch
37+
- update
38+
- watch
39+
- apiGroups:
40+
- github.as-code.io
41+
resources:
42+
- clustertokens/finalizers
43+
- tokens/finalizers
44+
verbs:
45+
- update
46+
- apiGroups:
47+
- github.as-code.io
48+
resources:
49+
- clustertokens/status
50+
- tokens/status
51+
verbs:
52+
- get
53+
- patch
54+
- update

deploy/charts/github-token-manager/templates/deployment.yaml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,24 @@ spec:
4343
containers:
4444
- args:
4545
- --health-probe-bind-address=:8081
46-
- --metrics-bind-address=127.0.0.1:8080
46+
- --metrics-bind-address=:{{ .Values.metrics.listen.port }}
47+
- --metrics-secure={{ .Values.metrics.secure }}
4748
- --leader-elect
49+
{{- range $key, $value := $manager.extraArgs }}
50+
{{- if kindIs "invalid" $value }}
51+
- --{{ $key }}
52+
{{- else }}
53+
- --{{ $key }}={{ $value }}
54+
{{- end }}
55+
{{- end }}
4856
{{- with $manager.env }}
4957
env:
5058
{{- toYaml . | nindent 12 }}
5159
{{- end }}
5260
image: {{ if (hasPrefix "sha256:" (default "" $manager.tag)) -}}
53-
{{- printf "%s@%s" $manager.repository $manager.tag -}}
61+
{{- printf "%s@%s" (tpl $manager.repository .) $manager.tag -}}
5462
{{- else -}}
55-
{{- printf "%s:%s" $manager.repository (or $manager.tag $.Chart.AppVersion "latest") -}}
63+
{{- printf "%s:%s" (tpl $manager.repository .) (or $manager.tag $.Chart.AppVersion "latest") -}}
5664
{{- end }}
5765
livenessProbe:
5866
httpGet:

deploy/charts/github-token-manager/templates/service.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ metadata:
1414
component: service
1515
{{- include "labels" . | nindent 4 }}
1616
spec:
17-
{{- $service := .Values.metrics.service }}
1817
type: {{ .Values.metrics.service.type }}
1918
ports:
20-
{{ $service.ports | toYaml | nindent 4 }}
19+
- name: http-metrics
20+
port: {{ .Values.metrics.listen.port }}
21+
protocol: TCP
22+
targetPort: {{ .Values.metrics.listen.port }}
2123
selector:
2224
{{- include "selectorLabels" . | nindent 4 }}
2325
{{- end }}

deploy/charts/github-token-manager/values.yaml

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,18 @@ rbac:
3636

3737
## metrics:
3838
## enabled: true | false
39-
## service
39+
## listen:
40+
## port: port number for --metrics-bind-address=:<port>
41+
## secure: true | false (controls --metrics-secure flag; false = plain HTTP)
42+
## service:
4043
## type: ClusterIP | NodePort | LoadBalancer | ExternalName
41-
## ports: list of ports
42-
## name: name of the port
43-
## port: port number
44-
## protocol: protocol
45-
## targetPort: target port
4644
metrics:
4745
enabled: true
46+
listen:
47+
port: 8080
48+
secure: false
4849
service:
4950
type: ClusterIP
50-
ports:
51-
- name: https
52-
port: 8443
53-
protocol: TCP
54-
targetPort: https
5551

5652
## manager
5753
## repository: image repository
@@ -62,6 +58,11 @@ metrics:
6258
## nodeSelector: node selector (optional)
6359
## env: list of additional environment variables to set on the manager container
6460
## resources: manager container resource requests and limits
61+
## manager
62+
## repository: image repository
63+
## tag: image tag
64+
## replicas: number of replicas
65+
## extraArgs: map of additional CLI flags rendered as --key=value
6566
manager:
6667
repository: ghcr.io/isometry/github-token-manager
6768
tag: ~ # defaults to chart appVersion
@@ -72,6 +73,7 @@ manager:
7273
# additional environment variables to set on the controller container
7374
# e.g. `[{name: VAULT_ADDR, value: http://vault:8200}]`
7475
env: []
76+
extraArgs: {}
7577
resources:
7678
limits:
7779
cpu: 500m

0 commit comments

Comments
 (0)