2025-04-01 10:38:02 +09:00

128 lines
2.9 KiB
Go

package prom
import (
"encoding/json"
"fmt"
"time"
"github.com/grafana/grafana/pkg/expr"
"github.com/grafana/grafana/pkg/services/datasources"
"github.com/grafana/grafana/pkg/services/ngalert/models"
)
type CommonQueryModel struct {
Datasource datasources.DataSource `json:"datasource"`
RefID string `json:"refId"`
Type expr.QueryType `json:"type"`
}
func createQueryNode(datasourceUID, datasourceType, expr string, fromTimeRange, evaluationOffset time.Duration) (models.AlertQuery, error) {
modelData := map[string]interface{}{
"datasource": map[string]interface{}{
"type": datasourceType,
"uid": datasourceUID,
},
"expr": expr,
"instant": true,
"range": false,
"refId": queryRefID,
}
if datasourceType == datasources.DS_LOKI {
modelData["queryType"] = "instant"
}
modelJSON, err := json.Marshal(modelData)
if err != nil {
return models.AlertQuery{}, err
}
return models.AlertQuery{
DatasourceUID: datasourceUID,
Model: modelJSON,
RefID: queryRefID,
RelativeTimeRange: models.RelativeTimeRange{
From: models.Duration(fromTimeRange + evaluationOffset),
To: models.Duration(0 + evaluationOffset),
},
}, nil
}
type MathQueryModel struct {
expr.MathQuery
CommonQueryModel
}
func createMathNode() (models.AlertQuery, error) {
ds, err := expr.DataSourceModelFromNodeType(expr.TypeCMDNode)
if err != nil {
return models.AlertQuery{}, err
}
model := MathQueryModel{
CommonQueryModel: CommonQueryModel{
Datasource: *ds,
RefID: prometheusMathRefID,
Type: expr.QueryTypeMath,
},
MathQuery: expr.MathQuery{
Expression: fmt.Sprintf("is_number($%[1]s) || is_nan($%[1]s) || is_inf($%[1]s)", queryRefID),
},
}
modelJSON, err := json.Marshal(model)
if err != nil {
return models.AlertQuery{}, err
}
return models.AlertQuery{
DatasourceUID: expr.DatasourceUID,
Model: modelJSON,
RefID: prometheusMathRefID,
QueryType: string(model.Type),
}, nil
}
type ThresholdQueryModel struct {
expr.ThresholdQuery
CommonQueryModel
}
func createThresholdNode() (models.AlertQuery, error) {
ds, err := expr.DataSourceModelFromNodeType(expr.TypeCMDNode)
if err != nil {
return models.AlertQuery{}, err
}
model := ThresholdQueryModel{
CommonQueryModel: CommonQueryModel{
Datasource: *ds,
RefID: thresholdRefID,
Type: expr.QueryTypeThreshold,
},
ThresholdQuery: expr.ThresholdQuery{
Expression: prometheusMathRefID,
Conditions: []expr.ThresholdConditionJSON{
{
Evaluator: expr.ConditionEvalJSON{
Type: expr.ThresholdIsAbove,
Params: []float64{0},
},
},
},
},
}
modelJSON, err := json.Marshal(model)
if err != nil {
return models.AlertQuery{}, err
}
return models.AlertQuery{
DatasourceUID: expr.DatasourceUID,
Model: modelJSON,
RefID: thresholdRefID,
QueryType: string(model.Type),
}, nil
}