1# @ohos.hiTraceChain (分布式跟踪)
2
3本模块提供了端侧业务流程调用链跟踪的打点能力,包括业务流程跟踪的启动、结束、信息埋点等能力。
4
5> **说明:**
6>
7> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8
9## 导入模块
10
11```ts
12import { hiTraceChain } from '@kit.PerformanceAnalysisKit';
13```
14
15## HiTraceFlag
16
17跟踪标志组合类型枚举。
18
19**系统能力:** 以下各项对应的系统能力均为SystemCapability.HiviewDFX.HiTrace20
21| 名称 | 值 | 说明 |
22| -------- | -------- | -------- |
23| DEFAULT           | 0      | 缺省标志。       |
24| INCLUDE_ASYNC     | 1      | 异步调用标志。启动跟踪时,缺省只跟踪同步调用。设置该标志,同时跟踪同步、异步调用。   |
25| DONOT_CREATE_SPAN | 1 << 1 | 无分支标志。启动跟踪时,在同步、异步调用时缺省自动创建分支信息。设置该标志,指示不创建分支。     |
26| TP_INFO           | 1 << 2 | 埋点标志。启动跟踪式时,缺省不进行埋点。调试场景下设置该标志,在同步、异步调用的收发侧自动埋点,输出埋点信息和时间戳。收发埋点按照client、server分为[client send(CS)、server receive(SR)、server send(SS)、client receive(CR)](#hitracetracepointtype)四类信息。一次同步调用输出CS/SR/SS/CR,一次异步调用输出CS/SR/SS三个埋点信息。       |
27| NO_BE_INFO        | 1 << 3 | 无起始结束标志。启动跟踪时,缺省打印启动及结束跟踪信息。设置该标志,指示不打印启动及结束跟踪信息。 |
28| DISABLE_LOG       | 1 << 4 | 日志关联标志。设置该标志,指示隐藏日志中的跟踪信息。  |
29| FAILURE_TRIGGER   | 1 << 5 | 故障触发标志。预置标志,暂时没有作用。  |
30| D2D_TP_INFO       | 1 << 6 | 设备间埋点标志。TP_INFO的一个子集,设置该标志,只进行设备间的调用埋点。 |
31
32## HiTraceTracepointType
33
34跟踪埋点类型枚举。
35
36**系统能力:** 以下各项对应的系统能力均为SystemCapability.HiviewDFX.HiTrace37
38| 名称 | 值 | 说明 |
39| -------- | -------- | -------- |
40| CS       | 0 | 客户端发送类型,标识client侧的发送埋点。        |
41| CR       | 1 | 客户端接收类型,标识client侧的接收埋点。        |
42| SS       | 2 | 服务端发送类型,标识server侧的发送埋点。        |
43| SR       | 3 | 服务端接收类型,标识server侧的接收埋点。        |
44| GENERAL  | 4 | 一般类型,标识CS、CR、SS、SR四种场景之外的埋点。|
45
46## HiTraceCommunicationMode
47
48跟踪通信类型枚举。
49
50**系统能力:** 以下各项对应的系统能力均为SystemCapability.HiviewDFX.HiTrace51
52| 名称 | 值 | 说明 |
53| -------- | -------- | -------- |
54| DEFAULT  | 0 | 缺省通信类型    |
55| THREAD   | 1 | 线程间通信类型  |
56| PROCESS  | 2 | 进程间通信类型  |
57| DEVICE   | 3 | 设备间通信类型  |
58
59## HiTraceId
60
61此接口为HiTraceId对象接口。
62
63**系统能力:** 以下各项对应的系统能力均为SystemCapability.HiviewDFX.HiTrace64
65| 名称 | 类型 | 必填 | 说明 |
66| -------- | -------- | -------- | -------- |
67| chainId      | bigint | 是 | 跟踪链标识。   |
68| spanId      | number | 否 | 分支标识。     |
69| parentSpanId | number | 否 | 父分支标识。   |
70| flags        | number | 否 | 跟踪标志组合。 |
71
72## hiTraceChain.begin
73
74begin(name: string, flags?: number): HiTraceId
75
76开始跟踪,同步接口。
77
78**系统能力:** SystemCapability.HiviewDFX.HiTrace
79
80**参数:**
81
82| 参数名 | 类型 | 必填 | 说明 |
83| -------- | -------- | -------- | -------- |
84| name  | string | 是 | 跟踪业务名。 |
85| flags | number | 否 | 跟踪标志组合,具体可参考[HiTraceFlag](#hitraceflag)。 |
86
87**返回值:**
88
89| 类型 | 说明 |
90| -------- | -------- |
91| [HiTraceId](#hitraceid) | HiTraceId实例。 |
92
93**示例:**
94
95```ts
96// 开启跟踪,跟踪标志是INCLUDE_ASYNC与DONOT_CREATE_SPAN的并集。
97let traceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC | hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN);
98// 若干业务逻辑完成后,结束跟踪。
99hiTraceChain.end(traceId);
100```
101
102## hiTraceChain.end
103
104end(id: HiTraceId): void
105
106结束跟踪,同步接口。
107
108**系统能力:** SystemCapability.HiviewDFX.HiTrace
109
110**参数:**
111
112| 参数名 | 类型 | 必填 | 说明 |
113| -------- | -------- | -------- | -------- |
114| id | [HiTraceId](#hitraceid) | 是 | HiTraceId实例。 |
115
116**示例:**
117
118```ts
119// 开启跟踪,跟踪标志是DEFAULT。
120let traceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.DEFAULT);
121// 若干业务逻辑完成后,结束跟踪。
122hiTraceChain.end(traceId);
123```
124
125## hiTraceChain.getId
126
127getId(): HiTraceId
128
129获取跟踪标识,同步接口。
130
131**系统能力:** SystemCapability.HiviewDFX.HiTrace
132
133**返回值:**
134
135| 类型 | 说明 |
136| -------- | -------- |
137| [HiTraceId](#hitraceid) | HiTraceId实例。 |
138
139**示例:**
140
141```ts
142// 开启跟踪,跟踪标志是DEFAULT。
143let traceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.DEFAULT);
144// 若干业务逻辑完成后,获取当前跟踪标识。
145let curTraceId = hiTraceChain.getId();
146// 同一跟踪链获取的跟踪标识的chainId一定相同。
147if (curTraceId.chainId != traceId.chainId) {
148// 基于异常场景的处理逻辑。
149}
150// 若干业务逻辑完成后,结束跟踪。
151hiTraceChain.end(traceId);
152```
153
154## hiTraceChain.setId
155
156setId(id: HiTraceId): void
157
158设置跟踪标识,同步接口。
159
160**系统能力:** SystemCapability.HiviewDFX.HiTrace
161
162**参数:**
163
164| 参数名 | 类型 | 必填 | 说明 |
165| -------- | -------- | -------- | -------- |
166| id | [HiTraceId](#hitraceid) | 是 | HiTraceId实例。 |
167
168**示例:**
169
170```ts
171// 获取当前跟踪链中的跟踪标识。
172let traceId = hiTraceChain.getId();
173// 将获取的跟踪标识设置为当前traceId。
174hiTraceChain.setId(traceId);
175```
176
177## hiTraceChain.clearId
178
179clearId(): void
180
181清除跟踪标识,同步接口。
182
183**系统能力:** SystemCapability.HiviewDFX.HiTrace
184
185**示例:**
186
187```ts
188// 业务开始前,尝试清除跟踪标识。
189hiTraceChain.clearId();
190// 开启跟踪,跟踪标志是DEFAULT。
191let traceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.DEFAULT);
192// 若干业务逻辑完成后,结束跟踪。
193hiTraceChain.end(traceId);
194```
195
196## hiTraceChain.createSpan
197
198createSpan(): HiTraceId
199
200创建跟踪分支,同步接口。
201
202**系统能力:** SystemCapability.HiviewDFX.HiTrace
203
204**返回值:**
205
206| 类型 | 说明 |
207| -------- | -------- |
208| [HiTraceId](#hitraceid) | HiTraceId实例。 |
209
210**示例:**
211
212```ts
213// 开启跟踪,跟踪标志是DEFAULT。
214let traceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.DEFAULT);
215// 若干业务逻辑完成后,创建跟踪分支。
216let spanTraceId = hiTraceChain.createSpan();
217// 同一跟踪链的跟踪标识的chainId一定相同。
218if (spanTraceId.chainId != traceId.chainId) {
219// 基于异常场景的处理逻辑。
220}
221//业务结束,关闭跟踪。
222hiTraceChain.end(traceId);
223```
224
225## hiTraceChain.tracepoint
226
227tracepoint(mode: HiTraceCommunicationMode, type: HiTraceTracepointType, id: HiTraceId, msg?: string): void
228
229信息埋点,同步接口。
230
231**系统能力:** SystemCapability.HiviewDFX.HiTrace
232
233**参数:**
234
235| 参数名 | 类型 | 必填 | 说明 |
236| -------- | -------- | -------- | -------- |
237| mode | [HiTraceCommunicationMode](#hitracecommunicationmode) | 是 | 信息埋点需要指定的跟踪通信模式。 |
238| type | [HiTraceTracepointType](#hitracetracepointtype)| 是 | 信息埋点需要指定的跟踪埋点类型。 |
239| id   | [HiTraceId](#hitraceid) | 是 | 实施信息埋点操作的HiTraceId实例。 |
240| msg  | string | 否 | 信息埋点操作传入的trace说明信息。 |
241
242**示例:**
243
244```ts
245// 开启跟踪,跟踪标志是INCLUDE_ASYNC与DONOT_CREATE_SPAN的并集。
246let traceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC | hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN);
247// 若干业务逻辑完成后,触发信息埋点操作。
248hiTraceChain.tracepoint(hiTraceChain.HiTraceCommunicationMode.THREAD, hiTraceChain.HiTraceTracepointType.SS, traceId, "Just a example");
249//业务结束,关闭跟踪。
250hiTraceChain.end(traceId);
251```
252
253## hiTraceChain.isValid
254
255isValid(id: HiTraceId): boolean
256
257判断HiTraceId对象是否有效,同步接口。
258
259**系统能力:** SystemCapability.HiviewDFX.HiTrace
260
261**参数:**
262
263| 参数名 | 类型 | 必填 | 说明 |
264| -------- | -------- | -------- | -------- |
265| id  | [HiTraceId](#hitraceid) | 是 | 需要判断是否有效的HiTraceId实例。 |
266
267**返回值:**
268
269| 类型 | 说明 |
270| -------- | -------- |
271| boolean | 返回true表示HiTraceId有效,否则无效。 |
272
273**示例:**
274
275```ts
276// 开启跟踪,跟踪标志是DEFAULT。
277let traceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.DEFAULT);
278// traceIdIsvalid为true
279let traceIdIsvalid = hiTraceChain.isValid(traceId);
280if (traceIdIsvalid) {
281// 基于跟踪标识合法性校验成功的场景的处理逻辑。
282}
283//业务结束,关闭跟踪。
284hiTraceChain.end(traceId);
285```
286
287## hiTraceChain.isFlagEnabled
288
289isFlagEnabled(id: HiTraceId, flag: HiTraceFlag): boolean
290
291判断HiTraceId对象中指定的跟踪标志是否已置位,同步接口。
292
293**系统能力:** SystemCapability.HiviewDFX.HiTrace
294
295**参数:**
296
297| 参数名 | 类型 | 必填 | 说明 |
298| -------- | -------- | -------- | -------- |
299| id  | [HiTraceId](#hitraceid) | 是 | 需要判断指定跟踪标志是否置位的HiTraceId实例。 |
300| flag | [HiTraceFlag](#hitraceflag) | 是 | 指定的跟踪标志。 |
301
302**返回值:**
303
304| 类型 | 说明 |
305| -------- | -------- |
306| boolean | 返回true标识HiTraceId已置位指定的flag,否则没有置位。 |
307
308**示例:**
309
310```ts
311// 开启跟踪,跟踪标志是INCLUDE_ASYNC。
312let traceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC);
313// enabledIncludeAsyncFlag为true。
314let enabledIncludeAsyncFlag = hiTraceChain.isFlagEnabled(traceId, hiTraceChain.HiTraceFlag.INCLUDE_ASYNC);
315if (enabledIncludeAsyncFlag) {
316// 基于INCLUDE_ASYNC跟踪标志已设置场景的处理逻辑。
317}
318//业务结束,关闭跟踪。
319hiTraceChain.end(traceId);
320```
321
322## hiTraceChain.enableFlag
323
324enableFlag(id: HiTraceId, flag: HiTraceFlag): void
325
326置位HiTraceId对象中指定的跟踪标志,同步接口。
327
328**系统能力:** SystemCapability.HiviewDFX.HiTrace
329
330**参数:**
331
332| 参数名 | 类型 | 必填 | 说明 |
333| -------- | -------- | -------- | -------- |
334| id  | [HiTraceId](#hitraceid) | 是 | 需要置位指定跟踪标志的HiTraceId实例。 |
335| flag | [HiTraceFlag](#hitraceflag) | 是 | 指定的跟踪标志。 |
336
337**示例:**
338
339```ts
340// 开启跟踪,跟踪标志是INCLUDE_ASYNC。
341let traceId = hiTraceChain.begin("business", hiTraceChain.HiTraceFlag.INCLUDE_ASYNC);
342// enabledDoNotCreateSpanFlag为false。
343let enabledDoNotCreateSpanFlag = hiTraceChain.isFlagEnabled(traceId, hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN);
344// 设置DONOT_CREATE_SPAN跟踪标志。
345hiTraceChain.enableFlag(traceId, hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN);
346// enabledDoNotCreateSpanFlag为true。
347enabledDoNotCreateSpanFlag = hiTraceChain.isFlagEnabled(traceId, hiTraceChain.HiTraceFlag.DONOT_CREATE_SPAN);
348if (enabledDoNotCreateSpanFlag) {
349// 基于DONOT_CREATE_SPAN跟踪标志已设置场景的处理逻辑。
350}
351//业务结束,关闭跟踪。
352hiTraceChain.end(traceId);
353```
354