1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { SpSystemTrace } from '../SpSystemTrace';
17fb726d48Sopenharmony_ciimport { info } from '../../../log/Log';
18fb726d48Sopenharmony_ciimport { TraceRow } from '../trace/base/TraceRow';
19fb726d48Sopenharmony_ciimport { Utils } from '../trace/base/Utils';
20fb726d48Sopenharmony_ciimport { type EmptyRender } from '../../database/ui-worker/cpu/ProcedureWorkerCPU';
21fb726d48Sopenharmony_ciimport { type ProcessStruct } from '../../database/ui-worker/ProcedureWorkerProcess';
22fb726d48Sopenharmony_ciimport { CpuAbilityMonitorStruct, CpuAbilityRender } from '../../database/ui-worker/ProcedureWorkerCpuAbility';
23fb726d48Sopenharmony_ciimport { MemoryAbilityMonitorStruct, MemoryAbilityRender } from '../../database/ui-worker/ProcedureWorkerMemoryAbility';
24fb726d48Sopenharmony_ciimport { DiskAbilityMonitorStruct, DiskIoAbilityRender } from '../../database/ui-worker/ProcedureWorkerDiskIoAbility';
25fb726d48Sopenharmony_ciimport {
26fb726d48Sopenharmony_ci  NetworkAbilityMonitorStruct,
27fb726d48Sopenharmony_ci  NetworkAbilityRender,
28fb726d48Sopenharmony_ci} from '../../database/ui-worker/ProcedureWorkerNetworkAbility';
29fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker';
30fb726d48Sopenharmony_ciimport { type SnapshotRender, SnapshotStruct } from '../../database/ui-worker/ProcedureWorkerSnapshot';
31fb726d48Sopenharmony_ciimport {
32fb726d48Sopenharmony_ci  abilityBytesInTraceDataSender,
33fb726d48Sopenharmony_ci  abilityBytesReadDataSender,
34fb726d48Sopenharmony_ci  abilityMemoryUsedDataSender,
35fb726d48Sopenharmony_ci  cpuAbilityUserDataSender,
36fb726d48Sopenharmony_ci} from '../../database/data-trafic/AbilityMonitorSender';
37fb726d48Sopenharmony_ciimport {
38fb726d48Sopenharmony_ci  abilityDmaDataSender,
39fb726d48Sopenharmony_ci  abilityGpuMemoryDataSender,
40fb726d48Sopenharmony_ci  abilityPurgeableDataSender,
41fb726d48Sopenharmony_ci} from '../../database/data-trafic/VmTrackerDataSender';
42fb726d48Sopenharmony_ciimport { MemoryConfig } from '../../bean/MemoryConfig';
43fb726d48Sopenharmony_ciimport { queryMemoryMaxData } from '../../database/sql/Memory.sql';
44fb726d48Sopenharmony_ciimport { queryDiskIoMaxData, queryNetWorkMaxData } from '../../database/sql/SqlLite.sql';
45fb726d48Sopenharmony_ciimport { queryAbilityExits, queryCPuAbilityMaxData, queryPurgeableSysData } from '../../database/sql/Ability.sql';
46fb726d48Sopenharmony_ciimport { SpStatisticsHttpUtil } from '../../../statistics/util/SpStatisticsHttpUtil';
47fb726d48Sopenharmony_ciconst networkNameList: Array<string> = ['Bytes In/Sec', 'Bytes Out/Sec', 'Packets In/Sec', 'Packets Out/Sec'];
48fb726d48Sopenharmony_ciconst memoryNameList: Array<string> = ['MemoryTotal', 'Cached', 'SwapTotal'];
49fb726d48Sopenharmony_ciconst diskIONameList: Array<string> = ['Bytes Read/Sec', 'Bytes Written/Sec', 'Read Ops/Sec', 'Written Ops/Sec'];
50fb726d48Sopenharmony_ciconst key = 'abilityMonitor';
51fb726d48Sopenharmony_ci
52fb726d48Sopenharmony_ciexport class SpAbilityMonitorChart {
53fb726d48Sopenharmony_ci  private trace: SpSystemTrace;
54fb726d48Sopenharmony_ci  constructor(trace: SpSystemTrace) {
55fb726d48Sopenharmony_ci    this.trace = trace;
56fb726d48Sopenharmony_ci  }
57fb726d48Sopenharmony_ci  memoryMath = (maxByte: number): string => {
58fb726d48Sopenharmony_ci    let maxByteName = '';
59fb726d48Sopenharmony_ci    if (maxByte > 0) {
60fb726d48Sopenharmony_ci      maxByteName = Utils.getBinaryKBWithUnit(maxByte);
61fb726d48Sopenharmony_ci    }
62fb726d48Sopenharmony_ci    return maxByteName;
63fb726d48Sopenharmony_ci  };
64fb726d48Sopenharmony_ci
65fb726d48Sopenharmony_ci  diskIOMath = (maxByte: number): string => {
66fb726d48Sopenharmony_ci    let maxByteName = '';
67fb726d48Sopenharmony_ci    if (maxByte > 0) {
68fb726d48Sopenharmony_ci      maxByteName = `${maxByte}KB/S`;
69fb726d48Sopenharmony_ci    }
70fb726d48Sopenharmony_ci    return maxByteName;
71fb726d48Sopenharmony_ci  };
72fb726d48Sopenharmony_ci
73fb726d48Sopenharmony_ci  networkMath = (maxValue: number): string => {
74fb726d48Sopenharmony_ci    let maxByteName = '';
75fb726d48Sopenharmony_ci    if (maxValue > 0) {
76fb726d48Sopenharmony_ci      maxByteName = Utils.getBinaryByteWithUnit(maxValue);
77fb726d48Sopenharmony_ci    }
78fb726d48Sopenharmony_ci    return maxByteName;
79fb726d48Sopenharmony_ci  };
80fb726d48Sopenharmony_ci
81fb726d48Sopenharmony_ci  async init(): Promise<void> {
82fb726d48Sopenharmony_ci    let time = new Date().getTime();
83fb726d48Sopenharmony_ci    let result = await queryAbilityExits();
84fb726d48Sopenharmony_ci    info('Ability Monitor Exits Tables size is: ', result!.length);
85fb726d48Sopenharmony_ci    if (result.length <= 0) {
86fb726d48Sopenharmony_ci      return;
87fb726d48Sopenharmony_ci    }
88fb726d48Sopenharmony_ci    let processRow = this.initAbilityRow();
89fb726d48Sopenharmony_ci    if (this.hasTable(result, 'trace_cpu_usage')) {
90fb726d48Sopenharmony_ci      await this.initCpuAbility(processRow);
91fb726d48Sopenharmony_ci    }
92fb726d48Sopenharmony_ci    if (this.hasTable(result, 'sys_memory')) {
93fb726d48Sopenharmony_ci      await this.initMemoryAbility(processRow);
94fb726d48Sopenharmony_ci    }
95fb726d48Sopenharmony_ci    if (this.hasTable(result, 'trace_diskio')) {
96fb726d48Sopenharmony_ci      await this.initDiskAbility(processRow);
97fb726d48Sopenharmony_ci      // 统计diskio插件
98fb726d48Sopenharmony_ci      let requestBody = {
99fb726d48Sopenharmony_ci        eventData: {
100fb726d48Sopenharmony_ci          plugin: ['diskio-plugin']
101fb726d48Sopenharmony_ci        }
102fb726d48Sopenharmony_ci      };
103fb726d48Sopenharmony_ci      SpStatisticsHttpUtil.recordPluginUsage(requestBody);
104fb726d48Sopenharmony_ci    }
105fb726d48Sopenharmony_ci    if (this.hasTable(result, 'trace_network')) {
106fb726d48Sopenharmony_ci      await this.initNetworkAbility(processRow);
107fb726d48Sopenharmony_ci    }
108fb726d48Sopenharmony_ci    // 初始化PurgeableToTal和PurgeablePin泳道图
109fb726d48Sopenharmony_ci    let totalDataList = await queryPurgeableSysData(false);
110fb726d48Sopenharmony_ci    let pinDataList = await queryPurgeableSysData(true);
111fb726d48Sopenharmony_ci    if (totalDataList.length > 0) {
112fb726d48Sopenharmony_ci      await this.initPurgeableTotal(processRow);
113fb726d48Sopenharmony_ci    }
114fb726d48Sopenharmony_ci    if (pinDataList.length > 0) {
115fb726d48Sopenharmony_ci      await this.initPurgeablePin(processRow);
116fb726d48Sopenharmony_ci    }
117fb726d48Sopenharmony_ci    await this.initDmaAbility(processRow);
118fb726d48Sopenharmony_ci    await this.initGpuMemoryAbility(processRow);
119fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - time;
120fb726d48Sopenharmony_ci    info('The time to load the AbilityMonitor data is: ', durTime);
121fb726d48Sopenharmony_ci  }
122fb726d48Sopenharmony_ci
123fb726d48Sopenharmony_ci  private hasTable(result: Array<unknown>, tableName: string): boolean {
124fb726d48Sopenharmony_ci    // @ts-ignore
125fb726d48Sopenharmony_ci    return result.find((o) => {
126fb726d48Sopenharmony_ci      // @ts-ignore
127fb726d48Sopenharmony_ci      return o.event_name === tableName;
128fb726d48Sopenharmony_ci    });
129fb726d48Sopenharmony_ci  }
130fb726d48Sopenharmony_ci
131fb726d48Sopenharmony_ci  private initAbilityRow = (): TraceRow<ProcessStruct> => {
132fb726d48Sopenharmony_ci    let abilityRow = TraceRow.skeleton<ProcessStruct>();
133fb726d48Sopenharmony_ci    abilityRow.rowId = key;
134fb726d48Sopenharmony_ci    abilityRow.rowType = TraceRow.ROW_TYPE_MONITOR;
135fb726d48Sopenharmony_ci    abilityRow.style.height = '40px';
136fb726d48Sopenharmony_ci    abilityRow.rowParentId = '';
137fb726d48Sopenharmony_ci    abilityRow.folder = true;
138fb726d48Sopenharmony_ci    abilityRow.name = 'Ability Monitor';
139fb726d48Sopenharmony_ci    abilityRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
140fb726d48Sopenharmony_ci    abilityRow.selectChangeHandler = this.trace.selectChangeHandler; // @ts-ignore
141fb726d48Sopenharmony_ci    abilityRow.supplier = (): Promise<unknown[]> => new Promise<Array<unknown>>((resolve) => resolve([]));
142fb726d48Sopenharmony_ci    abilityRow.onThreadHandler = (useCache): void => {
143fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
144fb726d48Sopenharmony_ci      if (abilityRow.currentContext) {
145fb726d48Sopenharmony_ci        context = abilityRow.currentContext;
146fb726d48Sopenharmony_ci      } else {
147fb726d48Sopenharmony_ci        context = abilityRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
148fb726d48Sopenharmony_ci      }
149fb726d48Sopenharmony_ci      abilityRow.canvasSave(context);
150fb726d48Sopenharmony_ci      if (abilityRow.expansion) {
151fb726d48Sopenharmony_ci        // @ts-ignore
152fb726d48Sopenharmony_ci        context?.clearRect(0, 0, abilityRow.frame.width, abilityRow.frame.height);
153fb726d48Sopenharmony_ci      } else {
154fb726d48Sopenharmony_ci        (renders.empty as EmptyRender).renderMainThread(
155fb726d48Sopenharmony_ci          {
156fb726d48Sopenharmony_ci            context: context,
157fb726d48Sopenharmony_ci            useCache: useCache,
158fb726d48Sopenharmony_ci            type: '',
159fb726d48Sopenharmony_ci          },
160fb726d48Sopenharmony_ci          abilityRow
161fb726d48Sopenharmony_ci        );
162fb726d48Sopenharmony_ci      }
163fb726d48Sopenharmony_ci      abilityRow.canvasRestore(context, this.trace);
164fb726d48Sopenharmony_ci    };
165fb726d48Sopenharmony_ci    this.trace.rowsEL?.appendChild(abilityRow);
166fb726d48Sopenharmony_ci    return abilityRow;
167fb726d48Sopenharmony_ci  };
168fb726d48Sopenharmony_ci
169fb726d48Sopenharmony_ci  private initCpuAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => {
170fb726d48Sopenharmony_ci    let time = new Date().getTime();
171fb726d48Sopenharmony_ci    let cpuMaxData = await queryCPuAbilityMaxData();
172fb726d48Sopenharmony_ci    let hasTotal = false;
173fb726d48Sopenharmony_ci    let hasUserLoad = false;
174fb726d48Sopenharmony_ci    let hasSystemLoad = false;
175fb726d48Sopenharmony_ci    //@ts-ignore
176fb726d48Sopenharmony_ci    let userLoad = cpuMaxData[0].userLoad;
177fb726d48Sopenharmony_ci    if (userLoad > 0) {
178fb726d48Sopenharmony_ci      hasUserLoad = true;
179fb726d48Sopenharmony_ci    } //@ts-ignore
180fb726d48Sopenharmony_ci    let systemLoad = cpuMaxData[0].systemLoad;
181fb726d48Sopenharmony_ci    if (systemLoad > 0) {
182fb726d48Sopenharmony_ci      hasSystemLoad = true;
183fb726d48Sopenharmony_ci    } //@ts-ignore
184fb726d48Sopenharmony_ci    let totalLoad = cpuMaxData[0].totalLoad;
185fb726d48Sopenharmony_ci    if (totalLoad > 0) {
186fb726d48Sopenharmony_ci      hasTotal = true;
187fb726d48Sopenharmony_ci    }
188fb726d48Sopenharmony_ci    let cpuNameList: Array<string> = ['Total', 'User', 'System'];
189fb726d48Sopenharmony_ci    this.initTotalMonitorTraceRow(processRow, cpuNameList, hasTotal);
190fb726d48Sopenharmony_ci    this.initUserMonitorTraceRow(processRow, cpuNameList, hasUserLoad);
191fb726d48Sopenharmony_ci    this.initSysMonitorTraceRow(processRow, cpuNameList, hasSystemLoad);
192fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - time;
193fb726d48Sopenharmony_ci    info('The time to load the Ability Cpu is: ', durTime);
194fb726d48Sopenharmony_ci  };
195fb726d48Sopenharmony_ci
196fb726d48Sopenharmony_ci  private initUserMonitorTraceRow(processRow: TraceRow<ProcessStruct>, cpuList: Array<string>, load: boolean): void {
197fb726d48Sopenharmony_ci    let userTraceRow = TraceRow.skeleton<CpuAbilityMonitorStruct>();
198fb726d48Sopenharmony_ci    userTraceRow.rowParentId = key;
199fb726d48Sopenharmony_ci    userTraceRow.rowHidden = !processRow.expansion;
200fb726d48Sopenharmony_ci    userTraceRow.rowId = cpuList[1];
201fb726d48Sopenharmony_ci    userTraceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY;
202fb726d48Sopenharmony_ci    userTraceRow.style.height = '40px';
203fb726d48Sopenharmony_ci    userTraceRow.style.width = '100%';
204fb726d48Sopenharmony_ci    userTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
205fb726d48Sopenharmony_ci    userTraceRow.selectChangeHandler = this.trace.selectChangeHandler;
206fb726d48Sopenharmony_ci    userTraceRow.setAttribute('children', '');
207fb726d48Sopenharmony_ci    userTraceRow.name = `CPU ${cpuList[1]} Load`;
208fb726d48Sopenharmony_ci    userTraceRow.supplierFrame = (): Promise<CpuAbilityMonitorStruct[]> =>
209fb726d48Sopenharmony_ci      cpuAbilityUserDataSender(userTraceRow, 'CpuAbilityUserData').then((res): CpuAbilityMonitorStruct[] => {
210fb726d48Sopenharmony_ci        this.computeDur(res);
211fb726d48Sopenharmony_ci        return res;
212fb726d48Sopenharmony_ci      });
213fb726d48Sopenharmony_ci    userTraceRow.focusHandler = (ev): void => {
214fb726d48Sopenharmony_ci      let monitorCpuTip = `${(CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2)}%`;
215fb726d48Sopenharmony_ci      this.trace?.displayTip(
216fb726d48Sopenharmony_ci        userTraceRow,
217fb726d48Sopenharmony_ci        CpuAbilityMonitorStruct.hoverCpuAbilityStruct,
218fb726d48Sopenharmony_ci        `<span>${monitorCpuTip}</span>`
219fb726d48Sopenharmony_ci      );
220fb726d48Sopenharmony_ci    };
221fb726d48Sopenharmony_ci    userTraceRow.findHoverStruct = (): void => {
222fb726d48Sopenharmony_ci      CpuAbilityMonitorStruct.hoverCpuAbilityStruct = userTraceRow.getHoverStruct();
223fb726d48Sopenharmony_ci    };
224fb726d48Sopenharmony_ci    userTraceRow.onThreadHandler = (useCache): void => {
225fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
226fb726d48Sopenharmony_ci      if (userTraceRow.currentContext) {
227fb726d48Sopenharmony_ci        context = userTraceRow.currentContext;
228fb726d48Sopenharmony_ci      } else {
229fb726d48Sopenharmony_ci        context = userTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
230fb726d48Sopenharmony_ci      }
231fb726d48Sopenharmony_ci      userTraceRow.canvasSave(context);
232fb726d48Sopenharmony_ci      (renders.monitorCpu as CpuAbilityRender).renderMainThread(
233fb726d48Sopenharmony_ci        {
234fb726d48Sopenharmony_ci          context: context,
235fb726d48Sopenharmony_ci          useCache: useCache,
236fb726d48Sopenharmony_ci          type: 'monitorCpu1',
237fb726d48Sopenharmony_ci          maxCpuUtilization: 100,
238fb726d48Sopenharmony_ci          maxCpuUtilizationName: load ? '100%' : '0%',
239fb726d48Sopenharmony_ci        },
240fb726d48Sopenharmony_ci        userTraceRow
241fb726d48Sopenharmony_ci      );
242fb726d48Sopenharmony_ci      userTraceRow.canvasRestore(context, this.trace);
243fb726d48Sopenharmony_ci    };
244fb726d48Sopenharmony_ci    processRow.addChildTraceRow(userTraceRow);
245fb726d48Sopenharmony_ci  }
246fb726d48Sopenharmony_ci
247fb726d48Sopenharmony_ci  private initTotalMonitorTraceRow(parent: TraceRow<ProcessStruct>, cpuList: Array<string>, hasTotal: boolean): void {
248fb726d48Sopenharmony_ci    let traceRow = TraceRow.skeleton<CpuAbilityMonitorStruct>();
249fb726d48Sopenharmony_ci    traceRow.rowParentId = key;
250fb726d48Sopenharmony_ci    traceRow.rowHidden = !parent.expansion;
251fb726d48Sopenharmony_ci    traceRow.rowId = cpuList[0];
252fb726d48Sopenharmony_ci    traceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY;
253fb726d48Sopenharmony_ci    traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
254fb726d48Sopenharmony_ci    traceRow.selectChangeHandler = this.trace.selectChangeHandler;
255fb726d48Sopenharmony_ci    traceRow.style.height = '40px';
256fb726d48Sopenharmony_ci    traceRow.style.width = '100%';
257fb726d48Sopenharmony_ci    traceRow.setAttribute('children', '');
258fb726d48Sopenharmony_ci    traceRow.name = `CPU ${cpuList[0]} Load`;
259fb726d48Sopenharmony_ci    traceRow.supplierFrame = (): Promise<CpuAbilityMonitorStruct[]> =>
260fb726d48Sopenharmony_ci      cpuAbilityUserDataSender(traceRow, 'CpuAbilityMonitorData').then((res): CpuAbilityMonitorStruct[] => {
261fb726d48Sopenharmony_ci        this.computeDur(res);
262fb726d48Sopenharmony_ci        return res;
263fb726d48Sopenharmony_ci      });
264fb726d48Sopenharmony_ci    traceRow.focusHandler = (ev): void => {
265fb726d48Sopenharmony_ci      let monitorCpuTip = `${(CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2)}'%'`;
266fb726d48Sopenharmony_ci      this.trace?.displayTip(traceRow, CpuAbilityMonitorStruct.hoverCpuAbilityStruct, `<span>${monitorCpuTip}</span>`);
267fb726d48Sopenharmony_ci    };
268fb726d48Sopenharmony_ci    traceRow.findHoverStruct = (): void => {
269fb726d48Sopenharmony_ci      CpuAbilityMonitorStruct.hoverCpuAbilityStruct = traceRow.getHoverStruct();
270fb726d48Sopenharmony_ci    };
271fb726d48Sopenharmony_ci    traceRow.onThreadHandler = (useCache): void => {
272fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
273fb726d48Sopenharmony_ci      if (traceRow.currentContext) {
274fb726d48Sopenharmony_ci        context = traceRow.currentContext;
275fb726d48Sopenharmony_ci      } else {
276fb726d48Sopenharmony_ci        context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
277fb726d48Sopenharmony_ci      }
278fb726d48Sopenharmony_ci      traceRow.canvasSave(context);
279fb726d48Sopenharmony_ci      (renders.monitorCpu as CpuAbilityRender).renderMainThread(
280fb726d48Sopenharmony_ci        {
281fb726d48Sopenharmony_ci          context: context,
282fb726d48Sopenharmony_ci          useCache: useCache,
283fb726d48Sopenharmony_ci          type: 'monitorCpu0',
284fb726d48Sopenharmony_ci          maxCpuUtilization: 100,
285fb726d48Sopenharmony_ci          maxCpuUtilizationName: hasTotal ? '100%' : '0%',
286fb726d48Sopenharmony_ci        },
287fb726d48Sopenharmony_ci        traceRow
288fb726d48Sopenharmony_ci      );
289fb726d48Sopenharmony_ci      traceRow.canvasRestore(context, this.trace);
290fb726d48Sopenharmony_ci    };
291fb726d48Sopenharmony_ci    parent.addChildTraceRow(traceRow);
292fb726d48Sopenharmony_ci  }
293fb726d48Sopenharmony_ci
294fb726d48Sopenharmony_ci  private initSysMonitorTraceRow(parent: TraceRow<ProcessStruct>, cpuList: Array<string>, hasLoad: boolean): void {
295fb726d48Sopenharmony_ci    let sysTraceRow = TraceRow.skeleton<CpuAbilityMonitorStruct>();
296fb726d48Sopenharmony_ci    sysTraceRow.rowParentId = key;
297fb726d48Sopenharmony_ci    sysTraceRow.rowHidden = !parent.expansion;
298fb726d48Sopenharmony_ci    sysTraceRow.rowId = cpuList[2];
299fb726d48Sopenharmony_ci    sysTraceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY;
300fb726d48Sopenharmony_ci    sysTraceRow.style.height = '40px';
301fb726d48Sopenharmony_ci    sysTraceRow.style.width = '100%';
302fb726d48Sopenharmony_ci    sysTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
303fb726d48Sopenharmony_ci    sysTraceRow.selectChangeHandler = this.trace.selectChangeHandler;
304fb726d48Sopenharmony_ci    sysTraceRow.setAttribute('children', '');
305fb726d48Sopenharmony_ci    sysTraceRow.name = `CPU ${cpuList[2]} Load`;
306fb726d48Sopenharmony_ci    sysTraceRow.supplierFrame = (): Promise<CpuAbilityMonitorStruct[]> =>
307fb726d48Sopenharmony_ci      cpuAbilityUserDataSender(sysTraceRow, 'CpuAbilitySystemData').then((res): CpuAbilityMonitorStruct[] => {
308fb726d48Sopenharmony_ci        this.computeDur(res);
309fb726d48Sopenharmony_ci        return res;
310fb726d48Sopenharmony_ci      });
311fb726d48Sopenharmony_ci    sysTraceRow.focusHandler = (): void => {
312fb726d48Sopenharmony_ci      this.trace?.displayTip(
313fb726d48Sopenharmony_ci        sysTraceRow,
314fb726d48Sopenharmony_ci        CpuAbilityMonitorStruct.hoverCpuAbilityStruct,
315fb726d48Sopenharmony_ci        `<span>${(CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2)}%</span>`
316fb726d48Sopenharmony_ci      );
317fb726d48Sopenharmony_ci    };
318fb726d48Sopenharmony_ci    sysTraceRow.findHoverStruct = (): void => {
319fb726d48Sopenharmony_ci      CpuAbilityMonitorStruct.hoverCpuAbilityStruct = sysTraceRow.getHoverStruct();
320fb726d48Sopenharmony_ci    };
321fb726d48Sopenharmony_ci    sysTraceRow.onThreadHandler = (useCache): void => {
322fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
323fb726d48Sopenharmony_ci      if (sysTraceRow.currentContext) {
324fb726d48Sopenharmony_ci        context = sysTraceRow.currentContext;
325fb726d48Sopenharmony_ci      } else {
326fb726d48Sopenharmony_ci        context = sysTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
327fb726d48Sopenharmony_ci      }
328fb726d48Sopenharmony_ci      sysTraceRow.canvasSave(context);
329fb726d48Sopenharmony_ci      (renders.monitorCpu as CpuAbilityRender).renderMainThread(
330fb726d48Sopenharmony_ci        {
331fb726d48Sopenharmony_ci          context: context,
332fb726d48Sopenharmony_ci          useCache: useCache,
333fb726d48Sopenharmony_ci          type: 'monitorCpu2',
334fb726d48Sopenharmony_ci          maxCpuUtilization: 100,
335fb726d48Sopenharmony_ci          maxCpuUtilizationName: hasLoad ? '100%' : '0%',
336fb726d48Sopenharmony_ci        },
337fb726d48Sopenharmony_ci        sysTraceRow
338fb726d48Sopenharmony_ci      );
339fb726d48Sopenharmony_ci      sysTraceRow.canvasRestore(context, this.trace);
340fb726d48Sopenharmony_ci    };
341fb726d48Sopenharmony_ci    parent.addChildTraceRow(sysTraceRow);
342fb726d48Sopenharmony_ci  }
343fb726d48Sopenharmony_ci
344fb726d48Sopenharmony_ci  private memoryUsedThreadHandle(memoryUsedRow: TraceRow<MemoryAbilityMonitorStruct>, memoryTotal: unknown[]): void {
345fb726d48Sopenharmony_ci    // @ts-ignore
346fb726d48Sopenharmony_ci    let memoryTotalValue = memoryTotal[0].maxValue;
347fb726d48Sopenharmony_ci    let memoryTotalValueName = this.memoryMath(memoryTotalValue);
348fb726d48Sopenharmony_ci    memoryUsedRow.onThreadHandler = (useCache): void => {
349fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
350fb726d48Sopenharmony_ci      if (memoryUsedRow.currentContext) {
351fb726d48Sopenharmony_ci        context = memoryUsedRow.currentContext;
352fb726d48Sopenharmony_ci      } else {
353fb726d48Sopenharmony_ci        context = memoryUsedRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
354fb726d48Sopenharmony_ci      }
355fb726d48Sopenharmony_ci      memoryUsedRow.canvasSave(context);
356fb726d48Sopenharmony_ci      (renders.monitorMemory as MemoryAbilityRender).renderMainThread(
357fb726d48Sopenharmony_ci        {
358fb726d48Sopenharmony_ci          context: context,
359fb726d48Sopenharmony_ci          useCache: useCache,
360fb726d48Sopenharmony_ci          type: 'monitorMemory0',
361fb726d48Sopenharmony_ci          maxMemoryByte: memoryTotalValue,
362fb726d48Sopenharmony_ci          maxMemoryByteName: memoryTotalValueName,
363fb726d48Sopenharmony_ci        },
364fb726d48Sopenharmony_ci        memoryUsedRow
365fb726d48Sopenharmony_ci      );
366fb726d48Sopenharmony_ci      memoryUsedRow.canvasRestore(context, this.trace);
367fb726d48Sopenharmony_ci    };
368fb726d48Sopenharmony_ci  }
369fb726d48Sopenharmony_ci
370fb726d48Sopenharmony_ci  private async initMemoryUsedRow(
371fb726d48Sopenharmony_ci    memoryUsedRow: TraceRow<MemoryAbilityMonitorStruct>, // @ts-ignore
372fb726d48Sopenharmony_ci    parent: TraceRow<unknown>
373fb726d48Sopenharmony_ci  ): Promise<void> {
374fb726d48Sopenharmony_ci    let memoryTotal = await queryMemoryMaxData('sys.mem.total');
375fb726d48Sopenharmony_ci    //@ts-ignore
376fb726d48Sopenharmony_ci    let memoryTotalId = memoryTotal[0].filter_id;
377fb726d48Sopenharmony_ci
378fb726d48Sopenharmony_ci    memoryUsedRow.rowParentId = key;
379fb726d48Sopenharmony_ci    memoryUsedRow.rowHidden = !parent.expansion;
380fb726d48Sopenharmony_ci    memoryUsedRow.rowId = memoryNameList[0];
381fb726d48Sopenharmony_ci    memoryUsedRow.rowType = TraceRow.ROW_TYPE_MEMORY_ABILITY;
382fb726d48Sopenharmony_ci    memoryUsedRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
383fb726d48Sopenharmony_ci    memoryUsedRow.selectChangeHandler = this.trace.selectChangeHandler;
384fb726d48Sopenharmony_ci    memoryUsedRow.style.height = '40px';
385fb726d48Sopenharmony_ci    memoryUsedRow.style.width = '100%';
386fb726d48Sopenharmony_ci    memoryUsedRow.setAttribute('children', '');
387fb726d48Sopenharmony_ci    memoryUsedRow.name = memoryNameList[0];
388fb726d48Sopenharmony_ci    memoryUsedRow.supplierFrame = (): Promise<MemoryAbilityMonitorStruct[]> => {
389fb726d48Sopenharmony_ci      return abilityMemoryUsedDataSender(memoryTotalId, memoryUsedRow).then((res): MemoryAbilityMonitorStruct[] => {
390fb726d48Sopenharmony_ci        this.computeDur(res);
391fb726d48Sopenharmony_ci        return res;
392fb726d48Sopenharmony_ci      });
393fb726d48Sopenharmony_ci    };
394fb726d48Sopenharmony_ci    memoryUsedRow.focusHandler = (ev): void => {
395fb726d48Sopenharmony_ci      this.trace?.displayTip(
396fb726d48Sopenharmony_ci        memoryUsedRow,
397fb726d48Sopenharmony_ci        MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct,
398fb726d48Sopenharmony_ci        `<span>${Utils.getBinaryKBWithUnit(MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.value || 0)}</span>`
399fb726d48Sopenharmony_ci      );
400fb726d48Sopenharmony_ci    };
401fb726d48Sopenharmony_ci    memoryUsedRow.findHoverStruct = (): void => {
402fb726d48Sopenharmony_ci      MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = memoryUsedRow.getHoverStruct();
403fb726d48Sopenharmony_ci    };
404fb726d48Sopenharmony_ci    this.memoryUsedThreadHandle(memoryUsedRow, memoryTotal);
405fb726d48Sopenharmony_ci  }
406fb726d48Sopenharmony_ci
407fb726d48Sopenharmony_ci  private cachedThreadHandler(cachedFilesTraceRow: TraceRow<MemoryAbilityMonitorStruct>, cached: unknown[]): void {
408fb726d48Sopenharmony_ci    // @ts-ignore
409fb726d48Sopenharmony_ci    let cachedValue = cached[0].maxValue;
410fb726d48Sopenharmony_ci    let cachedValueName = this.memoryMath(cachedValue);
411fb726d48Sopenharmony_ci    cachedFilesTraceRow.onThreadHandler = (useCache): void => {
412fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
413fb726d48Sopenharmony_ci      if (cachedFilesTraceRow.currentContext) {
414fb726d48Sopenharmony_ci        context = cachedFilesTraceRow.currentContext;
415fb726d48Sopenharmony_ci      } else {
416fb726d48Sopenharmony_ci        context = cachedFilesTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
417fb726d48Sopenharmony_ci      }
418fb726d48Sopenharmony_ci      cachedFilesTraceRow.canvasSave(context);
419fb726d48Sopenharmony_ci      (renders.monitorMemory as MemoryAbilityRender).renderMainThread(
420fb726d48Sopenharmony_ci        {
421fb726d48Sopenharmony_ci          context: context,
422fb726d48Sopenharmony_ci          useCache: useCache,
423fb726d48Sopenharmony_ci          type: 'monitorMemory1',
424fb726d48Sopenharmony_ci          maxMemoryByte: cachedValue,
425fb726d48Sopenharmony_ci          maxMemoryByteName: cachedValueName,
426fb726d48Sopenharmony_ci        },
427fb726d48Sopenharmony_ci        cachedFilesTraceRow
428fb726d48Sopenharmony_ci      );
429fb726d48Sopenharmony_ci      cachedFilesTraceRow.canvasRestore(context, this.trace);
430fb726d48Sopenharmony_ci    };
431fb726d48Sopenharmony_ci  }
432fb726d48Sopenharmony_ci
433fb726d48Sopenharmony_ci  private async initCachedRow(
434fb726d48Sopenharmony_ci    cachedFilesRow: TraceRow<MemoryAbilityMonitorStruct>, // @ts-ignore
435fb726d48Sopenharmony_ci    parent: TraceRow<unknown>
436fb726d48Sopenharmony_ci  ): Promise<void> {
437fb726d48Sopenharmony_ci    let cached = await queryMemoryMaxData('sys.mem.cached');
438fb726d48Sopenharmony_ci
439fb726d48Sopenharmony_ci    //@ts-ignore
440fb726d48Sopenharmony_ci    let cachedId = cached[0].filter_id;
441fb726d48Sopenharmony_ci    cachedFilesRow.rowParentId = key;
442fb726d48Sopenharmony_ci    cachedFilesRow.rowHidden = !parent.expansion;
443fb726d48Sopenharmony_ci    cachedFilesRow.rowId = memoryNameList[1];
444fb726d48Sopenharmony_ci    cachedFilesRow.rowType = TraceRow.ROW_TYPE_MEMORY_ABILITY;
445fb726d48Sopenharmony_ci    cachedFilesRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
446fb726d48Sopenharmony_ci    cachedFilesRow.selectChangeHandler = this.trace.selectChangeHandler;
447fb726d48Sopenharmony_ci    cachedFilesRow.style.height = '40px';
448fb726d48Sopenharmony_ci    cachedFilesRow.style.width = '100%';
449fb726d48Sopenharmony_ci    cachedFilesRow.setAttribute('children', '');
450fb726d48Sopenharmony_ci    cachedFilesRow.name = memoryNameList[1];
451fb726d48Sopenharmony_ci    cachedFilesRow.supplierFrame = (): Promise<MemoryAbilityMonitorStruct[]> =>
452fb726d48Sopenharmony_ci      abilityMemoryUsedDataSender(cachedId, cachedFilesRow).then((res): MemoryAbilityMonitorStruct[] => {
453fb726d48Sopenharmony_ci        this.computeDur(res);
454fb726d48Sopenharmony_ci        return res;
455fb726d48Sopenharmony_ci      });
456fb726d48Sopenharmony_ci    cachedFilesRow.focusHandler = (ev): void => {
457fb726d48Sopenharmony_ci      this.trace?.displayTip(
458fb726d48Sopenharmony_ci        cachedFilesRow,
459fb726d48Sopenharmony_ci        MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct,
460fb726d48Sopenharmony_ci        `<span>${Utils.getBinaryKBWithUnit(MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.value || 0)}</span>`
461fb726d48Sopenharmony_ci      );
462fb726d48Sopenharmony_ci    };
463fb726d48Sopenharmony_ci    cachedFilesRow.findHoverStruct = (): void => {
464fb726d48Sopenharmony_ci      MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = cachedFilesRow.getHoverStruct();
465fb726d48Sopenharmony_ci    };
466fb726d48Sopenharmony_ci    this.cachedThreadHandler(cachedFilesRow, cached);
467fb726d48Sopenharmony_ci  }
468fb726d48Sopenharmony_ci
469fb726d48Sopenharmony_ci  private compressThreadHandler(compressedRow: TraceRow<MemoryAbilityMonitorStruct>, swap: unknown[]): void {
470fb726d48Sopenharmony_ci    // @ts-ignore
471fb726d48Sopenharmony_ci    let swapValue = swap[0].maxValue;
472fb726d48Sopenharmony_ci    let swapValueName = this.memoryMath(swapValue);
473fb726d48Sopenharmony_ci    compressedRow.onThreadHandler = (useCache): void => {
474fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
475fb726d48Sopenharmony_ci      if (compressedRow.currentContext) {
476fb726d48Sopenharmony_ci        context = compressedRow.currentContext;
477fb726d48Sopenharmony_ci      } else {
478fb726d48Sopenharmony_ci        context = compressedRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
479fb726d48Sopenharmony_ci      }
480fb726d48Sopenharmony_ci      compressedRow.canvasSave(context);
481fb726d48Sopenharmony_ci      (renders.monitorMemory as MemoryAbilityRender).renderMainThread(
482fb726d48Sopenharmony_ci        {
483fb726d48Sopenharmony_ci          context: context,
484fb726d48Sopenharmony_ci          useCache: useCache,
485fb726d48Sopenharmony_ci          type: 'monitorMemory2',
486fb726d48Sopenharmony_ci          maxMemoryByte: swapValue,
487fb726d48Sopenharmony_ci          maxMemoryByteName: swapValueName,
488fb726d48Sopenharmony_ci        },
489fb726d48Sopenharmony_ci        compressedRow
490fb726d48Sopenharmony_ci      );
491fb726d48Sopenharmony_ci      compressedRow.canvasRestore(context, this.trace);
492fb726d48Sopenharmony_ci    };
493fb726d48Sopenharmony_ci  }
494fb726d48Sopenharmony_ci
495fb726d48Sopenharmony_ci  private async initCompressedRow(
496fb726d48Sopenharmony_ci    compressedRow: TraceRow<MemoryAbilityMonitorStruct>, // @ts-ignore
497fb726d48Sopenharmony_ci    parent: TraceRow<unknown>
498fb726d48Sopenharmony_ci  ): Promise<void> {
499fb726d48Sopenharmony_ci    let swap = await queryMemoryMaxData('sys.mem.swap.total');
500fb726d48Sopenharmony_ci    //@ts-ignore
501fb726d48Sopenharmony_ci    let swapId = swap[0].filter_id;
502fb726d48Sopenharmony_ci    compressedRow.rowParentId = key;
503fb726d48Sopenharmony_ci    compressedRow.rowHidden = !parent.expansion;
504fb726d48Sopenharmony_ci    compressedRow.rowId = memoryNameList[2];
505fb726d48Sopenharmony_ci    compressedRow.rowType = TraceRow.ROW_TYPE_MEMORY_ABILITY;
506fb726d48Sopenharmony_ci    compressedRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
507fb726d48Sopenharmony_ci    compressedRow.selectChangeHandler = this.trace.selectChangeHandler;
508fb726d48Sopenharmony_ci    compressedRow.style.height = '40px';
509fb726d48Sopenharmony_ci    compressedRow.style.width = '100%';
510fb726d48Sopenharmony_ci    compressedRow.setAttribute('children', '');
511fb726d48Sopenharmony_ci    compressedRow.name = memoryNameList[2];
512fb726d48Sopenharmony_ci    compressedRow.supplierFrame = (): Promise<MemoryAbilityMonitorStruct[]> =>
513fb726d48Sopenharmony_ci      abilityMemoryUsedDataSender(swapId, compressedRow).then((res): MemoryAbilityMonitorStruct[] => {
514fb726d48Sopenharmony_ci        this.computeDur(res);
515fb726d48Sopenharmony_ci        return res;
516fb726d48Sopenharmony_ci      });
517fb726d48Sopenharmony_ci    compressedRow.focusHandler = (ev): void => {
518fb726d48Sopenharmony_ci      this.trace?.displayTip(
519fb726d48Sopenharmony_ci        compressedRow,
520fb726d48Sopenharmony_ci        MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct,
521fb726d48Sopenharmony_ci        `<span>${Utils.getBinaryKBWithUnit(MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.value || 0)}</span>`
522fb726d48Sopenharmony_ci      );
523fb726d48Sopenharmony_ci    };
524fb726d48Sopenharmony_ci    compressedRow.findHoverStruct = (): void => {
525fb726d48Sopenharmony_ci      MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = compressedRow.getHoverStruct();
526fb726d48Sopenharmony_ci    };
527fb726d48Sopenharmony_ci    this.compressThreadHandler(compressedRow, swap);
528fb726d48Sopenharmony_ci  }
529fb726d48Sopenharmony_ci
530fb726d48Sopenharmony_ci  private initMemoryAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => {
531fb726d48Sopenharmony_ci    let time = new Date().getTime();
532fb726d48Sopenharmony_ci    // sys.mem.total  sys.mem.cached  sys.mem.swap.total
533fb726d48Sopenharmony_ci    let memoryUsedTraceRow = TraceRow.skeleton<MemoryAbilityMonitorStruct>();
534fb726d48Sopenharmony_ci    this.initMemoryUsedRow(memoryUsedTraceRow, processRow);
535fb726d48Sopenharmony_ci    processRow.addChildTraceRow(memoryUsedTraceRow);
536fb726d48Sopenharmony_ci
537fb726d48Sopenharmony_ci    let cachedFilesTraceRow = TraceRow.skeleton<MemoryAbilityMonitorStruct>();
538fb726d48Sopenharmony_ci    this.initCachedRow(cachedFilesTraceRow, processRow);
539fb726d48Sopenharmony_ci    processRow.addChildTraceRow(cachedFilesTraceRow);
540fb726d48Sopenharmony_ci
541fb726d48Sopenharmony_ci    let compressedTraceRow = TraceRow.skeleton<MemoryAbilityMonitorStruct>();
542fb726d48Sopenharmony_ci    this.initCompressedRow(compressedTraceRow, processRow);
543fb726d48Sopenharmony_ci    processRow.addChildTraceRow(compressedTraceRow);
544fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - time;
545fb726d48Sopenharmony_ci    info('The time to load the Ability Memory is: ', durTime);
546fb726d48Sopenharmony_ci  };
547fb726d48Sopenharmony_ci
548fb726d48Sopenharmony_ci  private bytesReadThreadHandler(bytesReadRow: TraceRow<DiskAbilityMonitorStruct>, maxList: unknown[]): void {
549fb726d48Sopenharmony_ci    // @ts-ignore
550fb726d48Sopenharmony_ci    let maxBytesRead = maxList[0].bytesRead;
551fb726d48Sopenharmony_ci    let maxBytesReadName = this.diskIOMath(maxBytesRead);
552fb726d48Sopenharmony_ci    bytesReadRow.onThreadHandler = (useCache): void => {
553fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
554fb726d48Sopenharmony_ci      if (bytesReadRow.currentContext) {
555fb726d48Sopenharmony_ci        context = bytesReadRow.currentContext;
556fb726d48Sopenharmony_ci      } else {
557fb726d48Sopenharmony_ci        context = bytesReadRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
558fb726d48Sopenharmony_ci      }
559fb726d48Sopenharmony_ci      bytesReadRow.canvasSave(context);
560fb726d48Sopenharmony_ci      (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread(
561fb726d48Sopenharmony_ci        {
562fb726d48Sopenharmony_ci          context: context,
563fb726d48Sopenharmony_ci          useCache: useCache,
564fb726d48Sopenharmony_ci          type: 'monitorDiskIo0',
565fb726d48Sopenharmony_ci          maxDiskRate: maxBytesRead,
566fb726d48Sopenharmony_ci          maxDiskRateName: maxBytesReadName,
567fb726d48Sopenharmony_ci        },
568fb726d48Sopenharmony_ci        bytesReadRow
569fb726d48Sopenharmony_ci      );
570fb726d48Sopenharmony_ci      bytesReadRow.canvasRestore(context, this.trace);
571fb726d48Sopenharmony_ci    };
572fb726d48Sopenharmony_ci  }
573fb726d48Sopenharmony_ci
574fb726d48Sopenharmony_ci  private initBytesReadRow(
575fb726d48Sopenharmony_ci    bytesReadRow: TraceRow<DiskAbilityMonitorStruct>, // @ts-ignore
576fb726d48Sopenharmony_ci    parentRow: TraceRow<unknown>,
577fb726d48Sopenharmony_ci    maxList: unknown[]
578fb726d48Sopenharmony_ci  ): void {
579fb726d48Sopenharmony_ci    bytesReadRow.rowParentId = key;
580fb726d48Sopenharmony_ci    bytesReadRow.rowHidden = !parentRow.expansion;
581fb726d48Sopenharmony_ci    bytesReadRow.rowId = diskIONameList[0];
582fb726d48Sopenharmony_ci    bytesReadRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY;
583fb726d48Sopenharmony_ci    bytesReadRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
584fb726d48Sopenharmony_ci    bytesReadRow.selectChangeHandler = this.trace.selectChangeHandler;
585fb726d48Sopenharmony_ci    bytesReadRow.style.height = '40px';
586fb726d48Sopenharmony_ci    bytesReadRow.style.width = '100%';
587fb726d48Sopenharmony_ci    bytesReadRow.setAttribute('children', '');
588fb726d48Sopenharmony_ci    bytesReadRow.name = `Disk ${diskIONameList[0]}`;
589fb726d48Sopenharmony_ci    bytesReadRow.supplierFrame = (): Promise<DiskAbilityMonitorStruct[]> =>
590fb726d48Sopenharmony_ci      abilityBytesReadDataSender(bytesReadRow, 'AbilityBytesReadData').then((res): DiskAbilityMonitorStruct[] => {
591fb726d48Sopenharmony_ci        this.computeDur(res);
592fb726d48Sopenharmony_ci        return res;
593fb726d48Sopenharmony_ci      });
594fb726d48Sopenharmony_ci    bytesReadRow.focusHandler = (ev): void => {
595fb726d48Sopenharmony_ci      this.trace?.displayTip(
596fb726d48Sopenharmony_ci        bytesReadRow,
597fb726d48Sopenharmony_ci        DiskAbilityMonitorStruct.hoverDiskAbilityStruct,
598fb726d48Sopenharmony_ci        `<span>${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S</span>`
599fb726d48Sopenharmony_ci      );
600fb726d48Sopenharmony_ci    };
601fb726d48Sopenharmony_ci    bytesReadRow.findHoverStruct = (): void => {
602fb726d48Sopenharmony_ci      DiskAbilityMonitorStruct.hoverDiskAbilityStruct = bytesReadRow.getHoverStruct();
603fb726d48Sopenharmony_ci    };
604fb726d48Sopenharmony_ci    this.bytesReadThreadHandler(bytesReadRow, maxList);
605fb726d48Sopenharmony_ci  }
606fb726d48Sopenharmony_ci  private bytesWriteThreadHandler(bytesWriteRow: TraceRow<DiskAbilityMonitorStruct>, maxList: unknown[]): void {
607fb726d48Sopenharmony_ci    // @ts-ignore
608fb726d48Sopenharmony_ci    let maxBytesWrite = maxList[0].bytesWrite;
609fb726d48Sopenharmony_ci    let maxBytesWriteName = this.diskIOMath(maxBytesWrite);
610fb726d48Sopenharmony_ci    bytesWriteRow.onThreadHandler = (useCache): void => {
611fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
612fb726d48Sopenharmony_ci      if (bytesWriteRow.currentContext) {
613fb726d48Sopenharmony_ci        context = bytesWriteRow.currentContext;
614fb726d48Sopenharmony_ci      } else {
615fb726d48Sopenharmony_ci        context = bytesWriteRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
616fb726d48Sopenharmony_ci      }
617fb726d48Sopenharmony_ci      bytesWriteRow.canvasSave(context);
618fb726d48Sopenharmony_ci      (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread(
619fb726d48Sopenharmony_ci        {
620fb726d48Sopenharmony_ci          context: context,
621fb726d48Sopenharmony_ci          useCache: useCache,
622fb726d48Sopenharmony_ci          type: 'monitorDiskIo1',
623fb726d48Sopenharmony_ci          maxDiskRate: maxBytesWrite,
624fb726d48Sopenharmony_ci          maxDiskRateName: maxBytesWriteName,
625fb726d48Sopenharmony_ci        },
626fb726d48Sopenharmony_ci        bytesWriteRow
627fb726d48Sopenharmony_ci      );
628fb726d48Sopenharmony_ci      bytesWriteRow.canvasRestore(context, this.trace);
629fb726d48Sopenharmony_ci    };
630fb726d48Sopenharmony_ci  }
631fb726d48Sopenharmony_ci
632fb726d48Sopenharmony_ci  private initBytesWriteRow(
633fb726d48Sopenharmony_ci    bytesWriteRow: TraceRow<DiskAbilityMonitorStruct>, // @ts-ignore
634fb726d48Sopenharmony_ci    parent: TraceRow<unknown>,
635fb726d48Sopenharmony_ci    maxList: unknown[]
636fb726d48Sopenharmony_ci  ): void {
637fb726d48Sopenharmony_ci    bytesWriteRow.rowParentId = key;
638fb726d48Sopenharmony_ci    bytesWriteRow.rowHidden = !parent.expansion;
639fb726d48Sopenharmony_ci    bytesWriteRow.rowId = diskIONameList[1];
640fb726d48Sopenharmony_ci    bytesWriteRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY;
641fb726d48Sopenharmony_ci    bytesWriteRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
642fb726d48Sopenharmony_ci    bytesWriteRow.selectChangeHandler = this.trace.selectChangeHandler;
643fb726d48Sopenharmony_ci    bytesWriteRow.style.height = '40px';
644fb726d48Sopenharmony_ci    bytesWriteRow.style.width = '100%';
645fb726d48Sopenharmony_ci    bytesWriteRow.setAttribute('children', '');
646fb726d48Sopenharmony_ci    bytesWriteRow.name = `Disk ${diskIONameList[1]}`;
647fb726d48Sopenharmony_ci    bytesWriteRow.supplierFrame = (): Promise<DiskAbilityMonitorStruct[]> =>
648fb726d48Sopenharmony_ci      abilityBytesReadDataSender(bytesWriteRow, 'AbilityBytesWrittenData').then((res): DiskAbilityMonitorStruct[] => {
649fb726d48Sopenharmony_ci        this.computeDur(res);
650fb726d48Sopenharmony_ci        return res;
651fb726d48Sopenharmony_ci      });
652fb726d48Sopenharmony_ci    bytesWriteRow.focusHandler = (ev): void => {
653fb726d48Sopenharmony_ci      this.trace?.displayTip(
654fb726d48Sopenharmony_ci        bytesWriteRow,
655fb726d48Sopenharmony_ci        DiskAbilityMonitorStruct.hoverDiskAbilityStruct,
656fb726d48Sopenharmony_ci        `<span>${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S</span>`
657fb726d48Sopenharmony_ci      );
658fb726d48Sopenharmony_ci    };
659fb726d48Sopenharmony_ci    bytesWriteRow.findHoverStruct = (): void => {
660fb726d48Sopenharmony_ci      DiskAbilityMonitorStruct.hoverDiskAbilityStruct = bytesWriteRow.getHoverStruct();
661fb726d48Sopenharmony_ci    };
662fb726d48Sopenharmony_ci    this.bytesWriteThreadHandler(bytesWriteRow, maxList);
663fb726d48Sopenharmony_ci  }
664fb726d48Sopenharmony_ci
665fb726d48Sopenharmony_ci  private initReadOspRow(
666fb726d48Sopenharmony_ci    readOpsRow: TraceRow<DiskAbilityMonitorStruct>,
667fb726d48Sopenharmony_ci    // @ts-ignore
668fb726d48Sopenharmony_ci    parent: TraceRow<unknown>,
669fb726d48Sopenharmony_ci    maxList: unknown[]
670fb726d48Sopenharmony_ci  ): void {
671fb726d48Sopenharmony_ci    // @ts-ignore
672fb726d48Sopenharmony_ci    let maxReadOps = maxList[0].readOps;
673fb726d48Sopenharmony_ci    let maxReadOpsName = this.diskIOMath(maxReadOps);
674fb726d48Sopenharmony_ci    readOpsRow.rowParentId = key;
675fb726d48Sopenharmony_ci    readOpsRow.rowHidden = !parent.expansion;
676fb726d48Sopenharmony_ci    readOpsRow.rowId = diskIONameList[2];
677fb726d48Sopenharmony_ci    readOpsRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY;
678fb726d48Sopenharmony_ci    readOpsRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
679fb726d48Sopenharmony_ci    readOpsRow.selectChangeHandler = this.trace.selectChangeHandler;
680fb726d48Sopenharmony_ci    readOpsRow.style.height = '40px';
681fb726d48Sopenharmony_ci    readOpsRow.style.width = '100%';
682fb726d48Sopenharmony_ci    readOpsRow.setAttribute('children', '');
683fb726d48Sopenharmony_ci    readOpsRow.name = `Disk ${diskIONameList[2]}`;
684fb726d48Sopenharmony_ci    readOpsRow.supplierFrame = (): Promise<DiskAbilityMonitorStruct[]> =>
685fb726d48Sopenharmony_ci      abilityBytesReadDataSender(readOpsRow, 'AbilityReadOpsData').then((res): DiskAbilityMonitorStruct[] => {
686fb726d48Sopenharmony_ci        this.computeDur(res);
687fb726d48Sopenharmony_ci        return res;
688fb726d48Sopenharmony_ci      });
689fb726d48Sopenharmony_ci    readOpsRow.focusHandler = (ev): void => {
690fb726d48Sopenharmony_ci      this.trace?.displayTip(
691fb726d48Sopenharmony_ci        readOpsRow,
692fb726d48Sopenharmony_ci        DiskAbilityMonitorStruct.hoverDiskAbilityStruct,
693fb726d48Sopenharmony_ci        `<span>${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S</span>`
694fb726d48Sopenharmony_ci      );
695fb726d48Sopenharmony_ci    };
696fb726d48Sopenharmony_ci    readOpsRow.findHoverStruct = (): void => {
697fb726d48Sopenharmony_ci      DiskAbilityMonitorStruct.hoverDiskAbilityStruct = readOpsRow.getHoverStruct();
698fb726d48Sopenharmony_ci    };
699fb726d48Sopenharmony_ci    readOpsRow.onThreadHandler = (useCache): void => {
700fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
701fb726d48Sopenharmony_ci      if (readOpsRow.currentContext) {
702fb726d48Sopenharmony_ci        context = readOpsRow.currentContext;
703fb726d48Sopenharmony_ci      } else {
704fb726d48Sopenharmony_ci        context = readOpsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
705fb726d48Sopenharmony_ci      }
706fb726d48Sopenharmony_ci      readOpsRow.canvasSave(context);
707fb726d48Sopenharmony_ci      (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread(
708fb726d48Sopenharmony_ci        {
709fb726d48Sopenharmony_ci          context: context,
710fb726d48Sopenharmony_ci          useCache: useCache,
711fb726d48Sopenharmony_ci          type: 'monitorDiskIo2',
712fb726d48Sopenharmony_ci          maxDiskRate: maxReadOps,
713fb726d48Sopenharmony_ci          maxDiskRateName: maxReadOpsName,
714fb726d48Sopenharmony_ci        },
715fb726d48Sopenharmony_ci        readOpsRow
716fb726d48Sopenharmony_ci      );
717fb726d48Sopenharmony_ci      readOpsRow.canvasRestore(context, this.trace);
718fb726d48Sopenharmony_ci    };
719fb726d48Sopenharmony_ci  }
720fb726d48Sopenharmony_ci
721fb726d48Sopenharmony_ci  private writeOspThreadHandler(writeOpsRow: TraceRow<DiskAbilityMonitorStruct>, maxList: unknown[]): void {
722fb726d48Sopenharmony_ci    // @ts-ignore
723fb726d48Sopenharmony_ci    let maxWriteOps = maxList[0].writeOps;
724fb726d48Sopenharmony_ci    let maxWriteOpsName = this.diskIOMath(maxWriteOps);
725fb726d48Sopenharmony_ci    writeOpsRow.onThreadHandler = (useCache): void => {
726fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
727fb726d48Sopenharmony_ci      if (writeOpsRow.currentContext) {
728fb726d48Sopenharmony_ci        context = writeOpsRow.currentContext;
729fb726d48Sopenharmony_ci      } else {
730fb726d48Sopenharmony_ci        context = writeOpsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
731fb726d48Sopenharmony_ci      }
732fb726d48Sopenharmony_ci      writeOpsRow.canvasSave(context);
733fb726d48Sopenharmony_ci      (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread(
734fb726d48Sopenharmony_ci        {
735fb726d48Sopenharmony_ci          context: context,
736fb726d48Sopenharmony_ci          useCache: useCache,
737fb726d48Sopenharmony_ci          type: 'monitorDiskIo3',
738fb726d48Sopenharmony_ci          maxDiskRate: maxWriteOps,
739fb726d48Sopenharmony_ci          maxDiskRateName: maxWriteOpsName,
740fb726d48Sopenharmony_ci        },
741fb726d48Sopenharmony_ci        writeOpsRow
742fb726d48Sopenharmony_ci      );
743fb726d48Sopenharmony_ci      writeOpsRow.canvasRestore(context, this.trace);
744fb726d48Sopenharmony_ci    };
745fb726d48Sopenharmony_ci  }
746fb726d48Sopenharmony_ci
747fb726d48Sopenharmony_ci  private initWriteOspRow(
748fb726d48Sopenharmony_ci    writeOpsRow: TraceRow<DiskAbilityMonitorStruct>, // @ts-ignore
749fb726d48Sopenharmony_ci    parent: TraceRow<unknown>,
750fb726d48Sopenharmony_ci    maxList: unknown[]
751fb726d48Sopenharmony_ci  ): void {
752fb726d48Sopenharmony_ci    writeOpsRow.rowParentId = key;
753fb726d48Sopenharmony_ci    writeOpsRow.rowHidden = !parent.expansion;
754fb726d48Sopenharmony_ci    writeOpsRow.rowId = diskIONameList[3];
755fb726d48Sopenharmony_ci    writeOpsRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY;
756fb726d48Sopenharmony_ci    writeOpsRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
757fb726d48Sopenharmony_ci    writeOpsRow.selectChangeHandler = this.trace.selectChangeHandler;
758fb726d48Sopenharmony_ci    writeOpsRow.style.height = '40px';
759fb726d48Sopenharmony_ci    writeOpsRow.style.width = '100%';
760fb726d48Sopenharmony_ci    writeOpsRow.setAttribute('children', '');
761fb726d48Sopenharmony_ci    writeOpsRow.name = `Disk ${diskIONameList[3]}`;
762fb726d48Sopenharmony_ci    writeOpsRow.supplierFrame = (): Promise<DiskAbilityMonitorStruct[]> =>
763fb726d48Sopenharmony_ci      abilityBytesReadDataSender(writeOpsRow, 'AbilityWrittenOpsData').then((res): DiskAbilityMonitorStruct[] => {
764fb726d48Sopenharmony_ci        this.computeDur(res);
765fb726d48Sopenharmony_ci        return res;
766fb726d48Sopenharmony_ci      });
767fb726d48Sopenharmony_ci    writeOpsRow.focusHandler = (ev): void => {
768fb726d48Sopenharmony_ci      this.trace?.displayTip(
769fb726d48Sopenharmony_ci        writeOpsRow,
770fb726d48Sopenharmony_ci        DiskAbilityMonitorStruct.hoverDiskAbilityStruct,
771fb726d48Sopenharmony_ci        `<span>${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S</span>`
772fb726d48Sopenharmony_ci      );
773fb726d48Sopenharmony_ci    };
774fb726d48Sopenharmony_ci    writeOpsRow.findHoverStruct = (): void => {
775fb726d48Sopenharmony_ci      DiskAbilityMonitorStruct.hoverDiskAbilityStruct = writeOpsRow.getHoverStruct();
776fb726d48Sopenharmony_ci    };
777fb726d48Sopenharmony_ci    this.writeOspThreadHandler(writeOpsRow, maxList);
778fb726d48Sopenharmony_ci  }
779fb726d48Sopenharmony_ci  private initDiskAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => {
780fb726d48Sopenharmony_ci    let time = new Date().getTime();
781fb726d48Sopenharmony_ci    let maxList = await queryDiskIoMaxData();
782fb726d48Sopenharmony_ci
783fb726d48Sopenharmony_ci    let bytesReadTraceRow = TraceRow.skeleton<DiskAbilityMonitorStruct>();
784fb726d48Sopenharmony_ci    this.initBytesReadRow(bytesReadTraceRow, processRow, maxList);
785fb726d48Sopenharmony_ci    processRow.addChildTraceRow(bytesReadTraceRow);
786fb726d48Sopenharmony_ci
787fb726d48Sopenharmony_ci    let bytesWrittenTraceRow = TraceRow.skeleton<DiskAbilityMonitorStruct>();
788fb726d48Sopenharmony_ci    this.initBytesWriteRow(bytesWrittenTraceRow, processRow, maxList);
789fb726d48Sopenharmony_ci    processRow.addChildTraceRow(bytesWrittenTraceRow);
790fb726d48Sopenharmony_ci
791fb726d48Sopenharmony_ci    let readOpsTraceRow = TraceRow.skeleton<DiskAbilityMonitorStruct>();
792fb726d48Sopenharmony_ci    this.initReadOspRow(readOpsTraceRow, processRow, maxList);
793fb726d48Sopenharmony_ci    processRow.addChildTraceRow(readOpsTraceRow);
794fb726d48Sopenharmony_ci
795fb726d48Sopenharmony_ci    let writtenOpsTraceRow = TraceRow.skeleton<DiskAbilityMonitorStruct>();
796fb726d48Sopenharmony_ci    this.initWriteOspRow(writtenOpsTraceRow, processRow, maxList);
797fb726d48Sopenharmony_ci    processRow.addChildTraceRow(writtenOpsTraceRow);
798fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - time;
799fb726d48Sopenharmony_ci    info('The time to load the Ability DiskIO is: ', durTime);
800fb726d48Sopenharmony_ci  };
801fb726d48Sopenharmony_ci
802fb726d48Sopenharmony_ci  private bytesInRowThreadHandler(row: TraceRow<NetworkAbilityMonitorStruct>, maxList: unknown[]): void {
803fb726d48Sopenharmony_ci    // @ts-ignore
804fb726d48Sopenharmony_ci    let maxBytesIn = maxList[0].maxIn;
805fb726d48Sopenharmony_ci    let maxInByteName = this.networkMath(maxBytesIn);
806fb726d48Sopenharmony_ci    row.onThreadHandler = (useCache): void => {
807fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
808fb726d48Sopenharmony_ci      if (row.currentContext) {
809fb726d48Sopenharmony_ci        context = row.currentContext;
810fb726d48Sopenharmony_ci      } else {
811fb726d48Sopenharmony_ci        context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
812fb726d48Sopenharmony_ci      }
813fb726d48Sopenharmony_ci      row.canvasSave(context);
814fb726d48Sopenharmony_ci      (renders.monitorNetwork as NetworkAbilityRender).renderMainThread(
815fb726d48Sopenharmony_ci        {
816fb726d48Sopenharmony_ci          context: context,
817fb726d48Sopenharmony_ci          useCache: useCache,
818fb726d48Sopenharmony_ci          type: 'monitorNetwork0',
819fb726d48Sopenharmony_ci          maxNetworkRate: maxBytesIn,
820fb726d48Sopenharmony_ci          maxNetworkRateName: maxInByteName,
821fb726d48Sopenharmony_ci        },
822fb726d48Sopenharmony_ci        row
823fb726d48Sopenharmony_ci      );
824fb726d48Sopenharmony_ci      row.canvasRestore(context, this.trace);
825fb726d48Sopenharmony_ci    };
826fb726d48Sopenharmony_ci  }
827fb726d48Sopenharmony_ci
828fb726d48Sopenharmony_ci  private initBytesInRow(
829fb726d48Sopenharmony_ci    row: TraceRow<NetworkAbilityMonitorStruct>,
830fb726d48Sopenharmony_ci    parent: TraceRow<ProcessStruct>,
831fb726d48Sopenharmony_ci    maxList: unknown[]
832fb726d48Sopenharmony_ci  ): void {
833fb726d48Sopenharmony_ci    row.rowParentId = key;
834fb726d48Sopenharmony_ci    row.rowHidden = !parent.expansion;
835fb726d48Sopenharmony_ci    row.rowId = networkNameList[0];
836fb726d48Sopenharmony_ci    row.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY;
837fb726d48Sopenharmony_ci    row.favoriteChangeHandler = this.trace.favoriteChangeHandler;
838fb726d48Sopenharmony_ci    row.selectChangeHandler = this.trace.selectChangeHandler;
839fb726d48Sopenharmony_ci    row.style.height = '40px';
840fb726d48Sopenharmony_ci    row.style.width = '100%';
841fb726d48Sopenharmony_ci    row.setAttribute('children', '');
842fb726d48Sopenharmony_ci    row.name = `Network ${networkNameList[0]}`;
843fb726d48Sopenharmony_ci    row.supplierFrame = (): Promise<NetworkAbilityMonitorStruct[]> =>
844fb726d48Sopenharmony_ci      abilityBytesInTraceDataSender(row, 'AbilityBytesInTraceData').then((res): NetworkAbilityMonitorStruct[] => {
845fb726d48Sopenharmony_ci        this.computeDur(res);
846fb726d48Sopenharmony_ci        return res;
847fb726d48Sopenharmony_ci      });
848fb726d48Sopenharmony_ci    row.focusHandler = (ev): void => {
849fb726d48Sopenharmony_ci      this.trace?.displayTip(
850fb726d48Sopenharmony_ci        row,
851fb726d48Sopenharmony_ci        NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct,
852fb726d48Sopenharmony_ci        `<span>${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.value || 0)}</span>`
853fb726d48Sopenharmony_ci      );
854fb726d48Sopenharmony_ci    };
855fb726d48Sopenharmony_ci    row.findHoverStruct = (): void => {
856fb726d48Sopenharmony_ci      NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = row.getHoverStruct();
857fb726d48Sopenharmony_ci    };
858fb726d48Sopenharmony_ci    this.bytesInRowThreadHandler(row, maxList);
859fb726d48Sopenharmony_ci  }
860fb726d48Sopenharmony_ci  private bytesOutRowThreadHandler(row: TraceRow<NetworkAbilityMonitorStruct>, maxList: unknown[]): void {
861fb726d48Sopenharmony_ci    // @ts-ignore
862fb726d48Sopenharmony_ci    let maxBytesOut = maxList[0].maxOut;
863fb726d48Sopenharmony_ci    let maxOutByteName = this.networkMath(maxBytesOut);
864fb726d48Sopenharmony_ci    row.onThreadHandler = (useCache): void => {
865fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
866fb726d48Sopenharmony_ci      if (row.currentContext) {
867fb726d48Sopenharmony_ci        context = row.currentContext;
868fb726d48Sopenharmony_ci      } else {
869fb726d48Sopenharmony_ci        context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
870fb726d48Sopenharmony_ci      }
871fb726d48Sopenharmony_ci      row.canvasSave(context);
872fb726d48Sopenharmony_ci      (renders.monitorNetwork as NetworkAbilityRender).renderMainThread(
873fb726d48Sopenharmony_ci        {
874fb726d48Sopenharmony_ci          context: context,
875fb726d48Sopenharmony_ci          useCache: useCache,
876fb726d48Sopenharmony_ci          type: 'monitorNetwork1',
877fb726d48Sopenharmony_ci          maxNetworkRate: maxBytesOut,
878fb726d48Sopenharmony_ci          maxNetworkRateName: maxOutByteName,
879fb726d48Sopenharmony_ci        },
880fb726d48Sopenharmony_ci        row
881fb726d48Sopenharmony_ci      );
882fb726d48Sopenharmony_ci      row.canvasRestore(context, this.trace);
883fb726d48Sopenharmony_ci    };
884fb726d48Sopenharmony_ci  }
885fb726d48Sopenharmony_ci
886fb726d48Sopenharmony_ci  private initBytesOutRow(
887fb726d48Sopenharmony_ci    row: TraceRow<NetworkAbilityMonitorStruct>,
888fb726d48Sopenharmony_ci    parent: TraceRow<ProcessStruct>,
889fb726d48Sopenharmony_ci    maxList: unknown[]
890fb726d48Sopenharmony_ci  ): void {
891fb726d48Sopenharmony_ci    row.rowParentId = key;
892fb726d48Sopenharmony_ci    row.rowHidden = !parent.expansion;
893fb726d48Sopenharmony_ci    row.rowId = networkNameList[1];
894fb726d48Sopenharmony_ci    row.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY;
895fb726d48Sopenharmony_ci    row.favoriteChangeHandler = this.trace.favoriteChangeHandler;
896fb726d48Sopenharmony_ci    row.selectChangeHandler = this.trace.selectChangeHandler;
897fb726d48Sopenharmony_ci    row.style.height = '40px';
898fb726d48Sopenharmony_ci    row.style.width = '100%';
899fb726d48Sopenharmony_ci    row.setAttribute('children', '');
900fb726d48Sopenharmony_ci    row.name = `Network ${networkNameList[1]}`;
901fb726d48Sopenharmony_ci    row.supplierFrame = (): Promise<NetworkAbilityMonitorStruct[]> =>
902fb726d48Sopenharmony_ci      abilityBytesInTraceDataSender(row, 'AbilityBytesOutTraceData').then((res): NetworkAbilityMonitorStruct[] => {
903fb726d48Sopenharmony_ci        this.computeDur(res);
904fb726d48Sopenharmony_ci        return res;
905fb726d48Sopenharmony_ci      });
906fb726d48Sopenharmony_ci    row.focusHandler = (ev): void => {
907fb726d48Sopenharmony_ci      this.trace?.displayTip(
908fb726d48Sopenharmony_ci        row,
909fb726d48Sopenharmony_ci        NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct,
910fb726d48Sopenharmony_ci        `<span>${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.value || 0)}</span>`
911fb726d48Sopenharmony_ci      );
912fb726d48Sopenharmony_ci    };
913fb726d48Sopenharmony_ci    row.findHoverStruct = (): void => {
914fb726d48Sopenharmony_ci      NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = row.getHoverStruct();
915fb726d48Sopenharmony_ci    };
916fb726d48Sopenharmony_ci    this.bytesOutRowThreadHandler(row, maxList);
917fb726d48Sopenharmony_ci  }
918fb726d48Sopenharmony_ci
919fb726d48Sopenharmony_ci  private packetInRowThreadHandler(row: TraceRow<NetworkAbilityMonitorStruct>, maxList: unknown[]): void {
920fb726d48Sopenharmony_ci    // @ts-ignore
921fb726d48Sopenharmony_ci    let maxPacketIn = maxList[0].maxPacketIn;
922fb726d48Sopenharmony_ci    let maxInPacketName = this.networkMath(maxPacketIn);
923fb726d48Sopenharmony_ci    row.onThreadHandler = (useCache): void => {
924fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
925fb726d48Sopenharmony_ci      if (row.currentContext) {
926fb726d48Sopenharmony_ci        context = row.currentContext;
927fb726d48Sopenharmony_ci      } else {
928fb726d48Sopenharmony_ci        context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
929fb726d48Sopenharmony_ci      }
930fb726d48Sopenharmony_ci      row.canvasSave(context);
931fb726d48Sopenharmony_ci      (renders.monitorNetwork as NetworkAbilityRender).renderMainThread(
932fb726d48Sopenharmony_ci        {
933fb726d48Sopenharmony_ci          context: context,
934fb726d48Sopenharmony_ci          useCache: useCache,
935fb726d48Sopenharmony_ci          type: 'monitorNetwork-Packet2',
936fb726d48Sopenharmony_ci          maxNetworkRate: maxPacketIn,
937fb726d48Sopenharmony_ci          maxNetworkRateName: maxInPacketName,
938fb726d48Sopenharmony_ci        },
939fb726d48Sopenharmony_ci        row
940fb726d48Sopenharmony_ci      );
941fb726d48Sopenharmony_ci      row.canvasRestore(context, this.trace);
942fb726d48Sopenharmony_ci    };
943fb726d48Sopenharmony_ci  }
944fb726d48Sopenharmony_ci
945fb726d48Sopenharmony_ci  private initPacketInRow(
946fb726d48Sopenharmony_ci    row: TraceRow<NetworkAbilityMonitorStruct>,
947fb726d48Sopenharmony_ci    parent: TraceRow<ProcessStruct>,
948fb726d48Sopenharmony_ci    maxList: unknown[]
949fb726d48Sopenharmony_ci  ): void {
950fb726d48Sopenharmony_ci    row.rowParentId = key;
951fb726d48Sopenharmony_ci    row.rowHidden = !parent.expansion;
952fb726d48Sopenharmony_ci    row.rowId = networkNameList[2];
953fb726d48Sopenharmony_ci    row.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY;
954fb726d48Sopenharmony_ci    row.favoriteChangeHandler = this.trace.favoriteChangeHandler;
955fb726d48Sopenharmony_ci    row.selectChangeHandler = this.trace.selectChangeHandler;
956fb726d48Sopenharmony_ci    row.style.height = '40px';
957fb726d48Sopenharmony_ci    row.style.width = '100%';
958fb726d48Sopenharmony_ci    row.setAttribute('children', '');
959fb726d48Sopenharmony_ci    row.name = `Network ${networkNameList[2]}`;
960fb726d48Sopenharmony_ci    row.supplierFrame = (): Promise<NetworkAbilityMonitorStruct[]> =>
961fb726d48Sopenharmony_ci      abilityBytesInTraceDataSender(row, 'AbilityPacketInTraceData').then((res): NetworkAbilityMonitorStruct[] => {
962fb726d48Sopenharmony_ci        this.computeDur(res);
963fb726d48Sopenharmony_ci        return res;
964fb726d48Sopenharmony_ci      });
965fb726d48Sopenharmony_ci    row.focusHandler = (ev): void => {
966fb726d48Sopenharmony_ci      this.trace?.displayTip(
967fb726d48Sopenharmony_ci        row,
968fb726d48Sopenharmony_ci        NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct,
969fb726d48Sopenharmony_ci        `<span>${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.value || 0)}</span>`
970fb726d48Sopenharmony_ci      );
971fb726d48Sopenharmony_ci    };
972fb726d48Sopenharmony_ci    row.findHoverStruct = (): void => {
973fb726d48Sopenharmony_ci      NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = row.getHoverStruct();
974fb726d48Sopenharmony_ci    };
975fb726d48Sopenharmony_ci    this.packetInRowThreadHandler(row, maxList);
976fb726d48Sopenharmony_ci  }
977fb726d48Sopenharmony_ci
978fb726d48Sopenharmony_ci  private packetOutRowThreadHandler(row: TraceRow<NetworkAbilityMonitorStruct>, maxList: unknown[]): void {
979fb726d48Sopenharmony_ci    // @ts-ignore
980fb726d48Sopenharmony_ci    let maxPacketOut = maxList[0].maxPacketOut;
981fb726d48Sopenharmony_ci    let maxOutPacketName = this.networkMath(maxPacketOut);
982fb726d48Sopenharmony_ci    row.onThreadHandler = (useCache): void => {
983fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
984fb726d48Sopenharmony_ci      if (row.currentContext) {
985fb726d48Sopenharmony_ci        context = row.currentContext;
986fb726d48Sopenharmony_ci      } else {
987fb726d48Sopenharmony_ci        context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
988fb726d48Sopenharmony_ci      }
989fb726d48Sopenharmony_ci      row.canvasSave(context);
990fb726d48Sopenharmony_ci      (renders.monitorNetwork as NetworkAbilityRender).renderMainThread(
991fb726d48Sopenharmony_ci        {
992fb726d48Sopenharmony_ci          context: context,
993fb726d48Sopenharmony_ci          useCache: useCache,
994fb726d48Sopenharmony_ci          type: 'monitorNetwork3',
995fb726d48Sopenharmony_ci          maxNetworkRate: maxPacketOut,
996fb726d48Sopenharmony_ci          maxNetworkRateName: maxOutPacketName,
997fb726d48Sopenharmony_ci        },
998fb726d48Sopenharmony_ci        row
999fb726d48Sopenharmony_ci      );
1000fb726d48Sopenharmony_ci      row.canvasRestore(context, this.trace);
1001fb726d48Sopenharmony_ci    };
1002fb726d48Sopenharmony_ci  }
1003fb726d48Sopenharmony_ci
1004fb726d48Sopenharmony_ci  private initPacketOutRow(
1005fb726d48Sopenharmony_ci    row: TraceRow<NetworkAbilityMonitorStruct>,
1006fb726d48Sopenharmony_ci    parent: TraceRow<ProcessStruct>,
1007fb726d48Sopenharmony_ci    maxList: unknown[]
1008fb726d48Sopenharmony_ci  ): void {
1009fb726d48Sopenharmony_ci    row.rowParentId = key;
1010fb726d48Sopenharmony_ci    row.rowHidden = !parent.expansion;
1011fb726d48Sopenharmony_ci    row.rowId = networkNameList[3];
1012fb726d48Sopenharmony_ci    row.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY;
1013fb726d48Sopenharmony_ci    row.favoriteChangeHandler = this.trace.favoriteChangeHandler;
1014fb726d48Sopenharmony_ci    row.selectChangeHandler = this.trace.selectChangeHandler;
1015fb726d48Sopenharmony_ci    row.style.height = '40px';
1016fb726d48Sopenharmony_ci    row.style.width = '100%';
1017fb726d48Sopenharmony_ci    row.setAttribute('children', '');
1018fb726d48Sopenharmony_ci    row.name = `Network ${networkNameList[3]}`;
1019fb726d48Sopenharmony_ci    row.supplierFrame = (): Promise<NetworkAbilityMonitorStruct[]> =>
1020fb726d48Sopenharmony_ci      abilityBytesInTraceDataSender(row, 'AbilityPacketsOutTraceData').then((res): NetworkAbilityMonitorStruct[] => {
1021fb726d48Sopenharmony_ci        this.computeDur(res);
1022fb726d48Sopenharmony_ci        return res;
1023fb726d48Sopenharmony_ci      });
1024fb726d48Sopenharmony_ci    row.focusHandler = (ev): void => {
1025fb726d48Sopenharmony_ci      if (NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct) {
1026fb726d48Sopenharmony_ci        this.trace?.displayTip(
1027fb726d48Sopenharmony_ci          row,
1028fb726d48Sopenharmony_ci          NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct,
1029fb726d48Sopenharmony_ci          `<span>${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct!.value!)}</span>`
1030fb726d48Sopenharmony_ci        );
1031fb726d48Sopenharmony_ci      }
1032fb726d48Sopenharmony_ci    };
1033fb726d48Sopenharmony_ci    row.findHoverStruct = (): void => {
1034fb726d48Sopenharmony_ci      NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = row.getHoverStruct();
1035fb726d48Sopenharmony_ci    };
1036fb726d48Sopenharmony_ci    this.packetOutRowThreadHandler(row, maxList);
1037fb726d48Sopenharmony_ci  }
1038fb726d48Sopenharmony_ci  private initNetworkAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => {
1039fb726d48Sopenharmony_ci    let time = new Date().getTime();
1040fb726d48Sopenharmony_ci    let maxList = await queryNetWorkMaxData();
1041fb726d48Sopenharmony_ci    let bytesInTraceRow = TraceRow.skeleton<NetworkAbilityMonitorStruct>();
1042fb726d48Sopenharmony_ci    this.initBytesInRow(bytesInTraceRow, processRow, maxList);
1043fb726d48Sopenharmony_ci    processRow.addChildTraceRow(bytesInTraceRow);
1044fb726d48Sopenharmony_ci
1045fb726d48Sopenharmony_ci    let bytesOutTraceRow = TraceRow.skeleton<NetworkAbilityMonitorStruct>();
1046fb726d48Sopenharmony_ci    this.initBytesOutRow(bytesOutTraceRow, processRow, maxList);
1047fb726d48Sopenharmony_ci    processRow.addChildTraceRow(bytesOutTraceRow);
1048fb726d48Sopenharmony_ci    let packetInTraceRow = TraceRow.skeleton<NetworkAbilityMonitorStruct>();
1049fb726d48Sopenharmony_ci    this.initPacketInRow(packetInTraceRow, processRow, maxList);
1050fb726d48Sopenharmony_ci    processRow.addChildTraceRow(packetInTraceRow);
1051fb726d48Sopenharmony_ci    let packetOutTraceRow = TraceRow.skeleton<NetworkAbilityMonitorStruct>();
1052fb726d48Sopenharmony_ci    this.initPacketOutRow(packetOutTraceRow, processRow, maxList);
1053fb726d48Sopenharmony_ci    processRow.addChildTraceRow(packetOutTraceRow);
1054fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - time;
1055fb726d48Sopenharmony_ci    info('The time to load the Ability Network is: ', durTime);
1056fb726d48Sopenharmony_ci  };
1057fb726d48Sopenharmony_ci
1058fb726d48Sopenharmony_ci  private async initPurgeableTotal(processRow: TraceRow<ProcessStruct>): Promise<void> {
1059fb726d48Sopenharmony_ci    let snapshotDur = MemoryConfig.getInstance().snapshotDur;
1060fb726d48Sopenharmony_ci    let totalTraceRow = this.initTraceRow(
1061fb726d48Sopenharmony_ci      'System Purgeable Total',
1062fb726d48Sopenharmony_ci      'Purgeable Total',
1063fb726d48Sopenharmony_ci      TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY,
1064fb726d48Sopenharmony_ci      processRow
1065fb726d48Sopenharmony_ci    ); // @ts-ignore
1066fb726d48Sopenharmony_ci    totalTraceRow.supplierFrame = (): Promise<unknown[]> =>
1067fb726d48Sopenharmony_ci      new Promise<Array<unknown>>((resolve): void =>
1068fb726d48Sopenharmony_ci        resolve(
1069fb726d48Sopenharmony_ci          abilityPurgeableDataSender(totalTraceRow, snapshotDur, false).then((res: unknown[]) => {
1070fb726d48Sopenharmony_ci            this.setName(res);
1071fb726d48Sopenharmony_ci            return res;
1072fb726d48Sopenharmony_ci          })
1073fb726d48Sopenharmony_ci        )
1074fb726d48Sopenharmony_ci      );
1075fb726d48Sopenharmony_ci    processRow.addChildTraceRow(totalTraceRow);
1076fb726d48Sopenharmony_ci  }
1077fb726d48Sopenharmony_ci
1078fb726d48Sopenharmony_ci  private async initPurgeablePin(processRow: TraceRow<ProcessStruct>): Promise<void> {
1079fb726d48Sopenharmony_ci    let snapshotDur = MemoryConfig.getInstance().snapshotDur;
1080fb726d48Sopenharmony_ci    let pinTraceRow = this.initTraceRow(
1081fb726d48Sopenharmony_ci      'System Purgeable Pin',
1082fb726d48Sopenharmony_ci      'Purgeable Pin',
1083fb726d48Sopenharmony_ci      TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY,
1084fb726d48Sopenharmony_ci      processRow
1085fb726d48Sopenharmony_ci    ); // @ts-ignore
1086fb726d48Sopenharmony_ci    pinTraceRow.supplierFrame = (): Promise<unknown[]> =>
1087fb726d48Sopenharmony_ci      new Promise<Array<unknown>>((resolve): void =>
1088fb726d48Sopenharmony_ci        resolve(
1089fb726d48Sopenharmony_ci          abilityPurgeableDataSender(pinTraceRow, snapshotDur, true).then((res: unknown[]) => {
1090fb726d48Sopenharmony_ci            this.setName(res);
1091fb726d48Sopenharmony_ci            return res;
1092fb726d48Sopenharmony_ci          })
1093fb726d48Sopenharmony_ci        )
1094fb726d48Sopenharmony_ci      );
1095fb726d48Sopenharmony_ci    processRow.addChildTraceRow(pinTraceRow);
1096fb726d48Sopenharmony_ci  }
1097fb726d48Sopenharmony_ci
1098fb726d48Sopenharmony_ci  /**
1099fb726d48Sopenharmony_ci   * DMA
1100fb726d48Sopenharmony_ci   * @param processRow
1101fb726d48Sopenharmony_ci   */
1102fb726d48Sopenharmony_ci  private initDmaAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => {
1103fb726d48Sopenharmony_ci    let snapshotDur = MemoryConfig.getInstance().snapshotDur;
1104fb726d48Sopenharmony_ci    let dmaTraceRow = this.initTraceRow('abilityMonitorDma', 'DMA', TraceRow.ROW_TYPE_DMA_ABILITY, processRow); // @ts-ignore
1105fb726d48Sopenharmony_ci    dmaTraceRow.supplierFrame = (): Promise<unknown[]> =>
1106fb726d48Sopenharmony_ci      new Promise<Array<unknown>>((resolve): void =>
1107fb726d48Sopenharmony_ci        resolve(
1108fb726d48Sopenharmony_ci          abilityDmaDataSender(dmaTraceRow, snapshotDur).then((res: unknown[]) => {
1109fb726d48Sopenharmony_ci            this.setName(res);
1110fb726d48Sopenharmony_ci            return res;
1111fb726d48Sopenharmony_ci          })
1112fb726d48Sopenharmony_ci        )
1113fb726d48Sopenharmony_ci      );
1114fb726d48Sopenharmony_ci    processRow.addChildTraceRow(dmaTraceRow);
1115fb726d48Sopenharmony_ci  };
1116fb726d48Sopenharmony_ci
1117fb726d48Sopenharmony_ci  /**
1118fb726d48Sopenharmony_ci   * Skia Gpu Memory
1119fb726d48Sopenharmony_ci   * @param processRow
1120fb726d48Sopenharmony_ci   */
1121fb726d48Sopenharmony_ci  private initGpuMemoryAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => {
1122fb726d48Sopenharmony_ci    let snapshotDur = MemoryConfig.getInstance().snapshotDur;
1123fb726d48Sopenharmony_ci    let gpuMemoryTraceRow = this.initTraceRow(
1124fb726d48Sopenharmony_ci      'abilityMonitorGpuMemory',
1125fb726d48Sopenharmony_ci      'Skia Gpu Memory',
1126fb726d48Sopenharmony_ci      TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY,
1127fb726d48Sopenharmony_ci      processRow
1128fb726d48Sopenharmony_ci    ); // @ts-ignore
1129fb726d48Sopenharmony_ci    gpuMemoryTraceRow.supplierFrame = (): Promise<unknown[]> =>
1130fb726d48Sopenharmony_ci      new Promise<Array<unknown>>((resolve): void =>
1131fb726d48Sopenharmony_ci        resolve(
1132fb726d48Sopenharmony_ci          abilityGpuMemoryDataSender(gpuMemoryTraceRow, snapshotDur).then((res: unknown[]) => {
1133fb726d48Sopenharmony_ci            this.setName(res);
1134fb726d48Sopenharmony_ci            return res;
1135fb726d48Sopenharmony_ci          })
1136fb726d48Sopenharmony_ci        )
1137fb726d48Sopenharmony_ci      );
1138fb726d48Sopenharmony_ci    processRow.addChildTraceRow(gpuMemoryTraceRow);
1139fb726d48Sopenharmony_ci  };
1140fb726d48Sopenharmony_ci
1141fb726d48Sopenharmony_ci  private initTraceRow(
1142fb726d48Sopenharmony_ci    rowId: string,
1143fb726d48Sopenharmony_ci    rowName: string,
1144fb726d48Sopenharmony_ci    type: string,
1145fb726d48Sopenharmony_ci    processRow: TraceRow<ProcessStruct>
1146fb726d48Sopenharmony_ci  ): TraceRow<SnapshotStruct> {
1147fb726d48Sopenharmony_ci    let abilityMonitor = TraceRow.skeleton<SnapshotStruct>();
1148fb726d48Sopenharmony_ci    abilityMonitor.rowParentId = key;
1149fb726d48Sopenharmony_ci    abilityMonitor.rowHidden = !processRow.expansion;
1150fb726d48Sopenharmony_ci    abilityMonitor.rowId = rowId;
1151fb726d48Sopenharmony_ci    abilityMonitor.rowType = type;
1152fb726d48Sopenharmony_ci    abilityMonitor.favoriteChangeHandler = this.trace.favoriteChangeHandler;
1153fb726d48Sopenharmony_ci    abilityMonitor.selectChangeHandler = this.trace.selectChangeHandler;
1154fb726d48Sopenharmony_ci    abilityMonitor.style.height = '40px';
1155fb726d48Sopenharmony_ci    abilityMonitor.style.width = '100%';
1156fb726d48Sopenharmony_ci    abilityMonitor.setAttribute('children', '');
1157fb726d48Sopenharmony_ci    abilityMonitor.name = rowName;
1158fb726d48Sopenharmony_ci    abilityMonitor.addTemplateTypes('Memory');
1159fb726d48Sopenharmony_ci    abilityMonitor.focusHandler = (): void => {
1160fb726d48Sopenharmony_ci      this.showTip(abilityMonitor);
1161fb726d48Sopenharmony_ci    };
1162fb726d48Sopenharmony_ci    abilityMonitor.findHoverStruct = (): void => {
1163fb726d48Sopenharmony_ci      SnapshotStruct.hoverSnapshotStruct = abilityMonitor.getHoverStruct();
1164fb726d48Sopenharmony_ci    };
1165fb726d48Sopenharmony_ci    abilityMonitor.onThreadHandler = (useCache): void => {
1166fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
1167fb726d48Sopenharmony_ci      if (abilityMonitor.currentContext) {
1168fb726d48Sopenharmony_ci        context = abilityMonitor.currentContext;
1169fb726d48Sopenharmony_ci      } else {
1170fb726d48Sopenharmony_ci        context = abilityMonitor.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
1171fb726d48Sopenharmony_ci      }
1172fb726d48Sopenharmony_ci      abilityMonitor.canvasSave(context);
1173fb726d48Sopenharmony_ci      (renders.snapshot as SnapshotRender).renderMainThread(
1174fb726d48Sopenharmony_ci        {
1175fb726d48Sopenharmony_ci          context: context,
1176fb726d48Sopenharmony_ci          useCache: useCache,
1177fb726d48Sopenharmony_ci          type: 'snapshot',
1178fb726d48Sopenharmony_ci        },
1179fb726d48Sopenharmony_ci        abilityMonitor
1180fb726d48Sopenharmony_ci      );
1181fb726d48Sopenharmony_ci      abilityMonitor.canvasRestore(context, this.trace);
1182fb726d48Sopenharmony_ci    };
1183fb726d48Sopenharmony_ci    return abilityMonitor;
1184fb726d48Sopenharmony_ci  }
1185fb726d48Sopenharmony_ci
1186fb726d48Sopenharmony_ci  private showTip(traceRow: TraceRow<SnapshotStruct>): void {
1187fb726d48Sopenharmony_ci    this.trace?.displayTip(
1188fb726d48Sopenharmony_ci      traceRow,
1189fb726d48Sopenharmony_ci      SnapshotStruct.hoverSnapshotStruct,
1190fb726d48Sopenharmony_ci      `<span>Name: ${SnapshotStruct.hoverSnapshotStruct?.name || ''}</span>
1191fb726d48Sopenharmony_ci      <span>Size: ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}</span>`
1192fb726d48Sopenharmony_ci    );
1193fb726d48Sopenharmony_ci  }
1194fb726d48Sopenharmony_ci
1195fb726d48Sopenharmony_ci  private setName(data: Array<unknown>): void {
1196fb726d48Sopenharmony_ci    if (data.length > 0) {
1197fb726d48Sopenharmony_ci      data.forEach((item, index) => {
1198fb726d48Sopenharmony_ci        // @ts-ignore
1199fb726d48Sopenharmony_ci        item.name = `SnapShot ${index}`;
1200fb726d48Sopenharmony_ci      });
1201fb726d48Sopenharmony_ci    }
1202fb726d48Sopenharmony_ci  }
1203fb726d48Sopenharmony_ci
1204fb726d48Sopenharmony_ci  private computeDur(list: Array<unknown>): void {
1205fb726d48Sopenharmony_ci    let endNS = TraceRow.range?.endNS || 0;
1206fb726d48Sopenharmony_ci    list.forEach((it, i) => {
1207fb726d48Sopenharmony_ci      if (i === list.length - 1) {
1208fb726d48Sopenharmony_ci        // @ts-ignore
1209fb726d48Sopenharmony_ci        it.dur = (endNS || 0) - (it.startNS || 0);
1210fb726d48Sopenharmony_ci      } else {
1211fb726d48Sopenharmony_ci        // @ts-ignore
1212fb726d48Sopenharmony_ci        it.dur = (list[i + 1].startNS || 0) - (it.startNS || 0);
1213fb726d48Sopenharmony_ci      }
1214fb726d48Sopenharmony_ci    });
1215fb726d48Sopenharmony_ci  }
1216fb726d48Sopenharmony_ci}
1217