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