Skip to content

Commit f328872

Browse files
author
jikun.zhang
committed
新增随机轮询开关和zabbix默认填充地址等参数
1 parent 98fad34 commit f328872

43 files changed

Lines changed: 315 additions & 207 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.MD

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
PrometheusAlert是开源的运维告警中心消息转发系统,支持主流的监控系统Prometheus、Zabbix,日志系统Graylog2,Graylog3、数据可视化系统Grafana、SonarQube。阿里云-云监控,以及所有支持WebHook接口的系统发出的预警消息,支持将收到的这些消息发送到钉钉,微信,email,飞书,腾讯短信,腾讯电话,阿里云短信,阿里云电话,华为短信,百度云短信,容联云电话,七陌短信,七陌语音,TeleGram,百度Hi(如流)等。
2020

21-
![it](https://gitee.com/feiyu563/PrometheusAlert/raw/master/doc/it.png)
21+
![it](doc/it.png)
2222

2323
-----------------
2424
* 如果这个项目能为您带来帮助,我将感到非常荣幸!同时非常欢迎您加入PrometheusAlert全家桶的微信群一起探讨关于PrometheusAlert新一期的开发计划。
@@ -33,9 +33,9 @@ PrometheusAlert是开源的运维告警中心消息转发系统,支持主流
3333

3434
```
3535
#打开PrometheusAlert releases页面,根据需要选择需要的版本下载到本地解压并进入解压后的目录
36-
如linux版本(https://github.com/feiyu563/PrometheusAlert/releases/download/v4.4.0/linux.zip)
36+
如linux版本(https://github.com/feiyu563/PrometheusAlert/releases/download/v4.6.0/linux.zip)
3737
38-
# wget https://github.com/feiyu563/PrometheusAlert/releases/download/v4.4.0/linux.zip && unzip linux.zip &&cd linux/
38+
# wget https://github.com/feiyu563/PrometheusAlert/releases/download/v4.6.0/linux.zip && unzip linux.zip &&cd linux/
3939
4040
#运行PrometheusAlert
4141
# ./PrometheusAlert (#后台运行请执行 nohup ./PrometheusAlert &)
@@ -50,9 +50,9 @@ PrometheusAlert是开源的运维告警中心消息转发系统,支持主流
5050

5151
-----------------
5252

53-
![dashboard](https://gitee.com/feiyu563/PrometheusAlert/raw/master/doc/dashboard.png)
54-
![dashboard-test](https://gitee.com/feiyu563/PrometheusAlert/raw/master/doc/dashboard-test.png)
55-
![dashboard-tpl-list](https://gitee.com/feiyu563/PrometheusAlert/raw/master/doc/dashboard-tpl-list.png)
53+
![dashboard](doc/dashboard.png)
54+
![dashboard-test](doc/dashboard-test.png)
55+
![dashboard-tpl-list](doc/dashboard-tpl-list.png)
5656

5757
--------------------------------------
5858

@@ -70,6 +70,7 @@ PrometheusAlert具备如下特性
7070
- 增加支持mysql、sqlite3(默认)、postgres作为模版存储,便于集群化部署
7171
- 增加支持钉钉,企业微信的@某人功能
7272
- 增加支持阿里云-云监控告警
73+
- 增加随机轮询,目前仅针对ddurl,fsurl,wxurl有效,默认情况下如果上述Url配置的是多个地址,则多个地址全部发送,如开启该选项,则从多个地址中随机取一个地址发送,主要是为了避免消息发送频率过高导致触发部分机器人拦截消息
7374

7475
---------------------
7576

@@ -88,9 +89,6 @@ PrometheusAlert具备如下特性
8889

8990
## PrometheusAlert全家桶新手入门
9091

91-
文档阅读提示
92-
93-
9492
* [【PrometheusAlert安装及配置说明】](doc/readme/install.md)
9593
* [安装部署PrometheusAlert](doc/readme/install.md)
9694
* [接口说明](doc/readme/restful.md)
@@ -128,17 +126,28 @@ PrometheusAlert具备如下特性
128126
* [【如何对PrometheusAlert进行二次开发】](https://github.com/feiyu563/PrometheusAlert/wiki/%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E3%80%90PrometheusAlert%E3%80%91%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91)
129127
* [通用自定义模板共享链接](https://github.com/feiyu563/PrometheusAlert/issues/30)
130128
* [Prometheus rules共享链接](https://github.com/feiyu563/PrometheusAlert/issues/89)
129+
* [【如何捐赠】](doc/readme/donate.md)
131130

132131
--------------------------------------
133132

134133
项目源码
134+
135135
----
136136

137137
- [【GitHub】: PrometheusAlert](https://github.com/feiyu563/PrometheusAlert)
138138
- [【码云】: PrometheusAlert](https://gitee.com/feiyu563/PrometheusAlert)
139+
140+
---
141+
142+
加入PrometheusAlert微信交流群
139143

140-
【FOR HELP】
141144
----
142-
【Email: 244217140@qq.com
143145

144-
![me](https://gitee.com/feiyu563/PrometheusAlert/raw/master/doc/wx.png)
146+
147+
![me](doc/wx.png)
148+
149+
---
150+
151+
Email: 244217140@qq.com
152+
153+
----

controllers/prometheus.go

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ type Annotations struct {
3838
Email string `json:"email"` //2020年7月4日 10:15:20 增加多个email告警支持
3939
Groupid string `json:"groupid"` //2021年2月2日 17:28:23 增加多个如流告警支持
4040
AtSomeOne string `json:"at"` //2021年6月23日 14:02:21 增加@某人支持
41+
Rr string `json:"rr"` //2021年9月14日 14:48:08 增加随机轮询参数支持
4142
}
4243
type Alerts struct {
4344
Status string
@@ -171,14 +172,22 @@ func SendMessageR(message Prometheus, rwxurl, rddurl, rfsurl, rphone, remail, rg
171172
} else {
172173
if rddurl != "" {
173174
Ddurl := strings.Split(rddurl, ",")
174-
for _, url := range Ddurl {
175-
PostToDingDing(Title+titleend, ddtext, url, RMessage.Annotations.AtSomeOne, logsign)
175+
if RMessage.Annotations.Rr == "true" {
176+
PostToDingDing(Title+titleend, ddtext, DoBalance(Ddurl), RMessage.Annotations.AtSomeOne, logsign)
177+
} else {
178+
for _, url := range Ddurl {
179+
PostToDingDing(Title+titleend, ddtext, url, RMessage.Annotations.AtSomeOne, logsign)
180+
}
176181
}
177182
}
178183
if RMessage.Annotations.Ddurl != "" {
179184
Ddurl := strings.Split(RMessage.Annotations.Ddurl, ",")
180-
for _, url := range Ddurl {
181-
PostToDingDing(Title+titleend, ddtext, url, RMessage.Annotations.AtSomeOne, logsign)
185+
if RMessage.Annotations.Rr == "true" {
186+
PostToDingDing(Title+titleend, ddtext, DoBalance(Ddurl), RMessage.Annotations.AtSomeOne, logsign)
187+
} else {
188+
for _, url := range Ddurl {
189+
PostToDingDing(Title+titleend, ddtext, url, RMessage.Annotations.AtSomeOne, logsign)
190+
}
182191
}
183192
}
184193
}
@@ -203,14 +212,22 @@ func SendMessageR(message Prometheus, rwxurl, rddurl, rfsurl, rphone, remail, rg
203212
} else {
204213
if rwxurl != "" {
205214
Wxurl := strings.Split(rwxurl, ",")
206-
for _, url := range Wxurl {
207-
PostToWeiXin(wxtext, url, RMessage.Annotations.AtSomeOne, logsign)
215+
if RMessage.Annotations.Rr == "true" {
216+
PostToWeiXin(wxtext, DoBalance(Wxurl), RMessage.Annotations.AtSomeOne, logsign)
217+
} else {
218+
for _, url := range Wxurl {
219+
PostToWeiXin(wxtext, url, RMessage.Annotations.AtSomeOne, logsign)
220+
}
208221
}
209222
}
210223
if RMessage.Annotations.Wxurl != "" {
211224
Wxurl := strings.Split(RMessage.Annotations.Wxurl, ",")
212-
for _, url := range Wxurl {
213-
PostToWeiXin(wxtext, url, RMessage.Annotations.AtSomeOne, logsign)
225+
if RMessage.Annotations.Rr == "true" {
226+
PostToWeiXin(wxtext, DoBalance(Wxurl), RMessage.Annotations.AtSomeOne, logsign)
227+
} else {
228+
for _, url := range Wxurl {
229+
PostToWeiXin(wxtext, url, RMessage.Annotations.AtSomeOne, logsign)
230+
}
214231
}
215232
}
216233
}
@@ -221,14 +238,22 @@ func SendMessageR(message Prometheus, rwxurl, rddurl, rfsurl, rphone, remail, rg
221238
} else {
222239
if rfsurl != "" {
223240
Fsurl := strings.Split(rfsurl, ",")
224-
for _, url := range Fsurl {
225-
PostToFS(Title+titleend, fstext, url, RMessage.Annotations.AtSomeOne, logsign)
241+
if RMessage.Annotations.Rr == "true" {
242+
PostToFS(Title+titleend, fstext, DoBalance(Fsurl), RMessage.Annotations.AtSomeOne, logsign)
243+
} else {
244+
for _, url := range Fsurl {
245+
PostToFS(Title+titleend, fstext, url, RMessage.Annotations.AtSomeOne, logsign)
246+
}
226247
}
227248
}
228249
if RMessage.Annotations.Fsurl != "" {
229250
Fsurl := strings.Split(RMessage.Annotations.Fsurl, ",")
230-
for _, url := range Fsurl {
231-
PostToFS(Title+titleend, fstext, url, RMessage.Annotations.AtSomeOne, logsign)
251+
if RMessage.Annotations.Rr == "true" {
252+
PostToFS(Title+titleend, fstext, DoBalance(Fsurl), RMessage.Annotations.AtSomeOne, logsign)
253+
} else {
254+
for _, url := range Fsurl {
255+
PostToFS(Title+titleend, fstext, url, RMessage.Annotations.AtSomeOne, logsign)
256+
}
232257
}
233258
}
234259
}

controllers/prometheusalert.go

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"encoding/json"
88
"strings"
99
"text/template"
10-
1110
"github.com/astaxie/beego"
1211
"github.com/astaxie/beego/logs"
1312
)
@@ -120,6 +119,7 @@ func (c *PrometheusAlertController) PrometheusAlert() {
120119
P_groupid = beego.AppConfig.String("BDRL_ID")
121120
}
122121
P_atsomeone := c.Input().Get("at")
122+
P_rr:=c.Input().Get("rr")
123123
//get tpl
124124
message := ""
125125
funcMap := template.FuncMap{
@@ -140,7 +140,7 @@ func (c *PrometheusAlertController) PrometheusAlert() {
140140
message = err.Error()
141141
} else {
142142
tpl.Execute(buf, p_json)
143-
message = SendMessagePrometheusAlert(buf.String(), P_type, P_ddurl, P_wxurl, P_fsurl, P_webhookurl, P_phone, P_email, P_touser, P_toparty, P_totag, P_groupid, P_atsomeone, logsign)
143+
message = SendMessagePrometheusAlert(buf.String(), P_type, P_ddurl, P_wxurl, P_fsurl, P_webhookurl, P_phone, P_email, P_touser, P_toparty, P_totag, P_groupid, P_atsomeone,P_rr,logsign)
144144
}
145145
} else {
146146
message = "接口参数缺失!"
@@ -150,37 +150,53 @@ func (c *PrometheusAlertController) PrometheusAlert() {
150150
c.ServeJSON()
151151
}
152152

153-
func SendMessagePrometheusAlert(message, ptype, pddurl, pwxurl, pfsurl, pwebhookurl, pphone, email, ptouser, ptoparty, ptotag, pgroupid, patsomeone, logsign string) string {
153+
func SendMessagePrometheusAlert(message, ptype, pddurl, pwxurl, pfsurl, pwebhookurl, pphone, email, ptouser, ptoparty, ptotag, pgroupid, patsomeone,prr, logsign string) string {
154154
Title := beego.AppConfig.String("title")
155155
ret := ""
156156
model.AlertsFromCounter.WithLabelValues("PrometheusAlert", message, "", "", "").Add(1)
157157
switch ptype {
158158
//微信渠道
159159
case "wx":
160160
Wxurl := strings.Split(pwxurl, ",")
161-
for _, url := range Wxurl {
162-
ret += PostToWeiXin(message, url, patsomeone, logsign)
161+
if prr=="true" {
162+
ret += PostToWeiXin(message, DoBalance(Wxurl), patsomeone, logsign)
163+
} else {
164+
for _, url := range Wxurl {
165+
ret += PostToWeiXin(message, url, patsomeone, logsign)
166+
}
163167
}
164168

165169
//钉钉渠道
166170
case "dd":
167171
Ddurl := strings.Split(pddurl, ",")
168-
for _, url := range Ddurl {
169-
ret += PostToDingDing(Title+"告警消息", message, url, patsomeone, logsign)
172+
if prr=="true" {
173+
ret += PostToDingDing(Title+"告警消息", message, DoBalance(Ddurl), patsomeone, logsign)
174+
} else {
175+
for _, url := range Ddurl {
176+
ret += PostToDingDing(Title+"告警消息", message, url, patsomeone, logsign)
177+
}
170178
}
171179

172180
//飞书渠道
173181
case "fs":
174182
Fsurl := strings.Split(pfsurl, ",")
175-
for _, url := range Fsurl {
176-
ret += PostToFS(Title+"告警消息", message, url, patsomeone, logsign)
183+
if prr=="true" {
184+
ret += PostToFS(Title+"告警消息", message, DoBalance(Fsurl), patsomeone, logsign)
185+
} else {
186+
for _, url := range Fsurl {
187+
ret += PostToFS(Title+"告警消息", message, url, patsomeone, logsign)
188+
}
177189
}
178190

179191
//Webhook渠道
180192
case "webhook":
181193
Fwebhookurl := strings.Split(pwebhookurl, ",")
182-
for _, url := range Fwebhookurl {
183-
ret += PostToWebhook(message, url, logsign)
194+
if prr=="true" {
195+
ret += PostToWebhook(message, DoBalance(Fwebhookurl), logsign)
196+
} else {
197+
for _, url := range Fwebhookurl {
198+
ret += PostToWebhook(message, url, logsign)
199+
}
184200
}
185201

186202
//腾讯云短信

controllers/public.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"strconv"
77
"strings"
88
"time"
9-
9+
"math/rand"
1010
"github.com/astaxie/beego"
1111
"github.com/astaxie/beego/logs"
1212
)
@@ -105,3 +105,15 @@ func GetUserPhone(neednum int) string {
105105
}
106106
return Num
107107
}
108+
109+
// 随机返回
110+
func DoBalance(instances []string) string {
111+
if len(instances) == 0 {
112+
logs.Error( "no instances for rand")
113+
return ""
114+
}
115+
lens := len(instances)
116+
index := rand.Intn(lens)
117+
inst := instances[index]
118+
return inst
119+
}

controllers/zabbix.go

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,48 +35,87 @@ func SendMessageZabbix(message ZabbixMessage, logsign string) string {
3535
switch message.ZabbixType {
3636
//微信渠道
3737
case "wx":
38-
ret = PostToWeiXin(message.ZabbixMessage, message.ZabbixTarget, "", logsign)
38+
if message.ZabbixTarget=="" {
39+
message.ZabbixTarget=beego.AppConfig.String("wxurl")
40+
}
41+
ret = PostToWeiXin(message.ZabbixMessage, message.ZabbixTarget, "",logsign)
3942
//钉钉渠道
4043
case "dd":
41-
ret = PostToDingDing("Zabbix告警消息", message.ZabbixMessage, message.ZabbixTarget, "", logsign)
42-
//飞书v1渠道
44+
if message.ZabbixTarget=="" {
45+
message.ZabbixTarget=beego.AppConfig.String("ddurl")
46+
}
47+
ret = PostToDingDing("Zabbix告警消息", message.ZabbixMessage, message.ZabbixTarget, "",logsign)
48+
//飞书渠道
4349
case "fs":
44-
ret = PostToFS("Zabbix告警消息", message.ZabbixMessage, message.ZabbixTarget, "", logsign)
50+
if message.ZabbixTarget=="" {
51+
message.ZabbixTarget=beego.AppConfig.String("fsurl")
52+
}
53+
ret = PostToFS("Zabbix告警消息", message.ZabbixMessage, message.ZabbixTarget, "",logsign)
4554
//腾讯云短信
4655
case "txdx":
56+
if message.ZabbixTarget=="" {
57+
message.ZabbixTarget=GetUserPhone(1)
58+
}
4759
ret = PostTXmessage(message.ZabbixMessage, message.ZabbixTarget, logsign)
4860
//华为云短信
4961
case "hwdx":
62+
if message.ZabbixTarget=="" {
63+
message.ZabbixTarget=GetUserPhone(1)
64+
}
5065
ret = ret + PostHWmessage(message.ZabbixMessage, message.ZabbixTarget, logsign)
5166
//百度云短信
5267
case "bddx":
68+
if message.ZabbixTarget=="" {
69+
message.ZabbixTarget=GetUserPhone(1)
70+
}
5371
ret = ret + PostBDYmessage(message.ZabbixMessage, message.ZabbixTarget, logsign)
5472
//阿里云短信
5573
case "alydx":
74+
if message.ZabbixTarget=="" {
75+
message.ZabbixTarget=GetUserPhone(1)
76+
}
5677
ret = ret + PostALYmessage(message.ZabbixMessage, message.ZabbixTarget, logsign)
5778
//腾讯云电话
5879
case "txdh":
80+
if message.ZabbixTarget=="" {
81+
message.ZabbixTarget=GetUserPhone(1)
82+
}
5983
ret = PostTXphonecall(message.ZabbixMessage, message.ZabbixTarget, logsign)
6084
//阿里云电话
6185
case "alydh":
86+
if message.ZabbixTarget=="" {
87+
message.ZabbixTarget=GetUserPhone(1)
88+
}
6289
ret = ret + PostALYphonecall(message.ZabbixMessage, message.ZabbixTarget, logsign)
6390
//容联云电话
6491
case "rlydh":
92+
if message.ZabbixTarget=="" {
93+
message.ZabbixTarget=GetUserPhone(1)
94+
}
6595
ret = ret + PostRLYphonecall(message.ZabbixMessage, message.ZabbixTarget, logsign)
6696
//7mo短信
6797
case "7moordx":
98+
if message.ZabbixTarget=="" {
99+
message.ZabbixTarget=GetUserPhone(1)
100+
}
68101
ret = ret + Post7MOORmessage(message.ZabbixMessage, message.ZabbixTarget, logsign)
69102
//7mo电话
70103
case "7moordh":
104+
if message.ZabbixTarget=="" {
105+
message.ZabbixTarget=GetUserPhone(1)
106+
}
71107
ret = ret + Post7MOORphonecall(message.ZabbixMessage, message.ZabbixTarget, logsign)
72108
//telegram
73109
case "tg":
74110
ret = ret + SendTG(message.ZabbixMessage, logsign)
75111
//workwechat
76112
case "workwechat":
77-
ret = ret + SendWorkWechat(beego.AppConfig.String("WorkWechat_ToUser"), beego.AppConfig.String("WorkWechat_ToParty"), beego.AppConfig.String("WorkWechat_ToTag"), message.ZabbixMessage, logsign)
113+
ret = ret + SendWorkWechat(beego.AppConfig.String("WorkWechat_ToUser"),beego.AppConfig.String("WorkWechat_ToParty"), beego.AppConfig.String("WorkWechat_ToTag"),message.ZabbixMessage, logsign)
78114
//百度Hi(如流)
79115
case "rl":
116+
if message.ZabbixTarget=="" {
117+
message.ZabbixTarget=beego.AppConfig.String("BDRL_URL")
118+
}
80119
ret = PostToRuLiu(beego.AppConfig.String("BDRL_ID"), message.ZabbixMessage, message.ZabbixTarget, logsign)
81120
//异常参数
82121
default:

db/PrometheusAlertDB.db

0 Bytes
Binary file not shown.

doc/addchannel2.png

46.3 KB
Loading

doc/grafanaalert3.png

83.1 KB
Loading

doc/graylog5.png

87.7 KB
Loading

doc/readme/aliyun.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ ALY_DH_TtsCode=xxxxxxxx
4545
```
4646
开通阿里云语音服务,并进行资质管理认证,添加语音通知模板(建议模板内容使用中文,阿里云语音服务朗读会比较清晰)
4747

48-
![aliyun01](https://gitee.com/feiyu563/PrometheusAlert/raw/master/doc/aliyun-01.png)
48+
![aliyun01](../aliyun-01.png)
4949

5050
在AlertTemplate中创建阿里云电话通知模板,内容可参照如图(appname为我自定义标签,可修改为自己的定义的标签)
5151

52-
![aliyun02](https://gitee.com/feiyu563/PrometheusAlert/raw/master/doc/aliyun-02.png)
52+
![aliyun02](../aliyun-02.png)
5353

5454
在prometheus中添加rules,如下(description为语音朗读内容)
5555

0 commit comments

Comments
 (0)