From 0ad7a21acac257ac2f4fc48cd696db03b5a6dfd2 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Wed, 28 Jun 2017 13:55:23 +0300 Subject: [PATCH 01/14] Bump version. --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0ea3a944b..d5109100e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.0 +0.3.0-dev From 8b9fcdcd45411667ab058e62cd1d23662fd5309c Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Wed, 28 Jun 2017 13:55:32 +0300 Subject: [PATCH 02/14] Fix formatting in README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 20bb625a4..c7b369edd 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ If you use [MongoDB Authorization](https://docs.mongodb.org/manual/core/authoriz 1. Create a user with '*clusterMonitor*' role and '*read*' on the '*local*' database, like the following (*replace username/password!*): -```json +```js db.getSiblingDB("admin").createUser({ user: "mongodb_exporter", pwd: "s3cr3tpassw0rd", From 90e1300aa62aa7e02cbaa001b8adb9e5d05d693c Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Wed, 28 Jun 2017 14:38:20 +0300 Subject: [PATCH 03/14] Use Docker Compose on Travis CI and local dev. --- .gitignore | 2 ++ .travis.yml | 21 ++++++++++++++++++--- CONTRIBUTING.md | 20 ++++++++++++++++++++ Makefile | 30 +++++++++++++++++++++++++++++- docker-compose.yml | 8 ++++++++ 5 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 docker-compose.yml diff --git a/.gitignore b/.gitignore index 919ab702e..01a985085 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ mongodb_exporter +coverage.txt +coverage_temp.txt diff --git a/.travis.yml b/.travis.yml index ad1bf3cd3..63a08067c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,25 @@ -sudo: false +dist: trusty +sudo: required language: go go: - - 1.7.x - 1.8.x - tip +env: + - MONGODB_IMAGE=mongo:3.4 + - MONGODB_IMAGE=percona/percona-server-mongodb:3.4 + +services: + - docker + +before_script: + - docker --version + - docker-compose --version + - docker-compose up -d + script: - - make + - make format build testall + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..5e7a7cb56 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,20 @@ +# Contributing notes + +## Local setup + +The easiest way to make a local development setup is to use Docker Compose. + +``` +docker-compose up +make all testall +export MONGODB_URL='mongodb://localhost:27017' +./mongodb_exporter +``` + +`testall` make target will run integration tests. + + +## Vendoring + +We use [Glide](https://glide.sh) to vendor dependencies. Please use released version of Glide (i.e. do not `go get` +from `master` branch). Also please use `--strip-vendor` flag. diff --git a/Makefile b/Makefile index 9c4096412..c46bf9496 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,17 @@ +# Copyright 2015 The Prometheus Authors +# Copyright 2017 Percona LLC +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + GO := go FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) PROMU := $(FIRST_GOPATH)/bin/promu -v @@ -17,7 +31,21 @@ style: test: @echo ">> running tests" - @$(GO) test -short -race $(pkgs) + rm -f coverage.txt + for p in $(pkgs); do \ + rm -f coverage_temp.txt ; \ + $(GO) test -v -short -race -covermode atomic -coverprofile coverage_temp.txt $$p ; \ + cat coverage_temp.txt >> coverage.txt ; \ + done + +testall: + @echo ">> running all tests" + rm -f coverage.txt + for p in $(pkgs); do \ + rm -f coverage_temp.txt ; \ + $(GO) test -v -race -covermode atomic -coverprofile coverage_temp.txt $$p ; \ + cat coverage_temp.txt >> coverage.txt ; \ + done format: @echo ">> formatting code" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..fcee1672d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,8 @@ +# see CONTRIBUTING.md +--- +version: '3' +services: + mongo: + image: ${MONGODB_IMAGE:-mongo:3.4} + ports: + - 127.0.0.1:27017:27017 From 5f7b02fe4dfe5239ed6d9ae5958313ef87182795 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Wed, 28 Jun 2017 16:16:22 +0300 Subject: [PATCH 04/14] Use Go naming convention. --- collector/mongod/server_status_test.go | 2 +- collector/mongodb_collector_test.go | 6 +++--- collector/mongos/server_status_test.go | 2 +- shared/group_desc_test.go | 2 +- shared/utils_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/collector/mongod/server_status_test.go b/collector/mongod/server_status_test.go index 024ab358d..9a75df91d 100644 --- a/collector/mongod/server_status_test.go +++ b/collector/mongod/server_status_test.go @@ -7,7 +7,7 @@ import ( "gopkg.in/mgo.v2/bson" ) -func Test_ParserServerStatus(t *testing.T) { +func TestParserServerStatus(t *testing.T) { data, err := ioutil.ReadFile("../fixtures/server_status.bson") if err != nil { t.Fatal(err) diff --git a/collector/mongodb_collector_test.go b/collector/mongodb_collector_test.go index b267bc18a..8369f160a 100644 --- a/collector/mongodb_collector_test.go +++ b/collector/mongodb_collector_test.go @@ -7,20 +7,20 @@ import ( "github.com/prometheus/client_golang/prometheus" ) -func Test_CollectServerStatus(t *testing.T) { +func TestCollectServerStatus(t *testing.T) { shared.ParseEnabledGroups("assers,durability,backgrond_flushing,connections,extra_info,global_lock,index_counters,network,op_counters,memory,locks,metrics,cursors") collector := NewMongodbCollector(MongodbCollectorOpts{URI: "localhost"}) go collector.Collect(nil) } -func Test_DescribeCollector(t *testing.T) { +func TestDescribeCollector(t *testing.T) { collector := NewMongodbCollector(MongodbCollectorOpts{URI: "localhost"}) ch := make(chan *prometheus.Desc) go collector.Describe(ch) } -func Test_CollectCollector(t *testing.T) { +func TestCollectCollector(t *testing.T) { collector := NewMongodbCollector(MongodbCollectorOpts{URI: "localhost"}) ch := make(chan prometheus.Metric) diff --git a/collector/mongos/server_status_test.go b/collector/mongos/server_status_test.go index 994ee120c..51feb9bcf 100644 --- a/collector/mongos/server_status_test.go +++ b/collector/mongos/server_status_test.go @@ -7,7 +7,7 @@ import ( "gopkg.in/mgo.v2/bson" ) -func Test_ParserServerStatus(t *testing.T) { +func TestParserServerStatus(t *testing.T) { data, err := ioutil.ReadFile("../fixtures/server_status.bson") if err != nil { t.Fatal(err) diff --git a/shared/group_desc_test.go b/shared/group_desc_test.go index 80f274b57..321138170 100644 --- a/shared/group_desc_test.go +++ b/shared/group_desc_test.go @@ -4,7 +4,7 @@ import ( "testing" ) -func Test_ParseEnabledGroups(t *testing.T) { +func TestParseEnabledGroups(t *testing.T) { ParseEnabledGroups("a, b, c") if !EnabledGroups["a"] { t.Error("a was not loaded.") diff --git a/shared/utils_test.go b/shared/utils_test.go index ed236220b..b54b2cdd9 100644 --- a/shared/utils_test.go +++ b/shared/utils_test.go @@ -4,7 +4,7 @@ import ( "testing" ) -func Test_SnakeCase(t *testing.T) { +func TestSnakeCase(t *testing.T) { if SnakeCase("testing-string") != "testing_string" { t.Fail() } @@ -18,7 +18,7 @@ func Test_SnakeCase(t *testing.T) { } } -func Test_ParameterizeString(t *testing.T) { +func TestParameterizeString(t *testing.T) { if ParameterizeString("testing-string") != "testing_string" { t.Fail() } From 3f78721529a394ee60cf3ac33c348588d076b8c7 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Wed, 28 Jun 2017 16:37:00 +0300 Subject: [PATCH 05/14] Group imports. --- collector/mongodb_collector.go | 7 ++++--- collector/mongodb_collector_test.go | 3 ++- mongodb_exporter.go | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/collector/mongodb_collector.go b/collector/mongodb_collector.go index d70163846..25c48774e 100644 --- a/collector/mongodb_collector.go +++ b/collector/mongodb_collector.go @@ -1,12 +1,13 @@ package collector import ( - "github.com/percona/mongodb_exporter/collector/mongod" - "github.com/percona/mongodb_exporter/collector/mongos" - "github.com/percona/mongodb_exporter/shared" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/log" "gopkg.in/mgo.v2" + + "github.com/percona/mongodb_exporter/collector/mongod" + "github.com/percona/mongodb_exporter/collector/mongos" + "github.com/percona/mongodb_exporter/shared" ) var ( diff --git a/collector/mongodb_collector_test.go b/collector/mongodb_collector_test.go index 8369f160a..b34d23cc3 100644 --- a/collector/mongodb_collector_test.go +++ b/collector/mongodb_collector_test.go @@ -3,8 +3,9 @@ package collector import ( "testing" - "github.com/percona/mongodb_exporter/shared" "github.com/prometheus/client_golang/prometheus" + + "github.com/percona/mongodb_exporter/shared" ) func TestCollectServerStatus(t *testing.T) { diff --git a/mongodb_exporter.go b/mongodb_exporter.go index c4eb2b0bd..bcc9fab42 100644 --- a/mongodb_exporter.go +++ b/mongodb_exporter.go @@ -10,13 +10,14 @@ import ( "os" "strings" - "github.com/percona/mongodb_exporter/collector" - "github.com/percona/mongodb_exporter/shared" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/common/log" "github.com/prometheus/common/version" "gopkg.in/yaml.v2" + + "github.com/percona/mongodb_exporter/collector" + "github.com/percona/mongodb_exporter/shared" ) const ( From caaf722cc064988635df941996863fc5c89986c5 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Wed, 28 Jun 2017 16:38:19 +0300 Subject: [PATCH 06/14] Use Mongo in Docker in integration tests. --- collector/mongodb_collector_test.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/collector/mongodb_collector_test.go b/collector/mongodb_collector_test.go index b34d23cc3..cd68ba7e4 100644 --- a/collector/mongodb_collector_test.go +++ b/collector/mongodb_collector_test.go @@ -9,20 +9,32 @@ import ( ) func TestCollectServerStatus(t *testing.T) { + if testing.Short() { + t.Skip("-short is passed, skipping integration test") + } + shared.ParseEnabledGroups("assers,durability,backgrond_flushing,connections,extra_info,global_lock,index_counters,network,op_counters,memory,locks,metrics,cursors") - collector := NewMongodbCollector(MongodbCollectorOpts{URI: "localhost"}) + collector := NewMongodbCollector(MongodbCollectorOpts{URI: "mongodb://localhost:27017"}) go collector.Collect(nil) } func TestDescribeCollector(t *testing.T) { - collector := NewMongodbCollector(MongodbCollectorOpts{URI: "localhost"}) + if testing.Short() { + t.Skip("-short is passed, skipping integration test") + } + + collector := NewMongodbCollector(MongodbCollectorOpts{URI: "mongodb://localhost:27017"}) ch := make(chan *prometheus.Desc) go collector.Describe(ch) } func TestCollectCollector(t *testing.T) { - collector := NewMongodbCollector(MongodbCollectorOpts{URI: "localhost"}) + if testing.Short() { + t.Skip("-short is passed, skipping integration test") + } + + collector := NewMongodbCollector(MongodbCollectorOpts{URI: "mongodb://localhost:27017"}) ch := make(chan prometheus.Metric) go collector.Collect(ch) From 2795038496e09c0dbf32be7fe4820537f23a6a0e Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Wed, 28 Jun 2017 16:52:05 +0300 Subject: [PATCH 07/14] Remove dead code. --- collector/mongodb_collector_test.go | 12 ------------ mongodb_exporter.go | 4 +--- shared/group_desc.go | 18 ------------------ shared/group_desc_test.go | 18 ------------------ 4 files changed, 1 insertion(+), 51 deletions(-) delete mode 100644 shared/group_desc.go delete mode 100644 shared/group_desc_test.go diff --git a/collector/mongodb_collector_test.go b/collector/mongodb_collector_test.go index cd68ba7e4..4e501be45 100644 --- a/collector/mongodb_collector_test.go +++ b/collector/mongodb_collector_test.go @@ -4,20 +4,8 @@ import ( "testing" "github.com/prometheus/client_golang/prometheus" - - "github.com/percona/mongodb_exporter/shared" ) -func TestCollectServerStatus(t *testing.T) { - if testing.Short() { - t.Skip("-short is passed, skipping integration test") - } - - shared.ParseEnabledGroups("assers,durability,backgrond_flushing,connections,extra_info,global_lock,index_counters,network,op_counters,memory,locks,metrics,cursors") - collector := NewMongodbCollector(MongodbCollectorOpts{URI: "mongodb://localhost:27017"}) - go collector.Collect(nil) -} - func TestDescribeCollector(t *testing.T) { if testing.Short() { t.Skip("-short is passed, skipping integration test") diff --git a/mongodb_exporter.go b/mongodb_exporter.go index bcc9fab42..2485502e2 100644 --- a/mongodb_exporter.go +++ b/mongodb_exporter.go @@ -17,7 +17,6 @@ import ( "gopkg.in/yaml.v2" "github.com/percona/mongodb_exporter/collector" - "github.com/percona/mongodb_exporter/shared" ) const ( @@ -50,6 +49,7 @@ var ( " \tIf not provided: System default CAs are used.") tlsDisableHostnameValidationF = flag.Bool("mongodb.tls-disable-hostname-validation", false, "Do hostname validation for server connection.") + // FIXME currently ignored enabledGroupsFlag = flag.String("groups.enabled", "asserts,durability,background_flushing,connections,extra_info,global_lock,index_counters,network,op_counters,op_counters_repl,memory,locks,metrics", "Comma-separated list of groups to use, for more info see: docs.mongodb.org/manual/reference/command/serverStatus/") ) @@ -221,8 +221,6 @@ func main() { os.Exit(0) } - shared.ParseEnabledGroups(*enabledGroupsFlag) - log.Infoln("### Warning: the exporter is in beta/experimental state and field names are very") log.Infoln("### likely to change in the future and features may change or get removed!") log.Infoln("### See: https://github.com/percona/mongodb_exporter for updates") diff --git a/shared/group_desc.go b/shared/group_desc.go deleted file mode 100644 index 0ebe822c2..000000000 --- a/shared/group_desc.go +++ /dev/null @@ -1,18 +0,0 @@ -package shared - -import ( - "strings" -) - -var ( - // EnabledGroups is map with the group name as field and a boolean indicating wether that group is enabled or not. - EnabledGroups = make(map[string]bool) -) - -// ParseEnabledGroups parses the groups passed by the command line input. -func ParseEnabledGroups(enabledGroupsFlag string) { - for _, name := range strings.Split(enabledGroupsFlag, ",") { - name = strings.TrimSpace(name) - EnabledGroups[name] = true - } -} diff --git a/shared/group_desc_test.go b/shared/group_desc_test.go deleted file mode 100644 index 321138170..000000000 --- a/shared/group_desc_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package shared - -import ( - "testing" -) - -func TestParseEnabledGroups(t *testing.T) { - ParseEnabledGroups("a, b, c") - if !EnabledGroups["a"] { - t.Error("a was not loaded.") - } - if !EnabledGroups["b"] { - t.Error("b was not loaded.") - } - if !EnabledGroups["c"] { - t.Error("c was not loaded.") - } -} From 943ac52b547309bbfc6567b8051e877c6be79ab8 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Wed, 28 Jun 2017 19:19:15 +0300 Subject: [PATCH 08/14] Make sure we describe all metrics. --- collector/mongodb_collector.go | 30 +++++++++++++++++--------- collector/mongodb_collector_test.go | 33 ++++++++++++++++++----------- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/collector/mongodb_collector.go b/collector/mongodb_collector.go index 25c48774e..640c9f864 100644 --- a/collector/mongodb_collector.go +++ b/collector/mongodb_collector.go @@ -50,20 +50,27 @@ func NewMongodbCollector(opts MongodbCollectorOpts) *MongodbCollector { return exporter } -// Describe describes all mongodb's metrics. +// Describe sends the super-set of all possible descriptors of metrics collected by this Collector +// to the provided channel and returns once the last descriptor has been sent. +// Part of prometheus.Collector interface. func (exporter *MongodbCollector) Describe(ch chan<- *prometheus.Desc) { - log.Debug("Describing groups") - session := shared.MongoSession(exporter.Opts.toSessionOps()) - if session != nil { - serverStatus := collector_mongos.GetServerStatus(session) - if serverStatus != nil { - serverStatus.Describe(ch) + metricCh := make(chan prometheus.Metric) + doneCh := make(chan struct{}) + + go func() { + for m := range metricCh { + ch <- m.Desc() } - session.Close() - } + close(doneCh) + }() + + exporter.Collect(metricCh) + close(metricCh) + <-doneCh } -// Collect collects all mongodb's metrics. +// Collect is called by the Prometheus registry when collecting metrics. +// Part of prometheus.Collector interface. func (exporter *MongodbCollector) Collect(ch chan<- prometheus.Metric) { mongoSess := shared.MongoSession(exporter.Opts.toSessionOps()) if mongoSess != nil { @@ -132,3 +139,6 @@ func (exporter *MongodbCollector) collectMongodReplSet(session *mgo.Session, ch oplogStatus.Export(ch) } } + +// check interface +var _ prometheus.Collector = (*MongodbCollector)(nil) diff --git a/collector/mongodb_collector_test.go b/collector/mongodb_collector_test.go index 4e501be45..72c8e207c 100644 --- a/collector/mongodb_collector_test.go +++ b/collector/mongodb_collector_test.go @@ -6,24 +6,33 @@ import ( "github.com/prometheus/client_golang/prometheus" ) -func TestDescribeCollector(t *testing.T) { +func TestCollector(t *testing.T) { if testing.Short() { t.Skip("-short is passed, skipping integration test") } collector := NewMongodbCollector(MongodbCollectorOpts{URI: "mongodb://localhost:27017"}) - ch := make(chan *prometheus.Desc) - go collector.Describe(ch) -} - -func TestCollectCollector(t *testing.T) { - if testing.Short() { - t.Skip("-short is passed, skipping integration test") + descCh := make(chan *prometheus.Desc) + go func() { + collector.Describe(descCh) + close(descCh) + }() + metricCh := make(chan prometheus.Metric) + go func() { + collector.Collect(metricCh) + close(metricCh) + }() + + var descs, metrics int + for range descCh { + descs++ + } + for range metricCh { + metrics++ } - collector := NewMongodbCollector(MongodbCollectorOpts{URI: "mongodb://localhost:27017"}) - - ch := make(chan prometheus.Metric) - go collector.Collect(ch) + if descs != metrics { + t.Errorf("got %d descs and %d metrics", descs, metrics) + } } From a635e2fb9236677722c297bbfb340083167db49f Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Wed, 28 Jun 2017 19:41:43 +0300 Subject: [PATCH 09/14] Remove more dead code. --- shared/connection_test.go | 14 ++++++++++++++ shared/utils.go | 36 ------------------------------------ shared/utils_test.go | 33 --------------------------------- 3 files changed, 14 insertions(+), 69 deletions(-) create mode 100644 shared/connection_test.go delete mode 100644 shared/utils_test.go diff --git a/shared/connection_test.go b/shared/connection_test.go new file mode 100644 index 000000000..0ebc25d09 --- /dev/null +++ b/shared/connection_test.go @@ -0,0 +1,14 @@ +package shared + +import ( + "testing" +) + +func TestRedactMongoUri(t *testing.T) { + uri := "mongodb://mongodb_exporter:s3cr3tpassw0rd@localhost:27017" + expected := "mongodb://****:****@localhost:27017" + actual := RedactMongoUri(uri) + if expected != actual { + t.Errorf("%q != %q", expected, actual) + } +} diff --git a/shared/utils.go b/shared/utils.go index f6cc8d4c8..5dd38d15d 100644 --- a/shared/utils.go +++ b/shared/utils.go @@ -4,44 +4,8 @@ import ( "crypto/tls" "crypto/x509" "io/ioutil" - "regexp" - "strconv" - "strings" ) -var ( - snakeRegexp = regexp.MustCompile("\\B[A-Z]+[^_$]") - parameterizeRegexp = regexp.MustCompile("[^A-Za-z0-9_]+") -) - -// SnakeCase converts the given text to snakecase/underscore syntax. -func SnakeCase(text string) string { - result := snakeRegexp.ReplaceAllStringFunc(text, func(match string) string { - return "_" + match - }) - - return ParameterizeString(result) -} - -// ParameterizeString parameterizes the given string. -func ParameterizeString(text string) string { - result := parameterizeRegexp.ReplaceAllString(text, "_") - return strings.ToLower(result) -} - -func IsVersionGreater(version string, major int, minor int, release int) bool { - split := strings.Split(version, ".") - cmp_major, _ := strconv.Atoi(split[0]) - cmp_minor, _ := strconv.Atoi(split[1]) - cmp_release, _ := strconv.Atoi(split[2]) - - if cmp_major >= major && cmp_minor >= minor && cmp_release >= release { - return true - } - - return false -} - func LoadCaFrom(pemFile string) (*x509.CertPool, error) { caCert, err := ioutil.ReadFile(pemFile) if err != nil { diff --git a/shared/utils_test.go b/shared/utils_test.go deleted file mode 100644 index b54b2cdd9..000000000 --- a/shared/utils_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package shared - -import ( - "testing" -) - -func TestSnakeCase(t *testing.T) { - if SnakeCase("testing-string") != "testing_string" { - t.Fail() - } - - if SnakeCase("TestingString") != "testing_string" { - t.Fail() - } - - if SnakeCase("Testing_String") != "testing__string" { - t.Fail() - } -} - -func TestParameterizeString(t *testing.T) { - if ParameterizeString("testing-string") != "testing_string" { - t.Fail() - } - - if ParameterizeString("TestingString") != "testingstring" { - t.Fail() - } - - if ParameterizeString("Testing-String") != "testing_string" { - t.Fail() - } -} From 94d038425a5b54d107d66c2c4554d7e59f88de97 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Tue, 4 Jul 2017 21:12:54 +0300 Subject: [PATCH 10/14] Apply Apache 2.0 license. --- LICENSE | 223 +++++++++++++++++++++--- NOTICE | 9 + collector/mongod/asserts.go | 14 ++ collector/mongod/background_flushing.go | 14 ++ collector/mongod/connections.go | 14 ++ collector/mongod/cursors.go | 14 ++ collector/mongod/durability.go | 14 ++ collector/mongod/extra_info.go | 14 ++ collector/mongod/global_lock.go | 14 ++ collector/mongod/index_counters.go | 14 ++ collector/mongod/locks.go | 14 ++ collector/mongod/memory.go | 14 ++ collector/mongod/metrics.go | 14 ++ collector/mongod/namespace.go | 14 ++ collector/mongod/network.go | 14 ++ collector/mongod/op_counters.go | 14 ++ collector/mongod/oplog_status.go | 14 ++ collector/mongod/replset_status.go | 14 ++ collector/mongod/rocksdb.go | 14 ++ collector/mongod/server_status.go | 14 ++ collector/mongod/server_status_test.go | 14 ++ collector/mongod/storage_engine.go | 14 ++ collector/mongod/wiredtiger.go | 14 ++ collector/mongodb_collector.go | 14 ++ collector/mongodb_collector_test.go | 14 ++ collector/mongos/asserts.go | 14 ++ collector/mongos/connections.go | 14 ++ collector/mongos/cursors.go | 14 ++ collector/mongos/extra_info.go | 14 ++ collector/mongos/memory.go | 14 ++ collector/mongos/metrics.go | 14 ++ collector/mongos/namespace.go | 14 ++ collector/mongos/network.go | 14 ++ collector/mongos/op_counters.go | 14 ++ collector/mongos/server_status.go | 14 ++ collector/mongos/server_status_test.go | 14 ++ collector/mongos/sharding_changelog.go | 14 ++ collector/mongos/sharding_status.go | 14 ++ collector/mongos/sharding_topology.go | 14 ++ mongodb_exporter.go | 14 ++ shared/connection.go | 14 ++ shared/connection_test.go | 14 ++ shared/utils.go | 14 ++ 43 files changed, 784 insertions(+), 22 deletions(-) create mode 100644 NOTICE diff --git a/LICENSE b/LICENSE index d3b105873..261eeb9e9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,22 +1,201 @@ -The MIT License (MIT) - -Copyright (c) 2015 David Cuadrado -Copyright (c) 2016 Percona - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/NOTICE b/NOTICE new file mode 100644 index 000000000..5ba015810 --- /dev/null +++ b/NOTICE @@ -0,0 +1,9 @@ +Percona MongoDB Exporter. +Copyright 2017 Percona LLC + +The following components are included in this product: + +mongodb_exporter +https://github.com/dcu/mongodb_exporter +Copyright (c) 2015 David Cuadrado +Licensed under the MIT License diff --git a/collector/mongod/asserts.go b/collector/mongod/asserts.go index 52ba6e9c0..6dc265201 100644 --- a/collector/mongod/asserts.go +++ b/collector/mongod/asserts.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/background_flushing.go b/collector/mongod/background_flushing.go index c35305fc4..07eb8d899 100644 --- a/collector/mongod/background_flushing.go +++ b/collector/mongod/background_flushing.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/connections.go b/collector/mongod/connections.go index 20808aeac..38cf1324d 100644 --- a/collector/mongod/connections.go +++ b/collector/mongod/connections.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/cursors.go b/collector/mongod/cursors.go index 520b46e0e..961f8e201 100644 --- a/collector/mongod/cursors.go +++ b/collector/mongod/cursors.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/durability.go b/collector/mongod/durability.go index a7d114b46..df3525138 100644 --- a/collector/mongod/durability.go +++ b/collector/mongod/durability.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/extra_info.go b/collector/mongod/extra_info.go index 16e9862f0..fc7ece4b7 100644 --- a/collector/mongod/extra_info.go +++ b/collector/mongod/extra_info.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/global_lock.go b/collector/mongod/global_lock.go index 2cac9b440..7934006c1 100644 --- a/collector/mongod/global_lock.go +++ b/collector/mongod/global_lock.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/index_counters.go b/collector/mongod/index_counters.go index 05b621ea3..87f71b61a 100644 --- a/collector/mongod/index_counters.go +++ b/collector/mongod/index_counters.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/locks.go b/collector/mongod/locks.go index f5ed27d63..dd0ab8007 100644 --- a/collector/mongod/locks.go +++ b/collector/mongod/locks.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/memory.go b/collector/mongod/memory.go index 1570d022b..ba4310949 100644 --- a/collector/mongod/memory.go +++ b/collector/mongod/memory.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/metrics.go b/collector/mongod/metrics.go index bd9bb2fdd..aa2f61da1 100644 --- a/collector/mongod/metrics.go +++ b/collector/mongod/metrics.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/namespace.go b/collector/mongod/namespace.go index 79d4cd7ad..3a89ccd26 100644 --- a/collector/mongod/namespace.go +++ b/collector/mongod/namespace.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod var ( diff --git a/collector/mongod/network.go b/collector/mongod/network.go index 3acbfae3b..4346470e4 100644 --- a/collector/mongod/network.go +++ b/collector/mongod/network.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/op_counters.go b/collector/mongod/op_counters.go index 1e0d36002..511345d5e 100644 --- a/collector/mongod/op_counters.go +++ b/collector/mongod/op_counters.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/oplog_status.go b/collector/mongod/oplog_status.go index 501538626..9d842aabc 100644 --- a/collector/mongod/oplog_status.go +++ b/collector/mongod/oplog_status.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/replset_status.go b/collector/mongod/replset_status.go index f059c116b..f2e20f026 100644 --- a/collector/mongod/replset_status.go +++ b/collector/mongod/replset_status.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/rocksdb.go b/collector/mongod/rocksdb.go index acff4e2e5..c5f4d5fbf 100644 --- a/collector/mongod/rocksdb.go +++ b/collector/mongod/rocksdb.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/server_status.go b/collector/mongod/server_status.go index 5c9e5ad6c..234a8ae73 100644 --- a/collector/mongod/server_status.go +++ b/collector/mongod/server_status.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/server_status_test.go b/collector/mongod/server_status_test.go index 9a75df91d..a82dc45e9 100644 --- a/collector/mongod/server_status_test.go +++ b/collector/mongod/server_status_test.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/storage_engine.go b/collector/mongod/storage_engine.go index 42fe585a2..7bd9af6c2 100644 --- a/collector/mongod/storage_engine.go +++ b/collector/mongod/storage_engine.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongod/wiredtiger.go b/collector/mongod/wiredtiger.go index 9bd467173..1591067e1 100644 --- a/collector/mongod/wiredtiger.go +++ b/collector/mongod/wiredtiger.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongod import ( diff --git a/collector/mongodb_collector.go b/collector/mongodb_collector.go index 640c9f864..65e505547 100644 --- a/collector/mongodb_collector.go +++ b/collector/mongodb_collector.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector import ( diff --git a/collector/mongodb_collector_test.go b/collector/mongodb_collector_test.go index 72c8e207c..2f4d507e2 100644 --- a/collector/mongodb_collector_test.go +++ b/collector/mongodb_collector_test.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector import ( diff --git a/collector/mongos/asserts.go b/collector/mongos/asserts.go index 7f147c840..9882b228a 100644 --- a/collector/mongos/asserts.go +++ b/collector/mongos/asserts.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/connections.go b/collector/mongos/connections.go index 8c49e963f..848b64f04 100644 --- a/collector/mongos/connections.go +++ b/collector/mongos/connections.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/cursors.go b/collector/mongos/cursors.go index a05c29203..b38f2e0e0 100644 --- a/collector/mongos/cursors.go +++ b/collector/mongos/cursors.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/extra_info.go b/collector/mongos/extra_info.go index 6d2b1571c..55b14d9fb 100644 --- a/collector/mongos/extra_info.go +++ b/collector/mongos/extra_info.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/memory.go b/collector/mongos/memory.go index 9eb3b97cf..91910fb87 100644 --- a/collector/mongos/memory.go +++ b/collector/mongos/memory.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/metrics.go b/collector/mongos/metrics.go index ff22202ad..046a50143 100644 --- a/collector/mongos/metrics.go +++ b/collector/mongos/metrics.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/namespace.go b/collector/mongos/namespace.go index 1d17df669..1881e32d9 100644 --- a/collector/mongos/namespace.go +++ b/collector/mongos/namespace.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos var ( diff --git a/collector/mongos/network.go b/collector/mongos/network.go index 0d40f9aec..f2f46a8f4 100644 --- a/collector/mongos/network.go +++ b/collector/mongos/network.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/op_counters.go b/collector/mongos/op_counters.go index 957992e69..08aa97d0c 100644 --- a/collector/mongos/op_counters.go +++ b/collector/mongos/op_counters.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/server_status.go b/collector/mongos/server_status.go index bc3b7e3da..11615c640 100644 --- a/collector/mongos/server_status.go +++ b/collector/mongos/server_status.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/server_status_test.go b/collector/mongos/server_status_test.go index 51feb9bcf..eb5f6f6b3 100644 --- a/collector/mongos/server_status_test.go +++ b/collector/mongos/server_status_test.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/sharding_changelog.go b/collector/mongos/sharding_changelog.go index 6e9d774ce..c46463ac7 100644 --- a/collector/mongos/sharding_changelog.go +++ b/collector/mongos/sharding_changelog.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/sharding_status.go b/collector/mongos/sharding_status.go index 38dc1f2d9..2737b177e 100644 --- a/collector/mongos/sharding_status.go +++ b/collector/mongos/sharding_status.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/collector/mongos/sharding_topology.go b/collector/mongos/sharding_topology.go index 0e3fd40e4..b458d762a 100644 --- a/collector/mongos/sharding_topology.go +++ b/collector/mongos/sharding_topology.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package collector_mongos import ( diff --git a/mongodb_exporter.go b/mongodb_exporter.go index 2485502e2..86fd18b6d 100644 --- a/mongodb_exporter.go +++ b/mongodb_exporter.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package main import ( diff --git a/shared/connection.go b/shared/connection.go index 7fa7a148f..490cef952 100644 --- a/shared/connection.go +++ b/shared/connection.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package shared import ( diff --git a/shared/connection_test.go b/shared/connection_test.go index 0ebc25d09..4c9dddeb4 100644 --- a/shared/connection_test.go +++ b/shared/connection_test.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package shared import ( diff --git a/shared/utils.go b/shared/utils.go index 5dd38d15d..4c8c71ecd 100644 --- a/shared/utils.go +++ b/shared/utils.go @@ -1,3 +1,17 @@ +// Copyright 2017 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package shared import ( From 7bc706b11aa4f9001fe25bc01f5fe81383806636 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Fri, 7 Jul 2017 18:15:13 +0300 Subject: [PATCH 11/14] Add a few standard metrics. Indirectly it also fixes PMM-1170 by making sure we always have at least a few metrics. --- CHANGELOG.md | 8 +++ collector/mongodb_collector.go | 113 +++++++++++++++++++++++++-------- 2 files changed, 95 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 599b0894a..9bd68d4b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## v0.3.0 (not released yet) + +* Add standrad metrics: + * `mongodb_exporter_scrapes_total` + * `mongodb_exporter_last_scrape_error` + * `mongodb_exporter_last_scrape_duration_seconds` +* Fix a few data races. + ## v0.2.0 (2017-06-28) * Default listen port changed to 9216. diff --git a/collector/mongodb_collector.go b/collector/mongodb_collector.go index 65e505547..e7f90ad13 100644 --- a/collector/mongodb_collector.go +++ b/collector/mongodb_collector.go @@ -15,6 +15,10 @@ package collector import ( + "errors" + "fmt" + "time" + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/log" "gopkg.in/mgo.v2" @@ -24,10 +28,7 @@ import ( "github.com/percona/mongodb_exporter/shared" ) -var ( - // Namespace is the namespace of the metrics - Namespace = "mongodb" -) +const namespace = "mongodb" // MongodbCollectorOpts is the options of the mongodb collector. type MongodbCollectorOpts struct { @@ -52,13 +53,35 @@ func (in MongodbCollectorOpts) toSessionOps() shared.MongoSessionOpts { // MongodbCollector is in charge of collecting mongodb's metrics. type MongodbCollector struct { - Opts MongodbCollectorOpts + Opts MongodbCollectorOpts + scrapesTotal prometheus.Counter + lastScrapeError prometheus.Gauge + lastScrapeDurationSeconds prometheus.Gauge } // NewMongodbCollector returns a new instance of a MongodbCollector. func NewMongodbCollector(opts MongodbCollectorOpts) *MongodbCollector { exporter := &MongodbCollector{ Opts: opts, + + scrapesTotal: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: "exporter", + Name: "scrapes_total", + Help: "Total number of times MongoDB was scraped for metrics.", + }), + lastScrapeError: prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: "exporter", + Name: "last_scrape_error", + Help: "Whether the last scrape of metrics from MongoDB resulted in an error (1 for error, 0 for success).", + }), + lastScrapeDurationSeconds: prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: "exporter", + Name: "last_scrape_duration_seconds", + Help: "Duration of the last scrape of metrics from MongoDB.", + }), } return exporter @@ -68,6 +91,17 @@ func NewMongodbCollector(opts MongodbCollectorOpts) *MongodbCollector { // to the provided channel and returns once the last descriptor has been sent. // Part of prometheus.Collector interface. func (exporter *MongodbCollector) Describe(ch chan<- *prometheus.Desc) { + // We cannot know in advance what metrics the exporter will generate + // from MongoDB. So we use the poor man's describe method: Run a collect + // and send the descriptors of all the collected metrics. The problem + // here is that we need to connect to the MongoDB. If it is currently + // unavailable, the descriptors will be incomplete. Since this is a + // stand-alone exporter and not used as a library within other code + // implementing additional metrics, the worst that can happen is that we + // don't detect inconsistent metrics created by this exporter + // itself. Also, a change in the monitored MongoDB instance may change the + // exported metrics during the runtime of the exporter. + metricCh := make(chan prometheus.Metric) doneCh := make(chan struct{}) @@ -86,30 +120,57 @@ func (exporter *MongodbCollector) Describe(ch chan<- *prometheus.Desc) { // Collect is called by the Prometheus registry when collecting metrics. // Part of prometheus.Collector interface. func (exporter *MongodbCollector) Collect(ch chan<- prometheus.Metric) { - mongoSess := shared.MongoSession(exporter.Opts.toSessionOps()) - if mongoSess != nil { - defer mongoSess.Close() - serverVersion, err := shared.MongoSessionServerVersion(mongoSess) - if err != nil { - log.Errorf("Problem gathering the mongo server version: %s", err) - } + exporter.scrape(ch) - nodeType, err := shared.MongoSessionNodeType(mongoSess) - if err != nil { - log.Errorf("Problem gathering the mongo node type: %s", err) - } + exporter.scrapesTotal.Collect(ch) + exporter.lastScrapeError.Collect(ch) + exporter.lastScrapeDurationSeconds.Collect(ch) +} - log.Debugf("Connected to: %s (node type: %s, server version: %s)", shared.RedactMongoUri(exporter.Opts.URI), nodeType, serverVersion) - switch { - case nodeType == "mongos": - exporter.collectMongos(mongoSess, ch) - case nodeType == "mongod": - exporter.collectMongod(mongoSess, ch) - case nodeType == "replset": - exporter.collectMongodReplSet(mongoSess, ch) - default: - log.Errorf("Unrecognized node type %s!", nodeType) +func (exporter *MongodbCollector) scrape(ch chan<- prometheus.Metric) { + exporter.scrapesTotal.Inc() + var err error + defer func(begun time.Time) { + exporter.lastScrapeDurationSeconds.Set(time.Since(begun).Seconds()) + if err == nil { + exporter.lastScrapeError.Set(0) + } else { + exporter.lastScrapeError.Set(1) } + }(time.Now()) + + mongoSess := shared.MongoSession(exporter.Opts.toSessionOps()) + if mongoSess == nil { + err = errors.New("can't create mongo session") + return + } + defer mongoSess.Close() + + var serverVersion string + serverVersion, err = shared.MongoSessionServerVersion(mongoSess) + if err != nil { + log.Errorf("Problem gathering the mongo server version: %s", err) + return + } + + var nodeType string + nodeType, err = shared.MongoSessionNodeType(mongoSess) + if err != nil { + log.Errorf("Problem gathering the mongo node type: %s", err) + return + } + + log.Debugf("Connected to: %s (node type: %s, server version: %s)", shared.RedactMongoUri(exporter.Opts.URI), nodeType, serverVersion) + switch { + case nodeType == "mongos": + exporter.collectMongos(mongoSess, ch) + case nodeType == "mongod": + exporter.collectMongod(mongoSess, ch) + case nodeType == "replset": + exporter.collectMongodReplSet(mongoSess, ch) + default: + err = fmt.Errorf("Unrecognized node type %s", nodeType) + log.Error(err) } } From 554c40cef892ae78f6623d6694382ce91362f357 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Fri, 7 Jul 2017 18:15:54 +0300 Subject: [PATCH 12/14] Log metrics URL during startup. --- mongodb_exporter.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mongodb_exporter.go b/mongodb_exporter.go index 86fd18b6d..018f2fdf6 100644 --- a/mongodb_exporter.go +++ b/mongodb_exporter.go @@ -172,7 +172,6 @@ func startWebServer() { log.Infoln("HTTPS/TLS is enabled") } - log.Infoln("Listening on", *listenAddressF) if ssl { // https mux := http.NewServeMux() @@ -198,6 +197,7 @@ func startWebServer() { TLSConfig: tlsCfg, TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)), } + log.Infof("Starting HTTPS server on https://%s%s ...", *listenAddressF, *metricsPathF) log.Fatal(srv.ListenAndServeTLS(*sslCertFileF, *sslKeyFileF)) } else { // http @@ -205,6 +205,7 @@ func startWebServer() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write(landingPage) }) + log.Infof("Starting HTTP server on http://%s%s ...", *listenAddressF, *metricsPathF) log.Fatal(http.ListenAndServe(*listenAddressF, nil)) } } From b2ca7eeb1893803d3fa3fdde8beb8325d01e35a4 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Fri, 7 Jul 2017 18:16:32 +0300 Subject: [PATCH 13/14] Reduce MongoDB dial timeout. Typical Prometheus scrape timeout is 5s, so we need to connect or fail faster. --- shared/connection.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/connection.go b/shared/connection.go index 490cef952..1aaa5acde 100644 --- a/shared/connection.go +++ b/shared/connection.go @@ -27,7 +27,7 @@ import ( ) const ( - dialMongodbTimeout = 5 * time.Second + dialMongodbTimeout = 3 * time.Second syncMongodbTimeout = 1 * time.Minute ) From 5a3d17e020c7a2d1386c316349186b2ca90c1759 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Fri, 7 Jul 2017 18:26:24 +0300 Subject: [PATCH 14/14] Prepare release 0.3.0. --- CHANGELOG.md | 4 ++-- VERSION | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bd68d4b8..ef61ff333 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Changelog -## v0.3.0 (not released yet) +## v0.3.0 (2017-07-07) -* Add standrad metrics: +* Add standard metrics: * `mongodb_exporter_scrapes_total` * `mongodb_exporter_last_scrape_error` * `mongodb_exporter_last_scrape_duration_seconds` diff --git a/VERSION b/VERSION index d5109100e..0d91a54c7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.3.0-dev +0.3.0