@@ -109,35 +109,59 @@ func createMonitoringService(ctx context.Context) (*monitoring.Service, error) {
109
109
return monitoringService , nil
110
110
}
111
111
112
- func newHandler (projectIDs []string , m * monitoring.Service , logger log.Logger ) http.HandlerFunc {
113
- return func (w http.ResponseWriter , r * http.Request ) {
114
- collectParams := r .URL .Query ()["collect" ]
115
-
116
- // Create filters for "collect" query parameters.
117
- filters := make (map [string ]bool )
118
- for _ , param := range collectParams {
119
- filters [param ] = true
120
- }
112
+ type handler struct {
113
+ handler http.Handler
114
+ logger log.Logger
121
115
122
- registry := prometheus .NewRegistry ()
116
+ projectIDs []string
117
+ m * monitoring.Service
118
+ }
123
119
124
- for _ , project := range projectIDs {
125
- monitoringCollector , err := collectors .NewMonitoringCollector (project , m , filters , logger )
126
- if err != nil {
127
- level .Error (logger ).Log ("err" , err )
128
- os .Exit (1 )
129
- }
130
- registry .MustRegister (monitoringCollector )
131
- }
120
+ func (h * handler ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
121
+ collectParams := r .URL .Query ()["collect" ]
122
+ filters := make (map [string ]bool )
123
+ for _ , param := range collectParams {
124
+ filters [param ] = true
125
+ }
126
+
127
+ if len (filters ) > 0 {
128
+ h .innerHandler (filters ).ServeHTTP (w , r )
129
+ return
130
+ }
131
+
132
+ h .handler .ServeHTTP (w , r )
133
+ }
134
+
135
+ func newHandler (projectIDs []string , m * monitoring.Service , logger log.Logger ) * handler {
136
+ h := & handler {
137
+ logger : logger ,
138
+ projectIDs : projectIDs ,
139
+ m : m ,
140
+ }
141
+
142
+ h .handler = h .innerHandler (nil )
143
+ return h
144
+ }
132
145
133
- gatherers := prometheus.Gatherers {
134
- prometheus .DefaultGatherer ,
135
- registry ,
146
+ func (h * handler ) innerHandler (filters map [string ]bool ) http.Handler {
147
+ registry := prometheus .NewRegistry ()
148
+
149
+ for _ , project := range h .projectIDs {
150
+ monitoringCollector , err := collectors .NewMonitoringCollector (project , h .m , filters , h .logger )
151
+ if err != nil {
152
+ level .Error (h .logger ).Log ("err" , err )
153
+ os .Exit (1 )
136
154
}
137
- // Delegate http serving to Prometheus client library, which will call collector.Collect.
138
- h := promhttp .HandlerFor (gatherers , promhttp.HandlerOpts {})
139
- h .ServeHTTP (w , r )
155
+ registry .MustRegister (monitoringCollector )
156
+ }
157
+
158
+ gatherers := prometheus.Gatherers {
159
+ prometheus .DefaultGatherer ,
160
+ registry ,
140
161
}
162
+
163
+ // Delegate http serving to Prometheus client library, which will call collector.Collect.
164
+ return promhttp .HandlerFor (gatherers , promhttp.HandlerOpts {})
141
165
}
142
166
143
167
func main () {
@@ -172,9 +196,9 @@ func main() {
172
196
}
173
197
174
198
projectIDs := strings .Split (* projectID , "," )
175
- handlerFunc := newHandler (projectIDs , monitoringService , logger )
199
+ handler := newHandler (projectIDs , monitoringService , logger )
176
200
177
- http .Handle (* metricsPath , promhttp .InstrumentMetricHandler (prometheus .DefaultRegisterer , handlerFunc ))
201
+ http .Handle (* metricsPath , promhttp .InstrumentMetricHandler (prometheus .DefaultRegisterer , handler ))
178
202
http .HandleFunc ("/" , func (w http.ResponseWriter , r * http.Request ) {
179
203
w .Write ([]byte (`<html>
180
204
<head><title>Stackdriver Exporter</title></head>
0 commit comments