From 60210619caa4bb35d5f3b132e474d53dc4645927 Mon Sep 17 00:00:00 2001 From: liugq Date: Wed, 9 Aug 2023 18:23:31 +0800 Subject: [PATCH] add alerting template variable min, max --- model/alerting/metric.go | 2 ++ service/alerting/elasticsearch/engine.go | 20 +++++++++++++++++++- service/alerting/funcs/date.go | 3 +++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/model/alerting/metric.go b/model/alerting/metric.go index 018922d5..d5264576 100644 --- a/model/alerting/metric.go +++ b/model/alerting/metric.go @@ -53,6 +53,8 @@ type QueryResult struct { Raw string `json:"raw"` MetricData []MetricData `json:"metric_data"` Nodata bool `json:"nodata"` + Min interface{} `json:"-"` + Max interface{} `json:"-"` } type MetricData struct { diff --git a/service/alerting/elasticsearch/engine.go b/service/alerting/elasticsearch/engine.go index 27493d9e..e152524c 100644 --- a/service/alerting/elasticsearch/engine.go +++ b/service/alerting/elasticsearch/engine.go @@ -276,7 +276,7 @@ func (engine *Engine) ConvertFilterQueryToDsl(fq *alerting.FilterQuery) (map[str return resultQuery, nil } -func (engine *Engine) generateTimeFilter(rule *alerting.Rule, filterParam *alerting.FilterParam) (map[string]interface{}, error){ +func getQueryTimeRange(rule *alerting.Rule, filterParam *alerting.FilterParam) (start, end interface{}){ var ( timeStart interface{} timeEnd interface{} @@ -316,7 +316,11 @@ func (engine *Engine) generateTimeFilter(rule *alerting.Rule, filterParam *alert timeStart = time.Now().Add(-duration).UnixMilli() //.Format(time.RFC3339Nano) timeEnd = time.Now().UnixMilli() } + return timeStart, timeEnd +} +func (engine *Engine) generateTimeFilter(rule *alerting.Rule, filterParam *alerting.FilterParam) (map[string]interface{}, error){ + timeStart, timeEnd := getQueryTimeRange(rule, filterParam) timeQuery := util.MapStr{ "range": util.MapStr{ rule.Resource.TimeField: util.MapStr{ @@ -387,6 +391,10 @@ func (engine *Engine) ExecuteQuery(rule *alerting.Rule, filterParam *alerting.Fi if err != nil { return nil, err } + if vm, ok := queryDsl.(util.MapStr); ok { + queryResult.Min, err = vm.GetValue(fmt.Sprintf("query.range.%s.gte", rule.Resource.TimeField)) + queryResult.Max, _ = vm.GetValue(fmt.Sprintf("query.range.%s.lte", rule.Resource.TimeField)) + } queryDslBytes, err := util.ToJSONBytes(queryDsl) if err != nil { return nil, err @@ -922,6 +930,14 @@ func newParameterCtx(rule *alerting.Rule, checkResults *alerting.ConditionResult if err != nil { log.Errorf("get env variables error: %v", err) } + var ( + min interface{} + max interface{} + ) + if checkResults.QueryResult != nil { + min = checkResults.QueryResult.Min + max = checkResults.QueryResult.Max + } paramsCtx := util.MapStr{ alerting2.ParamRuleID: rule.ID, alerting2.ParamResourceID: rule.Resource.ID, @@ -932,6 +948,8 @@ func newParameterCtx(rule *alerting.Rule, checkResults *alerting.ConditionResult "first_threshold": firstThreshold, "rule_name": rule.Name, "priority": priority, + "min": min, + "max": max, "env": envVariables, } err = util.MergeFields(paramsCtx, extraParams, true) diff --git a/service/alerting/funcs/date.go b/service/alerting/funcs/date.go index 8ace3f05..577f4d5c 100644 --- a/service/alerting/funcs/date.go +++ b/service/alerting/funcs/date.go @@ -34,6 +34,9 @@ func _dateInZone(fmt string, date interface{}, zone string) string { case *time.Time: t = *date case int64: + if date > 1e12 { + date = date/1000 + } t = time.Unix(date, 0) case int: t = time.Unix(int64(date), 0)