From abb4deebba5579057b64f3e26c0461ab5f70c6f5 Mon Sep 17 00:00:00 2001 From: zhaoxiangchun <1422928955@qq.com> Date: Sat, 9 Jan 2021 15:06:58 +0800 Subject: [PATCH] fix(monitor): fix monitoroverview and meter send alerting info to notify MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.调整报警总览中今日报警数量计算逻辑 2.报警模版的web路径支持跳转到不同web页面:监控报警和meter 3.nodata 前端可配制功能fix --- .../alerting/conditions/nodataquery.go | 30 +++++++++++++++++++ pkg/monitor/alerting/conditions/query.go | 14 +++++++-- pkg/monitor/alerting/eval_context.go | 12 +++++++- pkg/monitor/models/alertrecord.go | 21 +++++++++++-- pkg/monitor/models/commonalert.go | 4 +-- 5 files changed, 71 insertions(+), 10 deletions(-) diff --git a/pkg/monitor/alerting/conditions/nodataquery.go b/pkg/monitor/alerting/conditions/nodataquery.go index d3dd2d4e9b..ee607e4220 100644 --- a/pkg/monitor/alerting/conditions/nodataquery.go +++ b/pkg/monitor/alerting/conditions/nodataquery.go @@ -111,11 +111,18 @@ func (c *NoDataQueryCondition) getOnecloudResources(evalContext *alerting.EvalCo query := jsonutils.NewDict() query.Add(jsonutils.NewStringArray([]string{"running", "ready"}), "status") query.Add(jsonutils.NewString("true"), "admin") + if len(c.Query.Model.Tags) != 0 { + query, err = c.convertTagsQuery(evalContext, query) + if err != nil { + return nil, errors.Wrap(err, "NoDataQueryCondition convertTagsQuery error") + } + } switch evalContext.Rule.RuleDescription[0].ResType { case monitor.METRIC_RES_TYPE_HOST: query.Set("host-type", jsonutils.NewString(hostconsts.TELEGRAF_TAG_KEY_HYPERVISOR)) allResources, err = ListAllResources(&mc_mds.Hosts, query) case monitor.METRIC_RES_TYPE_GUEST: + allResources, err = ListAllResources(&mc_mds.Servers, query) case monitor.METRIC_RES_TYPE_RDS: allResources, err = ListAllResources(&mc_mds.DBInstance, query) case monitor.METRIC_RES_TYPE_REDIS: @@ -135,6 +142,29 @@ func (c *NoDataQueryCondition) getOnecloudResources(evalContext *alerting.EvalCo return allResources, nil } +func (c *NoDataQueryCondition) convertTagsQuery(evalContext *alerting.EvalContext, + query *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { + alertDetails, err := c.GetCommonAlertDetails(evalContext) + if err != nil { + return nil, err + } + for i, _ := range c.Query.Model.Tags { + filterCount := 0 + if c.Query.Model.Tags[i].Operator == "=" { + if tag, ok := monitor.MEASUREMENT_TAG_KEYWORD[alertDetails.ResType]; ok { + if c.Query.Model.Tags[i].Key == tag { + query.Set("name", jsonutils.NewString(c.Query.Model.Tags[i].Value)) + continue + } + } + } + query.Set(fmt.Sprintf("filter.%d", filterCount), + jsonutils.NewString(fmt.Sprintf("%s.notin(%s)", c.Query.Model.Tags[i].Key, c.Query.Model.Tags[i].Value))) + filterCount++ + } + return query, nil +} + func ListAllResources(manager modulebase.Manager, params *jsonutils.JSONDict) ([]jsonutils.JSONObject, error) { if params == nil { params = jsonutils.NewDict() diff --git a/pkg/monitor/alerting/conditions/query.go b/pkg/monitor/alerting/conditions/query.go index e43f0268d0..e00f78cdb0 100644 --- a/pkg/monitor/alerting/conditions/query.go +++ b/pkg/monitor/alerting/conditions/query.go @@ -194,12 +194,10 @@ func (c *QueryCondition) Eval(context *alerting.EvalContext) (*alerting.Conditio func (c *QueryCondition) NewEvalMatch(context *alerting.EvalContext, series tsdb.TimeSeries, meta *tsdb.QueryResultMeta, value *float64, valStrArr []string) (*monitor.EvalMatch, error) { evalMatch := new(monitor.EvalMatch) - alert, err := models.CommonAlertManager.GetAlert(context.Rule.Id) + alertDetails, err := c.GetCommonAlertDetails(context) if err != nil { return nil, errors.Wrap(err, "GetAlert to NewEvalMatch error") } - settings, _ := alert.GetSettings() - alertDetails := alert.GetCommonAlertMetricDetailsFromAlertCondition(c.Index, &settings.Conditions[c.Index]) evalMatch.Metric = fmt.Sprintf("%s.%s", alertDetails.Measurement, alertDetails.Field) queryKeyInfo := "" if len(alertDetails.MeasurementDisplayName) > 0 && len(alertDetails.FieldDescription.DisplayName) > 0 { @@ -226,6 +224,16 @@ func (c *QueryCondition) NewEvalMatch(context *alerting.EvalContext, series tsdb return evalMatch, nil } +func (c *QueryCondition) GetCommonAlertDetails(context *alerting.EvalContext) (*monitor.CommonAlertMetricDetails, error) { + alert, err := models.CommonAlertManager.GetAlert(context.Rule.Id) + if err != nil { + return nil, errors.Wrap(err, "GetAlert to NewEvalMatch error") + } + settings, _ := alert.GetSettings() + alertDetails := alert.GetCommonAlertMetricDetailsFromAlertCondition(c.Index, &settings.Conditions[c.Index]) + return alertDetails, nil +} + func (c *QueryCondition) jointPointStr(series tsdb.TimeSeries, value string, valStrArr []string) string { str := "" for i := 0; i < len(valStrArr); i++ { diff --git a/pkg/monitor/alerting/eval_context.go b/pkg/monitor/alerting/eval_context.go index 68e841da14..c83d2d6148 100644 --- a/pkg/monitor/alerting/eval_context.go +++ b/pkg/monitor/alerting/eval_context.go @@ -128,7 +128,17 @@ func (c *EvalContext) GetCallbackURLPrefix() string { return "" } url, _ := config.GetString("config", "default", "api_server") - return url + "/alertrecord" + defaultWebUri := "alertrecord" + matchTag := map[string]string{} + if c.Firing { + matchTag = c.EvalMatches[0].Tags + } else { + matchTag = c.AlertOkEvalMatches[0].Tags + } + if uri, ok := matchTag["web_url"]; ok { + defaultWebUri = uri + } + return fmt.Sprintf("%s/%s", url, defaultWebUri) } // GetNewState returns the new state from the alert rule evaluation. diff --git a/pkg/monitor/models/alertrecord.go b/pkg/monitor/models/alertrecord.go index 01e377924b..b35b4eba75 100644 --- a/pkg/monitor/models/alertrecord.go +++ b/pkg/monitor/models/alertrecord.go @@ -336,12 +336,27 @@ func (manager *SAlertRecordManager) getNowAlertingRecord(ctx context.Context, us query = manager.FilterByOwner(query, userCred, rbacutils.String2Scope(scope)) query = query.GE("created_at", startTime.UTC().Format(timeutils.MysqlTimeFormat)) query = query.Equals("state", monitor.AlertStateAlerting) - sQuery := CommonAlertManager.Query("id").Equals("state", monitor.AlertStateAlerting).IsNull("used_by").SubQuery() - query = query.In("alert_id", sQuery).IsNotNull("res_type").IsNotEmpty("res_type").GroupBy("alert_id") + query = query.IsNotNull("res_type").IsNotEmpty("res_type").Desc("created_at") + + alertsQuery := CommonAlertManager.Query("id").Equals("state", monitor.AlertStateAlerting).IsNull("used_by") + alertsQuery = CommonAlertManager.FilterByOwner(alertsQuery, userCred, rbacutils.String2Scope(scope)) + alerts := make([]SCommonAlert, 0) records := make([]SAlertRecord, 0) - err := db.FetchModelObjects(manager, query, &records) + err := db.FetchModelObjects(CommonAlertManager, alertsQuery, &alerts) if err != nil { return nil, err } + for _, alert := range alerts { + tmp := *query + recordModel, err := db.NewModelObject(manager) + if err != nil { + return nil, err + } + if err := (&tmp).Equals("alert_id", alert.GetId()).First(recordModel); err == nil { + records = append(records, *(recordModel.(*SAlertRecord))) + } else { + return nil, errors.Wrapf(err, "getRecordByAlertId:%s error", alert.GetId()) + } + } return records, nil } diff --git a/pkg/monitor/models/commonalert.go b/pkg/monitor/models/commonalert.go index cad792c1a3..47f93076bb 100644 --- a/pkg/monitor/models/commonalert.go +++ b/pkg/monitor/models/commonalert.go @@ -226,9 +226,7 @@ func (alert *SCommonAlert) CustomizeCreate( query jsonutils.JSONObject, data jsonutils.JSONObject, ) error { - if err := alert.SAlert.CustomizeCreate(ctx, userCred, ownerId, query, data); err != nil { - return err - } + alert.State = string(monitor.AlertStateUnknown) input := new(monitor.CommonAlertCreateInput) if err := data.Unmarshal(input); err != nil { return err