用户能通过 /rpcz 看到最近请求的详细信息,并可以插入注释(annotation)。不同于 tracing system(如 Dapper)以全局视角看到整体系统的延时分布,rpcz 更多是一个调试工具。虽然角色有所不同,但在 brpc 中 rpcz 和 tracing 的数据来源是一样的。当每秒请求数小于 1 万时,rpcz 会记录所有的请求;超过 1 万时,rpcz 会随机忽略一些请求,把采样数控制在 1 万左右。rpcz 可以淘汰时间窗口之前的数据,通过 -rpcz_keep_span_seconds 选项设置,默认 1 小时。
提示:关于开销——rpcz 的实现完全规避了线程竞争,开销极小。在 qps 30 万的测试场景中,观察不到明显的性能变化,对大部分应用而言应该是”free”的。即使采集了几千万条请求,rpcz 也不会增加很多内存,一般在 50 兆以内。rpcz 会占用一些磁盘空间(就像日志一样),如果设定为存一个小时的数据,一般在几百兆左右。
开启 rpcz
rpcz 默认不开启,加入 -enable_rpcz 选项会在启动后开启。
相关的 flags 如下:
| Name | Value | Description | Defined At |
|---|---|---|---|
| enable_rpcz (R) | true (default:false) | Turn on rpcz | src/baidu/rpc/builtin/rpcz_service.cpp |
| rpcz_hex_log_id (R) | false | Show log_id in hexadecimal | src/baidu/rpc/builtin/rpcz_service.cpp |
| rpcz_database_dir | ./rpc_data/rpcz | For storing requests/contexts collected by rpcz. | src/baidu/rpc/span.cpp |
| rpcz_keep_span_db | false | Don’t remove DB of rpcz at program’s exit | src/baidu/rpc/span.cpp |
| rpcz_keep_span_seconds (R) | 3600 | Keep spans for at most so many seconds | src/baidu/rpc/span.cpp |
若启动时未加 -enable_rpcz,则可在启动后访问 SERVER_URL/rpcz/enable 动态开启 rpcz,访问 SERVER_URL/rpcz/disable 则关闭。这两个链接等价于访问 SERVER_URL/flags/enable_rpcz?setvalue=true 和 SERVER_URL/flags/enable_rpcz?setvalue=false。在 r31010 之后,rpcz 的 html 版本中增加了一个按钮,可视化地开启和关闭:


提示:如果你的程序只是一个 brpc client 或没有使用 brpc,也可以启动 dummy server 来提供同样的内置服务页面。
两层展现
/rpcz 展现的数据分为两层。
第一层展现最新请求的概况,点击链接进入第二层:

第二层展现某系列(trace)或某个请求(span)的详细信息。一般通过点击第一层中的链接进入,也可以把 trace= 和 span= 作为 query-string 拼出链接:

使用 TRACEPRINTF 打印注释
只要你使用了 brpc,就可以使用 TRACEPRINTF 打印内容到事件流中,比如:
TRACEPRINTF("Hello rpcz %d", 123);
这条 annotation 会按其发生时间插入到对应请求的 rpcz 中。从这个角度看,rpcz 是请求级的日志。如果你用 TRACEPRINTF 打印了沿路的上下文,便可看到请求在每个阶段停留的时间、牵涉到的数据集和参数,这是个很有用的功能。