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 {FpsStruct} from "../ui-worker/ProcedureWorkerFPS"; 16import {Counter, Fps} from "../../bean/BoxSelection"; 17import { 18 NativeEvent, 19 NativeEventHeap, 20} from "../../bean/NativeHook"; 21import {HeapTreeDataBean} from "../logic-worker/ProcedureLogicWorkerCommon"; 22import {EnergyAnomalyStruct} from "../ui-worker/ProcedureWorkerEnergyAnomaly"; 23import {SystemDetailsEnergy} from "../../bean/EnergyStruct"; 24import {EnergyStateStruct} from "../ui-worker/ProcedureWorkerEnergyState"; 25import {FileInfo} from "../../../js-heap/model/UiStruct"; 26import {HeapEdge, HeapLocation, HeapNode, HeapSample} from "../../../js-heap/model/DatabaseStruct"; 27import {TaskTabStruct} from "../../component/trace/sheet/task/TabPaneTaskFrames"; 28import type {FrameAnimationStruct} from "../ui-worker/ProcedureWorkerFrameAnimation"; 29import type {FrameDynamicStruct} from "../ui-worker/ProcedureWorkerFrameDynamic"; 30import type {FrameSpacingStruct} from "../ui-worker/ProcedureWorkerFrameSpacing"; 31import type {DeviceStruct} from "../../bean/FrameComponentBean"; 32import {LogStruct} from "../ui-worker/ProcedureWorkerLog"; 33import {query} from "../SqlLite"; 34 35export const queryEventCountMap = (): Promise< 36 Array<{ 37 eventName: string; 38 count: number; 39 }> 40> => query('queryEventCountMap', `select event_name as eventName,count from stat where stat_type = 'received';`); 41 42export const queryTotalTime = (): Promise<Array<{ total: number; recordStartNS: number; recordEndNS: number }>> => 43 query( 44 'queryTotalTime', 45 ` 46 select 47 start_ts as recordStartNS,end_ts as recordEndNS,end_ts-start_ts as total 48 from 49 trace_range;` 50 ); 51export const getFps = () => 52 query<FpsStruct>( 53 'getFps', 54 ` 55 select 56 distinct(ts-tb.start_ts) as startNS, fps 57 from 58 hidump c ,trace_range tb 59 where 60 startNS >= 0 61 --order by startNS; 62 `, 63 {} 64 ); 65 66export const getTabFps = (leftNs: number, rightNs: number): Promise<Array<Fps>> => 67 query<Fps>( 68 'getTabFps', 69 ` 70 select 71 distinct(ts-tb.start_ts) as startNS, 72 fps 73 from 74 hidump c, 75 trace_range tb 76 where 77 startNS <= $rightNS 78 and 79 startNS >= 0 80 --order by startNS; 81 `, 82 { $leftNS: leftNs, $rightNS: rightNs } 83 ); 84 85 86export const getTabVirtualCounters = (virtualFilterIds: Array<number>, startTime: number) => 87 query<Counter>( 88 'getTabVirtualCounters', 89 ` 90 select 91 table1.filter_id as trackId, 92 table2.name, 93 value, 94 table1.ts - table3.start_ts as startTime 95 from 96 sys_mem_measure table1 97 left join 98 sys_event_filter table2 99 on 100 table1.filter_id = table2.id 101 left join 102 trace_range table3 103 where 104 filter_id in (${virtualFilterIds.join(',')}) 105 and 106 startTime <= $startTime 107 `, 108 { $startTime: startTime } 109 ); 110 111export const queryAllSoInitNames = (): Promise<Array<any>> => { 112 return query( 113 'queryAllSoInitNames', 114 ` 115 select id,so_name as name from static_initalize;` 116 ); 117}; 118 119export const queryAllSrcSlices = (): Promise<Array<any>> => { 120 return query( 121 'queryAllSrcSlices', 122 ` 123 select src,id from frame_slice;` 124 ); 125}; 126 127/*-------------------------------------------------------------------------------------*/ 128export const queryHeapGroupByEvent = (type: string): Promise<Array<NativeEventHeap>> => { 129 let sql1 = ` 130 select 131 event_type as eventType, 132 sum(heap_size) as sumHeapSize 133 from native_hook 134 where event_type = 'AllocEvent' or event_type = 'MmapEvent' 135 group by event_type 136 `; 137 let sql2 = ` 138 select (case when type = 0 then 'AllocEvent' else 'MmapEvent' end) eventType, 139 sum(apply_size) sumHeapSize 140 from native_hook_statistic 141 group by eventType; 142 `; 143 return query('queryHeapGroupByEvent', type === 'native_hook' ? sql1 : sql2, {}); 144}; 145 146export const queryAllHeapByEvent = (): Promise<Array<NativeEvent>> => 147 query( 148 'queryAllHeapByEvent', 149 ` 150 select * from ( 151 select h.start_ts - t.start_ts as startTime, 152 h.heap_size as heapSize, 153 h.event_type as eventType 154from native_hook h ,trace_range t 155where h.start_ts >= t.start_ts and h.start_ts <= t.end_ts 156and (h.event_type = 'AllocEvent' or h.event_type = 'MmapEvent') 157union 158select h.end_ts - t.start_ts as startTime, 159 h.heap_size as heapSize, 160 (case when h.event_type = 'AllocEvent' then 'FreeEvent' else 'MunmapEvent' end) as eventType 161from native_hook h ,trace_range t 162where h.start_ts >= t.start_ts and h.start_ts <= t.end_ts 163and (h.event_type = 'AllocEvent' or h.event_type = 'MmapEvent') 164and h.end_ts not null ) order by startTime; 165`, 166 {} 167 ); 168 169export const queryHeapAllData = ( 170 startTs: number, 171 endTs: number, 172 ipids: Array<number> 173): Promise<Array<HeapTreeDataBean>> => 174 query( 175 'queryHeapAllData', 176 ` 177 select 178 h.start_ts - t.start_ts as startTs, 179 h.end_ts - t.start_ts as endTs, 180 h.heap_size as heapSize, 181 h.event_type as eventType, 182 h.callchain_id as eventId 183 from 184 native_hook h 185 inner join 186 trace_range t 187 where 188 event_type = 'AllocEvent' 189 and 190 ipid in (${ipids.join(',')}) 191 and 192 (h.start_ts - t.start_ts between ${startTs} and ${endTs} or h.end_ts - t.start_ts between ${startTs} and ${endTs})`, 193 { ipids: ipids, $startTs: startTs, $endTs: endTs } 194 ); 195 196 197 198 199 200export const querySelectTraceStats = (): Promise< 201 Array<{ 202 event_name: string; 203 stat_type: string; 204 count: number; 205 source: string; 206 serverity: string; 207 }> 208> => query('querySelectTraceStats', 'select event_name,stat_type,count,source,serverity from stat'); 209 210export const queryCustomizeSelect = (sql: string): Promise<Array<any>> => query('queryCustomizeSelect', sql); 211 212export const queryDistributedTerm = (): Promise< 213 Array<{ 214 threadId: string; 215 threadName: string; 216 processId: string; 217 processName: string; 218 funName: string; 219 dur: string; 220 ts: string; 221 chainId: string; 222 spanId: string; 223 parentSpanId: string; 224 flag: string; 225 trace_name: string; 226 }> 227> => 228 query( 229 'queryDistributedTerm', 230 ` 231 select 232 group_concat(thread.id,',') as threadId, 233 group_concat(thread.name,',') as threadName, 234 group_concat(process.id,',') as processId, 235 group_concat(process.name,',') as processName, 236 group_concat(callstack.name,',') as funName, 237 group_concat(callstack.dur,',') as dur, 238 group_concat(callstack.ts,',') as ts, 239 cast(callstack.chainId as varchar) as chainId, 240 callstack.spanId as spanId, 241 callstack.parentSpanId as parentSpanId, 242 group_concat(callstack.flag,',') as flag, 243 (select 244 value 245 from 246 meta 247 where 248 name='source_name') as trace_name 249 from 250 callstack 251 inner join thread on callstack.callid = thread.id 252 inner join process on process.id = thread.ipid 253 where (callstack.flag='S' or callstack.flag='C') 254 group by callstack.chainId,callstack.spanId,callstack.parentSpanId` 255 ); 256export const queryTraceTaskName = (): Promise< 257 Array<{ 258 id: string; 259 pid: string; 260 process_name: string; 261 thread_name: string; 262 }> 263> => 264 query( 265 'queryTraceTaskName', 266 ` 267 select 268 P.id as id, 269 P.pid as pid, 270 P.name as process_name, 271 group_concat(T.name,',') as thread_name 272 from process as P left join thread as T where P.id = T.ipid 273 group by pid` 274 ); 275 276export const queryTraceMetaData = (): Promise< 277 Array<{ 278 name: string; 279 valueText: string; 280 }> 281> => 282 query( 283 'queryTraceMetaData', 284 ` 285 select 286 cast(name as varchar) as name, 287 cast(value as varchar) as valueText 288 from meta 289 UNION 290 select 'start_ts',cast(start_ts as varchar) from trace_range 291 UNION 292 select 'end_ts',cast(end_ts as varchar) from trace_range` 293 ); 294 295export const querySystemCalls = (): Promise< 296 Array<{ 297 frequency: string; 298 minDur: number; 299 maxDur: number; 300 avgDur: number; 301 funName: string; 302 }> 303> => 304 query( 305 'querySystemCalls', 306 ` 307 select 308 count(*) as frequency, 309 min(dur) as minDur, 310 max(dur) as maxDur, 311 avg(dur) as avgDur, 312 name as funName 313 from 314 callstack 315 group by name 316 order by 317 frequency desc limit 100` 318 ); 319 320export const queryNetWorkMaxData = (): Promise<Array<any>> => 321 query( 322 'queryNetWorkMaxData', 323 `select 324 ifnull(max(tx_speed),0) as maxIn, 325 ifnull(max(rx_speed),0) as maxOut, 326 ifnull(max(packet_in_sec),0) as maxPacketIn, 327 ifnull(max(packet_in_sec),0) as maxPacketOut 328 from network` 329 ); 330 331export const queryDiskIoMaxData = (): Promise<Array<any>> => 332 query( 333 'queryDiskIoMaxData', 334 `select 335 ifnull(max(rd_speed),0) as bytesRead, 336 ifnull(max(wr_speed),0) as bytesWrite, 337 ifnull(max(rd_count_speed),0) as readOps, 338 ifnull(max(wr_count_speed),0) as writeOps 339 from diskio` 340 ); 341export const queryStartTime = (): Promise<Array<any>> => query('queryStartTime', `SELECT start_ts FROM trace_range`); 342export const queryBinderBySliceId = (id: number): Promise<Array<any>> => 343 query( 344 'queryBinderBySliceId', 345 `select c.ts-D.start_ts as startTs, 346 c.dur, 347 t.tid,p.pid,c.depth,c.argsetid,c.name as funName,c.cookie 348 from callstack c,trace_range D 349 left join thread t on c.callid = t.id 350 left join process p on p.id = t.ipid 351where cat = 'binder' and c.id = $id;`, 352 { $id: id } 353 ); 354 355export const queryThreadByItid = (itid: number, ts: number): Promise<Array<any>> => 356 query( 357 'queryThreadByItid', 358 `select tid,pid,c.dur,c.depth,c.name 359from thread t left join process p on t.ipid = p.ipid 360left join callstack c on t.itid = c.callid 361where itid = $itid and c.ts = $ts;`, 362 { $itid: itid, $ts: ts } 363 ); 364export const queryBinderByArgsId = (id: number, startTime: number, isNext: boolean): Promise<Array<any>> => { 365 let sql = ` 366select c.ts - D.start_ts as startTs, 367 c.dur, 368 t.tid, 369 p.pid, 370 c.depth, 371 c.argsetid, 372 c.name as funName, 373 c.cookie 374 from callstack c,trace_range D 375 left join thread t on c.callid = t.id 376 left join process p on p.id = t.ipid 377where cat = 'binder' and c.argsetid = $id`; 378 if (isNext) { 379 sql += ' and c.ts > $startTime + D.start_ts'; 380 } else { 381 sql += ' and c.ts < $startTime + D.start_ts'; 382 } 383 return query('queryBinderByArgsId', sql, { 384 $id: id, 385 $startTime: startTime, 386 }); 387}; 388 389export const getTabPaneFilesystemStatisticsFather = (leftNs: number, rightNs: number): Promise<Array<any>> => 390 query( 391 'getTabPaneFilesystemStatisticsFather', 392 ` 393 select SUM(dur) as allDuration, 394 count(f.type) as count, 395 min(dur) as minDuration, 396 max(dur) as maxDuration, 397 round(avg(dur),2) as avgDuration, 398 p.name, 399 f.type, 400 p.pid, 401 sum(ifnull(size,0)) as size 402 from file_system_sample as f 403 left join process as p on f.ipid=p.ipid 404 where f.start_ts >= $leftNs 405 and end_ts <= $rightNs 406 group by f.type; 407 `, 408 { $leftNs: leftNs, $rightNs: rightNs } 409 ); 410 411export const getTabPaneFilesystemStatisticsChild = (leftNs: number, rightNs: number): Promise<Array<any>> => 412 query( 413 'getTabPaneFilesystemStatisticsChild', 414 ` 415 select SUM(dur) as allDuration, 416 count(f.type) as count, 417 min(dur) as minDuration, 418 max(dur) as maxDuration, 419 round(avg(dur),2) as avgDuration, 420 p.name, 421 p.pid, 422 f.type, 423 sum(ifnull(size,0)) as size 424 from file_system_sample as f left join process as p on f.ipid=p.ipid 425 where f.start_ts >= $leftNs 426 and end_ts <= $rightNs 427 group by f.type, f.ipid; 428`, 429 { $leftNs: leftNs, $rightNs: rightNs } 430 ); 431 432export const getTabPaneFilesystemStatisticsAll = (leftNs: number, rightNs: number): Promise<Array<any>> => 433 query( 434 'getTabPaneFilesystemStatisticsAll', 435 ` 436 select SUM(dur) as allDuration, 437 count(type) as count, 438 min(dur) as minDuration, 439 max(dur) as maxDuration, 440 round(avg(dur),2) as avgDuration, 441 type 442 from file_system_sample 443 where start_ts >= $leftNs 444 and end_ts <= $rightNs; 445`, 446 { $leftNs: leftNs, $rightNs: rightNs } 447 ); 448 449export const getTabPaneFilesystemStatistics = (leftNs: number, rightNs: number, types: number[]): Promise<Array<any>> => 450 query( 451 'getTabPaneFilesystemStatistics', 452 ` 453 select p.pid, 454 ifnull(p.name,'Process') as name, 455 f.type, 456 count(f.ipid) as count, 457 sum(ifnull(size,0)) as size, 458 sum(case when f.type = 2 then ifnull(size,0) else 0 end) as logicalReads, 459 sum(case when f.type = 3 then ifnull(size,0) else 0 end) as logicalWrites, 460 sum(case when f.type != 2 and f.type != 3 then ifnull(size,0) else 0 end) as otherFile, 461 sum(dur) as allDuration, 462 min(dur) as minDuration, 463 max(dur) as maxDuration, 464 avg(dur) as avgDuration 465 from file_system_sample as f left join process as p on f.ipid=p.ipid 466 where end_ts >= $leftNs 467 and end_ts <= $rightNs 468 and f.type in (${types.join(',')}) 469 group by f.type,f.ipid 470 order by f.type; 471`, 472 { $leftNs: leftNs, $rightNs: rightNs } 473 ); 474 475export const getTabPaneIOTierStatisticsData = ( 476 leftNs: number, 477 rightNs: number, 478 diskIOipids: Array<number> 479): Promise<Array<any>> => { 480 let str = ''; 481 if (diskIOipids.length > 0) { 482 str = ` and i.ipid in (${diskIOipids.join(',')})`; 483 } 484 return query( 485 'getTabPaneIOTierStatisticsData', 486 ` 487 select p.pid, 488 ifnull(p.name,'Process') as pname, 489 i.tier, 490 i.ipid, 491 path_id as path, 492 count(i.ipid) as count, 493 sum(latency_dur) as allDuration, 494 min(latency_dur) as minDuration, 495 max(latency_dur) as maxDuration, 496 avg(latency_dur) as avgDuration 497 from bio_latency_sample as i left join process as p on i.ipid=p.ipid 498 where i.start_ts+latency_dur >= $leftNs 499 and i.start_ts+latency_dur <= $rightNs 500 ${str} 501 group by i.tier,i.ipid,i.path_id 502 order by i.tier; 503`, 504 { $leftNs: leftNs, $rightNs: rightNs } 505 ); 506}; 507 508export const getTabPaneFrequencySampleData = ( 509 leftNs: number, 510 rightNs: number, 511 cpuFreqFilterIds: Array<number> 512): Promise<Array<any>> => { 513 let str = ''; 514 if (cpuFreqFilterIds.length > 0) { 515 str = ` and filter_id in (${cpuFreqFilterIds.join(',')})`; 516 } 517 return query( 518 'getTabPaneFrequencySampleData', 519 ` 520 select value, filter_id as filterId, ts, f.cpu 521 from measure left join cpu_measure_filter as f on f.id=filter_id 522 where 523 ts <= $rightNs${str} order by ts asc; 524`, 525 { $leftNs: leftNs, $rightNs: rightNs } 526 ); 527}; 528 529export const getFileSysChartDataByType = (type: number): Promise<Array<any>> => 530 query( 531 'getFileSysChartData', 532 ` 533 select 534 (A.start_ts -B.start_ts) as startNS, 535 (A.end_ts - B.start_ts) as endNS, 536 dur 537 from file_system_sample A,trace_range B 538 where type = $type and startNS > 0;`, 539 { $type: type }, 540 'exec' 541 ); 542 543export const getDiskIOProcess = (): Promise<Array<any>> => 544 query( 545 'getDiskIOProcess', 546 ` 547 select name,B.ipid,pid 548 from (select distinct ipid from bio_latency_sample A,trace_range B where A.start_ts between B.start_ts and B.end_ts) A 549 left join process B on A.ipid = B.ipid;`, 550 {} 551 ); 552 553export const getDiskIOLatencyChartDataByProcess = ( 554 all: boolean, 555 ipid: number, 556 typeArr: Array<number> 557): Promise<Array<any>> => 558 query( 559 'getDiskIOLatencyChartDataByProcess', 560 ` 561 select 562 (A.start_ts -B.start_ts) as startNS, 563 (A.start_ts - B.start_ts + A.latency_dur) as endNS, 564 latency_dur as dur 565 from bio_latency_sample A,trace_range B 566 where type in (${typeArr.join(',')}) and startNS > 0 567 ${all ? '' : 'and ipid = ' + ipid} 568 order by A.start_ts;`, 569 {}, 570 'exec' 571 ); 572 573export const queryAnomalyData = (): Promise<Array<EnergyAnomalyStruct>> => 574 query( 575 'queryAnomalyData', 576 `select 577 S.id, 578 (S.ts - TR.start_ts) as startNS, 579 D.data as eventName, 580 D2.data as appKey, 581 (case when S.type==1 then group_concat(S.string_value,',') else group_concat(S.int_value,',') end) as Value 582 from trace_range AS TR,hisys_event_measure as S 583 left join data_dict as D on D.id=S.name_id 584 left join app_name as APP on APP.id=S.key_id 585 left join data_dict as D2 on D2.id=APP.app_key 586 where D.data in ('ANOMALY_SCREEN_OFF_ENERGY','ANOMALY_KERNEL_WAKELOCK','ANOMALY_CPU_HIGH_FREQUENCY','ANOMALY_WAKEUP') 587 or (D.data in ('ANOMALY_RUNNINGLOCK','ANORMALY_APP_ENERGY','ANOMALY_GNSS_ENERGY','ANOMALY_CPU_ENERGY','ANOMALY_ALARM_WAKEUP') and D2.data in ("APPNAME")) 588 group by S.serial,D.data` 589 ); 590 591export const querySystemLocationData = (): Promise< 592 Array<{ 593 ts: string; 594 eventName: string; 595 appKey: string; 596 Value: string; 597 }> 598> => 599 query( 600 'querySystemLocationData', 601 `SELECT 602 ( S.ts - TR.start_ts ) AS ts, 603 D.data AS eventName, 604 D2.data AS appKey, 605 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value 606 FROM 607 trace_range AS TR, 608 hisys_event_measure AS S 609 LEFT JOIN data_dict AS D ON D.id = S.name_id 610 LEFT JOIN app_name AS APP ON APP.id = S.key_id 611 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 612 WHERE 613 D.data = 'GNSS_STATE' AND D2.data = 'STATE' 614 GROUP BY 615 S.serial, 616 APP.app_key, 617 D.data, 618 D2.data;` 619 ); 620 621export const querySystemLockData = (): Promise< 622 Array<{ 623 ts: string; 624 eventName: string; 625 appKey: string; 626 Value: string; 627 }> 628> => 629 query( 630 'querySystemLockData', 631 `SELECT 632 ( S.ts - TR.start_ts ) AS ts, 633 D.data AS eventName, 634 D2.data AS appKey, 635 group_concat(( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value 636 FROM 637 trace_range AS TR, 638 hisys_event_measure AS S 639 LEFT JOIN data_dict AS D ON D.id = S.name_id 640 LEFT JOIN app_name AS APP ON APP.id = S.key_id 641 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 642 WHERE 643 ( D.data = 'POWER_RUNNINGLOCK' AND D2.data in ('TAG','MESSAGE')) 644 GROUP BY 645 S.serial;` 646 ); 647 648export const querySystemAllData = (): Promise< 649 Array<{ 650 id: number; 651 eventName: string; 652 eventValue: string; 653 }> 654> => 655 query( 656 'querySystemAllData', 657 `SELECT 658 S.id, 659 D.data AS eventName, 660 contents AS eventValue 661 FROM 662 trace_range AS TR, 663 hisys_all_event AS S 664 LEFT JOIN data_dict AS D ON S.event_name_id = D.id 665 LEFT JOIN data_dict AS D2 ON S.domain_id = D2.id 666 WHERE 667 eventName IN ( 'POWER_RUNNINGLOCK', 'GNSS_STATE', 'WORK_REMOVE', 'WORK_STOP', 'WORK_ADD' );` 668 ); 669 670export const querySystemSchedulerData = (): Promise< 671 Array<{ 672 startNs: string; 673 eventName: string; 674 appKey: string; 675 Value: string; 676 }> 677> => 678 query( 679 'querySystemSchedulerData', 680 `SELECT 681 ( S.ts - TR.start_ts ) AS startNs, 682 D.data AS eventName, 683 group_concat(D2.data, ',') AS appKey, 684 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value 685 FROM 686 trace_range AS TR, 687 hisys_event_measure AS S 688 LEFT JOIN data_dict AS D ON D.id = S.name_id 689 LEFT JOIN app_name AS APP ON APP.id = S.key_id 690 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 691 WHERE 692 D.data IN ( 'WORK_REMOVE', 'WORK_STOP', 'WORK_ADD' ) AND D2.data in ('NAME','TYPE','WORKID') 693 GROUP BY 694 S.serial;` 695 ); 696 697export const querySystemDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> => 698 query( 699 'querySystemDetailsData', 700 `SELECT 701 ( S.ts - TR.start_ts ) AS ts, 702 D.data AS eventName, 703 D2.data AS appKey, 704 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue 705 FROM 706 trace_range AS TR, 707 hisys_event_measure AS S 708 LEFT JOIN data_dict AS D ON D.id = S.name_id 709 LEFT JOIN app_name AS APP ON APP.id = S.key_id 710 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 711 WHERE 712 D.data in ($eventName) 713 AND 714 D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL') 715 AND 716 (S.ts - TR.start_ts) <= $rightNS 717 GROUP BY 718 S.serial, 719 APP.app_key, 720 D.data, 721 D2.data;`, 722 { $rightNS: rightNs, $eventName: eventName } 723 ); 724 725export const querySystemWorkData = (rightNs: number): Promise<Array<SystemDetailsEnergy>> => 726 query( 727 'querySystemWorkData', 728 `SELECT 729 ( S.ts - TR.start_ts ) AS ts, 730 D.data AS eventName, 731 D2.data AS appKey, 732 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue 733 FROM 734 trace_range AS TR, 735 hisys_event_measure AS S 736 LEFT JOIN data_dict AS D 737 ON D.id = S.name_id 738 LEFT JOIN app_name AS APP 739 ON APP.id = S.key_id 740 LEFT JOIN data_dict AS D2 741 ON D2.id = APP.app_key 742 WHERE 743 D.data in ("WORK_REMOVE", "WORK_STOP", "WORK_ADD", "WORK_START") 744 and 745 D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL') 746 and (S.ts - TR.start_ts) <= $rightNS 747 GROUP BY 748 S.serial, 749 APP.app_key, 750 D.data, 751 D2.data;`, 752 { $rightNS: rightNs } 753 ); 754 755export const queryMaxPowerValue = ( 756 appName: string 757): Promise< 758 Array<{ 759 maxValue: number; 760 }> 761> => 762 query( 763 'queryMaxPowerValue', 764 `SELECT 765 max( item ) AS maxValue 766 FROM 767 ( 768 SELECT 769 sum( energy + background_energy + screen_on_energy + screen_off_energy + foreground_energy ) AS item 770 FROM 771 energy 772 WHERE 773 app_name = $appName 774 GROUP BY 775 startNs);`, 776 { $appName: appName } 777 ); 778 779export const queryMaxStateValue = ( 780 eventName: string 781): Promise< 782 Array<{ 783 type: string; 784 maxValue: number; 785 }> 786> => 787 query( 788 'queryMaxStateValue', 789 `select 790 D.data as type, 791 max(S.int_value) as maxValue 792 from trace_range AS TR,hisys_event_measure as S 793 left join data_dict as D on D.id=S.name_id 794 left join app_name as APP on APP.id=S.key_id 795 left join data_dict as D2 on D2.id=APP.app_key 796 where (case when 'SENSOR_STATE'==$eventName then D.data like '%SENSOR%' else D.data = $eventName end) 797 and D2.data in ('BRIGHTNESS','STATE','VALUE','LEVEL','VOLUME','OPER_TYPE','VOLUME') 798 group by APP.app_key,D.data,D2.data;`, 799 { $eventName: eventName } 800 ); 801 802export const queryStateData = (eventName: string): Promise<Array<EnergyStateStruct>> => 803 query( 804 'queryStateData', 805 `select 806 (S.ts-TR.start_ts) as startNs, 807 D.data as type, 808 D2.data as appKey, 809 S.int_value as value 810 from trace_range AS TR,hisys_event_measure as S 811 left join data_dict as D on D.id=S.name_id 812 left join app_name as APP on APP.id=S.key_id 813 left join data_dict as D2 on D2.id=APP.app_key 814 where (case when 'SENSOR_STATE'==$eventName then D.data like '%SENSOR%' else D.data = $eventName end) 815 and D2.data in ('BRIGHTNESS','STATE','VALUE','LEVEL','VOLUME','OPER_TYPE','VOLUME') 816 group by S.serial,APP.app_key,D.data,D2.data;`, 817 { $eventName: eventName } 818 ); 819 820export const queryEnergyAppName = (): Promise< 821 Array<{ 822 string_value: string | null; 823 }> 824> => 825 query( 826 'queryEnergyAppName', 827 ` 828 SELECT 829 DISTINCT hisys_event_measure.string_value from data_dict 830 left join app_name on app_name.app_key=data_dict.id 831 left join hisys_event_measure on hisys_event_measure.key_id = app_name.id 832 where data_dict.data = "APPNAME"` 833 ); 834 835export const getTabIoCompletionTimesType = (startTime: number, endTime: number): Promise<Array<string>> => 836 query( 837 'getTabIoCompletionTimesType', 838 ` 839 SELECT tier from bio_latency_sample s,trace_range t 840 WHERE s.start_ts + s.latency_dur between $startTime + t.start_ts and $endTime + t.start_ts group by tier`, 841 { $startTime: startTime, $endTime: endTime }, 842 'exec' 843 ); 844 845export const queryEnergyEventExits = (): Promise<Array<any>> => 846 query( 847 'queryEnergyEventExits', 848 `select 849 event_name 850 from stat s 851 where s.event_name = 'trace_hisys_event' 852 and s.stat_type ='received' and s.count > 0` 853 ); 854 855export const querySysLockDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> => 856 query( 857 'querySysLockDetailsData', 858 `SELECT 859 ( S.ts - TR.start_ts ) AS ts, 860 D.data AS eventName, 861 D2.data AS appKey, 862 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue 863 FROM 864 trace_range AS TR, 865 hisys_event_measure AS S 866 LEFT JOIN data_dict AS D ON D.id = S.name_id 867 LEFT JOIN app_name AS APP ON APP.id = S.key_id 868 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 869 WHERE 870 D.data in ($eventName) 871 AND 872 D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL') 873 AND 874 (S.ts - TR.start_ts) <= $rightNS 875 GROUP BY 876 S.serial, APP.app_key, D.data, D2.data;`, 877 { $rightNS: rightNs, $eventName: eventName } 878 ); 879 880export const queryStateInitValue = (eventName: string, keyName: string): Promise<Array<EnergyStateStruct>> => 881 query( 882 'queryStateInitValue', 883 `select 884 0 as startNs, 885 $eventName as type, 886 '' as appKey, 887 (case $keyName 888 when 'brightness' then device_state.brightness 889 when 'wifi' then device_state.wifi 890 when 'bt_state' then device_state.bt_state 891 when 'location' then device_state.location 892 else 0 end) as value 893 from device_state;`, 894 { $eventName: eventName, $keyName: keyName } 895 ); 896 897export const querySysLocationDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> => 898 query( 899 'querySysLocationDetailsData', 900 `SELECT 901 ( S.ts - TR.start_ts ) AS ts, 902 D.data AS eventName, 903 D2.data AS appKey, 904 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue 905 FROM 906 trace_range AS TR, 907 hisys_event_measure AS S 908 LEFT JOIN data_dict AS D ON D.id = S.name_id 909 LEFT JOIN app_name AS APP ON APP.id = S.key_id 910 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 911 WHERE 912 D.data in ($eventName) 913 and 914 D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL') 915 and (S.ts - TR.start_ts) <= $rightNS 916 GROUP BY 917 S.serial, 918 APP.app_key, 919 D.data, 920 D2.data;`, 921 { $rightNS: rightNs, $eventName: eventName } 922 ); 923export const queryConfigEnergyAppName = (): Promise< 924 Array<{ 925 process_name: string; 926 }> 927> => 928 query( 929 'queryConfigEnergyAppName', 930 ` 931 SELECT value from trace_config where trace_source = 'hisys_event' and key = 'process_name'` 932 ); 933 934export const queryAllExpectedData = (): Promise<Array<any>> => 935 query( 936 'queryAllExpectedData', 937 ` 938 SELECT 939 a.id, 940 (a.ts - TR.start_ts) AS ts, 941 a.vsync as name, 942 a.type, 943 a.dur, 944 p.pid, 945 p.name as cmdline 946 FROM frame_slice AS a, trace_range AS TR 947 LEFT JOIN process AS p ON a.ipid = p.ipid 948 WHERE a.type = 1 949 and (a.flag <> 2 or a.flag is null) 950 ORDER BY a.ipid,ts;` 951 ); 952 953export const queryFlowsData = (src_slice: Array<string>): Promise<Array<any>> => 954 query( 955 'queryFlowsData', 956 ` 957 SELECT fs.vsync AS name, 958 p.pid, 959 p.name AS cmdline, 960 fs.type 961 FROM frame_slice AS fs 962 LEFT JOIN process AS p ON fs.ipid = p.ipid 963 WHERE fs.type = 0 964 AND fs.id IN (${src_slice.join(',')});` 965 ); 966 967export const queryPrecedingData = (dst_slice: string): Promise<Array<any>> => 968 query( 969 'queryFlowsData', 970 ` 971 SELECT a.vsync AS name, 972 p.pid, 973 p.name AS cmdline, 974 a.type 975 FROM frame_slice AS a 976 LEFT JOIN process AS p ON a.ipid = p.ipid 977 WHERE a.type = 0 978 AND a.id = $dst_slice;`, 979 { $dst_slice: dst_slice } 980 ); 981 982export const queryFrameTimeData = (): Promise<Array<any>> => 983 query( 984 'queryFrameTimeData', 985 ` 986 SELECT DISTINCT p.pid 987 FROM frame_slice AS a 988 LEFT JOIN process AS p 989 ON a.ipid = p.ipid;` 990 ); 991 992export const queryAllSnapshotNames = (): Promise<Array<FileInfo>> => 993 query( 994 'queryAllSnapshotNames', 995 `SELECT f.id, 996 f.file_name AS name 997 FROM 998 js_heap_files f, 999 trace_range t 1000 WHERE 1001 ( t.end_ts >= f.end_time AND f.file_name != 'Timeline' ) 1002 OR f.file_name = 'Timeline'` 1003 ); 1004export const queryHeapFile = (): Promise<Array<FileInfo>> => 1005 query( 1006 'queryHeapFile', 1007 `SELECT f.id, 1008 f.file_name AS name, 1009 f.start_time - t.start_ts AS startTs, 1010 f.end_time - t.start_ts AS endTs, 1011 f.self_size AS size, 1012 c.pid 1013 FROM 1014 js_heap_files f, 1015 trace_range t, 1016 js_config c 1017 WHERE 1018 ( t.end_ts >= f.end_time AND f.file_name != 'Timeline' ) 1019 OR f.file_name = 'Timeline'` 1020 ); 1021 1022export const queryHeapInfo = (fileId: number): Promise<Array<any>> => 1023 query( 1024 'queryHeapInfo', 1025 `SELECT file_id as fileId, key, type, int_value as intValue, str_value as strValue 1026 FROM js_heap_info WHERE file_id = ${fileId}` 1027 ); 1028 1029export const queryHeapNode = (fileId: number): Promise<Array<HeapNode>> => 1030 query( 1031 'queryHeapNode', 1032 `SELECT node_index as nodeIndex,type,name as nameIdx,id,self_size as selfSize,edge_count as edgeCount,trace_node_id as traceNodeId,detachedness 1033 FROM js_heap_nodes WHERE file_id = ${fileId}` 1034 ); 1035 1036export const queryHeapEdge = (fileId: number): Promise<Array<HeapEdge>> => 1037 query( 1038 'queryHeapEdge', 1039 `SELECT edge_index as edgeIndex,type,name_or_index as nameOrIndex,to_node as nodeId,from_node_id as fromNodeId,to_node_id as toNodeId 1040 FROM js_heap_edges WHERE file_id = ${fileId}` 1041 ); 1042export const queryHeapSample = (fileId: number): Promise<Array<HeapSample>> => 1043 query( 1044 'queryHeapSample', 1045 `SELECT timestamp_us as timestamp , last_assigned_id as lastAssignedId, 0 as size 1046 FROM js_heap_sample WHERE file_id = ${fileId}` 1047 ); 1048 1049export const queryHeapLocation = (fileId: number): Promise<Array<HeapLocation>> => 1050 query( 1051 'queryHeapLocation', 1052 `SELECT object_index as objectIndex,script_id as scriptId ,column 1053 FROM js_heap_location WHERE file_id = ${fileId}` 1054 ); 1055 1056export const queryHeapString = (fileId: number): Promise<Array<any>> => 1057 query( 1058 'queryHeapString', 1059 `SELECT string 1060 FROM js_heap_string WHERE file_id = ${fileId}` 1061 ); 1062export const queryTraceRange = (): Promise<Array<any>> => 1063 query('queryTraceRange', `SELECT t.start_ts as startTs, t.end_ts as endTs FROM trace_range t`); 1064 1065export const queryBySelectAllocationOrReturn = ( 1066 executeId: string, 1067 itid: number 1068): Promise< 1069 Array<{ 1070 tid: number; 1071 allocation_task_row: number; 1072 execute_task_row: number; 1073 return_task_row: number; 1074 priority: number; 1075 }> 1076> => { 1077 let sqlStr = `SELECT thread.tid, 1078 task_pool.allocation_task_row, 1079 task_pool.execute_task_row, 1080 task_pool.return_task_row, 1081 task_pool.priority 1082 FROM task_pool 1083 LEFT JOIN callstack ON callstack.id = task_pool.execute_task_row 1084 LEFT JOIN thread ON thread.id = callstack.callid 1085 WHERE task_pool.execute_task_row IS NOT NULL AND task_pool.execute_id = $executeId 1086 AND task_pool.allocation_itid = $itid; 1087 `; 1088 return query('queryBySelectAllocationOrReturn', sqlStr, { $executeId: executeId, $itid: itid }); 1089}; 1090 1091export const queryTaskListByExecuteTaskIds = ( 1092 executeTaskIds: Array<number>, 1093 ipid: number 1094): Promise<Array<TaskTabStruct>> => { 1095 let sqlStr = ` 1096 SELECT thread.ipid, 1097 task_pool.allocation_task_row AS allocationTaskRow, 1098 task_pool.execute_task_row AS executeTaskRow, 1099 task_pool.return_task_row AS returnTaskRow, 1100 task_pool.execute_id AS executeId, 1101 task_pool.priority 1102 FROM task_pool 1103 LEFT JOIN callstack ON callstack.id = task_pool.allocation_task_row 1104 LEFT JOIN thread ON thread.id = callstack.callid 1105 WHERE task_pool.execute_id IN (${executeTaskIds.join(',')}) 1106 AND thread.ipid = $ipid 1107 AND task_pool.execute_task_row IS NOT NULL; 1108 `; 1109 return query('queryTaskListByExecuteTaskIds', sqlStr, { $executeTaskIds: executeTaskIds, $ipid: ipid }); 1110}; 1111 1112export const queryTaskPoolCallStack = (): Promise<Array<{ id: number; ts: number; dur: number; name: string }>> => { 1113 let sqlStr = `select * from callstack where name like 'H:Task%';`; 1114 return query('queryTaskPoolCallStack', sqlStr, {}); 1115}; 1116 1117export const queryTaskPoolTotalNum = (itid: number) => 1118 query<number>( 1119 'queryTaskPoolTotalNum', 1120 `SELECT thread.tid 1121 FROM thread 1122 LEFT JOIN callstack ON thread.id = callstack.callid 1123 WHERE ipid in (SELECT thread.ipid 1124 FROM thread 1125 WHERE thread.itid = $itid) 1126 AND thread.name = 'TaskWorkThread' 1127 GROUP BY thread.tid;`, 1128 { $itid: itid } 1129 ); 1130 1131export const queryFrameAnimationData = (): Promise<Array<FrameAnimationStruct>> => 1132 query( 1133 'queryFrameAnimationData', 1134 `SELECT a.id AS animationId, 1135 'Response delay' as status, 1136 (CASE WHEN a.input_time NOT NULL 1137 THEN ( a.input_time - R.start_ts ) 1138 ELSE ( a.start_point - R.start_ts ) END 1139 ) AS startTs, 1140 (a.start_point - R.start_ts) AS endTs, 1141 0 AS frameInfo, 1142 a.name AS name 1143 FROM 1144 animation AS a, 1145 trace_range AS R 1146 UNION 1147 SELECT a.id AS animationId, 1148 'Completion delay' as status, 1149 (CASE WHEN a.input_time NOT NULL 1150 THEN ( a.input_time - R.start_ts ) 1151 ELSE ( a.start_point - R.start_ts ) END 1152 ) AS startTs, 1153 (a.end_point - R.start_ts) AS endTs, 1154 a.frame_info AS frameInfo, 1155 a.name AS name 1156 FROM 1157 animation AS a, 1158 trace_range AS R 1159 ORDER BY 1160 endTs;` 1161 ); 1162 1163export const queryAnimationTimeRangeData = (): Promise<Array<FrameAnimationStruct>> => 1164 query( 1165 'queryAnimationTimeRangeData', 1166 `SELECT 'Response delay' as status, 1167 (CASE WHEN a.input_time NOT NULL 1168 THEN ( a.input_time - R.start_ts ) 1169 ELSE ( a.start_point - R.start_ts ) END 1170 ) AS startTs, 1171 (a.start_point - R.start_ts) AS endTs 1172 FROM 1173 animation AS a, 1174 trace_range AS R 1175 UNION 1176 SELECT 'Completion delay' as status, 1177 (CASE WHEN a.input_time NOT NULL 1178 THEN ( a.input_time - R.start_ts ) 1179 ELSE ( a.start_point - R.start_ts ) END 1180 ) AS startTs, 1181 (a.end_point - R.start_ts) AS endTs 1182 FROM 1183 animation AS a, 1184 trace_range AS R 1185 ORDER BY 1186 endTs;` 1187 ); 1188 1189export const queryFrameDynamicData = (): Promise<FrameDynamicStruct[]> => 1190 query( 1191 'queryFrameDynamicData', 1192 `SELECT 1193 d.id, 1194 d.x, 1195 d.y, 1196 d.width, 1197 d.height, 1198 d.alpha, 1199 d.name AS appName, 1200 (d.end_time - R.start_ts) AS ts 1201 FROM 1202 dynamic_frame AS d, 1203 trace_range AS R 1204 ORDER BY 1205 d.end_time;` 1206 ); 1207 1208export const queryDynamicIdAndNameData = (): Promise<Array<{ id: number; appName: string }>> => 1209 query('queryDynamicIdAndNameData', `SELECT id, name AS appName FROM dynamic_frame;`); 1210 1211export const queryAnimationIdAndNameData = (): Promise< 1212 Array<{ 1213 id: number; 1214 name: string; 1215 info: string; 1216 }> 1217> => query('queryAnimationIdAndNameData', `SELECT id, name, frame_info as info FROM animation;`); 1218 1219export const queryFrameApp = (): Promise< 1220 Array<{ 1221 name: string; 1222 }> 1223> => 1224 query( 1225 'queryFrameApp', 1226 `SELECT 1227 DISTINCT d.name 1228 FROM 1229 dynamic_frame AS d, 1230 trace_range AS R 1231 WHERE 1232 d.end_time >= R.start_ts 1233 AND 1234 d.end_time <= R.end_ts;` 1235 ); 1236 1237export const queryFrameSpacing = (): Promise<Array<FrameSpacingStruct>> => 1238 query( 1239 'queryFrameSpacing', 1240 `SELECT 1241 d.id, 1242 d.width AS currentFrameWidth, 1243 d.height AS currentFrameHeight, 1244 d.name AS nameId, 1245 (d.end_time - R.start_ts) AS currentTs, 1246 d.x, 1247 d.y 1248 FROM 1249 dynamic_frame AS d, 1250 trace_range AS R 1251 ORDER BY 1252 d.end_time;` 1253 ); 1254 1255export const queryPhysicalData = (): Promise<Array<DeviceStruct>> => 1256 query( 1257 'queryPhysicalData', 1258 `SELECT physical_width AS physicalWidth, 1259 physical_height AS physicalHeight, 1260 physical_frame_rate AS physicalFrameRate 1261 FROM device_info;` 1262 ); 1263export const getSystemLogsData = (): Promise< 1264 Array<{ 1265 id: number; 1266 ts: number; 1267 processName: string; 1268 tid: number; 1269 level: string; 1270 tag: string; 1271 message: string; 1272 des: number; 1273 }> 1274> => 1275 query( 1276 'getSystemLogsData', 1277 `SELECT 1278 ROW_NUMBER() OVER (ORDER BY l.ts) AS processName, 1279 l.seq AS id, 1280 (l.ts - TR.start_ts) AS ts, 1281 l.pid AS indexs, 1282 l.tid, 1283 l.level, 1284 l.tag, 1285 l.context AS message, 1286 l.origints AS des 1287 FROM trace_range AS TR, 1288 log AS l 1289 ORDER BY ts` 1290 ); 1291 1292export const queryLogData = (): Promise<Array<LogStruct>> => 1293 query( 1294 'queryLogData', 1295 `SELECT l.ts - tr.start_ts as startNs FROM log AS l, trace_range tr WHERE startNs > 0 LIMIT 1;`, 1296 ); 1297 1298export const queryMetric = (metricName: string): Promise<Array<string>> => 1299 query('queryMetric', metricName, '', 'exec-metric'); 1300 1301export const queryExistFtrace = (): Promise<Array<number>> => 1302 query( 1303 'queryExistFtrace', 1304 `select 1 from thread_state 1305 UNION 1306 select 1 from args;` 1307 ); 1308 1309export const queryTraceType = (): Promise< 1310 Array<{ 1311 value: string; 1312 }> 1313> => 1314 query( 1315 'queryTraceType', 1316 `SELECT m.value 1317 FROM 1318 meta AS m 1319 WHERE 1320 m.name = 'source_type';` 1321 ); 1322 1323 1324export const queryLogAllData = (oneDayTime: number, leftNs: number, rightNs: number): Promise<Array<LogStruct>> => 1325 query( 1326 'queryLogAllData', 1327 `SELECT 1328 l.seq AS id, 1329 CASE 1330 WHEN l.ts < ${oneDayTime} THEN 0 1331 ELSE (l.ts - TR.start_ts) 1332 END AS startTs, 1333 CASE l.level 1334 WHEN 'D' THEN 'Debug' 1335 WHEN 'I' THEN 'Info' 1336 WHEN 'W' THEN 'Warn' 1337 WHEN 'E' THEN 'Error' 1338 WHEN 'F' THEN 'Fatal' 1339 END AS level, 1340 l.tag AS tag, 1341 l.context AS context, 1342 (strftime( '%m-%d %H:%M:%S', l.origints / 1000000000, 'unixepoch', 'localtime' ) || '.' || printf('%03d', (l.origints / 1000000) % 1000)) AS originTime, 1343 COALESCE(p.name, 'Process ' || l.pid) AS processName 1344 FROM 1345 log AS l 1346 LEFT JOIN trace_range AS TR ON l.ts >= TR.start_ts 1347 LEFT JOIN process AS p ON p.pid = l.pid 1348 WHERE 1349 startTs >= ${Math.floor(leftNs)} 1350 AND startTs <= ${Math.floor(rightNs)} 1351 ORDER BY 1352 l.ts;`, 1353 { $oneDayTime: oneDayTime } 1354 );