1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15import {
16  GpuMemory,
17  GpuMemoryComparison,
18  SystemCpuSummary,
19  SystemDiskIOSummary,
20  SystemNetworkSummary,
21} from '../../bean/AbilityMonitor';
22import { query } from '../SqlLite';
23import { CpuAbilityMonitorStruct } from '../ui-worker/ProcedureWorkerCpuAbility';
24import { MemoryAbilityMonitorStruct } from '../ui-worker/ProcedureWorkerMemoryAbility';
25import { DiskAbilityMonitorStruct } from '../ui-worker/ProcedureWorkerDiskIoAbility';
26import { NetworkAbilityMonitorStruct } from '../ui-worker/ProcedureWorkerNetworkAbility';
27import type { SnapshotStruct } from '../ui-worker/ProcedureWorkerSnapshot';
28
29export const getTabCpuAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemCpuSummary>> =>
30  query<SystemCpuSummary>(
31    'getTabCpuAbilityData',
32    `SELECT
33        ( n.ts - TR.start_ts ) AS startTime,
34        n.dur AS duration,
35        n.total_load AS totalLoad,
36        n.user_load AS userLoad,
37        n.system_load AS systemLoad,
38        n.process_num AS threads 
39        FROM
40        cpu_usage AS n,
41        trace_range AS TR 
42        WHERE
43        ( n.ts - TR.start_ts ) >= ifnull((
44        SELECT
45        ( usage.ts - TR.start_ts ) 
46        FROM
47        cpu_usage usage,
48        trace_range TR 
49        WHERE
50        ( usage.ts - TR.start_ts ) <= $leftNS 
51        ORDER BY
52        usage.ts DESC 
53        LIMIT 1 
54        ),0)
55        AND ( n.ts - TR.start_ts ) <= $rightNS 
56        ORDER BY
57        startTime ASC;
58    `,
59    { $leftNS: leftNs, $rightNS: rightNs }
60  );
61export const getTabMemoryAbilityData = (
62  leftNs: number,
63  rightNs: number
64): Promise<
65  Array<{
66    startTime: number;
67    value: string;
68    name: string;
69  }>
70> =>
71  query(
72    'getTabMemoryAbilityData',
73    `SELECT
74        m.ts AS startTime,
75        GROUP_CONCAT( IFNULL( m.value, 0 ) ) AS value,
76        GROUP_CONCAT( f.name ) AS name 
77        FROM
78        sys_mem_measure AS m
79        INNER JOIN sys_event_filter AS f ON m.filter_id = f.id 
80        AND (f.name = 'sys.mem.total' 
81         or f.name = 'sys.mem.free'
82         or f.name = 'sys.mem.buffers'
83         or f.name = 'sys.mem.cached' 
84         or f.name = 'sys.mem.shmem'
85         or f.name = 'sys.mem.slab'
86         or f.name = 'sys.mem.swap.total'
87         or f.name = 'sys.mem.swap.free'
88         or f.name = 'sys.mem.mapped'
89         or f.name = 'sys.mem.vmalloc.used'
90         or f.name = 'sys.mem.page.tables'
91         or f.name = 'sys.mem.kernel.stack'
92         or f.name = 'sys.mem.active'
93         or f.name = 'sys.mem.inactive'
94         or f.name = 'sys.mem.unevictable'
95         or f.name = 'sys.mem.vmalloc.total'
96         or f.name = 'sys.mem.slab.unreclaimable'
97         or f.name = 'sys.mem.cma.total'
98         or f.name = 'sys.mem.cma.free'
99         or f.name = 'sys.mem.kernel.reclaimable'
100         or f.name = 'sys.mem.zram'
101         ) 
102        AND m.ts >= ifnull((
103        SELECT
104        m.ts AS startTime 
105        FROM
106        sys_mem_measure AS m
107        INNER JOIN sys_event_filter AS f ON m.filter_id = f.id 
108        AND m.ts <= $leftNS 
109        AND (f.name = 'sys.mem.total'
110         or f.name = 'sys.mem.kernel.stack'
111         or f.name = 'sys.mem.free'
112         or f.name = 'sys.mem.swap.free'
113         or f.name = 'sys.mem.cma.free'
114         or f.name = 'sys.mem.inactive'
115         or f.name = 'sys.mem.buffers'
116         or f.name = 'sys.mem.cached' 
117         or f.name = 'sys.mem.shmem'
118         or f.name = 'sys.mem.slab'
119         or f.name = 'sys.mem.swap.total'
120         or f.name = 'sys.mem.vmalloc.used'
121         or f.name = 'sys.mem.page.tables'
122         or f.name = 'sys.mem.active'
123         or f.name = 'sys.mem.unevictable'
124         or f.name = 'sys.mem.vmalloc.total'
125         or f.name = 'sys.mem.slab.unreclaimable'
126         or f.name = 'sys.mem.cma.total'
127         or f.name = 'sys.mem.mapped'
128         or f.name = 'sys.mem.kernel.reclaimable'
129         or f.name = 'sys.mem.zram'
130         ) 
131        ORDER BY
132        m.ts DESC 
133        LIMIT 1 
134        ),0)
135        AND m.ts <= $rightNS GROUP BY m.ts;`,
136    { $leftNS: leftNs, $rightNS: rightNs }
137  );
138export const getTabNetworkAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemNetworkSummary>> =>
139  query<SystemNetworkSummary>(
140    'getTabNetworkAbilityData',
141    `SELECT
142            ( n.ts - TR.start_ts ) AS startTime,
143            n.dur AS duration,
144            n.rx AS dataReceived,
145            n.tx_speed AS dataReceivedSec,
146            n.tx AS dataSend,
147            n.rx_speed AS dataSendSec,
148            n.packet_in AS packetsIn,
149            n.packet_in_sec AS packetsInSec,
150            n.packet_out AS packetsOut,
151            n.packet_out_sec AS packetsOutSec 
152            FROM
153            network AS n,
154            trace_range AS TR 
155            WHERE
156            ( n.ts - TR.start_ts ) >= ifnull((
157            SELECT
158            ( nn.ts - T.start_ts ) AS startTime 
159            FROM
160            network nn,
161            trace_range T 
162            WHERE
163            ( nn.ts - T.start_ts ) <= $leftNS
164            ORDER BY
165            nn.ts DESC 
166            LIMIT 1 
167            ),0)  
168            AND ( n.ts - TR.start_ts ) <= $rightNS 
169            ORDER BY
170            startTime ASC`,
171    { $leftNS: leftNs, $rightNS: rightNs }
172  );
173export const getTabDiskAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemDiskIOSummary>> =>
174  query<SystemDiskIOSummary>(
175    'getTabDiskAbilityData',
176    `SELECT
177        ( n.ts - TR.start_ts ) AS startTime,
178        n.dur AS duration,
179        n.rd AS dataRead,
180        n.rd_speed AS dataReadSec,
181        n.wr AS dataWrite,
182        n.wr_speed AS dataWriteSec,
183        n.rd_count AS readsIn,
184        n.rd_count_speed AS readsInSec,
185        n.wr_count AS writeOut,
186        n.wr_count_speed AS writeOutSec 
187        FROM
188        diskio AS n,
189        trace_range AS TR 
190        WHERE
191        ( n.ts - TR.start_ts ) >= ifnull((
192        SELECT
193        ( nn.ts - T.start_ts ) AS startTime 
194        FROM
195        diskio AS nn,
196        trace_range AS T 
197        WHERE
198        ( nn.ts - T.start_ts ) <= $leftNS 
199        ORDER BY
200        nn.ts DESC 
201        LIMIT 1 
202        ),0)
203        AND ( n.ts - TR.start_ts ) <= $rightNS 
204        ORDER BY
205        startTime ASC;
206    `,
207    { $leftNS: leftNs, $rightNS: rightNs }
208  );
209
210export const queryCpuAbilityData = (): Promise<Array<CpuAbilityMonitorStruct>> =>
211  query(
212    'queryCpuAbilityData',
213    `select 
214        (t.total_load) as value,
215        (t.ts - TR.start_ts) as startNS
216        from cpu_usage t, trace_range AS TR;`
217  );
218
219export const queryCpuAbilityUserData = (): Promise<Array<CpuAbilityMonitorStruct>> =>
220  query(
221    'queryCpuAbilityUserData',
222    `select 
223        t.user_load as value,
224        (t.ts - TR.start_ts) as startNS
225        from cpu_usage t, trace_range AS TR;`
226  );
227
228export const queryCpuAbilitySystemData = (): Promise<Array<CpuAbilityMonitorStruct>> =>
229  query(
230    'queryCpuAbilitySystemData',
231    `select 
232        t.system_load as value,
233        (t.ts - TR.start_ts) as startNS
234        from cpu_usage t, trace_range AS TR;`
235  );
236
237export const queryMemoryUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
238  query(
239    'queryMemoryUsedAbilityData',
240    `select 
241        t.value as value,
242        (t.ts - TR.start_ts) as startNS
243        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`,
244    { $id: id }
245  );
246
247export const queryCachedFilesAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
248  query(
249    'queryCachedFilesAbilityData',
250    `select 
251        t.value as value,
252        (t.ts - TR.start_ts) as startNS
253        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`,
254    { $id: id }
255  );
256
257export const queryCompressedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
258  query(
259    'queryCompressedAbilityData',
260    `select 
261        t.value as value,
262        (t.ts - TR.start_ts) as startNS
263        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`,
264    { $id: id }
265  );
266
267export const querySwapUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
268  query(
269    'querySwapUsedAbilityData',
270    `select 
271        t.value as value,
272        (t.ts - TR.start_ts) as startNS
273        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`,
274    { $id: id }
275  );
276
277export const queryBytesReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
278  query(
279    'queryBytesReadAbilityData',
280    `select 
281        t.rd_speed as value,
282        (t.ts - TR.start_ts) as startNS
283        from diskio t, trace_range AS TR;`
284  );
285
286export const queryBytesWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
287  query(
288    'queryBytesWrittenAbilityData',
289    `select 
290        t.wr_speed as value,
291        (t.ts - TR.start_ts) as startNS
292        from diskio t, trace_range AS TR;`
293  );
294
295export const queryReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
296  query(
297    'queryReadAbilityData',
298    `select 
299        t.rd_count_speed as value,
300        (t.ts - TR.start_ts) as startNS
301        from diskio t, trace_range AS TR;`
302  );
303
304export const queryWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
305  query(
306    'queryWrittenAbilityData',
307    `select 
308        t.wr_count_speed as value,
309        (t.ts - TR.start_ts) as startNS
310        from diskio t, trace_range AS TR;`
311  );
312
313export const queryBytesInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
314  query(
315    'queryBytesInAbilityData',
316    `select 
317        t.tx_speed as value,
318        (t.ts - TR.start_ts) as startNS
319        from network t, trace_range AS TR;`
320  );
321
322export const queryBytesOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
323  query(
324    'queryBytesOutAbilityData',
325    `select 
326        t.rx_speed as value,
327        (t.ts - TR.start_ts) as startNS
328        from network t, trace_range AS TR;`
329  );
330
331export const queryPacketsInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
332  query(
333    'queryPacketsInAbilityData',
334    `select 
335        t.packet_in_sec as value,
336        (t.ts - TR.start_ts) as startNS
337        from network t, trace_range AS TR;`
338  );
339
340export const queryPacketsOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
341  query(
342    'queryPacketsOutAbilityData',
343    `select 
344        t.packet_out_sec as value,
345        (t.ts - TR.start_ts) as startNS
346        from network t, trace_range AS TR;`
347  );
348export const queryAbilityExits = (): //@ts-ignore
349Promise<Array<unknown>> =>
350  query(
351    'queryAbilityExits',
352    `select 
353      event_name 
354      from stat s 
355      where s.event_name in ('trace_diskio','trace_network', 'trace_cpu_usage','sys_memory') 
356      and s.stat_type ='received' and s.count > 0`
357  );
358export const queryCPuAbilityMaxData = (): //@ts-ignore
359Promise<Array<unknown>> =>
360  query(
361    'queryCPuAbilityMaxData',
362    `select ifnull(max(total_load),0) as totalLoad, 
363                ifnull(max(user_load),0) as userLoad,
364                ifnull(max(system_load),0) as systemLoad
365                from cpu_usage`
366  );
367//   Ability Monitor SkiaGpuMemory泳道图
368export const queryGpuMemoryAbilityData = (): Promise<Array<SnapshotStruct>> =>
369  query(
370    'queryGpuMemoryAbilityData',
371    `SELECT
372    (A.ts - B.start_ts) as startNs,
373    sum(A.used_gpu_size) as value
374    FROM memory_process_gpu A,trace_range B
375    WHERE A.ts < B.end_ts
376    GROUP by A.ts
377    LIMIT 1;`
378  );
379
380//   Ability Monitor Dma泳道图
381export const queryDmaAbilityData = (): Promise<Array<SnapshotStruct>> =>
382  query(
383    'queryDmaAbilityData',
384    `SELECT
385      (A.ts - B.start_ts) as startNs,
386      sum(A.size) as value,
387      E.data as expTaskComm,
388      A.flag as flag
389    FROM memory_dma A,trace_range B
390    left join data_dict as E on E.id=A.exp_task_comm_id
391    WHERE
392      A.flag = 0
393      AND A.ts < B.end_ts
394    GROUP by A.ts
395    LIMIT 1;`
396  );
397// Ability Monitor Purgeable泳道图
398export const queryPurgeableSysData = (
399  isPin?: boolean
400): //@ts-ignore
401Promise<Array<unknown>> => {
402  const pinCondition = isPin ? ' AND a.ref_count > 0' : '';
403  const names = isPin ? " ('sys.mem.pined.purg')" : "('sys.mem.active.purg','sys.mem.inactive.purg')";
404  return query(
405    'queryPurgeableSysData',
406    `SELECT
407      startNs,
408      sum( value ) AS value
409  FROM
410      (
411      SELECT
412          m.ts - tr.start_ts AS startNs,
413          sum( m.value ) AS value
414      FROM
415          sys_mem_measure m,
416          trace_range tr
417          LEFT JOIN sys_event_filter f ON f.id = m.filter_id
418      WHERE
419          m.ts < tr.end_ts
420          AND f.name IN ${names}
421      GROUP BY
422          m.ts UNION ALL
423      SELECT
424          a.ts - tr.start_ts AS startNs,
425          sum( a.size ) AS value
426      FROM
427          memory_ashmem a,
428          trace_range tr
429      WHERE
430          a.ts < tr.end_ts
431          AND a.flag = 0
432          ${pinCondition}
433          GROUP BY
434              a.ts
435          )
436      GROUP BY startNs
437      LIMIT 1`
438  );
439};
440
441//Ability Monitor Purgeable 框选 tab页
442export const querySysPurgeableTab = (
443  leftNs: number,
444  rightNs: number,
445  dur: number,
446  isPin?: boolean
447): //@ts-ignore
448Promise<Array<unknown>> => {
449  let pinsql = isPin ? ' AND ref_count > 0' : '';
450  const names = isPin ? " ('sys.mem.pined.purg')" : "('sys.mem.active.purg','sys.mem.inactive.purg')";
451  return query(
452    'querySysPurgeableTab',
453    `SELECT name, MAX( size ) AS maxSize,MIN( size ) AS minSize,AVG( size ) AS avgSize
454    FROM
455        (SELECT
456          'ShmPurg' AS name,
457          ts - tr.start_ts AS startTs,
458          SUM( size ) AS size
459        FROM
460          memory_ashmem,
461          trace_range tr
462        WHERE flag = 0
463        ${pinsql}
464        GROUP BY ts UNION
465        SELECT
466        CASE
467          WHEN
468            f.name = 'sys.mem.active.purg' THEN
469              'ActivePurg'
470              WHEN f.name = 'sys.mem.inactive.purg' THEN
471              'InActivePurg' ELSE 'PinedPurg'
472            END AS name,
473            m.ts - tr.start_ts AS startTs,
474            m.value AS size
475          FROM
476            sys_mem_measure m,
477            trace_range tr
478            LEFT JOIN sys_event_filter f ON f.id = m.filter_id
479          WHERE
480            f.name IN ${names}
481          ),
482          trace_range tr
483        WHERE ${leftNs} <= startTs + ${dur} AND ${rightNs} >= startTs
484        GROUP BY name`
485  );
486};
487
488//Ability Monitor Purgeable 点选 tab页
489export const querySysPurgeableSelectionTab = (
490  startNs: number,
491  isPin?: boolean
492): //@ts-ignore
493Promise<Array<unknown>> => {
494  const pinSql = isPin ? ' AND ref_count > 0' : '';
495  const names = isPin ? " ('sys.mem.pined.purg')" : "('sys.mem.active.purg','sys.mem.inactive.purg')";
496  return query(
497    'querySysPurgeableSelectionTab',
498    `SELECT
499    ( CASE WHEN f.name = 'sys.mem.active.purg' THEN 'ActivePurg' WHEN f.name = 'sys.mem.inactive.purg' THEN 'InActivePurg' ELSE 'PinedPurg' END ) AS name,
500    m.value AS value
501    FROM
502    sys_mem_measure m,
503    trace_range tr
504    LEFT JOIN sys_event_filter f ON f.id = m.filter_id
505    WHERE
506    f.name IN ${names}
507    AND m.ts - tr.start_ts = ${startNs} 
508    UNION
509    SELECT
510    'ShmPurg' AS name,
511    SUM( size ) AS value
512    FROM
513    memory_ashmem,
514    trace_range tr
515    WHERE
516    memory_ashmem.ts - tr.start_ts = ${startNs}
517    AND flag=0
518    ${pinSql}
519    GROUP BY ts`
520  );
521};
522//Ability Monitor SkiaGpuMemory 框选
523export const getTabGpuMemoryAbilityData = (leftNs: number, rightNs: number, dur: number): Promise<Array<GpuMemory>> =>
524  query<GpuMemory>(
525    'getTabGpuMemoryAbilityData',
526    `SELECT (S.ts-TR.start_ts) as startNs,
527    gpu_name_id as gpuNameId,
528    MAX(S.used_gpu_size) as maxSize,
529    MIN(S.used_gpu_size) as minSize,
530    Avg(S.used_gpu_size) as avgSize,
531    E.pid as processId,
532    E.name as processName
533    from trace_range as TR,memory_process_gpu as S
534    left join process as E on E.ipid=S.ipid
535    WHERE
536    $leftNS <= startNs + ${dur}
537    and
538    $rightNS >= startNs
539    GROUP by 
540    E.pid ,S.gpu_name_id
541            `,
542    { $leftNS: leftNs, $rightNS: rightNs }
543  );
544//Ability Monitor SkiaGpuMemory 点选
545export const getTabGpuMemoryAbilityClickData = (startNs: number): Promise<Array<GpuMemory>> =>
546  query<GpuMemory>(
547    'getTabGpuMemoryAbilityClickData',
548    `SELECT
549    (S.ts-TR.start_ts) as startNs,
550    S.used_gpu_size as size,
551    E.pid as processId,
552    E.name as processName,
553    A.data as gpuName
554    from trace_range as TR,memory_process_gpu as S
555    left join process as E on E.ipid=S.ipid
556    left join data_dict as A on A.id=S.gpu_name_id
557    WHERE
558    startNs = ${startNs}
559              `,
560    { $startNs: startNs }
561  );
562//Ability Monitor Gpu Memory 点选比较
563export const getTabGpuMemoryComparisonData = (startNs: number): Promise<Array<GpuMemoryComparison>> =>
564  query<GpuMemoryComparison>(
565    'getTabGpuMemoryComparisonData',
566    `SELECT
567      (S.ts-TR.start_ts) as startNs,
568      sum(S.used_gpu_size) as value,
569      E.pid as processId,
570      S.gpu_name_id as gpuNameId,
571      E.name as processName
572      from trace_range as TR,memory_process_gpu as S
573      left join process as E on E.ipid=S.ipid
574      WHERE
575      startNs = ${startNs}
576      GROUP by
577      E.pid, S.gpu_name_id
578                `,
579    { $startNs: startNs }
580  );
581