// 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) }
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 }
// 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) }
// addClusterMetricsRoutes adds all the standard model routes to a WebService. // It should already have a base path registered. func addClusterMetricsRoutes(a clusterMetricsFetcher, ws *restful.WebService) { // The /metrics/ endpoint returns a list of all available metrics for the Cluster entity of the model. ws.Route(ws.GET("/metrics/"). To(metrics.InstrumentRouteFunc("availableClusterMetrics", a.availableClusterMetrics)). Doc("Get a list of all available metrics for the Cluster entity"). Operation("availableClusterMetrics")) // The /metrics/{metric-name} endpoint exposes an aggregated metric for the Cluster entity of the model. ws.Route(ws.GET("/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("clusterMetrics", a.clusterMetrics)). Doc("Export an aggregated cluster-level metric"). Operation("clusterMetrics"). Param(ws.PathParameter("metric-name", "The name of the requested metric").DataType("string")). Param(ws.QueryParameter("start", "Start time for requested metric").DataType("string")). Param(ws.QueryParameter("end", "End time for requested metric").DataType("string")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricResult{})) // The /nodes/{node-name}/metrics endpoint returns a list of all nodes with some metrics. ws.Route(ws.GET("/nodes/"). To(metrics.InstrumentRouteFunc("nodeList", a.nodeList)). Doc("Get a list of all nodes that have some current metrics"). Operation("nodeList")) // The /nodes/{node-name}/metrics endpoint returns a list of all available metrics for a Node entity. ws.Route(ws.GET("/nodes/{node-name}/metrics/"). To(metrics.InstrumentRouteFunc("availableNodeMetrics", a.availableNodeMetrics)). Doc("Get a list of all available metrics for a Node entity"). Operation("availableNodeMetrics"). Param(ws.PathParameter("node-name", "The name of the node to lookup").DataType("string"))) // The /nodes/{node-name}/metrics/{metric-name} endpoint exposes a metric for a Node entity of the model. // The {node-name} parameter is the hostname of a specific node. ws.Route(ws.GET("/nodes/{node-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("nodeMetrics", a.nodeMetrics)). Doc("Export a node-level metric"). Operation("nodeMetrics"). Param(ws.PathParameter("node-name", "The name of the node 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 metric").DataType("string")). Param(ws.QueryParameter("end", "End time for requested metric").DataType("string")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricResult{})) if a.isRunningInKubernetes() { ws.Route(ws.GET("/namespaces/"). To(metrics.InstrumentRouteFunc("namespaceList", a.namespaceList)). Doc("Get a list of all namespaces that have some current metrics"). Operation("namespaceList")) // The /namespaces/{namespace-name}/metrics endpoint returns a list of all available metrics for a Namespace entity. ws.Route(ws.GET("/namespaces/{namespace-name}/metrics"). To(metrics.InstrumentRouteFunc("availableNamespaceMetrics", a.availableNamespaceMetrics)). Doc("Get a list of all available metrics for a Namespace entity"). Operation("availableNamespaceMetrics"). Param(ws.PathParameter("namespace-name", "The name of the namespace to lookup").DataType("string"))) // The /namespaces/{namespace-name}/metrics/{metric-name} endpoint exposes an aggregated metrics // for a Namespace entity of the model. ws.Route(ws.GET("/namespaces/{namespace-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("namespaceMetrics", a.namespaceMetrics)). Doc("Export an aggregated namespace-level metric"). Operation("namespaceMetrics"). Param(ws.PathParameter("namespace-name", "The name of the namespace 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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricResult{})) ws.Route(ws.GET("/namespaces/{namespace-name}/pods/"). To(metrics.InstrumentRouteFunc("namespacePodList", a.namespacePodList)). Doc("Get a list of pods from the given namespace that have some metrics"). Operation("namespacePodList"). Param(ws.PathParameter("namespace-name", "The name of the namespace to lookup").DataType("string"))) // The /namespaces/{namespace-name}/pods/{pod-name}/metrics endpoint returns a list of all available metrics for a Pod entity. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/metrics"). To(metrics.InstrumentRouteFunc("availablePodMetrics", a.availablePodMetrics)). Doc("Get a list of all available metrics for a Pod entity"). Operation("availablePodMetrics"). 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"))) // The /namespaces/{namespace-name}/pods/{pod-name}/metrics/{metric-name} endpoint exposes // an aggregated metric for a Pod entity of the model. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podMetrics", a.podMetrics)). Doc("Export an aggregated pod-level metric"). 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")). 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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricResult{})) // The /namespaces/{namespace-name}/pods/{pod-name}/containers endpoint // returns a list of all containers for a Pod entity. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/containers"). To(metrics.InstrumentRouteFunc("podContainerList", a.podContainerList)). Doc("Get a list of containers for a Pod entity "). Operation("podContainerList"). 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"))) // The /namespaces/{namespace-name}/pods/{pod-name}/containers/metrics/{container-name}/metrics endpoint // returns a list of all available metrics for a Pod Container entity. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/containers/{container-name}/metrics"). To(metrics.InstrumentRouteFunc("availableContainerMetrics", a.availablePodContainerMetrics)). Doc("Get a list of all available metrics for a Pod entity"). Operation("availableContainerMetrics"). 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")). Param(ws.PathParameter("container-name", "The name of the namespace to use").DataType("string"))) // The /namespaces/{namespace-name}/pods/{pod-name}/containers/{container-name}/metrics/{metric-name} endpoint exposes // a metric for a Container entity of the model. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/containers/{container-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podContainerMetrics", a.podContainerMetrics)). Doc("Export an aggregated metric for a Pod Container"). Operation("podContainerMetrics"). Param(ws.PathParameter("namespace-name", "The name of the namespace to use").DataType("string")). Param(ws.PathParameter("pod-name", "The name 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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricResult{})) } ws.Route(ws.GET("/nodes/{node-name}/freecontainers/"). To(metrics.InstrumentRouteFunc("systemContainerList", a.nodeSystemContainerList)). Doc("Get a list of all non-pod containers with some metrics"). Operation("systemContainerList"). Param(ws.PathParameter("node-name", "The name of the namespace to lookup").DataType("string"))) // The /nodes/{node-name}/freecontainers/{container-name}/metrics endpoint // returns a list of all available metrics for a Free Container entity. ws.Route(ws.GET("/nodes/{node-name}/freecontainers/{container-name}/metrics"). To(metrics.InstrumentRouteFunc("availableMetrics", a.availableFreeContainerMetrics)). Doc("Get a list of all available metrics for a free Container entity"). Operation("availableMetrics"). Param(ws.PathParameter("node-name", "The name of the namespace to lookup").DataType("string")). Param(ws.PathParameter("container-name", "The name of the namespace to use").DataType("string"))) // The /nodes/{node-name}/freecontainers/{container-name}/metrics/{metric-name} endpoint exposes // a metric for a free Container entity of the model. ws.Route(ws.GET("/nodes/{node-name}/freecontainers/{container-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("freeContainerMetrics", a.freeContainerMetrics)). Doc("Export a container-level metric for a free container"). Operation("freeContainerMetrics"). Param(ws.PathParameter("node-name", "The name of the node to use").DataType("string")). Param(ws.PathParameter("container-name", "The name of the container 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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricResult{})) if a.isRunningInKubernetes() { // The /namespaces/{namespace-name}/pod-list/{pod-list}/metrics/{metric-name} endpoint exposes // metrics for a list of pods of the model. ws.Route(ws.GET("/namespaces/{namespace-name}/pod-list/{pod-list}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podListMetric", a.podListMetrics)). Doc("Export a metric for all pods from the given list"). Operation("podListMetric"). Param(ws.PathParameter("namespace-name", "The name of the namespace to lookup").DataType("string")). Param(ws.PathParameter("pod-list", "Comma separated list of pod names 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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricResult{})) } }
// addAggregationRoutes adds routes to a webservice which point to a metricsAggregationFetcher's methods func addAggregationRoutes(a metricsAggregationFetcher, ws *restful.WebService) { // The /metrics-aggregated/{aggregations}/{metric-name} endpoint exposes some aggregations for the Cluster entity of the historical API. ws.Route(ws.GET("/metrics-aggregated/{aggregations}/{metric-name:*}"). To(metrics.InstrumentRouteFunc("clusterMetrics", a.clusterAggregations)). Doc("Export some cluster-level metric aggregations"). Operation("clusterAggregations"). Param(ws.PathParameter("aggregations", "A comma-separated list of requested aggregations").DataType("string")). Param(ws.PathParameter("metric-name", "The name of the requested metric").DataType("string")). Param(ws.QueryParameter("start", "Start time for requested metric").DataType("string")). Param(ws.QueryParameter("end", "End time for requested metric").DataType("string")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricAggregationResult{})) // The /nodes/{node-name}/metrics-aggregated/{aggregations}/{metric-name} endpoint exposes some aggregations for a Node entity of the historical API. // The {node-name} parameter is the hostname of a specific node. ws.Route(ws.GET("/nodes/{node-name}/metrics-aggregated/{aggregations}/{metric-name:*}"). To(metrics.InstrumentRouteFunc("nodeMetrics", a.nodeAggregations)). Doc("Export a node-level metric"). Operation("nodeAggregations"). Param(ws.PathParameter("node-name", "The name of the node to lookup").DataType("string")). Param(ws.PathParameter("aggregations", "A comma-separated list of requested aggregations").DataType("string")). Param(ws.PathParameter("metric-name", "The name of the requested metric").DataType("string")). Param(ws.QueryParameter("start", "Start time for requested metric").DataType("string")). Param(ws.QueryParameter("end", "End time for requested metric").DataType("string")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricAggregationResult{})) if a.isRunningInKubernetes() { // The /namespaces/{namespace-name}/metrics-aggregated/{aggregations}/{metric-name} endpoint exposes some aggregations // for a Namespace entity of the historical API. ws.Route(ws.GET("/namespaces/{namespace-name}/metrics-aggregated/{aggregations}/{metric-name:*}"). To(metrics.InstrumentRouteFunc("namespaceMetrics", a.namespaceAggregations)). Doc("Export some namespace-level metric aggregations"). Operation("namespaceAggregations"). Param(ws.PathParameter("namespace-name", "The name of the namespace to lookup").DataType("string")). Param(ws.PathParameter("aggregations", "A comma-separated list of requested aggregations").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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricAggregationResult{})) // The /namespaces/{namespace-name}/pods/{pod-name}/metrics-aggregated/{aggregations}/{metric-name} endpoint exposes // some aggregations for a Pod entity of the historical API. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/metrics-aggregated/{aggregations}/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podMetrics", a.podAggregations)). Doc("Export some pod-level metric aggregations"). Operation("podAggregations"). 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")). Param(ws.PathParameter("aggregations", "A comma-separated list of requested aggregations").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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricAggregationResult{})) // The /namespaces/{namespace-name}/pods/{pod-name}/containers/{container-name}/metrics-aggregated/{aggregations}/{metric-name} endpoint exposes // some aggregations for a Container entity of the historical API. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/containers/{container-name}/metrics-aggregated/{aggregations}/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podContainerMetrics", a.podContainerAggregations)). Doc("Export some aggregations for a Pod Container"). Operation("podContainerAggregations"). Param(ws.PathParameter("namespace-name", "The name of the namespace to use").DataType("string")). Param(ws.PathParameter("pod-name", "The name of the pod to use").DataType("string")). Param(ws.PathParameter("container-name", "The name of the namespace to use").DataType("string")). Param(ws.PathParameter("aggregations", "A comma-separated list of requested aggregations").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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricAggregationResult{})) // 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-aggregated/{aggregations}/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podMetrics", a.podAggregations)). 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("aggregations", "A comma-separated list of requested aggregations").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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricAggregationResult{})) // 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-aggregated/{aggregations}/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podContainerMetrics", a.podContainerAggregations)). Doc("Export some aggregations for a Pod Container"). Operation("podContainerAggregations"). Param(ws.PathParameter("pod-id", "The name of the pod to use").DataType("string")). Param(ws.PathParameter("container-name", "The name of the namespace to use").DataType("string")). Param(ws.PathParameter("aggregations", "A comma-separated list of requested aggregations").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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricAggregationResult{})) } // The /nodes/{node-name}/freecontainers/{container-name}/metrics-aggregated/{aggregations}/{metric-name} endpoint exposes // some aggregations for a free Container entity of the historical API. ws.Route(ws.GET("/nodes/{node-name}/freecontainers/{container-name}/metrics-aggregated/{aggregations}/{metric-name:*}"). To(metrics.InstrumentRouteFunc("freeContainerMetrics", a.freeContainerAggregations)). Doc("Export a contsome iner-level metric aggregations for a free container"). Operation("freeContainerAggregations"). Param(ws.PathParameter("node-name", "The name of the node to use").DataType("string")). Param(ws.PathParameter("container-name", "The name of the container to use").DataType("string")). Param(ws.PathParameter("aggregations", "A comma-separated list of requested aggregations").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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricAggregationResult{})) if a.isRunningInKubernetes() { // The /namespaces/{namespace-name}/pod-list/{pod-list}/metrics-aggregated/{aggregations}/{metric-name} endpoint exposes // metrics for a list of pods of the historical API. ws.Route(ws.GET("/namespaces/{namespace-name}/pod-list/{pod-list}/metrics-aggregated/{aggregations}/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podListAggregations", a.podListAggregations)). Doc("Export some aggregations for all pods from the given list"). Operation("podListAggregations"). Param(ws.PathParameter("namespace-name", "The name of the namespace to lookup").DataType("string")). Param(ws.PathParameter("pod-list", "Comma separated list of pod names to lookup").DataType("string")). Param(ws.PathParameter("aggregations", "A comma-separated list of requested aggregations").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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricAggregationResultList{})) // 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-aggregated/{aggregations}/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podListAggregations", a.podListAggregations)). 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("aggregations", "A comma-separated list of requested aggregations").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")). Param(ws.QueryParameter("labels", "A comma-separated list of key:values pairs to use to search for a labeled metric").DataType("string")). Writes(types.MetricAggregationResultList{})) } }
// 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) // The /metrics/ endpoint returns a list of all available metrics for the Cluster entity of the model. ws.Route(ws.GET("/metrics/"). To(metrics.InstrumentRouteFunc("availableClusterMetrics", a.availableClusterMetrics)). Doc("Get a list of all available metrics for the Cluster entity"). Operation("availableClusterMetrics")) // The /metrics/{metric-name} endpoint exposes an aggregated metric for the Cluster entity of the model. ws.Route(ws.GET("/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("clusterMetrics", a.clusterMetrics)). Doc("Export an aggregated cluster-level metric"). Operation("clusterMetrics"). Param(ws.PathParameter("metric-name", "The name of the requested metric").DataType("string")). Param(ws.QueryParameter("start", "Start time for requested metric").DataType("string")). Param(ws.QueryParameter("end", "End time for requested metric").DataType("string")). Writes(types.MetricResult{})) // The /nodes/{node-name}/metrics endpoint returns a list of all nodes with some metrics. ws.Route(ws.GET("/nodes/"). To(metrics.InstrumentRouteFunc("nodeList", a.nodeList)). Doc("Get a list of all nodes that have some current metrics"). Operation("nodeList")) // The /nodes/{node-name}/metrics endpoint returns a list of all available metrics for a Node entity. ws.Route(ws.GET("/nodes/{node-name}/metrics/"). To(metrics.InstrumentRouteFunc("availableNodeMetrics", a.availableNodeMetrics)). Doc("Get a list of all available metrics for a Node entity"). Operation("availableNodeMetrics"). Param(ws.PathParameter("node-name", "The name of the node to lookup").DataType("string"))) // The /nodes/{node-name}/metrics/{metric-name} endpoint exposes a metric for a Node entity of the model. // The {node-name} parameter is the hostname of a specific node. ws.Route(ws.GET("/nodes/{node-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("nodeMetrics", a.nodeMetrics)). Doc("Export a node-level metric"). Operation("nodeMetrics"). Param(ws.PathParameter("node-name", "The name of the node 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 metric").DataType("string")). Param(ws.QueryParameter("end", "End time for requested metric").DataType("string")). Writes(types.MetricResult{})) if a.runningInKubernetes { ws.Route(ws.GET("/namespaces/"). To(metrics.InstrumentRouteFunc("namespaceList", a.namespaceList)). Doc("Get a list of all namespaces that have some current metrics"). Operation("namespaceList")) // The /namespaces/{namespace-name}/metrics endpoint returns a list of all available metrics for a Namespace entity. ws.Route(ws.GET("/namespaces/{namespace-name}/metrics"). To(metrics.InstrumentRouteFunc("availableNamespaceMetrics", a.availableNamespaceMetrics)). Doc("Get a list of all available metrics for a Namespace entity"). Operation("availableNamespaceMetrics"). Param(ws.PathParameter("namespace-name", "The name of the namespace to lookup").DataType("string"))) // The /namespaces/{namespace-name}/metrics/{metric-name} endpoint exposes an aggregated metrics // for a Namespace entity of the model. ws.Route(ws.GET("/namespaces/{namespace-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("namespaceMetrics", a.namespaceMetrics)). Doc("Export an aggregated namespace-level metric"). Operation("namespaceMetrics"). Param(ws.PathParameter("namespace-name", "The name of the namespace 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{})) ws.Route(ws.GET("/namespaces/{namespace-name}/pods/"). To(metrics.InstrumentRouteFunc("namespacePodList", a.namespacePodList)). Doc("Get a list of pods from the given namespace that have some metrics"). Operation("namespacePodList"). Param(ws.PathParameter("namespace-name", "The name of the namespace to lookup").DataType("string"))) // The /namespaces/{namespace-name}/pods/{pod-name}/metrics endpoint returns a list of all available metrics for a Pod entity. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/metrics"). To(metrics.InstrumentRouteFunc("availablePodMetrics", a.availablePodMetrics)). Doc("Get a list of all available metrics for a Pod entity"). Operation("availablePodMetrics"). 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"))) // The /namespaces/{namespace-name}/pods/{pod-name}/metrics/{metric-name} endpoint exposes // an aggregated metric for a Pod entity of the model. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podMetrics", a.podMetrics)). Doc("Export an aggregated pod-level metric"). 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")). 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 /namespaces/{namespace-name}/pods/{pod-name}/containers/metrics/{container-name}/metrics endpoint // returns a list of all available metrics for a Pod Container entity. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/containers/{container-name}/metrics"). To(metrics.InstrumentRouteFunc("availableContainerMetrics", a.availablePodContainerMetrics)). Doc("Get a list of all available metrics for a Pod entity"). Operation("availableContainerMetrics"). 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")). Param(ws.PathParameter("container-name", "The name of the namespace to use").DataType("string"))) // The /namespaces/{namespace-name}/pods/{pod-name}/containers/{container-name}/metrics/{metric-name} endpoint exposes // a metric for a Container entity of the model. ws.Route(ws.GET("/namespaces/{namespace-name}/pods/{pod-name}/containers/{container-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podContainerMetrics", a.podContainerMetrics)). Doc("Export an aggregated metric for a Pod Container"). Operation("podContainerMetrics"). Param(ws.PathParameter("namespace-name", "The name of the namespace to use").DataType("string")). Param(ws.PathParameter("pod-name", "The name 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{})) } ws.Route(ws.GET("/nodes/{node-name}/freecontainers/"). To(metrics.InstrumentRouteFunc("systemContainerList", a.nodeSystemContainerList)). Doc("Get a list of all non-pod containers with some metrics"). Operation("systemContainerList"). Param(ws.PathParameter("node-name", "The name of the namespace to lookup").DataType("string"))) // The /nodes/{node-name}/freecontainers/{container-name}/metrics endpoint // returns a list of all available metrics for a Free Container entity. ws.Route(ws.GET("/nodes/{node-name}/freecontainers/{container-name}/metrics"). To(metrics.InstrumentRouteFunc("availableMetrics", a.availableFreeContainerMetrics)). Doc("Get a list of all available metrics for a free Container entity"). Operation("availableMetrics"). Param(ws.PathParameter("node-name", "The name of the namespace to lookup").DataType("string")). Param(ws.PathParameter("container-name", "The name of the namespace to use").DataType("string"))) // The /nodes/{node-name}/freecontainers/{container-name}/metrics/{metric-name} endpoint exposes // a metric for a free Container entity of the model. ws.Route(ws.GET("/nodes/{node-name}/freecontainers/{container-name}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("freeContainerMetrics", a.freeContainerMetrics)). Doc("Export a container-level metric for a free container"). Operation("freeContainerMetrics"). Param(ws.PathParameter("node-name", "The name of the node to use").DataType("string")). Param(ws.PathParameter("container-name", "The name of the container 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{})) if a.runningInKubernetes { // The /namespaces/{namespace-name}/pod-list/{pod-list}/metrics/{metric-name} endpoint exposes // metrics for a list od pods of the model. ws.Route(ws.GET("/namespaces/{namespace-name}/pod-list/{pod-list}/metrics/{metric-name:*}"). To(metrics.InstrumentRouteFunc("podListMetric", a.podListMetrics)). Doc("Export a metric for all pods from the given list"). Operation("podListMetric"). Param(ws.PathParameter("namespace-name", "The name of the namespace to lookup").DataType("string")). Param(ws.PathParameter("pod-list", "Comma separated list of pod names 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{})) } 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) }