diff --git a/docker/initsql/a-n9e.sql b/docker/initsql/a-n9e.sql index cc5ab83f7cdc3555dc64145b946c85b3aa321211..d4ca05676ee91d13476ee3dd6a86453acd04034b 100644 --- a/docker/initsql/a-n9e.sql +++ b/docker/initsql/a-n9e.sql @@ -377,6 +377,7 @@ CREATE TABLE `alert_cur_event` ( `notify_channels` varchar(255) not null default '' comment 'split by space: sms voice email dingtalk wecom', `notify_groups` varchar(255) not null default '' comment 'split by space: 233 43', `notify_repeat_next` bigint not null default 0 comment 'next timestamp to notify, get repeat settings from rule', + `notify_cur_number` int not null default 0 comment '', `target_ident` varchar(191) not null default '' comment 'target ident, also in tags', `target_note` varchar(191) not null default '' comment 'target note', `trigger_time` bigint not null, @@ -410,6 +411,7 @@ CREATE TABLE `alert_his_event` ( `notify_recovered` tinyint(1) not null comment 'whether notify when recovery', `notify_channels` varchar(255) not null default '' comment 'split by space: sms voice email dingtalk wecom', `notify_groups` varchar(255) not null default '' comment 'split by space: 233 43', + `notify_cur_number` int not null default 0 comment '', `target_ident` varchar(191) not null default '' comment 'target ident, also in tags', `target_note` varchar(191) not null default '' comment 'target note', `trigger_time` bigint not null, diff --git a/docker/initsql_for_postgres/a-n9e-for-Postgres.sql b/docker/initsql_for_postgres/a-n9e-for-Postgres.sql index a643029d3f62540b4db932354a0ac5e5887f41e3..d976e9b8853354a156512ec8f4ab09b885cae75b 100644 --- a/docker/initsql_for_postgres/a-n9e-for-Postgres.sql +++ b/docker/initsql_for_postgres/a-n9e-for-Postgres.sql @@ -228,38 +228,38 @@ ALTER TABLE chart_share ADD CONSTRAINT chart_share_pk PRIMARY KEY (id); CREATE INDEX chart_share_create_at_idx ON chart_share (create_at); CREATE TABLE alert_rule ( - id bigserial NOT NULL, - group_id int8 NOT NULL DEFAULT 0, - "cluster" varchar(128) NOT NULL, - "name" varchar(255) NOT NULL, - note varchar(1024) NOT NULL, - severity int2 NOT NULL, - disabled int2 NOT NULL, - prom_for_duration int4 NOT NULL, - prom_ql text NOT NULL, - prom_eval_interval int4 NOT NULL, - enable_stime bpchar(5) NOT NULL DEFAULT '00:00'::bpchar, - enable_etime bpchar(5) NOT NULL DEFAULT '23:59'::bpchar, - enable_days_of_week varchar(32) NOT NULL DEFAULT ''::character varying, - enable_in_bg int2 NOT NULL DEFAULT 0, - notify_recovered int2 NOT NULL, - notify_channels varchar(255) NOT NULL DEFAULT ''::character varying, - notify_groups varchar(255) NOT NULL DEFAULT ''::character varying, - notify_repeat_step int4 NOT NULL DEFAULT 0, - notify_max_number int4 not null default 0, - recover_duration int4 NOT NULL DEFAULT 0, - callbacks varchar(255) NOT NULL DEFAULT ''::character varying, - runbook_url varchar(255) NULL, - append_tags varchar(255) NOT NULL DEFAULT ''::character varying, - create_at int8 NOT NULL DEFAULT 0, - create_by varchar(64) NOT NULL DEFAULT ''::character varying, - update_at int8 NOT NULL DEFAULT 0, - update_by varchar(64) NOT NULL DEFAULT ''::character varying, - prod varchar(255) NOT NULL DEFAULT ''::character varying, - algorithm varchar(255) NOT NULL DEFAULT ''::character varying, - algo_params varchar(255) NULL, - delay int4 NOT NULL DEFAULT 0, - CONSTRAINT alert_rule_pk PRIMARY KEY (id) + id bigserial NOT NULL, + group_id int8 NOT NULL DEFAULT 0, + "cluster" varchar(128) NOT NULL, + "name" varchar(255) NOT NULL, + note varchar(1024) NOT NULL, + severity int2 NOT NULL, + disabled int2 NOT NULL, + prom_for_duration int4 NOT NULL, + prom_ql text NOT NULL, + prom_eval_interval int4 NOT NULL, + enable_stime bpchar(5) NOT NULL DEFAULT '00:00'::bpchar, + enable_etime bpchar(5) NOT NULL DEFAULT '23:59'::bpchar, + enable_days_of_week varchar(32) NOT NULL DEFAULT ''::character varying, + enable_in_bg int2 NOT NULL DEFAULT 0, + notify_recovered int2 NOT NULL, + notify_channels varchar(255) NOT NULL DEFAULT ''::character varying, + notify_groups varchar(255) NOT NULL DEFAULT ''::character varying, + notify_repeat_step int4 NOT NULL DEFAULT 0, + notify_max_number int4 not null default 0, + recover_duration int4 NOT NULL DEFAULT 0, + callbacks varchar(255) NOT NULL DEFAULT ''::character varying, + runbook_url varchar(255) NULL, + append_tags varchar(255) NOT NULL DEFAULT ''::character varying, + create_at int8 NOT NULL DEFAULT 0, + create_by varchar(64) NOT NULL DEFAULT ''::character varying, + update_at int8 NOT NULL DEFAULT 0, + update_by varchar(64) NOT NULL DEFAULT ''::character varying, + prod varchar(255) NOT NULL DEFAULT ''::character varying, + algorithm varchar(255) NOT NULL DEFAULT ''::character varying, + algo_params varchar(255) NULL, + delay int4 NOT NULL DEFAULT 0, + CONSTRAINT alert_rule_pk PRIMARY KEY (id) ); CREATE INDEX alert_rule_group_id_idx ON alert_rule USING btree (group_id); CREATE INDEX alert_rule_update_at_idx ON alert_rule USING btree (update_at); @@ -386,32 +386,33 @@ insert into alert_aggr_view(name, rule, cate) values('By BusiGroup, Severity', ' insert into alert_aggr_view(name, rule, cate) values('By RuleName', 'field:rule_name', 0); CREATE TABLE alert_cur_event ( - id bigserial NOT NULL, - "cluster" varchar(128) NOT NULL, - group_id int8 NOT NULL, - group_name varchar(255) NOT NULL DEFAULT ''::character varying, - hash varchar(64) NOT NULL, - rule_id int8 NOT NULL, - rule_name varchar(255) NOT NULL, - rule_note varchar(2048) NOT NULL DEFAULT 'alert rule note'::character varying, - severity int2 NOT NULL, - prom_for_duration int4 NOT NULL, - prom_ql varchar(8192) NOT NULL, - prom_eval_interval int4 NOT NULL, - callbacks varchar(255) NOT NULL DEFAULT ''::character varying, - runbook_url varchar(255) NULL, - notify_recovered int2 NOT NULL, - notify_channels varchar(255) NOT NULL DEFAULT ''::character varying, - notify_groups varchar(255) NOT NULL DEFAULT ''::character varying, - notify_repeat_next int8 NOT NULL DEFAULT 0, - target_ident varchar(191) NOT NULL DEFAULT ''::character varying, - target_note varchar(191) NOT NULL DEFAULT ''::character varying, - trigger_time int8 NOT NULL, - trigger_value varchar(255) NOT NULL, - tags varchar(1024) NOT NULL DEFAULT ''::character varying, - rule_prod varchar(255) NOT NULL DEFAULT ''::character varying, - rule_algo varchar(255) NOT NULL DEFAULT ''::character varying, - CONSTRAINT alert_cur_event_pk PRIMARY KEY (id) + id bigserial NOT NULL, + "cluster" varchar(128) NOT NULL, + group_id int8 NOT NULL, + group_name varchar(255) NOT NULL DEFAULT ''::character varying, + hash varchar(64) NOT NULL, + rule_id int8 NOT NULL, + rule_name varchar(255) NOT NULL, + rule_note varchar(2048) NOT NULL DEFAULT 'alert rule note'::character varying, + severity int2 NOT NULL, + prom_for_duration int4 NOT NULL, + prom_ql varchar(8192) NOT NULL, + prom_eval_interval int4 NOT NULL, + callbacks varchar(255) NOT NULL DEFAULT ''::character varying, + runbook_url varchar(255) NULL, + notify_recovered int2 NOT NULL, + notify_channels varchar(255) NOT NULL DEFAULT ''::character varying, + notify_groups varchar(255) NOT NULL DEFAULT ''::character varying, + notify_repeat_next int8 NOT NULL DEFAULT 0, + notify_cur_number int4 not null default 0, + target_ident varchar(191) NOT NULL DEFAULT ''::character varying, + target_note varchar(191) NOT NULL DEFAULT ''::character varying, + trigger_time int8 NOT NULL, + trigger_value varchar(255) NOT NULL, + tags varchar(1024) NOT NULL DEFAULT ''::character varying, + rule_prod varchar(255) NOT NULL DEFAULT ''::character varying, + rule_algo varchar(255) NOT NULL DEFAULT ''::character varying, + CONSTRAINT alert_cur_event_pk PRIMARY KEY (id) ); CREATE INDEX alert_cur_event_hash_idx ON alert_cur_event USING btree (hash); CREATE INDEX alert_cur_event_notify_repeat_next_idx ON alert_cur_event USING btree (notify_repeat_next); @@ -436,34 +437,35 @@ COMMENT ON COLUMN alert_cur_event.target_note IS 'target note'; COMMENT ON COLUMN alert_cur_event.tags IS 'merge data_tags rule_tags, split by ,,'; CREATE TABLE alert_his_event ( - id bigserial NOT NULL, - is_recovered int2 NOT NULL, - "cluster" varchar(128) NOT NULL, - group_id int8 NOT NULL, - group_name varchar(255) NOT NULL DEFAULT ''::character varying, - hash varchar(64) NOT NULL, - rule_id int8 NOT NULL, - rule_name varchar(255) NOT NULL, - rule_note varchar(2048) NOT NULL DEFAULT 'alert rule note'::character varying, - severity int2 NOT NULL, - prom_for_duration int4 NOT NULL, - prom_ql varchar(8192) NOT NULL, - prom_eval_interval int4 NOT NULL, - callbacks varchar(255) NOT NULL DEFAULT ''::character varying, - runbook_url varchar(255) NULL, - notify_recovered int2 NOT NULL, - notify_channels varchar(255) NOT NULL DEFAULT ''::character varying, - notify_groups varchar(255) NOT NULL DEFAULT ''::character varying, - target_ident varchar(191) NOT NULL DEFAULT ''::character varying, - target_note varchar(191) NOT NULL DEFAULT ''::character varying, - trigger_time int8 NOT NULL, - trigger_value varchar(255) NOT NULL, - recover_time int8 NOT NULL DEFAULT 0, - last_eval_time int8 NOT NULL DEFAULT 0, - tags varchar(1024) NOT NULL DEFAULT ''::character varying, - rule_prod varchar(255) NOT NULL DEFAULT ''::character varying, - rule_algo varchar(255) NOT NULL DEFAULT ''::character varying, - CONSTRAINT alert_his_event_pk PRIMARY KEY (id) + id bigserial NOT NULL, + is_recovered int2 NOT NULL, + "cluster" varchar(128) NOT NULL, + group_id int8 NOT NULL, + group_name varchar(255) NOT NULL DEFAULT ''::character varying, + hash varchar(64) NOT NULL, + rule_id int8 NOT NULL, + rule_name varchar(255) NOT NULL, + rule_note varchar(2048) NOT NULL DEFAULT 'alert rule note'::character varying, + severity int2 NOT NULL, + prom_for_duration int4 NOT NULL, + prom_ql varchar(8192) NOT NULL, + prom_eval_interval int4 NOT NULL, + callbacks varchar(255) NOT NULL DEFAULT ''::character varying, + runbook_url varchar(255) NULL, + notify_recovered int2 NOT NULL, + notify_channels varchar(255) NOT NULL DEFAULT ''::character varying, + notify_groups varchar(255) NOT NULL DEFAULT ''::character varying, + notify_cur_number int4 not null default 0, + target_ident varchar(191) NOT NULL DEFAULT ''::character varying, + target_note varchar(191) NOT NULL DEFAULT ''::character varying, + trigger_time int8 NOT NULL, + trigger_value varchar(255) NOT NULL, + recover_time int8 NOT NULL DEFAULT 0, + last_eval_time int8 NOT NULL DEFAULT 0, + tags varchar(1024) NOT NULL DEFAULT ''::character varying, + rule_prod varchar(255) NOT NULL DEFAULT ''::character varying, + rule_algo varchar(255) NOT NULL DEFAULT ''::character varying, + CONSTRAINT alert_his_event_pk PRIMARY KEY (id) ); CREATE INDEX alert_his_event_hash_idx ON alert_his_event USING btree (hash); CREATE INDEX alert_his_event_rule_id_idx ON alert_his_event USING btree (rule_id); diff --git a/src/models/alert_cur_event.go b/src/models/alert_cur_event.go index 6ca6b88a1910a3050a430a5139b889bde697ab73..68fcceb3a2fc573d069dd5e91c6649e064346fb4 100644 --- a/src/models/alert_cur_event.go +++ b/src/models/alert_cur_event.go @@ -38,14 +38,14 @@ type AlertCurEvent struct { TargetNote string `json:"target_note"` TriggerTime int64 `json:"trigger_time"` TriggerValue string `json:"trigger_value"` - Tags string `json:"-"` // for db - TagsJSON []string `json:"tags" gorm:"-"` // for fe - TagsMap map[string]string `json:"-" gorm:"-"` // for internal usage - IsRecovered bool `json:"is_recovered" gorm:"-"` // for notify.py - NotifyUsersObj []*User `json:"notify_users_obj" gorm:"-"` // for notify.py - LastEvalTime int64 `json:"last_eval_time" gorm:"-"` // for notify.py 上次计算的时间 - LastSentTime int64 `json:"last_sent_time" gorm:"-"` // 上次发送时间 - NotifyCurNumber int `json:"notify_cur_number" gorm:"-"` // notify: current number + Tags string `json:"-"` // for db + TagsJSON []string `json:"tags" gorm:"-"` // for fe + TagsMap map[string]string `json:"-" gorm:"-"` // for internal usage + IsRecovered bool `json:"is_recovered" gorm:"-"` // for notify.py + NotifyUsersObj []*User `json:"notify_users_obj" gorm:"-"` // for notify.py + LastEvalTime int64 `json:"last_eval_time" gorm:"-"` // for notify.py 上次计算的时间 + LastSentTime int64 `json:"last_sent_time" gorm:"-"` // 上次发送时间 + NotifyCurNumber int `json:"notify_cur_number"` // notify: current number } func (e *AlertCurEvent) TableName() string { @@ -179,6 +179,7 @@ func (e *AlertCurEvent) ToHis() *AlertHisEvent { Tags: e.Tags, RecoverTime: recoverTime, LastEvalTime: e.LastEvalTime, + NotifyCurNumber: e.NotifyCurNumber, } } diff --git a/src/models/alert_his_event.go b/src/models/alert_his_event.go index df7091c70c9f04d923142dc0bb36a248d546c30e..7549ddb5bccc73dfead0a54953e967d9b2fcda4a 100644 --- a/src/models/alert_his_event.go +++ b/src/models/alert_his_event.go @@ -38,6 +38,7 @@ type AlertHisEvent struct { LastEvalTime int64 `json:"last_eval_time"` Tags string `json:"-"` TagsJSON []string `json:"tags" gorm:"-"` + NotifyCurNumber int `json:"notify_cur_number"` // notify: current number } func (e *AlertHisEvent) TableName() string { diff --git a/src/server/engine/effective.go b/src/server/engine/effective.go index 70499867ff353c5d4e059cf50b28faab55230475..8820183fd3fe4d0249eadd3a3150dc79244c15f0 100644 --- a/src/server/engine/effective.go +++ b/src/server/engine/effective.go @@ -29,9 +29,5 @@ func isNoneffective(timestamp int64, alertRule *models.AlertRule) bool { alertRule.EnableDaysOfWeek = strings.Replace(alertRule.EnableDaysOfWeek, "7", "0", 1) - if !strings.Contains(alertRule.EnableDaysOfWeek, triggerWeek) { - return true - } - - return false + return !strings.Contains(alertRule.EnableDaysOfWeek, triggerWeek) } diff --git a/src/server/engine/worker.go b/src/server/engine/worker.go index 78b683a15ae42429650c21b938115f13b6ff105c..dc4b405ac3d7926e975ce7da46e48d3bb21105e4 100644 --- a/src/server/engine/worker.go +++ b/src/server/engine/worker.go @@ -365,6 +365,7 @@ func (r RuleEval) fireEvent(event *models.AlertCurEvent) { if event.LastEvalTime > fired.LastSentTime+int64(r.rule.NotifyRepeatStep)*60 { if r.rule.NotifyMaxNumber == 0 { // 最大可以发送次数如果是0,表示不想限制最大发送次数,一直发即可 + event.NotifyCurNumber = fired.NotifyCurNumber + 1 r.pushEventToQueue(event) } else { // 有最大发送次数的限制,就要看已经发了几次了,是否达到了最大发送次数