2016-12-05 17:36:12 +00:00
|
|
|
## Dashboard API
|
|
|
|
|
|
|
|
### TL; DR
|
2016-12-06 17:10:26 +00:00
|
|
|
Here are the objects we are thinking about; dashboards contain layouts which
|
|
|
|
contain explorations.
|
2016-12-05 17:36:12 +00:00
|
|
|
|
|
|
|
#### Dashboard
|
2016-12-06 17:10:26 +00:00
|
|
|
|
2016-12-05 17:36:12 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"links": {
|
|
|
|
"self": "/chronograf/v1/dashboards/myid"
|
|
|
|
},
|
|
|
|
"id": "myid",
|
2016-12-06 17:10:26 +00:00
|
|
|
"queries": [
|
|
|
|
{
|
|
|
|
"x": 0,
|
|
|
|
"y": 0,
|
|
|
|
"w": 2,
|
|
|
|
"h": 1,
|
|
|
|
"label": "Objects/Second",
|
|
|
|
"range": {
|
|
|
|
"upper": 100,
|
|
|
|
"lower": 10
|
|
|
|
},
|
|
|
|
"link": "/chronograf/v1/queries/1"
|
|
|
|
},
|
2016-12-05 17:36:12 +00:00
|
|
|
{
|
2016-12-06 17:10:26 +00:00
|
|
|
"x": 2,
|
|
|
|
"y": 0,
|
|
|
|
"w": 2,
|
|
|
|
"h": 1,
|
|
|
|
"label": "Widgets/Second",
|
|
|
|
"range": {
|
|
|
|
"upper": 10,
|
|
|
|
"lower": 0
|
|
|
|
},
|
|
|
|
"link": "/chronograf/v1/queries/2"
|
2016-12-05 17:36:12 +00:00
|
|
|
}
|
2016-12-06 17:10:26 +00:00
|
|
|
],
|
|
|
|
"name": "This is my dashboard",
|
2016-12-05 17:36:12 +00:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2016-12-06 17:10:26 +00:00
|
|
|
#### Query
|
2016-12-05 17:36:12 +00:00
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
2016-12-06 17:10:26 +00:00
|
|
|
"query": "SELECT mean(n_cpu) from cpu GROUP BY time(15m)",
|
|
|
|
"db": "telegraf",
|
|
|
|
"rp": "",
|
|
|
|
"links" : {
|
|
|
|
"self": "/chronograf/v1/queries/1"
|
|
|
|
}
|
2016-12-05 17:36:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
## API
|
|
|
|
### /dashboards
|
|
|
|
#### GET /dashboards
|
|
|
|
|
|
|
|
Returns a list of dashboards
|
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
2016-12-06 17:10:26 +00:00
|
|
|
"dashboards": [
|
|
|
|
{
|
|
|
|
"links": {
|
|
|
|
"self": "/chronograf/v1/dashboards/myid"
|
|
|
|
},
|
|
|
|
"id": "myid",
|
|
|
|
"queries": [
|
|
|
|
{
|
|
|
|
"x": 0,
|
|
|
|
"y": 0,
|
|
|
|
"w": 2,
|
|
|
|
"h": 1,
|
|
|
|
"label": "Objects/Second",
|
|
|
|
"range": {
|
|
|
|
"upper": 100,
|
|
|
|
"lower": 10
|
|
|
|
},
|
|
|
|
"link": "/chronograf/v1/queries/1"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"x": 2,
|
|
|
|
"y": 0,
|
|
|
|
"w": 2,
|
|
|
|
"h": 1,
|
|
|
|
"label": "Widgets/Second",
|
|
|
|
"range": {
|
|
|
|
"upper": 10,
|
|
|
|
"lower": 0
|
|
|
|
},
|
|
|
|
"link": "/chronograf/v1/queries/2"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"name": "This is my dashboard"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"links": {
|
|
|
|
"self": "/chronograf/v1/dashboards/myid"
|
|
|
|
},
|
|
|
|
"id": "myid",
|
|
|
|
"queries": [
|
|
|
|
{
|
|
|
|
"x": 0,
|
|
|
|
"y": 0,
|
|
|
|
"w": 2,
|
|
|
|
"h": 1,
|
|
|
|
"label": "Objects/Second",
|
|
|
|
"range": {
|
|
|
|
"upper": 100,
|
|
|
|
"lower": 10
|
|
|
|
},
|
|
|
|
"link": "/chronograf/v1/queries/1"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"x": 2,
|
|
|
|
"y": 0,
|
|
|
|
"w": 2,
|
|
|
|
"h": 1,
|
|
|
|
"label": "Widgets/Second",
|
|
|
|
"range": {
|
|
|
|
"upper": 10,
|
|
|
|
"lower": 0
|
|
|
|
},
|
|
|
|
"link": "/chronograf/v1/queries/2"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"name": "This is my dashboard"
|
|
|
|
}
|
|
|
|
]
|
2016-12-05 17:36:12 +00:00
|
|
|
}
|
|
|
|
```
|
|
|
|
#### GET /dashboards/myid
|
|
|
|
|
|
|
|
Returns an single dashboard object
|
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"links": {
|
|
|
|
"self": "/chronograf/v1/dashboards/myid"
|
|
|
|
},
|
|
|
|
"id": "myid",
|
2016-12-06 17:10:26 +00:00
|
|
|
"queries": [
|
|
|
|
{
|
|
|
|
"x": 0,
|
|
|
|
"y": 0,
|
|
|
|
"w": 2,
|
|
|
|
"h": 1,
|
|
|
|
"label": "Objects/Second",
|
|
|
|
"range": {
|
|
|
|
"upper": 100,
|
|
|
|
"lower": 10
|
|
|
|
},
|
|
|
|
"link": "/chronograf/v1/queries/1"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"x": 2,
|
|
|
|
"y": 0,
|
|
|
|
"w": 2,
|
|
|
|
"h": 1,
|
|
|
|
"label": "Widgets/Second",
|
|
|
|
"range": {
|
|
|
|
"upper": 10,
|
|
|
|
"lower": 0
|
|
|
|
},
|
|
|
|
"link": "/chronograf/v1/queries/2"
|
|
|
|
}
|
2016-12-05 17:36:12 +00:00
|
|
|
],
|
2016-12-06 17:10:26 +00:00
|
|
|
"name": "This is my dashboard"
|
2016-12-05 17:36:12 +00:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
#### PUT /dashboards/myid
|
2016-12-06 17:10:26 +00:00
|
|
|
We want complete updates to the dashboards because we don't know if we can
|
|
|
|
actually incrementally update visualization metadata
|
2016-12-05 17:36:12 +00:00
|
|
|
|
|
|
|
This endpoint will respond with the dashboard after update.
|
|
|
|
|
|
|
|
#### DELETE
|
2016-12-06 17:10:26 +00:00
|
|
|
Removes a dashboard but will not remove the queries. This will lead to orphans.
|
2016-12-05 17:36:12 +00:00
|
|
|
|
2016-12-06 17:10:26 +00:00
|
|
|
Should we have a page that lists all the queries?
|
2016-12-05 17:36:12 +00:00
|
|
|
|
|
|
|
#### POST
|
|
|
|
Creating a dashboard from an exploration would need to be a two-step process
|
|
|
|
|
2016-12-06 17:10:26 +00:00
|
|
|
1. Create a query
|
|
|
|
2. Create dashboard including query link
|
2016-12-05 17:36:12 +00:00
|
|
|
|
2016-12-06 17:10:26 +00:00
|
|
|
### /queries
|
|
|
|
The queries endpoint will be a simple CRUD endpoint storing the raw query:
|
2016-12-05 17:36:12 +00:00
|
|
|
|
2016-12-06 17:10:26 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"query": "SELECT mean(n_cpu) from cpu GROUP BY time(15m)",
|
|
|
|
"db": "telegraf",
|
|
|
|
"rp": "",
|
|
|
|
"links" : {
|
|
|
|
"self": "/chronograf/v1/queries/1"
|
|
|
|
}
|
|
|
|
}
|
2016-12-05 17:36:12 +00:00
|
|
|
```
|
|
|
|
|
2016-12-06 17:10:26 +00:00
|
|
|
Over time I'd like this queries endpoint to support a `format` parameter to return
|
|
|
|
the query data in different JSON formats such as `QueryConfig`.
|