Skip to content

Commit d1975e9

Browse files
committed
Add Go and Process metrics
Signed-off-by: Richard Wall <[email protected]>
1 parent ef5e834 commit d1975e9

File tree

3 files changed

+78
-9
lines changed

3 files changed

+78
-9
lines changed

cmd/app/app.go

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,20 @@ import (
2323
"crypto/x509"
2424
"encoding/pem"
2525
"fmt"
26+
"time"
2627

28+
"github.com/cert-manager/cert-manager/pkg/server"
2729
"github.com/cert-manager/csi-lib/driver"
2830
"github.com/cert-manager/csi-lib/manager"
2931
"github.com/cert-manager/csi-lib/manager/util"
3032
"github.com/cert-manager/csi-lib/metadata"
3133
"github.com/cert-manager/csi-lib/storage"
3234
"github.com/spf13/cobra"
35+
"golang.org/x/sync/errgroup"
3336
"k8s.io/utils/clock"
3437

3538
"github.com/cert-manager/csi-driver/cmd/app/options"
39+
"github.com/cert-manager/csi-driver/internal/metrics"
3640
"github.com/cert-manager/csi-driver/internal/version"
3741
csiapi "github.com/cert-manager/csi-driver/pkg/apis/v1alpha1"
3842
"github.com/cert-manager/csi-driver/pkg/filestore"
@@ -96,18 +100,46 @@ func NewCommand(ctx context.Context) *cobra.Command {
96100
return fmt.Errorf("failed to setup driver: " + err.Error())
97101
}
98102

99-
go func() {
103+
const metricsListenAddress = ":8080"
104+
// Start metrics server
105+
metricsLn, err := server.Listen("tcp", metricsListenAddress)
106+
if err != nil {
107+
return fmt.Errorf("failed to listen on prometheus address %s: %v", metricsListenAddress, err)
108+
}
109+
metricsServer := metrics.NewServer(metricsLn)
110+
111+
g, _ := errgroup.WithContext(ctx)
112+
g.Go(func() error {
100113
<-ctx.Done()
101114
log.Info("shutting down driver", "context", ctx.Err())
102115
d.Stop()
103-
}()
116+
return nil
117+
})
104118

105-
log.Info("running driver")
106-
if err := d.Run(); err != nil {
107-
return fmt.Errorf("failed running driver: " + err.Error())
108-
}
119+
g.Go(func() error {
120+
log.Info("running driver")
121+
if err := d.Run(); err != nil {
122+
return fmt.Errorf("failed running driver: " + err.Error())
123+
}
124+
return nil
125+
})
126+
127+
g.Go(func() error {
128+
<-ctx.Done()
129+
// allow a timeout for graceful shutdown
130+
shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
131+
defer cancel()
132+
133+
// nolint: contextcheck
134+
return metricsServer.Shutdown(shutdownCtx)
135+
})
136+
137+
g.Go(func() error {
138+
log.V(3).Info("starting metrics server", "address", metricsLn.Addr())
139+
return metricsServer.Serve(metricsLn)
140+
})
109141

110-
return nil
142+
return g.Wait()
111143
},
112144
}
113145

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ require (
88
github.com/go-logr/logr v1.4.2
99
github.com/onsi/ginkgo/v2 v2.19.0
1010
github.com/onsi/gomega v1.33.1
11+
github.com/prometheus/client_golang v1.18.0
1112
github.com/spf13/cobra v1.8.0
1213
github.com/spf13/pflag v1.0.5
1314
github.com/stretchr/testify v1.9.0
15+
golang.org/x/sync v0.7.0
1416
k8s.io/api v0.30.1
1517
k8s.io/apimachinery v0.30.1
1618
k8s.io/cli-runtime v0.30.1
@@ -70,7 +72,6 @@ require (
7072
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
7173
github.com/pkg/errors v0.9.1 // indirect
7274
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
73-
github.com/prometheus/client_golang v1.18.0 // indirect
7475
github.com/prometheus/client_model v0.6.1 // indirect
7576
github.com/prometheus/common v0.46.0 // indirect
7677
github.com/prometheus/procfs v0.15.0 // indirect
@@ -81,7 +82,6 @@ require (
8182
golang.org/x/crypto v0.23.0 // indirect
8283
golang.org/x/net v0.25.0 // indirect
8384
golang.org/x/oauth2 v0.20.0 // indirect
84-
golang.org/x/sync v0.7.0 // indirect
8585
golang.org/x/sys v0.20.0 // indirect
8686
golang.org/x/term v0.20.0 // indirect
8787
golang.org/x/text v0.15.0 // indirect

internal/metrics/metrics.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package metrics
2+
3+
import (
4+
"net"
5+
"net/http"
6+
"time"
7+
8+
"github.com/prometheus/client_golang/prometheus"
9+
"github.com/prometheus/client_golang/prometheus/collectors"
10+
"github.com/prometheus/client_golang/prometheus/promhttp"
11+
)
12+
13+
const (
14+
prometheusMetricsServerReadTimeout = 8 * time.Second
15+
prometheusMetricsServerWriteTimeout = 8 * time.Second
16+
prometheusMetricsServerMaxHeaderBytes = 1 << 20 // 1 MiB
17+
)
18+
19+
func NewServer(ln net.Listener) *http.Server {
20+
registry := prometheus.NewRegistry()
21+
registry.MustRegister(
22+
collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}),
23+
collectors.NewGoCollector(),
24+
)
25+
26+
mux := http.NewServeMux()
27+
mux.Handle("/metrics", promhttp.HandlerFor(registry, promhttp.HandlerOpts{}))
28+
29+
server := &http.Server{
30+
Addr: ln.Addr().String(),
31+
ReadTimeout: prometheusMetricsServerReadTimeout,
32+
WriteTimeout: prometheusMetricsServerWriteTimeout,
33+
MaxHeaderBytes: prometheusMetricsServerMaxHeaderBytes,
34+
Handler: mux,
35+
}
36+
return server
37+
}

0 commit comments

Comments
 (0)