375 lines
10 KiB
Plaintext
375 lines
10 KiB
Plaintext
|
---
|
||
|
layout: api
|
||
|
page_title: Recommendations - HTTP API
|
||
|
sidebar_title: Recommendations
|
||
|
description: >-
|
||
|
The /recommendation endpoints are used to query for and interact with Dynamic
|
||
|
Application Sizing recommendations.
|
||
|
---
|
||
|
|
||
|
# Recommendation HTTP API
|
||
|
|
||
|
The `/recommendation` endpoints are used to query and interact with Dynamic
|
||
|
Application Sizing recommendations.
|
||
|
|
||
|
~> **Enterprise Only!** This API endpoint and functionality only exists in
|
||
|
Nomad Enterprise. This is not present in the open source version of Nomad.
|
||
|
|
||
|
## List Recommendations
|
||
|
|
||
|
This endpoint lists all the currently available recommendations and provides
|
||
|
optional filtering of that list.
|
||
|
|
||
|
| Method | Path | Produces |
|
||
|
| ------ | --------------------- | ------------------ |
|
||
|
| `GET` | `/v1/recommendations` | `application/json` |
|
||
|
|
||
|
The table below shows this endpoint's support for
|
||
|
[blocking queries](/api-docs#blocking-queries) and
|
||
|
[required ACLs](/api-docs#acls).
|
||
|
|
||
|
| Blocking Queries | ACL Required |
|
||
|
| ---------------- | ----------------------------------------------------------------------------------- |
|
||
|
| `YES` | `namespace:read-job` or `namespace:submit-recommendation` or `namespace:submit-job` |
|
||
|
|
||
|
### Parameters
|
||
|
|
||
|
- `group` `(string: "")` - Specifies the task group name to filter within a job. If
|
||
|
specified, the `job` parameter must also be specified.
|
||
|
|
||
|
- `job` `(string: "")` - Specifies the job ID to filter the recommendations list by.
|
||
|
|
||
|
- `namespace` `(string: "default")` - Specifies the namespace to search. Specifying
|
||
|
`*` would return all recommendations across all the authorized namespaces.
|
||
|
|
||
|
- `task` `(string: "")` - Specifies the task name to filter within a job and task
|
||
|
group. If specified, the `job` and `group` query parameters must also be
|
||
|
specified.
|
||
|
|
||
|
### Sample Request
|
||
|
|
||
|
```shell-session
|
||
|
$ curl \
|
||
|
https://localhost:4646/v1/recommendations
|
||
|
```
|
||
|
|
||
|
```shell-session
|
||
|
$ curl \
|
||
|
https://localhost:4646/v1/recommendations?namespace=*
|
||
|
```
|
||
|
|
||
|
```shell-session
|
||
|
$ curl \
|
||
|
https://localhost:4646/v1/recommendations?namespace=*&job=example&group=cache&task=redis
|
||
|
```
|
||
|
|
||
|
### Sample Response
|
||
|
|
||
|
```json
|
||
|
[
|
||
|
{
|
||
|
"ID": "cb80a13d-20d8-fb05-db3f-4ea0fe667b1b",
|
||
|
"Region": "global",
|
||
|
"Namespace": "default",
|
||
|
"JobID": "example",
|
||
|
"JobVersion": 0,
|
||
|
"Group": "cache",
|
||
|
"Task": "redis",
|
||
|
"Resource": "MemoryMB",
|
||
|
"Value": 10,
|
||
|
"Current": 200,
|
||
|
"Meta": {
|
||
|
"nomad_autoscaler.count.capped": true,
|
||
|
"nomad_autoscaler.count.original": 6,
|
||
|
"nomad_autoscaler.reason_history": [],
|
||
|
"nomad_policy_id": "c355d0ec-7aa1-2604-449d-4ec79c813d2c",
|
||
|
"num_evaluated_windows": 1148,
|
||
|
"window_size": 300000000000
|
||
|
},
|
||
|
"Stats": {
|
||
|
"min": 2.6640625,
|
||
|
"p99": 6.51171875,
|
||
|
"max": 6.515625,
|
||
|
"mean": 4.816847859995009
|
||
|
},
|
||
|
"EnforceVersion": false,
|
||
|
"SubmitTime": 1603372587714807000,
|
||
|
"CreateIndex": 5193,
|
||
|
"ModifyIndex": 10437
|
||
|
},
|
||
|
{
|
||
|
"ID": "fdd2b5f1-e6ad-110e-75b9-8f9410e1d8ab",
|
||
|
"Region": "global",
|
||
|
"Namespace": "default",
|
||
|
"JobID": "example",
|
||
|
"JobVersion": 0,
|
||
|
"Group": "cache",
|
||
|
"Task": "redis",
|
||
|
"Resource": "CPU",
|
||
|
"Value": 57,
|
||
|
"Current": 500,
|
||
|
"Meta": {
|
||
|
"window_size": 300000000000,
|
||
|
"nomad_policy_id": "b2c64295-4315-2fdc-6158-a27156808729",
|
||
|
"num_evaluated_windows": 1117
|
||
|
},
|
||
|
"Stats": {
|
||
|
"min": 0,
|
||
|
"p99": 50,
|
||
|
"max": 63.46186447143555,
|
||
|
"mean": 0.3649455045779875
|
||
|
},
|
||
|
"EnforceVersion": false,
|
||
|
"SubmitTime": 1603372287894356000,
|
||
|
"CreateIndex": 5275,
|
||
|
"ModifyIndex": 10419
|
||
|
}
|
||
|
]
|
||
|
```
|
||
|
|
||
|
## Read Recommendation
|
||
|
|
||
|
This endpoint reads information about a specific recommendation.
|
||
|
|
||
|
| Method | Path | Produces |
|
||
|
| ------ | --------------------------------------- | ------------------ |
|
||
|
| `GET` | `/v1/recommendation/:recommendation_id` | `application/json` |
|
||
|
|
||
|
The table below shows this endpoint's support for
|
||
|
[blocking queries](/api-docs#blocking-queries) and
|
||
|
[required ACLs](/api-docs#acls).
|
||
|
|
||
|
| Blocking Queries | ACL Required |
|
||
|
| ---------------- | -------------------- |
|
||
|
| `YES` | `namespace:read-job` |
|
||
|
|
||
|
### Parameters
|
||
|
|
||
|
- `:recommendation_id` `(string: <required>)`- Specifies the recommendation ID to
|
||
|
query. This is specified as part of the path.
|
||
|
|
||
|
### Sample Request
|
||
|
|
||
|
```shell-session
|
||
|
$ curl \
|
||
|
https://localhost:4646/v1/recommendation/cb80a13d-20d8-fb05-db3f-4ea0fe667b1b
|
||
|
```
|
||
|
|
||
|
### Sample Response
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"ID": "cb80a13d-20d8-fb05-db3f-4ea0fe667b1b",
|
||
|
"Region": "global",
|
||
|
"Namespace": "default",
|
||
|
"JobID": "example",
|
||
|
"JobVersion": 0,
|
||
|
"Group": "cache",
|
||
|
"Task": "redis",
|
||
|
"Resource": "MemoryMB",
|
||
|
"Value": 10,
|
||
|
"Current": 200,
|
||
|
"Meta": {
|
||
|
"nomad_autoscaler.count.original": 6,
|
||
|
"nomad_autoscaler.reason_history": [],
|
||
|
"nomad_policy_id": "c355d0ec-7aa1-2604-449d-4ec79c813d2c",
|
||
|
"num_evaluated_windows": 1148,
|
||
|
"window_size": 300000000000,
|
||
|
"nomad_autoscaler.count.capped": true
|
||
|
},
|
||
|
"Stats": {
|
||
|
"min": 2.6640625,
|
||
|
"p99": 6.51171875,
|
||
|
"max": 6.515625,
|
||
|
"mean": 4.816847859995009
|
||
|
},
|
||
|
"EnforceVersion": false,
|
||
|
"SubmitTime": 1603372587714807000,
|
||
|
"CreateIndex": 5193,
|
||
|
"ModifyIndex": 10437
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Apply and Dismiss Recommendations
|
||
|
|
||
|
This endpoint is used to apply and dismiss recommendations.
|
||
|
|
||
|
| Method | Path | Produces |
|
||
|
| ------ | --------------------------- | ------------------ |
|
||
|
| `POST` | `/v1/recommendations/apply` | `application/json` |
|
||
|
|
||
|
The table below shows this endpoint's support for
|
||
|
[blocking queries](/api-docs#blocking-queries) and
|
||
|
[required ACLs](/api-docs#acls).
|
||
|
|
||
|
| Blocking Queries | ACL Required |
|
||
|
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
||
|
| `NO` | `namespace:submit-job` with `namespace:sentinel-override` if `PolicyOverride` set |
|
||
|
|
||
|
### Parameters
|
||
|
|
||
|
- `Apply` `(array<string>: nil)` - Specifies a set of recommendation IDs to be
|
||
|
applied. This results in Nomad applying the recommendation to the job
|
||
|
specification and performing a job register.
|
||
|
|
||
|
- `Dismiss` `(array<string>: nil)` - Specifies a set of recommendation IDs to be
|
||
|
dismissed. This results in Nomad deleting them from the state store.
|
||
|
|
||
|
- `PolicyOverride` `(bool: false)` - If set, any soft mandatory Sentinel policies
|
||
|
will be overridden. This allows a recommendation to be applied when it would be
|
||
|
denied by a policy.
|
||
|
|
||
|
### Sample Payload
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"Apply": ["cb80a13d-20d8-fb05-db3f-4ea0fe667b1b"]
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Sample Request
|
||
|
|
||
|
```shell-session
|
||
|
$ curl \
|
||
|
--request POST \
|
||
|
--data @payload.json \
|
||
|
https://localhost:4646/v1/recommendations/apply
|
||
|
```
|
||
|
|
||
|
### Sample Response
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"Errors": [],
|
||
|
"LastIndex": 0,
|
||
|
"RequestTime": 0,
|
||
|
"UpdatedJobs": [
|
||
|
{
|
||
|
"EvalCreateIndex": 51,
|
||
|
"EvalID": "3c91a755-f314-e2fb-500b-437ad08e13ea",
|
||
|
"JobID": "example",
|
||
|
"JobModifyIndex": 51,
|
||
|
"Namespace": "default",
|
||
|
"Recommendations": [
|
||
|
"cb80a13d-20d8-fb05-db3f-4ea0fe667b1b"
|
||
|
],
|
||
|
"Warnings": ""
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Create or Update a Recommendation
|
||
|
|
||
|
This endpoint is used to create or update a recommendation.
|
||
|
|
||
|
| Method | Path | Produces |
|
||
|
| ------ | -------------------- | ------------------ |
|
||
|
| `POST` | `/v1/recommendation` | `application/json` |
|
||
|
|
||
|
The table below shows this endpoint's support for
|
||
|
[blocking queries](/api-docs#blocking-queries) and
|
||
|
[required ACLs](/api-docs#acls).
|
||
|
|
||
|
| Blocking Queries | ACL Required |
|
||
|
| ---------------- | ----------------------------------------------------------- |
|
||
|
| `NO` | `namespace:submit-recommendation` or `namespace:submit-job` |
|
||
|
|
||
|
### Parameters
|
||
|
|
||
|
- `ID` `(string: "")` - The ID of an existing recommendation to update.
|
||
|
|
||
|
- `Region` `(string: "")`- The Nomad region identifier which contains the job
|
||
|
that the recommendation is for. If omitted, this defaults to that of the Nomad
|
||
|
agent.
|
||
|
|
||
|
- `Namespace` `(string: "")`- The namespace within which the target job is running
|
||
|
within. If omitted, this defaults to `default`.
|
||
|
|
||
|
- `JobID` `(string: <required>)`- The job ID which this recommendation is for.
|
||
|
|
||
|
- `Group` `(string: <required>)`- The task group name within the job which this
|
||
|
recommendation is for.
|
||
|
|
||
|
- `Task` `(string: <required>)`- The task name within the task group which this
|
||
|
recommendation is for.
|
||
|
|
||
|
- `Resource` `(string: <required>)`- The resource that the recommendation is for.
|
||
|
Possible values are `CPU` and `MemoryMB`.
|
||
|
|
||
|
- `Value` `(int: <required>)`- The value recommendation for the resource. This
|
||
|
must met the minimum requirements which are `1` for `CPU` and `10` for `MemoryMB`.
|
||
|
|
||
|
- `Meta` `(map<string|...>: nil)`- JSON block that is persisted as part of the
|
||
|
recommendation providing arbitrary, useful information.
|
||
|
|
||
|
- `Stats` `(map<string|float64>: nil)` - A mapping of statistics that are persisted
|
||
|
as part of the recommendation providing insight into the recommendation
|
||
|
calculation.
|
||
|
|
||
|
- `EnforceVersion` `(bool: false)`- Indicates that the recommendation is only valid
|
||
|
for the current version of the job. Subsequent job updates will automatically
|
||
|
dismiss this recommendation.
|
||
|
|
||
|
### Sample Payload
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"Region": "global",
|
||
|
"Namespace": "default",
|
||
|
"JobID": "example",
|
||
|
"Group": "cache",
|
||
|
"Task": "redis",
|
||
|
"Resource": "MemoryMB",
|
||
|
"Value": 512,
|
||
|
"Meta": {
|
||
|
"nomad_policy_id": "c355d0ec-7aa1-2604-449d-4ec79c813d2c"
|
||
|
},
|
||
|
"Stats": {
|
||
|
"min": 2.6640625,
|
||
|
"p99": 6.51171875,
|
||
|
"max": 6.515625,
|
||
|
"mean": 4.816847859995009
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Sample Request
|
||
|
|
||
|
```shell-session
|
||
|
$ curl \
|
||
|
--request POST \
|
||
|
--data @payload.json \
|
||
|
https://localhost:4646/v1/recommendation
|
||
|
```
|
||
|
|
||
|
### Sample Response
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"CreateIndex": 22,
|
||
|
"Current": 256,
|
||
|
"EnforceVersion": false,
|
||
|
"Group": "cache",
|
||
|
"ID": "47c97404-918f-8b19-873b-36d802f16f23",
|
||
|
"JobID": "example",
|
||
|
"JobVersion": 0,
|
||
|
"Meta": {
|
||
|
"nomad_policy_id": "c355d0ec-7aa1-2604-449d-4ec79c813d2c"
|
||
|
},
|
||
|
"ModifyIndex": 25,
|
||
|
"Namespace": "default",
|
||
|
"Region": "global",
|
||
|
"Resource": "MemoryMB",
|
||
|
"Stats": {
|
||
|
"mean": 4.816847859995009,
|
||
|
"min": 2.6640625,
|
||
|
"p99": 6.51171875,
|
||
|
"max": 6.515625
|
||
|
},
|
||
|
"SubmitTime": 1603444202372926000,
|
||
|
"Task": "redis",
|
||
|
"Value": 512
|
||
|
}
|
||
|
```
|