From 09d73349ae5bb17a5bff132b2e8b3d08655f9839 Mon Sep 17 00:00:00 2001 From: Hasegawa Takuya Date: Thu, 30 Jun 2022 22:19:01 +0900 Subject: [PATCH 1/2] Support input TLS certificates --- README.md | 42 +++++++++++++++++--------------- go.mod | 16 +++++++++++-- go.sum | 6 ++--- main.go | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 108 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index dfbd58b..b54dfd6 100644 --- a/README.md +++ b/README.md @@ -40,34 +40,23 @@ Name | Default | Require | Description MYSQLROUTER_EXPORTER_URL | - | yes | MySQL Router Rest API URL MYSQLROUTER_EXPORTER_USER | - | no | Username for REST API MYSQLROUTER_EXPORTER_PASS | - | no | Password for REST API +MYSQLROUTER_TLS_CACERT_PATH | - | no | TLS CA cert path +MYSQLROUTER_TLS_CERT_PATH | - | no | TLS cert path +MYSQLROUTER_TLS_KEY_PATH | - | no | TLS key path -You can also set it as a flag. - -Collector Flags ----------------- - -mysqlrouter_exporter can all get metrics. [MySQL Router REST API Reference](https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-rest-api-reference.html) - -Name | Default | Description --------------------------------------------------------|-----------|------------- -collect.metadata.status | false | Collect metrics from metadata status. CPU usage will increase. -collect.route.connections.byte_from_server | false | Collect metrics from route connections. CPU usage will increase. -collect.route.connections.byte_to_server | false | Collect metrics from route connections. CPU usage will increase. -collect.route.connections.time_started | false | Collect metrics from route connections. CPU usage will increase. -collect.route.connections.time_connected_to_server | false | Collect metrics from route connections. CPU usage will increase. -collect.route.connections.time_last_sent_to_server | false | Collect metrics from route connections. CPU usage will increase. -collect.route.connections.time_received_from_server | false | Collect metrics from route connections. CPU usage will increase. +You can also set it as a flag. See below. ``` -Usage: - mysqlrouter_exporter [OPTIONS] - Application Options: --url= MySQL Router Rest API URL [$MYSQLROUTER_EXPORTER_URL] --user= Username for REST API [$MYSQLROUTER_EXPORTER_USER] --pass= Password for REST API [$MYSQLROUTER_EXPORTER_PASS] -p, --listen-port= Listen port (default: 49152) + --tls-ca-cert-path= TLS CA cacert path [$MYSQLROUTER_TLS_CACERT_PATH] + --tls-cert-path= TLS cert path [$MYSQLROUTER_TLS_CERT_PATH] + --tls-key-path= TLS key path [$MYSQLROUTER_TLS_KEY_PATH] -k, --skip-tls-verify Skip TLS Verification + --collect-interval= Collect interval time in sec. (default: 2) --collect.metadata.status Collect metrics from metadata status. CPU usage will increase. --collect.route.connections.byte_from_server Collect metrics from route connections. CPU usage will increase. --collect.route.connections.byte_to_server Collect metrics from route connections. CPU usage will increase. @@ -81,6 +70,21 @@ Help Options: -h, --help Show this help message ``` +Collector Flags +---------------- + +mysqlrouter_exporter can all get metrics. [MySQL Router REST API Reference](https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-rest-api-reference.html) + +Name | Default | Description +-------------------------------------------------------|-----------|------------- +collect.metadata.status | false | Collect metrics from metadata status. CPU usage will increase. +collect.route.connections.byte_from_server | false | Collect metrics from route connections. CPU usage will increase. +collect.route.connections.byte_to_server | false | Collect metrics from route connections. CPU usage will increase. +collect.route.connections.time_started | false | Collect metrics from route connections. CPU usage will increase. +collect.route.connections.time_connected_to_server | false | Collect metrics from route connections. CPU usage will increase. +collect.route.connections.time_last_sent_to_server | false | Collect metrics from route connections. CPU usage will increase. +collect.route.connections.time_received_from_server | false | Collect metrics from route connections. CPU usage will increase. + Prometheus configuration ------------------------- ```yaml diff --git a/go.mod b/go.mod index c6c2d55..ce7d305 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,21 @@ module github.com/rluisr/mysqlrouter_exporter -go 1.16 +go 1.18 require ( github.com/jessevdk/go-flags v1.4.0 github.com/prometheus/client_golang v1.9.0 - github.com/rluisr/mysqlrouter-go v1.0.2 + github.com/rluisr/mysqlrouter-go v1.1.0 +) + +require ( + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/golang/protobuf v1.4.3 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.15.0 // indirect + github.com/prometheus/procfs v0.2.0 // indirect + golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e // indirect + google.golang.org/protobuf v1.23.0 // indirect ) diff --git a/go.sum b/go.sum index c83ac80..e5d0528 100644 --- a/go.sum +++ b/go.sum @@ -232,8 +232,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rluisr/mysqlrouter-go v1.0.2 h1:1vGFqx93JnSYBO1RPVj/Os/BRhPgfAFoT2BvgACPVqs= -github.com/rluisr/mysqlrouter-go v1.0.2/go.mod h1:wqvXtzYb5XI61KuBBHHel3HrQ5qVEVSTtdA6hcPU1QE= +github.com/rluisr/mysqlrouter-go v1.1.0 h1:iqoXX59qxZpjp6PpGvadj62vg4NJ1Fyl9x2ZSHDjF64= +github.com/rluisr/mysqlrouter-go v1.1.0/go.mod h1:FKRCaXsGh+xlfxb+3SgwVU/dQWjN0RDjSs1cDo5Gsfo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -259,7 +259,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -401,7 +400,6 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/main.go b/main.go index 165d72e..abce59a 100644 --- a/main.go +++ b/main.go @@ -1,10 +1,14 @@ package main import ( + "crypto/tls" + "crypto/x509" "fmt" + "io/ioutil" "log" "net/http" "os" + "path/filepath" "strconv" "time" @@ -15,6 +19,7 @@ import ( var ( mysqlRouterClient *mysqlrouter.Client + collectInterval = 2 * time.Second // default collect interval override with --collect-interval version string commit string @@ -26,8 +31,12 @@ var args struct { RestAPIUser string `short:"" long:"user" required:"false" env:"MYSQLROUTER_EXPORTER_USER" description:"Username for REST API"` RestAPIPass string `short:"" long:"pass" required:"false" env:"MYSQLROUTER_EXPORTER_PASS" description:"Password for REST API"` ListenPort int `short:"p" long:"listen-port" default:"49152" description:"Listen port"` + TLSCACertPath string `short:"" long:"tls-ca-cert-path" required:"false" env:"MYSQLROUTER_TLS_CACERT_PATH" description:"TLS CA cacert path"` + TLSCertPath string `short:"" long:"tls-cert-path" required:"false" env:"MYSQLROUTER_TLS_CERT_PATH" description:"TLS cert path"` + TLSKeyPath string `short:"" long:"tls-key-path" required:"false" env:"MYSQLROUTER_TLS_KEY_PATH" description:"TLS key path"` SkipTLSVerify bool `short:"k" long:"skip-tls-verify" description:"Skip TLS Verification"` + CollectInterval int `short:"" long:"collect-interval" required:"false" default:"2" description:"Collect interval time in sec."` CollectMetadataStatus bool `short:"" long:"collect.metadata.status" description:"Collect metrics from metadata status. CPU usage will increase."` CollectRouteConnectionsByteFromServer bool `short:"" long:"collect.route.connections.byte_from_server" description:"Collect metrics from route connections. CPU usage will increase."` CollectRouteConnectionsByteToServer bool `short:"" long:"collect.route.connections.byte_to_server" description:"Collect metrics from route connections. CPU usage will increase."` @@ -40,8 +49,7 @@ var args struct { } const ( - nameSpace = "mysqlrouter" - collectInterval = 2 * time.Second + nameSpace = "mysqlrouter" ) func initialClient() (*mysqlrouter.Client, error) { @@ -50,7 +58,64 @@ func initialClient() (*mysqlrouter.Client, error) { "MYSQLROUTER_EXPORTER_URL is required and MYSQLROUTER_EXPORTER_USER and MYSQLROUTER_EXPORTER_PASS are optional.") } - return mysqlrouter.New(args.RestAPIURL, args.RestAPIUser, args.RestAPIPass, args.SkipTLSVerify) + opts, err := initializeClientOptions() + if err != nil { + return nil, fmt.Errorf("failed to initialize client options err: %w", err) + } + + return mysqlrouter.New(args.RestAPIURL, args.RestAPIUser, args.RestAPIPass, opts) +} + +func initializeClientOptions() (*mysqlrouter.Options, error) { + if args.SkipTLSVerify { + return &mysqlrouter.Options{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + }, nil + } + + if args.TLSCACertPath == "" && args.TLSCertPath == "" && args.TLSKeyPath == "" && !args.SkipTLSVerify { + return nil, nil + } + + certPath, err := filepath.Abs(args.TLSCertPath) + if err != nil { + return nil, err + } + keyPath, err := filepath.Abs(args.TLSKeyPath) + if err != nil { + return nil, err + } + caPath, err := filepath.Abs(args.TLSCACertPath) + if err != nil { + return nil, err + } + + cert, err := tls.LoadX509KeyPair(certPath, keyPath) + if err != nil { + return nil, err + } + + caCert, err := ioutil.ReadFile(caPath) + if err != nil { + return nil, err + } + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(caCert) + + tlsConfig := &tls.Config{ + Certificates: []tls.Certificate{cert}, + RootCAs: caCertPool, + } + + opts := &mysqlrouter.Options{ + Transport: &http.Transport{ + TLSClientConfig: tlsConfig, + }, + } + + return opts, nil } func recordMetrics() { @@ -190,6 +255,7 @@ func main() { log.Fatalf("failed to create mysql router client. err: %s\n", err.Error()) } + collectInterval = time.Duration(args.CollectInterval) * time.Second recordMetrics() addr := fmt.Sprintf("0.0.0.0:%d", args.ListenPort) From 93b628ae930e4435c43069959c4e8acb7a17d30a Mon Sep 17 00:00:00 2001 From: Hasegawa Takuya Date: Thu, 30 Jun 2022 22:22:25 +0900 Subject: [PATCH 2/2] Fix golangci-lint --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 278ffa8..3c5aab6 100644 --- a/.drone.yml +++ b/.drone.yml @@ -16,8 +16,8 @@ steps: - name: deps path: /go commands: - - go get -u golang.org/x/lint/golint - - golint + - "curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.46.2" + - golangci-lint run when: event: exclude: