func Serve(ctx scope.Context, addr string) { http.Handle("/metrics", prometheus.Handler()) listener, err := net.Listen("tcp", addr) if err != nil { ctx.Terminate(err) } closed := false m := sync.Mutex{} closeListener := func() { m.Lock() if !closed { listener.Close() closed = true } m.Unlock() } // Spin off goroutine to watch ctx and close listener if shutdown requested. go func() { <-ctx.Done() closeListener() }() if err := http.Serve(listener, nil); err != nil { fmt.Printf("http[%s]: %s\n", addr, err) ctx.Terminate(err) } closeListener() ctx.WaitGroup().Done() }
func main() { flag.Parse() manager := newDockerManager(*addr, *parent) var labels []string if *labelString != "" { labels = strings.Split(*labelString, ",") } else { labels = make([]string, 0) } dockerClient, err := docker.NewClient("unix:///var/run/docker.sock") if err != nil { log.Fatalf("Unable to start docker client %v", err.Error()) } exporter := NewExporter(manager, *dockerClient, labels) prometheus.MustRegister(exporter) log.Printf("Starting Server: %s", *listeningAddress) handler := prometheus.Handler() if *authUser != "" || *authPass != "" { if *authUser == "" || *authPass == "" { glog.Fatal("You need to specify -auth.user and -auth.pass to enable basic auth") } handler = &basicAuthHandler{ handler: prometheus.Handler().ServeHTTP, user: *authUser, password: *authPass, } } http.Handle(*metricsEndpoint, handler) log.Fatal(http.ListenAndServe(*listeningAddress, nil)) }
func main() { flag.Parse() dsn := os.Getenv("DATA_SOURCE_NAME") if len(dsn) == 0 { log.Fatal("couldn't find environment variable DATA_SOURCE_NAME") } exporter := NewExporter(dsn) prometheus.MustRegister(exporter) handler := prometheus.Handler() if *authUser != "" || *authPass != "" { if *authUser == "" || *authPass == "" { log.Fatal("You need to specify -auth.user and -auth.pass to enable basic auth") } handler = &basicAuthHandler{ handler: prometheus.Handler().ServeHTTP, user: *authUser, password: *authPass, } } http.Handle(*metricPath, handler) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write(landingPage) }) log.Infof("Starting Server: %s", *listenAddress) log.Fatal(http.ListenAndServe(*listenAddress, nil)) }
func main() { flag.Parse() if *printCollectors { collectorNames := make(sort.StringSlice, 0, len(collector.Factories)) for n := range collector.Factories { collectorNames = append(collectorNames, n) } collectorNames.Sort() fmt.Printf("Available collectors:\n") for _, n := range collectorNames { fmt.Printf(" - %s\n", n) } return } collectors, err := loadCollectors() if err != nil { log.Fatalf("Couldn't load collectors: %s", err) } log.Infof("Enabled collectors:") for n := range collectors { log.Infof(" - %s", n) } nodeCollector := NodeCollector{collectors: collectors} prometheus.MustRegister(nodeCollector) sigUsr1 := make(chan os.Signal) signal.Notify(sigUsr1, syscall.SIGUSR1) handler := prometheus.Handler() if *authUser != "" || *authPass != "" { if *authUser == "" || *authPass == "" { log.Fatal("You need to specify -auth.user and -auth.pass to enable basic auth") } handler = &basicAuthHandler{ handler: prometheus.Handler().ServeHTTP, user: *authUser, password: *authPass, } } http.Handle(*metricsPath, handler) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`<html> <head><title>Node Exporter</title></head> <body> <h1>Node Exporter</h1> <p><a href="` + *metricsPath + `">Metrics</a></p> </body> </html>`)) }) log.Infof("Starting node_exporter v%s at %s", Version, *listenAddress) err = http.ListenAndServe(*listenAddress, nil) if err != nil { log.Fatal(err) } }
func main() { flag.Parse() log.SetFlags(log.LstdFlags | log.Lshortfile) prometheus.MustRegister(&mPowerCollector{}) http.Handle("/metrics", prometheus.Handler()) http.ListenAndServe(*addr, prometheus.Handler()) }
func prometheusHandler() http.Handler { handler := prometheus.Handler() if hasUserAndPassword() { handler = &basicAuthHandler{ handler: prometheus.Handler().ServeHTTP, user: *authUserFlag, password: *authPassFlag, } } return handler }
func main() { flag.Parse() // seed the RNG, otherwise we would have same randomness on every startup // which should not, but might in worst case interfere with leftover-mails // from earlier starts of the binary rand.Seed(time.Now().Unix()) err := parse_conf(*conf_path) if err != nil { fmt.Println(err) os.Exit(1) } wg := new(sync.WaitGroup) wg.Add(len(globalconf.Servers)) // now fire up the monitoring jobs for _, c := range globalconf.Servers { fmt.Println("starting monitoring for config", c["Name"]) go monitor(c, wg) // keep a timedelta between monitoring jobs to avoid strong interference time.Sleep(startupOffsetTime) } fmt.Println("starting HTTP-endpoint") if *useAuth { authenticator := auth.NewBasicAuthenticator("prometheus", Secret) http.HandleFunc(globalconf.Http_endpoint, auth.JustCheck(authenticator, prometheus.Handler().ServeHTTP)) } else { http.Handle(globalconf.Http_endpoint, prometheus.Handler()) } if *useTLS { err = http.ListenAndServeTLS(":"+globalconf.Http_port, globalconf.Crt_path, globalconf.Key_path, nil) } else { err = http.ListenAndServe(":"+globalconf.Http_port, nil) } if err != nil { fmt.Println(err) } // wait for goroutines to exit // otherwise main would terminate and the goroutines monitoring would be killed wg.Wait() }
func RegisterHandlers(mux httpMux.Mux, containerManager manager.Manager, httpAuthFile, httpAuthRealm, httpDigestFile, httpDigestRealm, prometheusEndpoint string) error { // Basic health handler. if err := healthz.RegisterHandler(mux); err != nil { return fmt.Errorf("failed to register healthz handler: %s", err) } // Validation/Debug handler. mux.HandleFunc(validate.ValidatePage, func(w http.ResponseWriter, r *http.Request) { err := validate.HandleRequest(w, containerManager) if err != nil { fmt.Fprintf(w, "%s", err) } }) // Register API handler. if err := api.RegisterHandlers(mux, containerManager); err != nil { return fmt.Errorf("failed to register API handlers: %s", err) } // Redirect / to containers page. mux.Handle("/", http.RedirectHandler(pages.ContainersPage, http.StatusTemporaryRedirect)) var authenticated bool = false // Setup the authenticator object if httpAuthFile != "" { glog.Infof("Using auth file %s", httpAuthFile) secrets := auth.HtpasswdFileProvider(httpAuthFile) authenticator := auth.NewBasicAuthenticator(httpAuthRealm, secrets) mux.HandleFunc(static.StaticResource, authenticator.Wrap(staticHandler)) if err := pages.RegisterHandlersBasic(mux, containerManager, authenticator); err != nil { return fmt.Errorf("failed to register pages auth handlers: %s", err) } authenticated = true } if httpAuthFile == "" && httpDigestFile != "" { glog.Infof("Using digest file %s", httpDigestFile) secrets := auth.HtdigestFileProvider(httpDigestFile) authenticator := auth.NewDigestAuthenticator(httpDigestRealm, secrets) mux.HandleFunc(static.StaticResource, authenticator.Wrap(staticHandler)) if err := pages.RegisterHandlersDigest(mux, containerManager, authenticator); err != nil { return fmt.Errorf("failed to register pages digest handlers: %s", err) } authenticated = true } // Change handler based on authenticator initalization if !authenticated { mux.HandleFunc(static.StaticResource, staticHandlerNoAuth) if err := pages.RegisterHandlersBasic(mux, containerManager, nil); err != nil { return fmt.Errorf("failed to register pages handlers: %s", err) } } collector := metrics.NewPrometheusCollector(containerManager) prometheus.MustRegister(collector) http.Handle(prometheusEndpoint, prometheus.Handler()) return nil }
func main() { flag.Parse() rand.Seed(time.Now().UnixNano()) fmt.Println("Debian Code Search source-backend") listener, err := net.Listen("tcp", *listenAddressStreaming) if err != nil { log.Fatal(err) } go func() { for { conn, err := listener.Accept() if err != nil { log.Fatalf("Error accepting session: %v", err) } go streamingQuery(conn) } }() http.HandleFunc("/file", File) http.Handle("/metrics", prometheus.Handler()) log.Fatal(http.ListenAndServe(*listenAddress, nil)) }
// InstallDefaultHandlers registers the default set of supported HTTP request // patterns with the restful Container. func (s *Server) InstallDefaultHandlers() { healthz.InstallHandler(s.restfulCont, healthz.PingHealthz, healthz.NamedCheck("syncloop", s.syncLoopHealthCheck), ) var ws *restful.WebService ws = new(restful.WebService) ws. Path("/pods"). Produces(restful.MIME_JSON) ws.Route(ws.GET(""). To(s.getPods). Operation("getPods")) s.restfulCont.Add(ws) s.restfulCont.Handle("/stats/", &httpHandler{f: s.handleStats}) s.restfulCont.Handle("/metrics", prometheus.Handler()) ws = new(restful.WebService) ws. Path("/spec/"). Produces(restful.MIME_JSON) ws.Route(ws.GET(""). To(s.getSpec). Operation("getSpec"). Writes(cadvisorapi.MachineInfo{})) s.restfulCont.Add(ws) }
// RegisterWeb registers handlers to serve files for the web interface. func RegisterWeb(r *route.Router, reloadCh chan<- struct{}) { ihf := prometheus.InstrumentHandlerFunc r.Get("/app/*filepath", ihf("app_files", func(w http.ResponseWriter, req *http.Request) { fp := route.Param(route.Context(req), "filepath") serveAsset(w, req, filepath.Join("ui/app", fp)) }, )) r.Get("/lib/*filepath", ihf("lib_files", func(w http.ResponseWriter, req *http.Request) { fp := route.Param(route.Context(req), "filepath") serveAsset(w, req, filepath.Join("ui/lib", fp)) }, )) r.Get("/metrics", prometheus.Handler().ServeHTTP) r.Get("/", ihf("index", func(w http.ResponseWriter, req *http.Request) { serveAsset(w, req, "ui/app/index.html") })) r.Post("/-/reload", func(w http.ResponseWriter, req *http.Request) { w.Write([]byte("Reloading configuration file...")) reloadCh <- struct{}{} }) r.Get("/debug/*subpath", http.DefaultServeMux.ServeHTTP) r.Post("/debug/*subpath", http.DefaultServeMux.ServeHTTP) }
func main() { flag.Parse() http.HandleFunc("/favicon.ico", http.NotFound) http.HandleFunc("/hi", handleHi) http.Handle("/metrics", prometheus.Handler()) log.Fatal(http.ListenAndServe(":"+*port, nil)) }
func main() { var ( listen = flag.String("listen", ":7800", "Server listen address.") name = flag.String("test.name", "unknown", "Name of the test to run.") path = flag.String("test.path", "/", "Path to hit on the targets") rate = flag.Uint64("test.rate", defaultRate, "Number of requests to send during test duration.") timeout = flag.Duration("test.timeout", defaultTimeout, "Time until a request is discarded") ts = targets{} ) flag.Var(&ts, "test.target", `Target to hit by the test with the following format: -test.target="NAME:address/url"`) flag.Parse() if *listen == "" || len(ts) == 0 { flag.Usage() os.Exit(1) } var ( test = newTest(*name, *path, *rate, defaultInterval, *timeout, ts) registry = newRegistry(prometheus.Labels{"test": test.name}) resultc = make(chan result) ) test.run(resultc) go registry.collect(resultc) http.Handle("/metrics", prometheus.Handler()) log.Printf("Starting server on %s", *listen) log.Fatal(http.ListenAndServe(*listen, nil)) }
func setupMetrics(ctx *grader.Context) { for _, gauge := range gauges { prometheus.MustRegister(gauge) } for _, counter := range counters { prometheus.MustRegister(counter) } for _, summary := range summaries { prometheus.MustRegister(summary) } metricsMux := http.NewServeMux() metricsMux.Handle("/metrics", prometheus.Handler()) go func() { addr := fmt.Sprintf(":%d", ctx.Config.Metrics.Port) ctx.Log.Error( "http listen and serve", "err", http.ListenAndServe(addr, metricsMux), ) }() go func() { gaugesUpdate() time.Sleep(time.Duration(1) * time.Minute) }() }
func main() { flag.Parse() yamlFile, err := ioutil.ReadFile(*configFile) if err != nil { log.Fatalf("Error reading config file: %s", err) } config := Config{} err = yaml.Unmarshal(yamlFile, &config) if err != nil { log.Fatalf("Error parsing config file: %s", err) } http.Handle("/metrics", prometheus.Handler()) http.HandleFunc("/probe", func(w http.ResponseWriter, r *http.Request) { probeHandler(w, r, &config) }) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`<html> <head><title>Blackbox Exporter</title></head> <body> <h1>Blackbox Exporter</h1> <p><a href="/probe?target=prometheus.io&module=http_2xx">Probe prometheus.io for http_2xx</a></p> <p><a href="/metrics">Metrics</a></p> </body> </html>`)) }) if err := http.ListenAndServe(*addr, nil); err != nil { log.Fatalf("Error starting HTTP server: %s", err) } }
func (s *Server) startStatusHTTP() { once.Do(func() { go func() { http.HandleFunc("/status", func(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") s := status{ Connections: s.ConnectionCount(), Version: mysql.ServerVersion, GitHash: printer.TiDBGitHash, } js, err := json.Marshal(s) if err != nil { w.WriteHeader(http.StatusInternalServerError) log.Error("Encode json error", err) } else { w.Write(js) } }) // HTTP path for prometheus. http.Handle("/metrics", prometheus.Handler()) addr := s.cfg.StatusAddr if len(addr) == 0 { addr = defaultStatusAddr } log.Infof("Listening on %v for status and metrics report.", addr) err := http.ListenAndServe(addr, nil) if err != nil { log.Fatal(err) } }() }) }
func main() { go DockerCollection() http.Handle("/metrics", prometheus.Handler()) http.ListenAndServe(":7890", nil) }
// RootHandler returns the handler that routes all the paths from / for the // server. func RootHandler(ac auth.AccessController, ctx context.Context, trust signed.CryptoService) http.Handler { hand := utils.RootHandlerFactory(ac, ctx, trust) r := mux.NewRouter() r.Methods("GET").Path("/v2/").Handler(hand(handlers.MainHandler)) r.Methods("POST").Path("/v2/{imageName:.*}/_trust/tuf/").Handler( prometheus.InstrumentHandlerWithOpts( prometheusOpts("UpdateTuf"), hand(handlers.AtomicUpdateHandler, "push", "pull"))) r.Methods("GET").Path("/v2/{imageName:.*}/_trust/tuf/{tufRole:root|targets(?:/[^/\\s]+)*|snapshot|timestamp}.{checksum:[a-fA-F0-9]{64}|[a-fA-F0-9]{96}|[a-fA-F0-9]{128}}.json").Handler( prometheus.InstrumentHandlerWithOpts( prometheusOpts("GetRoleByHash"), hand(handlers.GetHandler, "pull"))) r.Methods("GET").Path("/v2/{imageName:.*}/_trust/tuf/{tufRole:root|targets(?:/[^/\\s]+)*|snapshot|timestamp}.json").Handler( prometheus.InstrumentHandlerWithOpts( prometheusOpts("GetRole"), hand(handlers.GetHandler, "pull"))) r.Methods("GET").Path( "/v2/{imageName:.*}/_trust/tuf/{tufRole:snapshot|timestamp}.key").Handler( prometheus.InstrumentHandlerWithOpts( prometheusOpts("GetKey"), hand(handlers.GetKeyHandler, "push", "pull"))) r.Methods("DELETE").Path("/v2/{imageName:.*}/_trust/tuf/").Handler( prometheus.InstrumentHandlerWithOpts( prometheusOpts("DeleteTuf"), hand(handlers.DeleteHandler, "push", "pull"))) r.Methods("GET").Path("/_notary_server/health").HandlerFunc(health.StatusHandler) r.Methods("GET").Path("/metrics").Handler(prometheus.Handler()) r.Methods("GET", "POST", "PUT", "HEAD", "DELETE").Path("/{other:.*}").Handler( hand(handlers.NotFoundHandler)) return r }
func startMonitoring(addr string) { var redisActiveConn = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "redis_active_conn", Help: "Number of active redis connections.", }) prometheus.MustRegister(redisActiveConn) var redisMaxConn = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "redis_max_conn", Help: "Maximum number of redis connections.", }) prometheus.MustRegister(redisMaxConn) http.Handle("/metrics", prometheus.Handler()) redisMaxConn.Set(float64(redisPool.MaxActive)) go func() { tick := time.NewTicker(1 * time.Second) for range tick.C { if redisPool == nil { redisActiveConn.Set(0) } else { redisActiveConn.Set(float64(redisPool.ActiveCount())) } } }() err := http.ListenAndServe(addr, nil) if err != nil { lg.Fatal(err) } }
func testPrometheusCollector(t *testing.T, c *PrometheusCollector, metricsFile string) { rw := httptest.NewRecorder() prometheus.Handler().ServeHTTP(rw, &http.Request{}) wantMetrics, err := ioutil.ReadFile(metricsFile) if err != nil { t.Fatalf("unable to read input test file %s", metricsFile) } wantLines := strings.Split(string(wantMetrics), "\n") gotLines := strings.Split(string(rw.Body.String()), "\n") // Until the Prometheus Go client library offers better testability // (https://github.com/prometheus/client_golang/issues/58), we simply compare // verbatim text-format metrics outputs, but ignore certain metric lines // whose value depends on the current time or local circumstances. for i, want := range wantLines { if !includeRe.MatchString(want) || ignoreRe.MatchString(want) { continue } if want != gotLines[i] { t.Fatalf("unexpected metric line\nwant: %s\nhave: %s", want, gotLines[i]) } } }
// Metrics registers the DNS metrics to Prometheus, and starts the internal metrics // server if the environment variable PROMETHEUS_PORT is set. func Metrics() { if prometheusPath == "" { prometheusPath = "/metrics" } if prometheusSubsystem == "" { prometheusSubsystem = "skydns" } RegisterMetrics(prometheusNamespace, prometheusSubsystem) if prometheusPort == "" { return } _, err := strconv.Atoi(prometheusPort) if err != nil { fatalf("bad port for prometheus: %s", prometheusPort) } http.Handle(prometheusPath, prometheus.Handler()) go func() { fatalf("%s", http.ListenAndServe(":"+prometheusPort, nil)) }() logf("metrics enabled on :%s%s", prometheusPort, prometheusPath) }
// InstallDefaultHandlers registers the default set of supported HTTP request // patterns with the restful Container. func (s *Server) InstallDefaultHandlers() { healthz.InstallHandler(s.restfulCont, healthz.PingHealthz, healthz.NamedCheck("syncloop", s.syncLoopHealthCheck), healthz.NamedCheck("pleg", s.plegHealthCheck), ) var ws *restful.WebService ws = new(restful.WebService) ws. Path("/pods"). Produces(restful.MIME_JSON) ws.Route(ws.GET(""). To(s.getPods). Operation("getPods")) s.restfulCont.Add(ws) s.restfulCont.Add(stats.CreateHandlers(statsPath, s.host, s.resourceAnalyzer)) s.restfulCont.Handle(metricsPath, prometheus.Handler()) ws = new(restful.WebService) ws. Path(specPath). Produces(restful.MIME_JSON) ws.Route(ws.GET(""). To(s.getSpec). Operation("getSpec"). Writes(cadvisorapi.MachineInfo{})) s.restfulCont.Add(ws) }
func main() { flag.Parse() ex, err := createNsqExecutor() if err != nil { log.Fatalf("error creating nsq executor: %v", err) } prometheus.MustRegister(ex) http.Handle(*metricsPath, prometheus.Handler()) if *metricsPath != "" && *metricsPath != "/" { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`<html> <head><title>NSQ Exporter</title></head> <body> <h1>NSQ Exporter</h1> <p><a href="` + *metricsPath + `">Metrics</a></p> </body> </html>`)) }) } log.Print("listening to ", *listenAddress) err = http.ListenAndServe(*listenAddress, nil) if err != nil { log.Fatal(err) } }
func startHTTP(s *options.SchedulerServer) { mux := http.NewServeMux() healthz.InstallHandler(mux) if s.EnableProfiling { mux.HandleFunc("/debug/pprof/", pprof.Index) mux.HandleFunc("/debug/pprof/profile", pprof.Profile) mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) if s.EnableContentionProfiling { goruntime.SetBlockProfileRate(1) } } if c, err := configz.New("componentconfig"); err == nil { c.Set(s.KubeSchedulerConfiguration) } else { glog.Errorf("unable to register configz: %s", err) } configz.InstallHandler(mux) mux.Handle("/metrics", prometheus.Handler()) server := &http.Server{ Addr: net.JoinHostPort(s.Address, strconv.Itoa(int(s.Port))), Handler: mux, } glog.Fatal(server.ListenAndServe()) }
func main() { var ( listenAddress = flag.String("web.listen-address", ":9108", "Address to listen on for web interface and telemetry.") metricsPath = flag.String("web.telemetry-path", "/metrics", "Path under which to expose metrics.") esURI = flag.String("es.uri", "http://localhost:9200", "HTTP API address of an Elasticsearch node.") esTimeout = flag.Duration("es.timeout", 5*time.Second, "Timeout for trying to get stats from Elasticsearch.") esAllNodes = flag.Bool("es.all", false, "Export stats for all nodes in the cluster.") ) flag.Parse() exporter := NewExporter(*esURI, *esTimeout, *esAllNodes) prometheus.MustRegister(exporter) log.Println("Starting Server:", *listenAddress) http.Handle(*metricsPath, prometheus.Handler()) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`<html> <head><title>Elasticsearch Exporter</title></head> <body> <h1>Elasticsearch Exporter</h1> <p><a href='` + *metricsPath + `'>Metrics</a></p> </body> </html>`)) }) log.Fatal(http.ListenAndServe(*listenAddress, nil)) }
func main() { flag.Parse() addrs := strings.Split(*redisAddr, ",") if len(addrs) == 0 || len(addrs[0]) == 0 { log.Fatal("Invalid parameter --redis.addr") } e := NewRedisExporter(addrs, *namespace) prometheus.MustRegister(e) http.Handle(*metricPath, prometheus.Handler()) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`<html> <head><title>Redis exporter</title></head> <body> <h1>Redis exporter</h1> <p><a href='` + *metricPath + `'>Metrics</a></p> </body> </html> `)) }) log.Printf("providing metrics at %s%s", *listenAddress, *metricPath) log.Printf("Connecting to: %#v", addrs) log.Fatal(http.ListenAndServe(*listenAddress, nil)) }
func main() { var ( listenAddress = flag.String("web.listen-address", ":9107", "Address to listen on for web interface and telemetry.") metricsPath = flag.String("web.telemetry-path", "/metrics", "Path under which to expose metrics.") consulServer = flag.String("consul.server", "localhost:8500", "HTTP API address of a Consul server or agent.") kvPrefix = flag.String("kv.prefix", "", "Prefix from which to expose key/value pairs.") kvFilter = flag.String("kv.filter", ".*", "Regex that determines which keys to expose.") ) flag.Parse() exporter := NewExporter(*consulServer, *kvPrefix, *kvFilter) prometheus.MustRegister(exporter) log.Infof("Starting Server: %s", *listenAddress) http.Handle(*metricsPath, prometheus.Handler()) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`<html> <head><title>Consul Exporter</title></head> <body> <h1>Consul Exporter</h1> <p><a href='` + *metricsPath + `'>Metrics</a></p> </body> </html>`)) }) log.Fatal(http.ListenAndServe(*listenAddress, nil)) }
func main() { flag.Parse() shards = strings.Split(*shardsStr, ",") log.Printf("Configuration: %d shards:\n", len(shards)) for _, shard := range shards { log.Printf(" %q\n", shard) } // Calls /merge once appropriate. go merge() // Calls checkSources() every hour (sanity check, so that /lookfor is not critical). go func() { for { checkSources() time.Sleep(1 * time.Hour) } }() http.HandleFunc("/lookfor", lookforHandler) http.HandleFunc("/goroutinez", goroutinez.Goroutinez) http.Handle("/metrics", prometheus.Handler()) log.Fatal(http.ListenAndServe(*listenAddress, nil)) }
func main() { var ( listenAddress = flag.String("listen-address", ":9120", "Address to listen on for web interface and telemetry.") metricsPath = flag.String("metric-path", "/metrics", "Path under which to expose metrics.") apiURL = flag.String("api-url", "http://localhost:8001/", "Base-URL of PowerDNS authoritative server/recursor API.") apiKey = flag.String("api-key", "", "PowerDNS API Key") ) flag.Parse() hostURL, err := url.Parse(*apiURL) if err != nil { log.Fatalf("Error parsing api-url: %v", err) } server, err := getServerInfo(hostURL, *apiKey) if err != nil { log.Fatalf("Could not fetch PowerDNS server info: %v", err) } exporter := NewExporter(*apiKey, server.DaemonType, hostURL) prometheus.MustRegister(exporter) log.Infof("Starting Server: %s", *listenAddress) http.Handle(*metricsPath, prometheus.Handler()) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`<html> <head><title>PowerDNS Exporter</title></head> <body> <h1>PowerDNS Exporter</h1> <p><a href='` + *metricsPath + `'>Metrics</a></p> </body> </html>`)) }) log.Fatal(http.ListenAndServe(*listenAddress, nil)) }
func (exp *exporter) main(c *cli.Context) { setupLogging(c) registry := newRegistry() collector, err := exp.Init(c, registry) if err != nil { log.Fatal(err) } if exp.Tick { collector.Collect(registry) interval := c.Int("interval") go func() { for _ = range time.Tick(time.Duration(interval) * time.Second) { if exp.ResetOnTick { registry.Reset() } collector.Collect(registry) } }() } http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { w.Header().Add("Location", exp.MetricsPath) w.WriteHeader(http.StatusFound) }) http.Handle(exp.MetricsPath, prometheus.Handler()) if err := http.ListenAndServe(fmt.Sprintf(":%d", c.Int("port")), nil); err != nil { log.Fatal(err) } }