diff --git a/.gitignore b/.gitignore index a782685..4efd7fb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ zookeeper_exporter *.tar.gz *-stamp +.idea/ \ No newline at end of file diff --git a/main.go b/main.go index 776d0ff..055f53d 100644 --- a/main.go +++ b/main.go @@ -15,6 +15,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/log" + "github.com/prometheus/client_golang/prometheus/promhttp" ) type Servers struct { @@ -22,8 +23,6 @@ type Servers struct { Port int `json:"port"` } -const concurrentFetch = 100 - // Commandline flags. var ( useExhibitor = flag.Bool("exporter.use_exhibitor", false, "Use Exhibitor to discover ZooKeeper servers") @@ -33,6 +32,7 @@ var ( var ( variableLabels = []string{"server"} + versionLabels = []string{"server", "version"} ) var httpClient = http.Client{ @@ -158,7 +158,12 @@ func (e *exporter) pollServer(server string, ch chan<- prometheus.Metric, wg *sy conn, err := net.Dial("tcp", server) if err != nil { - e.recordErr(err) + ch <- prometheus.MustNewConstMetric( + prometheus.NewDesc( + "zk_up", + "zk_up", + variableLabels, nil, + ), prometheus.GaugeValue, 0, server) return } @@ -175,7 +180,18 @@ func (e *exporter) pollServer(server string, ch chan<- prometheus.Metric, wg *sy switch key { case "zk_version": - continue + ch <- prometheus.MustNewConstMetric( + prometheus.NewDesc( + "zk_version", + "zk_version", + versionLabels, nil, + ), prometheus.GaugeValue, 1, server, value) + ch <- prometheus.MustNewConstMetric( + prometheus.NewDesc( + "zk_up", + "zk_up", + variableLabels, nil, + ), prometheus.GaugeValue, 1, server) case "zk_server_state": log.Debugf("%s: %d", key+"_"+value, 1) ch <- prometheus.MustNewConstMetric( @@ -197,12 +213,25 @@ func (e *exporter) pollServer(server string, ch chan<- prometheus.Metric, wg *sy } } +func exporterHandler(w http.ResponseWriter, r *http.Request, exporter *exporter) { + params := r.URL.Query() + if len(params["servers"]) != 0 { + exporter.addrs = params["servers"] + } + registry := prometheus.NewRegistry() + registry.MustRegister(exporter) + h := promhttp.HandlerFor(registry, promhttp.HandlerOpts{}) + h.ServeHTTP(w, r) +} + func main() { flag.Parse() exporter := newZooKeeperExporter(flag.Args(), *useExhibitor) - prometheus.MustRegister(exporter) - http.Handle(*metricPath, prometheus.Handler()) + http.HandleFunc(*metricPath, func(w http.ResponseWriter, r *http.Request) { + exporterHandler(w, r, exporter) + }) + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, *metricPath, http.StatusMovedPermanently) })