cat监控实现腾讯云短信告警

cat介绍

CAT(Central Application Tracking),是基于 Java 开发的分布式实时监控系统。CAT在基础存储、高性能通信、大规模在线访问、服务治理、实时监控、容器化及集群智能调度等领域提供业界领先的、统一的解决方案。CAT 目前在美团的产品定位是应用层的统一监控组件。

cat优势

  • 实时处理:信息的价值会随时间锐减,尤其是事故处理过程中
  • 全量数据:最开始的设计目标就是全量采集,全量的好处有很多
  • 高可用:所有应用都倒下了,需要监控还站着,并告诉工程师发生了什么,做到故障还原和问题定位
  • 故障容忍:CAT 本身故障不应该影响业务正常运转,CAT 挂了,应用不该受影响,只是监控能力暂时减弱
  • 高吞吐:要想还原真相,需要全方位地监控和度量,必须要有超强的处理吞吐能力
  • 可扩展:支持分布式、跨 IDC 部署,横向扩展的监控系统CAT支持的监控消息类型
  • Transaction 适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数
  • Event 用来记录一件事发生的次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小
  • Heartbeat 表示程序内定期产生的统计信息, 如CPU利用率, 内存利用率, 连接池状态, 系统负载等
  • Metric 用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟

cat告警配置

cat提供了合理、灵活的监控规则可以帮助更快、更精确的发现业务线上故障。告警规则介绍参考https://github.com/dianping/cat/wiki/alarm

告警策略

告警策略:配置某种告警类型、某个项目、某个错误级别,对应的告警发送渠道,以及暂停时间。

举例:下述配置示例,说明对于Transaction告警,当告警项目名为demo_project:

当告警级别为error时,发送渠道为邮件、短信、微信,连续告警之间的间隔为5分钟

当告警级别为warning时,发送渠道为邮件、微信,连续告警之间的间隔为10分钟

image.png

这里有一个问题,cat的告警渠道虽然提供了邮件、短信、微信等类型,但是他实际上是没有帮你实现的的。需要自己搭建一个http服务来实现对应的告警。

告警服务配置

image.png

短信发送的写法如下(采用nodeJS、egg实现):

