diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index c95a1edb..d122ff94 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -21,7 +21,7 @@ jobs: - name: Setup Go uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: - go-version: 1.20.x + go-version: 1.20.5 - name: Restore Go cache uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: diff --git a/.github/workflows/pr-build.yaml b/.github/workflows/pr-build.yaml index 73170c54..2ccf2b49 100644 --- a/.github/workflows/pr-build.yaml +++ b/.github/workflows/pr-build.yaml @@ -23,7 +23,7 @@ jobs: - name: Setup Go uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: - go-version: 1.20.x + go-version: 1.20.5 - name: Restore Go cache uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: diff --git a/.github/workflows/pr-nancy.yaml b/.github/workflows/pr-nancy.yaml index 21a2233f..56f7c811 100644 --- a/.github/workflows/pr-nancy.yaml +++ b/.github/workflows/pr-nancy.yaml @@ -26,7 +26,7 @@ jobs: - name: Setup Go uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: - go-version: 1.20.x + go-version: 1.20.5 - name: Restore Go cache uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index cac30dd4..b7c51719 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -26,7 +26,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: - go-version: '1.20' + go-version: 1.20.5 - name: Docker Login uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 with: diff --git a/cmd/integration_test.go b/cmd/integration_test.go index e8d67dd3..b24f1ef6 100644 --- a/cmd/integration_test.go +++ b/cmd/integration_test.go @@ -1,7 +1,6 @@ package main import ( - "bytes" "context" "fmt" "net/http" @@ -94,16 +93,13 @@ func executeIntegrationTest(t *testing.T, test integrationTest) { setupTestData(t, client) os.Setenv("MDBEXPORTER_SERVER_0_MONGODB_URI", container.URI) - args := []string{ - "-f", test.configPath, + os.Args = []string{ + "mongodb_query_exporter", + fmt.Sprintf("--file=%s", test.configPath), } - b := bytes.NewBufferString("") - rootCmd.SetOut(b) - rootCmd.SetArgs(args) - go func() { - assert.NoError(t, rootCmd.Execute()) + main() }() //binding is blocking, do this async but wait 200ms for tcp port to be open diff --git a/cmd/main.go b/cmd/main.go index bc445d12..95a5fbc8 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -16,7 +16,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/spf13/cobra" + flag "github.com/spf13/pflag" "github.com/spf13/viper" ) @@ -30,32 +30,53 @@ var ( queryTimeout time.Duration srv *http.Server promCollector *collector.Collector +) - rootCmd = &cobra.Command{ - Use: "mongodb-query-exporter", - Short: "MongoDB aggregation exporter for prometheus", - Long: `Export aggregations from MongoDB as prometheus metrics.`, - Run: func(cmd *cobra.Command, args []string) { - c, conf, err := buildCollector() - if err != nil { - panic(err) - } - - prometheus.MustRegister(c) - promCollector = c - _ = c.StartCacheInvalidator() - srv = buildHTTPServer(prometheus.DefaultGatherer, conf) - err = srv.ListenAndServe() - - // Only panic if we have a net error - if _, ok := err.(*net.OpError); ok { - panic(err) - } else { - os.Stderr.WriteString(err.Error() + "\n") - } - }, +func init() { + flag.StringVarP(&uri, "uri", "u", config.DefaultMongoDBURI, "MongoDB URI (default is mongodb://localhost:27017). Use MDBEXPORTER_SERVER_%d_MONGODB_URI envs if you target multiple server") + flag.StringVarP(&configPath, "file", "f", "", "config file (default is $HOME/.mongodb_query_exporter/config.yaml)") + flag.StringVarP(&logLevel, "log-level", "l", config.DefaultLogLevel, "Define the log level (default is warning) [debug,info,warn,error]") + flag.StringVarP(&logEncoding, "log-encoding", "e", config.DefaultLogEncoder, "Define the log format (default is json) [json,console]") + flag.StringVarP(&bind, "bind", "b", config.DefaultBindAddr, "Address to bind http server (default is :9412)") + flag.StringVarP(&metricsPath, "path", "p", config.DefaultMetricsPath, "Metric path (default is /metrics)") + flag.DurationVarP(&queryTimeout, "query-timeout", "t", config.DefaultQueryTimeout, "Timeout for MongoDB queries") + + _ = viper.BindPFlag("log.level", flag.Lookup("log-level")) + _ = viper.BindPFlag("log.encoding", flag.Lookup("log-encoding")) + _ = viper.BindPFlag("bind", flag.Lookup("bind")) + _ = viper.BindPFlag("metricsPath", flag.Lookup("path")) + _ = viper.BindPFlag("mongodb.uri", flag.Lookup("uri")) + _ = viper.BindPFlag("mongodb.queryTimeout", flag.Lookup("query-timeout")) + _ = viper.BindEnv("mongodb.uri", "MDBEXPORTER_MONGODB_URI") + _ = viper.BindEnv("global.queryTimeout", "MDBEXPORTER_MONGODB_QUERY_TIMEOUT") + _ = viper.BindEnv("log.level", "MDBEXPORTER_LOG_LEVEL") + _ = viper.BindEnv("log.encoding", "MDBEXPORTER_LOG_ENCODING") + _ = viper.BindEnv("bind", "MDBEXPORTER_BIND") + _ = viper.BindEnv("metricsPath", "MDBEXPORTER_METRICSPATH") +} + +func main() { + flag.Parse() + initConfig() + + c, conf, err := buildCollector() + if err != nil { + panic(err) } -) + + prometheus.MustRegister(c) + promCollector = c + _ = c.StartCacheInvalidator() + srv = buildHTTPServer(prometheus.DefaultGatherer, conf) + err = srv.ListenAndServe() + + // Only panic if we have a net error + if _, ok := err.(*net.OpError); ok { + panic(err) + } else { + os.Stderr.WriteString(err.Error() + "\n") + } +} func buildCollector() (*collector.Collector, config.Config, error) { var configVersion float32 @@ -112,33 +133,6 @@ func buildHTTPServer(reg prometheus.Gatherer, conf config.Config) *http.Server { return &srv } -func main() { - _ = rootCmd.Execute() -} - -func init() { - cobra.OnInitialize(initConfig) - rootCmd.PersistentFlags().StringVarP(&uri, "uri", "u", config.DefaultMongoDBURI, "MongoDB URI (default is mongodb://localhost:27017). Use MDBEXPORTER_SERVER_%d_MONGODB_URI envs if you target multiple server") - rootCmd.PersistentFlags().StringVarP(&configPath, "file", "f", "", "config file (default is $HOME/.mongodb_query_exporter/config.yaml)") - rootCmd.PersistentFlags().StringVarP(&logLevel, "log-level", "l", config.DefaultLogLevel, "Define the log level (default is warning) [debug,info,warn,error]") - rootCmd.PersistentFlags().StringVarP(&logEncoding, "log-encoding", "e", config.DefaultLogEncoder, "Define the log format (default is json) [json,console]") - rootCmd.PersistentFlags().StringVarP(&bind, "bind", "b", config.DefaultBindAddr, "Address to bind http server (default is :9412)") - rootCmd.PersistentFlags().StringVarP(&metricsPath, "path", "p", config.DefaultMetricsPath, "Metric path (default is /metrics)") - rootCmd.PersistentFlags().DurationVarP(&queryTimeout, "query-timeout", "t", config.DefaultQueryTimeout, "Timeout for MongoDB queries") - _ = viper.BindPFlag("log.level", rootCmd.PersistentFlags().Lookup("log-level")) - _ = viper.BindPFlag("log.encoding", rootCmd.PersistentFlags().Lookup("log-encoding")) - _ = viper.BindPFlag("bind", rootCmd.PersistentFlags().Lookup("bind")) - _ = viper.BindPFlag("metricsPath", rootCmd.PersistentFlags().Lookup("path")) - _ = viper.BindPFlag("mongodb.uri", rootCmd.PersistentFlags().Lookup("uri")) - _ = viper.BindPFlag("mongodb.queryTimeout", rootCmd.PersistentFlags().Lookup("query-timeout")) - _ = viper.BindEnv("mongodb.uri", "MDBEXPORTER_MONGODB_URI") - _ = viper.BindEnv("global.queryTimeout", "MDBEXPORTER_MONGODB_QUERY_TIMEOUT") - _ = viper.BindEnv("log.level", "MDBEXPORTER_LOG_LEVEL") - _ = viper.BindEnv("log.encoding", "MDBEXPORTER_LOG_ENCODING") - _ = viper.BindEnv("bind", "MDBEXPORTER_BIND") - _ = viper.BindEnv("metricsPath", "MDBEXPORTER_METRICSPATH") -} - func initConfig() { envPath := os.Getenv("MDBEXPORTER_CONFIG") diff --git a/go.mod b/go.mod index cdb6f61a..bd7146c4 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/prometheus/client_golang v1.16.0 github.com/prometheus/client_model v0.3.0 github.com/prometheus/common v0.42.0 - github.com/spf13/cobra v1.7.0 + github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.16.0 github.com/testcontainers/testcontainers-go v0.21.0 github.com/tj/assert v0.0.3 @@ -37,7 +37,6 @@ require ( github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/imdario/mergo v0.3.15 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/klauspost/compress v1.16.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect @@ -57,7 +56,6 @@ require ( github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.8.4 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect diff --git a/go.sum b/go.sum index a4151c51..b905043a 100644 --- a/go.sum +++ b/go.sum @@ -68,7 +68,6 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -177,8 +176,6 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -239,7 +236,6 @@ github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPH github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -249,8 +245,6 @@ github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=