Skip to content

Commit 5064dcb

Browse files
authored
setup exporter metrics only once when we can (#124)
otherwise all exporter metrics will be overwritten on every scrape Signed-off-by: Fredrik Enestad <fredrik@enestad.com>
1 parent fda5a08 commit 5064dcb

File tree

1 file changed

+50
-26
lines changed

1 file changed

+50
-26
lines changed

stackdriver_exporter.go

+50-26
Original file line numberDiff line numberDiff line change
@@ -109,35 +109,59 @@ func createMonitoringService(ctx context.Context) (*monitoring.Service, error) {
109109
return monitoringService, nil
110110
}
111111

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
121115

122-
registry := prometheus.NewRegistry()
116+
projectIDs []string
117+
m *monitoring.Service
118+
}
123119

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+
}
132145

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)
136154
}
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,
140161
}
162+
163+
// Delegate http serving to Prometheus client library, which will call collector.Collect.
164+
return promhttp.HandlerFor(gatherers, promhttp.HandlerOpts{})
141165
}
142166

143167
func main() {
@@ -172,9 +196,9 @@ func main() {
172196
}
173197

174198
projectIDs := strings.Split(*projectID, ",")
175-
handlerFunc := newHandler(projectIDs, monitoringService, logger)
199+
handler := newHandler(projectIDs, monitoringService, logger)
176200

177-
http.Handle(*metricsPath, promhttp.InstrumentMetricHandler(prometheus.DefaultRegisterer, handlerFunc))
201+
http.Handle(*metricsPath, promhttp.InstrumentMetricHandler(prometheus.DefaultRegisterer, handler))
178202
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
179203
w.Write([]byte(`<html>
180204
<head><title>Stackdriver Exporter</title></head>

0 commit comments

Comments
 (0)