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实现):
代码语言: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;
代码路径
- 下载代码
git clone https://github.com/gdwenjun/sms-egg.git
- 按照依赖
npm i
- 运行代码
npm run dev
- 完成上述步骤,发送短信服务就完成了,只需要在告警服务配置上
<sender id="sms" url="http://127.0.0.1:7001/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