iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;
http://game.iohao.com
GNU Affero General Public License v3.0
904 stars 201 forks source link

业务框架插件 - action 调用统计插件 #221

Closed iohao closed 11 months ago

iohao commented 11 months ago

插件介绍

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

  1. 具体某个 action 被调用的次数
  2. action 是否存在耗时操作,触发耗时操作的次数
  3. 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);
});
iohao commented 11 months ago

action 统计插件 - 文档

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

通过 StatActionRegion 对象可以拿到统计的各种信息;当项目上线时,通常是不需要打印信息的,但我们可以配合定时调度把这些数据定期的同步到日志、或 DB、或其他地方中。

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

iohao commented 11 months ago

已在 17.1.59 版本提供

iohao commented 11 months ago

使用示例 - 得到统计数据

通过 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 中,用于后续的分析
});