func New(logger log.Logger, o *Options) *Handler {
	router := route.New().WithInstrumentation(instrumentHandler)
	cwd, err := os.Getwd()

	if err != nil {
		cwd = "<error retrieving current working directory>"
	}
	if logger == nil {
		logger = log.NewNopLogger()
	}

	h := &Handler{
		logger:      logger,
		router:      router,
		quitCh:      make(chan struct{}),
		reloadCh:    make(chan chan error),
		options:     o,
		versionInfo: o.Version,
		birth:       time.Now(),
		cwd:         cwd,
		flagsMap:    o.Flags,

		context:       o.Context,
		scrapeManager: o.ScrapeManager,
		ruleManager:   o.RuleManager,
		queryEngine:   o.QueryEngine,
		tsdb:          o.TSDB,
		storage:       o.Storage,
		notifier:      o.Notifier,

		now: model.Now,

		ready: 0,
	}

	h.apiV1 = api_v1.NewAPI(h.queryEngine, h.storage, h.scrapeManager, h.notifier,
		func() config.Config {
			h.mtx.RLock()
			defer h.mtx.RUnlock()
			return *h.config
		},
		o.Flags,
		h.testReady,
		func() api_v1.TSDBAdmin {
			return h.options.TSDB()
		},
		h.options.EnableAdminAPI,
		logger,
		h.ruleManager,
		h.options.RemoteReadSampleLimit,
		h.options.RemoteReadConcurrencyLimit,
		h.options.CORSOrigin,
	)

	if o.RoutePrefix != "/" {
		// If the prefix is missing for the root path, prepend it.
		router.Get("/", func(w http.ResponseWriter, r *http.Request) {
			http.Redirect(w, r, o.RoutePrefix, http.StatusFound)
		})
		router = router.WithPrefix(o.RoutePrefix)
	}

	readyf := h.testReady

	router.Get("/", func(w http.ResponseWriter, r *http.Request) {
		http.Redirect(w, r, path.Join(o.ExternalURL.Path, "/graph"), http.StatusFound)
	})

	router.Get("/alerts", readyf(h.alerts))
	router.Get("/graph", readyf(h.graph))
	router.Get("/status", readyf(h.status))
	router.Get("/flags", readyf(h.flags))
	router.Get("/config", readyf(h.serveConfig))
	router.Get("/rules", readyf(h.rules))
	router.Get("/targets", readyf(h.targets))
	router.Get("/version", readyf(h.version))
	router.Get("/service-discovery", readyf(h.serviceDiscovery))

	router.Get("/metrics", promhttp.Handler().ServeHTTP)

	router.Get("/federate", readyf(httputil.CompressionHandler{
		Handler: http.HandlerFunc(h.federation),
	}.ServeHTTP))

	router.Get("/consoles/*filepath", readyf(h.consoles))

	router.Get("/static/*filepath", func(w http.ResponseWriter, r *http.Request) {
		r.URL.Path = path.Join("/static", route.Param(r.Context(), "filepath"))
		fs := http.FileServer(ui.Assets)
		fs.ServeHTTP(w, r)
	})

	if o.UserAssetsPath != "" {
		router.Get("/user/*filepath", route.FileServe(o.UserAssetsPath))
	}

	if o.EnableLifecycle {
		router.Post("/-/quit", h.quit)
		router.Put("/-/quit", h.quit)
		router.Post("/-/reload", h.reload)
		router.Put("/-/reload", h.reload)
	} else {
		router.Post("/-/quit", func(w http.ResponseWriter, _ *http.Request) {
			w.WriteHeader(http.StatusForbidden)
			w.Write([]byte("Lifecycle APIs are not enabled"))
		})
		router.Post("/-/reload", func(w http.ResponseWriter, _ *http.Request) {
			w.WriteHeader(http.StatusForbidden)
			w.Write([]byte("Lifecycle APIs are not enabled"))
		})
	}
	router.Get("/-/quit", func(w http.ResponseWriter, _ *http.Request) {
		w.WriteHeader(http.StatusMethodNotAllowed)
		w.Write([]byte("Only POST or PUT requests allowed"))
	})
	router.Get("/-/reload", func(w http.ResponseWriter, _ *http.Request) {
		w.WriteHeader(http.StatusMethodNotAllowed)
		w.Write([]byte("Only POST or PUT requests allowed"))
	})

	router.Get("/debug/*subpath", serveDebug)
	router.Post("/debug/*subpath", serveDebug)

	router.Get("/-/healthy", func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
		fmt.Fprintf(w, "Prometheus is Healthy.\n")
	})
	router.Get("/-/ready", readyf(func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
		fmt.Fprintf(w, "Prometheus is Ready.\n")
	}))

	return h
}
func New(logger log.Logger, o *Options) *Handler {
	router := route.New().WithInstrumentation(instrumentHandler)
	cwd, err := os.Getwd()

	if err != nil {
		cwd = "<error retrieving current working directory>"
	}
	if logger == nil {
		logger = log.NewNopLogger()
	}

	h := &Handler{
		logger:      logger,
		router:      router,
		quitCh:      make(chan struct{}),
		reloadCh:    make(chan chan error),
		options:     o,
		versionInfo: o.Version,
		birth:       time.Now(),
		cwd:         cwd,
		flagsMap:    o.Flags,

		context:       o.Context,
		scrapeManager: o.ScrapeManager,
		ruleManager:   o.RuleManager,
		queryEngine:   o.QueryEngine,
		tsdb:          o.TSDB,
		storage:       o.Storage,
		notifier:      o.Notifier,

		now: model.Now,

		ready: 0,
	}

	h.apiV1 = api_v1.NewAPI(h.queryEngine, h.storage, h.scrapeManager, h.notifier,
		func() config.Config {
			h.mtx.RLock()
			defer h.mtx.RUnlock()
			return *h.config
		},
		o.Flags,
		h.testReady,
		func() api_v1.TSDBAdmin {
			return h.options.TSDB()
		},
		h.options.EnableAdminAPI,
		logger,
		h.ruleManager,
		h.options.RemoteReadSampleLimit,
		h.options.RemoteReadConcurrencyLimit,
		h.options.CORSOrigin,
	)

	if o.RoutePrefix != "/" {
		
		router.Get("/", func(w http.ResponseWriter, r *http.Request) {
			http.Redirect(w, r, o.RoutePrefix, http.StatusFound)
		})
		router = router.WithPrefix(o.RoutePrefix)
	}

	readyf := h.testReady

	router.Get("/", func(w http.ResponseWriter, r *http.Request) {
		http.Redirect(w, r, path.Join(o.ExternalURL.Path, "/graph"), http.StatusFound)
	})

	router.Get("/alerts", readyf(h.alerts))
	router.Get("/graph", readyf(h.graph))
	router.Get("/status", readyf(h.status))
	router.Get("/flags", readyf(h.flags))
	router.Get("/config", readyf(h.serveConfig))
	router.Get("/rules", readyf(h.rules))
	router.Get("/targets", readyf(h.targets))
	router.Get("/version", readyf(h.version))
	router.Get("/service-discovery", readyf(h.serviceDiscovery))

	router.Get("/metrics", promhttp.Handler().ServeHTTP)

	router.Get("/federate", readyf(httputil.CompressionHandler{
		Handler: http.HandlerFunc(h.federation),
	}.ServeHTTP))

	router.Get("/consoles/*filepath", readyf(h.consoles))

	router.Get("/static/*filepath", func(w http.ResponseWriter, r *http.Request) {
		r.URL.Path = path.Join("/static", route.Param(r.Context(), "filepath"))
		fs := http.FileServer(ui.Assets)
		fs.ServeHTTP(w, r)
	})

	if o.UserAssetsPath != "" {
		router.Get("/user/*filepath", route.FileServe(o.UserAssetsPath))
	}

	if o.EnableLifecycle {
		router.Post("/-/quit", h.quit)
		router.Put("/-/quit", h.quit)
		router.Post("/-/reload", h.reload)
		router.Put("/-/reload", h.reload)
	} else {
		router.Post("/-/quit", func(w http.ResponseWriter, _ *http.Request) {
			w.WriteHeader(http.StatusForbidden)
			w.Write([]byte("Lifecycle APIs are not enabled"))
		})
		router.Post("/-/reload", func(w http.ResponseWriter, _ *http.Request) {
			w.WriteHeader(http.StatusForbidden)
			w.Write([]byte("Lifecycle APIs are not enabled"))
		})
	}
	router.Get("/-/quit", func(w http.ResponseWriter, _ *http.Request) {
		w.WriteHeader(http.StatusMethodNotAllowed)
		w.Write([]byte("Only POST or PUT requests allowed"))
	})
	router.Get("/-/reload", func(w http.ResponseWriter, _ *http.Request) {
		w.WriteHeader(http.StatusMethodNotAllowed)
		w.Write([]byte("Only POST or PUT requests allowed"))
	})

	router.Get("/debug/*subpath", serveDebug)
	router.Post("/debug/*subpath", serveDebug)

	router.Get("/-/healthy", func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
		fmt.Fprintf(w, "Prometheus is Healthy.\n")
	})
	router.Get("/-/ready", readyf(func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
		fmt.Fprintf(w, "Prometheus is Ready.\n")
	}))

	return h
}
func New ( logger log . Logger , o * Options ) * Handler { router := route . New ( ) . WithInstrumentation ( instrumentHandler ) cwd , err := os . Getwd ( ) if err != nil { cwd = " " } if logger == nil { logger = log . NewNopLogger ( ) } h := & Handler { logger : logger , router : router , quitCh : make ( chan struct { } ) , reloadCh : make ( chan chan error ) , options : o , versionInfo : o . Version , birth : time . Now ( ) , cwd : cwd , flagsMap : o . Flags , context : o . Context , scrapeManager : o . ScrapeManager , ruleManager : o . RuleManager , queryEngine : o . QueryEngine , tsdb : o . TSDB , storage : o . Storage , notifier : o . Notifier , now : model . Now , ready : 0 , } h . apiV1 = api_v1 . NewAPI ( h . queryEngine , h . storage , h . scrapeManager , h . notifier , func ( ) config . Config { h . mtx . RLock ( ) defer h . mtx . RUnlock ( ) return * h . config } , o . Flags , h . testReady , func ( ) api_v1 . TSDBAdmin { return h . options . TSDB ( ) } , h . options . EnableAdminAPI , logger , h . ruleManager , h . options . RemoteReadSampleLimit , h . options . RemoteReadConcurrencyLimit , h . options . CORSOrigin , ) if o . RoutePrefix != " " { // If the prefix is missing for the root path, prepend it. router . Get ( " " , func ( w http . ResponseWriter , r * http . Request ) { http . Redirect ( w , r , o . RoutePrefix , http . StatusFound ) } ) router = router . WithPrefix ( o . RoutePrefix ) } readyf := h . testReady router . Get ( " " , func ( w http . ResponseWriter , r * http . Request ) { http . Redirect ( w , r , path . Join ( o . ExternalURL . Path , " " ) , http . StatusFound ) } ) router . Get ( " " , readyf ( h . alerts ) ) router . Get ( " " , readyf ( h . graph ) ) router . Get ( " " , readyf ( h . status ) ) router . Get ( " " , readyf ( h . flags ) ) router . Get ( " " , readyf ( h . serveConfig ) ) router . Get ( " " , readyf ( h . rules ) ) router . Get ( " " , readyf ( h . targets ) ) router . Get ( " " , readyf ( h . version ) ) router . Get ( " " , readyf ( h . serviceDiscovery ) ) router . Get ( " " , promhttp . Handler ( ) . ServeHTTP ) router . Get ( " " , readyf ( httputil . CompressionHandler { Handler : http . HandlerFunc ( h . federation ) , } . ServeHTTP ) ) router . Get ( " " , readyf ( h . consoles ) ) router . Get ( " " , func ( w http . ResponseWriter , r * http . Request ) { r . URL . Path = path . Join ( " " , route . Param ( r . Context ( ) , " " ) ) fs := http . FileServer ( ui . Assets ) fs . ServeHTTP ( w , r ) } ) if o . UserAssetsPath != " " { router . Get ( " " , route . FileServe ( o . UserAssetsPath ) ) } if o . EnableLifecycle { router . Post ( " " , h . quit ) router . Put ( " " , h . quit ) router . Post ( " " , h . reload ) router . Put ( " " , h . reload ) } else { router . Post ( " " , func ( w http . ResponseWriter , _ * http . Request ) { w . WriteHeader ( http . StatusForbidden ) w . Write ( [ ] byte ( " " ) ) } ) router . Post ( " " , func ( w http . ResponseWriter , _ * http . Request ) { w . WriteHeader ( http . StatusForbidden ) w . Write ( [ ] byte ( " " ) ) } ) } router . Get ( " " , func ( w http . ResponseWriter , _ * http . Request ) { w . WriteHeader ( http . StatusMethodNotAllowed ) w . Write ( [ ] byte ( " " ) ) } ) router . Get ( " " , func ( w http . ResponseWriter , _ * http . Request ) { w . WriteHeader ( http . StatusMethodNotAllowed ) w . Write ( [ ] byte ( " " ) ) } ) router . Get ( " " , serveDebug ) router . Post ( " " , serveDebug ) router . Get ( " " , func ( w http . ResponseWriter , r * http . Request ) { w . WriteHeader ( http . StatusOK ) fmt . Fprintf ( w , " \n " ) } ) router . Get ( " " , readyf ( func ( w http . ResponseWriter , r * http . Request ) { w . WriteHeader ( http . StatusOK ) fmt . Fprintf ( w , " \n " ) } ) ) return h }
// New initializes a new web Handler.
New initializes a new web Handler .