• 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(" 
    
     ");
                }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

    爱人不亲,反其仁;治人不治,反其智;礼人不答,反其敬;行有不得,反求诸己
  • 相关阅读:
    redis缓存雪崩、穿透、击穿概念及解决办法
    搭建svn
    树莓派3
    开博留念
    Linux系统网卡配置“漂移”现象
    3.1、final、finally、 finalize
    2.2、Exception和Error
    2.1、NoClassDefFoundError和ClassNotFoundException区别
    1、Java平台的理解
    阻塞队列(java并发编程)
  • 原文地址:https://www.cnblogs.com/lina-2015/p/15210197.html
Copyright © 2020-2023  润新知