TDengine告警模块
准备工作
软件名称 |
安装节点 |
操作系统 |
上传目录 |
安装目录 |
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