Skip to content

Commit 441fe33

Browse files
authored
Merge branch 'master' into master
2 parents d07635c + 4117fb2 commit 441fe33

File tree

269 files changed

+37084
-2016
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

269 files changed

+37084
-2016
lines changed

.gitignore

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
.build
2-
postgres_exporter
3-
postgres_exporter_integration_test
1+
/.build
2+
/postgres_exporter
3+
/postgres_exporter_integration_test
44
*.tar.gz
55
*.test
66
*-stamp
7-
.idea
7+
/.idea
88
*.iml
9-
cover.out
10-
cover.*.out
11-
.coverage
12-
bin
13-
release
14-
*.prom
15-
.metrics.*.*.prom
9+
/cover.out
10+
/cover.*.out
11+
/.coverage
12+
/bin
13+
/release
14+
/*.prom
15+
/.metrics.*.*.prom

.travis.yml

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,29 @@ services:
33
- docker
44
language: go
55
go:
6-
- '1.9'
7-
# Make sure we have p2 and the postgres client.
6+
- '1.10'
87
before_install:
98
- go get -v github.com/mattn/goveralls
10-
- sudo wget -O /usr/local/bin/p2 https://github.com/wrouesnel/p2cli/releases/download/r4/p2 &&
11-
sudo chmod +x /usr/local/bin/p2
12-
- sudo wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/1.9.0-rc4/docker-compose-Linux-x86_64 &&
13-
sudo chmod +x /usr/local/bin/docker-compose
9+
- sudo wget -O /usr/local/bin/p2 https://github.com/wrouesnel/p2cli/releases/download/r4/p2
10+
&& sudo chmod +x /usr/local/bin/p2
11+
- sudo wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/1.9.0-rc4/docker-compose-Linux-x86_64
12+
&& sudo chmod +x /usr/local/bin/docker-compose
1413
- sudo apt-get update && sudo apt-get install postgresql-client-common
15-
1614
script:
17-
- make all
18-
- make docker
19-
- make test-integration
20-
- make cover.out
21-
- make release
22-
- $HOME/gopath/bin/goveralls -coverprofile=cover.out -service=travis-ci
15+
- go run mage.go -v all
16+
- "$HOME/gopath/bin/goveralls -coverprofile=cover.out -service=travis-ci"
17+
- go run mage.go docker
2318
after_success:
2419
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
25-
# Push a tagged build if a tag is found.
26-
- if [ ! -z "$TRAVIS_TAG" ]; then
27-
docker tag wrouesnel/postgres_exporter:latest wrouesnel/postgres_exporter:$TRAVIS_TAG ;
28-
docker push wrouesnel/postgres_exporter:$TRAVIS_TAG ;
29-
fi
30-
# Push a latest version
31-
- if [ "$TRAVIS_BRANCH" == "master" ]; then docker push wrouesnel/postgres_exporter ; fi
20+
- if [ ! -z "$TRAVIS_TAG" ]; then docker tag wrouesnel/postgres_exporter:latest wrouesnel/postgres_exporter:$TRAVIS_TAG
21+
; docker push wrouesnel/postgres_exporter:$TRAVIS_TAG ; fi
22+
- if [ "$TRAVIS_BRANCH" == "master" ]; then docker push wrouesnel/postgres_exporter
23+
; fi
3224
env:
3325
global:
34-
- secure: RfoWQj5tEB/t3XL2tqJW7u7Qscpz1QBOfF9lMFpB4kAUMTtZU0zBbXfMo1JheGoJQQxD/7NLRHhbUWPT2489o3KKpRTQ7RHn3k8n5U7opH01bWX0+l/EPVmhlsKjSDSLGgmxz80j3I6C8ZV3qDUijSx7r90QUNHGbZtV7g+KtoUTpRV0zir/heK6qq9LHWNHbNsJyHK8qHmd6g1UzWIBaZPJ6a/n/rO2jq4uS1JR0VlIJPRF11HOLH8IjFQvVYpN7YbEslxyNsfQJUSP/7CghSLLVWPSATEjMm8a5GJVLc564+nYghm484psEtiMXkZ3n6ie7AT8aJrKfexWrwh2aCc+cK4PiyXrf4euZehZNYogmFCqWzd1LJKcN2uIkpBSuZQDm3e6c4qkkWGpx+RdFWtAMG8IgZLDbcuryxFNzMwHc2CJ009s9Zsa+g7D57csyR5LCZ8YtNGI3g8FmhwpCKvYkfKa9aijUEWyJMyT4Vhd/w7btMTuwYHgUQ85k4ov4Xjz5SNpAGgemig5G5w7PJj4NhGvIBz9weL154x/BFVjHOZZ6Y/bWgJIPoW1KM15x5K8QylWYEBUHtwiyVyXOxHqt6MOX1vYo1L37jMK88IErrfh/VmlxEhtN9wOghk8IudMfFwQtjIwiWlJf218wxMIzUjoyb5/25tU9f2OJrg=
35-
- secure: WP96T7yshE03XsPVc9ICbwZXZ6nVsQDCQ9NGKnIEQa4T1Swu5uLVzxjGeowHPykKbKphQmT8inMniBxB48OLc3VVqNxVI+00ppLPEf7n79w2wVbwFOEa6TiOdws+0wOphkeSYc0L+o2aSfoMKJHF+rVW9tmM2tszVjofYHhdWjqloc2pqsfOnqbR7icfpmzMWKyezIE20YOIBsiKZJTKXiZ1SaG9ExkNwuZ7L+HRF1yeI0OdAM4VfEzBK1Gwicy2BtrbyHnl4zgcSoIBmuzo+pNuvqyGmBn3C221M6ki7NoDJDfW5brcvDmiMODWGnka7iW0nt5aUbVtURM8BhWZR0uINo30aYjr4j39UBq8y+mqYV0dp/dMEmy2fa1mogr+DuHUNVSg59Au45AZeom8N6FT03nlg+RcG/tV1skvP/mn9n9CKsyfvC4Rf3jp4+LTiJ9JIch74MecRYVwlpKM+i8s6uDftt3mvxeIYdK+NEMcfwKMv8KTwuxRo/3KRhif7z2cOE+oMbT5POWO19bfboRPCs4xiMTcqpx8dJVs41SacY52PPgjFSnyVrKvzAyjn6mePjLhpoPZueHZuJYPNa9QC8JcASMlCI7lf2Eq+2Dmp2JxmndkRs/cIfHgmO4gtiNM7Vb/rlML1D/8LYPWU/Rdp82/yDffC0ugMNovXt0=
36-
- secure: RRQH4Tr94OblZoqls50BIoyK1OvK9fALs4pAq1Uk5dksY1NWnomheQzOaHzbVfMfXc4zXAzppZIqxUDGn8GiSLbtJL6pnxsxYNGoCGdS8lMjjKWXbCAs8TBJobi3krOOjqgbhOWTpyluTEShnBcg7CjrRQUa/ChS3uE5kl21/4eIl9Be6Q08Eqm3p1yvMAyAgIL6Y6oPAAtBa6zIsi2MSNlryz3RKHJO7AheilppYx3E8B03A+a/oqvTTcw6w/RwBYxB8MYfSLC0jSssZz5pUSX/byUaklGFhQLnKAzJyhrMOvRyMVcO4PHaLgVi1eAKQz6eLQh7uEiIqKh19cuvTbZHDgu8zMpLDTxOW9U95e4kbjOZ5pWZ7E5QTrb24RZIt42JGbmme7PWOvy3zNbWHwfwiOF1qwYwISUcj2KFCpes8mDGt6iv46LfdlU0uoZdZu3MAiTiW0u2SD5hIeFq4XYesPtkS/TKFoAbB5Tu1qbxdmYu5NqmfvmxsmeNEm4inFJ5ap3fRRCVo668Z6qRMuQ1URcEfOz8iEftP9CnwSOXRuiuMo+W9GgckRuDZcPyQMCftq8+PhB+SjK57zrAd4Kxqf6kVHV16tcWqmFjfJJUFqmL+gpjT/VMEVDY2FOnbOARjkeLTjVC4dADBjxfJ6wmlLrfHdUm4GinbaHq0iA=
26+
- DOCKER_USER=wrouesnel
27+
28+
- secure: f0H5HKL/5f/ZZVGZ7puegWZ6eig0TmruihuSEJCx1+Y6yDZn7l8lH+eETP9KAzH27c3CG1F9ytu/3gnnTOafXnDLlCve3fL5sKF3+pNQRwi3IojsODjdfPW+KEbG+1RD7IgkCn+DSRmvvpLr4zGOmZFEM1ZtLL878u4Hsrv/X5pDbKJgG/cXDRJfsu/EcpviO4WM8zOakBY8QihXhGpZiRtpRDCXWjW49PdCkW9hsfzFaU1yjvih9EJ0cfcH+9CFCRkezwAPlCETbOv288uHXc6bCuEEX1bgJ0ZzEXYAyoO00+12ePbQZEGNikSVT55nfC+jZLLTavQkFi862Hcx/lmJpA/7aeNYOrDcomwWMRRc4Ava2+cod7acVvo45SHRq+Jj9ofDhj9s0T/aZwV+2doc9GwDN9J6aEs9Nham2G955K1H0fmMW9lv0ThSVEZ3XbzCHyR4nPAwJQXrzauqbbihCim/g/YC5gbVs7O/4GkN2Z9LK30IJr1/NtJdIa6fMk3Zdhp6LGbXCvVFRbE0rMiTLbB8O3ll2smCu3aFYv7J9IfvI0ol0ww7kULpyf/vqxkK0NJXsKgoK/Uo1lM9gNpJBHsMt9nWnDvLj2DKZNTqkxzJeG8O98ADrQWEGFhpcsSsbW9pAMsrp6D4LQikN8KoFvh9F8h9lBsYpafzlOA=
3729
deploy:
3830
skip_cleanup: true
3931
provider: releases

README.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,19 @@ docker run --net=host -e DATA_SOURCE_NAME="postgresql://postgres:password@localh
1717
```
1818

1919
## Building and running
20+
21+
The build system is based on [Mage](https://magefile.org)
22+
2023
The default make file behavior is to build the binary:
2124
```
22-
go get github.com/wrouesnel/postgres_exporter
23-
cd ${GOPATH-$HOME/go}/src/github.com/wrouesnel/postgres_exporter
24-
make
25-
export DATA_SOURCE_NAME="postgresql://login:password@hostname:port/dbname"
26-
./postgres_exporter <flags>
25+
$ go get github.com/wrouesnel/postgres_exporter
26+
$ cd ${GOPATH-$HOME/go}/src/github.com/wrouesnel/postgres_exporter
27+
$ go run mage.go
28+
$ export DATA_SOURCE_NAME="postgresql://login:password@hostname:port/dbname"
29+
$ ./postgres_exporter <flags>
2730
```
2831

29-
To build the dockerfile, run `make docker`.
32+
To build the dockerfile, run `go run mage.go docker`.
3033

3134
This will build the docker image as `wrouesnel/postgres_exporter:latest`. This
3235
is a minimal docker image containing *just* postgres_exporter. By default no SSL
@@ -130,9 +133,6 @@ GRANT SELECT ON postgres_exporter.pg_stat_replication TO postgres_exporter;
130133
> ```
131134
132135
# Hacking
133-
134-
* The build system is currently only supported for Linux-like platforms. It
135-
depends on GNU Make.
136-
* To build a copy for your current architecture run `make binary` or just `make`
136+
* To build a copy for your current architecture run `go run mage.go binary` or just `go run mage.go`
137137
This will create a symlink to the just built binary in the root directory.
138-
* To build release tar balls run `make release`.
138+
* To build release tar balls run `go run mage.go release`.

cmd/postgres_exporter/pg_setting.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package main
2+
3+
import (
4+
"database/sql"
5+
"errors"
6+
"fmt"
7+
"math"
8+
"strconv"
9+
"strings"
10+
11+
"github.com/prometheus/client_golang/prometheus"
12+
"github.com/prometheus/common/log"
13+
)
14+
15+
// Query the pg_settings view containing runtime variables
16+
func querySettings(ch chan<- prometheus.Metric, db *sql.DB) error {
17+
log.Debugln("Querying pg_setting view")
18+
19+
// pg_settings docs: https://www.postgresql.org/docs/current/static/view-pg-settings.html
20+
//
21+
// NOTE: If you add more vartypes here, you must update the supported
22+
// types in normaliseUnit() below
23+
query := "SELECT name, setting, COALESCE(unit, ''), short_desc, vartype FROM pg_settings WHERE vartype IN ('bool', 'integer', 'real');"
24+
25+
rows, err := db.Query(query)
26+
if err != nil {
27+
return errors.New(fmt.Sprintln("Error running query on database: ", namespace, err))
28+
}
29+
defer rows.Close() // nolint: errcheck
30+
31+
for rows.Next() {
32+
s := &pgSetting{}
33+
err = rows.Scan(&s.name, &s.setting, &s.unit, &s.shortDesc, &s.vartype)
34+
if err != nil {
35+
return errors.New(fmt.Sprintln("Error retrieving rows:", namespace, err))
36+
}
37+
38+
ch <- s.metric()
39+
}
40+
41+
return nil
42+
}
43+
44+
// pgSetting is represents a PostgreSQL runtime variable as returned by the
45+
// pg_settings view.
46+
type pgSetting struct {
47+
name, setting, unit, shortDesc, vartype string
48+
}
49+
50+
func (s *pgSetting) metric() prometheus.Metric {
51+
var (
52+
err error
53+
name = strings.Replace(s.name, ".", "_", -1)
54+
unit = s.unit // nolint: ineffassign
55+
shortDesc = s.shortDesc
56+
subsystem = "settings"
57+
val float64
58+
)
59+
60+
switch s.vartype {
61+
case "bool":
62+
if s.setting == "on" {
63+
val = 1
64+
}
65+
case "integer", "real":
66+
if val, unit, err = s.normaliseUnit(); err != nil {
67+
// Panic, since we should recognise all units
68+
// and don't want to silently exlude metrics
69+
panic(err)
70+
}
71+
72+
if len(unit) > 0 {
73+
name = fmt.Sprintf("%s_%s", name, unit)
74+
shortDesc = fmt.Sprintf("%s [Units converted to %s.]", shortDesc, unit)
75+
}
76+
default:
77+
// Panic because we got a type we didn't ask for
78+
panic(fmt.Sprintf("Unsupported vartype %q", s.vartype))
79+
}
80+
81+
desc := newDesc(subsystem, name, shortDesc)
82+
return prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, val)
83+
}
84+
85+
func (s *pgSetting) normaliseUnit() (val float64, unit string, err error) {
86+
val, err = strconv.ParseFloat(s.setting, 64)
87+
if err != nil {
88+
return val, unit, fmt.Errorf("Error converting setting %q value %q to float: %s", s.name, s.setting, err)
89+
}
90+
91+
// Units defined in: https://www.postgresql.org/docs/current/static/config-setting.html
92+
switch s.unit {
93+
case "":
94+
return
95+
case "ms", "s", "min", "h", "d":
96+
unit = "seconds"
97+
case "kB", "MB", "GB", "TB", "8kB", "16kB", "16MB":
98+
unit = "bytes"
99+
default:
100+
err = fmt.Errorf("Unknown unit for runtime variable: %q", s.unit)
101+
return
102+
}
103+
104+
// -1 is special, don't modify the value
105+
if val == -1 {
106+
return
107+
}
108+
109+
switch s.unit {
110+
case "ms":
111+
val /= 1000
112+
case "min":
113+
val *= 60
114+
case "h":
115+
val *= 60 * 60
116+
case "d":
117+
val *= 60 * 60 * 24
118+
case "kB":
119+
val *= math.Pow(2, 10)
120+
case "MB":
121+
val *= math.Pow(2, 20)
122+
case "GB":
123+
val *= math.Pow(2, 30)
124+
case "TB":
125+
val *= math.Pow(2, 40)
126+
case "8kB":
127+
val *= math.Pow(2, 13)
128+
case "16kB":
129+
val *= math.Pow(2, 14)
130+
case "16MB":
131+
val *= math.Pow(2, 24)
132+
}
133+
134+
return
135+
}

0 commit comments

Comments
 (0)