业务框架插件 - action 调用统计插件
iohao opened this issue · comments
插件介绍
StatActionInOut 是 action 调用统计插件,主要关注点
- 具体某个 action 被调用的次数
- action 是否存在耗时操作,触发耗时操作的次数
- action 触发异常次数
StatActionInOut 物件可以用来统计各 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] 个
使用示例
BarSkeletonBuilder builder = ...;
// action 调用统计插件,将插件添加到业务框架中
var statActionInOut = new StatActionInOut();
builder.addInOut(statActionInOut);
// 设置 StatAction 统计记录更新后的监听处理
// 这个监听不是必需的,这里只是简单的演示一下有变动时就做个打印。与 debugInOut 类似。
statActionInOut.setListener((statAction, time, flowContext) -> {
// 简单打印统计记录值 StatAction
System.out.println(statAction);
});
统计插件提供了 StatActionRegion、StatAction、StatActionChangeListener 类,用于记录、处理与统计相关的信息。开发者通过这些类,可以得到与统计相关的所有信息。
通过 StatActionRegion 对象可以拿到统计的各种信息;当项目上线时,通常是不需要打印信息的,但我们可以配合定时调度把这些数据定期的同步到日志、或 DB、或其他地方中。
之后,开发者可以通过这些数据来分析出项目中的热点方法、耗时方法,从而做到精准优化。
已在 17.1.59 版本提供
使用示例 - 得到统计数据
通过 StatActionRegion 对象可以拿到统计的各种信息;当项目上线时,通常是不需要打印信息的,但我们可以配合定时调度把这些数据定期的同步到日志、或 DB、或其他地方中。之后,开发者可以通过这些数据来分析出项目中的热点方法、耗时方法,从而做到精准优化。
// 统计值插件
StatActionInOut statActionInOut = ...;
// 统计域(统计值的管理器)
StatActionInOut.StatActionRegion region = statActionInOut.getRegion();
// 遍历所有的统计数据
region.forEach((cmdInfo, statAction) -> {
// action 执行次数统计
LongAdder executeCount = statAction.getExecuteCount();
// action 异常触发次数
LongAdder errorCount = statAction.getErrorCount();
// 平均耗时
long avgTime = statAction.getAvgTime();
// 单次调用中的最大耗时
long maxTime = statAction.getMaxTime();
// 总耗时
LongAdder totalTime = statAction.getTotalTime();
// 时间范围
List<StatActionInOut.TimeRange> timeRangeList = statAction.getTimeRangeList();
for (StatActionInOut.TimeRange timeRange : timeRangeList) {
// 开始时间
long start = timeRange.start();
// 结束时间
long end = timeRange.end();
// 该时间范围所触发的执行次数
LongAdder count = timeRange.count();
}
// 开发者可以定时的将这些数据保存到日志或 DB 中,用于后续的分析
});