准備工作
| 軟件名稱 |
安裝節點 |
操作系統 |
上傳目錄 |
安裝目錄 |
| AlertManager |
td1.test.com |
Centos7 |
/opt/software |
/opt/programFiles |
| TDengineAlert |
1.AlertManager安裝
1.1下載包
從下載網址:https://prometheus.io/download/,下載包【alertmanager-0.22.2.linux-amd64.tar.gz】
1.2解壓包
cd /opt/software/ tar zxvf alertmanager-0.22.2.linux-amd64.tar.gz -C /opt/programFiles/
1.3啟動
cd /opt/programFiles/alertmanager-0.22.2.linux-amd64 ./alertmanager --config.file=alertmanager.yml
1.4驗證
在網址輸入192.168.137.101:9030,可以訪問到以下頁面

2.TDengineAlert安裝
2.1下載包
從網址https://www.taosdata.com/cn/all-downloads/ 下載包【TDengine-alert-2.1.2.0-Linux-x64.tar.gz】
2.2解壓包
cd /opt/software tar zvxf TDengine-alert-2.1.2.0-Linux-x64.tar.gz -C /opt/programFiles
2.3配置
cd /opt/programFiles/TDengine-alert/ vim alert.cfg
修改alert.cfg文件
{
"port": 8100,
"database": "file:alert.db",
"TDengine": "root:taosdata@/tcp(127.0.0.1:0)/",
"log": {
"level": "production",
"path": "alert.log"
},
"receivers": {
"alertManager": "http://127.0.0.1:9093/api/v1/alerts"
}
}
# database:sqlite數據庫,本地用來保存告警規則
# TDengine:數據庫連接信息
# log>level:日志記錄級別
# log>path:日志路徑
# receivers>alertManager:報警模塊將報警信息推送到AlertManager,# 這里是AlertManager地址。
2.4啟動
./alert -cfg alert.cfg
2.5配置告警規則
配置告警規則rules.json,然后執行保存規則命令curl -d '@rule1.json' http://localhost:8100/api/update-rule即可
{
"name": "pm2.5",
"sql": "select avg(measured_value) as avgVal from db_transfer_platform.s_dust_history_data where ts > now - 1d and signal_code = '18113001' group by device_code",
"expr": "avgVal > 2.5",
"for": "10s",
"period": "1s",
"labels": {
"ruleName": "pm2.5"
},
"annotations": {
"summary": "設備編號:{{$values.device_code}}在過去1天,pm2.5的平均值超過標准,值為{{$values.avgVal}}"
}
}
# name:指定規則唯一的名字
# sql:查詢數據時使用的sql語句
# expr:計算結果為布爾型的表達式,如果為true,則進入報警狀態
# period:規則檢查周期,默認1分鍾
# for:時間長度,當布爾表達式結果為true持續的時間
# labels:人為指定的標簽列表,標簽在生成報警信息時引用
# annotations:用於定義報警信息
# 保存規則命令 curl -d '@pm2.5.json' http://localhost:8100/api/update-rule # 查詢規則命令 curl http://localhost:8100/api/list-rule # 刪除規則命令 curl -X DELETE http://localhost:8100/api/delete-rule?name=pm2.5 # 恢復或掛起命令: curl -X POST http://localhost:8100/api/enable-rule?name=pm2.5&enable=true curl -X POST http://localhost:8100/api/enable-rule?name=pm2.5&enable=false
2.6驗證
(1)在TDengine數據庫中插入數據
insert into pm_25_1003055 (ts,measured_value,id) values(now-1h,7.0,10103);
(2)數據庫查詢結果
select avg(measured_value) as avgVal from db_transfer_platform.s_dust_history_data where ts > now - 1d and signal_code = '18113001' group by device_code ;

(3)在頁面192.168.137.101:9030可以查看到告警信息

