From 40d120490638e9a6fa1daa10b0646dfa45c66f8d Mon Sep 17 00:00:00 2001 From: AquoDev <14019792+AquoDev@users.noreply.github.com> Date: Mon, 9 Nov 2020 09:06:51 +0100 Subject: [PATCH] [New feature] Added metrics --- cmd/kube-nftlb-client/main.go | 4 ++++ pkg/controller/endpoints.go | 6 +++++ pkg/controller/service.go | 6 +++++ pkg/metrics/endpoints.go | 19 +++++++++++++++ pkg/metrics/server.go | 45 +++++++++++++++++++++++++++++++++++ pkg/metrics/services.go | 19 +++++++++++++++ yaml/kube-nftlb-ds.yaml | 2 ++ 7 files changed, 101 insertions(+) create mode 100644 pkg/metrics/endpoints.go create mode 100644 pkg/metrics/server.go create mode 100644 pkg/metrics/services.go diff --git a/cmd/kube-nftlb-client/main.go b/cmd/kube-nftlb-client/main.go index 6d8b3eb..8ce2164 100644 --- a/cmd/kube-nftlb-client/main.go +++ b/cmd/kube-nftlb-client/main.go @@ -3,6 +3,7 @@ package main import ( "github.com/zevenet/kube-nftlb/pkg/auth" "github.com/zevenet/kube-nftlb/pkg/controller" + "github.com/zevenet/kube-nftlb/pkg/metrics" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/tools/cache" ) @@ -19,6 +20,9 @@ func main() { // TODO Enable NetworkPolicyController after nftlb fully supports policies } + // Start metrics server + go metrics.StartServer() + // Run controllers as background processes for _, controller := range controllers { go controller.Run(wait.NeverStop) diff --git a/pkg/controller/endpoints.go b/pkg/controller/endpoints.go index 419b148..54e6690 100644 --- a/pkg/controller/endpoints.go +++ b/pkg/controller/endpoints.go @@ -6,6 +6,7 @@ import ( "github.com/zevenet/kube-nftlb/pkg/http" "github.com/zevenet/kube-nftlb/pkg/log" + "github.com/zevenet/kube-nftlb/pkg/metrics" "github.com/zevenet/kube-nftlb/pkg/parser" "github.com/zevenet/kube-nftlb/pkg/types" "github.com/zevenet/kube-nftlb/pkg/watcher" @@ -60,12 +61,16 @@ func AddNftlbBackends(obj interface{}) { } log.WriteLog(types.StandardLog, fmt.Sprintf("AddNftlbBackends: Endpoints name: %s\n%s", ep.Name, nftlbJSON)) + metrics.EndpointsChangesPending.Inc() + metrics.EndpointsChangesTotal.Inc() // Get the response from that request response, err := http.Send(&types.RequestData{ Method: "POST", Path: "farms", Body: strings.NewReader(nftlbJSON), }) + metrics.EndpointsChangesPending.Dec() + if err != nil { log.WriteLog(types.ErrorLog, fmt.Sprintf("AddNftlbBackends: Endpoints name: %s\n%s", ep.Name, err.Error())) return @@ -76,6 +81,7 @@ func AddNftlbBackends(obj interface{}) { // DeleteNftlbBackends func DeleteNftlbBackends(obj interface{}) { + metrics.EndpointsChangesTotal.Inc() ep := obj.(*corev1.Endpoints) pathsChan := make(chan string) diff --git a/pkg/controller/service.go b/pkg/controller/service.go index 48ca387..c0a6213 100644 --- a/pkg/controller/service.go +++ b/pkg/controller/service.go @@ -6,6 +6,7 @@ import ( "github.com/zevenet/kube-nftlb/pkg/http" "github.com/zevenet/kube-nftlb/pkg/log" + "github.com/zevenet/kube-nftlb/pkg/metrics" "github.com/zevenet/kube-nftlb/pkg/parser" "github.com/zevenet/kube-nftlb/pkg/types" "github.com/zevenet/kube-nftlb/pkg/watcher" @@ -56,12 +57,16 @@ func AddNftlbFarm(obj interface{}) { return } + metrics.ServicesChangesPending.Inc() + metrics.ServicesChangesTotal.Inc() // Send that JSON data to nftlb response, err := http.Send(&types.RequestData{ Method: "POST", Path: "farms", Body: strings.NewReader(nftlbJSON), }) + metrics.ServicesChangesPending.Dec() + if err != nil { log.WriteLog(types.ErrorLog, fmt.Sprintf("AddNftlbFarms: Service name: %s\n%s", svc.Name, err.Error())) return @@ -73,6 +78,7 @@ func AddNftlbFarm(obj interface{}) { // DeleteNftlbFarm takes in a Service object (k8s) and deletes the farm related to the service and its addresses (nftlb). func DeleteNftlbFarm(obj interface{}) { + metrics.ServicesChangesTotal.Inc() svc := obj.(*corev1.Service) // Make channel where paths will come through diff --git a/pkg/metrics/endpoints.go b/pkg/metrics/endpoints.go new file mode 100644 index 0000000..f5031d1 --- /dev/null +++ b/pkg/metrics/endpoints.go @@ -0,0 +1,19 @@ +package metrics + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +var ( + EndpointsChangesPending = prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "kube_nftlb", + Name: "rules_endpoints_changes_pending", + Help: "How many Endpoints are pending to apply", + }) + + EndpointsChangesTotal = prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: "kube_nftlb", + Name: "rules_endpoints_changes_total", + Help: "How many Endpoints changes have happened", + }) +) diff --git a/pkg/metrics/server.go b/pkg/metrics/server.go new file mode 100644 index 0000000..cb394aa --- /dev/null +++ b/pkg/metrics/server.go @@ -0,0 +1,45 @@ +package metrics + +import ( + "flag" + "log" + "net/http" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +var ( + defaultAddress = ":9195" + address = flag.String("listen-address", defaultAddress, "The address to listen on for HTTP requests.") + collectors = []prometheus.Collector{ + EndpointsChangesPending, + EndpointsChangesTotal, + ServicesChangesPending, + ServicesChangesTotal, + } +) + +func StartServer() { + flag.Parse() + + if *address == "" { + *address = defaultAddress + } + + for _, collector := range collectors { + prometheus.MustRegister(collector) + } + + http.Handle("/metrics", promhttp.Handler()) + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(` +