// Register the mainApi on the specified endpoint. func (a *Api) Register(container *restful.Container) { ws := new(restful.WebService) ws.Path("/api/v1/metric-export"). Doc("Exports the latest point for all Heapster metrics"). Produces(restful.MIME_JSON) ws.Route(ws.GET(""). To(a.exportMetrics). Doc("export the latest data point for all metrics"). Operation("exportMetrics"). Writes([]*types.Timeseries{})) container.Add(ws) ws = new(restful.WebService) ws.Path("/api/v1/metric-export-schema"). Doc("Schema for metrics exported by heapster"). Produces(restful.MIME_JSON) ws.Route(ws.GET(""). To(a.exportMetricsSchema). Doc("export the schema for all metrics"). Operation("exportmetricsSchema"). Writes(types.TimeseriesSchema{})) container.Add(ws) if a.metricSink != nil { a.RegisterModel(container) } if a.historicalSource != nil { a.RegisterHistorical(container) } }
// 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) }
// initAPIVersionRoute initializes the osapi endpoint to behave similar to the upstream api endpoint func initAPIVersionRoute(root *restful.WebService, prefix string, versions ...string) { versionHandler := apiserver.APIVersionHandler(versions...) root.Route(root.GET(prefix).To(versionHandler). Doc("list supported server API versions"). Produces(restful.MIME_JSON). Consumes(restful.MIME_JSON)) }
// Creates a new HTTP handler that handles all requests to the API of the backend. func CreateApiHandler(client *client.Client) http.Handler { wsContainer := restful.NewContainer() // TODO(bryk): This is for tests only. Replace with real implementation once ready. ws := new(restful.WebService) ws.Path("/api/deploy"). Consumes(restful.MIME_JSON). Produces(restful.MIME_JSON) ws.Route(ws.POST("").To(func(request *restful.Request, response *restful.Response) { cfg := new(DeployAppConfig) if err := request.ReadEntity(cfg); err != nil { HandleInternalError(response, err) return } if err := DeployApp(cfg, client); err != nil { HandleInternalError(response, err) return } response.WriteHeaderAndEntity(http.StatusCreated, cfg) }).Reads(DeployAppConfig{}).Writes(DeployAppConfig{})) wsContainer.Add(ws) return wsContainer }
// 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) }
// Creates a new HTTP handler that handles all requests to the API of the backend. func CreateHttpApiHandler(client *client.Client) http.Handler { apiHandler := ApiHandler{client} wsContainer := restful.NewContainer() deployWs := new(restful.WebService) deployWs.Path("/api/deploy"). Consumes(restful.MIME_JSON). Produces(restful.MIME_JSON) deployWs.Route( deployWs.POST(""). To(apiHandler.handleDeploy). Reads(AppDeployment{}). Writes(AppDeployment{})) wsContainer.Add(deployWs) microserviceListWs := new(restful.WebService) microserviceListWs.Path("/api/microservice"). Produces(restful.MIME_JSON) microserviceListWs.Route( microserviceListWs.GET(""). To(apiHandler.handleGetMicroserviceList). Writes(MicroserviceList{})) wsContainer.Add(microserviceListWs) return wsContainer }
// RegisterMetrics registers the Metrics API endpoints. // All endpoints that end with a {metric-name} also receive a start time query parameter. // The start and end times should be specified as a string, formatted according to RFC 3339. // These apis are experimental, so they may change or disappear in the future. func (a *Api) RegisterMetrics(container *restful.Container) { ws := new(restful.WebService) ws. Path("/experimental/v2"). Doc("Root endpoint of the stats model"). Consumes("*/*"). Produces(restful.MIME_JSON) ws.Route(ws.GET("/nodeMetrics/derived/"). To(a.derivedNodeMetricsList). Filter(compressionFilter). Doc("Get a list of all available metrics for all nodes"). Writes([]types.DerivedNodeMetrics{}). Operation("derivedNodeMetricsList")) ws.Route(ws.GET("/nodeMetrics/derived/{node-name}"). To(a.derivedNodeMetrics). Filter(compressionFilter). Doc("Get a list of all raw metrics for a Node entity"). Writes(types.DerivedNodeMetrics{}). Operation("derivedNodeMetrics"). Param(ws.PathParameter("node-name", "The name of the node to look up").DataType("string"))) container.Add(ws) }
// initOAuthAuthorizationServerMetadataRoute initializes an HTTP endpoint for OAuth 2.0 Authorization Server Metadata discovery // https://tools.ietf.org/id/draft-ietf-oauth-discovery-04.html#rfc.section.2 // masterPublicURL should be internally and externally routable to allow all users to discover this information func initOAuthAuthorizationServerMetadataRoute(apiContainer *genericmux.APIContainer, path, masterPublicURL string) { // Build OAuth metadata once metadata, err := json.MarshalIndent(discovery.Get(masterPublicURL, OpenShiftOAuthAuthorizeURL(masterPublicURL), OpenShiftOAuthTokenURL(masterPublicURL)), "", " ") if err != nil { glog.Errorf("Unable to initialize OAuth authorization server metadata route: %v", err) return } secretContainer := restful.Container{ ServeMux: apiContainer.SecretRoutes.(*http.ServeMux), // we know it's a *http.ServeMux. In kube 1.6, the type will actually be correct. } // Set up a service to return the OAuth metadata. ws := new(restful.WebService) ws.Path(path) ws.Doc("OAuth 2.0 Authorization Server Metadata") ws.Route( ws.GET("/").To(func(_ *restful.Request, resp *restful.Response) { writeJSON(resp, metadata) }). Doc("get the server's OAuth 2.0 Authorization Server Metadata"). Operation("getOAuthAuthorizationServerMetadata"). Produces(restful.MIME_JSON)) secretContainer.Add(ws) }
func setupHandlers(metricSink *metricsink.MetricSink, podLister *cache.StoreToPodLister) http.Handler { runningInKubernetes := true // Make API handler. wsContainer := restful.NewContainer() wsContainer.EnableContentEncoding(true) wsContainer.Router(restful.CurlyRouter{}) a := v1.NewApi(runningInKubernetes, metricSink) a.Register(wsContainer) // Metrics API m := metricsApi.NewApi(metricSink, podLister) m.Register(wsContainer) handlePprofEndpoint := func(req *restful.Request, resp *restful.Response) { name := strings.TrimPrefix(req.Request.URL.Path, pprofBasePath) switch name { case "profile": pprof.Profile(resp, req.Request) case "symbol": pprof.Symbol(resp, req.Request) case "cmdline": pprof.Cmdline(resp, req.Request) default: pprof.Index(resp, req.Request) } } // Setup pporf handlers. ws := new(restful.WebService).Path(pprofBasePath) ws.Route(ws.GET("/{subpath:*}").To(metrics.InstrumentRouteFunc("pprof", handlePprofEndpoint))).Doc("pprof endpoint") wsContainer.Add(ws) return wsContainer }
// initHealthCheckRoute initalizes an HTTP endpoint for health checking. // OpenShift is deemed healthy if the API server can respond with an OK messages func initMetricsRoute(root *restful.WebService, path string) { h := prometheus.Handler() root.Route(root.GET(path).To(func(req *restful.Request, resp *restful.Response) { h.ServeHTTP(resp.ResponseWriter, req.Request) }).Doc("return metrics for this process"). Returns(http.StatusOK, "if metrics are available", nil). Produces("text/plain")) }
// initHealthCheckRoute initalizes an HTTP endpoint for health checking. // OpenShift is deemed healthy if the API server can respond with an OK messages func initHealthCheckRoute(root *restful.WebService, path string) { root.Route(root.GET(path).To(func(req *restful.Request, resp *restful.Response) { resp.ResponseWriter.WriteHeader(http.StatusOK) resp.ResponseWriter.Write([]byte("ok")) }).Doc("return the health state of the master"). Returns(http.StatusOK, "if master is healthy", nil). Produces(restful.MIME_JSON)) }
// NewService creates and returns a new Service, initalized with a new // restful.WebService configured with a route that dispatches to the supplied // handler. The new Service must be registered before accepting traffic by // calling Register. func NewService(handler restful.RouteFunction) *Service { restful.EnableTracing(true) webService := new(restful.WebService) webService.Consumes(restful.MIME_JSON, restful.MIME_XML) webService.Produces(restful.MIME_JSON, restful.MIME_XML) webService.Route(webService.POST("/expand").To(handler). Doc("Expand a template."). Reads(&expander.Template{})) return &Service{webService} }
// initAPIVersionRoute initializes the osapi endpoint to behave similar to the upstream api endpoint func initAPIVersionRoute(root *restful.WebService, prefix string, versions ...string) { versionHandler := apiserver.APIVersionHandler(kapi.Codecs, func(req *restful.Request) *unversioned.APIVersions { apiVersionsForDiscovery := unversioned.APIVersions{ // TODO: ServerAddressByClientCIDRs: s.getServerAddressByClientCIDRs(req.Request), Versions: versions, } return &apiVersionsForDiscovery }) root.Route(root.GET(prefix).To(versionHandler). Doc("list supported server API versions"). Produces(restful.MIME_JSON). Consumes(restful.MIME_JSON)) }
// initMetricsRoute initializes an HTTP endpoint for metrics. func initMetricsRoute(apiContainer *genericmux.APIContainer, path string) { ws := new(restful.WebService). Path(path). Doc("return metrics for this process") h := prometheus.Handler() ws.Route(ws.GET("/").To(func(req *restful.Request, resp *restful.Response) { h.ServeHTTP(resp.ResponseWriter, req.Request) }).Doc("return metrics for this process"). Returns(http.StatusOK, "if metrics are available", nil). Produces("text/plain")) apiContainer.Add(ws) }
func (a *Api) Register(container *restful.Container) { ws := new(restful.WebService) ws.Path("/apis/metrics/v1alpha1"). Doc("Root endpoint of metrics API"). Produces(restful.MIME_JSON) ws.Route(ws.GET("/nodes/"). To(a.nodeMetricsList). Doc("Get a list of metrics for all available nodes."). Operation("nodeMetricsList")) ws.Route(ws.GET("/nodes/{node-name}/"). To(a.nodeMetrics). Doc("Get a list of all available metrics for the specified node."). Operation("nodeMetrics"). Param(ws.PathParameter("node-name", "The name of the node to lookup").DataType("string"))) ws.Route(ws.GET("/namespaces/{namespace-name}/pods/"). To(a.podMetricsList). Doc("Get a list of metrics for all available pods in the specified namespace."). Operation("podMetricsList"). Param(ws.PathParameter("namespace-name", "The name of the namespace to lookup").DataType("string"))). Param(ws.QueryParameter("labelSelector", "A selector to restrict the list of returned objects by their labels. Defaults to everything.").DataType("string")) ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/"). To(a.podMetrics). Doc("Get metrics for the specified pod in the specified namespace."). Operation("podMetrics"). Param(ws.PathParameter("namespace-name", "The name of the namespace to lookup").DataType("string")). Param(ws.PathParameter("pod-name", "The name of the pod to lookup").DataType("string"))) container.Add(ws) }
func register(container *restful.Container) { restful.RegisterEntityAccessor(MIME_MSGPACK, NewEntityAccessorMsgPack()) ws := new(restful.WebService) ws. Path("/test"). Consumes(restful.MIME_JSON, MIME_MSGPACK). Produces(restful.MIME_JSON, MIME_MSGPACK) // route user api ws.Route(ws.POST("/msgpack"). To(do). Reads(user{}). Writes(userResponse{})) container.Add(ws) }
func NewWebService() *restful.WebService { ws := restful.WebService{} ws.Path("/api/v1"). Consumes(restful.MIME_JSON). Produces(restful.MIME_JSON, restful.MIME_XML) ws.Route(ws.POST("/artists").To(createArtist). Doc("Create a new Arist"). Reads(ArtistRequest{})) ws.Route(ws.POST("/artists/{artist-id}/patrons").To(patronize). Doc("Patronize an artist"). Param(ws.BodyParameter("artist-id", "artist identifier").DataType("int")). Reads(PatronageRequest{})) return &ws }
// initReadinessCheckRoute initializes an HTTP endpoint for readiness checking func initReadinessCheckRoute(root *restful.WebService, path string, readyFunc func() bool) { root.Route(root.GET(path).To(func(req *restful.Request, resp *restful.Response) { if readyFunc() { resp.ResponseWriter.WriteHeader(http.StatusOK) resp.ResponseWriter.Write([]byte("ok")) } else { resp.ResponseWriter.WriteHeader(http.StatusServiceUnavailable) } }).Doc("return the readiness state of the master"). Returns(http.StatusOK, "if the master is ready", nil). Returns(http.StatusServiceUnavailable, "if the master is not ready", nil). Produces(restful.MIME_JSON)) }
// initReadinessCheckRoute initializes an HTTP endpoint for readiness checking func initVersionRoute(container *restful.Container, path string) { // Set up a service to return the git code version. versionWS := new(restful.WebService) versionWS.Path(path) versionWS.Doc("git code version from which this is built") versionWS.Route( versionWS.GET("/").To(handleVersion). Doc("get the code version"). Operation("getCodeVersion"). Produces(restful.MIME_JSON). Consumes(restful.MIME_JSON)) container.Add(versionWS) }
func main() { port := env.StringDefault("PORT", "8080") baseUrl := ":" + port var ws restful.WebService ws.Path("/api"). Consumes(restful.MIME_JSON). Produces(restful.MIME_JSON) ws.Route(ws.GET("/bar").To(getBar). Writes(Bar{})) ws.Route(ws.GET("/foo").To(getFoo). Writes(Foo{})) restful.Add(&ws) log.Printf("Starting webserver on %v...", baseUrl) log.Fatal(http.ListenAndServe(baseUrl, nil)) }
// RegisterModel registers the Model API endpoints. // All endpoints that end with a {metric-name} also receive a start time query parameter. // The start and end times should be specified as a string, formatted according to RFC 3339. func (a *Api) RegisterModel(container *restful.Container) { ws := new(restful.WebService) ws.Path("/api/v1/model"). Doc("Root endpoint of the stats model"). Consumes("*/*"). Produces(restful.MIME_JSON) addClusterMetricsRoutes(a, ws) ws.Route(ws.GET("/debug/allkeys"). To(metrics.InstrumentRouteFunc("debugAllKeys", a.allKeys)). Doc("Get keys of all metric sets available"). Operation("debugAllKeys")) container.Add(ws) }
// NewService encapsulates code to open an HTTP server on the given address:port that serves the // expansion API using the given Expander backend to do the actual expansion. After calling // NewService, call ListenAndServe to start the returned service. func NewService(address string, port int, backend Expander) *Service { restful.EnableTracing(true) webService := new(restful.WebService) webService.Consumes(restful.MIME_JSON) webService.Produces(restful.MIME_JSON) handler := func(req *restful.Request, resp *restful.Response) { util.LogHandlerEntry("expansion service", req.Request) request := &ServiceRequest{} if err := req.ReadEntity(&request); err != nil { badRequest(resp, err.Error()) return } reqMsg := fmt.Sprintf("\nhandling request:\n%s\n", util.ToYAMLOrError(request)) util.LogHandlerText("expansion service", reqMsg) response, err := backend.ExpandChart(request) if err != nil { badRequest(resp, fmt.Sprintf("error expanding chart: %s", err)) return } util.LogHandlerExit("expansion service", http.StatusOK, "OK", resp.ResponseWriter) respMsg := fmt.Sprintf("\nreturning response:\n%s\n", util.ToYAMLOrError(response.Resources)) util.LogHandlerText("expansion service", respMsg) resp.WriteEntity(response) } webService.Route( webService.POST("/expand"). To(handler). Doc("Expand a chart."). Reads(&ServiceRequest{}). Writes(&ServiceResponse{})) container := restful.DefaultContainer container.Add(webService) server := &http.Server{ Addr: fmt.Sprintf("%s:%d", address, port), Handler: container, } return &Service{ webService: webService, server: server, container: container, } }
// initAPIVersionRoute initializes the osapi endpoint to behave similar to the upstream api endpoint func initAPIVersionRoute(apiContainer *genericmux.APIContainer, prefix string, versions ...string) { versionHandler := apiserver.APIVersionHandler(kapi.Codecs, func(req *restful.Request) *unversioned.APIVersions { apiVersionsForDiscovery := unversioned.APIVersions{ // TODO: ServerAddressByClientCIDRs: s.getServerAddressByClientCIDRs(req.Request), Versions: versions, } return &apiVersionsForDiscovery }) ws := new(restful.WebService). Path(prefix). Doc("list supported server API versions") ws.Route(ws.GET("/").To(versionHandler). Doc("list supported server API versions"). Produces(restful.MIME_JSON). Consumes(restful.MIME_JSON). Operation("get" + strings.Title(prefix[1:]) + "Version")) apiContainer.Add(ws) }
// initReadinessCheckRoute initializes an HTTP endpoint for readiness checking func initReadinessCheckRoute(apiContainer *genericmux.APIContainer, path string, readyFunc func() bool) { ws := new(restful.WebService). Path(path). Doc("return the readiness state of the master") ws.Route(ws.GET("/").To(func(req *restful.Request, resp *restful.Response) { if readyFunc() { resp.ResponseWriter.WriteHeader(http.StatusOK) resp.ResponseWriter.Write([]byte("ok")) } else { resp.ResponseWriter.WriteHeader(http.StatusServiceUnavailable) } }).Doc("return the readiness state of the master"). Returns(http.StatusOK, "if the master is ready", nil). Returns(http.StatusServiceUnavailable, "if the master is not ready", nil). Produces(restful.MIME_JSON)) apiContainer.Add(ws) }
// initVersionRoute initializes an HTTP endpoint for the server's version information. func initVersionRoute(container *restful.Container, path string) { // Build version info once versionInfo, err := json.MarshalIndent(version.Get(), "", " ") if err != nil { glog.Errorf("Unable to initialize version route: %v", err) return } // Set up a service to return the git code version. versionWS := new(restful.WebService) versionWS.Path(path) versionWS.Doc("git code version from which this is built") versionWS.Route( versionWS.GET("/").To(func(_ *restful.Request, resp *restful.Response) { writeJSON(resp, versionInfo) }). Doc("get the code version"). Operation("getCodeVersion"). Produces(restful.MIME_JSON)) container.Add(versionWS) }
// initOAuthAuthorizationServerMetadataRoute initializes an HTTP endpoint for OAuth 2.0 Authorization Server Metadata discovery // https://tools.ietf.org/id/draft-ietf-oauth-discovery-04.html#rfc.section.2 // masterPublicURL should be internally and externally routable to allow all users to discover this information func initOAuthAuthorizationServerMetadataRoute(container *restful.Container, path, masterPublicURL string) { // Build OAuth metadata once metadata, err := json.MarshalIndent(discovery.Get(masterPublicURL, OpenShiftOAuthAuthorizeURL(masterPublicURL), OpenShiftOAuthTokenURL(masterPublicURL)), "", " ") if err != nil { glog.Errorf("Unable to initialize OAuth authorization server metadata route: %v", err) return } // Set up a service to return the OAuth metadata. oauthWS := new(restful.WebService) oauthWS.Path(path) oauthWS.Doc("OAuth 2.0 Authorization Server Metadata") oauthWS.Route( oauthWS.GET("/").To(func(_ *restful.Request, resp *restful.Response) { writeJSON(resp, metadata) }). Doc("get the server's OAuth 2.0 Authorization Server Metadata"). Operation("getOAuthAuthorizationServerMetadata"). Produces(restful.MIME_JSON)) container.Add(oauthWS) }
func main() { ws := new(restful.WebService) ws.Path("/itrain").Consumes(restful.MIME_JSON).Produces(restful.MIME_JSON) ws.Route(ws.GET("/version"). To(report_version). Doc("get itrain version number"). Operation("version")) ws.Route(ws.GET("/report_inverter"). To(report_inverter). Doc("get inverter report data"). Operation("report_inverter"). Param(ws.QueryParameter("sd", "startdate"))) restful.Add(ws) config := swagger.Config{ WebServices: restful.DefaultContainer.RegisteredWebServices(), // you control what services are visible WebServicesUrl: "/", ApiPath: "/apidocs.json", // specifiy where the UI is located SwaggerPath: "/apidocs/", SwaggerFilePath: "./swaggerui"} swagger.RegisterSwaggerService(config, restful.DefaultContainer) var ( hostname string = "127.0.0.1" port int = 8080 ) // Listen on hostname:port fmt.Printf("Listening on %s:%d...\n", hostname, port) err := http.ListenAndServe(fmt.Sprintf("%s:%d", hostname, port), nil) if err != nil { log.Fatal("Error: ", err) } }
// Register the Api on the specified endpoint. func (a *Api) Register(container *restful.Container) { ws := new(restful.WebService) ws. Path("/api/v1/metric-export"). Doc("Exports the latest point for all Heapster metrics"). Produces(restful.MIME_JSON) ws.Route(ws.GET(""). Filter(compressionFilter). To(a.exportMetrics). Doc("export the latest data point for all metrics"). Operation("exportMetrics"). Writes([]*Timeseries{})) container.Add(ws) ws = new(restful.WebService) ws.Path("/api/v1/metric-export-schema"). Doc("Schema for metrics exported by heapster"). Produces(restful.MIME_JSON) ws.Route(ws.GET(""). To(a.exportMetricsSchema). Doc("export the schema for all metrics"). Operation("exportmetricsSchema"). Writes(TimeseriesSchema{})) container.Add(ws) }
func setupHandlers(sources []api.Source, sink sinks.ExternalSinkManager, m manager.Manager) http.Handler { // Make API handler. wsContainer := restful.NewContainer() a := v1.NewApi(m) a.Register(wsContainer) // Validation/Debug handler. handleValidate := func(req *restful.Request, resp *restful.Response) { err := validate.HandleRequest(resp, sources, sink) if err != nil { fmt.Fprintf(resp, "%s", err) } } ws := new(restful.WebService). Path("/validate"). Produces("text/plain") ws.Route(ws.GET("").To(handleValidate)). Doc("get validation information") wsContainer.Add(ws) // TODO(jnagal): Add a main status page. // Redirect root to /validate redirectHandler := http.RedirectHandler(validate.ValidatePage, http.StatusTemporaryRedirect) handleRoot := func(req *restful.Request, resp *restful.Response) { redirectHandler.ServeHTTP(resp, req.Request) } ws = new(restful.WebService) ws.Route(ws.GET("/").To(handleRoot)) wsContainer.Add(ws) handlePprofEndpoint := func(req *restful.Request, resp *restful.Response) { name := strings.TrimPrefix(req.Request.URL.Path, pprofBasePath) switch name { case "profile": pprof.Profile(resp, req.Request) case "symbol": pprof.Symbol(resp, req.Request) case "cmdline": pprof.Cmdline(resp, req.Request) default: pprof.Index(resp, req.Request) } } // Setup pporf handlers. ws = new(restful.WebService).Path(pprofBasePath) ws.Route(ws.GET("/{subpath:*}").To(func(req *restful.Request, resp *restful.Response) { handlePprofEndpoint(req, resp) })).Doc("pprof endpoint") wsContainer.Add(ws) return wsContainer }
// RegisterHistorical registers the Historical API endpoints. It will register the same endpoints // as those in the model API, plus endpoints for aggregation retrieval, and endpoints to retrieve pod // metrics by using the pod id. func (normalApi *Api) RegisterHistorical(container *restful.Container) { ws := new(restful.WebService) ws.Path("/api/v1/historical"). Doc("Root endpoint of the historical access API"). Consumes("*/*"). Produces(restful.MIME_JSON) a := &HistoricalApi{normalApi} addClusterMetricsRoutes(a, ws) addAggregationRoutes(a, ws) // register the endpoint for fetching raw metrics based on pod id if a.isRunningInKubernetes() { // The /pod-id/{pod-id}/metrics-aggregated/{aggregations}/{metric-name} endpoint exposes // some aggregations for a Pod entity of the historical API. ws.Route(ws.GET("/pod-id/{pod-id}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podMetrics", a.podMetrics)). Doc("Export some pod-level metric aggregations"). Operation("podAggregations"). Param(ws.PathParameter("pod-id", "The UID of the pod to lookup").DataType("string")). Param(ws.PathParameter("metric-name", "The name of the requested metric").DataType("string")). Param(ws.QueryParameter("start", "Start time for requested metrics").DataType("string")). Param(ws.QueryParameter("end", "End time for requested metric").DataType("string")). Writes(types.MetricResult{})) // The /pod-id/{pod-id}/containers/{container-name}/metrics-aggregated/{aggregations}/{metric-name} endpoint exposes // some aggregations for a Container entity of the historical API. ws.Route(ws.GET("/pod-id/{pod-id}/containers/{container-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podContainerMetrics", a.podContainerMetrics)). Doc("Export some aggregations for a Pod Container"). Operation("podContainerAggregations"). Param(ws.PathParameter("pod-id", "The uid of the pod to use").DataType("string")). Param(ws.PathParameter("container-name", "The name of the namespace to use").DataType("string")). Param(ws.PathParameter("metric-name", "The name of the requested metric").DataType("string")). Param(ws.QueryParameter("start", "Start time for requested metrics").DataType("string")). Param(ws.QueryParameter("end", "End time for requested metric").DataType("string")). Writes(types.MetricResult{})) // The /pod-id-list/{pod-id-list}/metrics-aggregated/{aggregations}/{metric-name} endpoint exposes // metrics for a list of pod ids of the historical API. ws.Route(ws.GET("/pod-id-list/{pod-id-list}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podListAggregations", a.podListMetrics)). Doc("Export an aggregation for all pods from the given list"). Operation("podListAggregations"). Param(ws.PathParameter("pod-id-list", "Comma separated list of pod UIDs to lookup").DataType("string")). Param(ws.PathParameter("metric-name", "The name of the requested metric").DataType("string")). Param(ws.QueryParameter("start", "Start time for requested metrics").DataType("string")). Param(ws.QueryParameter("end", "End time for requested metric").DataType("string")). Writes(types.MetricResultList{})) } container.Add(ws) }