From 3173a1fb35e3882b263d605d5e692cb58926855b Mon Sep 17 00:00:00 2001 From: saad-ali Date: Mon, 30 Dec 2019 16:37:11 -0800 Subject: [PATCH] Introduce metrics library --- README.md | 4 ++++ cmd/csi-snapshotter/main.go | 12 +++++++++++- cmd/csi-snapshotter/main_test.go | 4 +++- pkg/snapshotter/snapshotter_test.go | 6 ++++-- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9985fb37..2c55f080 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,10 @@ Install CSI Driver: * `--leader-election-namespace `: The namespace where the leader election resource exists. Defaults to the pod namespace if not set. +* `--metrics-address`: The TCP network address address where the prometheus metrics endpoint will run (example: `:8080` which corresponds to port 8080 on local host). The default is empty string, which means metrics endpoint is disabled. + +* `--metrics-path`: The HTTP path where prometheus metrics will be exposed. Default is `/metrics`. + #### Other recognized arguments * `--kubeconfig `: Path to Kubernetes client configuration that the snapshot controller uses to connect to Kubernetes API server. When omitted, default token provided by Kubernetes will be used. This option is useful only when the snapshot controller does not run as a Kubernetes pod, e.g. for debugging. diff --git a/cmd/csi-snapshotter/main.go b/cmd/csi-snapshotter/main.go index 3fd34d62..40da9049 100644 --- a/cmd/csi-snapshotter/main.go +++ b/cmd/csi-snapshotter/main.go @@ -36,6 +36,7 @@ import ( "github.com/container-storage-interface/spec/lib/go/csi" "github.com/kubernetes-csi/csi-lib-utils/connection" "github.com/kubernetes-csi/csi-lib-utils/leaderelection" + "github.com/kubernetes-csi/csi-lib-utils/metrics" csirpc "github.com/kubernetes-csi/csi-lib-utils/rpc" controller "github.com/kubernetes-csi/external-snapshotter/pkg/sidecar-controller" "github.com/kubernetes-csi/external-snapshotter/pkg/snapshotter" @@ -66,6 +67,9 @@ var ( leaderElection = flag.Bool("leader-election", false, "Enables leader election.") leaderElectionNamespace = flag.String("leader-election-namespace", "", "The namespace where the leader election resource exists. Defaults to the pod namespace if not set.") + + metricsAddress = flag.String("metrics-address", "", "The TCP network address address where the prometheus metrics endpoint will listen (example: `:8080`). The default is empty string, which means metrics endpoint is disabled.") + metricsPath = flag.String("metrics-path", "/metrics", "The HTTP path where prometheus metrics will be exposed. Default is `/metrics`.") ) var ( @@ -110,7 +114,11 @@ func main() { snapshotscheme.AddToScheme(scheme.Scheme) // Connect to CSI. - csiConn, err := connection.Connect(*csiAddress, connection.OnConnectionLoss(connection.ExitOnConnectionLoss())) + metricsManager := metrics.NewCSIMetricsManager("" /* driverName */) + csiConn, err := connection.Connect( + *csiAddress, + metricsManager, + connection.OnConnectionLoss(connection.ExitOnConnectionLoss())) if err != nil { klog.Errorf("error connecting to CSI driver: %v", err) os.Exit(1) @@ -128,6 +136,8 @@ func main() { } klog.V(2).Infof("CSI driver name: %q", driverName) + metricsManager.SetDriverName(driverName) + metricsManager.StartMetricsEndpoint(*metricsAddress, *metricsPath) // Check it's ready if err = csirpc.ProbeForever(csiConn, *csiTimeout); err != nil { diff --git a/cmd/csi-snapshotter/main_test.go b/cmd/csi-snapshotter/main_test.go index f13aba72..2bf0ac17 100644 --- a/cmd/csi-snapshotter/main_test.go +++ b/cmd/csi-snapshotter/main_test.go @@ -24,6 +24,7 @@ import ( "github.com/container-storage-interface/spec/lib/go/csi" "github.com/golang/mock/gomock" "github.com/kubernetes-csi/csi-lib-utils/connection" + "github.com/kubernetes-csi/csi-lib-utils/metrics" "github.com/kubernetes-csi/csi-test/driver" "google.golang.org/grpc" @@ -144,6 +145,7 @@ func createMockServer(t *testing.T) (*gomock.Controller, *driver.MockCSIDriver, mockController := gomock.NewController(t) identityServer := driver.NewMockIdentityServer(mockController) controllerServer := driver.NewMockControllerServer(mockController) + metricsManager := metrics.NewCSIMetricsManager("" /* driverName */) drv := driver.NewMockCSIDriver(&driver.MockCSIDriverServers{ Identity: identityServer, Controller: controllerServer, @@ -152,7 +154,7 @@ func createMockServer(t *testing.T) (*gomock.Controller, *driver.MockCSIDriver, // Create a client connection to it addr := drv.Address() - csiConn, err := connection.Connect(addr) + csiConn, err := connection.Connect(addr, metricsManager) if err != nil { return nil, nil, nil, nil, nil, err } diff --git a/pkg/snapshotter/snapshotter_test.go b/pkg/snapshotter/snapshotter_test.go index 073394b4..67cec6be 100644 --- a/pkg/snapshotter/snapshotter_test.go +++ b/pkg/snapshotter/snapshotter_test.go @@ -27,13 +27,14 @@ import ( "github.com/golang/mock/gomock" "github.com/golang/protobuf/ptypes" "github.com/kubernetes-csi/csi-lib-utils/connection" + "github.com/kubernetes-csi/csi-lib-utils/metrics" "github.com/kubernetes-csi/csi-test/driver" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" ) @@ -47,6 +48,7 @@ func createMockServer(t *testing.T) (*gomock.Controller, *driver.MockCSIDriver, mockController := gomock.NewController(t) identityServer := driver.NewMockIdentityServer(mockController) controllerServer := driver.NewMockControllerServer(mockController) + metricsManager := metrics.NewCSIMetricsManager("" /* driverName */) drv := driver.NewMockCSIDriver(&driver.MockCSIDriverServers{ Identity: identityServer, Controller: controllerServer, @@ -55,7 +57,7 @@ func createMockServer(t *testing.T) (*gomock.Controller, *driver.MockCSIDriver, // Create a client connection to it addr := drv.Address() - csiConn, err := connection.Connect(addr) + csiConn, err := connection.Connect(addr, metricsManager) if err != nil { return nil, nil, nil, nil, nil, err }