This article describes how to quickly get started with the Kruize Local Monitoring Mode use case REST API using curl command. Documentation still in progress stay tuned.
-
- Introduction
- Example Request and Response
- Invalid Scenarios
-
- Introduction
- Example Request and Response
- Invalid Scenarios
-
- Introduction
- Example Request and Response
- Invalid Scenarios
-
- Introduction
- Example Request and Response
- Invalid Scenarios
-
- Introduction
- Example Request and Response
- Invalid Scenarios
-
- Introduction
- Example Request and Response
- Invalid Scenarios
-
- Introduction
- Example Request and Response
- Invalid Scenarios
-
- Introduction
- Example Request and Response
- Invalid Scenarios
-
- Introduction
- Example Request and Response
- Invalid Scenarios
-
- Introduction
- Example Request and Response
- Invalid Scenarios
When analyzing resource utilization in Kubernetes, it's essential to define terms that specify the duration of past data considered for recommendations and the threshold for obtaining additional data. These terms help in categorizing and fine-tuning resource allocation.
Below are the default terms used in resource analysis, along with their respective durations and thresholds:
Term | Minimum Data Threshold | Duration |
---|---|---|
Short | 30 mins | 1 day |
Medium | 2 Days | 7 days |
Long | 8 Days | 15 days |
Minimum Data Threshold: The "minimum data threshold" represents the minimum amount of data needed for generating a recommendation associated with a given duration term.
Duration: The "duration" in the term analysis refers to the amount of historical data taken into account when assessing resource utilization.
Read more about the Term Threshold scenarios here
Profile:
This column represents different profiles or criteria that the recommendation algorithm takes into account when making recommendations.
CPU (Percentile):
It indicates the percentile value for the timeseries CPU usage data that the algorithm considers for each profile.
Memory (Percentile):
Similarly, this column denotes the percentile value for the timeseries memory usage data that is used by the algorithm for each profile.
Cost Profile: For the "Cost" profile, Kruize's recommendation algorithm will consider the 60th percentile for CPU usage and the 100th percentile for memory usage when making recommendations. This means that cost-related recommendations will be based on CPU usage that falls at or above the 60th percentile and memory usage at the 100th percentile.
Performance Profile: In the "Performance" profile, the algorithm takes into account the 98th percentile for CPU usage and the 100th percentile for memory usage. Consequently, recommendations related to performance will be generated when CPU usage is at or above the 98th percentile, and memory usage is at the 100th percentile.
Profile | CPU (Percentile) | Memory (percentile) |
---|---|---|
Cost | 60 th | 100 th |
Performance | 98 th | 100 th |
This is quick guide instructions to list available datasources as follows.
Request without Parameter
GET /datasources
curl -H 'Accept: application/json' http://<URL>:<PORT>/datasources
If no parameter is passed API returns all the datasources available.
Response
Example Response
{
"version": "v1.0",
"datasources": [
{
"name": "prometheus-1",
"provider": "prometheus",
"serviceName": "prometheus-k8s",
"namespace": "monitoring",
"url": "http://prometheus-k8s.monitoring.svc.cluster.local:9090"
}
]
}
Request with datasource name parameter
GET /datasources
curl -H 'Accept: application/json' http://<URL>:<PORT>/datasources?name=<datasource_name>
Returns the datasource details of the specified datasource
Response for datasource name - prometheus-1
Example Response
{
"version": "v1.0",
"datasources": [
{
"name": "prometheus-1",
"provider": "prometheus",
"serviceName": "prometheus-k8s",
"namespace": "monitoring",
"url": "http://prometheus-k8s.monitoring.svc.cluster.local:9090"
}
]
}
This is quick guide instructions to import metadata using input JSON as follows.
Request
POST /dsmetadata
curl -H 'Accept: application/json' -X POST --data 'copy paste below JSON' http://<URL>:<PORT>/dsmetadata
Response
Example Response
{
"datasources": {
"prometheus-1": {
"datasource_name": "prometheus-1",
"clusters": {
"default": {
"cluster_name": "default"
}
}
}
}
}
This is quick guide instructions to retrieve metadata for a specific datasource as follows.
Request Parameters
Parameter | Type | Required | Description |
---|---|---|---|
datasource | string | Yes | The name of the datasource. |
cluster_name | string | optional | The name of the cluster |
namespace | string | optional | The namespace |
verbose | string | optional | Flag to retrieve container-level metadata |
In the context of GET /dsmetadata
REST API, the term verbose
refers to a parameter or option that controls
granularity of metadata included in the API response. When the verbose parameter is set to true, the API response
includes granular container-level details in the metadata, offering a more comprehensive view of the clusters, namespaces,
workloads and containers associated with the specified datasource. When the verbose parameter is not provided or set to
false, the API response provides basic information like list of clusters, namespaces associated with the specified datasource.
Request with datasource name parameter
GET /dsmetadata
curl -H 'Accept: application/json' http://<URL>:<PORT>/dsmetadata?datasource=<datasource_name>
Returns the list of cluster details of the specified datasource
Response for datasource name - prometheus-1
Note:
- Currently, only
default
cluster is supported for POC. - When the
verbose
parameter is not provided, is set tofalse
by default - the response provides basic information about the clusters of the specified datasource.
Example Response
{
"datasources": {
"prometheus-1": {
"datasource_name": "prometheus-1",
"clusters": {
"default": {
"cluster_name": "default"
}
}
}
}
}
Request with verbose set to true and with datasource name parameter
GET /dsmetadata
curl -H 'Accept: application/json' "http://<URL>:<PORT>/dsmetadata?datasource=<datasource_name>&verbose=true"
Returns the metadata of all the containers present in the specified datasource
Note : When we don't pass verbose
in the query URL, it is set to false
by default.
Response for datasource name - prometheus-1
and verbose - true
With verbose
parameter set to true
, the response includes detailed metadata about all namespaces, workloads and
containers in addition to cluster information with the specified datasource.
Example Response
{
"datasources": {
"prometheus-1": {
"datasource_name": "prometheus-1",
"clusters": {
"default": {
"cluster_name": "default",
"namespaces": {
"default": {
"namespace": "default"
},
"cadvisor": {
"namespace": "cadvisor",
"workloads": {
"cadvisor": {
"workload_name": "cadvisor",
"workload_type": "daemonset",
"containers": {
"cadvisor": {
"container_name": "cadvisor",
"container_image_name": "gcr.io/cadvisor/cadvisor:v0.45.0"
}
}
}
}
},
"kube-node-lease": {
"namespace": "kube-node-lease"
},
"kube-system": {
"namespace": "kube-system",
"workloads": {
"coredns": {
"workload_name": "coredns",
"workload_type": "deployment",
"containers": {
"coredns": {
"container_name": "coredns",
"container_image_name": "k8s.gcr.io/coredns/coredns:v1.8.6"
}
}
},
"kube-proxy": {
"workload_name": "kube-proxy",
"workload_type": "daemonset",
"containers": {
"kube-proxy": {
"container_name": "kube-proxy",
"container_image_name": "k8s.gcr.io/kube-proxy:v1.24.3"
}
}
}
}
},
"monitoring": {
"namespace": "monitoring",
"workloads": {
"kube-state-metrics": {
"workload_name": "kube-state-metrics",
"workload_type": "deployment",
"containers": {
"kube-state-metrics": {
"container_name": "kube-state-metrics",
"container_image_name": "k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.0.0"
},
"kube-rbac-proxy-self": {
"container_name": "kube-rbac-proxy-self",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
},
"kube-rbac-proxy-main": {
"container_name": "kube-rbac-proxy-main",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
}
}
},
"node-exporter": {
"workload_name": "node-exporter",
"workload_type": "daemonset",
"containers": {
"node-exporter": {
"container_name": "node-exporter",
"container_image_name": "quay.io/prometheus/node-exporter:v1.1.2"
},
"kube-rbac-proxy": {
"container_name": "kube-rbac-proxy",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
}
}
},
"postgres-deployment": {
"workload_name": "postgres-deployment",
"workload_type": "deployment",
"containers": {
"postgres": {
"container_name": "postgres",
"container_image_name": "quay.io/kruizehub/postgres:15.2"
}
}
},
"alertmanager-main": {
"workload_name": "alertmanager-main",
"workload_type": "statefulset",
"containers": {
"config-reloader": {
"container_name": "config-reloader",
"container_image_name": "quay.io/prometheus-operator/prometheus-config-reloader:v0.47.0"
},
"alertmanager": {
"container_name": "alertmanager",
"container_image_name": "quay.io/prometheus/alertmanager:v0.21.0"
}
}
},
"prometheus-adapter": {
"workload_name": "prometheus-adapter",
"workload_type": "deployment",
"containers": {
"prometheus-adapter": {
"container_name": "prometheus-adapter",
"container_image_name": "directxman12/k8s-prometheus-adapter:v0.8.4"
}
}
},
"kruize": {
"workload_name": "kruize",
"workload_type": "deployment",
"containers": {
"kruize": {
"container_name": "kruize",
"container_image_name": "quay.io/kruize/autotune_operator:0.0.21_mvp"
}
}
},
"grafana": {
"workload_name": "grafana",
"workload_type": "deployment",
"containers": {
"grafana": {
"container_name": "grafana",
"container_image_name": "grafana/grafana:7.5.4"
}
}
},
"prometheus-k8s": {
"workload_name": "prometheus-k8s",
"workload_type": "statefulset",
"containers": {
"config-reloader": {
"container_name": "config-reloader",
"container_image_name": "quay.io/prometheus-operator/prometheus-config-reloader:v0.47.0"
},
"prometheus": {
"container_name": "prometheus",
"container_image_name": "quay.io/prometheus/prometheus:v2.26.0"
}
}
},
"blackbox-exporter": {
"workload_name": "blackbox-exporter",
"workload_type": "deployment",
"containers": {
"kube-rbac-proxy": {
"container_name": "kube-rbac-proxy",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
},
"module-configmap-reloader": {
"container_name": "module-configmap-reloader",
"container_image_name": "jimmidyson/configmap-reload:v0.5.0"
},
"blackbox-exporter": {
"container_name": "blackbox-exporter",
"container_image_name": "quay.io/prometheus/blackbox-exporter:v0.18.0"
}
}
},
"prometheus-operator": {
"workload_name": "prometheus-operator",
"workload_type": "deployment",
"containers": {
"kube-rbac-proxy": {
"container_name": "kube-rbac-proxy",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
},
"prometheus-operator": {
"container_name": "prometheus-operator",
"container_image_name": "quay.io/prometheus-operator/prometheus-operator:v0.47.0"
}
}
}
}
},
"kube-public": {
"namespace": "kube-public"
}
}
}
}
}
}
}
Request with datasource name and cluster name parameter
GET /dsmetadata
curl -H 'Accept: application/json' "http://<URL>:<PORT>/dsmetadata?datasource=<datasource_name>&cluster_name=<cluster_name>"
Returns the list of namespaces present in the specified cluster name and datasource
Response for datasource name - prometheus-1
and cluster name - default
With verbose
parameter set to false
, the response includes list of namespaces present in the specified cluster name
and datasource.
Example Response
{
"datasources": {
"prometheus-1": {
"datasource_name": "prometheus-1",
"clusters": {
"default": {
"cluster_name": "default",
"namespaces": {
"default": {
"namespace": "default"
},
"cadvisor": {
"namespace": "cadvisor"
},
"kube-node-lease": {
"namespace": "kube-node-lease"
},
"kube-system": {
"namespace": "kube-system"
},
"monitoring": {
"namespace": "monitoring"
},
"kube-public": {
"namespace": "kube-public"
}
}
}
}
}
}
}
Request with datasource name, cluster name and verbose parameters
GET /dsmetadata
curl -H 'Accept: application/json' "http://<URL>:<PORT>/dsmetadata?datasource=<datasource_name>&cluster_name=<cluster_name>&verbose=true"
Returns the container-level metadata of all the namespaces present in the specified cluster name and datasource
Response for datasource name - prometheus-1
, cluster name - default
and verbose - true
With verbose
parameter set to true
, the response includes detailed metadata about workloads and containers
in addition to namespace information with the specified cluster name and datasource.
Example Response
{
"datasources": {
"prometheus-1": {
"datasource_name": "prometheus-1",
"clusters": {
"default": {
"cluster_name": "default",
"namespaces": {
"default": {
"namespace": "default"
},
"cadvisor": {
"namespace": "cadvisor",
"workloads": {
"cadvisor": {
"workload_name": "cadvisor",
"workload_type": "daemonset",
"containers": {
"cadvisor": {
"container_name": "cadvisor",
"container_image_name": "gcr.io/cadvisor/cadvisor:v0.45.0"
}
}
}
}
},
"kube-node-lease": {
"namespace": "kube-node-lease"
},
"kube-system": {
"namespace": "kube-system",
"workloads": {
"coredns": {
"workload_name": "coredns",
"workload_type": "deployment",
"containers": {
"coredns": {
"container_name": "coredns",
"container_image_name": "k8s.gcr.io/coredns/coredns:v1.8.6"
}
}
},
"kube-proxy": {
"workload_name": "kube-proxy",
"workload_type": "daemonset",
"containers": {
"kube-proxy": {
"container_name": "kube-proxy",
"container_image_name": "k8s.gcr.io/kube-proxy:v1.24.3"
}
}
}
}
},
"monitoring": {
"namespace": "monitoring",
"workloads": {
"kube-state-metrics": {
"workload_name": "kube-state-metrics",
"workload_type": "deployment",
"containers": {
"kube-state-metrics": {
"container_name": "kube-state-metrics",
"container_image_name": "k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.0.0"
},
"kube-rbac-proxy-self": {
"container_name": "kube-rbac-proxy-self",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
},
"kube-rbac-proxy-main": {
"container_name": "kube-rbac-proxy-main",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
}
}
},
"node-exporter": {
"workload_name": "node-exporter",
"workload_type": "daemonset",
"containers": {
"node-exporter": {
"container_name": "node-exporter",
"container_image_name": "quay.io/prometheus/node-exporter:v1.1.2"
},
"kube-rbac-proxy": {
"container_name": "kube-rbac-proxy",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
}
}
},
"postgres-deployment": {
"workload_name": "postgres-deployment",
"workload_type": "deployment",
"containers": {
"postgres": {
"container_name": "postgres",
"container_image_name": "quay.io/kruizehub/postgres:15.2"
}
}
},
"alertmanager-main": {
"workload_name": "alertmanager-main",
"workload_type": "statefulset",
"containers": {
"config-reloader": {
"container_name": "config-reloader",
"container_image_name": "quay.io/prometheus-operator/prometheus-config-reloader:v0.47.0"
},
"alertmanager": {
"container_name": "alertmanager",
"container_image_name": "quay.io/prometheus/alertmanager:v0.21.0"
}
}
},
"prometheus-adapter": {
"workload_name": "prometheus-adapter",
"workload_type": "deployment",
"containers": {
"prometheus-adapter": {
"container_name": "prometheus-adapter",
"container_image_name": "directxman12/k8s-prometheus-adapter:v0.8.4"
}
}
},
"kruize": {
"workload_name": "kruize",
"workload_type": "deployment",
"containers": {
"kruize": {
"container_name": "kruize",
"container_image_name": "quay.io/kruize/autotune_operator:0.0.21_mvp"
}
}
},
"grafana": {
"workload_name": "grafana",
"workload_type": "deployment",
"containers": {
"grafana": {
"container_name": "grafana",
"container_image_name": "grafana/grafana:7.5.4"
}
}
},
"prometheus-k8s": {
"workload_name": "prometheus-k8s",
"workload_type": "statefulset",
"containers": {
"config-reloader": {
"container_name": "config-reloader",
"container_image_name": "quay.io/prometheus-operator/prometheus-config-reloader:v0.47.0"
},
"prometheus": {
"container_name": "prometheus",
"container_image_name": "quay.io/prometheus/prometheus:v2.26.0"
}
}
},
"blackbox-exporter": {
"workload_name": "blackbox-exporter",
"workload_type": "deployment",
"containers": {
"kube-rbac-proxy": {
"container_name": "kube-rbac-proxy",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
},
"module-configmap-reloader": {
"container_name": "module-configmap-reloader",
"container_image_name": "jimmidyson/configmap-reload:v0.5.0"
},
"blackbox-exporter": {
"container_name": "blackbox-exporter",
"container_image_name": "quay.io/prometheus/blackbox-exporter:v0.18.0"
}
}
},
"prometheus-operator": {
"workload_name": "prometheus-operator",
"workload_type": "deployment",
"containers": {
"kube-rbac-proxy": {
"container_name": "kube-rbac-proxy",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
},
"prometheus-operator": {
"container_name": "prometheus-operator",
"container_image_name": "quay.io/prometheus-operator/prometheus-operator:v0.47.0"
}
}
}
}
},
"kube-public": {
"namespace": "kube-public"
}
}
}
}
}
}
}
Request with datasource name, cluster name and namespace parameters
GET /dsmetadata
curl -H 'Accept: application/json' "http://<URL>:<PORT>/dsmetadata?datasource=<datasource_name>&cluster_name=<cluster_name>&namespace=<namespace>"
Returns the container-level metadata of the specified namespace, cluster name and datasource
Note : verbose
in the query URL to fetch container-level metadata is set to true
by default
Response for datasource name - prometheus-1
, cluster name - default
and namespace - monitoring
The response includes granular metadata about workloads and associated containers within specified namespace, cluster and datasource.
Example Response
{
"datasources": {
"prometheus-1": {
"datasource_name": "prometheus-1",
"clusters": {
"default": {
"cluster_name": "default",
"namespaces": {
"monitoring": {
"namespace": "monitoring",
"workloads": {
"kube-state-metrics": {
"workload_name": "kube-state-metrics",
"workload_type": "deployment",
"containers": {
"kube-state-metrics": {
"container_name": "kube-state-metrics",
"container_image_name": "k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.0.0"
},
"kube-rbac-proxy-self": {
"container_name": "kube-rbac-proxy-self",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
},
"kube-rbac-proxy-main": {
"container_name": "kube-rbac-proxy-main",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
}
}
},
"node-exporter": {
"workload_name": "node-exporter",
"workload_type": "daemonset",
"containers": {
"node-exporter": {
"container_name": "node-exporter",
"container_image_name": "quay.io/prometheus/node-exporter:v1.1.2"
},
"kube-rbac-proxy": {
"container_name": "kube-rbac-proxy",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
}
}
},
"postgres-deployment": {
"workload_name": "postgres-deployment",
"workload_type": "deployment",
"containers": {
"postgres": {
"container_name": "postgres",
"container_image_name": "quay.io/kruizehub/postgres:15.2"
}
}
},
"alertmanager-main": {
"workload_name": "alertmanager-main",
"workload_type": "statefulset",
"containers": {
"config-reloader": {
"container_name": "config-reloader",
"container_image_name": "quay.io/prometheus-operator/prometheus-config-reloader:v0.47.0"
},
"alertmanager": {
"container_name": "alertmanager",
"container_image_name": "quay.io/prometheus/alertmanager:v0.21.0"
}
}
},
"prometheus-adapter": {
"workload_name": "prometheus-adapter",
"workload_type": "deployment",
"containers": {
"prometheus-adapter": {
"container_name": "prometheus-adapter",
"container_image_name": "directxman12/k8s-prometheus-adapter:v0.8.4"
}
}
},
"kruize": {
"workload_name": "kruize",
"workload_type": "deployment",
"containers": {
"kruize": {
"container_name": "kruize",
"container_image_name": "quay.io/kruize/autotune_operator:0.0.21_mvp"
}
}
},
"grafana": {
"workload_name": "grafana",
"workload_type": "deployment",
"containers": {
"grafana": {
"container_name": "grafana",
"container_image_name": "grafana/grafana:7.5.4"
}
}
},
"prometheus-k8s": {
"workload_name": "prometheus-k8s",
"workload_type": "statefulset",
"containers": {
"config-reloader": {
"container_name": "config-reloader",
"container_image_name": "quay.io/prometheus-operator/prometheus-config-reloader:v0.47.0"
},
"prometheus": {
"container_name": "prometheus",
"container_image_name": "quay.io/prometheus/prometheus:v2.26.0"
}
}
},
"blackbox-exporter": {
"workload_name": "blackbox-exporter",
"workload_type": "deployment",
"containers": {
"kube-rbac-proxy": {
"container_name": "kube-rbac-proxy",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
},
"module-configmap-reloader": {
"container_name": "module-configmap-reloader",
"container_image_name": "jimmidyson/configmap-reload:v0.5.0"
},
"blackbox-exporter": {
"container_name": "blackbox-exporter",
"container_image_name": "quay.io/prometheus/blackbox-exporter:v0.18.0"
}
}
},
"prometheus-operator": {
"workload_name": "prometheus-operator",
"workload_type": "deployment",
"containers": {
"kube-rbac-proxy": {
"container_name": "kube-rbac-proxy",
"container_image_name": "quay.io/brancz/kube-rbac-proxy:v0.8.0"
},
"prometheus-operator": {
"container_name": "prometheus-operator",
"container_image_name": "quay.io/prometheus-operator/prometheus-operator:v0.47.0"
}
}
}
}
}
}
}
}
}
}
}
This is quick guide instructions to delete metadata using input JSON as follows.
Request
DELETE /dsmetadata
curl -H 'Accept: application/json' -X DELETE --data 'copy paste below JSON' http://<URL>:<PORT>/dsmetadata
Response
Example Response
{
"message": "Datasource metadata deleted successfully. View imported metadata at GET /dsmetadata",
"httpcode": 201,
"documentationLink": "",
"status": "SUCCESS"
}
This is quick guide instructions to create metric profiles using input JSON as follows. For a more detailed guide, see Create MetricProfile
Request
POST /createMetricProfile
curl -H 'Accept: application/json' -X POST --data 'copy paste below JSON' http://<URL>:<PORT>/createMetricProfile
Example Request for profile name - `resource-optimization-local-monitoring`
{
"apiVersion": "recommender.com/v1",
"kind": "KruizePerformanceProfile",
"metadata": {
"name": "resource-optimization-local-monitoring"
},
"profile_version": 1,
"k8s_type": "openshift",
"slo": {
"slo_class": "resource_usage",
"direction": "minimize",
"objective_function": {
"function_type": "source"
},
"function_variables": [
{
"name": "cpuRequest",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": [
{
"function": "avg",
"query": "avg by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD ', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "sum",
"query": "sum by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "min",
"query": "min by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "max",
"query": "max by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
]
},
{
"name": "cpuLimit",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": [
{
"function": "avg",
"query": "avg by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "sum",
"query": "sum by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "max",
"query": "max by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "min",
"query": "min by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
]
},
{
"name": "cpuUsage",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": [
{
"function": "avg",
"query": "avg by(container, namespace)(avg_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "min",
"query": "min by(container, namespace)(min_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "max",
"query": "max by(container, namespace)(max_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "sum",
"query": "sum by(container, namespace)(avg_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
]
},
{
"name": "cpuThrottle",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": [
{
"function": "avg",
"query": "avg by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "max",
"query": "max by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "min",
"query": "min by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "sum",
"query": "sum by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
]
},
{
"name": "memoryRequest",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": [
{
"function": "avg",
"query": "avg by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "sum",
"query": "sum by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "max",
"query": "max by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "min",
"query": "min by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
]
},
{
"name": "memoryLimit",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": [
{
"function": "avg",
"query": "avg by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "sum",
"query": "sum by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "max",
"query": "max by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
{
"function": "min",
"query": "min by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
]
},
{
"name": "memoryUsage",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": [
{
"function": "avg",
"query": "avg by(container, namespace) (avg_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "min",
"query": "min by(container, namespace) (min_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "max",
"query": "max by(container, namespace) (max_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "sum",
"query": "sum by(container, namespace) (avg_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
]
},
{
"name": "memoryRSS",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": [
{
"function": "avg",
"query": "avg by(container, namespace) (avg_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "min",
"query": "min by(container, namespace) (min_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "max",
"query": "max by(container, namespace) (max_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
{
"function": "sum",
"query": "sum by(container, namespace) (avg_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
]
},
{
"name": "maxDate",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": [
{
"function": "max",
"query": "max by(namespace,container) (last_over_time((timestamp(container_cpu_usage_seconds_total{namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"} > 0))[15d:]))"
}
]
}
]
}
}
Response
Example Response
{
"message": "Metric Profile : resource-optimization-local-monitoring created successfully. View all metric profiles at /listMetricProfiles",
"httpcode": 201,
"documentationLink": "",
"status": "SUCCESS"
}
This is quick guide instructions to retrieve metric profiles created as follows.
Request Parameters
Parameter | Type | Required | Description |
---|---|---|---|
name | string | optional | The name of the metric profile |
verbose | string | optional | Flag to retrieve all the metric queries |
Request without passing parameters
GET /listMetricProfiles
curl -H 'Accept: application/json' http://<URL>:<PORT>/listMetricProfiles
Returns list of all the metric profile names created
Example Response
[
{
"name": "resource-optimization-local-monitoring"
},
{
"name": "resource-optimization-local-monitoring1"
}
]
Request with metric profile name
GET /listMetricProfiles
curl -H 'Accept: application/json' http://<URL>:<PORT>/listMetricProfiles?name=resource-optimization-local-monitoring
Returns metric profile of the name specified
Example Response
[
{
"apiVersion": "recommender.com/v1",
"kind": "KruizePerformanceProfile",
"metadata": {
"name": "resource-optimization-local-monitoring"
},
"profile_version": 1.0,
"k8s_type": "openshift",
"slo": {
"sloClass": "resource_usage",
"objective_function": {
"function_type": "source"
},
"direction": "minimize",
"function_variables": [
{
"name": "cpuRequest",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD ', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "cpuLimit",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "cpuUsage",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace)(avg_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container, namespace)(min_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container, namespace)(max_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace)(avg_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "cpuThrottle",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "memoryRequest",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "memoryLimit",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "memoryUsage",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (avg_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (min_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (max_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (avg_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "memoryRSS",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (avg_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (min_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (max_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (avg_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "maxDate",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"max": {
"function": "max",
"query": "max by(namespace,container) (last_over_time((timestamp(container_cpu_usage_seconds_total{namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"} > 0))[15d:]))"
}
}
}
]
}
}
]
Request
GET /listMetricProfiles
curl -H 'Accept: application/json' http://<URL>:<PORT>/listMetricProfiles?verbose=true
Returns list of all the metric profile created with all the metric queries
Example Response
[
{
"apiVersion": "recommender.com/v1",
"kind": "KruizePerformanceProfile",
"metadata": {
"name": "resource-optimization-local-monitoring"
},
"profile_version": 1.0,
"k8s_type": "openshift",
"slo": {
"sloClass": "resource_usage",
"objective_function": {
"function_type": "source"
},
"direction": "minimize",
"function_variables": [
{
"name": "cpuRequest",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD ', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "cpuLimit",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "cpuUsage",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace)(avg_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container, namespace)(min_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container, namespace)(max_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace)(avg_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "cpuThrottle",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "memoryRequest",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "memoryLimit",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "memoryUsage",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (avg_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (min_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (max_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (avg_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "memoryRSS",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (avg_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (min_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (max_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (avg_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "maxDate",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"max": {
"function": "max",
"query": "max by(namespace,container) (last_over_time((timestamp(container_cpu_usage_seconds_total{namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"} > 0))[15d:]))"
}
}
}
]
}
},
{
"apiVersion": "recommender.com/v1",
"kind": "KruizePerformanceProfile",
"metadata": {
"name": "resource-optimization-local-monitoring1"
},
"profile_version": 1.0,
"k8s_type": "openshift",
"slo": {
"sloClass": "resource_usage",
"objective_function": {
"function_type": "source"
},
"direction": "minimize",
"function_variables": [
{
"name": "cpuRequest",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD ', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='cpu', unit='core' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "cpuLimit",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='cpu', unit='core',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "cpuUsage",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace)(avg_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container, namespace)(min_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container, namespace)(max_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace)(avg_over_time(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "cpuThrottle",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container,namespace) (rate(container_cpu_cfs_throttled_seconds_total{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "memoryRequest",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (kube_pod_container_resource_requests{container!='', container!='POD', pod!='', resource='memory', unit='byte' ,namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "memoryLimit",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"min": {
"function": "min",
"query": "min by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"max": {
"function": "max",
"query": "max by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
},
"sum": {
"function": "sum",
"query": "sum by(container,namespace) (kube_pod_container_resource_limits{container!='', container!='POD', pod!='', resource='memory', unit='byte',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"})"
}
}
},
{
"name": "memoryUsage",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (avg_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (min_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\" }[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (max_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (avg_over_time(container_memory_working_set_bytes{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "memoryRSS",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"avg": {
"function": "avg",
"query": "avg by(container, namespace) (avg_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"min": {
"function": "min",
"query": "min by(container, namespace) (min_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"max": {
"function": "max",
"query": "max by(container, namespace) (max_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
},
"sum": {
"function": "sum",
"query": "sum by(container, namespace) (avg_over_time(container_memory_rss{container!='', container!='POD', pod!='',namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"}[$MEASUREMENT_DURATION_IN_MIN$m]))"
}
}
},
{
"name": "maxDate",
"datasource": "prometheus",
"value_type": "double",
"kubernetes_object": "container",
"aggregation_functions": {
"max": {
"function": "max",
"query": "max by(namespace,container) (last_over_time((timestamp(container_cpu_usage_seconds_total{namespace=\"$NAMESPACE$\",container=\"$CONTAINER_NAME$\"} > 0))[15d:]))"
}
}
}
]
}
}
]
This is quick guide instructions to delete metric profile created as follows.
Request Parameters
Parameter | Type | Required | Description |
---|---|---|---|
name | string | required | The name of the metric profile |
Request with name query parameter
DELETE /deleteMetricProfile
curl -H 'Accept: application/json' http://<URL>:<PORT>/deleteMetricProfile?name=resource-optimization-local-monitoring
Deletes the specified metric profile name, provided metric profile already is created
Example Response
{
"message": "Metric profile: resource-optimization-local-monitoring deleted successfully. View Metric Profiles at /listMetricProfiles",
"httpcode": 201,
"documentationLink": "",
"status": "SUCCESS"
}
This is quick guide instructions to create experiments using input JSON as follows. For a more detailed guide, see Create Experiment
Request
POST /createExperiment
curl -H 'Accept: application/json' -X POST --data 'copy paste below JSON' http://<URL>:<PORT>/createExperiment
Example Request for datasource - `prometheus-1`
[
{
"version": "v2.0",
"experiment_name": "default|default|deployment|tfb-qrh-deployment",
"cluster_name": "default",
"performance_profile": "resource-optimization-openshift",
"mode": "monitor",
"target_cluster": "local",
"kubernetes_objects": [
{
"type": "deployment",
"name": "tfb-qrh-deployment",
"namespace": "default",
"containers": [
{
"container_image_name": "kruize/tfb-db:1.15",
"container_name": "tfb-server-0"
},
{
"container_image_name": "kruize/tfb-qrh:1.13.2.F_et17",
"container_name": "tfb-server-1"
}
]
}
],
"trial_settings": {
"measurement_duration": "15min"
},
"recommendation_settings": {
"threshold": "0.1"
},
"datasource": "prometheus-1"
}
]
Request with experiment_type
field
The experiment_type
field in the JSON is optional and can be used to
indicate whether the experiment is of type namespace
or container
.
If no experiment type is specified, it will default to container
.
Example Request with experiment_type - `namespace`
The `experiment_type` field in the JSON is optional and can be used to indicate whether the experiment is of type `namespace` or `container`. If no experiment type is specified, it will default to `container`.[{
"version": "v2.0",
"experiment_name": "default|namespace-demo",
"cluster_name": "default",
"performance_profile": "resource-optimization-local-monitoring",
"mode": "monitor",
"target_cluster": "local",
"datasource": "prometheus-1",
"experiment_type": "namespace",
"kubernetes_objects": [
{
"namespaces": {
"namespace_name": "test-multiple-import"
}
}
],
"trial_settings": {
"measurement_duration": "15min"
},
"recommendation_settings": {
"threshold": "0.1"
}
}]
Example Request with experiment_type - `container`
[
{
"version": "v2.0",
"experiment_name": "default|default|deployment|tfb-qrh-deployment",
"cluster_name": "default",
"performance_profile": "resource-optimization-openshift",
"mode": "monitor",
"target_cluster": "local",
"experiment_type": "container",
"kubernetes_objects": [
{
"type": "deployment",
"name": "tfb-qrh-deployment",
"namespace": "default",
"containers": [
{
"container_image_name": "kruize/tfb-db:1.15",
"container_name": "tfb-server-0"
},
{
"container_image_name": "kruize/tfb-qrh:1.13.2.F_et17",
"container_name": "tfb-server-1"
}
]
}
],
"trial_settings": {
"measurement_duration": "15min"
},
"recommendation_settings": {
"threshold": "0.1"
},
"datasource": "prometheus-1"
}
]
Response
Example Response
{
"message": "Experiment registered successfully with Autotune. View registered experiments at /listExperiments",
"httpcode": 201,
"documentationLink": "",
"status": "SUCCESS"
}
Request with experiment name parameter
GET /listExperiments
curl -H 'Accept: application/json' http://<URL>:<PORT>/listExperiments?experiment_name=<experiment_name>
Returns the experiment details of the specified experiment
Request with recommendations set to true
GET /listExperiments
curl -H 'Accept: application/json' http://<URL>:<PORT>/listExperiments?recommendations=true
Returns the latest recommendations of all the experiments
Response for experiment name - default|default_0|deployment|tfb-qrh-deployment_0
Example Response
[
{
"version": "v2.0",
"experiment_id": "f0007796e65c999d843bebd447c2fbaa6aaf9127c614da55e333cd6bdb628a74",
"experiment_name": "default|default_0|deployment|tfb-qrh-deployment_0",
"cluster_name": "default",
"datasource": "prometheus-1",
"experiment_type": "container",
"mode": "monitor",
"target_cluster": "local",
"status": "IN_PROGRESS",
"performance_profile": "resource-optimization-openshift",
"trial_settings": {
"measurement_duration": "15min"
},
"recommendation_settings": {
"threshold": "0.1"
},
"experiment_usecase_type": {
"remote_monitoring": false,
"local_monitoring": true,
"local_experiment": false
},
"validation_data": {
"success": true,
"message": "Registered successfully with Kruize! View registered experiments at /listExperiments",
"errorCode": 201
},
"kubernetes_objects": [
{
"type": "deployment",
"name": "tfb-qrh-deployment_0",
"namespace": "default_0",
"containers": {
"tfb-server-1": {
"container_image_name": "kruize/tfb-qrh:1.13.2.F_et17",
"container_name": "tfb-server-1",
"recommendations": {
"version": "1.0",
"notifications": {
"112101": {
"type": "info",
"message": "Cost Recommendations Available",
"code": 112101
}
},
"data": {
"2023-04-02T08:00:00.680Z": {
"cost": {
"short_term": {
"monitoring_start_time": "2023-04-01T06:45:00.000Z",
"monitoring_end_time": "2023-04-02T08:00:00.680Z",
"duration_in_hours": 24.0,
"pods_count": 27,
"confidence_level": 0.0,
"current": {
"requests": {
"memory": {
"amount": 490.93,
"format": "MiB"
},
"cpu": {
"amount": 1.46,
"format": "cores"
}
},
"limits": {
"memory": {
"amount": 712.21,
"format": "MiB"
},
"cpu": {
"amount": 1.54,
"format": "cores"
}
}
},
"config": {
"requests": {
"memory": {
"amount": 1197.9840000000002,
"format": "MiB"
},
"cpu": {
"amount": 7.68,
"format": "cores"
}
},
"limits": {
"memory": {
"amount": 1197.9840000000002,
"format": "MiB"
},
"cpu": {
"amount": 7.68,
"format": "cores"
}
}
},
"variation": {
"requests": {
"memory": {
"amount": 707.0540000000001,
"format": "MiB"
},
"cpu": {
"amount": 6.22,
"format": "cores"
}
},
"limits": {
"memory": {
"amount": 485.7740000000001,
"format": "MiB"
},
"cpu": {
"amount": 6.14,
"format": "cores"
}
}
},
"notifications": {}
},
"medium_term": {
"pods_count": 0,
"confidence_level": 0.0,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
},
"long_term": {
"pods_count": 0,
"confidence_level": 0.0,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
}
}
}
}
}
},
"tfb-server-0": {
"container_image_name": "kruize/tfb-db:1.15",
"container_name": "tfb-server-0",
"recommendations": {
"version": "1.0",
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
},
"data": {}
}
}
}
}
]
},
...
...
...
{
"version": "v2.0",
"experiment_id": "ab0a31a522cebdde52561482300d078ed1448fa7b75834fa216677d1d9d5cda6",
"experiment_name": "default|default_1|deployment|tfb-qrh-deployment_1",
"cluster_name": "default",
"datasource": "prometheus-1",
"experiment_type": "container",
"mode": "monitor",
"target_cluster": "local",
"status": "IN_PROGRESS",
"performance_profile": "resource-optimization-openshift",
"trial_settings": {
"measurement_duration": "15min"
},
"recommendation_settings": {
"threshold": "0.1"
},
"experiment_usecase_type": {
"remote_monitoring": false,
"local_monitoring": true,
"local_experiment": false
},
"validation_data": {
"success": true,
"message": "Registered successfully with Kruize! View registered experiments at /listExperiments",
"errorCode": 201
},
"kubernetes_objects": [
{
"type": "deployment",
"name": "tfb-qrh-deployment_1",
"namespace": "default_1",
"containers": {
"tfb-server-1": {
"container_image_name": "kruize/tfb-qrh:1.13.2.F_et17",
"container_name": "tfb-server-1",
"recommendations": {
"version": "1.0",
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
},
"data": {}
}
},
"tfb-server-0": {
"container_image_name": "kruize/tfb-db:1.15",
"container_name": "tfb-server-0",
"recommendations": {
"version": "1.0",
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
},
"data": {}
}
}
}
}
]
},
]
Request with recommendations set to true with experiment name parameter
GET /listExperiments
curl -H 'Accept: application/json' http://<URL>:<PORT>/listExperiments?recommendations=true&experiment_name=<experiment_name>
Returns the latest recommendations of the specified experiment with no results
Request with recommendations set to true and latest set to false
GET /listExperiments
curl -H 'Accept: application/json' http://<URL>:<PORT>/listExperiments?recommendations=true&latest=false
Returns all the recommendations of all the experiments
Response for experiment name - default|default_0|deployment|tfb-qrh-deployment_0
Example Response
[
{
"version": "v2.0",
"experiment_id": "f0007796e65c999d843bebd447c2fbaa6aaf9127c614da55e333cd6bdb628a74",
"experiment_name": "default|default_0|deployment|tfb-qrh-deployment_0",
"cluster_name": "default",
"datasource": "prometheus-1",
"mode": "monitor",
"target_cluster": "local",
"status": "IN_PROGRESS",
"performance_profile": "resource-optimization-openshift",
"trial_settings": {
"measurement_duration": "15min"
},
"recommendation_settings": {
"threshold": "0.1"
},
"experiment_usecase_type": {
"remote_monitoring": false,
"local_monitoring": true,
"local_experiment": false
},
"validation_data": {
"success": true,
"message": "Registered successfully with Kruize! View registered experiments at /listExperiments",
"errorCode": 201
},
"kubernetes_objects": [
{
"type": "deployment",
"name": "tfb-qrh-deployment_0",
"namespace": "default_0",
"containers": {
"tfb-server-1": {
"container_image_name": "kruize/tfb-qrh:1.13.2.F_et17",
"container_name": "tfb-server-1",
"recommendations": {
"version": "1.0",
"notifications": {
"112101": {
"type": "info",
"message": "Cost Recommendations Available",
"code": 112101
}
},
"data": {
"2023-04-02T06:00:00.770Z": {
"cost": {
"short_term": {
"monitoring_start_time": "2023-04-01T04:45:00.000Z",
"monitoring_end_time": "2023-04-02T06:00:00.770Z",
"duration_in_hours": 24,
"pods_count": 27,
"confidence_level": 0,
"current": {
"requests": {
"memory": {
"amount": 490.93,
"format": "MiB"
},
"cpu": {
"amount": 1.46,
"format": "cores"
}
},
"limits": {
"memory": {
"amount": 712.21,
"format": "MiB"
},
"cpu": {
"amount": 1.54,
"format": "cores"
}
}
},
"config": {
"requests": {
"memory": {
"amount": 1197.9840000000002,
"format": "MiB"
},
"cpu": {
"amount": 7.68,
"format": "cores"
}
},
"limits": {
"memory": {
"amount": 1197.9840000000002,
"format": "MiB"
},
"cpu": {
"amount": 7.68,
"format": "cores"
}
}
},
"variation": {
"requests": {
"memory": {
"amount": 707.0540000000001,
"format": "MiB"
},
"cpu": {
"amount": 6.22,
"format": "cores"
}
},
"limits": {
"memory": {
"amount": 485.7740000000001,
"format": "MiB"
},
"cpu": {
"amount": 6.14,
"format": "cores"
}
}
},
"notifications": {}
},
"medium_term": {
"pods_count": 0,
"confidence_level": 0,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
},
"long_term": {
"pods_count": 0,
"confidence_level": 0,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
}
}
},
...
...
...
"2023-04-02T04:30:00.000Z": {
"cost": {
"short_term": {
"monitoring_start_time": "2023-04-01T03:15:00.000Z",
"monitoring_end_time": "2023-04-02T04:30:00.000Z",
"duration_in_hours": 24,
"pods_count": 27,
"confidence_level": 0,
"current": {
"requests": {
"memory": {
"amount": 490.93,
"format": "MiB"
},
"cpu": {
"amount": 1.46,
"format": "cores"
}
},
"limits": {
"memory": {
"amount": 712.21,
"format": "MiB"
},
"cpu": {
"amount": 1.54,
"format": "cores"
}
}
},
"config": {
"requests": {
"memory": {
"amount": 1197.9840000000002,
"format": "MiB"
},
"cpu": {
"amount": 7.68,
"format": "cores"
}
},
"limits": {
"memory": {
"amount": 1197.9840000000002,
"format": "MiB"
},
"cpu": {
"amount": 7.68,
"format": "cores"
}
}
},
"variation": {
"requests": {
"memory": {
"amount": 707.0540000000001,
"format": "MiB"
},
"cpu": {
"amount": 6.22,
"format": "cores"
}
},
"limits": {
"memory": {
"amount": 485.7740000000001,
"format": "MiB"
},
"cpu": {
"amount": 6.14,
"format": "cores"
}
}
},
"notifications": {}
},
"medium_term": {
"pods_count": 0,
"confidence_level": 0,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
},
"long_term": {
"pods_count": 0,
"confidence_level": 0,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
}
}
}
}
}
},
"tfb-server-0": {
"container_image_name": "kruize/tfb-db:1.15",
"container_name": "tfb-server-0",
"recommendations": {
"version": "1.0",
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
},
"data": {}
}
}
}
}
]
},
...
...
...
]
Request with recommendations set to true, latest set to false and with experiment name parameter
GET /listExperiments
curl -H 'Accept: application/json' http://<URL>:<PORT>/listExperiments?recommendations=true&latest=false&experiment_name=<experiment_name>
Returns all the recommendations of the specified experiment
List Experiments also allows the user to send a request body to fetch the records based on cluster_name
and kubernetes_object
.
Note: This request body can be sent along with other query params which are mentioned above.
curl -H 'Accept: application/json' -X GET --data 'copy paste below JSON' http://<URL>:<PORT>/listExperiments
Example Request
{
"cluster_name": "default",
"kubernetes_objects": [
{
"type": "deployment",
"name": "tfb-qrh-deployment",
"namespace": "default",
"containers": [
{
"container_image_name": "kruize/tfb-db:1.15",
"container_name": "tfb-server-1"
}
]
}
]
}
Note: This API is specific to the Local Monitoring use case.
Generates the recommendation for a specific experiment based on provided parameters similar to update recommendations API.
This can be called directly after creating the experiment and doesn't require the update results API as metrics are
fetched from the provided datasource
(E.g. Prometheus) instead of the database.
Request Parameters
Parameter | Type | Required | Description |
---|---|---|---|
experiment_name | string | Yes | The name of the experiment. |
interval_end_time | string | optional | The end time of the interval in the format yyyy-MM-ddTHH:mm:sssZ . This should be the date on which recommendation needs to be generated. |
interval_start_time | string | optional | The start time of the interval in the format yyyy-MM-ddTHH:mm:sssZ . |
The recommendation API requires only one mandatory field i.e. experiment_name
. Other optional parameter like interval_end_time
will be fetched from the provided datasource.
Similarly, interval_start_time
will be calculated based on interval_end_time
, if not provided. By utilizing
these parameters, the API generates recommendations based on short-term, medium-term, and long-term factors. For
instance, if the long-term setting is configured for 15 days
and the interval_end_time is set to Jan 15 2023 00:00: 00.000Z
, the API retrieves data from the past 15 days, starting from January 1st. Using this data, the API generates
three recommendations for Jan 15th 2023
.
It is important to ensure that the difference between interval_end_time
and interval_start_time
should not exceed 15
days. This restriction is in place to prevent potential timeouts, as generating recommendations beyond this threshold
might require more time.
Request with experiment name and interval_end_time parameters
POST /generateRecommendations?experiment_name=?&interval_end_time=?
POST /generateRecommendations?experiment_name=?&interval_end_time=?&interval_start_time=?
example
curl --location --request POST 'http://<URL>:<PORT>/generateRecommendations?interval_end_time=2023-01-02T00:15:00.000Z&experiment_name=temp_1'
success status code : 201
Response
The response will contain a array of JSON object with the recommendations for the specified experiment.
Example Response Body
[
{
"cluster_name": "default",
"experiment_type": "container",
"kubernetes_objects": [
{
"type": "deployment",
"name": "tfb-qrh-deployment_5",
"namespace": "default_5",
"containers": [
{
"container_image_name": "kruize/tfb-qrh:1.13.2.F_et17",
"container_name": "tfb-server-1",
"recommendations": {
"version": "1.0",
"notifications": {
"111000": {
"type": "info",
"message": "Recommendations Are Available",
"code": 111000
}
},
"data": {
"2023-04-02T13:30:00.680Z": {
"notifications": {
"111101": {
"type": "info",
"message": "Short Term Recommendations Available",
"code": 111101
}
},
"monitoring_end_time": "2023-04-02T13:30:00.680Z",
"current": {
"limits": {
"memory": {
"amount": 1.048576E8,
"format": "bytes"
},
"cpu": {
"amount": 0.5,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 5.264900096E7,
"format": "bytes"
},
"cpu": {
"amount": 5.37,
"format": "cores"
}
}
},
"recommendation_terms": {
"short_term": {
"duration_in_hours": 24.0,
"notifications": {
"112101": {
"type": "info",
"message": "Cost Recommendations Available",
"code": 112101
},
"112102": {
"type": "info",
"message": "Performance Recommendations Available",
"code": 112102
}
},
"monitoring_start_time": "2023-04-01T12:00:00.000Z",
"recommendation_engines": {
"cost": {
"pods_count": 7,
"confidence_level": 0.0,
"config": {
"limits": {
"memory": {
"amount": 2.497708032E8,
"format": "bytes"
},
"cpu": {
"amount": 0.9299999999999999,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 2.497708032E8,
"format": "bytes"
},
"cpu": {
"amount": 0.9299999999999999,
"format": "cores"
}
}
},
"variation": {
"limits": {
"memory": {
"amount": 1.449132032E8,
"format": "bytes"
},
"cpu": {
"amount": -4.44,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 1.9712180223999997902848E8,
"format": "bytes"
},
"cpu": {
"amount": -4.44,
"format": "cores"
}
}
},
"notifications": {}
},
"performance": {
"pods_count": 27,
"confidence_level": 0.0,
"config": {
"limits": {
"memory": {
"amount": 2.497708032E8,
"format": "bytes"
},
"cpu": {
"amount": 0.9299999999999999,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 2.497708032E8,
"format": "bytes"
},
"cpu": {
"amount": 0.9299999999999999,
"format": "cores"
}
}
},
"variation": {
"limits": {
"memory": {
"amount": 1.449132032E8,
"format": "bytes"
},
"cpu": {
"amount": -4.44,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 1.9712180223999997902848E8,
"format": "bytes"
},
"cpu": {
"amount": -4.44,
"format": "cores"
}
}
},
"notifications": {}
}
}
},
"medium_term": {
"duration_in_hours": 33.8,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
},
"long_term": {
"duration_in_hours": 33.8,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
}
}
}
}
}
},
{
"container_image_name": "kruize/tfb-db:1.15",
"container_name": "tfb-server-0",
"recommendations": {
"version": "1.0",
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
},
"data": {}
}
}
]
}
],
"version": "v2.0",
"experiment_name": "temp_1"
}
]
Request without interval_end_time parameter
POST /generateRecommendations?experiment_name=?
example
curl --location --request POST 'http://<URL>:<PORT>/generateRecommendations?experiment_name=temp_1'
success status code : 201
Response
The response will contain an array of JSON object with the recommendations for the specified experiment.
When interval_end_time
is not specified, Kruize will determine the latest timestamp from the specified datasource
(E.g. Prometheus) by checking the latest active container CPU usage.
Example Response Body
[
{
"cluster_name": "default",
"experiment_type": "container",
"kubernetes_objects": [
{
"type": "deployment",
"name": "tfb-qrh-deployment_5",
"namespace": "default_5",
"containers": [
{
"container_image_name": "kruize/tfb-qrh:1.13.2.F_et17",
"container_name": "tfb-server-1",
"recommendations": {
"version": "1.0",
"notifications": {
"111000": {
"type": "info",
"message": "Recommendations Are Available",
"code": 111000
}
},
"data": {
"2023-04-02T13:30:00.680Z": {
"notifications": {
"111101": {
"type": "info",
"message": "Short Term Recommendations Available",
"code": 111101
}
},
"monitoring_end_time": "2023-04-02T13:30:00.680Z",
"current": {
"limits": {
"memory": {
"amount": 1.048576E8,
"format": "bytes"
},
"cpu": {
"amount": 0.5,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 5.264900096E7,
"format": "bytes"
},
"cpu": {
"amount": 5.37,
"format": "cores"
}
}
},
"recommendation_terms": {
"short_term": {
"duration_in_hours": 24.0,
"notifications": {
"112101": {
"type": "info",
"message": "Cost Recommendations Available",
"code": 112101
},
"112102": {
"type": "info",
"message": "Performance Recommendations Available",
"code": 112102
}
},
"monitoring_start_time": "2023-04-01T12:00:00.000Z",
"recommendation_engines": {
"cost": {
"pods_count": 7,
"confidence_level": 0.0,
"config": {
"limits": {
"memory": {
"amount": 2.497708032E8,
"format": "bytes"
},
"cpu": {
"amount": 0.9299999999999999,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 2.497708032E8,
"format": "bytes"
},
"cpu": {
"amount": 0.9299999999999999,
"format": "cores"
}
}
},
"variation": {
"limits": {
"memory": {
"amount": 1.449132032E8,
"format": "bytes"
},
"cpu": {
"amount": -4.44,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 1.9712180223999997902848E8,
"format": "bytes"
},
"cpu": {
"amount": -4.44,
"format": "cores"
}
}
},
"notifications": {}
},
"performance": {
"pods_count": 27,
"confidence_level": 0.0,
"config": {
"limits": {
"memory": {
"amount": 2.497708032E8,
"format": "bytes"
},
"cpu": {
"amount": 0.9299999999999999,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 2.497708032E8,
"format": "bytes"
},
"cpu": {
"amount": 0.9299999999999999,
"format": "cores"
}
}
},
"variation": {
"limits": {
"memory": {
"amount": 1.449132032E8,
"format": "bytes"
},
"cpu": {
"amount": -4.44,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 1.9712180223999997902848E8,
"format": "bytes"
},
"cpu": {
"amount": -4.44,
"format": "cores"
}
}
},
"notifications": {}
}
}
},
"medium_term": {
"duration_in_hours": 33.8,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
},
"long_term": {
"duration_in_hours": 33.8,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
}
}
}
}
}
},
{
"container_image_name": "kruize/tfb-db:1.15",
"container_name": "tfb-server-0",
"recommendations": {
"version": "1.0",
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
},
"data": {}
}
}
]
}
],
"version": "v2.0",
"experiment_name": "temp_1"
}
]
Request for namespace
experiment
POST /generateRecommendations?experiment_name=?
example
curl --location --request POST 'http://<URL>:<PORT>/generateRecommendations?experiment_name=temp_1'
success status code : 201
Response for namespace
Experiment
The response will contain an array of JSON object with the recommendations for the specified experiment.
When interval_end_time
is not specified, Kruize will determine the latest timestamp from the specified datasource
(E.g. Prometheus) by checking the latest active container CPU usage.
Example Response Body
[
{
"cluster_name": "test-multiple-import",
"experiment_type": "namespace",
"kubernetes_objects": [
{
"namespace": "default",
"containers": [],
"namespaces": {
"namespace_name": "default",
"recommendations": {
"version": "1.0",
"notifications": {
"111000": {
"type": "info",
"message": "Recommendations Are Available",
"code": 111000
}
},
"data": {
"2024-09-25T09:46:20.000Z": {
"notifications": {
"111101": {
"type": "info",
"message": "Short Term Recommendations Available",
"code": 111101
}
},
"monitoring_end_time": "2024-09-25T09:46:20.000Z",
"current": {},
"recommendation_terms": {
"short_term": {
"duration_in_hours": 24.0,
"notifications": {
"112101": {
"type": "info",
"message": "Cost Recommendations Available",
"code": 112101
},
"112102": {
"type": "info",
"message": "Performance Recommendations Available",
"code": 112102
}
},
"monitoring_start_time": "2024-09-24T09:46:20.000Z",
"recommendation_engines": {
"cost": {
"pods_count": 2,
"confidence_level": 0.0,
"config": {
"limits": {
"memory": {
"amount": 1.442955264E9,
"format": "bytes"
},
"cpu": {
"amount": 5.834468490017892,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 1.442955264E9,
"format": "bytes"
},
"cpu": {
"amount": 5.834468490017892,
"format": "cores"
}
}
},
"variation": {
"limits": {
"memory": {
"amount": 1.442955264E9,
"format": "bytes"
},
"cpu": {
"amount": 5.834468490017892,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 1.442955264E9,
"format": "bytes"
},
"cpu": {
"amount": 5.834468490017892,
"format": "cores"
}
}
},
"notifications": {}
},
"performance": {
"pods_count": 2,
"confidence_level": 0.0,
"config": {
"limits": {
"memory": {
"amount": 1.442955264E9,
"format": "bytes"
},
"cpu": {
"amount": 5.834468490017892,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 1.442955264E9,
"format": "bytes"
},
"cpu": {
"amount": 5.834468490017892,
"format": "cores"
}
}
},
"variation": {
"limits": {
"memory": {
"amount": 1.442955264E9,
"format": "bytes"
},
"cpu": {
"amount": 5.834468490017892,
"format": "cores"
}
},
"requests": {
"memory": {
"amount": 1.442955264E9,
"format": "bytes"
},
"cpu": {
"amount": 5.834468490017892,
"format": "cores"
}
}
},
"notifications": {}
}
}
},
"medium_term": {
"duration_in_hours": 168.0,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
},
"long_term": {
"duration_in_hours": 360.0,
"notifications": {
"120001": {
"type": "info",
"message": "There is not enough data available to generate a recommendation.",
"code": 120001
}
}
}
}
}
}
}
}
}
],
"version": "v2.0",
"experiment_name": "namespace-demo"
}
]
Error Responses
HTTP Status Code | Description |
---|---|
400 | experiment_name is mandatory. |
400 | Given timestamp - " 2023-011-02T00:00:00.000Z " is not a valid timestamp format. |
400 | Not Found: experiment_name does not exist: exp_1. |
400 | No metrics available from 2024-01-15T00:00:00.000Z to 2023-12-31T00:00:00.000Z . |
400 | The gap between the interval_start_time and interval_end_time must be within a maximum of 15 days! |
400 | The Start time should precede the End time! |
500 | Internal Server Error |