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分钟
这里有一个问题,cat的告警渠道虽然提供了邮件、短信、微信等类型,但是他实际上是没有帮你实现的的。需要自己搭建一个http服务来实现对应的告警。
告警服务配置
短信发送的写法如下(采用nodeJS、egg实现):
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;
代码路径
- 下载代码
git clone https://github.com/gdwenjun/sms-egg.git
- 按照依赖
npm i
- 运行代码
npm run dev
- 完成上述步骤,发送短信服务就完成了,只需要在告警服务配置上
<sender id="sms" url="http://127.0.0.1/sendSMS" type="post" successCode="200" batchSend="false">
<par id="jsonm={type:808,mobile:'{receiver}',pair:{body='{content}'}}"/>
</sender>
应用告警配置
如图,可以是Transaction级别也可以是Event级别,以Transaction为例,点右上角加号可以添加监控项。
type是指自己系统中埋点时,Transaction中填的type。这个自己约定好即可,我这边约定为smsURL。
该监控规则就是说,如果在三分钟以内访问mycat这个项目的任意链接超过20次就会向指定告警人发送。
- 修改告警策略
image.png
- 告警人设置。
根据告警策略设置sms的告警人,可以指定多个接收人
image.png
- 最终触发告警条件会收到短信
福利
如果你也在使用cat进行短信监控告警功能,可访问下面链接购买优惠腾讯云短信套餐包https://cloud.tencent.com/act/pro/csms?from=12058