Transaction报表

主要功能

监控一段代码运行情况:运行次数、QPS、错误次数、失败率、响应时间统计(平均影响时间、Tp分位值)等等

应用启动后默认会打点的部分:

打点 来源组件 描述
System cat-client 上报监控数据的打点信息
URL 需要接入cat-filter URL访问的打点信息

报表介绍

第一级分类(Type)统计界面

Type统计界面展示了一个Transaction的第一层分类的视图,可以知道这段时间里面一个分类运行的次数,平均响应时间,延迟,以及分位线。

Transaction报表 - 图1

从上而下分析报表:

  1. 报表的时间跨度 CAT默认是以一小时为统计时间跨度,点击[切到历史模式],更改查看报表的时间跨度:默认是小时模式;切换为历史模式后,右侧快速导航,变为month(月报表)、week(周报表)、day(天报表),可以点击进行查看,注意报表的时间跨度会有所不同。
  2. 时间选择 通过右上角时间导航栏选择时间:点击[+1h]/[-1h]切换时间为下一小时/上一小时;点击[+1d]/[-1d]切换时间为后一天的同一小时/前一天的同一小时;点击右上角[+7d]/[-7d]切换时间为后一周的同一小时/前一周的同一小时;点击[now]回到当前小时。
  3. 项目选择 输入项目名,查看项目数据;如果需要切换其他项目数据,输入项目名,回车即可。
  4. 机器分组 CAT可以将若干个机器,作为一个分组进行数据统计。默认会有一个All分组,代表所有机器的统计数据,即集群统计数据。
  5. 所有Type汇总表格 第一层分类(Type),点击查看第二级分类(称为name)数据:

    • Transaction的埋点的Type和Name由业务自己定义,当打点了Cat.newTransaction(type, name)时,第一层分类是type,第二级分类是name。
    • 第二级分类数据叫是统计相同type下的所有name数据,数据均与第一级(type)一样的展示风格
  6. 单个Type指标图表 点击show,查看Type所有name分钟级统计,如下图: Transaction报表 - 图2 Transaction报表 - 图3

  7. 指标说明 显示的是小时粒度第一级分类(type)的次数、错误数、失败率等数据。

  8. 样本logview L代表logview,为一个样例的调用链路。
  9. 分位线说明 小时粒度的时间第一级分类(type)相关统计

    • 95line表示95%的请求的响应时间比参考值要小,999line表示99.9%的响应时间比参考值要小,95line以及99line,也称之为tp95、tp99。

Transaction历史报表

Transaction历史报表支持每天、每周、每月的数据统计以及趋势图,点击导航栏的切换历史模式进行查询。Transaction历史报表以响应时间、访问量、错误量三个维度进行展示,以天报表为例:选取一个type,点击show,即可查看天报表。

最佳实践

TP分位线计算逻辑

  • 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分位线等小时内部的统计为了节省内存,也是用了近似的统计方式,当响应时间越大的话,对应的分桶跨度也越大

  1. public static int computeDuration(int duration) {
  2. if (duration < 1) {
  3. return 1;
  4. } else if (duration < 20) {
  5. return duration;
  6. } else if (duration < 200) {
  7. return duration - duration % 5;
  8. } else if (duration < 500) {
  9. return duration - duration % 20;
  10. } else if (duration < 2000) {
  11. return duration - duration % 50;
  12. } else if (duration < 20000) {
  13. return duration - duration % 500;
  14. } else if (duration < 1000000) {
  15. return duration - duration % 10000;
  16. } else {
  17. int dk = 524288;
  18. if (duration > 3600 * 1000) {
  19. dk = 3600 * 1000;
  20. } else {
  21. while (dk < duration) {
  22. dk <<= 1;
  23. }
  24. }
  25. return dk;
  26. }
  27. }

示例说明

我想监控一段核心代码的执行的情况,能看到统计报表,怎么办?

Step1: 首先,确定监控对象

  1. - 监控某个方法中核心逻辑的健康状况

Step2: 其次,确定监控指标,Transaction统计报表可以提供如下信息

  1. - 每分钟调用次数
  2. - 每分钟的平均响应时间
  3. - 最慢响应时间
  4. - 请求的时间分布

Step3: 然后,进行埋点(前提是已经集成cat-client)

  • 假设监控对象的代码为:
  1. public void shopService() {
  2. service1();
  3. service2();
  4. service3();
  5. }
  • 假设shopService中service3是核心方法,对其进行CAT埋点:
  1. public void shopService() {
  2. service1();
  3. service2();
  4. Transaction transaction = Cat.newTransaction("ShopService", "Service3");
  5. try {
  6. service3();
  7. transaction.setStatus(Transaction.SUCCESS);
  8. } catch (Exception e) {
  9. transaction.setStatus(e); // catch 到异常,设置状态,代表此请求失败
  10. Cat.logError(e); // 将异常上报到cat上
  11. // 也可以选择向上抛出: throw e;
  12. } finally {
  13. transaction.complete();
  14. }
  15. }