Swoole Tracker

    目录

    介绍

    在 imi 框架中接入 Swoole Tracker 监控

    Swoole Tracker: https://business.swoole.com/tracker/index

    • 企业版集成了Facebook的Xhprof工具,可以生成调用堆栈图和火焰图,亦可生成分层分析表格,方便找到程序瓶颈点进行优化。
    • 为解决PHP常驻进程的内存泄漏问题,企业版专门针对PHP的内存泄漏检测工具,方便快速的解决和定位内存持续增长问题。
    • Swoole异步/协程模式以及ReactPHP等众多框架最致命的就是阻塞调用,会让并发大大降低,为此我们开发了毫秒级阻塞检测工具,迅速定位导致阻塞的代码。
    • 自动抓取FPM、CLI进程数量,统计CPU、内存使用情况。
    • 所有工具零部署成本,后台一键开启关闭各种检测,完美支持PHP7。

    Swoole Tracker >= v2.5.0 版本支持自动生成应用名称并创建应用,无需修改任何代码,生成的应用名称格式为:

    SwooleHttpServerip:prot

    其他的Serverip(hostname):prot

    即安装好swoole_tracker扩展之后就可以正常使用Swoole Tracker的功能

    组件基本使用

    1. 在你的 composer.json 中加入下面的内容:

      {
          "require": {
              "imiphp/imi-swoole-tracker": "~2.1.0"
          }
      }
    2. 执行 composer update 安装。
    3. 在项目 config/config.php 中配置:

      [
          'components'    =>  [
              // 引入本组件
              'SwooleTracker'       =>  'Imi\SwooleTracker',
          ],
      ]

    Http 服务

    在服务器的 config/config.php 中配置:

    [
        'beans'    =>    [
            'HttpDispatcher'    =>    [
                'middlewares'    =>    [
                    …… // 你的其他中间件
                    \Imi\Server\Http\Middleware\RouteMiddleware::class,
                    "SwooleTrackerHttpMiddleware", // 放在 RouteMiddlware 后
                ],
            ],
            'SwooleTrackerHttpMiddleware'   =>  [
                'serviceName'   => 'imi-http-example', // 服务名
                // 'serverIp'      => null, // 服务器 IP,默认获取当前网卡 IP
                // 'interface'     => null, // 网卡 interface 名,自动获取当前网卡IP时有效
                // 'successStatusCode' => 200, // 成功的 Http 状态码
            ],
        ],
    ];

    WebSocket 服务

    在服务器的 config/config.php 中配置:

    [
        'beans'    =>    [
            'WebSocketDispatcher'    =>    [
                'middlewares'    =>    [
                    …… // 你的其他中间件
                    \Imi\Server\WebSocket\Middleware\RouteMiddleware::class,
                    "SwooleTrackerWebSocketMiddleware", // 放在 RouteMiddlware 后
                ],
            ],
            'SwooleTrackerWebSocketMiddleware'  =>  [
                'serviceName'       => 'imi-websocket-example', // 服务名
                // 'serverIp'          => null, // 服务器 IP,默认获取当前网卡 IP
                // 'interface'         => null, // 网卡 interface 名,自动获取当前网卡IP时有效
                // 'successCode'       =>  500, // 当成功时上报的默认code
                // 'exceptionCode'     =>  500, // 当发生异常时上报的默认code
                // 指定获取请求方法名的参数,必须有
                'nameHandler'       =>  function(\Imi\Server\WebSocket\Message\IFrame $frame){
                    return $frame->getFormatData()->action ?? 'unknown'; // 代码仅供参考
                },
            ],
        ],
    ];

    TCP 服务

    在服务器的 config/config.php 中配置:

    [
        'beans'    =>    [
            'TcpDispatcher'    =>    [
                'middlewares'    =>    [
                    …… // 你的其他中间件
                    \Imi\Server\TcpServer\Middleware\RouteMiddleware::class,
                    "SwooleTrackerTCPMiddleware", // 放在 RouteMiddlware 后
                ],
            ],
            'SwooleTrackerTCPMiddleware'  =>  [
                'serviceName'       => 'imi-tcp-example', // 服务名
                // 'serverIp'          => null, // 服务器 IP,默认获取当前网卡 IP
                // 'interface'         => null, // 网卡 interface 名,自动获取当前网卡IP时有效
                // 'successCode'       =>  500, // 当成功时上报的默认code
                // 'exceptionCode'     =>  500, // 当发生异常时上报的默认code
                // 指定获取请求方法名的参数,必须有
                'nameHandler'       =>  function(\Imi\Server\TcpServer\Message\IReceiveData $data){
                    return $data->getFormatData()->action ?? 'unknown'; // 代码仅供参考
                },
            ],
        ],
    ];

    UDP 服务

    在服务器的 config/config.php 中配置:

    [
        'beans'    =>    [
            'UdpDispatcher'    =>    [
                'middlewares'    =>    [
                    …… // 你的其他中间件
                    \Imi\Server\UdpServer\Middleware\RouteMiddleware::class,
                    "SwooleTrackerUDPMiddleware", // 放在 RouteMiddlware 后
                ],
            ],
            'SwooleTrackerUDPMiddleware'  =>  [
                'serviceName'       => 'imi-udp-example', // 服务名
                // 'serverIp'          => null, // 服务器 IP,默认获取当前网卡 IP
                // 'interface'         => null, // 网卡 interface 名,自动获取当前网卡IP时有效
                // 'successCode'       =>  500, // 当成功时上报的默认code
                // 'exceptionCode'     =>  500, // 当发生异常时上报的默认code
                'nameHandler'       =>  function(\Imi\Server\UdpServer\Message\IPacketData $data){
                    return $data->getFormatData()->action ?? 'unknown'; // 代码仅供参考
                },
            ],
        ],
    ];

    进阶使用

    如果请求产生异常,自动上报失败,错误码为异常 code

    你也可以在代码中指定是否成功和错误码,例子:

    RequestContext::set('imi.tracker.success', false);
    RequestContext::set('imi.tracker.code', 19260817);