Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .drone.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
42 changes: 23 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down
16 changes: 14 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
@@ -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
)
6 changes: 2 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand All @@ -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=
Expand Down Expand Up @@ -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=
Expand Down
72 changes: 69 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package main

import (
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"path/filepath"
"strconv"
"time"

Expand All @@ -15,6 +19,7 @@ import (

var (
mysqlRouterClient *mysqlrouter.Client
collectInterval = 2 * time.Second // default collect interval override with --collect-interval

version string
commit string
Expand All @@ -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."`
Expand All @@ -40,8 +49,7 @@ var args struct {
}

const (
nameSpace = "mysqlrouter"
collectInterval = 2 * time.Second
nameSpace = "mysqlrouter"
)

func initialClient() (*mysqlrouter.Client, error) {
Expand All @@ -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() {
Expand Down Expand Up @@ -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)
Expand Down