14
14
package main
15
15
16
16
import (
17
+ "context"
17
18
"net/http"
18
19
"os"
19
20
@@ -115,6 +116,12 @@ func main() {
115
116
prometheus .MustRegister (exporter )
116
117
117
118
http .Handle (* metricPath , promhttp .Handler ())
119
+
120
+ registries := make (map [string ]* prometheus.Registry )
121
+ http .HandleFunc ("/probe" , func (w http.ResponseWriter , req * http.Request ) {
122
+ probeHandler (w , req , logger , registries , opts ... )
123
+ })
124
+
118
125
http .HandleFunc ("/" , func (w http.ResponseWriter , r * http.Request ) {
119
126
w .Header ().Set ("Content-Type" , "text/html; charset=UTF-8" ) // nolint: errcheck
120
127
w .Write (landingPage ) // nolint: errcheck
@@ -127,3 +134,29 @@ func main() {
127
134
os .Exit (1 )
128
135
}
129
136
}
137
+
138
+ func probeHandler (w http.ResponseWriter , r * http.Request , logger log.Logger , registries map [string ]* prometheus.Registry , opts ... ExporterOpt ) {
139
+
140
+ ctx , cancel := context .WithCancel (r .Context ())
141
+ defer cancel ()
142
+ r = r .WithContext (ctx )
143
+
144
+ target := r .URL .Query ().Get ("target" )
145
+ if target == "" {
146
+ http .Error (w , "Target parameter is missing" , http .StatusBadRequest )
147
+ return
148
+ }
149
+
150
+ registry , target_registered := registries [target ]
151
+ if ! target_registered {
152
+ registry = prometheus .NewPedanticRegistry ()
153
+ exporter := NewExporter ([]string {target }, opts ... )
154
+ registry .MustRegister (version .NewCollector (exporterName ))
155
+ registry .MustRegister (exporter )
156
+ registries [target ] = registry
157
+ }
158
+
159
+ h := promhttp .HandlerFor (registry , promhttp.HandlerOpts {})
160
+ h .ServeHTTP (w , r )
161
+
162
+ }
0 commit comments