Alerting: Make $value return the query value of a Prometheus-style rule

pull/101950/head
Alexander Akhmetov 4 months ago
parent e28c993465
commit 2af2d051fc
No known key found for this signature in database
GPG Key ID: A5A8947133B1B31B
  1. 4
      pkg/services/ngalert/prom/convert.go
  2. 2
      pkg/services/ngalert/prom/convert_test.go
  3. 10
      pkg/services/ngalert/prom/query.go
  4. 12
      pkg/services/ngalert/state/template/template.go

@ -21,7 +21,7 @@ const (
) )
const ( const (
queryRefID = "query" QueryRefID = "query"
prometheusMathRefID = "prometheus_math" prometheusMathRefID = "prometheus_math"
thresholdRefID = "threshold" thresholdRefID = "threshold"
) )
@ -198,7 +198,7 @@ func (p *Converter) convertRule(orgID int64, namespaceUID string, promGroup Prom
if isRecordingRule { if isRecordingRule {
record = &models.Record{ record = &models.Record{
From: queryRefID, From: QueryRefID,
Metric: rule.Record, Metric: rule.Record,
TargetDatasourceUID: p.cfg.DatasourceUID, TargetDatasourceUID: p.cfg.DatasourceUID,
} }

@ -196,7 +196,7 @@ func TestPrometheusRulesToGrafana(t *testing.T) {
if promRule.Record != "" { if promRule.Record != "" {
require.Equal(t, fmt.Sprintf("[%s] %s", tc.promGroup.Name, promRule.Record), grafanaRule.Title) require.Equal(t, fmt.Sprintf("[%s] %s", tc.promGroup.Name, promRule.Record), grafanaRule.Title)
require.NotNil(t, grafanaRule.Record) require.NotNil(t, grafanaRule.Record)
require.Equal(t, grafanaRule.Record.From, queryRefID) require.Equal(t, grafanaRule.Record.From, QueryRefID)
require.Equal(t, promRule.Record, grafanaRule.Record.Metric) require.Equal(t, promRule.Record, grafanaRule.Record.Metric)
require.Equal(t, tc.config.DatasourceUID, grafanaRule.Record.TargetDatasourceUID) require.Equal(t, tc.config.DatasourceUID, grafanaRule.Record.TargetDatasourceUID)
} else { } else {

@ -17,15 +17,15 @@ type CommonQueryModel struct {
} }
func createQueryNode(datasourceUID, datasourceType, expr string, fromTimeRange, evaluationOffset time.Duration) (models.AlertQuery, error) { func createQueryNode(datasourceUID, datasourceType, expr string, fromTimeRange, evaluationOffset time.Duration) (models.AlertQuery, error) {
modelData := map[string]interface{}{ modelData := map[string]any{
"datasource": map[string]interface{}{ "datasource": map[string]any{
"type": datasourceType, "type": datasourceType,
"uid": datasourceUID, "uid": datasourceUID,
}, },
"expr": expr, "expr": expr,
"instant": true, "instant": true,
"range": false, "range": false,
"refId": queryRefID, "refId": QueryRefID,
} }
if datasourceType == datasources.DS_LOKI { if datasourceType == datasources.DS_LOKI {
@ -40,7 +40,7 @@ func createQueryNode(datasourceUID, datasourceType, expr string, fromTimeRange,
return models.AlertQuery{ return models.AlertQuery{
DatasourceUID: datasourceUID, DatasourceUID: datasourceUID,
Model: modelJSON, Model: modelJSON,
RefID: queryRefID, RefID: QueryRefID,
RelativeTimeRange: models.RelativeTimeRange{ RelativeTimeRange: models.RelativeTimeRange{
From: models.Duration(fromTimeRange + evaluationOffset), From: models.Duration(fromTimeRange + evaluationOffset),
To: models.Duration(0 + evaluationOffset), To: models.Duration(0 + evaluationOffset),
@ -66,7 +66,7 @@ func createMathNode() (models.AlertQuery, error) {
Type: expr.QueryTypeMath, Type: expr.QueryTypeMath,
}, },
MathQuery: expr.MathQuery{ MathQuery: expr.MathQuery{
Expression: fmt.Sprintf("is_number($%[1]s) || is_nan($%[1]s) || is_inf($%[1]s)", queryRefID), Expression: fmt.Sprintf("is_number($%[1]s) || is_nan($%[1]s) || is_inf($%[1]s)", QueryRefID),
}, },
} }

@ -16,6 +16,7 @@ import (
"github.com/prometheus/prometheus/template" "github.com/prometheus/prometheus/template"
"github.com/grafana/grafana/pkg/services/ngalert/eval" "github.com/grafana/grafana/pkg/services/ngalert/eval"
"github.com/grafana/grafana/pkg/services/ngalert/prom"
) )
type Labels map[string]string type Labels map[string]string
@ -77,10 +78,17 @@ type Data struct {
} }
func NewData(labels map[string]string, res eval.Result) Data { func NewData(labels map[string]string, res eval.Result) Data {
values := NewValues(res.Values)
value := res.EvaluationString
if v, ok := values[prom.QueryRefID]; ok {
value = fmt.Sprintf("%g", v.Value)
}
return Data{ return Data{
Labels: labels, Labels: labels,
Values: NewValues(res.Values), Values: values,
Value: res.EvaluationString, Value: value,
} }
} }

Loading…
Cancel
Save