@@ -16,24 +16,22 @@ package main
16
16
import (
17
17
"fmt"
18
18
"net/http"
19
+ _ "net/http/pprof"
19
20
"os"
20
21
"strings"
21
22
22
- _ "net/http/pprof"
23
-
24
23
"github.com/alecthomas/kingpin/v2"
25
24
"github.com/go-kit/log"
26
25
"github.com/go-kit/log/level"
27
- "github.com/prometheus-community/postgres_exporter/collector"
28
26
"github.com/prometheus-community/postgres_exporter/config"
29
27
"github.com/prometheus/client_golang/prometheus"
30
28
"github.com/prometheus/client_golang/prometheus/collectors"
31
- "github.com/prometheus/client_golang/prometheus/promhttp"
32
29
"github.com/prometheus/common/promlog"
33
30
"github.com/prometheus/common/promlog/flag"
34
31
"github.com/prometheus/common/version"
35
32
"github.com/prometheus/exporter-toolkit/web"
36
33
"github.com/prometheus/exporter-toolkit/web/kingpinflag"
34
+ "golang.org/x/sync/semaphore"
37
35
)
38
36
39
37
var (
51
49
disableDefaultMetrics = kingpin .Flag ("disable-default-metrics" , "Do not include default metrics." ).Default ("false" ).Envar ("PG_EXPORTER_DISABLE_DEFAULT_METRICS" ).Bool ()
52
50
disableSettingsMetrics = kingpin .Flag ("disable-settings-metrics" , "Do not include pg_settings metrics." ).Default ("false" ).Envar ("PG_EXPORTER_DISABLE_SETTINGS_METRICS" ).Bool ()
53
51
autoDiscoverDatabases = kingpin .Flag ("auto-discover-databases" , "Whether to discover the databases on a server dynamically. (DEPRECATED)" ).Default ("false" ).Envar ("PG_EXPORTER_AUTO_DISCOVER_DATABASES" ).Bool ()
54
- //queriesPath = kingpin.Flag("extend.query-path", "Path to custom queries to run. (DEPRECATED)").Default("").Envar("PG_EXPORTER_EXTEND_QUERY_PATH").String()
52
+ // queriesPath = kingpin.Flag("extend.query-path", "Path to custom queries to run. (DEPRECATED)").Default("").Envar("PG_EXPORTER_EXTEND_QUERY_PATH").String()
55
53
onlyDumpMaps = kingpin .Flag ("dumpmaps" , "Do not run, simply dump the maps." ).Bool ()
56
54
constantLabelsList = kingpin .Flag ("constantLabels" , "A list of label=value separated by comma(,). (DEPRECATED)" ).Default ("" ).Envar ("PG_EXPORTER_CONSTANT_LABELS" ).String ()
57
55
excludeDatabases = kingpin .Flag ("exclude-databases" , "A list of databases to remove when autoDiscoverDatabases is enabled (DEPRECATED)" ).Default ("" ).Envar ("PG_EXPORTER_EXCLUDE_DATABASES" ).String ()
@@ -103,9 +101,9 @@ func main() {
103
101
excludedDatabases := strings .Split (* excludeDatabases , "," )
104
102
logger .Log ("msg" , "Excluded databases" , "databases" , fmt .Sprintf ("%v" , excludedDatabases ))
105
103
106
- //if *queriesPath != "" {
104
+ // if *queriesPath != "" {
107
105
// level.Warn(logger).Log("msg", "The extended queries.yaml config is DEPRECATED", "file", *queriesPath)
108
- //}
106
+ // }
109
107
110
108
if * autoDiscoverDatabases || * excludeDatabases != "" || * includeDatabases != "" {
111
109
level .Warn (logger ).Log ("msg" , "Scraping additional databases via auto discovery is DEPRECATED" )
@@ -115,65 +113,18 @@ func main() {
115
113
level .Warn (logger ).Log ("msg" , "Constant labels on all metrics is DEPRECATED" )
116
114
}
117
115
118
- servers := NewServers (ServerWithLabels (parseConstLabels (* constantLabelsList )))
119
-
120
- opts := []ExporterOpt {
121
- CollectorName ("exporter" ),
122
- DisableDefaultMetrics (* disableDefaultMetrics ),
123
- DisableSettingsMetrics (* disableSettingsMetrics ),
124
- AutoDiscoverDatabases (* autoDiscoverDatabases ),
125
- WithConstantLabels (* constantLabelsList ),
126
- WithServers (servers ),
127
- ExcludeDatabases (excludedDatabases ),
128
- IncludeDatabases (* includeDatabases ),
129
- }
130
-
131
- exporter := NewExporter (dsns , opts ... )
132
- defer func () {
133
- exporter .servers .Close ()
134
- }()
135
-
136
116
versionCollector := version .NewCollector (exporterName )
137
- prometheus .MustRegister (versionCollector )
138
-
139
- prometheus .MustRegister (exporter )
140
-
141
- // TODO(@sysadmind): Remove this with multi-target support. We are removing multiple DSN support
142
- dsn := ""
143
- if len (dsns ) > 0 {
144
- dsn = dsns [0 ]
145
- }
146
-
147
- cleanup , hr , mr , lr := initializePerconaExporters (dsns , servers )
148
- defer cleanup ()
149
-
150
- pe , err := collector .NewPostgresCollector (
151
- logger ,
152
- excludedDatabases ,
153
- dsn ,
154
- []string {},
155
- )
156
- if err != nil {
157
- level .Warn (logger ).Log ("msg" , "Failed to create PostgresCollector" , "err" , err .Error ())
158
- } else {
159
- prometheus .MustRegister (pe )
160
- }
161
-
162
117
psCollector := collectors .NewProcessCollector (collectors.ProcessCollectorOpts {})
163
118
goCollector := collectors .NewGoCollector ()
164
119
165
- promHandler := newHandler (map [string ]prometheus.Collector {
166
- "exporter" : exporter ,
167
- "custom_query.hr" : hr ,
168
- "custom_query.mr" : mr ,
169
- "custom_query.lr" : lr ,
120
+ globalCollectors := map [string ]prometheus.Collector {
170
121
"standard.process" : psCollector ,
171
122
"standard.go" : goCollector ,
172
123
"version" : versionCollector ,
173
- "postgres" : pe ,
174
- })
124
+ }
175
125
176
- http .Handle (* metricsPath , promHandler )
126
+ connSema := semaphore .NewWeighted (* maxConnections )
127
+ http .Handle (* metricsPath , Handler (logger , dsns , connSema , globalCollectors ))
177
128
178
129
if * metricsPath != "/" && * metricsPath != "" {
179
130
landingConfig := web.LandingConfig {
@@ -195,7 +146,7 @@ func main() {
195
146
http .Handle ("/" , landingPage )
196
147
}
197
148
198
- http .HandleFunc ("/probe" , handleProbe (logger , excludedDatabases ))
149
+ http .HandleFunc ("/probe" , handleProbe (logger , excludedDatabases , connSema ))
199
150
200
151
level .Info (logger ).Log ("msg" , "Listening on address" , "address" , * webConfig .WebListenAddresses )
201
152
srv := & http.Server {}
@@ -204,80 +155,3 @@ func main() {
204
155
os .Exit (1 )
205
156
}
206
157
}
207
-
208
- // handler wraps an unfiltered http.Handler but uses a filtered handler,
209
- // created on the fly, if filtering is requested. Create instances with
210
- // newHandler. It used for collectors filtering.
211
- type handler struct {
212
- unfilteredHandler http.Handler
213
- collectors map [string ]prometheus.Collector
214
- }
215
-
216
- func newHandler (collectors map [string ]prometheus.Collector ) * handler {
217
- h := & handler {collectors : collectors }
218
-
219
- innerHandler , err := h .innerHandler ()
220
- if err != nil {
221
- level .Error (logger ).Log ("msg" , "Couldn't create metrics handler" , "error" , err )
222
- os .Exit (1 )
223
- }
224
-
225
- h .unfilteredHandler = innerHandler
226
- return h
227
- }
228
-
229
- // ServeHTTP implements http.Handler.
230
- func (h * handler ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
231
- filters := r .URL .Query ()["collect[]" ]
232
- level .Debug (logger ).Log ("msg" , "Collect query" , "filters" , filters )
233
-
234
- if len (filters ) == 0 {
235
- // No filters, use the prepared unfiltered handler.
236
- h .unfilteredHandler .ServeHTTP (w , r )
237
- return
238
- }
239
-
240
- filteredHandler , err := h .innerHandler (filters ... )
241
- if err != nil {
242
- level .Warn (logger ).Log ("msg" , "Couldn't create filtered metrics handler" , "error" , err )
243
- w .WriteHeader (http .StatusBadRequest )
244
- w .Write ([]byte (fmt .Sprintf ("Couldn't create filtered metrics handler: %s" , err ))) // nolint: errcheck
245
- return
246
- }
247
-
248
- filteredHandler .ServeHTTP (w , r )
249
- }
250
-
251
- func (h * handler ) innerHandler (filters ... string ) (http.Handler , error ) {
252
- registry := prometheus .NewRegistry ()
253
-
254
- // register all collectors by default.
255
- if len (filters ) == 0 {
256
- for name , c := range h .collectors {
257
- if err := registry .Register (c ); err != nil {
258
- return nil , err
259
- }
260
- level .Debug (logger ).Log ("msg" , "Collector was registered" , "collector" , name )
261
- }
262
- }
263
-
264
- // register only filtered collectors.
265
- for _ , name := range filters {
266
- if c , ok := h .collectors [name ]; ok {
267
- if err := registry .Register (c ); err != nil {
268
- return nil , err
269
- }
270
- level .Debug (logger ).Log ("msg" , "Collector was registered" , "collector" , name )
271
- }
272
- }
273
-
274
- handler := promhttp .HandlerFor (
275
- registry ,
276
- promhttp.HandlerOpts {
277
- //ErrorLog: log.NewNopLogger() .NewErrorLogger(),
278
- ErrorHandling : promhttp .ContinueOnError ,
279
- },
280
- )
281
-
282
- return handler , nil
283
- }
0 commit comments