14
14
package main
15
15
16
16
import (
17
+ //"context"
18
+ "fmt"
17
19
"net/http"
18
20
"os"
21
+ //"strconv"
22
+ //"strings"
23
+ //"time"
19
24
20
25
"github.com/go-kit/log"
21
26
"github.com/go-kit/log/level"
@@ -28,6 +33,7 @@ import (
28
33
"github.com/prometheus/exporter-toolkit/web"
29
34
webflag "github.com/prometheus/exporter-toolkit/web/kingpinflag"
30
35
"gopkg.in/alecthomas/kingpin.v2"
36
+ "net/url"
31
37
)
32
38
33
39
var (
@@ -61,6 +67,63 @@ const (
61
67
serverLabelName = "server"
62
68
)
63
69
70
+
71
+ func newHandler () http.HandlerFunc {
72
+ return func (w http.ResponseWriter , r * http.Request ) {
73
+
74
+ v := r .URL .Query ()
75
+ //params := v["collect[]"]
76
+ insname := v .Get ("target" )
77
+ dbname := v .Get ("dbname" )
78
+ user := v .Get ("user" )
79
+ password := v .Get ("password" )
80
+ ui := url .UserPassword (user , password ).String ()
81
+ dsn := fmt .Sprintf ("postgresql://" + ui + "@" + insname + "/" + dbname + "?sslmode=disable" )
82
+ // Use request context for cancellation when connection gets closed.
83
+ level .Info (logger ).Log (dsn )
84
+
85
+ if len (dsn ) == 0 {
86
+ level .Error (logger ).Log ("msg" , "Couldn't find environment variables describing the datasource to use" )
87
+ //dsn, err := getDataSources()
88
+ //if err != nil {
89
+ // level.Error(logger).Log("msg", "Failed reading data sources", "err", err.Error())
90
+ // os.Exit(1)
91
+ //}
92
+ }
93
+
94
+ opts := []ExporterOpt {
95
+ DisableDefaultMetrics (* disableDefaultMetrics ),
96
+ DisableSettingsMetrics (* disableSettingsMetrics ),
97
+ AutoDiscoverDatabases (* autoDiscoverDatabases ),
98
+ WithUserQueriesPath (* queriesPath ),
99
+ WithConstantLabels (* constantLabelsList ),
100
+ ExcludeDatabases (* excludeDatabases ),
101
+ IncludeDatabases (* includeDatabases ),
102
+ }
103
+
104
+ exporter := NewExporter ([]string {dsn }, opts ... )
105
+ defer func () {
106
+ exporter .servers .Close ()
107
+ }()
108
+
109
+ prometheus .MustRegister (version .NewCollector (exporterName ))
110
+
111
+ prometheus .MustRegister (exporter )
112
+
113
+ pe , err := collector .NewPostgresCollector (logger , []string {dsn })
114
+ if err != nil {
115
+ level .Error (logger ).Log ("msg" , "Failed to create PostgresCollector" , "err" , err .Error ())
116
+ os .Exit (1 )
117
+ }
118
+ prometheus .MustRegister (pe )
119
+
120
+ // Delegate http serving to Prometheus client library, which will call collector.Collect.
121
+ h := promhttp .HandlerFor (prometheus .DefaultGatherer , promhttp.HandlerOpts {})
122
+ h .ServeHTTP (w , r )
123
+ }
124
+ }
125
+
126
+
64
127
func main () {
65
128
kingpin .Version (version .Print (exporterName ))
66
129
promlogConfig := & promlog.Config {}
@@ -85,50 +148,16 @@ func main() {
85
148
return
86
149
}
87
150
88
- dsn , err := getDataSources ()
89
- if err != nil {
90
- level .Error (logger ).Log ("msg" , "Failed reading data sources" , "err" , err .Error ())
91
- os .Exit (1 )
92
- }
93
-
94
- if len (dsn ) == 0 {
95
- level .Error (logger ).Log ("msg" , "Couldn't find environment variables describing the datasource to use" )
96
- os .Exit (1 )
97
- }
98
-
99
- opts := []ExporterOpt {
100
- DisableDefaultMetrics (* disableDefaultMetrics ),
101
- DisableSettingsMetrics (* disableSettingsMetrics ),
102
- AutoDiscoverDatabases (* autoDiscoverDatabases ),
103
- WithUserQueriesPath (* queriesPath ),
104
- WithConstantLabels (* constantLabelsList ),
105
- ExcludeDatabases (* excludeDatabases ),
106
- IncludeDatabases (* includeDatabases ),
107
- }
108
-
109
- exporter := NewExporter (dsn , opts ... )
110
- defer func () {
111
- exporter .servers .Close ()
112
- }()
113
-
114
- prometheus .MustRegister (version .NewCollector (exporterName ))
115
-
116
- prometheus .MustRegister (exporter )
117
-
118
- pe , err := collector .NewPostgresCollector (logger , dsn )
119
- if err != nil {
120
- level .Error (logger ).Log ("msg" , "Failed to create PostgresCollector" , "err" , err .Error ())
121
- os .Exit (1 )
122
- }
123
- prometheus .MustRegister (pe )
124
151
125
- http .Handle (* metricPath , promhttp .Handler ())
152
+ //http.Handle(*metricPath, promhttp.Handler())
153
+ handlerFunc := newHandler ()
154
+ http .Handle (* metricPath , promhttp .InstrumentMetricHandler (prometheus .DefaultRegisterer , handlerFunc ))
126
155
http .HandleFunc ("/" , func (w http.ResponseWriter , r * http.Request ) {
127
156
w .Header ().Set ("Content-Type" , "text/html; charset=UTF-8" ) // nolint: errcheck
128
157
w .Write (landingPage ) // nolint: errcheck
129
158
})
130
159
131
- level .Info (logger ).Log ("msg" , "Listening on address" , "address" , * listenAddress )
160
+ level .Info (logger ).Log ("msg" , "@lupuxiao Listening on address" , "address" , * listenAddress )
132
161
srv := & http.Server {Addr : * listenAddress }
133
162
if err := web .ListenAndServe (srv , * webConfig , logger ); err != nil {
134
163
level .Error (logger ).Log ("msg" , "Error running HTTP server" , "err" , err )
0 commit comments