-
Notifications
You must be signed in to change notification settings - Fork 5.4k
transaction
监控一段代码运行情况:运行次数、QPS、错误次数、失败率、响应时间统计(平均影响时间、Tp分位值)等等
。
应用启动后默认会打点的部分:
打点 | 来源组件 | 描述 |
---|---|---|
System | cat-client | 上报监控数据的打点信息 |
URL | 需要接入cat-filter | URL访问的打点信息 |
Type统计界面展示了一个Transaction的第一层分类的视图,可以知道这段时间里面一个分类运行的次数,平均响应时间,延迟,以及分位线。
从上而下分析报表:
-
报表的时间跨度 CAT默认是以一小时为统计时间跨度,点击[切到历史模式],更改查看报表的时间跨度:默认是小时模式;切换为历史模式后,右侧快速导航,变为month(月报表)、week(周报表)、day(天报表),可以点击进行查看,注意报表的时间跨度会有所不同。
-
时间选择 通过右上角时间导航栏选择时间:点击[+1h]/[-1h]切换时间为下一小时/上一小时;点击[+1d]/[-1d]切换时间为后一天的同一小时/前一天的同一小时;点击右上角[+7d]/[-7d]切换时间为后一周的同一小时/前一周的同一小时;点击[now]回到当前小时。
-
项目选择 输入项目名,查看项目数据;如果需要切换其他项目数据,输入项目名,回车即可。
-
机器分组 CAT可以将若干个机器,作为一个分组进行数据统计。默认会有一个All分组,代表所有机器的统计数据,即集群统计数据。
-
所有Type汇总表格 第一层分类(Type),点击查看第二级分类(称为name)数据:
- Transaction的埋点的Type和Name由业务自己定义,当打点了Cat.newTransaction(type, name)时,第一层分类是type,第二级分类是name。
- 第二级分类数据叫是统计相同type下的所有name数据,数据均与第一级(type)一样的展示风格
-
单个Type指标图表 点击show,查看Type所有name分钟级统计,如下图:
-
指标说明 显示的是小时粒度第一级分类(type)的次数、错误数、失败率等数据。
-
样本logview L代表logview,为一个样例的调用链路。
-
分位线说明 小时粒度的时间第一级分类(type)相关统计
- 95line表示95%的请求的响应时间比参考值要小,999line表示99.9%的响应时间比参考值要小,95line以及99line,也称之为tp95、tp99。
Transaction历史报表支持每天、每周、每月的数据统计以及趋势图,点击导航栏的切换历史模式进行查询。Transaction历史报表以响应时间、访问量、错误量三个维度进行展示,以天报表为例:选取一个type,点击show,即可查看天报表。
-
CAT基于全量数据,在单台机器的上单个小时内部,做全量的区间分桶,在区间分桶也做了部分优化,时间越大桶的区间粒度越大,最后根据count找出分位。
-
CAT内部是自己实现的模型和存储,本身支持增加合并和计算,分位线这类并不是适合增量计算,必须依赖全量数据才可以,但是全量的数据存储量非常之大。Transaction报表目前准确统计小时范围单台机器级别分钟级的TP数据。如果看小时级别ALL的统计,是根据当前小时所有的机器进行合并的结果,主要一段时间内所有的机器响应时间波动基本一致,小时级别基本也准确,但是如果个别机器抖动特别大,这个所有的统计会失真。
-
CAT后端天、周、月级别的数据是就小时数据的合并,主要用了加权来做,如果一天整个项目的99的波动不大,天级别的99约等于小时级别99。如果一天内的某几个小时的tp99 比较大的话,此做法就会有误差,比如某个服务一天有好几个小时tp99的数据都是正常其他时间段的10倍,这样天级别的99误差就比较大。简而言之天、周、月TP值的统计是一个根据加权算法的近似估计值。
-
分位线的统计数据,单台机器小时报表的小时粒度和分钟粒度是完全准确的,天、周、月级别、包括集群的总的分位线都是加权来计算的。计算逻辑如下:
- 机器A的tp999是timeA,访问总量是countA
- 机器B的tp999是timeB,访问总量是countB
- 集群(假设只有A和B两个机器)的tp999的计算公式是:tp999 = (timeA * countA + timeB * countB) / (countA + countB)
- 天、周、月报表计算逻辑类似,只不过把机器之间的运算换成了时间之间的运算
-
另外CAT分位线等小时内部的统计为了节省内存,也是用了近似的统计方式,当响应时间越大的话,对应的分桶跨度也越大
public static int computeDuration(int duration) {
if (duration < 1) {
return 1;
} else if (duration < 20) {
return duration;
} else if (duration < 200) {
return duration - duration % 5;
} else if (duration < 500) {
return duration - duration % 20;
} else if (duration < 2000) {
return duration - duration % 50;
} else if (duration < 20000) {
return duration - duration % 500;
} else if (duration < 1000000) {
return duration - duration % 10000;
} else {
int dk = 524288;
if (duration > 3600 * 1000) {
dk = 3600 * 1000;
} else {
while (dk < duration) {
dk <<= 1;
}
}
return dk;
}
}
Step1: 首先,确定监控对象 - 监控某个方法中核心逻辑的健康状况
Step2: 其次,确定监控指标,Transaction统计报表可以提供如下信息 - 每分钟调用次数 - 每分钟的平均响应时间 - 最慢响应时间 - 请求的时间分布
Step3: 然后,进行埋点(前提是已经集成cat-client)
- 假设监控对象的代码为:
public void shopService() {
service1();
service2();
service3();
}
- 假设shopService中service3是核心方法,对其进行CAT埋点:
public void shopService() {
service1();
service2();
Transaction transaction = Cat.newTransaction("ShopService", "Service3");
try {
service3();
transaction.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
transaction.setStatus(e); // catch 到异常,设置状态,代表此请求失败
Cat.logError(e); // 将异常上报到cat上
// 也可以选择向上抛出: throw e;
} finally {
transaction.complete();
}
}