From 7864a482b7d05173e6beeaef80d39c02f3332603 Mon Sep 17 00:00:00 2001 From: liugq Date: Fri, 8 Jul 2022 14:36:27 +0800 Subject: [PATCH] update metric data struct --- model/alerting/metric.go | 12 +++--------- plugin/api/alerting/rule.go | 6 +++--- service/alerting/elasticsearch/engine.go | 9 +++++---- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/model/alerting/metric.go b/model/alerting/metric.go index 40d17839..5dcc419b 100644 --- a/model/alerting/metric.go +++ b/model/alerting/metric.go @@ -6,24 +6,18 @@ package alerting import ( "fmt" + "infini.sh/framework/core/insight" "regexp" ) type Metric struct { - PeriodInterval string `json:"period_interval"` - Items []MetricItem `json:"items"` - Formula string `json:"formula,omitempty"` + insight.Metric Expression string `json:"expression" elastic_mapping:"expression:{type:keyword,copy_to:search_text}"` //告警表达式,自动生成 eg: avg(cpu) > 80 Title string `json:"title"` //text template Message string `json:"message"` // text template - FormatType string `json:"format_type,omitempty"` - Groups []MetricGroupItem `json:"groups"` //bucket group } -type MetricGroupItem struct { - Field string `json:"field"` - Limit int `json:"limit"` -} + func (m *Metric) GenerateExpression() (string, error){ if len(m.Items) == 1 { return fmt.Sprintf("%s(%s)", m.Items[0].Statistic, m.Items[0].Field), nil diff --git a/plugin/api/alerting/rule.go b/plugin/api/alerting/rule.go index 949fa7b1..ee457737 100644 --- a/plugin/api/alerting/rule.go +++ b/plugin/api/alerting/rule.go @@ -185,7 +185,7 @@ func (alertAPI *AlertAPI) getRuleDetail(w http.ResponseWriter, req *http.Request "rule_name": obj.Name, "resource_name": obj.Resource.Name, "resource_objects": obj.Resource.Objects, - "period_interval": obj.Metrics.PeriodInterval, //统计周期 + "bucket_size": obj.Metrics.BucketSize, //统计周期 "updated": obj.Updated, "conditions": obj.Conditions, "message_count": alertNumbers[obj.ID], //所有关联告警消息数(包括已恢复的) @@ -677,8 +677,8 @@ func (alertAPI *AlertAPI) getPreviewMetricData(w http.ResponseWriter, req *http. maxStr = alertAPI.Get(req, "max", "") ) var bkSize float64 = 60 - if rule.Metrics.PeriodInterval != "" { - duration, err := time.ParseDuration(rule.Metrics.PeriodInterval) + if rule.Metrics.BucketSize != "" { + duration, err := time.ParseDuration(rule.Metrics.BucketSize) if err != nil { log.Error(err) alertAPI.WriteJSON(w, util.MapStr{ diff --git a/service/alerting/elasticsearch/engine.go b/service/alerting/elasticsearch/engine.go index 8d7bd17c..d0cb3ce2 100644 --- a/service/alerting/elasticsearch/engine.go +++ b/service/alerting/elasticsearch/engine.go @@ -15,6 +15,7 @@ import ( "infini.sh/console/service/alerting/action" "infini.sh/console/service/alerting/funcs" "infini.sh/framework/core/elastic" + "infini.sh/framework/core/insight" "infini.sh/framework/core/kv" "infini.sh/framework/core/orm" "infini.sh/framework/core/util" @@ -61,7 +62,7 @@ func (engine *Engine) GenerateQuery(rule *alerting.Rule, filterParam *alerting.F if err != nil { return nil, fmt.Errorf("get interval field error: %w", err) } - var periodInterval = rule.Metrics.PeriodInterval + var periodInterval = rule.Metrics.BucketSize if filterParam != nil && filterParam.BucketSize != "" { periodInterval = filterParam.BucketSize } @@ -124,7 +125,7 @@ func (engine *Engine) GenerateQuery(rule *alerting.Rule, filterParam *alerting.F }, nil } //generateAgg convert statistic of metric item to elasticsearch aggregation -func (engine *Engine) generateAgg(metricItem *alerting.MetricItem) map[string]interface{}{ +func (engine *Engine) generateAgg(metricItem *insight.MetricItem) map[string]interface{}{ var ( aggType = "value_count" field = metricItem.Field @@ -285,7 +286,7 @@ func (engine *Engine) generateTimeFilter(rule *alerting.Rule, filterParam *alert units string value int ) - intervalDuration, err := time.ParseDuration(rule.Metrics.PeriodInterval) + intervalDuration, err := time.ParseDuration(rule.Metrics.BucketSize) if err != nil { return nil, err } @@ -299,7 +300,7 @@ func (engine *Engine) generateTimeFilter(rule *alerting.Rule, filterParam *alert units = "s" value = int(intervalDuration / time.Second) }else{ - return nil, fmt.Errorf("period interval: %s is too small", rule.Metrics.PeriodInterval) + return nil, fmt.Errorf("period interval: %s is too small", rule.Metrics.BucketSize) } bucketCount := rule.Conditions.GetMinimumPeriodMatch() + 1 if bucketCount <= 0 {