API: Introduce health and resources data source endpoints using the data source UID (#48676)

* API: introduce health and resources datasource endpoints with UID

* Document endpoints

* Update swagger
This commit is contained in:
Sofia Papagiannaki
2022-05-19 19:27:59 +03:00
committed by GitHub
parent 36663c093c
commit 6bb843bd0e
6 changed files with 918 additions and 55 deletions
+156
View File
@@ -604,6 +604,162 @@ Content-Type: application/json
Proxies all calls to the actual data source.
## Check data source health by id
> **Warning:** This API is deprecated since Grafana v9.0.0 and will be removed in a future release. Refer to the [new data source health check API](#check-data-source-health).
`GET /api/datasources/:datasourceId/health`
Makes a call to the health endpoint of data source identified by the given `dashboardId`.
### Examples
**Example Request**:
```http
GET api/datasources/112/health HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
```
**Example Response**:
```http
HTTP/1.1 200
Content-Type: application/json
{
"message": "1. Successfully queried the CloudWatch metrics API.\n2. Successfully queried the CloudWatch logs API.",
"status": "OK"
}
```
## Check data source health
`GET /api/datasources/uid/:uid/health`
Makes a call to the health endpoint of data source identified by the given `uid`.
### Examples
**Example Request**:
```http
GET api/datasources/uid/P8045C56BDA891CB2/health HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
```
**Example Response**:
```http
HTTP/1.1 200
Content-Type: application/json
{
"message": "1. Successfully queried the CloudWatch metrics API.\n2. Successfully queried the CloudWatch logs API.",
"status": "OK"
}
```
## Fetch data source resources by id
> **Warning:** This API is deprecated since Grafana v9.0.0 and will be removed in a future release. Refer to the [new data source resources API](#fetch-data-source-resources).
`GET /api/datasources/:datasourceId/resources/*`
Makes a call to the resources endpoint of data source identified by the given `dashboardId`.
### Examples
**Example Request**:
```http
GET api/datasources/112/resources/dimension-keys?region=us-east-2&namespace=AWS%2FEC2&dimensionFilters=%7B%7D&metricName=CPUUtilization HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
```
**Example Response**:
```http
HTTP/1.1 200
Content-Type: application/json
[
{
"text": "AutoScalingGroupName",
"value": "AutoScalingGroupName",
"label": "AutoScalingGroupName"
},
{
"text": "ImageId",
"value": "ImageId",
"label": "ImageId"
},
{
"text": "InstanceId",
"value": "InstanceId",
"label": "InstanceId"
},
{
"text": "InstanceType",
"value": "InstanceType",
"label": "InstanceType"
}
]
```
## Fetch data source resources
`GET /api/datasources/uid/:uid/resources/*`
Makes a call to the resources endpoint of data source identified by the given `uid`.
### Examples
**Example Request**:
```http
GET api/datasources/uid/P8045C56BDA891CB2/resources/dimension-keys?region=us-east-2&namespace=AWS%2FEC2&dimensionFilters=%7B%7D&metricName=CPUUtilization HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
```
**Example Response**:
```http
HTTP/1.1 200
Content-Type: application/json
[
{
"text": "AutoScalingGroupName",
"value": "AutoScalingGroupName",
"label": "AutoScalingGroupName"
},
{
"text": "ImageId",
"value": "ImageId",
"label": "ImageId"
},
{
"text": "InstanceId",
"value": "InstanceId",
"label": "InstanceId"
},
{
"text": "InstanceType",
"value": "InstanceType",
"label": "InstanceType"
}
]
```
## Query a data source
Queries a data source having a backend implementation.
+6
View File
@@ -340,9 +340,15 @@ func (hs *HTTPServer) registerRoutes() {
apiRoute.Any("/datasources/proxy/uid/:uid/*", authorize(reqSignedIn, ac.EvalPermission(datasources.ActionQuery)), hs.ProxyDataSourceRequestWithUID)
apiRoute.Any("/datasources/proxy/:id", authorize(reqSignedIn, ac.EvalPermission(datasources.ActionQuery)), hs.ProxyDataSourceRequest)
apiRoute.Any("/datasources/proxy/uid/:uid", authorize(reqSignedIn, ac.EvalPermission(datasources.ActionQuery)), hs.ProxyDataSourceRequestWithUID)
// Deprecated: use /datasources/uid/:uid/resources API instead.
apiRoute.Any("/datasources/:id/resources", authorize(reqSignedIn, ac.EvalPermission(datasources.ActionQuery)), hs.CallDatasourceResource)
apiRoute.Any("/datasources/uid/:uid/resources", authorize(reqSignedIn, ac.EvalPermission(datasources.ActionQuery)), hs.CallDatasourceResourceWithUID)
// Deprecated: use /datasources/uid/:uid/resources/* API instead.
apiRoute.Any("/datasources/:id/resources/*", authorize(reqSignedIn, ac.EvalPermission(datasources.ActionQuery)), hs.CallDatasourceResource)
apiRoute.Any("/datasources/uid/:uid/resources/*", authorize(reqSignedIn, ac.EvalPermission(datasources.ActionQuery)), hs.CallDatasourceResourceWithUID)
// Deprecated: use /datasources/uid/:uid/health API instead.
apiRoute.Any("/datasources/:id/health", authorize(reqSignedIn, ac.EvalPermission(datasources.ActionQuery)), routing.Wrap(hs.CheckDatasourceHealth))
apiRoute.Any("/datasources/uid/:uid/health", authorize(reqSignedIn, ac.EvalPermission(datasources.ActionQuery)), routing.Wrap(hs.CheckDatasourceHealthWithUID))
// Folders
apiRoute.Group("/folders", func(folderRoute routing.RouteRegister) {
+49 -1
View File
@@ -425,6 +425,33 @@ func (hs *HTTPServer) CallDatasourceResource(c *models.ReqContext) {
hs.callPluginResourceWithDataSource(c, plugin.ID, ds)
}
// /api/datasources/uid/:uid/resources/*
func (hs *HTTPServer) CallDatasourceResourceWithUID(c *models.ReqContext) {
dsUID := web.Params(c.Req)[":uid"]
if !util.IsValidShortUID(dsUID) {
c.JsonApiErr(http.StatusBadRequest, "UID is invalid", nil)
return
}
ds, err := hs.DataSourceCache.GetDatasourceByUID(c.Req.Context(), dsUID, c.SignedInUser, c.SkipCache)
if err != nil {
if errors.Is(err, models.ErrDataSourceAccessDenied) {
c.JsonApiErr(http.StatusForbidden, "Access denied to datasource", err)
return
}
c.JsonApiErr(http.StatusInternalServerError, "Unable to load datasource meta data", err)
return
}
plugin, exists := hs.pluginStore.Plugin(c.Req.Context(), ds.Type)
if !exists {
c.JsonApiErr(http.StatusInternalServerError, "Unable to find datasource plugin", err)
return
}
hs.callPluginResourceWithDataSource(c, plugin.ID, ds)
}
func (hs *HTTPServer) convertModelToDtos(ctx context.Context, ds *models.DataSource) dtos.DataSource {
dto := dtos.DataSource{
Id: ds.Id,
@@ -462,6 +489,24 @@ func (hs *HTTPServer) convertModelToDtos(ctx context.Context, ds *models.DataSou
return dto
}
// CheckDatasourceHealthWithUID sends a health check request to the plugin datasource
// /api/datasource/uid/:uid/health
func (hs *HTTPServer) CheckDatasourceHealthWithUID(c *models.ReqContext) response.Response {
dsUID := web.Params(c.Req)[":uid"]
if !util.IsValidShortUID(dsUID) {
return response.Error(http.StatusBadRequest, "UID is invalid", nil)
}
ds, err := hs.DataSourceCache.GetDatasourceByUID(c.Req.Context(), dsUID, c.SignedInUser, c.SkipCache)
if err != nil {
if errors.Is(err, models.ErrDataSourceAccessDenied) {
return response.Error(http.StatusForbidden, "Access denied to datasource", err)
}
return response.Error(http.StatusInternalServerError, "Unable to load datasource metadata", err)
}
return hs.checkDatasourceHealth(c, ds)
}
// CheckDatasourceHealth sends a health check request to the plugin datasource
// /api/datasource/:id/health
func (hs *HTTPServer) CheckDatasourceHealth(c *models.ReqContext) response.Response {
@@ -477,10 +522,13 @@ func (hs *HTTPServer) CheckDatasourceHealth(c *models.ReqContext) response.Respo
}
return response.Error(http.StatusInternalServerError, "Unable to load datasource metadata", err)
}
return hs.checkDatasourceHealth(c, ds)
}
func (hs *HTTPServer) checkDatasourceHealth(c *models.ReqContext, ds *models.DataSource) response.Response {
plugin, exists := hs.pluginStore.Plugin(c.Req.Context(), ds.Type)
if !exists {
return response.Error(http.StatusInternalServerError, "Unable to find datasource plugin", err)
return response.Error(http.StatusInternalServerError, "Unable to find datasource plugin", nil)
}
dsInstanceSettings, err := adapters.ModelToInstanceSettings(ds, hs.decryptSecureJsonDataFn(c.Req.Context()))
+57
View File
@@ -126,6 +126,60 @@ import (
// 404: notFoundError
// 500: internalServerError
// swagger:route GET /datasources/{datasource_id}/health datasources checkDatasourceHealthByID
//
// Check data source health by Id.
//
// Please refer to [updated API](#/datasources/checkDatasourceHealth) instead
//
// Deprecated: true
//
// Responses:
// 200: okResponse
// 400: badRequestError
// 401: unauthorisedError
// 403: forbiddenError
// 500: internalServerError
// swagger:route GET /datasources/uid/{datasource_uid}/health datasources checkDatasourceHealth
//
// Check data source health by Id.
//
// Responses:
// 200: okResponse
// 400: badRequestError
// 401: unauthorisedError
// 403: forbiddenError
// 500: internalServerError
// swagger:route GET /datasources/{datasource_id}/resources/{datasource_proxy_route} datasources fetchDatasourceResourcesByID
//
// Fetch data source resources by Id.
//
// Please refer to [updated API](#/datasources/fetchDatasourceResources) instead
//
// Deprecated: true
//
// Responses:
// 200: okResponse
// 400: badRequestError
// 401: unauthorisedError
// 403: forbiddenError
// 404: notFoundError
// 500: internalServerError
// swagger:route GET /datasources/uid/{datasource_uid}/resources/{datasource_proxy_route} datasources fetchDatasourceResources
//
// Fetch data source resources.
//
// Responses:
// 200: okResponse
// 400: badRequestError
// 401: unauthorisedError
// 403: forbiddenError
// 404: notFoundError
// 500: internalServerError
// swagger:route GET /datasources/name/{datasource_name} datasources getDatasourceByName
//
// Get a single data source by Name.
@@ -264,6 +318,7 @@ import (
// swagger:parameters updateDatasource deleteDatasourceByID getDatasourceByID datasourceProxyGETcalls datasourceProxyPOSTcalls datasourceProxyDELETEcalls
// swagger:parameters enablePermissions disablePermissions getPermissions deletePermissions
// swagger:parameters checkDatasourceHealthByID fetchDatasourceResourcesByID
type DatasourceID struct {
// in:path
// required:true
@@ -271,6 +326,7 @@ type DatasourceID struct {
}
// swagger:parameters deleteDatasourceByUID getDatasourceByUID datasourceProxyGETByUIDcalls datasourceProxyPOSTByUIDcalls datasourceProxyDELETEByUIDcalls
// swagger:parameters checkDatasourceHealth fetchDatasourceResources
type DatasourceUID struct {
// in:path
// required:true
@@ -286,6 +342,7 @@ type DatasourceName struct {
// swagger:parameters datasourceProxyGETcalls datasourceProxyPOSTcalls datasourceProxyDELETEcalls datasourceProxyGETByUIDcalls
// swagger:parameters datasourceProxyPOSTByUIDcalls datasourceProxyDELETEByUIDcalls
// swagger:parameters fetchDatasourceResources fetchDatasourceResourcesByID
type DatasourceProxyRouteParam struct {
// in:path
// required:true
+407 -45
View File
@@ -3192,6 +3192,22 @@
}
},
"/annotations/{annotation_id}": {
"get": {
"tags": ["annotations"],
"summary": "Get Annotation by Id.",
"operationId": "getAnnotation",
"responses": {
"200": {
"$ref": "#/responses/getAnnotationResponse"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
},
"put": {
"description": "Updates all properties of an annotation that matches the specified id. To only update certain property, consider using the Patch Annotation operation.",
"tags": ["annotations"],
@@ -3992,6 +4008,98 @@
}
}
},
"/dashboards/uid/{uid}/restore": {
"post": {
"tags": ["dashboard_versions"],
"summary": "Restore a dashboard to a given dashboard version using UID.",
"operationId": "restoreDashboardVersionByUID",
"parameters": [
{
"type": "string",
"x-go-name": "UID",
"name": "uid",
"in": "path",
"required": true
},
{
"name": "Body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/RestoreDashboardVersionCommand"
}
}
],
"responses": {
"200": {
"$ref": "#/responses/postDashboardResponse"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"404": {
"$ref": "#/responses/notFoundError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/dashboards/uid/{uid}/versions": {
"get": {
"tags": ["dashboard_versions"],
"summary": "Gets all existing versions for the dashboard using UID.",
"operationId": "getDashboardVersionsByUID",
"parameters": [
{
"type": "string",
"x-go-name": "UID",
"name": "uid",
"in": "path",
"required": true
},
{
"type": "integer",
"format": "int64",
"default": 0,
"x-go-name": "Limit",
"description": "Maximum number of results to return",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"format": "int64",
"default": 0,
"x-go-name": "Start",
"description": "Version to start from when returning queries",
"name": "start",
"in": "query"
}
],
"responses": {
"200": {
"$ref": "#/responses/dashboardVersionsResponse"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"404": {
"$ref": "#/responses/notFoundError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/dashboards/uid/{uid}/versions/{DashboardVersionID}": {
"get": {
"tags": ["dashboard_versions"],
@@ -4523,6 +4631,82 @@
}
}
},
"/datasources/uid/{datasource_uid}/health": {
"get": {
"tags": ["datasources"],
"summary": "Check data source health by Id.",
"operationId": "checkDatasourceHealth",
"parameters": [
{
"type": "string",
"x-go-name": "DatasourceUID",
"name": "datasource_uid",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/okResponse"
},
"400": {
"$ref": "#/responses/badRequestError"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/datasources/uid/{datasource_uid}/resources/{datasource_proxy_route}": {
"get": {
"tags": ["datasources"],
"summary": "Fetch data source resources.",
"operationId": "fetchDatasourceResources",
"parameters": [
{
"type": "string",
"x-go-name": "DatasourceUID",
"name": "datasource_uid",
"in": "path",
"required": true
},
{
"type": "string",
"x-go-name": "DatasourceProxyRoute",
"name": "datasource_proxy_route",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/okResponse"
},
"400": {
"$ref": "#/responses/badRequestError"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"404": {
"$ref": "#/responses/notFoundError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/datasources/{datasource_id}": {
"get": {
"description": "If you are running Grafana Enterprise and have Fine-grained access control enabled\nyou need to have a permission with action: `datasources:read` and scopes: `datasources:*`, `datasources:uid:*` and `datasources:uid:1` (single data source).",
@@ -4703,6 +4887,41 @@
}
}
},
"/datasources/{datasource_id}/health": {
"get": {
"description": "Please refer to [updated API](#/datasources/checkDatasourceHealth) instead",
"tags": ["datasources"],
"summary": "Check data source health by Id.",
"operationId": "checkDatasourceHealthByID",
"deprecated": true,
"parameters": [
{
"type": "string",
"x-go-name": "DatasourceID",
"name": "datasource_id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/okResponse"
},
"400": {
"$ref": "#/responses/badRequestError"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/datasources/{datasource_id}/permissions": {
"get": {
"description": "Gets all existing permissions for the data source with the given id.\n\nYou need to have a permission with action `datasources.permissions:read` and scopes `datasources:*`, `datasources:id:*`, `datasources:id:1` (single data source).",
@@ -4746,15 +4965,15 @@
"parameters": [
{
"type": "string",
"x-go-name": "DatasourceID",
"name": "datasource_id",
"x-go-name": "PermissionID",
"name": "permissionId",
"in": "path",
"required": true
},
{
"type": "string",
"x-go-name": "PermissionID",
"name": "permissionId",
"x-go-name": "DatasourceID",
"name": "datasource_id",
"in": "path",
"required": true
}
@@ -4778,6 +4997,51 @@
}
}
},
"/datasources/{datasource_id}/resources/{datasource_proxy_route}": {
"get": {
"description": "Please refer to [updated API](#/datasources/fetchDatasourceResources) instead",
"tags": ["datasources"],
"summary": "Fetch data source resources by Id.",
"operationId": "fetchDatasourceResourcesByID",
"deprecated": true,
"parameters": [
{
"type": "string",
"x-go-name": "DatasourceID",
"name": "datasource_id",
"in": "path",
"required": true
},
{
"type": "string",
"x-go-name": "DatasourceProxyRoute",
"name": "datasource_proxy_route",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/okResponse"
},
"400": {
"$ref": "#/responses/badRequestError"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"404": {
"$ref": "#/responses/notFoundError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/ds/query": {
"post": {
"description": "If you are running Grafana Enterprise and have Fine-grained access control enabled\nyou need to have a permission with action: `datasources:query`.",
@@ -6742,32 +7006,6 @@
}
}
},
"put": {
"consumes": ["application/json"],
"tags": ["provisioning"],
"summary": "Update an existing contact point.",
"operationId": "RoutePutContactpoints",
"parameters": [
{
"name": "Body",
"in": "body",
"schema": {
"$ref": "#/definitions/EmbeddedContactPoint"
}
}
],
"responses": {
"202": {
"$ref": "#/responses/Accepted"
},
"400": {
"description": "ValidationError",
"schema": {
"$ref": "#/definitions/ValidationError"
}
}
}
},
"post": {
"consumes": ["application/json"],
"tags": ["provisioning"],
@@ -6796,6 +7034,32 @@
}
},
"/provisioning/contact-points/{ID}": {
"put": {
"consumes": ["application/json"],
"tags": ["provisioning"],
"summary": "Update an existing contact point.",
"operationId": "RoutePutContactpoint",
"parameters": [
{
"name": "Body",
"in": "body",
"schema": {
"$ref": "#/definitions/EmbeddedContactPoint"
}
}
],
"responses": {
"202": {
"$ref": "#/responses/Accepted"
},
"400": {
"description": "ValidationError",
"schema": {
"$ref": "#/definitions/ValidationError"
}
}
}
},
"delete": {
"consumes": ["application/json"],
"tags": ["provisioning"],
@@ -6814,6 +7078,42 @@
}
}
},
"/provisioning/mute-timings": {
"get": {
"tags": ["provisioning"],
"summary": "Get all the mute timings.",
"operationId": "RouteGetMuteTimings",
"responses": {
"200": {
"$ref": "#/responses/MuteTiming"
},
"400": {
"description": "ValidationError",
"schema": {
"$ref": "#/definitions/ValidationError"
}
}
}
}
},
"/provisioning/mute-timings/{name}": {
"get": {
"tags": ["provisioning"],
"summary": "Get a mute timing.",
"operationId": "RouteGetMuteTiming",
"responses": {
"200": {
"$ref": "#/responses/MuteTiming"
},
"400": {
"description": "ValidationError",
"schema": {
"$ref": "#/definitions/ValidationError"
}
}
}
}
},
"/provisioning/policies": {
"get": {
"tags": ["provisioning"],
@@ -6834,11 +7134,11 @@
}
}
},
"post": {
"put": {
"consumes": ["application/json"],
"tags": ["provisioning"],
"summary": "Sets the notification policy tree.",
"operationId": "RoutePostPolicyTree",
"operationId": "RoutePutPolicyTree",
"parameters": [
{
"name": "Body",
@@ -6879,7 +7179,7 @@
}
}
},
"/provisioning/templates/{ID}": {
"/provisioning/templates/{name}": {
"get": {
"tags": ["provisioning"],
"summary": "Get a message template.",
@@ -6892,6 +7192,42 @@
"$ref": "#/responses/NotFound"
}
}
},
"put": {
"consumes": ["application/json"],
"tags": ["provisioning"],
"summary": "Updates an existing template.",
"operationId": "RoutePutTemplate",
"parameters": [
{
"name": "Body",
"in": "body",
"schema": {
"$ref": "#/definitions/MessageTemplateContent"
}
}
],
"responses": {
"202": {
"$ref": "#/responses/Accepted"
},
"400": {
"description": "ValidationError",
"schema": {
"$ref": "#/definitions/ValidationError"
}
}
}
},
"delete": {
"tags": ["provisioning"],
"summary": "Delete a template.",
"operationId": "RouteDeleteTemplate",
"responses": {
"204": {
"$ref": "#/responses/Accepted"
}
}
}
},
"/recording-rules": {
@@ -10964,7 +11300,7 @@
"format": "int64",
"x-go-name": "FolderID"
},
"folderUID": {
"folderUid": {
"description": "UID of the folder where the library element is stored.",
"type": "string",
"x-go-name": "FolderUID"
@@ -11376,6 +11712,10 @@
"type": "boolean",
"x-go-name": "IsHome"
},
"isPublic": {
"type": "boolean",
"x-go-name": "IsPublic"
},
"isSnapshot": {
"type": "boolean",
"x-go-name": "IsSnapshot"
@@ -11576,6 +11916,10 @@
"format": "int64",
"x-go-name": "DashboardId"
},
"dashboardUid": {
"type": "string",
"x-go-name": "DashboardUID"
},
"id": {
"type": "integer",
"format": "int64",
@@ -11643,6 +11987,10 @@
"format": "int64",
"x-go-name": "RestoredFrom"
},
"uid": {
"type": "string",
"x-go-name": "DashboardUID"
},
"version": {
"type": "integer",
"format": "int64",
@@ -13379,7 +13727,7 @@
"format": "int64",
"x-go-name": "FolderID"
},
"folderUID": {
"folderUid": {
"type": "string",
"x-go-name": "FolderUID"
},
@@ -13592,6 +13940,15 @@
"$ref": "#/definitions/Matcher"
}
},
"MessageTemplateContent": {
"type": "object",
"properties": {
"Template": {
"type": "string"
}
},
"x-go-package": "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
},
"Metadata": {
"description": "Metadata contains user accesses for a given resource\nEx: map[string]bool{\"create\":true, \"delete\": true}",
"type": "object",
@@ -14170,7 +14527,7 @@
"format": "int64",
"x-go-name": "FolderID"
},
"folderUID": {
"folderUid": {
"description": "UID of the folder where the library element is stored.",
"type": "string",
"x-go-name": "FolderUID"
@@ -14807,7 +15164,7 @@
"x-go-name": "HomeTab"
}
},
"x-go-package": "github.com/grafana/grafana/pkg/models"
"x-go-package": "github.com/grafana/grafana/pkg/services/preference"
},
"Receiver": {
"type": "object",
@@ -17494,6 +17851,7 @@
"$ref": "#/definitions/Duration"
},
"gettableAlert": {
"description": "GettableAlert gettable alert",
"type": "object",
"required": ["labels", "annotations", "endsAt", "fingerprint", "receivers", "startsAt", "status", "updatedAt"],
"properties": {
@@ -17543,9 +17901,7 @@
"format": "date-time",
"x-go-name": "UpdatedAt"
}
},
"x-go-name": "GettableAlert",
"x-go-package": "github.com/prometheus/alertmanager/api/v2/models"
}
},
"gettableAlerts": {
"type": "array",
@@ -17556,7 +17912,6 @@
"x-go-package": "github.com/prometheus/alertmanager/api/v2/models"
},
"gettableSilence": {
"description": "GettableSilence gettable silence",
"type": "object",
"required": ["comment", "createdBy", "endsAt", "matchers", "startsAt", "id", "status", "updatedAt"],
"properties": {
@@ -17599,7 +17954,9 @@
"format": "date-time",
"x-go-name": "UpdatedAt"
}
}
},
"x-go-name": "GettableSilence",
"x-go-package": "github.com/prometheus/alertmanager/api/v2/models"
},
"gettableSilences": {
"type": "array",
@@ -17727,6 +18084,7 @@
"x-go-package": "github.com/prometheus/alertmanager/api/v2/models"
},
"postableSilence": {
"description": "PostableSilence postable silence",
"type": "object",
"required": ["comment", "createdBy", "endsAt", "matchers", "startsAt"],
"properties": {
@@ -17760,9 +18118,7 @@
"format": "date-time",
"x-go-name": "StartsAt"
}
},
"x-go-name": "PostableSilence",
"x-go-package": "github.com/prometheus/alertmanager/api/v2/models"
}
},
"receiver": {
"description": "Receiver receiver",
@@ -18268,6 +18624,12 @@
}
}
},
"getAnnotationResponse": {
"description": "",
"schema": {
"$ref": "#/definitions/ItemDTO"
}
},
"getAnnotationTagsResponse": {
"description": "",
"schema": {
+243 -9
View File
@@ -2254,6 +2254,22 @@
}
},
"/annotations/{annotation_id}": {
"get": {
"tags": ["annotations"],
"summary": "Get Annotation by Id.",
"operationId": "getAnnotation",
"responses": {
"200": {
"$ref": "#/responses/getAnnotationResponse"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
},
"put": {
"description": "Updates all properties of an annotation that matches the specified id. To only update certain property, consider using the Patch Annotation operation.",
"tags": ["annotations"],
@@ -3099,7 +3115,51 @@
"get": {
"tags": ["dashboard_versions"],
"summary": "Gets all existing versions for the dashboard using UID.",
"operationId": "getDashboardVersionsByUID"
"operationId": "getDashboardVersionsByUID",
"parameters": [
{
"type": "string",
"x-go-name": "UID",
"name": "uid",
"in": "path",
"required": true
},
{
"type": "integer",
"format": "int64",
"default": 0,
"x-go-name": "Limit",
"description": "Maximum number of results to return",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"format": "int64",
"default": 0,
"x-go-name": "Start",
"description": "Version to start from when returning queries",
"name": "start",
"in": "query"
}
],
"responses": {
"200": {
"$ref": "#/responses/dashboardVersionsResponse"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"404": {
"$ref": "#/responses/notFoundError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/dashboards/uid/{uid}/versions/{DashboardVersionID}": {
@@ -3633,6 +3693,82 @@
}
}
},
"/datasources/uid/{datasource_uid}/health": {
"get": {
"tags": ["datasources"],
"summary": "Check data source health by Id.",
"operationId": "checkDatasourceHealth",
"parameters": [
{
"type": "string",
"x-go-name": "DatasourceUID",
"name": "datasource_uid",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/okResponse"
},
"400": {
"$ref": "#/responses/badRequestError"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/datasources/uid/{datasource_uid}/resources/{datasource_proxy_route}": {
"get": {
"tags": ["datasources"],
"summary": "Fetch data source resources.",
"operationId": "fetchDatasourceResources",
"parameters": [
{
"type": "string",
"x-go-name": "DatasourceUID",
"name": "datasource_uid",
"in": "path",
"required": true
},
{
"type": "string",
"x-go-name": "DatasourceProxyRoute",
"name": "datasource_proxy_route",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/okResponse"
},
"400": {
"$ref": "#/responses/badRequestError"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"404": {
"$ref": "#/responses/notFoundError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/datasources/{datasource_id}": {
"get": {
"description": "If you are running Grafana Enterprise and have Fine-grained access control enabled\nyou need to have a permission with action: `datasources:read` and scopes: `datasources:*`, `datasources:uid:*` and `datasources:uid:1` (single data source).",
@@ -3813,6 +3949,41 @@
}
}
},
"/datasources/{datasource_id}/health": {
"get": {
"description": "Please refer to [updated API](#/datasources/checkDatasourceHealth) instead",
"tags": ["datasources"],
"summary": "Check data source health by Id.",
"operationId": "checkDatasourceHealthByID",
"deprecated": true,
"parameters": [
{
"type": "string",
"x-go-name": "DatasourceID",
"name": "datasource_id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/okResponse"
},
"400": {
"$ref": "#/responses/badRequestError"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/datasources/{datasource_id}/permissions": {
"get": {
"description": "Gets all existing permissions for the data source with the given id.\n\nYou need to have a permission with action `datasources.permissions:read` and scopes `datasources:*`, `datasources:id:*`, `datasources:id:1` (single data source).",
@@ -3856,15 +4027,15 @@
"parameters": [
{
"type": "string",
"x-go-name": "DatasourceID",
"name": "datasource_id",
"x-go-name": "PermissionID",
"name": "permissionId",
"in": "path",
"required": true
},
{
"type": "string",
"x-go-name": "PermissionID",
"name": "permissionId",
"x-go-name": "DatasourceID",
"name": "datasource_id",
"in": "path",
"required": true
}
@@ -3888,6 +4059,51 @@
}
}
},
"/datasources/{datasource_id}/resources/{datasource_proxy_route}": {
"get": {
"description": "Please refer to [updated API](#/datasources/fetchDatasourceResources) instead",
"tags": ["datasources"],
"summary": "Fetch data source resources by Id.",
"operationId": "fetchDatasourceResourcesByID",
"deprecated": true,
"parameters": [
{
"type": "string",
"x-go-name": "DatasourceID",
"name": "datasource_id",
"in": "path",
"required": true
},
{
"type": "string",
"x-go-name": "DatasourceProxyRoute",
"name": "datasource_proxy_route",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/okResponse"
},
"400": {
"$ref": "#/responses/badRequestError"
},
"401": {
"$ref": "#/responses/unauthorisedError"
},
"403": {
"$ref": "#/responses/forbiddenError"
},
"404": {
"$ref": "#/responses/notFoundError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
},
"/ds/query": {
"post": {
"description": "If you are running Grafana Enterprise and have Fine-grained access control enabled\nyou need to have a permission with action: `datasources:query`.",
@@ -9008,7 +9224,7 @@
"format": "int64",
"x-go-name": "FolderID"
},
"folderUID": {
"folderUid": {
"description": "UID of the folder where the library element is stored.",
"type": "string",
"x-go-name": "FolderUID"
@@ -9420,6 +9636,10 @@
"type": "boolean",
"x-go-name": "IsHome"
},
"isPublic": {
"type": "boolean",
"x-go-name": "IsPublic"
},
"isSnapshot": {
"type": "boolean",
"x-go-name": "IsSnapshot"
@@ -9620,6 +9840,10 @@
"format": "int64",
"x-go-name": "DashboardId"
},
"dashboardUid": {
"type": "string",
"x-go-name": "DashboardUID"
},
"id": {
"type": "integer",
"format": "int64",
@@ -9687,6 +9911,10 @@
"format": "int64",
"x-go-name": "RestoredFrom"
},
"uid": {
"type": "string",
"x-go-name": "DashboardUID"
},
"version": {
"type": "integer",
"format": "int64",
@@ -10600,7 +10828,7 @@
"format": "int64",
"x-go-name": "FolderID"
},
"folderUID": {
"folderUid": {
"type": "string",
"x-go-name": "FolderUID"
},
@@ -11049,7 +11277,7 @@
"format": "int64",
"x-go-name": "FolderID"
},
"folderUID": {
"folderUid": {
"description": "UID of the folder where the library element is stored.",
"type": "string",
"x-go-name": "FolderUID"
@@ -11313,7 +11541,7 @@
"x-go-name": "HomeTab"
}
},
"x-go-package": "github.com/grafana/grafana/pkg/models"
"x-go-package": "github.com/grafana/grafana/pkg/services/preference"
},
"RecordingRuleJSON": {
"description": "RecordingRuleJSON is the external representation of a recording rule",
@@ -13239,6 +13467,12 @@
}
}
},
"getAnnotationResponse": {
"description": "",
"schema": {
"$ref": "#/definitions/ItemDTO"
}
},
"getAnnotationTagsResponse": {
"description": "",
"schema": {