3.告警模塊測試
3.1將告警信息推送至郵件
測試發送到QQ郵箱
(0)准備工作
QQ郵箱設置授權碼,參考網址:https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
(1)配置文件
修改配置文件alertmanager.yml
global:
resolve_timeout: 5m # 經過此時間后,如果尚未更新告警,則將告警聲明為已恢復。(沒有向alertmanager發送告警了)
# smtp配置
smtp_from: "A@qq.com" # 發送郵件主題
smtp_smarthost: 'smtp.qq.com:465' # 郵箱服務器的SMTP主機配置
smtp_auth_username: "A@qq.com" # 登錄用戶名
smtp_auth_password: "auth password" # 此處的auth password是郵箱的第三方登錄授權密碼,而非用戶密碼,盡量用QQ來測試。
smtp_require_tls: false # 有些郵箱需要開啟此配置,這里使用的是qq郵箱,僅做測試,不需要開啟此功能。
route:
receiver: ops
group_wait: 30s # 在組內等待所配置的時間,如果同組內,30秒內出現相同報警,在一個組內出現。
group_interval: 1m # 如果組內內容不變化,合並為一條警報信息,1m后發送。
repeat_interval: 1m # 發送報警間隔,如果指定時間內沒有修復,則重新發送報警。
group_by: [ruleName] # 報警分組
# 接收器指定發送人以及發送渠道
receivers:
# ops分組的定義
- name: ops
email_configs:
- to: 'B@qq.com,C@qq.com' # 如果想發送多個人就以 ','做分割,寫多個郵件人即可。
send_resolved: true
headers:
from: "警報中心"
subject: "[operations] 報警郵件"
to: "工作人員"
(3)測試
#啟動alertManager cd /opt/programFiles/alertmanager-0.22.2.linux-amd64 ./alertmanager --config.file=alertmanager.yml #啟動TDengine Alert cd /opt/programFiles/TDengine-alert/ ./alert -cfg alert.cfg
insert into pm_25_1003055 (ts,measured_value,id) values(now-1h,7.0,10103);
可接收到郵件信息

3.2將告警信息推送至釘釘群
(1)准備工作
在釘釘群中添加機器人
步驟一、選擇一個釘釘群,選擇“群設置”
![]()
步驟二、進入“群設置”后,選擇“智能群助手”

步驟三、然后點擊“+”,添加機器人,並選擇“自定義(通過webhook接入自定義服務)”



