Add testing endpoints

This commit is contained in:
Sofia Papagiannaki
2021-02-23 20:17:30 +02:00
parent e9ec87dc67
commit 81ba27e6c3
2 changed files with 322 additions and 3 deletions
+110
View File
@@ -0,0 +1,110 @@
package api
import (
"time"
"github.com/grafana/grafana/pkg/services/ngalert/eval"
"github.com/prometheus/alertmanager/config"
)
// swagger:route Get /api/v1/receiver/test testing RouteTestReceiverConfig
//
// Test receiver
//
// Consumes:
// - application/json
//
// Produces:
// - application/json
//
// Responses:
// 200: Success
// 412: SmtpNotEnabled
// 500: Failure
// swagger:route Get /api/v1/rule/test testing RouteTestRuleConfig
//
// Test rule
//
// Consumes:
// - application/json
//
// Produces:
// - application/json
//
// Responses:
// 200: TestRuleResponse
// swagger:parameters RouteTestReceiverConfig
type TestReceiverRequest struct {
// in:body
Body ExtendedReceiver
}
// swagger:parameters RouteTestRuleConfig
type TestRuleRequest struct {
// in:body
Body TestRulePayload
}
// swagger:model
type TestRulePayload struct {
Expr LotexQuery `json:"expr,omitempty"`
// GrafanaManagedCondition for grafana alerts
GrafanaManagedCondition EvalAlertConditionCommand `json:"grafana_condition,omitempty"`
}
// swagger:model
type LotexQuery struct {
// Example: (node_filesystem_avail_bytes{fstype!="",job="integrations/node_exporter"} node_filesystem_size_bytes{fstype!="",job="integrations/node_exporter"} * 100 < 5 and node_filesystem_readonly{fstype!="",job="integrations/node_exporter"} == 0)
Expr string
// DatasourceUID is required if the query will be sent to grafana to be executed
DatasourceUID string `json:"datasourceUid,omitempty"`
}
// swagger:model
type EvalAlertConditionCommand struct {
Condition string `json:"condition"`
Data []eval.AlertQuery `json:"data"`
Now time.Time `json:"now"`
}
// swagger:model
type TestRuleResponse struct {
Alerts interface{} `json:"alerts"`
GrafanaAlertInstances AlertInstancesResponse `json:"grafana_alert_instances"`
}
// swagger:model
type AlertInstancesResponse struct {
// Instances is an array of arrow encoded dataframes
// each frame has a single row, and a column for each instance (alert identified by unique labels) with a boolean value (firing/not firing)
Instances [][]byte `json:"instances"`
}
// swagger:model
type ExtendedReceiver struct {
EmailConfigs config.EmailConfig `yaml:"email_configs,omitempty" json:"email_configs,omitempty"`
PagerdutyConfigs config.PagerdutyConfig `yaml:"pagerduty_configs,omitempty" json:"pagerduty_configs,omitempty"`
SlackConfigs config.SlackConfig `yaml:"slack_configs,omitempty" json:"slack_configs,omitempty"`
WebhookConfigs config.WebhookConfig `yaml:"webhook_configs,omitempty" json:"webhook_configs,omitempty"`
OpsGenieConfigs config.OpsGenieConfig `yaml:"opsgenie_configs,omitempty" json:"opsgenie_configs,omitempty"`
WechatConfigs config.WechatConfig `yaml:"wechat_configs,omitempty" json:"wechat_configs,omitempty"`
PushoverConfigs config.PushoverConfig `yaml:"pushover_configs,omitempty" json:"pushover_configs,omitempty"`
VictorOpsConfigs config.VictorOpsConfig `yaml:"victorops_configs,omitempty" json:"victorops_configs,omitempty"`
GrafanaReceiver GrafanaReceiver `yaml:"grafana_managed_receiver,omitempty" json:"grafana_managed_receiver,omitempty"`
}
// swagger:model
type Success ResponseDetails
// swagger:model
type SmtpNotEnabled ResponseDetails
// swagger:model
type Failure ResponseDetails
// swagger:model
type ResponseDetails struct {
Msg string `json:"msg"`
}
+212 -3
View File
@@ -325,6 +325,82 @@
}
}
},
"/api/v1/receiver/test": {
"get": {
"description": "Test receiver",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"testing"
],
"operationId": "RouteTestReceiverConfig",
"parameters": [
{
"name": "Body",
"in": "body",
"schema": {
"$ref": "#/definitions/ExtendedReceiver"
}
}
],
"responses": {
"200": {
"description": "Success",
"schema": {
"$ref": "#/definitions/Success"
}
},
"412": {
"description": "SmtpNotEnabled",
"schema": {
"$ref": "#/definitions/SmtpNotEnabled"
}
},
"500": {
"description": "Failure",
"schema": {
"$ref": "#/definitions/Failure"
}
}
}
}
},
"/api/v1/rule/test": {
"get": {
"description": "Test rule",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"testing"
],
"operationId": "RouteTestRuleConfig",
"parameters": [
{
"name": "Body",
"in": "body",
"schema": {
"$ref": "#/definitions/TestRulePayload"
}
}
],
"responses": {
"200": {
"description": "TestRuleResponse",
"schema": {
"$ref": "#/definitions/TestRuleResponse"
}
}
}
}
},
"/api/v1/rules": {
"get": {
"description": "List rule groups",
@@ -683,6 +759,24 @@
"AlertGroups": {
"$ref": "#/definitions/alertGroups"
},
"AlertInstancesResponse": {
"type": "object",
"properties": {
"instances": {
"description": "Instances is an array of arrow encoded dataframes\neach frame has a single row, and a column for each instance (alert identified by unique labels) with a boolean value (firing/not firing)",
"type": "array",
"items": {
"type": "array",
"items": {
"type": "integer",
"format": "uint8"
}
},
"x-go-name": "Instances"
}
},
"x-go-package": "github.com/grafana/alerting-api/pkg/api"
},
"AlertNotification": {
"type": "object",
"properties": {
@@ -1203,6 +1297,61 @@
"title": "ErrorType models the different API error types.",
"x-go-package": "github.com/prometheus/client_golang/api/prometheus/v1"
},
"EvalAlertConditionCommand": {
"type": "object",
"properties": {
"condition": {
"type": "string",
"x-go-name": "Condition"
},
"data": {
"type": "array",
"items": {
"$ref": "#/definitions/AlertQuery"
},
"x-go-name": "Data"
},
"now": {
"type": "string",
"format": "date-time",
"x-go-name": "Now"
}
},
"x-go-package": "github.com/grafana/alerting-api/pkg/api"
},
"ExtendedReceiver": {
"type": "object",
"properties": {
"email_configs": {
"$ref": "#/definitions/EmailConfig"
},
"grafana_managed_receiver": {
"$ref": "#/definitions/GrafanaReceiver"
},
"opsgenie_configs": {
"$ref": "#/definitions/OpsGenieConfig"
},
"pagerduty_configs": {
"$ref": "#/definitions/PagerdutyConfig"
},
"pushover_configs": {
"$ref": "#/definitions/PushoverConfig"
},
"slack_configs": {
"$ref": "#/definitions/SlackConfig"
},
"victorops_configs": {
"$ref": "#/definitions/VictorOpsConfig"
},
"webhook_configs": {
"$ref": "#/definitions/WebhookConfig"
},
"wechat_configs": {
"$ref": "#/definitions/WechatConfig"
}
},
"x-go-package": "github.com/grafana/alerting-api/pkg/api"
},
"ExtendedRuleNode": {
"type": "object",
"properties": {
@@ -1295,6 +1444,9 @@
},
"x-go-package": "github.com/grafana/alerting-api/pkg/api"
},
"Failure": {
"$ref": "#/definitions/ResponseDetails"
},
"GetableSilence": {
"$ref": "#/definitions/silence"
},
@@ -1472,6 +1624,21 @@
},
"x-go-package": "github.com/prometheus/common/model"
},
"LotexQuery": {
"type": "object",
"properties": {
"Expr": {
"type": "string",
"example": "(node_filesystem_avail_bytes{fstype!=\"\",job=\"integrations/node_exporter\"} node_filesystem_size_bytes{fstype!=\"\",job=\"integrations/node_exporter\"} * 100 \u003c 5 and node_filesystem_readonly{fstype!=\"\",job=\"integrations/node_exporter\"} == 0)"
},
"datasourceUid": {
"description": "DatasourceUID is required if the query will be sent to grafana to be executed",
"type": "string",
"x-go-name": "DatasourceUID"
}
},
"x-go-package": "github.com/grafana/alerting-api/pkg/api"
},
"MatchRegexps": {
"type": "object",
"title": "MatchRegexps represents a map of Regexp.",
@@ -1868,6 +2035,16 @@
},
"x-go-package": "github.com/grafana/grafana/pkg/services/ngalert/eval"
},
"ResponseDetails": {
"type": "object",
"properties": {
"msg": {
"type": "string",
"x-go-name": "Msg"
}
},
"x-go-package": "github.com/grafana/alerting-api/pkg/api"
},
"RoleType": {
"type": "string",
"x-go-package": "github.com/grafana/grafana/pkg/models"
@@ -2328,6 +2505,12 @@
},
"x-go-package": "github.com/prometheus/alertmanager/config"
},
"SmtpNotEnabled": {
"$ref": "#/definitions/ResponseDetails"
},
"Success": {
"$ref": "#/definitions/ResponseDetails"
},
"TLSConfig": {
"type": "object",
"title": "TLSConfig configures the options for TLS connections.",
@@ -2355,9 +2538,35 @@
},
"x-go-package": "github.com/prometheus/common/config"
},
"URL": {
"TestRulePayload": {
"type": "object",
"title": "URL is a custom URL type that allows validation at configuration load time.",
"properties": {
"expr": {
"$ref": "#/definitions/LotexQuery"
},
"grafana_condition": {
"$ref": "#/definitions/EvalAlertConditionCommand"
}
},
"x-go-package": "github.com/grafana/alerting-api/pkg/api"
},
"TestRuleResponse": {
"type": "object",
"properties": {
"alerts": {
"type": "object",
"x-go-name": "Alerts"
},
"grafana_alert_instances": {
"$ref": "#/definitions/AlertInstancesResponse"
}
},
"x-go-package": "github.com/grafana/alerting-api/pkg/api"
},
"URL": {
"description": "The general form represented is:\n\n[scheme:][//[userinfo@]host][/]path[?query][#fragment]\n\nURLs that do not start with a slash after the scheme are interpreted as:\n\nscheme:opaque[?query][#fragment]\n\nNote that the Path field is stored in decoded form: /%47%6f%2f becomes /Go/.\nA consequence is that it is impossible to tell which slashes in the Path were\nslashes in the raw URL and which were %2f. This distinction is rarely important,\nbut when it is, the code should use RawPath, an optional field which only gets\nset if the default encoding is different from Path.\n\nURL's String method uses the EscapedPath method to obtain the path. See the\nEscapedPath method for more details.",
"type": "object",
"title": "A URL represents a parsed URL (technically, a URI reference).",
"properties": {
"ForceQuery": {
"type": "boolean"
@@ -2390,7 +2599,7 @@
"$ref": "#/definitions/Userinfo"
}
},
"x-go-package": "github.com/prometheus/common/config"
"x-go-package": "net/url"
},
"UpdateDashboardAclCommand": {
"type": "object",