@@ -28,20 +28,25 @@ import (
2828 "flag"
2929 "fmt"
3030 "net"
31+ "net/http"
3132 "net/url"
3233 "strings"
3334 "time"
3435
3536 cmapi "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
3637 cmmeta "github.com/cert-manager/cert-manager/pkg/apis/meta/v1"
3738 cmclient "github.com/cert-manager/cert-manager/pkg/client/clientset/versioned"
39+ "github.com/cert-manager/cert-manager/pkg/client/informers/externalversions"
3840 "github.com/cert-manager/cert-manager/pkg/util/pki"
3941 "github.com/cert-manager/csi-lib/driver"
4042 "github.com/cert-manager/csi-lib/manager"
4143 "github.com/cert-manager/csi-lib/metadata"
44+ "github.com/cert-manager/csi-lib/metrics"
4245 "github.com/cert-manager/csi-lib/storage"
46+ "github.com/prometheus/client_golang/prometheus"
47+ "golang.org/x/sync/errgroup"
4348 "k8s.io/client-go/rest"
44- "k8s.io/klog/v2/klogr "
49+ "k8s.io/klog/v2"
4550 "k8s.io/utils/clock"
4651)
4752
@@ -89,7 +94,7 @@ func main() {
8994 panic ("-data-root must be set" )
9095 }
9196
92- log := klogr . New ()
97+ log := klog . TODO ()
9398
9499 restConfig , err := rest .InClusterConfig ()
95100 if err != nil {
@@ -103,13 +108,29 @@ func main() {
103108
104109 store .FSGroupVolumeAttributeKey = FsGroupKey
105110
106- d , err := driver .New (context .Background (), * endpoint , log , driver.Options {
111+ cmClient := cmclient .NewForConfigOrDie (restConfig )
112+
113+ ctx , cancel := context .WithCancel (context .Background ())
114+ defer cancel ()
115+
116+ certRequestInformerFactory := externalversions .NewSharedInformerFactory (cmClient , 5 * time .Second )
117+ certRequestInformer := certRequestInformerFactory .Certmanager ().V1 ().CertificateRequests ()
118+ metricsHandler := metrics .New (* nodeID , & log , prometheus .NewRegistry (), store , certRequestInformer .Lister ())
119+
120+ go func () {
121+ err := startMetricsServer (ctx , metricsHandler , certRequestInformerFactory )
122+ if err != nil {
123+ panic ("failed to setup metrics server: " + err .Error ())
124+ }
125+ }()
126+
127+ d , err := driver .New (ctx , * endpoint , log , driver.Options {
107128 DriverName : "csi.cert-manager.io" ,
108129 DriverVersion : "v0.0.1" ,
109130 NodeID : * nodeID ,
110131 Store : store ,
111132 Manager : manager .NewManagerOrDie (manager.Options {
112- Client : cmclient . NewForConfigOrDie ( restConfig ) ,
133+ Client : cmClient ,
113134 MetadataReader : store ,
114135 Clock : clock.RealClock {},
115136 Log : & log ,
@@ -118,6 +139,7 @@ func main() {
118139 GenerateRequest : generateRequest ,
119140 SignRequest : signRequest ,
120141 WriteKeypair : (& writer {store : store }).writeKeypair ,
142+ Metrics : metricsHandler ,
121143 }),
122144 })
123145 if err != nil {
@@ -350,3 +372,49 @@ func keyUsagesFromAttributes(usagesCSV string) []cmapi.KeyUsage {
350372
351373 return keyUsages
352374}
375+
376+ // startMetricsServer starts a server listening on port 9402, until the supplied context is cancelled,
377+ // after which the server will gracefully shutdown (within 5 seconds).
378+ func startMetricsServer (
379+ rootCtx context.Context ,
380+ metricsHandler * metrics.Metrics ,
381+ certRequestInformerFactory externalversions.SharedInformerFactory ,
382+ ) error {
383+ g , ctx := errgroup .WithContext (rootCtx )
384+
385+ listenConfig := & net.ListenConfig {}
386+ metricsLn , err := listenConfig .Listen (ctx , "tcp" , ":9402" )
387+ if err != nil {
388+ return err
389+ }
390+ metricsServer := & http.Server {
391+ Addr : metricsLn .Addr ().String (),
392+ ReadTimeout : 8 * time .Second ,
393+ WriteTimeout : 8 * time .Second ,
394+ MaxHeaderBytes : 1 << 20 , // 1 MiB
395+ Handler : metricsHandler .DefaultHandler (),
396+ }
397+
398+ g .Go (func () error {
399+ certRequestInformerFactory .Start (ctx .Done ())
400+ certRequestInformerFactory .WaitForCacheSync (ctx .Done ())
401+ return nil
402+ })
403+ g .Go (func () error {
404+ <- rootCtx .Done ()
405+ // allow a timeout for graceful shutdown
406+ shutdownCtx , cancel := context .WithTimeout (ctx , 5 * time .Second )
407+ defer cancel ()
408+
409+ // nolint: contextcheck
410+ return metricsServer .Shutdown (shutdownCtx )
411+ })
412+ g .Go (func () error {
413+ // starting metrics server
414+ if err := metricsServer .Serve (metricsLn ); err != http .ErrServerClosed {
415+ return err
416+ }
417+ return nil
418+ })
419+ return g .Wait ()
420+ }
0 commit comments