HiTrace开发指导
概述
HiTrace主要是对于跨设备/跨进程/跨线程的业务流程,通过相同的traceid在整个业务流程中传递,将流程处理过程中的调用关系、各种输出信息关联和展现出来,帮助使用者分析、定位问题和系统调优。
应用场景
HiTrace在产品中应用场景如下,包括:
业务使用示例
-
调试时展示业务流程中的调用关系,进行关键路径分析、功能依赖分析,确定各调用点耗时、调用频率,提前发现性能瓶颈点。
-
在日志和事件等信息中自动附加traceid信息,便于开发人员综合分析和快速实现问题定界定位。
接口说明
HiTrace提供C++、C接口。上层业务主要使用HiTrace跟踪启动、结束接口。
HiTrace实现在C层,主要原理是在一次业务调用流程中,利用通信传递traceid,在业务处理前将traceid设置到当前线程的TLS(Thread Local Storage)中,业务处理结束清除当前线程的TLS;这样的话,在业务处理中可以从当前线程的上下文TLS取到traceid,自动附加到日志、事件信息中。
接口形式对比
表 1 C++、C的函数接口
接口功能参数
表 2 C++接口说明函数参数和功能
通信调用处理
业务使用时跨设备/跨进程/跨线程的调用是通过通信机制实现的,HiTrace需要通信机制传递traceid。
OpenHarmony系统内置部分通信机制(如ZIDL)已经支持传递traceid。
下面描述了同步通信调用传递traceid的处理过程,异步通信调用处理类似。
对于不支持的扩展通信机制可以参照该方式实现。
处理流程:
-
client侧业务模块调用begin()接口启动调用链跟踪。
-
client侧业务模块发起同步调用transact,到client侧通信组件。
-
client侧通信组件:
- 从当前线程TLS中获取traceid。
- 生成子调用分支(child traceid)。
- 将child traceid写入同步调用通信数据(transaction data)中。
- 进行CS埋点(Client Send)。
- 将通信数据发送到server侧通信组件。
-
server侧通信组件收到通信数据:
- 从数据消息包中取出traceid。
- 将traceid设置到当前线程TLS中。
- 进行SR埋点(Server Receive)。
- 然后进行同步调用回调(onTransact)到server侧业务模块。
-
server侧业务模块进行服务处理,处理完毕发送处理结果(transact reply)到通信组件。
-
server侧通信组件:
- 进行SS埋点(Server Send)。
- 将响应数据发送到client侧通信组件。
- 清除当前线程TLS中的traceid信息。
-
client侧通信组件收到响应数据:
- 进行CR埋点(Client Receive)。
- 发送同步调用响应(transact reply)到client侧业务模块。
-
client侧业务模块进行同步调用响应处理。
-
client侧业务模块在流程结束时调用end()接口停止调用链跟踪。
开发实例
C++接口实例
-
源代码开发
在类定义头文件或者类实现源文件中,包含hitrace头文件:
#include "hitrace/trace.h"
在业务类实现源文件中使用(启动/结束跟踪):
using namespace OHOS::HiviewDFX; HiTraceId traceId = HiTrace::Begin("MyServiceFlow", HITRACE_FLAG_DEFAULT); ...... HiTrace::End(traceId);
-
编译设置,在BUILD.gn里增加子系统SDK依赖:
external_deps = [ "hiviewdfx:libhitrace" ]
C接口实例
-
源代码开发
在源文件中,包含hitrace头文件:
#include "hitrace/trace.h"
在业务类实现源文件中使用(启动/结束跟踪):
HiTraceIdStruct traceId = HiTraceBegin("MyServiceFlow", HITRACE_FLAG_DEFAULT); ...... HiTraceEnd(traceId);
-
编译设置,在BUILD.gn里增加子系统SDK依赖:
external_deps = [ "hiviewdfx:libhitrace" ]