步驟四、添加機器人,需要進行安全設置(3種必須選擇1種,測試中選擇的是自定義關鍵詞,參考網址:https://developers.dingtalk.com/document/robots/customize-robot-security-settings),完成后,將會生成一個webhook的地址,后面將會用到。


(2)配置文件
修改配置文件alertmanager.yml
global: resolve_timeout: 5m route: group_by: ['ruleName'] group_wait: 30s group_interval: 1m repeat_interval: 1h receiver: 'web.hook' receivers: - name: 'web.hook' webhook_configs: - url: 'http://192.168.40.86:8090/webHookContrl/warn'
(3)后台java代碼
//Controller層
@Controller
@RequestMapping("/webHookContrl")
public class WebHookController {
private final WebHookService service;
@Autowired
public WebHookController(WebHookServiceImpl service) {
this.service = service;
}
@RequestMapping(value = "/warn",produces = "application/json;charset=UTF-8")
public Result warn(@RequestBody String requestBody){
return service.warnDingDing(requestBody) ? new Result() : new Result(ResultErrorEnum.REQUEST_THIRD_PART_ERROR);
}
}
//Service層
public class WebHookServiceImpl implements WebHookService {
@Override
public boolean warnDingDing(String requestBody){
JSONObject object = JSONObject.parseObject(requestBody);
//保存告警信息
List<String> warns = new ArrayList<>();
if(object.containsKey(WebHookConstant.ALERTS)){
JSONArray alerts = object.getJSONArray(WebHookConstant.ALERTS);
alerts.forEach(alert->{
JSONObject json = (JSONObject) alert;
JSONObject annotations = (JSONObject)json.get("annotations");
String summary = annotations.getString("summary");
warns.add(summary);
});
}
return postToDingDing(warns);
}
public boolean postToDingDing(List<String> warns){
String address = WebHookConstant.DINGDING_URL;
long timestamp = System.currentTimeMillis();
String uri = "?access_token=" + WebHookConstant.DINGDING_TOKEN ;
JSONObject object = new JSONObject();
object.put("msgtype","markdown");
JSONObject markdown = new JSONObject();
markdown.put("title","告警信息");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < warns.size(); i++) {
if(i != warns.size()-1){
sb.append(i+1).append(".").append(warns.get(i)).append(" \n\n ");
}else{
sb.append(i+1).append(".").append(warns.get(i));
}
}
markdown.put("text",sb.toString());
JSONObject at = new JSONObject();
at.put("isAtAll",true);
String[] mobiles = {"15974279816"};
at.put("atMobiles",mobiles);
markdown.put("at",at);
object.put("markdown",markdown);
String requestBody = object.toJSONString();
HttpResponse post = HttpUtils.post(address, uri, requestBody, null);
int statusCode = post.getStatusLine().getStatusCode();
return statusCode == 0 ? true : false;
}
(4)測試
#啟動alertManager cd /opt/programFiles/alertmanager-0.22.2.linux-amd64 ./alertmanager --config.file=alertmanager.yml #啟動TDengine Alert cd /opt/programFiles/TDengine-alert/ ./alert -cfg alert.cfg
在數據庫中插入模擬數據
insert into pm_25_1003055 (ts,measured_value,id) values(now-1h,7.0,10103);
測試釘釘界面如下

3.3將告警信息推送至企業微信
(1)准備工作
申請企業微信,並保留AgentId, Secret, 企業ID和部門ID。



(2)配置文件
第一步、配置alertmanager.yml
global:
wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' # 請勿修改
wechat_api_corp_id: 'xxx' # 企業ID
templates:
- '.../conf/*.tmpl' # wechat.tmpl 消息模板的位置
route:
receiver: "wechat" # 和下面 receivers.name 一致
group_by: ['env','instance','alertname','type','group','job']
group_wait: 30s
group_interval: 3m
repeat_interval: 3m
routes:
receivers:
- name: 'wechat'
wechat_configs:
- send_resolved: true # 是否發生 resolved 消息
to_user: '@all' # 所有用戶
message: '{{ template "wechat.default.message" . }}' # 使用消息模板
agent_id: '1000002' # 應用的 AgentId
api_secret: 'xxx' # 應用的 Secret
第二步、配置微信模板
## wechat模板
{{ define "wechat.default.message" }}
{{ if gt (len .Alerts.Firing) 0 -}}
Alerts Firing:
{{ range .Alerts }}
警報級別:{{ .Labels.status }}
警報類型:{{ .Labels.alertname }}
故障主機: {{ .Labels.instance }}
警報主題: {{ .Annotations.summary }}
警報詳情: {{ .Annotations.description }}
⏱ : {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- end }}
{{- end }}
(3)測試
#啟動alertManager cd /opt/programFiles/alertmanager-0.22.2.linux-amd64 ./alertmanager --config.file=alertmanager.yml #啟動TDengine Alert cd /opt/programFiles/TDengine-alert/ ./alert -cfg alert.cfg
在數據庫中插入模擬數據
insert into pm_25_1003055 (ts,measured_value,id) values(now-1h,7.0,10103);
測試企業微信界面如下:

參考網址:
Alertmanager配置概述 https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/alert/alert-manager-config
深入Alertmanager 概念與配置介紹 https://www.cnblogs.com/gered/p/13496950.html#autoid-5-0-0
alertmanager配置文件詳解(四) https://www.soulchild.cn/2073.html
java利用釘釘機器人向釘釘群推送消息 https://www.cnblogs.com/zhouheblog/p/11058817.html
Alertmanager 企業微信配置 https://www.jianshu.com/p/135968cbc94f
