Skip to content

Commit 435b7b9

Browse files
authored
Merge pull request percona#29 from percona/PMM-7530-duplicate-alerts
PMM-7530 Filtered handler
2 parents b3cc89e + df532fe commit 435b7b9

File tree

10 files changed

+235
-48
lines changed

10 files changed

+235
-48
lines changed

Gopkg.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/postgres_exporter/postgres_exporter.go

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88
"io/ioutil"
99
"math"
10+
"net/http"
1011
"net/url"
1112
"os"
1213
"path/filepath"
@@ -1490,8 +1491,88 @@ func main() {
14901491
exporter.servers.Close()
14911492
}()
14921493

1493-
// process and go collector is registered in prometheus/registry init
1494-
prometheus.MustRegister(exporter)
1494+
psCollector := prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{})
1495+
goCollector := prometheus.NewGoCollector()
14951496

1496-
exporter_shared.RunServer("PostgreSQL", *listenAddress, *metricPath, promhttp.ContinueOnError)
1497+
exporter_shared.RunServer("PostgreSQL", *listenAddress, *metricPath, newHandler(map[string]prometheus.Collector{
1498+
"exporter": exporter,
1499+
"standard.process": psCollector,
1500+
"standard.go": goCollector,
1501+
}))
1502+
}
1503+
1504+
// handler wraps an unfiltered http.Handler but uses a filtered handler,
1505+
// created on the fly, if filtering is requested. Create instances with
1506+
// newHandler. It used for collectors filtering.
1507+
type handler struct {
1508+
unfilteredHandler http.Handler
1509+
collectors map[string]prometheus.Collector
1510+
}
1511+
1512+
func newHandler(collectors map[string]prometheus.Collector) *handler {
1513+
h := &handler{collectors: collectors}
1514+
1515+
innerHandler, err := h.innerHandler()
1516+
if err != nil {
1517+
log.Fatalf("Couldn't create metrics handler: %s", err)
1518+
}
1519+
1520+
h.unfilteredHandler = innerHandler
1521+
return h
1522+
}
1523+
1524+
// ServeHTTP implements http.Handler.
1525+
func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
1526+
filters := r.URL.Query()["collect[]"]
1527+
log.Debugln("collect query:", filters)
1528+
1529+
if len(filters) == 0 {
1530+
// No filters, use the prepared unfiltered handler.
1531+
h.unfilteredHandler.ServeHTTP(w, r)
1532+
return
1533+
}
1534+
1535+
filteredHandler, err := h.innerHandler(filters...)
1536+
if err != nil {
1537+
log.Warnln("Couldn't create filtered metrics handler:", err)
1538+
w.WriteHeader(http.StatusBadRequest)
1539+
w.Write([]byte(fmt.Sprintf("Couldn't create filtered metrics handler: %s", err)))
1540+
return
1541+
}
1542+
1543+
filteredHandler.ServeHTTP(w, r)
1544+
}
1545+
1546+
func (h *handler) innerHandler(filters ...string) (http.Handler, error) {
1547+
registry := prometheus.NewRegistry()
1548+
1549+
// register all collectors by default.
1550+
if len(filters) == 0 {
1551+
for name, c := range h.collectors {
1552+
if err := registry.Register(c); err != nil {
1553+
return nil, err
1554+
}
1555+
log.Debugf("Collector %q was registered", name)
1556+
}
1557+
}
1558+
1559+
// register only filtered collectors.
1560+
for _, name := range filters {
1561+
if c, ok := h.collectors[name]; ok {
1562+
if err := registry.Register(c); err != nil {
1563+
return nil, err
1564+
}
1565+
log.Debugf("Collector %q was registered", name)
1566+
}
1567+
}
1568+
1569+
handler := promhttp.HandlerFor(
1570+
registry,
1571+
promhttp.HandlerOpts{
1572+
ErrorLog: log.NewErrorLogger(),
1573+
ErrorHandling: promhttp.ContinueOnError,
1574+
},
1575+
)
1576+
1577+
return handler, nil
14971578
}

vendor/github.com/percona/exporter_shared/.gitignore

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/percona/exporter_shared/.travis.yml

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/percona/exporter_shared/Gopkg.toml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/percona/exporter_shared/README.md

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/percona/exporter_shared/basic_auth.go

Lines changed: 14 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/percona/exporter_shared/go.mod

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/percona/exporter_shared/go.sum

Lines changed: 72 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)