@@ -28,18 +28,23 @@ 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"
4449 "k8s.io/klog/v2/klogr"
4550 "k8s.io/utils/clock"
@@ -103,13 +108,23 @@ 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+ metricsHandler , err := startMetricsServer (ctx , * nodeID , log , cmClient , store )
117+ if err != nil {
118+ panic ("failed to setup metrics server: " + err .Error ())
119+ }
120+
121+ d , err := driver .New (ctx , * endpoint , log , driver.Options {
107122 DriverName : "csi.cert-manager.io" ,
108123 DriverVersion : "v0.0.1" ,
109124 NodeID : * nodeID ,
110125 Store : store ,
111126 Manager : manager .NewManagerOrDie (manager.Options {
112- Client : cmclient . NewForConfigOrDie ( restConfig ) ,
127+ Client : cmClient ,
113128 MetadataReader : store ,
114129 Clock : clock.RealClock {},
115130 Log : & log ,
@@ -118,6 +133,7 @@ func main() {
118133 GenerateRequest : generateRequest ,
119134 SignRequest : signRequest ,
120135 WriteKeypair : (& writer {store : store }).writeKeypair ,
136+ Metrics : metricsHandler ,
121137 }),
122138 })
123139 if err != nil {
@@ -350,3 +366,62 @@ func keyUsagesFromAttributes(usagesCSV string) []cmapi.KeyUsage {
350366
351367 return keyUsages
352368}
369+
370+ // startMetricsServer starts a server listening on port 6443, until the supplied context is cancelled,
371+ // after which the server will gracefully shutdown (within 5 seconds).
372+ func startMetricsServer (
373+ rootCtx context.Context ,
374+ nodeId string ,
375+ logger logr.Logger ,
376+ cmClient * cmclient.Clientset ,
377+ metadataReader storage.MetadataReader ,
378+ ) (* metrics.Metrics , error ) {
379+ g , ctx := errgroup .WithContext (rootCtx )
380+ defer func () {
381+ if err := g .Wait (); err != nil {
382+ logger .Error (err , "fail to stop metric server" )
383+ }
384+ }()
385+
386+ metricsHandler := metrics .New (& logger , prometheus .NewRegistry ())
387+
388+ certRequestInformerFactory := externalversions .NewSharedInformerFactory (cmClient , 5 * time .Second )
389+ certRequestInformer := certRequestInformerFactory .Certmanager ().V1 ().CertificateRequests ()
390+ metricsHandler .SetupCertificateRequestCollector (nodeId , metadataReader , certRequestInformer .Lister ())
391+
392+ listenConfig := & net.ListenConfig {}
393+ metricsLn , err := listenConfig .Listen (ctx , "tcp" , "127.0.0.1:6443" )
394+ if err != nil {
395+ return nil , err
396+ }
397+ metricsServer := & http.Server {
398+ Addr : metricsLn .Addr ().String (),
399+ ReadTimeout : 8 * time .Second ,
400+ WriteTimeout : 8 * time .Second ,
401+ MaxHeaderBytes : 1 << 20 , // 1 MiB
402+ Handler : metricsHandler .DefaultHandler (),
403+ }
404+
405+ g .Go (func () error {
406+ certRequestInformerFactory .Start (ctx .Done ())
407+ certRequestInformerFactory .WaitForCacheSync (ctx .Done ())
408+ return nil
409+ })
410+ g .Go (func () error {
411+ <- rootCtx .Done ()
412+ // allow a timeout for graceful shutdown
413+ shutdownCtx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
414+ defer cancel ()
415+
416+ // nolint: contextcheck
417+ return metricsServer .Shutdown (shutdownCtx )
418+ })
419+ g .Go (func () error {
420+ logger .Info ("starting metrics server" , "address" , metricsLn .Addr ())
421+ if err := metricsServer .Serve (metricsLn ); err != http .ErrServerClosed {
422+ return err
423+ }
424+ return nil
425+ })
426+ return metricsHandler , nil
427+ }
0 commit comments