跳到主要内容

Action 调用统计插件

提示

使用场景推荐

  • 线上
  • 开发阶段
  • 性能分析

介绍

StatActionInOut 是 action 调用统计插件,主要关注点

  1. 具体某个 action 被调用的次数
  2. action 是否存在耗时操作,触发耗时操作的次数
  3. action 触发异常次数

StatActionInOut 可以用来统计各 action 调用时的相关数据, 如 action 的执行次数、总耗时、平均耗时、最大耗时、触发异常次数...等相关数据

开发者可以通过这些数据来分析出项目中的热点方法、耗时方法,从而做到精准优化

下面是 action 调用信息及各时间范围的调用统计预览。

StatAction{cmd[1 - 1], 执行[50]次, 异常[0]次, 平均耗时[1833], 最大耗时[2945], 总耗时[91691]
500 ~ 1000 ms 的请求共 [7] 个
1000 ~ 1500 ms 的请求共 [11] 个
1500 ~ 2000 ms 的请求共 [9] 个
> 2000 ms 的请求共 [23] 个

StatAction{cmd[1 - 2], 执行[50]次, 异常[0]次, 平均耗时[1782], 最大耗时[2976], 总耗时[89133]
500 ~ 1000 ms 的请求共 [10] 个
1000 ~ 1500 ms 的请求共 [7] 个
1500 ~ 2000 ms 的请求共 [12] 个
> 2000 ms 的请求共 [21] 个

如何使用

@Override
public BarSkeleton createBarSkeleton() {
BarSkeletonBuilder builder = ...;
var statActionInOut = new StatActionInOut();
builder.addInOut(statActionInOut);

statActionInOut.setListener((statAction, time, flowContext) -> {
System.out.println(statAction);
});
...
}

统计插件提供了 StatActionRegion、StatAction、StatActionChangeListener 类, 用于记录、处理与统计相关的信息。开发者通过这些类,可以得到与统计相关的所有信息。

  • StatAction,action 统计记录,与 action 是 1:1 的关系。 记录 action 相关的各种数据,如 action 的执行次数、总耗时、平均耗时、最大耗时...等。
  • StatActionRegion,统计域,管理所有 StatAction 统计记录
  • StatActionChangeListener,StatAction 更新监听,每次 StatAction 统计记录更新后会调用。

StatActionRegion

开发者可以通过统计值插件来得到 StatActionRegion 对象,StatActionRegion 提供了遍历等相关方法。

  • code 2,统计域(统计值的管理器)
  • code 4,遍历所有的统计数据
StatActionInOut statActionInOut = ...;
StatActionInOut.StatActionRegion region = statActionInOut.getRegion();

region.forEach((cmdInfo, statAction) -> {
System.out.println(statAction);
// your code, Save data to the DB
});

StatActionChangeListener

  • code 4,设置 StatAction 统计记录更新后的监听处理。 time 是本次的执行耗时,开发者如果想实现一个超过指定时间才触发打印的逻辑,可以在监听中实现。
var statActionInOut = new StatActionInOut();
builder.addInOut(statActionInOut);

statActionInOut.setListener((statAction, time, flowContext) -> {
System.out.println(statAction);
});

小结

StatActionInOut 是 action 调用统计插件,可以用来统计各 action 调用时的相关数据, 如 action 的执行次数、总耗时、平均耗时、最大耗时、触发异常次数...等相关数据

开发者可以通过这些数据来分析出项目中的热点方法、耗时方法,从而做到精准优化。

统计插件提供了 StatActionRegion、StatAction、StatActionChangeListener 类, 用于记录、处理与统计相关的信息。开发者通过这些类,可以得到与统计相关的所有信息。

开发者可以将这些信息记录到日志中或 DB 中,用于后续的分析。

扩展 StatActionChangeListener

按照上述的默认配置,可以满足我们大部分的情况下的性能分析了。 如果你还想查看各时间阶段所占用的耗时情况,那么可以通过扩展 StatActionChangeListener 接口来实现。

StatAction{cmd[1 - 1], 执行[50]次, 异常[0]次, 平均耗时[1833], 最大耗时[2945], 总耗时[91691]
500 ~ 1000 ms 的请求共 [7] 个
1000 ~ 1500 ms 的请求共 [11] 个
1500 ~ 2000 ms 的请求共 [9] 个
> 2000 ms 的请求共 [23] 个

StatAction{cmd[1 - 2], 执行[50]次, 异常[0]次, 平均耗时[1782], 最大耗时[2976], 总耗时[89133]
500 ~ 1000 ms 的请求共 [10] 个
1000 ~ 1500 ms 的请求共 [7] 个
1500 ~ 2000 ms 的请求共 [12] 个
> 2000 ms 的请求共 [21] 个

配置时间范围

下面分了两个时间范围阶段

  1. 当 action 执行耗时在 1000 ~ 2000 ms 之间的请求,统计在个第一个元素中。
  2. 当 action 执行耗时 > 2000 ms 时,将统计放到最后一个元素中。

每次 action 调用耗时如果与配置的 TimeRange 能匹配上,就会在该对象的统计次数 +1。 如果开发者想将时间范围分得更细,那么只需要创建更多的 TimeRange。

statActionInOut.setListener(new StatActionInOut.StatActionChangeListener() {
...

@Override
public List<StatActionInOut.TimeRange> createTimeRangeList() {
return List.of(
StatActionInOut.TimeRange.create(1000, 2000),
StatActionInOut.TimeRange.create(2000, Long.MAX_VALUE, "> 2000"));
}
});

时间范围的默认配置

StatActionChangeListener 接口默认提供了如下的时间范围配置,如果默认配置无法满足开发者需求的,可以重写 createTimeRangeList 方法。

interface StatActionChangeListener {
...
default List<TimeRange> createTimeRangeList() {
return List.of(
TimeRange.create(500, 1000),
TimeRange.create(1000, 1500),
TimeRange.create(1500, 2000),
TimeRange.create(2000, Long.MAX_VALUE, "> 2000"));
}
}