@@ -28,21 +28,27 @@ 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"
41+ "github.com/go-logr/logr"
42+ "github.com/prometheus/client_golang/prometheus"
43+ "golang.org/x/sync/errgroup"
3944 "k8s.io/client-go/rest"
4045 "k8s.io/klog/v2/klogr"
4146 "k8s.io/utils/clock"
4247
4348 "github.com/cert-manager/csi-lib/driver"
4449 "github.com/cert-manager/csi-lib/manager"
4550 "github.com/cert-manager/csi-lib/metadata"
51+ "github.com/cert-manager/csi-lib/metrics"
4652 "github.com/cert-manager/csi-lib/storage"
4753)
4854
@@ -104,13 +110,23 @@ func main() {
104110
105111 store .FSGroupVolumeAttributeKey = FsGroupKey
106112
107- d , err := driver .New (context .Background (), * endpoint , log , driver.Options {
113+ cmClient := cmclient .NewForConfigOrDie (restConfig )
114+
115+ ctx , cancel := context .WithCancel (context .Background ())
116+ defer cancel ()
117+
118+ metricsHandler , err := startMetricsServer (ctx , * nodeID , log , cmClient , store )
119+ if err != nil {
120+ panic ("failed to setup metrics server: " + err .Error ())
121+ }
122+
123+ d , err := driver .New (ctx , * endpoint , log , driver.Options {
108124 DriverName : "csi.cert-manager.io" ,
109125 DriverVersion : "v0.0.1" ,
110126 NodeID : * nodeID ,
111127 Store : store ,
112128 Manager : manager .NewManagerOrDie (manager.Options {
113- Client : cmclient . NewForConfigOrDie ( restConfig ) ,
129+ Client : cmClient ,
114130 MetadataReader : store ,
115131 Clock : clock.RealClock {},
116132 Log : & log ,
@@ -119,6 +135,7 @@ func main() {
119135 GenerateRequest : generateRequest ,
120136 SignRequest : signRequest ,
121137 WriteKeypair : (& writer {store : store }).writeKeypair ,
138+ Metrics : metricsHandler ,
122139 }),
123140 })
124141 if err != nil {
@@ -351,3 +368,62 @@ func keyUsagesFromAttributes(usagesCSV string) []cmapi.KeyUsage {
351368
352369 return keyUsages
353370}
371+
372+ // startMetricsServer starts a server listening on port 6443, until the supplied context is cancelled,
373+ // after which the server will gracefully shutdown (within 5 seconds).
374+ func startMetricsServer (
375+ rootCtx context.Context ,
376+ nodeId string ,
377+ logger logr.Logger ,
378+ cmClient * cmclient.Clientset ,
379+ metadataReader storage.MetadataReader ,
380+ ) (* metrics.Metrics , error ) {
381+ g , ctx := errgroup .WithContext (rootCtx )
382+ defer func () {
383+ if err := g .Wait (); err != nil {
384+ logger .Error (err , "fail to stop metric server" )
385+ }
386+ }()
387+
388+ metricsHandler := metrics .New (& logger , prometheus .NewRegistry ())
389+
390+ certRequestInformerFactory := externalversions .NewSharedInformerFactory (cmClient , 5 * time .Second )
391+ certRequestInformer := certRequestInformerFactory .Certmanager ().V1 ().CertificateRequests ()
392+ metricsHandler .SetupCertificateRequestCollector (nodeId , metadataReader , certRequestInformer .Lister ())
393+
394+ listenConfig := & net.ListenConfig {}
395+ metricsLn , err := listenConfig .Listen (ctx , "tcp" , "127.0.0.1:6443" )
396+ if err != nil {
397+ return nil , err
398+ }
399+ metricsServer := & http.Server {
400+ Addr : metricsLn .Addr ().String (),
401+ ReadTimeout : 8 * time .Second ,
402+ WriteTimeout : 8 * time .Second ,
403+ MaxHeaderBytes : 1 << 20 , // 1 MiB
404+ Handler : metricsHandler .DefaultHandler (),
405+ }
406+
407+ g .Go (func () error {
408+ certRequestInformerFactory .Start (ctx .Done ())
409+ certRequestInformerFactory .WaitForCacheSync (ctx .Done ())
410+ return nil
411+ })
412+ g .Go (func () error {
413+ <- rootCtx .Done ()
414+ // allow a timeout for graceful shutdown
415+ shutdownCtx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
416+ defer cancel ()
417+
418+ // nolint: contextcheck
419+ return metricsServer .Shutdown (shutdownCtx )
420+ })
421+ g .Go (func () error {
422+ logger .Info ("starting metrics server" , "address" , metricsLn .Addr ())
423+ if err := metricsServer .Serve (metricsLn ); err != http .ErrServerClosed {
424+ return err
425+ }
426+ return nil
427+ })
428+ return metricsHandler , nil
429+ }
0 commit comments