From caa33c29e9f0d5608208586e81861e7742d83318 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Mon, 13 Dec 2021 11:12:49 +0800 Subject: [PATCH 01/39] refactor creating busi group --- src/webapi/config/i18n.go | 1 + src/webapi/router/router_busi_group.go | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/webapi/config/i18n.go b/src/webapi/config/i18n.go index 6c1bbaf6..a24e58c1 100644 --- a/src/webapi/config/i18n.go +++ b/src/webapi/config/i18n.go @@ -42,6 +42,7 @@ var ( "The business group must retain at least one team": "业务组下要保留至少一个团队", "At least one team have rw permission": "业务组下至少要有一个具备读写权限的团队", "duplicate tagkey(%s)": "标签KEY(%s)重复了", + "Failed to create BusiGroup(%s)": "创建业务(%s)组失败", } langDict = map[string]map[string]string{ "zh": dict, diff --git a/src/webapi/router/router_busi_group.go b/src/webapi/router/router_busi_group.go index d3fd0f12..9757b6bc 100644 --- a/src/webapi/router/router_busi_group.go +++ b/src/webapi/router/router_busi_group.go @@ -37,7 +37,18 @@ func busiGroupAdd(c *gin.Context) { } username := c.MustGet("username").(string) - ginx.NewRender(c).Message(models.BusiGroupAdd(f.Name, f.Members, username)) + ginx.Dangerous(models.BusiGroupAdd(f.Name, f.Members, username)) + + // 如果创建成功,拿着name去查,应该可以查到 + newbg, err := models.BusiGroupGet("name=?", f.Name) + ginx.Dangerous(err) + + if newbg == nil { + ginx.NewRender(c).Message("Failed to create BusiGroup(%s)", f.Name) + return + } + + ginx.NewRender(c).Data(newbg.Id, nil) } func busiGroupPut(c *gin.Context) { From 0baf977bc9d70649effa059af5335ef8dd8698f2 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Tue, 14 Dec 2021 15:08:20 +0800 Subject: [PATCH 02/39] feishu done flag --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f9930ac6..a03519aa 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Nightingale, Prometheus enterprise edition - [x] deploy nightingale in docker - [x] export /metrics endpoint -- [ ] notify.py support feishu +- [x] notify.py support feishu - [ ] notify.py support sms - [ ] notify.py support voice - [ ] support remote write api From 64945637e0e52011e5ce47c92b61e6f6b2cc82f3 Mon Sep 17 00:00:00 2001 From: UlricQin Date: Tue, 14 Dec 2021 15:29:19 +0800 Subject: [PATCH 03/39] upgrade 5.0.0-ga-06 --- Makefile | 2 +- docker/docker-compose.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 81dca006..bec59488 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ NOW = $(shell date -u '+%Y%m%d%I%M%S') -RELEASE_VERSION = 5.0.0-ga-05 +RELEASE_VERSION = 5.0.0-ga-06 APP = n9e SERVER_BIN = $(APP) diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 1d621765..915b8abf 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -79,7 +79,7 @@ services: - "server" nwebapi: - image: ulric2019/nightingale:5.0.0-ga-05 + image: ulric2019/nightingale:5.0.0-ga-06 container_name: nwebapi hostname: nwebapi restart: always @@ -107,7 +107,7 @@ services: - "webapi" nserver: - image: ulric2019/nightingale:5.0.0-ga-05 + image: ulric2019/nightingale:5.0.0-ga-06 container_name: nserver hostname: nserver restart: always From 95ebc44f059d4223b5290984de70e4f84ef15da8 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Tue, 14 Dec 2021 21:39:01 +0800 Subject: [PATCH 04/39] refactor notify.py --- docker/n9eetc/script/notify.py | 4 ++++ etc/script/notify.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docker/n9eetc/script/notify.py b/docker/n9eetc/script/notify.py index 3d72e653..b00c6069 100755 --- a/docker/n9eetc/script/notify.py +++ b/docker/n9eetc/script/notify.py @@ -24,6 +24,10 @@ mail_from = "ulricqin@163.com" class Sender(object): @classmethod def send_email(cls, payload): + if mail_user == "ulricqin" and mail_pass == "password": + print("invalid smtp configuration") + return + users = payload.get('event').get("notify_users_obj") emails = {} diff --git a/etc/script/notify.py b/etc/script/notify.py index 3d72e653..b00c6069 100755 --- a/etc/script/notify.py +++ b/etc/script/notify.py @@ -24,6 +24,10 @@ mail_from = "ulricqin@163.com" class Sender(object): @classmethod def send_email(cls, payload): + if mail_user == "ulricqin" and mail_pass == "password": + print("invalid smtp configuration") + return + users = payload.get('event').get("notify_users_obj") emails = {} From 0f3bbf6368bb0db76323b3275ab78e66f156f955 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Wed, 15 Dec 2021 18:37:48 +0800 Subject: [PATCH 05/39] use NotifyRepeatNext as TriggerTime when repeat notify --- Makefile | 2 +- docker/docker-compose.yaml | 4 ++-- src/server/engine/repeat.go | 10 ++++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index bec59488..45cc6b97 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ NOW = $(shell date -u '+%Y%m%d%I%M%S') -RELEASE_VERSION = 5.0.0-ga-06 +RELEASE_VERSION = 5.1.0 APP = n9e SERVER_BIN = $(APP) diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 915b8abf..ec173520 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -79,7 +79,7 @@ services: - "server" nwebapi: - image: ulric2019/nightingale:5.0.0-ga-06 + image: ulric2019/nightingale:5.1.0 container_name: nwebapi hostname: nwebapi restart: always @@ -107,7 +107,7 @@ services: - "webapi" nserver: - image: ulric2019/nightingale:5.0.0-ga-06 + image: ulric2019/nightingale:5.1.0 container_name: nserver hostname: nserver restart: always diff --git a/src/server/engine/repeat.go b/src/server/engine/repeat.go index 61d2bdce..5791be37 100644 --- a/src/server/engine/repeat.go +++ b/src/server/engine/repeat.go @@ -48,6 +48,14 @@ func repeat() { event.DB2Mem() + // 重复通知的告警,应该用新的时间来判断是否生效和是否屏蔽, + // 不能使用TriggerTime,因为TriggerTime是触发时的时间, + // 先发了告警,又做了屏蔽,本质是不想发了,如果继续用TriggerTime判断 + // 就还是会发,不符合预期,所以,这里伪装一下TriggerTime, + // 判断完了再卸掉伪装 + realTriggerTime := event.TriggerTime + event.TriggerTime = event.NotifyRepeatNext + if isNoneffective(event.TriggerTime, rule) { continue } @@ -56,6 +64,8 @@ func repeat() { continue } + event.TriggerTime = realTriggerTime + fillUsers(event) notify(event) From a4ef00fe3e2bdd0d826b5d59276d1fd9e8e1de6e Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Wed, 15 Dec 2021 19:16:39 +0800 Subject: [PATCH 06/39] add send time --- etc/template/dingtalk.tpl | 3 ++- etc/template/feishu.tpl | 3 ++- etc/template/mailbody.tpl | 7 +++++++ etc/template/wecom.tpl | 3 ++- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/etc/template/dingtalk.tpl b/etc/template/dingtalk.tpl index 59ece247..094c6247 100644 --- a/etc/template/dingtalk.tpl +++ b/etc/template/dingtalk.tpl @@ -3,4 +3,5 @@ 规则备注: {{.RuleNote}}{{end}} 监控指标: {{.TagsJSON}} {{if .IsRecovered}}恢复时间:{{timeformat .LastEvalTime}}{{else}}触发时间: {{timeformat .TriggerTime}} -触发时值: {{.TriggerValue}}{{end}} \ No newline at end of file +触发时值: {{.TriggerValue}}{{end}} +发送时间: {{.timestamp}} \ No newline at end of file diff --git a/etc/template/feishu.tpl b/etc/template/feishu.tpl index 59ece247..094c6247 100644 --- a/etc/template/feishu.tpl +++ b/etc/template/feishu.tpl @@ -3,4 +3,5 @@ 规则备注: {{.RuleNote}}{{end}} 监控指标: {{.TagsJSON}} {{if .IsRecovered}}恢复时间:{{timeformat .LastEvalTime}}{{else}}触发时间: {{timeformat .TriggerTime}} -触发时值: {{.TriggerValue}}{{end}} \ No newline at end of file +触发时值: {{.TriggerValue}}{{end}} +发送时间: {{.timestamp}} \ No newline at end of file diff --git a/etc/template/mailbody.tpl b/etc/template/mailbody.tpl index fa5e2d64..2763d143 100644 --- a/etc/template/mailbody.tpl +++ b/etc/template/mailbody.tpl @@ -181,6 +181,13 @@ {{end}} + + 发送时间: + + {{.timestamp}} + + + PromQL: diff --git a/etc/template/wecom.tpl b/etc/template/wecom.tpl index d1c7410a..c3374b54 100644 --- a/etc/template/wecom.tpl +++ b/etc/template/wecom.tpl @@ -3,4 +3,5 @@ **规则备注**: {{.RuleNote}}{{end}} **监控指标**: {{.TagsJSON}} {{if .IsRecovered}}**恢复时间**:{{timeformat .LastEvalTime}}{{else}}**触发时间**: {{timeformat .TriggerTime}} -**触发时值**: {{.TriggerValue}}{{end}} \ No newline at end of file +**触发时值**: {{.TriggerValue}}{{end}} +**发送时间**: {{.timestamp}} \ No newline at end of file From 3babc6c50ad8a2724731af6d95e15a5af82e918f Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Wed, 15 Dec 2021 19:22:18 +0800 Subject: [PATCH 07/39] fix tple --- etc/template/dingtalk.tpl | 2 +- etc/template/feishu.tpl | 2 +- etc/template/mailbody.tpl | 2 +- etc/template/wecom.tpl | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/etc/template/dingtalk.tpl b/etc/template/dingtalk.tpl index 094c6247..52e26193 100644 --- a/etc/template/dingtalk.tpl +++ b/etc/template/dingtalk.tpl @@ -4,4 +4,4 @@ 监控指标: {{.TagsJSON}} {{if .IsRecovered}}恢复时间:{{timeformat .LastEvalTime}}{{else}}触发时间: {{timeformat .TriggerTime}} 触发时值: {{.TriggerValue}}{{end}} -发送时间: {{.timestamp}} \ No newline at end of file +发送时间: {{timestamp}} \ No newline at end of file diff --git a/etc/template/feishu.tpl b/etc/template/feishu.tpl index 094c6247..52e26193 100644 --- a/etc/template/feishu.tpl +++ b/etc/template/feishu.tpl @@ -4,4 +4,4 @@ 监控指标: {{.TagsJSON}} {{if .IsRecovered}}恢复时间:{{timeformat .LastEvalTime}}{{else}}触发时间: {{timeformat .TriggerTime}} 触发时值: {{.TriggerValue}}{{end}} -发送时间: {{.timestamp}} \ No newline at end of file +发送时间: {{timestamp}} \ No newline at end of file diff --git a/etc/template/mailbody.tpl b/etc/template/mailbody.tpl index 2763d143..3f55059d 100644 --- a/etc/template/mailbody.tpl +++ b/etc/template/mailbody.tpl @@ -184,7 +184,7 @@ 发送时间: - {{.timestamp}} + {{timestamp}} diff --git a/etc/template/wecom.tpl b/etc/template/wecom.tpl index c3374b54..5a16cd61 100644 --- a/etc/template/wecom.tpl +++ b/etc/template/wecom.tpl @@ -4,4 +4,4 @@ **监控指标**: {{.TagsJSON}} {{if .IsRecovered}}**恢复时间**:{{timeformat .LastEvalTime}}{{else}}**触发时间**: {{timeformat .TriggerTime}} **触发时值**: {{.TriggerValue}}{{end}} -**发送时间**: {{.timestamp}} \ No newline at end of file +**发送时间**: {{timestamp}} \ No newline at end of file From 23b6cf1a68feec281f1dbfeb2f0ed7207f9b38bc Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Wed, 15 Dec 2021 19:37:55 +0800 Subject: [PATCH 08/39] fix repeat sender --- src/server/engine/mute.go | 14 ++++++++++---- src/server/engine/repeat.go | 15 ++++----------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/server/engine/mute.go b/src/server/engine/mute.go index 40e5a095..9dc1208b 100644 --- a/src/server/engine/mute.go +++ b/src/server/engine/mute.go @@ -5,14 +5,15 @@ import ( "github.com/didi/nightingale/v5/src/server/memsto" ) -func isMuted(event *models.AlertCurEvent) bool { +// 如果传入了clock这个可选参数,就表示使用这个clock表示的时间,否则就从event的字段中取TriggerTime +func isMuted(event *models.AlertCurEvent, clock ...int64) bool { mutes, has := memsto.AlertMuteCache.Gets(event.GroupId) if !has || len(mutes) == 0 { return false } for i := 0; i < len(mutes); i++ { - if matchMute(event, mutes[i]) { + if matchMute(event, mutes[i], clock...) { return true } } @@ -20,8 +21,13 @@ func isMuted(event *models.AlertCurEvent) bool { return false } -func matchMute(event *models.AlertCurEvent, mute *models.AlertMute) bool { - if event.TriggerTime < mute.Btime || event.TriggerTime > mute.Etime { +func matchMute(event *models.AlertCurEvent, mute *models.AlertMute, clock ...int64) bool { + ts := event.TriggerTime + if len(clock) > 0 { + ts = clock[0] + } + + if ts < mute.Btime || ts > mute.Etime { return false } diff --git a/src/server/engine/repeat.go b/src/server/engine/repeat.go index 5791be37..3e6ddfd6 100644 --- a/src/server/engine/repeat.go +++ b/src/server/engine/repeat.go @@ -49,23 +49,16 @@ func repeat() { event.DB2Mem() // 重复通知的告警,应该用新的时间来判断是否生效和是否屏蔽, - // 不能使用TriggerTime,因为TriggerTime是触发时的时间, - // 先发了告警,又做了屏蔽,本质是不想发了,如果继续用TriggerTime判断 - // 就还是会发,不符合预期,所以,这里伪装一下TriggerTime, - // 判断完了再卸掉伪装 - realTriggerTime := event.TriggerTime - event.TriggerTime = event.NotifyRepeatNext - - if isNoneffective(event.TriggerTime, rule) { + // 不能使用TriggerTime,因为TriggerTime是触发时的时间,是一个比较老的时间 + // 先发了告警,又做了屏蔽,本质是不想发了,如果继续用TriggerTime判断,就还是会发,不符合预期 + if isNoneffective(event.NotifyRepeatNext, rule) { continue } - if isMuted(event) { + if isMuted(event, event.NotifyRepeatNext) { continue } - event.TriggerTime = realTriggerTime - fillUsers(event) notify(event) From a71edc4040bf9e6aa3faac36211f0a55fae21b7a Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Wed, 15 Dec 2021 20:52:00 +0800 Subject: [PATCH 09/39] extract IamLeader function and fix repeat --- src/models/alert_mute.go | 9 ++-- src/server/config/config.go | 10 +++-- src/server/engine/repeat.go | 65 +++++++++++++++++---------- src/server/engine/worker.go | 8 ++-- src/server/idents/idents.go | 14 ++---- src/server/memsto/alert_mute_cache.go | 5 +-- src/server/naming/heartbeat.go | 28 +++++------- src/server/naming/leader.go | 26 +++++++++++ src/server/server.go | 2 +- 9 files changed, 99 insertions(+), 68 deletions(-) create mode 100644 src/server/naming/leader.go diff --git a/src/models/alert_mute.go b/src/models/alert_mute.go index 83f724e1..f941d37c 100644 --- a/src/models/alert_mute.go +++ b/src/models/alert_mute.go @@ -104,9 +104,8 @@ func AlertMuteDel(ids []int64) error { return DB().Where("id in ?", ids).Delete(new(AlertMute)).Error } -func AlertMuteStatistics(cluster string, btime int64) (*Statistics, error) { - session := DB().Model(&AlertMute{}).Select("count(*) as total", "max(create_at) as last_updated").Where("btime <= ?", btime) - +func AlertMuteStatistics(cluster string) (*Statistics, error) { + session := DB().Model(&AlertMute{}).Select("count(*) as total", "max(create_at) as last_updated") if cluster != "" { session = session.Where("cluster = ?", cluster) } @@ -120,7 +119,7 @@ func AlertMuteStatistics(cluster string, btime int64) (*Statistics, error) { return stats[0], nil } -func AlertMuteGetsByCluster(cluster string, btime int64) ([]*AlertMute, error) { +func AlertMuteGetsByCluster(cluster string) ([]*AlertMute, error) { // clean expired first buf := int64(30) err := DB().Where("etime < ?", time.Now().Unix()+buf).Delete(new(AlertMute)).Error @@ -129,7 +128,7 @@ func AlertMuteGetsByCluster(cluster string, btime int64) ([]*AlertMute, error) { } // get my cluster's mutes - session := DB().Model(&AlertMute{}).Where("btime <= ?", btime) + session := DB().Model(&AlertMute{}) if cluster != "" { session = session.Where("cluster = ?", cluster) } diff --git a/src/server/config/config.go b/src/server/config/config.go index 4a2f192e..47c31783 100644 --- a/src/server/config/config.go +++ b/src/server/config/config.go @@ -12,7 +12,6 @@ import ( "github.com/didi/nightingale/v5/src/pkg/httpx" "github.com/didi/nightingale/v5/src/pkg/logx" - "github.com/didi/nightingale/v5/src/server/naming" "github.com/didi/nightingale/v5/src/server/reader" "github.com/didi/nightingale/v5/src/server/writer" "github.com/didi/nightingale/v5/src/storage" @@ -77,7 +76,6 @@ func MustLoad(fpaths ...string) { } C.Heartbeat.Endpoint = fmt.Sprintf("%s:%d", C.Heartbeat.IP, C.HTTP.Port) - C.Heartbeat.Cluster = C.ClusterName C.Alerting.RedisPub.ChannelKey = C.Alerting.RedisPub.ChannelPrefix + C.ClusterName @@ -93,7 +91,7 @@ type Config struct { Log logx.Config HTTP httpx.Config BasicAuth gin.Accounts - Heartbeat naming.HeartbeatConfig + Heartbeat HeartbeatConfig Alerting Alerting NoData NoData Redis storage.RedisConfig @@ -106,6 +104,12 @@ type Config struct { Ibex Ibex } +type HeartbeatConfig struct { + IP string + Interval int64 + Endpoint string +} + type Alerting struct { NotifyScriptPath string NotifyConcurrency int diff --git a/src/server/engine/repeat.go b/src/server/engine/repeat.go index 3e6ddfd6..7d9a652c 100644 --- a/src/server/engine/repeat.go +++ b/src/server/engine/repeat.go @@ -4,10 +4,12 @@ import ( "context" "time" + "github.com/toolkits/pkg/logger" + "github.com/didi/nightingale/v5/src/models" "github.com/didi/nightingale/v5/src/server/config" "github.com/didi/nightingale/v5/src/server/memsto" - "github.com/toolkits/pkg/logger" + "github.com/didi/nightingale/v5/src/server/naming" ) func loopRepeat(ctx context.Context) { @@ -24,6 +26,17 @@ func loopRepeat(ctx context.Context) { // 拉取未恢复的告警表中需要重复通知的数据 func repeat() { + isLeader, err := naming.IamLeader() + if err != nil { + logger.Errorf("repeat: %v", err) + return + } + + if !isLeader { + logger.Info("repeat: i am not leader") + return + } + events, err := models.AlertCurEventNeedRepeat(config.C.ClusterName) if err != nil { logger.Errorf("repeat: AlertCurEventNeedRepeat: %v", err) @@ -35,35 +48,39 @@ func repeat() { } for i := 0; i < len(events); i++ { - event := events[i] - rule := memsto.AlertRuleCache.Get(event.RuleId) + rule := memsto.AlertRuleCache.Get(events[i].RuleId) if rule == nil { + // 可能告警规则已经被删了,理论上不应该出现这种情况,因为删除告警规则的时候,会顺带删除活跃告警,无论如何,自保一下 continue } - if rule.NotifyRepeatStep == 0 { - // 用户后来调整了这个字段,不让继续发送了 - continue - } + repeatOne(events[i], rule) - event.DB2Mem() - - // 重复通知的告警,应该用新的时间来判断是否生效和是否屏蔽, - // 不能使用TriggerTime,因为TriggerTime是触发时的时间,是一个比较老的时间 - // 先发了告警,又做了屏蔽,本质是不想发了,如果继续用TriggerTime判断,就还是会发,不符合预期 - if isNoneffective(event.NotifyRepeatNext, rule) { - continue - } - - if isMuted(event, event.NotifyRepeatNext) { - continue - } - - fillUsers(event) - notify(event) - - if err = event.IncRepeatStep(int64(rule.NotifyRepeatStep * 60)); err != nil { + if err = events[i].IncRepeatStep(int64(rule.NotifyRepeatStep * 60)); err != nil { logger.Errorf("repeat: IncRepeatStep: %v", err) } } } + +func repeatOne(event *models.AlertCurEvent, rule *models.AlertRule) { + if rule.NotifyRepeatStep == 0 { + // 用户后来调整了这个字段,不让继续发送了 + return + } + + event.DB2Mem() + + // 重复通知的告警,应该用新的时间来判断是否生效和是否屏蔽, + // 不能使用TriggerTime,因为TriggerTime是触发时的时间,是一个比较老的时间 + // 先发了告警,又做了屏蔽,本质是不想发了,如果继续用TriggerTime判断,就还是会发,不符合预期 + if isNoneffective(event.NotifyRepeatNext, rule) { + return + } + + if isMuted(event, event.NotifyRepeatNext) { + return + } + + fillUsers(event) + notify(event) +} diff --git a/src/server/engine/worker.go b/src/server/engine/worker.go index 40e0aafa..46283d07 100644 --- a/src/server/engine/worker.go +++ b/src/server/engine/worker.go @@ -187,6 +187,10 @@ func (r RuleEval) judge(vectors []Vector) { alertingKeys := make(map[string]struct{}) now := time.Now().Unix() for i := 0; i < count; i++ { + // compute hash + hash := str.MD5(fmt.Sprintf("%d_%s", r.rule.Id, vectors[i].Key)) + alertingKeys[hash] = struct{}{} + // rule disabled in this time span? if isNoneffective(vectors[i].Timestamp, r.rule) { continue @@ -226,10 +230,6 @@ func (r RuleEval) judge(vectors []Vector) { continue } - // compute hash - hash := str.MD5(fmt.Sprintf("%d_%s", r.rule.Id, vectors[i].Key)) - alertingKeys[hash] = struct{}{} - tagsArr := labelMapToArr(tagsMap) sort.Strings(tagsArr) diff --git a/src/server/idents/idents.go b/src/server/idents/idents.go index a3ab67f5..5cd7d8d0 100644 --- a/src/server/idents/idents.go +++ b/src/server/idents/idents.go @@ -3,7 +3,6 @@ package idents import ( "context" "fmt" - "sort" "strconv" "time" @@ -92,20 +91,13 @@ func loopPushMetrics(ctx context.Context) { } func pushMetrics() { - servers, err := naming.ActiveServers(context.Background(), config.C.ClusterName) + isLeader, err := naming.IamLeader() if err != nil { - logger.Errorf("handle_idents: failed to get active servers: %v", err) + logger.Errorf("handle_idents: %v", err) return } - if len(servers) == 0 { - logger.Errorf("handle_idents: active servers empty") - return - } - - sort.Strings(servers) - - if config.C.Heartbeat.Endpoint != servers[0] { + if !isLeader { logger.Info("handle_idents: i am not leader") return } diff --git a/src/server/memsto/alert_mute_cache.go b/src/server/memsto/alert_mute_cache.go index 9efa17de..582a477d 100644 --- a/src/server/memsto/alert_mute_cache.go +++ b/src/server/memsto/alert_mute_cache.go @@ -89,9 +89,8 @@ func loopSyncAlertMutes() { func syncAlertMutes() error { start := time.Now() - btime := start.Unix() - int64(30) - stat, err := models.AlertMuteStatistics(config.C.ClusterName, btime) + stat, err := models.AlertMuteStatistics(config.C.ClusterName) if err != nil { return errors.WithMessage(err, "failed to exec AlertMuteStatistics") } @@ -103,7 +102,7 @@ func syncAlertMutes() error { return nil } - lst, err := models.AlertMuteGetsByCluster(config.C.ClusterName, btime) + lst, err := models.AlertMuteGetsByCluster(config.C.ClusterName) if err != nil { return errors.WithMessage(err, "failed to exec AlertMuteGetsByCluster") } diff --git a/src/server/naming/heartbeat.go b/src/server/naming/heartbeat.go index ab4dff0a..949cd24a 100644 --- a/src/server/naming/heartbeat.go +++ b/src/server/naming/heartbeat.go @@ -10,34 +10,28 @@ import ( "github.com/toolkits/pkg/logger" + "github.com/didi/nightingale/v5/src/server/config" "github.com/didi/nightingale/v5/src/storage" ) // local servers var localss string -type HeartbeatConfig struct { - IP string - Interval int64 - Endpoint string - Cluster string -} - -func Heartbeat(ctx context.Context, cfg HeartbeatConfig) error { - if err := heartbeat(ctx, cfg); err != nil { +func Heartbeat(ctx context.Context) error { + if err := heartbeat(ctx); err != nil { fmt.Println("failed to heartbeat:", err) return err } - go loopHeartbeat(ctx, cfg) + go loopHeartbeat(ctx) return nil } -func loopHeartbeat(ctx context.Context, cfg HeartbeatConfig) { - interval := time.Duration(cfg.Interval) * time.Millisecond +func loopHeartbeat(ctx context.Context) { + interval := time.Duration(config.C.Heartbeat.Interval) * time.Millisecond for { time.Sleep(interval) - if err := heartbeat(ctx, cfg); err != nil { + if err := heartbeat(ctx); err != nil { logger.Warning(err) } } @@ -52,15 +46,15 @@ func redisKey(cluster string) string { return fmt.Sprintf("/server/heartbeat/%s", cluster) } -func heartbeat(ctx context.Context, cfg HeartbeatConfig) error { +func heartbeat(ctx context.Context) error { now := time.Now().Unix() - key := redisKey(cfg.Cluster) - err := storage.Redis.HSet(ctx, key, cfg.Endpoint, now).Err() + key := redisKey(config.C.ClusterName) + err := storage.Redis.HSet(ctx, key, config.C.Heartbeat.Endpoint, now).Err() if err != nil { return err } - servers, err := ActiveServers(ctx, cfg.Cluster) + servers, err := ActiveServers(ctx, config.C.ClusterName) if err != nil { return err } diff --git a/src/server/naming/leader.go b/src/server/naming/leader.go new file mode 100644 index 00000000..0909be55 --- /dev/null +++ b/src/server/naming/leader.go @@ -0,0 +1,26 @@ +package naming + +import ( + "context" + "sort" + + "github.com/didi/nightingale/v5/src/server/config" + "github.com/toolkits/pkg/logger" +) + +func IamLeader() (bool, error) { + servers, err := ActiveServers(context.Background(), config.C.ClusterName) + if err != nil { + logger.Errorf("failed to get active servers: %v", err) + return false, err + } + + if len(servers) == 0 { + logger.Errorf("active servers empty") + return false, err + } + + sort.Strings(servers) + + return config.C.Heartbeat.Endpoint == servers[0], nil +} diff --git a/src/server/server.go b/src/server/server.go index 57c55d94..f69c336e 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -134,7 +134,7 @@ func (s Server) initialize() (func(), error) { memsto.Sync() // start heartbeat - if err = naming.Heartbeat(ctx, config.C.Heartbeat); err != nil { + if err = naming.Heartbeat(ctx); err != nil { return fns.Ret(), err } From 0f65a1f5ddce926a4020277a988de9aa249974b1 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Thu, 16 Dec 2021 16:59:51 +0800 Subject: [PATCH 10/39] add remote write api support --- go.mod | 1 + src/server/router/router.go | 4 +- src/server/router/router_prom.go | 96 +++++++++++++++++++++++++++++++- 3 files changed, 96 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 08f56fde..8be61aac 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/gin-gonic/gin v1.7.4 github.com/go-ldap/ldap/v3 v3.4.1 github.com/go-redis/redis/v8 v8.11.3 + github.com/gogo/protobuf v1.1.1 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.4 diff --git a/src/server/router/router.go b/src/server/router/router.go index 8eed8e95..578f8288 100644 --- a/src/server/router/router.go +++ b/src/server/router/router.go @@ -71,6 +71,8 @@ func configRoute(r *gin.Engine, version string) { } r.POST("/opentsdb/put", handleOpenTSDB) + r.POST("/prometheus/v1/write", remoteWrite) + r.POST("/prometheus/v1/query", queryPromql) r.GET("/memory/alert-rule", alertRuleGet) r.GET("/memory/idents", identsGets) @@ -80,7 +82,5 @@ func configRoute(r *gin.Engine, version string) { r.GET("/memory/user", userGet) r.GET("/memory/user-group", userGroupGet) - r.POST("/prom/vectors", vectorsPost) - r.GET("/metrics", gin.WrapH(promhttp.Handler())) } diff --git a/src/server/router/router_prom.go b/src/server/router/router_prom.go index afe78f41..b51879cd 100644 --- a/src/server/router/router_prom.go +++ b/src/server/router/router_prom.go @@ -1,21 +1,32 @@ package router import ( + "io" + "io/ioutil" + "net/http" "time" "github.com/gin-gonic/gin" + "github.com/gogo/protobuf/proto" + "github.com/golang/snappy" + "github.com/prometheus/prometheus/prompb" "github.com/toolkits/pkg/ginx" + "github.com/didi/nightingale/v5/src/server/config" "github.com/didi/nightingale/v5/src/server/engine" + "github.com/didi/nightingale/v5/src/server/idents" + "github.com/didi/nightingale/v5/src/server/memsto" "github.com/didi/nightingale/v5/src/server/reader" + promstat "github.com/didi/nightingale/v5/src/server/stat" + "github.com/didi/nightingale/v5/src/server/writer" ) -type vectorsForm struct { +type promqlForm struct { PromQL string `json:"promql"` } -func vectorsPost(c *gin.Context) { - var f vectorsForm +func queryPromql(c *gin.Context) { + var f promqlForm ginx.BindJSON(c, &f) value, warnings, err := reader.Reader.Client.Query(c.Request.Context(), f.PromQL, time.Now()) @@ -31,3 +42,82 @@ func vectorsPost(c *gin.Context) { c.JSON(200, engine.ConvertVectors(value)) } + +func remoteWrite(c *gin.Context) { + req, err := DecodeWriteRequest(c.Request.Body) + if err != nil { + c.String(http.StatusBadRequest, err.Error()) + return + } + + count := len(req.Timeseries) + + if count == 0 { + c.String(200, "") + return + } + + var ( + now = time.Now().Unix() + ids = make(map[string]interface{}) + lst = make([]interface{}, 0, count) + ) + + for i := 0; i < count; i++ { + labels := req.Timeseries[i].GetLabels() + + ident := "" + for _, label := range labels { + if label.GetName() == "ident" { + ident = label.GetValue() + } + } + + if len(ident) > 0 { + // register host + ids[ident] = now + + // fill tags + target, has := memsto.TargetCache.Get(ident) + if has { + for key, value := range target.TagsMap { + req.Timeseries[i].Labels = append(req.Timeseries[i].Labels, &prompb.Label{ + Name: key, + Value: value, + }) + } + } + } + + lst[i] = req.Timeseries[i] + } + + promstat.CounterSampleTotal.WithLabelValues(config.C.ClusterName, "prometheus").Add(float64(count)) + idents.Idents.MSet(ids) + if writer.Writers.PushQueue(lst) { + c.String(200, "") + } else { + c.String(http.StatusInternalServerError, "wirter queue full") + } +} + +// DecodeWriteRequest from an io.Reader into a prompb.WriteRequest, handling +// snappy decompression. +func DecodeWriteRequest(r io.Reader) (*prompb.WriteRequest, error) { + compressed, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + reqBuf, err := snappy.Decode(nil, compressed) + if err != nil { + return nil, err + } + + var req prompb.WriteRequest + if err := proto.Unmarshal(reqBuf, &req); err != nil { + return nil, err + } + + return &req, nil +} From 8eb4a39e7d148bbf851ff62695465dd9a03b5350 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Thu, 16 Dec 2021 17:07:27 +0800 Subject: [PATCH 11/39] fix index out of range --- src/server/router/router_prom.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/router/router_prom.go b/src/server/router/router_prom.go index b51879cd..d53ec839 100644 --- a/src/server/router/router_prom.go +++ b/src/server/router/router_prom.go @@ -60,7 +60,7 @@ func remoteWrite(c *gin.Context) { var ( now = time.Now().Unix() ids = make(map[string]interface{}) - lst = make([]interface{}, 0, count) + lst = make([]interface{}, count) ) for i := 0; i < count; i++ { From 49176ae240540db69f4aa089a6a05b23d86170f4 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Thu, 16 Dec 2021 17:58:49 +0800 Subject: [PATCH 12/39] support grafana-agent --- Makefile | 2 +- README.md | 2 +- src/server/router/router_opentsdb.go | 2 +- src/server/router/router_prom.go | 30 +++++++++++++++++++--------- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 45cc6b97..a51db486 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ NOW = $(shell date -u '+%Y%m%d%I%M%S') -RELEASE_VERSION = 5.1.0 +RELEASE_VERSION = 5.2.0 APP = n9e SERVER_BIN = $(APP) diff --git a/README.md b/README.md index a03519aa..ca92685d 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Nightingale, Prometheus enterprise edition - [x] notify.py support feishu - [ ] notify.py support sms - [ ] notify.py support voice -- [ ] support remote write api +- [x] support remote write api - [ ] support pushgateway api diff --git a/src/server/router/router_opentsdb.go b/src/server/router/router_opentsdb.go index f4731235..03077ead 100644 --- a/src/server/router/router_opentsdb.go +++ b/src/server/router/router_opentsdb.go @@ -193,7 +193,7 @@ func handleOpenTSDB(c *gin.Context) { if len(list) > 0 { promstat.CounterSampleTotal.WithLabelValues(config.C.ClusterName, "opentsdb").Add(float64(len(list))) if !writer.Writers.PushQueue(list) { - msg = "wirter queue full" + msg = "writer queue full" } idents.Idents.MSet(ids) diff --git a/src/server/router/router_prom.go b/src/server/router/router_prom.go index d53ec839..4519d1e8 100644 --- a/src/server/router/router_prom.go +++ b/src/server/router/router_prom.go @@ -58,18 +58,30 @@ func remoteWrite(c *gin.Context) { } var ( - now = time.Now().Unix() - ids = make(map[string]interface{}) - lst = make([]interface{}, count) + now = time.Now().Unix() + ids = make(map[string]interface{}) + lst = make([]interface{}, count) + ident string ) for i := 0; i < count; i++ { - labels := req.Timeseries[i].GetLabels() + ident = "" - ident := "" - for _, label := range labels { - if label.GetName() == "ident" { - ident = label.GetValue() + // find ident label + for j := 0; j < len(req.Timeseries[i].Labels); j++ { + if req.Timeseries[i].Labels[j].Name == "ident" { + ident = req.Timeseries[i].Labels[j].Value + } + } + + if ident == "" { + // not found, try agent_hostname + for j := 0; j < len(req.Timeseries[i].Labels); j++ { + // agent_hostname for grafana-agent + if req.Timeseries[i].Labels[j].Name == "agent_hostname" { + req.Timeseries[i].Labels[j].Name = "ident" + ident = req.Timeseries[i].Labels[j].Value + } } } @@ -97,7 +109,7 @@ func remoteWrite(c *gin.Context) { if writer.Writers.PushQueue(lst) { c.String(200, "") } else { - c.String(http.StatusInternalServerError, "wirter queue full") + c.String(http.StatusInternalServerError, "writer queue full") } } From b452be880bed93c8542e59858c47303ae0d2334f Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Thu, 16 Dec 2021 19:57:55 +0800 Subject: [PATCH 13/39] update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ca92685d..d1942535 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Nightingale, Prometheus enterprise edition - 国外:[https://n9e.github.io/](https://n9e.github.io/) - 国内:[https://n9e.gitee.io/](https://n9e.gitee.io/) -- [v4老文档](https://gitee.com/n9e/book/tree/master/content/v4/docs) +- 老版:[https://gitee.com/n9e/book/tree/master/content/v4/docs](https://gitee.com/n9e/book/tree/master/content/v4/docs) ## TODO From b62a42bed832944bc6345d6193cd6667c6d1ff03 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 17 Dec 2021 11:05:15 +0800 Subject: [PATCH 14/39] dingtalk use markdown --- etc/script/notify.py | 7 ++++--- etc/template/dingtalk.tpl | 14 +++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/etc/script/notify.py b/etc/script/notify.py index b00c6069..50a81985 100755 --- a/etc/script/notify.py +++ b/etc/script/notify.py @@ -105,9 +105,10 @@ class Sender(object): for t in tokens: url = "https://oapi.dingtalk.com/robot/send?access_token={}".format(t) body = { - "msgtype": "text", - "text": { - "content": payload.get('tpls').get("dingtalk.tpl", "dingtalk.tpl not found") + "msgtype": "markdown", + "markdown": { + "title": "n9e notice", + "text": payload.get('tpls').get("dingtalk.tpl", "dingtalk.tpl not found") }, "at": { "atMobiles": phones.keys(), diff --git a/etc/template/dingtalk.tpl b/etc/template/dingtalk.tpl index 52e26193..0ea9f8e7 100644 --- a/etc/template/dingtalk.tpl +++ b/etc/template/dingtalk.tpl @@ -1,7 +1,7 @@ -级别状态: S{{.Severity}} {{if .IsRecovered}}Recovered{{else}}Triggered{{end}} -规则名称: {{.RuleName}}{{if .RuleNote}} -规则备注: {{.RuleNote}}{{end}} -监控指标: {{.TagsJSON}} -{{if .IsRecovered}}恢复时间:{{timeformat .LastEvalTime}}{{else}}触发时间: {{timeformat .TriggerTime}} -触发时值: {{.TriggerValue}}{{end}} -发送时间: {{timestamp}} \ No newline at end of file +**级别状态**: S{{.Severity}} {{if .IsRecovered}}Recovered{{else}}Triggered{{end}} +**规则标题**: {{.RuleName}}{{if .RuleNote}} +**规则备注**: {{.RuleNote}}{{end}} +**监控指标**: {{.TagsJSON}} +{{if .IsRecovered}}**恢复时间**:{{timeformat .LastEvalTime}}{{else}}**触发时间**: {{timeformat .TriggerTime}} +**触发时值**: {{.TriggerValue}}{{end}} +**发送时间**: {{timestamp}} \ No newline at end of file From acc797666dec22865059545b426f5ea4eca05590 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 17 Dec 2021 11:20:32 +0800 Subject: [PATCH 15/39] test markdown --- etc/template/dingtalk.tpl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/etc/template/dingtalk.tpl b/etc/template/dingtalk.tpl index 0ea9f8e7..a751c762 100644 --- a/etc/template/dingtalk.tpl +++ b/etc/template/dingtalk.tpl @@ -1,7 +1,7 @@ -**级别状态**: S{{.Severity}} {{if .IsRecovered}}Recovered{{else}}Triggered{{end}} -**规则标题**: {{.RuleName}}{{if .RuleNote}} -**规则备注**: {{.RuleNote}}{{end}} -**监控指标**: {{.TagsJSON}} -{{if .IsRecovered}}**恢复时间**:{{timeformat .LastEvalTime}}{{else}}**触发时间**: {{timeformat .TriggerTime}} +- **级别状态**: {{if .IsRecovered}}S{{.Severity}} Recovered{{else}}S{{.Severity}} Triggered{{end}} +- **规则标题**: {{.RuleName}}{{if .RuleNote}} +- **规则备注**: {{.RuleNote}}{{end}} +- **监控指标**: {{.TagsJSON}} +- {{if .IsRecovered}}**恢复时间**:{{timeformat .LastEvalTime}}{{else}}**触发时间**: {{timeformat .TriggerTime}} **触发时值**: {{.TriggerValue}}{{end}} -**发送时间**: {{timestamp}} \ No newline at end of file +- **发送时间**: {{timestamp}} \ No newline at end of file From 8570c2d287eeb75a153237f202f35df8b843e611 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 17 Dec 2021 12:05:41 +0800 Subject: [PATCH 16/39] modify dingtalk markdown --- etc/script/notify.py | 12 +++++++++--- etc/template/dingtalk.tpl | 15 ++++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/etc/script/notify.py b/etc/script/notify.py index 50a81985..e06c5fe8 100755 --- a/etc/script/notify.py +++ b/etc/script/notify.py @@ -86,7 +86,13 @@ class Sender(object): @classmethod def send_dingtalk(cls, payload): - users = payload.get('event').get("notify_users_obj") + event = payload.get('event') + users = event.get("notify_users_obj") + + rule_name = event.get("rule_name") + event_state = "Triggered" + if event.get("is_recovered"): + event_state = "Recovered" tokens = {} phones = {} @@ -107,8 +113,8 @@ class Sender(object): body = { "msgtype": "markdown", "markdown": { - "title": "n9e notice", - "text": payload.get('tpls').get("dingtalk.tpl", "dingtalk.tpl not found") + "title": "{} - {}".format(event_state, rule_name), + "text": payload.get('tpls').get("dingtalk.tpl", "dingtalk.tpl not found") + ' '.join(["@"+i for i in phones.keys()]) }, "at": { "atMobiles": phones.keys(), diff --git a/etc/template/dingtalk.tpl b/etc/template/dingtalk.tpl index a751c762..2e3180d1 100644 --- a/etc/template/dingtalk.tpl +++ b/etc/template/dingtalk.tpl @@ -1,7 +1,8 @@ -- **级别状态**: {{if .IsRecovered}}S{{.Severity}} Recovered{{else}}S{{.Severity}} Triggered{{end}} -- **规则标题**: {{.RuleName}}{{if .RuleNote}} -- **规则备注**: {{.RuleNote}}{{end}} -- **监控指标**: {{.TagsJSON}} -- {{if .IsRecovered}}**恢复时间**:{{timeformat .LastEvalTime}}{{else}}**触发时间**: {{timeformat .TriggerTime}} -**触发时值**: {{.TriggerValue}}{{end}} -- **发送时间**: {{timestamp}} \ No newline at end of file +### {{if .IsRecovered}}S{{.Severity}} - Recovered - {{.RuleName}}{{else}}S{{.Severity}} - Triggered - {{.RuleName}}{{end}} + +> - **规则标题**: {{.RuleName}}{{if .RuleNote}} +> - **规则备注**: {{.RuleNote}}{{end}} +> - **监控指标**: {{.TagsJSON}} +> - {{if .IsRecovered}}**恢复时间**:{{timeformat .LastEvalTime}}{{else}}**触发时间**: {{timeformat .TriggerTime}} +> - **触发时值**: {{.TriggerValue}}{{end}} +> - **发送时间**: {{timestamp}} \ No newline at end of file From 5b22d65dba9166da698f3a5bb4a988c391a6413f Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 17 Dec 2021 12:09:35 +0800 Subject: [PATCH 17/39] add space line --- etc/template/dingtalk.tpl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/etc/template/dingtalk.tpl b/etc/template/dingtalk.tpl index 2e3180d1..214bb03e 100644 --- a/etc/template/dingtalk.tpl +++ b/etc/template/dingtalk.tpl @@ -5,4 +5,5 @@ > - **监控指标**: {{.TagsJSON}} > - {{if .IsRecovered}}**恢复时间**:{{timeformat .LastEvalTime}}{{else}}**触发时间**: {{timeformat .TriggerTime}} > - **触发时值**: {{.TriggerValue}}{{end}} -> - **发送时间**: {{timestamp}} \ No newline at end of file +> - **发送时间**: {{timestamp}} + From 7bcb6acb03ee5789b2ea610e0f3b3a6ba744ed4d Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 17 Dec 2021 12:11:15 +0800 Subject: [PATCH 18/39] refactor --- etc/template/dingtalk.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/template/dingtalk.tpl b/etc/template/dingtalk.tpl index 214bb03e..45c9ae6d 100644 --- a/etc/template/dingtalk.tpl +++ b/etc/template/dingtalk.tpl @@ -1,4 +1,4 @@ -### {{if .IsRecovered}}S{{.Severity}} - Recovered - {{.RuleName}}{{else}}S{{.Severity}} - Triggered - {{.RuleName}}{{end}} +#### {{if .IsRecovered}}S{{.Severity}} - Recovered - {{.RuleName}}{{else}}S{{.Severity}} - Triggered - {{.RuleName}}{{end}} > - **规则标题**: {{.RuleName}}{{if .RuleNote}} > - **规则备注**: {{.RuleNote}}{{end}} From c3c1aa5aff11eefd09e0abeb601d68a7d3778181 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 17 Dec 2021 12:24:24 +0800 Subject: [PATCH 19/39] refactor dingtalk.tpl --- etc/template/dingtalk.tpl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/etc/template/dingtalk.tpl b/etc/template/dingtalk.tpl index 45c9ae6d..2fb52c7f 100644 --- a/etc/template/dingtalk.tpl +++ b/etc/template/dingtalk.tpl @@ -1,5 +1,7 @@ #### {{if .IsRecovered}}S{{.Severity}} - Recovered - {{.RuleName}}{{else}}S{{.Severity}} - Triggered - {{.RuleName}}{{end}} +--- + > - **规则标题**: {{.RuleName}}{{if .RuleNote}} > - **规则备注**: {{.RuleNote}}{{end}} > - **监控指标**: {{.TagsJSON}} @@ -7,3 +9,5 @@ > - **触发时值**: {{.TriggerValue}}{{end}} > - **发送时间**: {{timestamp}} +--- + From f661a6bd37fbf7693239591408cef05daaeade81 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 17 Dec 2021 13:04:39 +0800 Subject: [PATCH 20/39] refactor dingtalk.tpl --- etc/template/dingtalk.tpl | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/etc/template/dingtalk.tpl b/etc/template/dingtalk.tpl index 2fb52c7f..45257512 100644 --- a/etc/template/dingtalk.tpl +++ b/etc/template/dingtalk.tpl @@ -2,12 +2,10 @@ --- -> - **规则标题**: {{.RuleName}}{{if .RuleNote}} -> - **规则备注**: {{.RuleNote}}{{end}} -> - **监控指标**: {{.TagsJSON}} -> - {{if .IsRecovered}}**恢复时间**:{{timeformat .LastEvalTime}}{{else}}**触发时间**: {{timeformat .TriggerTime}} -> - **触发时值**: {{.TriggerValue}}{{end}} -> - **发送时间**: {{timestamp}} - ---- +- **规则标题**: {{.RuleName}}{{if .RuleNote}} +- **规则备注**: {{.RuleNote}}{{end}} +- **监控指标**: {{.TagsJSON}} +- {{if .IsRecovered}}**恢复时间**:{{timeformat .LastEvalTime}}{{else}}**触发时间**: {{timeformat .TriggerTime}} +- **触发时值**: {{.TriggerValue}}{{end}} +- **发送时间**: {{timestamp}} From 3428b11ea8e1e6041f38932ba2d44db6be885698 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Thu, 23 Dec 2021 12:53:32 +0800 Subject: [PATCH 21/39] configuration for metrics.yaml and templates --- docker/n9eetc/server.conf | 1 + docker/n9eetc/webapi.conf | 3 +++ etc/server.conf | 1 + etc/webapi.conf | 3 +++ src/server/config/config.go | 1 + src/server/engine/notify.go | 12 +++++++----- src/webapi/config/config.go | 1 + src/webapi/router/router_metric_desc.go | 6 +++++- 8 files changed, 22 insertions(+), 6 deletions(-) diff --git a/docker/n9eetc/server.conf b/docker/n9eetc/server.conf index 6a7e0e4a..a0116f77 100644 --- a/docker/n9eetc/server.conf +++ b/docker/n9eetc/server.conf @@ -54,6 +54,7 @@ Interval = 1000 [Alerting] NotifyScriptPath = "./etc/script/notify.py" NotifyConcurrency = 100 +TemplatesDir = "./etc/template" [Alerting.RedisPub] Enable = false diff --git a/docker/n9eetc/webapi.conf b/docker/n9eetc/webapi.conf index 62d7e68b..f3a3d3a1 100644 --- a/docker/n9eetc/webapi.conf +++ b/docker/n9eetc/webapi.conf @@ -7,6 +7,9 @@ RunMode = "release" # do not change AdminRole = "Admin" +# metrics descriptions +MetricsYamlFile = "./etc/metrics.yaml" + # Linkage with notify.py script NotifyChannels = [ "email", "dingtalk", "wecom", "feishu" ] diff --git a/etc/server.conf b/etc/server.conf index 120bbe07..70b27b18 100644 --- a/etc/server.conf +++ b/etc/server.conf @@ -57,6 +57,7 @@ Interval = 1000 [Alerting] NotifyScriptPath = "./etc/script/notify.py" NotifyConcurrency = 100 +TemplatesDir = "./etc/template" [Alerting.RedisPub] Enable = false diff --git a/etc/webapi.conf b/etc/webapi.conf index 7f2e3aad..db06da92 100644 --- a/etc/webapi.conf +++ b/etc/webapi.conf @@ -7,6 +7,9 @@ RunMode = "release" # do not change AdminRole = "Admin" +# metrics descriptions +MetricsYamlFile = "./etc/metrics.yaml" + # Linkage with notify.py script NotifyChannels = [ "email", "dingtalk", "wecom", "feishu" ] diff --git a/src/server/config/config.go b/src/server/config/config.go index 47c31783..1951f650 100644 --- a/src/server/config/config.go +++ b/src/server/config/config.go @@ -113,6 +113,7 @@ type HeartbeatConfig struct { type Alerting struct { NotifyScriptPath string NotifyConcurrency int + TemplatesDir string RedisPub RedisPub } diff --git a/src/server/engine/notify.go b/src/server/engine/notify.go index 19cf992e..5322eb5c 100644 --- a/src/server/engine/notify.go +++ b/src/server/engine/notify.go @@ -44,15 +44,17 @@ var fns = template.FuncMap{ } func initTpls() error { - tplDir := path.Join(runner.Cwd, "etc", "template") + if config.C.Alerting.TemplatesDir == "" { + config.C.Alerting.TemplatesDir = path.Join(runner.Cwd, "etc", "template") + } - filenames, err := file.FilesUnder(tplDir) + filenames, err := file.FilesUnder(config.C.Alerting.TemplatesDir) if err != nil { return errors.WithMessage(err, "failed to exec FilesUnder") } if len(filenames) == 0 { - return errors.New("no tpl files under " + tplDir) + return errors.New("no tpl files under " + config.C.Alerting.TemplatesDir) } tplFiles := make([]string, 0, len(filenames)) @@ -63,11 +65,11 @@ func initTpls() error { } if len(tplFiles) == 0 { - return errors.New("no tpl files under " + tplDir) + return errors.New("no tpl files under " + config.C.Alerting.TemplatesDir) } for i := 0; i < len(tplFiles); i++ { - tplpath := path.Join(tplDir, tplFiles[i]) + tplpath := path.Join(config.C.Alerting.TemplatesDir, tplFiles[i]) tpl, err := template.New(tplFiles[i]).Funcs(fns).ParseFiles(tplpath) if err != nil { diff --git a/src/webapi/config/config.go b/src/webapi/config/config.go index 77b1f52c..1cbdd6f0 100644 --- a/src/webapi/config/config.go +++ b/src/webapi/config/config.go @@ -77,6 +77,7 @@ type Config struct { RunMode string I18N string AdminRole string + MetricsYamlFile string ContactKeys []ContactKey NotifyChannels []string Log logx.Config diff --git a/src/webapi/router/router_metric_desc.go b/src/webapi/router/router_metric_desc.go index f46726d5..546e2d2a 100644 --- a/src/webapi/router/router_metric_desc.go +++ b/src/webapi/router/router_metric_desc.go @@ -12,7 +12,11 @@ import ( ) func metricsDescGetFile(c *gin.Context) { - fp := path.Join(runner.Cwd, "etc", "metrics.yaml") + fp := config.C.MetricsYamlFile + if fp == "" { + fp = path.Join(runner.Cwd, "etc", "metrics.yaml") + } + if !file.IsExist(fp) { c.String(404, "%s not found", fp) return From 837cfab1bd891320ee07e0e8088f3e007c4b3c05 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Thu, 23 Dec 2021 22:19:49 +0800 Subject: [PATCH 22/39] refactor repeater --- src/server/engine/consume.go | 66 ++++++++++++++++++++---------------- src/server/engine/engine.go | 2 +- src/server/engine/worker.go | 14 ++++++-- 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/src/server/engine/consume.go b/src/server/engine/consume.go index 2388f5be..c2eeaa62 100644 --- a/src/server/engine/consume.go +++ b/src/server/engine/consume.go @@ -58,36 +58,7 @@ func persist(event *models.AlertCurEvent) { his := event.ToHis() - if has { - // 数据库里有这个事件,说明之前触发过了 - if event.IsRecovered { - // 本次恢复了,把未恢复的事件删除,在全量告警里添加记录 - err := models.AlertCurEventDelByHash(event.Hash) - if err != nil { - logger.Errorf("event_del_cur_fail: %v hash=%s", err, event.Hash) - } - - if err := his.Add(); err != nil { - logger.Errorf( - "event_persist_his_fail: %v rule_id=%d hash=%s tags=%v timestamp=%d value=%s", - err, - event.RuleId, - event.Hash, - event.TagsJSON, - event.TriggerTime, - event.TriggerValue, - ) - } - } - return - } - - if event.IsRecovered { - // alert_cur_event表里没有数据,表示之前没告警,结果现在报了恢复,神奇....理论上不应该出现的 - return - } - - // 本次是告警,alert_cur_event表里也没有数据 + // 不管是告警还是恢复,全量告警里都要记录 if err := his.Add(); err != nil { logger.Errorf( "event_persist_his_fail: %v rule_id=%d hash=%s tags=%v timestamp=%d value=%s", @@ -100,6 +71,41 @@ func persist(event *models.AlertCurEvent) { ) } + if has { + // 活跃告警表中有记录,删之 + err = models.AlertCurEventDelByHash(event.Hash) + if err != nil { + logger.Errorf("event_del_cur_fail: %v hash=%s", err, event.Hash) + return + } + + if !event.IsRecovered { + // 恢复事件,从活跃告警列表彻底删掉,告警事件,要重新加进来新的event + // use his id as cur id + event.Id = his.Id + if event.Id > 0 { + if err := event.Add(); err != nil { + logger.Errorf( + "event_persist_cur_fail: %v rule_id=%d hash=%s tags=%v timestamp=%d value=%s", + err, + event.RuleId, + event.Hash, + event.TagsJSON, + event.TriggerTime, + event.TriggerValue, + ) + } + } + } + + return + } + + if event.IsRecovered { + // alert_cur_event表里没有数据,表示之前没告警,结果现在报了恢复,神奇....理论上不应该出现的 + return + } + // use his id as cur id event.Id = his.Id if event.Id > 0 { diff --git a/src/server/engine/engine.go b/src/server/engine/engine.go index c092f7ed..1bbd24ab 100644 --- a/src/server/engine/engine.go +++ b/src/server/engine/engine.go @@ -21,7 +21,7 @@ func Start(ctx context.Context) error { go loopFilterRules(ctx) // repeat notifier - go loopRepeat(ctx) + // go loopRepeat(ctx) go reportQueueSize() diff --git a/src/server/engine/worker.go b/src/server/engine/worker.go index 46283d07..34b55500 100644 --- a/src/server/engine/worker.go +++ b/src/server/engine/worker.go @@ -288,8 +288,18 @@ func labelMapToArr(m map[string]string) []string { } func (r RuleEval) handleNewEvent(event *models.AlertCurEvent) { - if _, has := r.fires[event.Hash]; has { - // fired before, nothing to do + if fired, has := r.fires[event.Hash]; has { + if r.rule.NotifyRepeatStep == 0 { + // 说明不想重复通知,那就直接返回了,nothing to do + return + } + + // 之前发送过告警了,这次是否要继续发送,要看是否过了通道静默时间 + if event.LastEvalTime > fired.LastEvalTime+int64(r.rule.NotifyRepeatStep) { + r.fires[event.Hash] = event + pushEventToQueue(event) + } + return } From 218140066be603cf70b5c8dcd769cd170e8226c6 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Thu, 23 Dec 2021 22:26:53 +0800 Subject: [PATCH 23/39] fix r.rule.NotifyRepeatStep unit --- src/server/engine/worker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/engine/worker.go b/src/server/engine/worker.go index 34b55500..d8d24bf5 100644 --- a/src/server/engine/worker.go +++ b/src/server/engine/worker.go @@ -295,7 +295,7 @@ func (r RuleEval) handleNewEvent(event *models.AlertCurEvent) { } // 之前发送过告警了,这次是否要继续发送,要看是否过了通道静默时间 - if event.LastEvalTime > fired.LastEvalTime+int64(r.rule.NotifyRepeatStep) { + if event.LastEvalTime > fired.LastEvalTime+int64(r.rule.NotifyRepeatStep)*60 { r.fires[event.Hash] = event pushEventToQueue(event) } From 1ea8694769e3b37f9e8eb01d55bce3f1a9e37477 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Thu, 23 Dec 2021 22:43:18 +0800 Subject: [PATCH 24/39] refactor fireEvent --- src/server/engine/worker.go | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/server/engine/worker.go b/src/server/engine/worker.go index d8d24bf5..f364867f 100644 --- a/src/server/engine/worker.go +++ b/src/server/engine/worker.go @@ -288,24 +288,8 @@ func labelMapToArr(m map[string]string) []string { } func (r RuleEval) handleNewEvent(event *models.AlertCurEvent) { - if fired, has := r.fires[event.Hash]; has { - if r.rule.NotifyRepeatStep == 0 { - // 说明不想重复通知,那就直接返回了,nothing to do - return - } - - // 之前发送过告警了,这次是否要继续发送,要看是否过了通道静默时间 - if event.LastEvalTime > fired.LastEvalTime+int64(r.rule.NotifyRepeatStep)*60 { - r.fires[event.Hash] = event - pushEventToQueue(event) - } - - return - } - if event.PromForDuration == 0 { - r.fires[event.Hash] = event - pushEventToQueue(event) + r.fireEvent(event) return } @@ -317,6 +301,23 @@ func (r RuleEval) handleNewEvent(event *models.AlertCurEvent) { } if r.pendings[event.Hash].LastEvalTime-r.pendings[event.Hash].TriggerTime > int64(event.PromForDuration) { + r.fireEvent(event) + } +} + +func (r RuleEval) fireEvent(event *models.AlertCurEvent) { + if fired, has := r.fires[event.Hash]; has { + if r.rule.NotifyRepeatStep == 0 { + // 说明不想重复通知,那就直接返回了,nothing to do + return + } + + // 之前发送过告警了,这次是否要继续发送,要看是否过了通道静默时间 + if event.LastEvalTime > fired.LastEvalTime+int64(r.rule.NotifyRepeatStep)*60 { + r.fires[event.Hash] = event + pushEventToQueue(event) + } + } else { r.fires[event.Hash] = event pushEventToQueue(event) } From 74e4724e6667a9082c5605bed6516f32069eb310 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Thu, 23 Dec 2021 22:54:37 +0800 Subject: [PATCH 25/39] delete no use code: repeater.go --- src/server/engine/engine.go | 3 -- src/server/engine/repeat.go | 86 ------------------------------------- 2 files changed, 89 deletions(-) delete mode 100644 src/server/engine/repeat.go diff --git a/src/server/engine/engine.go b/src/server/engine/engine.go index 1bbd24ab..d55cf703 100644 --- a/src/server/engine/engine.go +++ b/src/server/engine/engine.go @@ -20,9 +20,6 @@ func Start(ctx context.Context) error { // filter my rules and start worker go loopFilterRules(ctx) - // repeat notifier - // go loopRepeat(ctx) - go reportQueueSize() return nil diff --git a/src/server/engine/repeat.go b/src/server/engine/repeat.go deleted file mode 100644 index 7d9a652c..00000000 --- a/src/server/engine/repeat.go +++ /dev/null @@ -1,86 +0,0 @@ -package engine - -import ( - "context" - "time" - - "github.com/toolkits/pkg/logger" - - "github.com/didi/nightingale/v5/src/models" - "github.com/didi/nightingale/v5/src/server/config" - "github.com/didi/nightingale/v5/src/server/memsto" - "github.com/didi/nightingale/v5/src/server/naming" -) - -func loopRepeat(ctx context.Context) { - duration := time.Duration(9000) * time.Millisecond - for { - select { - case <-ctx.Done(): - return - case <-time.After(duration): - repeat() - } - } -} - -// 拉取未恢复的告警表中需要重复通知的数据 -func repeat() { - isLeader, err := naming.IamLeader() - if err != nil { - logger.Errorf("repeat: %v", err) - return - } - - if !isLeader { - logger.Info("repeat: i am not leader") - return - } - - events, err := models.AlertCurEventNeedRepeat(config.C.ClusterName) - if err != nil { - logger.Errorf("repeat: AlertCurEventNeedRepeat: %v", err) - return - } - - if len(events) == 0 { - return - } - - for i := 0; i < len(events); i++ { - rule := memsto.AlertRuleCache.Get(events[i].RuleId) - if rule == nil { - // 可能告警规则已经被删了,理论上不应该出现这种情况,因为删除告警规则的时候,会顺带删除活跃告警,无论如何,自保一下 - continue - } - - repeatOne(events[i], rule) - - if err = events[i].IncRepeatStep(int64(rule.NotifyRepeatStep * 60)); err != nil { - logger.Errorf("repeat: IncRepeatStep: %v", err) - } - } -} - -func repeatOne(event *models.AlertCurEvent, rule *models.AlertRule) { - if rule.NotifyRepeatStep == 0 { - // 用户后来调整了这个字段,不让继续发送了 - return - } - - event.DB2Mem() - - // 重复通知的告警,应该用新的时间来判断是否生效和是否屏蔽, - // 不能使用TriggerTime,因为TriggerTime是触发时的时间,是一个比较老的时间 - // 先发了告警,又做了屏蔽,本质是不想发了,如果继续用TriggerTime判断,就还是会发,不符合预期 - if isNoneffective(event.NotifyRepeatNext, rule) { - return - } - - if isMuted(event, event.NotifyRepeatNext) { - return - } - - fillUsers(event) - notify(event) -} From 08c665980459532a7973034b02aa9795d7736772 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 24 Dec 2021 20:03:53 +0800 Subject: [PATCH 26/39] use longer varchar --- docker/initsql/a-n9e.sql | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docker/initsql/a-n9e.sql b/docker/initsql/a-n9e.sql index 6661835a..89af895b 100644 --- a/docker/initsql/a-n9e.sql +++ b/docker/initsql/a-n9e.sql @@ -155,7 +155,7 @@ CREATE TABLE `dashboard` ( `group_id` bigint not null default 0 comment 'busi group id', `name` varchar(191) not null, `tags` varchar(255) not null comment 'split by space', - `configs` varchar(4096) comment 'dashboard variables', + `configs` varchar(8192) comment 'dashboard variables', `create_at` bigint not null default 0, `create_by` varchar(64) not null default '', `update_at` bigint not null default 0, @@ -186,7 +186,7 @@ CREATE TABLE `chart` ( CREATE TABLE `chart_share` ( `id` bigint unsigned not null auto_increment, `cluster` varchar(128) not null, - `configs` varchar(8192), + `configs` text, `create_at` bigint not null default 0, `create_by` varchar(64) not null default '', primary key (`id`), @@ -202,7 +202,7 @@ CREATE TABLE `alert_rule` ( `severity` tinyint(1) not null comment '0:Emergency 1:Warning 2:Notice', `disabled` tinyint(1) not null comment '0:enabled 1:disabled', `prom_for_duration` int not null comment 'prometheus for, unit:s', - `prom_ql` varchar(4096) not null comment 'promql', + `prom_ql` varchar(8192) not null comment 'promql', `prom_eval_interval` int not null comment 'evaluate interval', `enable_stime` char(5) not null default '00:00', `enable_etime` char(5) not null default '23:59', @@ -227,7 +227,7 @@ CREATE TABLE `alert_mute` ( `id` bigint unsigned not null auto_increment, `group_id` bigint not null default 0 comment 'busi group id', `cluster` varchar(128) not null, - `tags` varchar(2048) not null default '' comment 'json,map,tagkey->regexp|value', + `tags` varchar(4096) not null default '' comment 'json,map,tagkey->regexp|value', `cause` varchar(255) not null default '', `btime` bigint not null default 0 comment 'begin time', `etime` bigint not null default 0 comment 'end time', @@ -243,7 +243,7 @@ CREATE TABLE `alert_subscribe` ( `group_id` bigint not null default 0 comment 'busi group id', `cluster` varchar(128) not null, `rule_id` bigint not null default 0, - `tags` varchar(2048) not null default '' comment 'json,map,tagkey->regexp|value', + `tags` varchar(4096) not null default '' comment 'json,map,tagkey->regexp|value', `redefine_severity` tinyint(1) default 0 comment 'is redefine severity?', `new_severity` tinyint(1) not null comment '0:Emergency 1:Warning 2:Notice', `redefine_channels` tinyint(1) default 0 comment 'is redefine channels?', @@ -302,7 +302,7 @@ CREATE TABLE `alert_cur_event` ( `rule_note` varchar(512) not null default 'alert rule note', `severity` tinyint(1) not null comment '0:Emergency 1:Warning 2:Notice', `prom_for_duration` int not null comment 'prometheus for, unit:s', - `prom_ql` varchar(4096) not null comment 'promql', + `prom_ql` varchar(8192) not null comment 'promql', `prom_eval_interval` int not null comment 'evaluate interval', `callbacks` varchar(255) not null default '' comment 'split by space: http://a.com/api/x http://a.com/api/y', `runbook_url` varchar(255), @@ -333,7 +333,7 @@ CREATE TABLE `alert_his_event` ( `rule_note` varchar(512) not null default 'alert rule note', `severity` tinyint(1) not null comment '0:Emergency 1:Warning 2:Notice', `prom_for_duration` int not null comment 'prometheus for, unit:s', - `prom_ql` varchar(4096) not null comment 'promql', + `prom_ql` varchar(8192) not null comment 'promql', `prom_eval_interval` int not null comment 'evaluate interval', `callbacks` varchar(255) not null default '' comment 'split by space: http://a.com/api/x http://a.com/api/y', `runbook_url` varchar(255), From 991a3e2ab582158538245db0c446f5a01dd32801 Mon Sep 17 00:00:00 2001 From: JeffreyBool <1402992668@qq.com> Date: Sat, 25 Dec 2021 22:11:41 +0800 Subject: [PATCH 27/39] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20n9e-webapi=20?= =?UTF-8?q?=E6=8C=87=E6=A0=87=E9=87=87=E9=9B=86=20(#848)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 添加自定义发现文件 * 添加 webapi 指标 --- docker/prometc/prometheus.yml | 5 +++++ docker/prometc/targets.json | 7 +++++++ 2 files changed, 12 insertions(+) create mode 100644 docker/prometc/targets.json diff --git a/docker/prometc/prometheus.yml b/docker/prometc/prometheus.yml index af33d870..9dc19861 100644 --- a/docker/prometc/prometheus.yml +++ b/docker/prometc/prometheus.yml @@ -27,3 +27,8 @@ scrape_configs: static_configs: - targets: ['localhost:9090'] + + - job_name: 'file_ds' + file_sd_configs: + - files: + - targets.json diff --git a/docker/prometc/targets.json b/docker/prometc/targets.json new file mode 100644 index 00000000..e036e964 --- /dev/null +++ b/docker/prometc/targets.json @@ -0,0 +1,7 @@ +[ + { + "targets": [ + "nwebapi:18000" + ] + } +] From ef6f6f95c06c6e3a2fedae4e1be4c51309c6094f Mon Sep 17 00:00:00 2001 From: JeffreyBool <1402992668@qq.com> Date: Sat, 25 Dec 2021 22:31:49 +0800 Subject: [PATCH 28/39] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20server=20=20?= =?UTF-8?q?=E6=8C=87=E6=A0=87=E9=87=87=E9=9B=86=20(#850)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修改名称 * 增加 server 指标采集 --- docker/prometc/prometheus.yml | 2 +- docker/prometc/targets.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/prometc/prometheus.yml b/docker/prometc/prometheus.yml index 9dc19861..cad869dc 100644 --- a/docker/prometc/prometheus.yml +++ b/docker/prometc/prometheus.yml @@ -28,7 +28,7 @@ scrape_configs: static_configs: - targets: ['localhost:9090'] - - job_name: 'file_ds' + - job_name: 'n9e' file_sd_configs: - files: - targets.json diff --git a/docker/prometc/targets.json b/docker/prometc/targets.json index e036e964..2f050d8f 100644 --- a/docker/prometc/targets.json +++ b/docker/prometc/targets.json @@ -1,7 +1,7 @@ [ { "targets": [ - "nwebapi:18000" + "nwebapi:18000","nserver:19000" ] } ] From 06eca94492eb9a8863e201f2583373af06291727 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Mon, 27 Dec 2021 13:30:45 +0800 Subject: [PATCH 29/39] add datadogSeries --- src/server/router/router.go | 3 ++ src/server/router/router_datadog.go | 78 ++++++++++++++++++++++++++++ src/server/router/router_opentsdb.go | 5 ++ 3 files changed, 86 insertions(+) create mode 100644 src/server/router/router_datadog.go diff --git a/src/server/router/router.go b/src/server/router/router.go index 578f8288..a4bbfd51 100644 --- a/src/server/router/router.go +++ b/src/server/router/router.go @@ -65,6 +65,9 @@ func configRoute(r *gin.Engine, version string) { ginx.NewRender(c).Data(lst, err) }) + // use apiKey not basic auth + r.POST("/datadog/v1/series", datadogSeries) + if len(config.C.BasicAuth) > 0 { auth := gin.BasicAuth(config.C.BasicAuth) r.Use(auth) diff --git a/src/server/router/router_datadog.go b/src/server/router/router_datadog.go new file mode 100644 index 00000000..10123942 --- /dev/null +++ b/src/server/router/router_datadog.go @@ -0,0 +1,78 @@ +package router + +import ( + "compress/gzip" + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/didi/nightingale/v5/src/server/config" + "github.com/gin-gonic/gin" +) + +type TimeSeries struct { + Series []*Metric `json:"series"` +} + +type Metric struct { + Metric string `json:"metric"` + Points []Point `json:"points"` + Host string `json:"host"` + Tags []string `json:"tags,omitempty"` +} + +type Point [2]float64 + +func datadogSeries(c *gin.Context) { + apiKey, has := c.GetQuery("api_key") + if !has { + apiKey = "" + } + + if len(config.C.BasicAuth) > 0 { + // n9e-server need basic auth + ok := false + for _, v := range config.C.BasicAuth { + if apiKey == v { + ok = true + break + } + } + + if !ok { + c.String(http.StatusUnauthorized, "unauthorized") + return + } + } + + var bs []byte + var err error + + if c.GetHeader("Content-Encoding") == "gzip" { + r, err := gzip.NewReader(c.Request.Body) + if err != nil { + c.String(400, err.Error()) + return + } + defer r.Close() + bs, err = ioutil.ReadAll(r) + } else { + defer c.Request.Body.Close() + bs, err = ioutil.ReadAll(c.Request.Body) + } + + if err != nil { + c.String(400, err.Error()) + return + } + + var series TimeSeries + err = json.Unmarshal(bs, &series) + if err != nil { + c.String(400, err.Error()) + return + } + + // TODO clean and convert + +} diff --git a/src/server/router/router_opentsdb.go b/src/server/router/router_opentsdb.go index 03077ead..1d3ca949 100644 --- a/src/server/router/router_opentsdb.go +++ b/src/server/router/router_opentsdb.go @@ -148,6 +148,11 @@ func handleOpenTSDB(c *gin.Context) { arr = []HTTPMetric{one} } + if err != nil { + c.String(400, err.Error()) + return + } + var ( succ int fail int From d57415d23d6f962c54f8e66d6cb7a116a5bc4f0b Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Tue, 28 Dec 2021 11:00:48 +0800 Subject: [PATCH 30/39] add datadog receiver --- src/server/router/router_datadog.go | 195 ++++++++++++++++++++++++++-- 1 file changed, 187 insertions(+), 8 deletions(-) diff --git a/src/server/router/router_datadog.go b/src/server/router/router_datadog.go index 10123942..08c2b9ac 100644 --- a/src/server/router/router_datadog.go +++ b/src/server/router/router_datadog.go @@ -3,25 +3,139 @@ package router import ( "compress/gzip" "encoding/json" + "fmt" "io/ioutil" "net/http" + "strings" + "time" "github.com/didi/nightingale/v5/src/server/config" + "github.com/didi/nightingale/v5/src/server/idents" + "github.com/didi/nightingale/v5/src/server/memsto" + promstat "github.com/didi/nightingale/v5/src/server/stat" + "github.com/didi/nightingale/v5/src/server/writer" "github.com/gin-gonic/gin" + "github.com/prometheus/common/model" + "github.com/prometheus/prometheus/prompb" ) type TimeSeries struct { - Series []*Metric `json:"series"` + Series []*DatadogMetric `json:"series"` } -type Metric struct { - Metric string `json:"metric"` - Points []Point `json:"points"` - Host string `json:"host"` - Tags []string `json:"tags,omitempty"` +type DatadogMetric struct { + Metric string `json:"metric"` + Points []DatadogPoint `json:"points"` + Host string `json:"host"` + Tags []string `json:"tags,omitempty"` } -type Point [2]float64 +type DatadogPoint [2]float64 + +func (m *DatadogMetric) Clean() error { + if m.Metric == "" { + return fmt.Errorf("metric is blank") + } + return nil +} + +func (m *DatadogMetric) ToProm() (*prompb.TimeSeries, string, error) { + pt := &prompb.TimeSeries{} + for _, point := range m.Points { + pt.Samples = append(pt.Samples, prompb.Sample{ + // use ms + Timestamp: int64(point[0]) * 1000, + Value: point[1], + }) + } + + if strings.IndexByte(m.Metric, '.') != -1 { + m.Metric = strings.ReplaceAll(m.Metric, ".", "_") + } + + if strings.IndexByte(m.Metric, '-') != -1 { + m.Metric = strings.ReplaceAll(m.Metric, "-", "_") + } + + if !model.MetricNameRE.MatchString(m.Metric) { + return nil, "", fmt.Errorf("invalid metric name: %s", m.Metric) + } + + pt.Labels = append(pt.Labels, &prompb.Label{ + Name: model.MetricNameLabel, + Value: m.Metric, + }) + + identInTag := "" + hostInTag := "" + + for i := 0; i < len(m.Tags); i++ { + arr := strings.SplitN(m.Tags[i], ":", 2) + if len(arr) != 2 { + continue + } + + key := arr[0] + + if key == "ident" { + // 如果tags中有ident,那就用 + identInTag = arr[1] + pt.Labels = append(pt.Labels, &prompb.Label{ + Name: key, + Value: arr[1], + }) + continue + } + + if key == "host" { + hostInTag = arr[1] + continue + } + + if strings.IndexByte(key, '.') != -1 { + key = strings.ReplaceAll(key, ".", "_") + } + + if strings.IndexByte(key, '-') != -1 { + key = strings.ReplaceAll(key, "-", "_") + } + + if !model.LabelNameRE.MatchString(key) { + return nil, "", fmt.Errorf("invalid tag name: %s", key) + } + + pt.Labels = append(pt.Labels, &prompb.Label{ + Name: key, + Value: arr[1], + }) + } + + if m.Host != "" { + // 以外层为准,外层host字段覆盖标签中的host + hostInTag = m.Host + } + + if hostInTag != "" { + if identInTag != "" { + pt.Labels = append(pt.Labels, &prompb.Label{ + Name: "host", + Value: hostInTag, + }) + } else { + pt.Labels = append(pt.Labels, &prompb.Label{ + Name: "ident", + Value: hostInTag, + }) + } + } + + ident := hostInTag + if identInTag != "" { + ident = identInTag + } + + return pt, ident, nil +} func datadogSeries(c *gin.Context) { apiKey, has := c.GetQuery("api_key") @@ -73,6 +187,71 @@ func datadogSeries(c *gin.Context) { return } - // TODO clean and convert + cnt := len(series.Series) + if cnt == 0 { + c.String(400, "series empty") + return + } + var ( + succ int + fail int + msg = "data pushed to queue" + list []interface{} + ts = time.Now().Unix() + ids = make(map[string]interface{}) + ) + + for i := 0; i < cnt; i++ { + item := series.Series[i] + + if item == nil { + continue + } + + if err = item.Clean(); err != nil { + fail++ + continue + } + + pt, ident, err := item.ToProm() + if err != nil { + fail++ + continue + } + + if ident != "" { + // register host + ids[ident] = ts + + // fill tags + target, has := memsto.TargetCache.Get(ident) + if has { + for key, value := range target.TagsMap { + pt.Labels = append(pt.Labels, &prompb.Label{ + Name: key, + Value: value, + }) + } + } + } + + list = append(list, pt) + succ++ + } + + if len(list) > 0 { + promstat.CounterSampleTotal.WithLabelValues(config.C.ClusterName, "datadog").Add(float64(len(list))) + if !writer.Writers.PushQueue(list) { + msg = "writer queue full" + } + + idents.Idents.MSet(ids) + } + + c.JSON(200, gin.H{ + "succ": succ, + "fail": fail, + "msg": msg, + }) } From 3700f7a10b0675504425df01fa380b355951ecd4 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Wed, 29 Dec 2021 14:52:22 +0800 Subject: [PATCH 31/39] update datadog url --- src/server/router/router.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/router/router.go b/src/server/router/router.go index a4bbfd51..3260a286 100644 --- a/src/server/router/router.go +++ b/src/server/router/router.go @@ -66,7 +66,7 @@ func configRoute(r *gin.Engine, version string) { }) // use apiKey not basic auth - r.POST("/datadog/v1/series", datadogSeries) + r.POST("/datadog/api/v1/series", datadogSeries) if len(config.C.BasicAuth) > 0 { auth := gin.BasicAuth(config.C.BasicAuth) From 904d09d91c24295b355ba66acf11920b057d5917 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Wed, 29 Dec 2021 14:59:05 +0800 Subject: [PATCH 32/39] add datadog deflate encoding --- src/server/router/router_datadog.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/server/router/router_datadog.go b/src/server/router/router_datadog.go index 08c2b9ac..9c9f5565 100644 --- a/src/server/router/router_datadog.go +++ b/src/server/router/router_datadog.go @@ -2,6 +2,7 @@ package router import ( "compress/gzip" + "compress/zlib" "encoding/json" "fmt" "io/ioutil" @@ -162,7 +163,9 @@ func datadogSeries(c *gin.Context) { var bs []byte var err error - if c.GetHeader("Content-Encoding") == "gzip" { + enc := c.GetHeader("Content-Encoding") + + if enc == "gzip" { r, err := gzip.NewReader(c.Request.Body) if err != nil { c.String(400, err.Error()) @@ -170,6 +173,14 @@ func datadogSeries(c *gin.Context) { } defer r.Close() bs, err = ioutil.ReadAll(r) + } else if enc == "deflate" { + r, err := zlib.NewReader(c.Request.Body) + if err != nil { + c.String(400, err.Error()) + return + } + defer r.Close() + bs, err = ioutil.ReadAll(r) } else { defer c.Request.Body.Close() bs, err = ioutil.ReadAll(c.Request.Body) From a56d6b568bfe9aac30f65fdeabad3635b6b938f5 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Thu, 30 Dec 2021 09:37:52 +0800 Subject: [PATCH 33/39] refactor log print --- src/server/writer/writer.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/server/writer/writer.go b/src/server/writer/writer.go index 58e1acca..195224e8 100644 --- a/src/server/writer/writer.go +++ b/src/server/writer/writer.go @@ -3,6 +3,7 @@ package writer import ( "bytes" "context" + "fmt" "net" "net/http" "time" @@ -44,6 +45,10 @@ type WriterType struct { } func (w WriterType) Write(items []*prompb.TimeSeries) { + if len(items) == 0 { + return + } + req := &prompb.WriteRequest{ Timeseries: items, } @@ -56,6 +61,7 @@ func (w WriterType) Write(items []*prompb.TimeSeries) { if err := w.Post(snappy.Encode(nil, data)); err != nil { logger.Warningf("post to %s got error: %v", w.Opts.Url, err) + logger.Warning("example timeseries:", items[0].String()) } } @@ -82,7 +88,7 @@ func (w WriterType) Post(req []byte) error { } if resp.StatusCode >= 400 { - logger.Warningf("push data with remote write request got status code: %v, response body: %s", resp.StatusCode, string(body)) + err = fmt.Errorf("push data with remote write request got status code: %v, response body: %s", resp.StatusCode, string(body)) return err } From e9ce67964952bd938534ddbf5b4f776b1431ed1a Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 31 Dec 2021 11:13:57 +0800 Subject: [PATCH 34/39] handle python2 encoding --- etc/script/notify.py | 3 +++ src/server/router/router_datadog.go | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/etc/script/notify.py b/etc/script/notify.py index e06c5fe8..bd240cbd 100755 --- a/etc/script/notify.py +++ b/etc/script/notify.py @@ -6,6 +6,9 @@ import urllib2 import smtplib from email.mime.text import MIMEText +reload(sys) +sys.setdefaultencoding('utf8') + notify_channel_funcs = { "email":"email", "sms":"sms", diff --git a/src/server/router/router_datadog.go b/src/server/router/router_datadog.go index 9c9f5565..996238c0 100644 --- a/src/server/router/router_datadog.go +++ b/src/server/router/router_datadog.go @@ -42,11 +42,11 @@ func (m *DatadogMetric) Clean() error { func (m *DatadogMetric) ToProm() (*prompb.TimeSeries, string, error) { pt := &prompb.TimeSeries{} - for _, point := range m.Points { + for i := 0; i < len(m.Points); i++ { pt.Samples = append(pt.Samples, prompb.Sample{ // use ms - Timestamp: int64(point[0]) * 1000, - Value: point[1], + Timestamp: int64(m.Points[i][0]) * 1000, + Value: m.Points[i][1], }) } From b693e80d757dc2b5d14ebe13de698d3383b137f9 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 31 Dec 2021 12:07:23 +0800 Subject: [PATCH 35/39] check basicauth --- src/webapi/router/router.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/webapi/router/router.go b/src/webapi/router/router.go index 943a89d8..991f032e 100644 --- a/src/webapi/router/router.go +++ b/src/webapi/router/router.go @@ -231,7 +231,10 @@ func configRoute(r *gin.Engine, version string) { pages.PUT("/busi-group/:id/task/*url", jwtAuth(), user(), perm("/job-tasks/put"), bgrw(), taskProxy) } - service := r.Group("/v1/n9e", gin.BasicAuth(config.C.BasicAuth)) + service := r.Group("/v1/n9e") + if len(config.C.BasicAuth) > 0 { + service.Use(gin.BasicAuth(config.C.BasicAuth)) + } { service.Any("/prometheus/*url", prometheusProxy) service.POST("/users", userAddPost) From 2740af357155196e8b8d2538190d99b65ff9c43f Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 31 Dec 2021 13:45:54 +0800 Subject: [PATCH 36/39] add arch.png --- README.md | 19 +++++++++++-------- doc/img/arch.png | Bin 0 -> 202738 bytes 2 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 doc/img/arch.png diff --git a/README.md b/README.md index d1942535..cdfc1b3e 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,16 @@ -## 简介 +## Introduction -Nightingale, Prometheus enterprise edition +Nightingale, Prometheus enterprise edition. +## Architecture -## 文档 +![n9e-architecture](doc/img/arch.png) -- 国外:[https://n9e.github.io/](https://n9e.github.io/) -- 国内:[https://n9e.gitee.io/](https://n9e.gitee.io/) -- 老版:[https://gitee.com/n9e/book/tree/master/content/v4/docs](https://gitee.com/n9e/book/tree/master/content/v4/docs) +## Docs + +- github: [https://n9e.github.io/](https://n9e.github.io/) +- gitee: [https://n9e.gitee.io/](https://n9e.gitee.io/) +- version 4: [https://n9e.didiyun.com/](https://n9e.didiyun.com/) ## TODO @@ -20,6 +23,6 @@ Nightingale, Prometheus enterprise edition - [ ] support pushgateway api -## 大本营 +## Have questions? -微信公众号:`__n9e__`(夜莺监控),回复“加群”可以加入交流群,回复“星球”可加入知识星球提问题 + diff --git a/doc/img/arch.png b/doc/img/arch.png new file mode 100644 index 0000000000000000000000000000000000000000..5c765831378711df7129acae56730991db3b97e8 GIT binary patch literal 202738 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 Z*7leE<>k Date: Fri, 31 Dec 2021 13:49:14 +0800 Subject: [PATCH 37/39] refactor --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cdfc1b3e..10763dd1 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Nightingale, Prometheus enterprise edition. - github: [https://n9e.github.io/](https://n9e.github.io/) - gitee: [https://n9e.gitee.io/](https://n9e.gitee.io/) -- version 4: [https://n9e.didiyun.com/](https://n9e.didiyun.com/) +- v4(old version): [https://n9e.didiyun.com/](https://n9e.didiyun.com/) ## TODO @@ -25,4 +25,4 @@ Nightingale, Prometheus enterprise edition. ## Have questions? - +[Click me](https://s3-gz01.didistatic.com/n9e-pub/image/n9e-wx.png) From 843e37b99d50a5f37aed42183a4c9ec6beaefb78 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 31 Dec 2021 13:50:12 +0800 Subject: [PATCH 38/39] code refactor --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 10763dd1..22f3a8e3 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,6 @@ Nightingale, Prometheus enterprise edition. - [ ] support pushgateway api -## Have questions? +## Any questions? [Click me](https://s3-gz01.didistatic.com/n9e-pub/image/n9e-wx.png) From 7b4eddc967ac091113d7229d28fc95aacf799064 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Fri, 31 Dec 2021 13:52:44 +0800 Subject: [PATCH 39/39] code refactor --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 22f3a8e3..48fc2479 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## Introduction -Nightingale, Prometheus enterprise edition. +💡 A Distributed and High-Performance Monitoring System. Prometheus enterprise edition. ## Architecture