代码语言:txt
复制
const Service = require('egg').Service;
const tencentcloud = require("tencentcloud-sdk-nodejs");
class HomeService extends Service {
async sendSMS(alamParameter) {
    
    return new Promise((resolve,reject)=>{
        try{
            // 导入 SMS 模块的 client models
            const smsClient = tencentcloud.sms.v20190711.Client;
            const models = tencentcloud.sms.v20190711.Models;

            const Credential = tencentcloud.common.Credential;
            const ClientProfile = tencentcloud.common.ClientProfile;
            const HttpProfile = tencentcloud.common.HttpProfile;

            /* 必要步骤:
            * 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey
            * 本示例采用从环境变量读取的方式,需要预先在环境变量中设置这两个值
            * 您也可以直接在代码中写入密钥对,但需谨防泄露,不要将代码复制、上传或者分享给他人
            * CAM 密匙查询: https://console.cloud.tencent.com/cam/capi
            * */
            let cred = new Credential("你的SecretId", "你的SecretKey");
            /* 非必要步骤:
            * 实例化一个客户端配置对象,可以指定超时时间等配置 */
            let httpProfile = new HttpProfile();
            /* SDK 默认使用 POST 方法
            * 如需使用 GET 方法,可以在此处设置,但 GET 方法无法处理较大的请求 */
            httpProfile.reqMethod = "POST";
            /* SDK 有默认的超时时间,非必要请不要进行调整
            * 如有需要请在代码中查阅以获取最新的默认值 */
            httpProfile.reqTimeout = 30;
            httpProfile.endpoint = "sms.tencentcloudapi.com";

            // 实例化一个 client 选项,可选,无特殊需求时可以跳过
            let clientProfile = new ClientProfile();
            /* SDK 默认用 TC3-HMAC-SHA256 进行签名,非必要请不要修改该字段 */
            clientProfile.signMethod = "HmacSHA256";
            clientProfile.httpProfile = httpProfile;

            /* SDK 会自动指定域名,通常无需指定域名,但访问金融区的服务时必须手动指定域名
            * 例如 SMS 的上海金融区域名为 sms.ap-shanghai-fsi.tencentcloudapi.com */
            /* 实例化 SMS 的 client 对象
            * 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量 */
            let client = new smsClient(cred, "ap-guangzhou", clientProfile);

            /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数
            * 您可以直接查询 SDK 源码确定 SendSmsRequest 有哪些属性可以设置
            * 属性可能是基本类型,也可能引用了另一个数据结构
            * 推荐使用 IDE 进行开发,可以方便地跳转查阅各个接口和数据结构的文档说明 */
            let req = new models.SendSmsRequest();

            /* 基本类型的设置:
            * SDK 采用的是指针风格指定参数,即使对于基本类型也需要用指针来对参数赋值
            * SDK 提供对基本类型的指针引用封装函数
            * 帮助链接:
            * 短信控制台:https://console.cloud.tencent.com/smsv2
            * sms helper:https://cloud.tencent.com/document/product/382/3773 */
            /* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID,例如1400006666 */
            req.SmsSdkAppid = "1400376635";
            /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,可登录 [短信控制台] 查看签名信息 */
            req.Sign = "Cat告警";//需要改写为你的签名内容
            /* 短信码号扩展号: 默认未开通,如需开通请联系 [sms helper] */
            req.ExtendCode = "";
            /* 国际/港澳台短信 senderid: 国内短信填空,默认未开通,如需开通请联系 [sms helper] */
            req.SenderId = "";
            /* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
            req.SessionContext = "";

            /* 模板 ID: 必须填写已审核通过的模板 ID,可登录 [短信控制台] 查看模板 ID */
            //触发cat告警条件,请查看告警内容{1}
            req.TemplateID = "617255";//需要改下为你的模板ID
            /* 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号]
            * 例如+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/
            req.PhoneNumberSet = alamParameter.mobile.map((item)=>{
                return "+86"+item;
            });
            /* 模板参数: 若无模板参数,则设置为空*/
            req.TemplateParamSet = alamParameter.mobile.map((item)=>{
                return alamParameter.pair.body;
            });
            // 通过 client 对象调用想要访问的接口,需要传入请求对象以及响应回调函数
            client.SendSms(req, function (err, response) {
                // 请求异常返回,打印异常信息
                if (err) {
                    console.log(err);
                    resolve(false);
                    return;
                }
                // 请求正常返回,打印 response 对象
                console.log(response.to_json_string());
                resolve(true)
            });
            
        }catch(ex){
            console.error(ex);
            resolve(false);
        }
    });
}

}

module.exports = HomeService;

代码路径

  • 下载代码
代码语言:txt
复制
  • 按照依赖
代码语言:txt
复制
npm i
  • 运行代码
代码语言:txt
复制
npm run dev
  • 完成上述步骤,发送短信服务就完成了,只需要在告警服务配置上
代码语言:txt
复制
<sender id="sms" url="http://127.0.0.1/sendSMS" type="post" successCode="200" batchSend="false">
<par id="jsonm={type:808,mobile:'{receiver}&#39;,pair:{body=&#39;{content}'}}"/>
</sender>

应用告警配置

如图,可以是Transaction级别也可以是Event级别,以Transaction为例,点右上角加号可以添加监控项。

type是指自己系统中埋点时,Transaction中填的type。这个自己约定好即可,我这边约定为smsURL。

image.png

该监控规则就是说,如果在三分钟以内访问mycat这个项目的任意链接超过20次就会向指定告警人发送。

  • 修改告警策略

    image.png
  • 告警人设置。 根据告警策略设置sms的告警人,可以指定多个接收人
    image.png
  • 最终触发告警条件会收到短信
image.png

福利

如果你也在使用cat进行短信监控告警功能,可访问下面链接购买优惠腾讯云短信套餐包https://cloud.tencent.com/act/pro/csms?from=12058