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 */ 15 16import './sql-wasm.js'; 17 18import { Counter, Fps, SelectionData } from '../bean/BoxSelection.js'; 19import { WakeupBean } from '../bean/WakeupBean.js'; 20import { BinderArgBean } from '../bean/BinderArgBean.js'; 21import { SPT, SPTChild } from '../bean/StateProcessThread.js'; 22import { CpuUsage, Freq } from '../bean/CpuUsage.js'; 23 24import { 25 NativeEvent, 26 NativeEventHeap, 27 NativeHookMalloc, 28 NativeHookProcess, 29 NativeHookSampleQueryInfo, 30 NativeHookStatistics, 31} from '../bean/NativeHook.js'; 32import { 33 LiveProcess, 34 ProcessHistory, 35 SystemCpuSummary, 36 SystemDiskIOSummary, 37 SystemNetworkSummary, 38} from '../bean/AbilityMonitor.js'; 39 40import { 41 PerfCall, 42 PerfCallChain, 43 PerfCmdLine, 44 PerfFile, 45 PerfSample, 46 PerfStack, 47 PerfThread, 48} from '../bean/PerfProfile.js'; 49import { SearchFuncBean } from '../bean/SearchFuncBean.js'; 50import { CounterSummary, SdkSliceSummary } from '../bean/SdkSummary.js'; 51import { Smaps } from '../bean/SmapsStruct.js'; 52import { CpuFreqRowLimit } from '../component/chart/SpFreqChart.js'; 53import { CpuFreqLimitsStruct } from './ui-worker/ProcedureWorkerCpuFreqLimits.js'; 54import { CpuStruct } from './ui-worker/ProcedureWorkerCPU.js'; 55import { CpuFreqStruct } from './ui-worker/ProcedureWorkerFreq.js'; 56import { ThreadStruct } from './ui-worker/ProcedureWorkerThread.js'; 57import { FuncStruct } from './ui-worker/ProcedureWorkerFunc.js'; 58import { ProcessMemStruct } from './ui-worker/ProcedureWorkerMem.js'; 59import { FpsStruct } from './ui-worker/ProcedureWorkerFPS.js'; 60import { CpuAbilityMonitorStruct } from './ui-worker/ProcedureWorkerCpuAbility.js'; 61import { MemoryAbilityMonitorStruct } from './ui-worker/ProcedureWorkerMemoryAbility.js'; 62import { DiskAbilityMonitorStruct } from './ui-worker/ProcedureWorkerDiskIoAbility.js'; 63import { NetworkAbilityMonitorStruct } from './ui-worker/ProcedureWorkerNetworkAbility.js'; 64import { EnergyAnomalyStruct } from './ui-worker/ProcedureWorkerEnergyAnomaly.js'; 65import { EnergyStateStruct } from './ui-worker/ProcedureWorkerEnergyState.js'; 66import { CounterStruct } from './ui-worker/ProduceWorkerSdkCounter.js'; 67import { SdkSliceStruct } from './ui-worker/ProduceWorkerSdkSlice.js'; 68import { SystemDetailsEnergy } from '../bean/EnergyStruct.js'; 69import { ClockStruct } from './ui-worker/ProcedureWorkerClock.js'; 70import { IrqStruct } from './ui-worker/ProcedureWorkerIrq.js'; 71import { 72 HeapEdge, 73 HeapLocation, 74 HeapNode, 75 HeapSample, 76 HeapTraceFunctionInfo, 77} from '../../js-heap/model/DatabaseStruct'; 78import { FileInfo } from '../../js-heap/model/UiStruct.js'; 79import { AppStartupStruct } from './ui-worker/ProcedureWorkerAppStartup.js'; 80import { SoStruct } from './ui-worker/ProcedureWorkerSoInit.js'; 81import { HeapTreeDataBean } from './logic-worker/ProcedureLogicWorkerCommon.js'; 82import { TaskTabStruct } from '../component/trace/sheet/task/TabPaneTaskFrames.js'; 83 84class DataWorkerThread extends Worker { 85 taskMap: any = {}; 86 87 uuid(): string { 88 // @ts-ignore 89 return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c: any) => 90 (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) 91 ); 92 } 93 94 //发送方法名 参数 回调 95 queryFunc(action: string, args: any, handler: Function) { 96 let id = this.uuid(); 97 this.taskMap[id] = handler; 98 let msg = { 99 id: id, 100 action: action, 101 args: args, 102 }; 103 this.postMessage(msg); 104 } 105} 106 107class DbThread extends Worker { 108 busy: boolean = false; 109 isCancelled: boolean = false; 110 id: number = -1; 111 taskMap: any = {}; 112 cacheArray: Array<any> = []; 113 114 uuid(): string { 115 // @ts-ignore 116 return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c: any) => 117 (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) 118 ); 119 } 120 121 queryFunc(name: string, sql: string, args: any, handler: Function, action: string | null) { 122 this.busy = true; 123 let id = this.uuid(); 124 this.taskMap[id] = handler; 125 let msg = { 126 id: id, 127 name: name, 128 action: action || 'exec', 129 sql: sql, 130 params: args, 131 }; 132 this.postMessage(msg); 133 } 134 135 dbOpen = async ( 136 sdkWasmConfig?: string 137 ): Promise<{ 138 status: boolean; 139 msg: string; 140 buffer: ArrayBuffer; 141 sdkConfigMap: any; 142 }> => { 143 return new Promise<any>((resolve, reject) => { 144 let id = this.uuid(); 145 this.taskMap[id] = (res: any) => { 146 if (res.init) { 147 resolve({ 148 status: res.init, 149 msg: res.msg, 150 sdkConfigMap: res.configSqlMap, 151 buffer: res.buffer, 152 }); 153 } else { 154 resolve({ status: res.init, msg: res.msg }); 155 } 156 }; 157 this.postMessage( 158 { 159 id: id, 160 action: 'open', 161 wasmConfig: sdkWasmConfig, 162 buffer: DbPool.sharedBuffer! /*Optional. An ArrayBuffer representing an SQLite Database file*/, 163 }, 164 [DbPool.sharedBuffer!] 165 ); 166 }); 167 }; 168 169 resetWASM() { 170 this.postMessage({ 171 id: this.uuid(), 172 action: 'reset', 173 }); 174 } 175} 176 177export class DbPool { 178 static sharedBuffer: ArrayBuffer | null = null; 179 maxThreadNumber: number = 0; 180 works: Array<DbThread> = []; 181 progress: Function | undefined | null; 182 num = Math.floor(Math.random() * 10 + 1) + 20; 183 cutDownTimer: any | undefined; 184 dataWorker: DataWorkerThread | undefined | null; 185 currentWasmThread: DbThread | undefined = undefined; 186 187 init = async (type: string, threadBuild: (() => DbThread) | undefined = undefined) => { 188 // wasm | server | sqlite 189 if (this.currentWasmThread) { 190 this.currentWasmThread.resetWASM(); 191 this.currentWasmThread = undefined; 192 } 193 await this.close(); 194 const { port1, port2 } = new MessageChannel(); 195 if (type === 'wasm') { 196 this.maxThreadNumber = 1; 197 } else if (type === 'server') { 198 this.maxThreadNumber = 1; 199 } else if (type === 'sqlite') { 200 this.maxThreadNumber = 1; 201 } else if (type === 'duck') { 202 this.maxThreadNumber = 1; 203 } 204 for (let i = 0; i < this.maxThreadNumber; i++) { 205 let thread: DbThread | undefined; 206 if (threadBuild) { 207 thread = threadBuild(); 208 } else { 209 if (type === 'wasm') { 210 thread = new DbThread('trace/database/TraceWorker.js'); 211 } else if (type === 'server') { 212 thread = new DbThread('trace/database/SqlLiteWorker.js'); 213 } else if (type === 'sqlite') { 214 thread = new DbThread('trace/database/SqlLiteWorker.js'); 215 } 216 } 217 if (thread) { 218 this.currentWasmThread = thread; 219 thread!.onmessage = (event: MessageEvent) => { 220 thread!.busy = false; 221 if (Reflect.has(thread!.taskMap, event.data.id)) { 222 if (event.data.results) { 223 let fun = thread!.taskMap[event.data.id]; 224 if (fun) { 225 fun(event.data.results); 226 } 227 Reflect.deleteProperty(thread!.taskMap, event.data.id); 228 } else if (Reflect.has(event.data, 'ready')) { 229 this.progress!('database opened', this.num + event.data.index); 230 this.progressTimer(this.num + event.data.index, this.progress!); 231 } else if (Reflect.has(event.data, 'init')) { 232 if (this.cutDownTimer != undefined) { 233 clearInterval(this.cutDownTimer); 234 } 235 let fun = thread!.taskMap[event.data.id]; 236 if (!event.data.init && !event.data.status) { 237 if (fun) { 238 fun(['error', event.data.msg]); 239 } 240 } else { 241 this.progress!('database ready', 40); 242 if (fun) { 243 fun(event.data); 244 } 245 } 246 Reflect.deleteProperty(thread!.taskMap, event.data.id); 247 } else { 248 let fun = thread!.taskMap[event.data.id]; 249 if (fun) { 250 fun([]); 251 } 252 Reflect.deleteProperty(thread!.taskMap, event.data.id); 253 } 254 } 255 }; 256 thread!.onmessageerror = (e) => {}; 257 thread!.onerror = (e) => {}; 258 thread!.id = i; 259 thread!.busy = false; 260 this.works?.push(thread!); 261 } 262 } 263 }; 264 265 initServer = async (url: string, progress: Function) => { 266 this.progress = progress; 267 progress('database loaded', 15); 268 DbPool.sharedBuffer = await fetch(url).then((res) => res.arrayBuffer()); 269 progress('open database', 20); 270 for (let i = 0; i < this.works.length; i++) { 271 let thread = this.works[i]; 272 let { status, msg } = await thread.dbOpen(); 273 if (!status) { 274 DbPool.sharedBuffer = null; 275 return { status, msg }; 276 } 277 } 278 return { status: true, msg: 'ok' }; 279 }; 280 initSqlite = async (buf: ArrayBuffer, sdkWasmConfig: string, progress: Function) => { 281 this.progress = progress; 282 progress('database loaded', 15); 283 DbPool.sharedBuffer = buf; 284 progress('parse database', 20); 285 let configMap; 286 for (let i = 0; i < this.works.length; i++) { 287 let thread = this.works[i]; 288 let { status, msg, buffer, sdkConfigMap } = await thread.dbOpen(sdkWasmConfig); 289 if (!status) { 290 DbPool.sharedBuffer = null; 291 return { status, msg }; 292 } else { 293 configMap = sdkConfigMap; 294 DbPool.sharedBuffer = buffer; 295 } 296 } 297 return { status: true, msg: 'ok', sdkConfigMap: configMap }; 298 }; 299 300 close = async () => { 301 clearInterval(this.cutDownTimer); 302 for (let i = 0; i < this.works.length; i++) { 303 let thread = this.works[i]; 304 thread.terminate(); 305 } 306 this.works.length = 0; 307 }; 308 309 submit(name: string, sql: string, args: any, handler: Function, action: string | null) { 310 let noBusyThreads = this.works.filter((it) => !it.busy); 311 let thread: DbThread; 312 if (noBusyThreads.length > 0) { 313 //取第一个空闲的线程进行任务 314 thread = noBusyThreads[0]; 315 thread.queryFunc(name, sql, args, handler, action); 316 } else { 317 // 随机插入一个线程中 318 thread = this.works[Math.floor(Math.random() * this.works.length)]; 319 thread.queryFunc(name, sql, args, handler, action); 320 } 321 } 322 323 //new method replace submit() method 324 submitTask(action: string, args: any, handler: Function) { 325 this.dataWorker?.queryFunc(action, args, handler); 326 } 327 328 progressTimer(num: number, progress: Function) { 329 let currentNum = num; 330 clearInterval(this.cutDownTimer); 331 this.cutDownTimer = setInterval(() => { 332 currentNum += Math.floor(Math.random() * 3); 333 if (currentNum >= 50) { 334 progress('database opened', 40); 335 clearInterval(this.cutDownTimer); 336 } else { 337 progress('database opened', currentNum); 338 } 339 }, Math.floor(Math.random() * 2500 + 1000)); 340 } 341} 342 343export const threadPool = new DbPool(); 344 345export function query<T extends any>( 346 name: string, 347 sql: string, 348 args: any = null, 349 action: string | null = null 350): Promise<Array<T>> { 351 return new Promise<Array<T>>((resolve, reject) => { 352 threadPool.submit( 353 name, 354 sql, 355 args, 356 (res: any) => { 357 if (res[0] && res[0] === 'error') { 358 window.publish(window.SmartEvent.UI.Error, res[1]); 359 reject(res); 360 } else { 361 resolve(res); 362 } 363 }, 364 action 365 ); 366 }); 367} 368 369export const queryEventCountMap = (): Promise< 370 Array<{ 371 eventName: string; 372 count: number; 373 }> 374> => query('queryEventCountMap', `select event_name as eventName,count from stat where stat_type = 'received';`); 375 376export const queryProcess = (): Promise< 377 Array<{ 378 pid: number | null; 379 processName: string | null; 380 }> 381> => 382 query( 383 'queryProcess', 384 ` 385 SELECT 386 pid, processName 387 FROM 388 temp_query_process where pid != 0` 389 ); 390 391export const queryProcessByTable = (): Promise< 392 Array<{ 393 pid: number | null; 394 processName: string | null; 395 }> 396> => 397 query( 398 'queryProcessByTable', 399 ` 400 SELECT 401 pid, name as processName 402 FROM 403 process where pid != 0` 404 ); 405 406export const queryProcessAsyncFunc = (_funName?: string): Promise<Array<any>> => 407 query( 408 'queryProcessAsyncFunc', 409 ` 410select tid, 411 P.pid, 412 A.name as threadName, 413 is_main_thread, 414 c.callid as track_id, 415 c.ts-D.start_ts as startTs, 416 c.dur, 417 c.name as funName, 418 c.parent_id, 419 c.id, 420 c.cookie, 421 c.depth, 422 c.argsetid 423from thread A,trace_range D 424left join callstack C on A.id = C.callid 425left join process P on P.id = A.ipid 426where startTs not null and cookie not null ${_funName ? 'funName=$funName' : ''};`, 427 { 428 funName: _funName, 429 } 430 ); 431 432export const queryTotalTime = (): Promise<Array<{ total: number; recordStartNS: number; recordEndNS: number }>> => 433 query( 434 'queryTotalTime', 435 ` 436 select 437 start_ts as recordStartNS,end_ts as recordEndNS,end_ts-start_ts as total 438 from 439 trace_range;` 440 ); 441 442export const getAsyncEvents = (): Promise<Array<any>> => 443 query( 444 'getAsyncEvents', 445 ` 446 select 447 *, 448 p.pid as pid, 449 c.ts - t.start_ts as "startTime" 450 from 451 callstack c,trace_range t 452 left join 453 process p 454 on 455 c.callid = p.id 456 where 457 cookie is not null;` 458 ); 459 460export const getCpuUtilizationRate = ( 461 startNS: number, 462 endNS: number 463): Promise< 464 Array<{ 465 cpu: number; 466 ro: number; 467 rate: number; 468 }> 469> => 470 query( 471 'getCpuUtilizationRate', 472 ` 473 with cpu as ( 474 select 475 cpu, 476 ts, 477 dur, 478 (case when ro < 99 then ro else 99 end) as ro , 479 (case when ro < 99 then stime+ro*cell else stime + 99 * cell end) as st, 480 (case when ro < 99 then stime + (ro+1)*cell else etime end) as et 481 from ( 482 select 483 cpu, 484 ts, 485 A.dur, 486 ((ts+A.dur)-D.start_ts)/((D.end_ts-D.start_ts)/100) as ro, 487 D.start_ts as stime, 488 D.end_ts etime, 489 (D.end_ts-D.start_ts)/100 as cell 490 from 491 sched_slice A 492 left join 493 trace_range D 494 left join 495 thread B on A.itid = B.id 496 where 497 tid != 0 498 and (A.ts) 499 between D.start_ts and D.end_ts)) 500 select cpu,ro, 501 sum(case 502 when ts <= st and ts + dur <= et then (ts + dur - st) 503 when ts <= st and ts + dur > et then et-st 504 when ts > st and ts + dur <= et then dur 505 when ts > st and ts + dur > et then et - ts end)/cast(et-st as float) as rate 506 from cpu 507 group by cpu,ro;`, 508 {} 509 ); 510 511export const getFps = () => 512 query<FpsStruct>( 513 'getFps', 514 ` 515 select 516 distinct(ts-tb.start_ts) as startNS, fps 517 from 518 hidump c ,trace_range tb 519 where 520 startNS >= 0 521 --order by startNS; 522 `, 523 {} 524 ); 525 526export const getFunDataByTid = (tid: number, ipid: number): Promise<Array<FuncStruct>> => 527 query( 528 'getFunDataByTid', 529 ` 530 select 531 c.ts-D.start_ts as startTs, 532 c.dur, 533 c.name as funName, 534 c.argsetid, 535 c.depth, 536 c.id as id 537from thread A,trace_range D 538left join callstack C on A.id = C.callid 539where startTs not null and c.cookie is null and tid = $tid and A.ipid = $ipid`, 540 { $tid: tid, $ipid: ipid } 541 ); 542 543export const getMaxDepthByTid = (): Promise<Array<any>> => 544 query( 545 'getMaxDepthByTid', 546 ` 547 select 548tid, 549ipid, 550 MAX(c.depth + 1) as maxDepth 551from thread A 552left join callstack C on A.id = C.callid 553where c.ts not null and c.cookie is null group by tid,ipid`, 554 {} 555 ); 556 557export const getStatesProcessThreadDataByRange = (leftNs: number, rightNs: number): Promise<Array<SPT>> => 558 query<SPT>( 559 'getStatesProcessThreadDataByRange', 560 ` 561 select 562 IP.name as process, 563 IP.pid as processId, 564 A.name as thread, 565 B.state as state, 566 A.tid as threadId, 567 B.dur, 568 (B.ts - TR.start_ts + B.dur) as end_ts, 569 (B.ts - TR.start_ts) as start_ts, 570 B.cpu 571 from 572 thread_state as B 573 left join thread as A on B.itid = A.id 574 left join process as IP on A.ipid = IP.id 575 left join trace_range as TR 576 where B.dur > 0 577 and IP.pid not null 578 and (B.ts - TR.start_ts) >= $leftNs 579 and (B.ts - TR.start_ts + B.dur) <= $rightNs 580`, 581 { $leftNs: leftNs, $rightNs: rightNs } 582 ); 583 584export const getTabBoxChildData = ( 585 leftNs: number, 586 rightNs: number, 587 state: string | undefined, 588 processId: number | undefined, 589 threadId: number | undefined 590): Promise<Array<SPTChild>> => 591 query<SPTChild>( 592 'getTabBoxChildData', 593 ` 594 select 595 IP.name as process, 596 IP.pid as processId, 597 A.name as thread, 598 B.state as state, 599 A.tid as threadId, 600 B.dur as duration, 601 B.ts - TR.start_ts as startNs, 602 B.cpu, 603 C.priority 604 from 605 thread_state AS B 606 left join 607 thread as A 608 on 609 B.itid = A.id 610 left join 611 process AS IP 612 on 613 A.ipid = IP.id 614 left join 615 trace_range AS TR 616 left join 617 sched_slice as C 618 on 619 B.itid = C.itid 620 and 621 C.ts = B.ts 622 where 623 B.dur > 0 624 and 625 IP.pid not null 626 and 627 not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS)) 628 ${state != undefined && state != '' ? 'and B.state = $state' : ''} 629 ${processId != undefined && processId != -1 ? 'and IP.pid = $processID' : ''} 630 ${threadId != undefined && threadId != -1 ? 'and A.tid = $threadID' : ''} 631 `, 632 { 633 $leftNS: leftNs, 634 $rightNS: rightNs, 635 $state: state, 636 $processID: processId, 637 $threadID: threadId, 638 } 639 ); 640 641export const getTabCpuUsage = (cpus: Array<number>, leftNs: number, rightNs: number): Promise<Array<CpuUsage>> => 642 query<CpuUsage>( 643 'getTabCpuUsage', 644 ` 645 select 646 cpu, 647 sum(case 648 when (A.ts - B.start_ts) < $leftNS 649 then (A.ts - B.start_ts + A.dur - $leftNS) 650 when (A.ts - B.start_ts) >= $leftNS 651 and (A.ts - B.start_ts + A.dur) <= $rightNS 652 then A.dur 653 when (A.ts - B.start_ts + A.dur) > $rightNS 654 then ($rightNS - (A.ts - B.start_ts)) end) / cast($rightNS - $leftNS as float) as usage 655 from 656 thread_state A, 657 trace_range B 658 where 659 (A.ts - B.start_ts) > 0 and A.dur > 0 660 and 661 cpu in (${cpus.join(',')}) 662 and 663 (A.ts - B.start_ts + A.dur) > $leftNS 664 and 665 (A.ts - B.start_ts) < $rightNS 666 group by 667 cpu`, 668 { $leftNS: leftNs, $rightNS: rightNs } 669 ); 670 671export const getTabCpuFreq = (cpus: Array<number>, leftNs: number, rightNs: number): Promise<Array<Freq>> => 672 query<Freq>( 673 'getTabCpuFreq', 674 ` 675 select 676 cpu, 677 value, 678 (ts - tr.start_ts) as startNs 679 from 680 measure m, 681 trace_range tr 682 inner join 683 cpu_measure_filter t 684 on 685 m.filter_id = t.id 686 where 687 (name = 'cpufreq' or name='cpu_frequency') 688 and 689 cpu in (${cpus.join(',')}) 690 and 691 startNs > 0 692 and 693 startNs < $rightNS 694 --order by startNs 695 `, 696 { $leftNS: leftNs, $rightNS: rightNs } 697 ); 698 699export const getTabFps = (leftNs: number, rightNs: number): Promise<Array<Fps>> => 700 query<Fps>( 701 'getTabFps', 702 ` 703 select 704 distinct(ts-tb.start_ts) as startNS, 705 fps 706 from 707 hidump c, 708 trace_range tb 709 where 710 startNS <= $rightNS 711 and 712 startNS >= 0 713 --order by startNS; 714 `, 715 { $leftNS: leftNs, $rightNS: rightNs } 716 ); 717 718export const getTabCounters = (processFilterIds: Array<number>, virtualFilterIds: Array<number>, startTime: number) => 719 query<Counter>( 720 'getTabCounters', 721 ` 722 select 723 t1.filter_id as trackId, 724 t2.name, 725 value, 726 t1.ts - t3.start_ts as startTime 727 from 728 process_measure t1 729 left join 730 process_measure_filter t2 731 on 732 t1.filter_id = t2.id 733 left join 734 trace_range t3 735 where 736 filter_id in (${processFilterIds.join(',')}) 737 and 738 startTime <= $startTime 739union 740 select 741 t1.filter_id as trackId, 742 t2.name, 743 value, 744 t1.ts - t3.start_ts as startTime 745 from 746 sys_mem_measure t1 747 left join 748 sys_event_filter t2 749 on 750 t1.filter_id = t2.id 751 left join 752 trace_range t3 753 where 754 filter_id in (${virtualFilterIds.join(',')}) 755 and 756 startTime <= $startTime 757 `, 758 { $startTime: startTime } 759 ); 760 761export const getTabVirtualCounters = (virtualFilterIds: Array<number>, startTime: number) => 762 query<Counter>( 763 'getTabVirtualCounters', 764 ` 765 select 766 table1.filter_id as trackId, 767 table2.name, 768 value, 769 table1.ts - table3.start_ts as startTime 770 from 771 sys_mem_measure table1 772 left join 773 sys_event_filter table2 774 on 775 table1.filter_id = table2.id 776 left join 777 trace_range table3 778 where 779 filter_id in (${virtualFilterIds.join(',')}) 780 and 781 startTime <= $startTime 782 `, 783 { $startTime: startTime } 784 ); 785 786export const getTabCpuByProcess = (cpus: Array<number>, leftNS: number, rightNS: number) => 787 query<any>( 788 'getTabCpuByProcess', 789 ` 790 select 791 B.pid as pid, 792 sum(B.dur) as wallDuration, 793 avg(B.dur) as avgDuration, 794 count(B.tid) as occurrences 795 from 796 thread_state AS B 797 left join 798 trace_range AS TR 799 where 800 B.cpu in (${cpus.join(',')}) 801 and 802 not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS )) 803 group by 804 B.pid 805 order by 806 wallDuration desc;`, 807 { $rightNS: rightNS, $leftNS: leftNS } 808 ); 809 810export const getTabCpuByThread = (cpus: Array<number>, leftNS: number, rightNS: number) => 811 query<any>( 812 'getTabCpuByThread', 813 ` 814 select 815 TS.pid as pid, 816 TS.tid as tid, 817 TS.cpu, 818 sum( min(${rightNS},(TS.ts - TR.start_ts + TS.dur)) - max(${leftNS},TS.ts - TR.start_ts)) wallDuration, 819 count(TS.tid) as occurrences 820 from 821 thread_state AS TS 822 left join 823 trace_range AS TR 824 where 825 TS.cpu in (${cpus.join(',')}) 826 and 827 not ((TS.ts - TR.start_ts + TS.dur < $leftNS) or (TS.ts - TR.start_ts > $rightNS)) 828 group by 829 TS.cpu, 830 TS.pid, 831 TS.tid 832 order by 833 wallDuration desc;`, 834 { $rightNS: rightNS, $leftNS: leftNS } 835 ); 836 837export const getTabSlices = ( 838 funTids: Array<number>, 839 pids: Array<number>, 840 leftNS: number, 841 rightNS: number 842): Promise<Array<any>> => 843 query<SelectionData>( 844 'getTabSlices', 845 ` 846 select 847 c.name as name, 848 sum(c.dur) as wallDuration, 849 avg(c.dur) as avgDuration, 850 count(c.name) as occurrences 851 from 852 thread T, trace_range TR 853 left join process P on T.ipid = P.id 854 left join 855 callstack C 856 on 857 T.id = C.callid 858 where 859 C.ts not null 860 and 861 c.dur >= 0 862 and 863 T.tid in (${funTids.join(',')}) 864 and 865 P.pid in (${pids.join(',')}) 866 and 867 c.name != 'binder transaction async' 868 and 869 c.name != 'binder async rcv' 870 and 871 c.cookie is null 872 and 873 not ((C.ts - TR.start_ts + C.dur < $leftNS) or (C.ts - TR.start_ts > $rightNS)) 874 group by 875 c.name 876 order by 877 wallDuration desc;`, 878 { $leftNS: leftNS, $rightNS: rightNS } 879 ); 880 881export const getTabSlicesAsyncFunc = ( 882 asyncNames: Array<string>, 883 asyncPid: Array<number>, 884 leftNS: number, 885 rightNS: number 886): Promise<Array<any>> => 887 query<SelectionData>( 888 'getTabSlicesAsyncFunc', 889 ` 890 select 891 c.name as name, 892 sum(c.dur) as wallDuration, 893 avg(c.dur) as avgDuration, 894 count(c.name) as occurrences 895 from 896 thread A, trace_range D 897 left join 898 callstack C 899 on 900 A.id = C.callid 901 left join process P on P.id = A.ipid 902 where 903 C.ts not null 904 and 905 c.dur >= -1 906 and 907 c.cookie not null 908 and 909 P.pid in (${asyncPid.join(',')}) 910 and 911 c.name in (${asyncNames.map((it) => "'" + it + "'").join(',')}) 912 and 913 not ((C.ts - D.start_ts + C.dur < $leftNS) or (C.ts - D.start_ts > $rightNS)) 914 group by 915 c.name 916 order by 917 wallDuration desc;`, 918 { $leftNS: leftNS, $rightNS: rightNS } 919 ); 920 921export const getTabThreadStates = (tIds: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> => 922 query<SelectionData>( 923 'getTabThreadStates', 924 ` 925 select 926 B.pid, 927 B.tid, 928 B.state, 929 sum(B.dur) as wallDuration, 930 avg(ifnull(B.dur,0)) as avgDuration, 931 count(B.tid) as occurrences 932 from 933 thread_state AS B 934 left join 935 trace_range AS TR 936 where 937 B.tid in (${tIds.join(',')}) 938 and 939 not ((B.ts - TR.start_ts + ifnull(B.dur,0) < $leftNS) or (B.ts - TR.start_ts > $rightNS)) 940 group by 941 B.pid, B.tid, B.state 942 order by 943 wallDuration desc;`, 944 { $leftNS: leftNS, $rightNS: rightNS } 945 ); 946 947export const getTabThreadStatesCpu = (tIds: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> => { 948 let sql = ` 949select 950 B.pid, 951 B.tid, 952 B.cpu, 953 sum( min(${rightNS},(B.ts - TR.start_ts + B.dur)) - max(${leftNS},B.ts - TR.start_ts)) wallDuration 954from thread_state as B 955left join trace_range as TR 956where cpu notnull 957 and B.tid in (${tIds.join(',')}) 958 and not ((B.ts - TR.start_ts + ifnull(B.dur,0) < ${leftNS}) or (B.ts - TR.start_ts > ${rightNS})) 959group by B.tid, B.pid, B.cpu;`; 960 return query<SelectionData>('getTabThreadStatesCpu', sql, { 961 $leftNS: leftNS, 962 $rightNS: rightNS, 963 }); 964}; 965 966export const getTabStartups = (ids: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> => { 967 let sql = ` 968select 969 P.pid, 970 P.name as process, 971 (A.start_time - B.start_ts) as startTs, 972 (case when A.end_time = -1 then 0 else (A.end_time - A.start_time) end) as dur, 973 A.start_name as startName 974from app_startup A,trace_range B 975left join process P on A.ipid = P.ipid 976where P.pid in (${ids.join(',')}) 977and not ((startTs + dur < ${leftNS}) or (startTs > ${rightNS})) 978order by start_name;`; 979 return query('getTabStartups', sql, {}); 980}; 981 982export const getTabStaticInit = (ids: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> => { 983 let sql = ` 984select 985 P.pid, 986 P.name as process, 987 (A.start_time - B.start_ts) as startTs, 988 (case when A.end_time = -1 then 0 else (A.end_time - A.start_time) end) as dur, 989 A.so_name as soName 990from static_initalize A,trace_range B 991left join process P on A.ipid = P.ipid 992where P.pid in (${ids.join(',')}) 993and not ((startTs + dur < ${leftNS}) or (startTs > ${rightNS})) 994order by dur desc;`; 995 return query('getTabStaticInit', sql, {}); 996}; 997 998export const queryBinderArgsByArgset = (argset: number): Promise<Array<BinderArgBean>> => 999 query( 1000 'queryBinderArgsByArgset', 1001 ` 1002 select 1003 * 1004 from 1005 args_view 1006 where 1007 argset = $argset;`, 1008 { $argset: argset } 1009 ); 1010 1011export const queryCpuData = (cpu: number, startNS: number, endNS: number): Promise<Array<CpuStruct>> => 1012 query( 1013 'queryCpuData', 1014 ` 1015 SELECT 1016 B.pid as processId, 1017 B.cpu, 1018 B.tid, 1019 B.itid as id, 1020 B.dur, 1021 B.ts - TR.start_ts AS startTime, 1022 B.arg_setid as argSetID 1023from thread_state AS B 1024 left join trace_range AS TR 1025where B.itid is not null 1026 and 1027 B.cpu = $cpu 1028 and 1029 startTime between $startNS and $endNS;`, 1030 { 1031 $cpu: cpu, 1032 $startNS: startNS, 1033 $endNS: endNS, 1034 } 1035 ); 1036 1037export const queryCpuFreq = (): Promise<Array<{ cpu: number; filterId: number }>> => 1038 query( 1039 'queryCpuFreq', 1040 ` 1041 select 1042 cpu,id as filterId 1043 from 1044 cpu_measure_filter 1045 where 1046 (name='cpufreq' or name='cpu_frequency') 1047 order by cpu; 1048 ` 1049 ); 1050 1051export const queryCpuFreqData = (cpu: number): Promise<Array<CpuFreqStruct>> => 1052 query<CpuFreqStruct>( 1053 'queryCpuFreqData', 1054 ` 1055 select 1056 cpu, 1057 value, 1058 ifnull(dur,tb.end_ts - c.ts) dur, 1059 ts-tb.start_ts as startNS 1060 from 1061 measure c, 1062 trace_range tb 1063 inner join 1064 cpu_measure_filter t 1065 on 1066 c.filter_id = t.id 1067 where 1068 (name = 'cpufreq' or name='cpu_frequency') 1069 and 1070 cpu= $cpu 1071 --order by ts; 1072 `, 1073 { $cpu: cpu } 1074 ); 1075 1076export const queryCpuMax = (): Promise<Array<any>> => 1077 query( 1078 'queryCpuMax', 1079 ` 1080 select 1081 cpu 1082 from 1083 sched_slice 1084 order by 1085 cpu 1086 desc limit 1;` 1087 ); 1088 1089export const queryCpuDataCount = () => 1090 query('queryCpuDataCount', 'select count(1) as count,cpu from thread_state where cpu not null group by cpu'); 1091 1092export const queryCpuCount = (): Promise<Array<any>> => 1093 query( 1094 'queryCpuCount', 1095 ` 1096 select max(cpuCount) cpuCount from 1097(select ifnull((max(cpu) + 1),0) cpuCount from cpu_measure_filter where name in ('cpu_frequency','cpu_idle') 1098 union all 1099 select ifnull((max(callid)+1),0) cpuCount from irq 1100) A;` 1101 ); 1102 1103export const queryCpuSchedSlice = (): Promise<Array<any>> => 1104 query( 1105 'queryCpuSchedSlice', 1106 ` 1107 select (ts - start_ts) as ts, 1108 itid, 1109 end_state as endState, 1110 priority 1111 from sched_slice,trace_range;` 1112 ); 1113 1114export const queryCpuStateFilter = (): Promise<Array<any>> => 1115 query( 1116 'queryCpuStateFilter', 1117 `select cpu,id as filterId from cpu_measure_filter where name = 'cpu_idle' order by cpu;`, 1118 {} 1119 ); 1120 1121export const queryCpuState = (cpuFilterId: number): Promise<Array<any>> => 1122 query( 1123 'queryCpuState', 1124 ` 1125 select (A.ts - B.start_ts) as startTs,ifnull(dur,B.end_ts - A.ts) dur, 1126 value 1127 from measure A,trace_range B 1128 where filter_id = $filterId;`, 1129 { $filterId: cpuFilterId } 1130 ); 1131 1132export const queryCpuMaxFreq = (): Promise<Array<any>> => 1133 query( 1134 'queryCpuMaxFreq', 1135 ` 1136 select 1137 max(value) as maxFreq 1138 from 1139 measure c 1140 inner join 1141 cpu_measure_filter t 1142 on 1143 c.filter_id = t.id 1144 where 1145 (name = 'cpufreq' or name='cpu_frequency');` 1146 ); 1147 1148export const queryProcessData = (pid: number, startNS: number, endNS: number): Promise<Array<any>> => 1149 query( 1150 'queryProcessData', 1151 ` 1152 select ta.cpu, 1153 dur, 1154 ts-${(window as any).recordStartNS} as startTime 1155from thread_state ta 1156where ta.cpu is not null and pid=$pid and startTime between $startNS and $endNS;`, 1157 { 1158 $pid: pid, 1159 $startNS: startNS, 1160 $endNS: endNS, 1161 } 1162 ); 1163 1164export const queryProcessMem = (): Promise<Array<any>> => 1165 query( 1166 'queryProcessMem', 1167 ` 1168 select 1169 process_measure_filter.id as trackId, 1170 process_measure_filter.name as trackName, 1171 ipid as upid, 1172 process.pid, 1173 process.name as processName 1174 from 1175 process_measure_filter 1176 join 1177 process using (ipid) 1178 order by trackName;` 1179 ); 1180 1181export const queryProcessThreadDataCount = (): Promise<Array<any>> => 1182 query( 1183 `queryProcessThreadDataCount`, 1184 `select pid,count(id) as count 1185 from thread_state 1186 where ts between ${(window as any).recordStartNS} and ${(window as any).recordEndNS} group by pid;`, 1187 {} 1188 ); 1189 1190export const queryProcessFuncDataCount = (): Promise<Array<any>> => 1191 query( 1192 `queryProcessFuncDataCount`, 1193 `select 1194 P.pid, 1195 count(tid) as count 1196 from callstack C 1197 left join thread A on A.id = C.callid 1198 left join process AS P on P.id = A.ipid 1199 where C.ts between ${(window as any).recordStartNS} and ${(window as any).recordEndNS} 1200 group by pid;`, 1201 {} 1202 ); 1203 1204export const queryProcessMemDataCount = (): Promise<Array<any>> => 1205 query( 1206 `queryProcessMemDataCount`, 1207 `select 1208 p.pid as pid, count(value) count 1209 from process_measure c 1210 left join process_measure_filter f on f.id = c.filter_id 1211 left join process p on p.ipid = f.ipid 1212where f.id not NULL and value>0 1213 and c.ts between ${(window as any).recordStartNS} and ${(window as any).recordEndNS} 1214group by p.pid`, 1215 {} 1216 ); 1217 1218export const queryProcessMemData = (trackId: number): Promise<Array<ProcessMemStruct>> => 1219 query( 1220 'queryProcessMemData', 1221 ` 1222 select 1223 c.type, 1224 ts, 1225 value, 1226 filter_id as track_id, 1227 c.ts-tb.start_ts startTime 1228 from 1229 process_measure c, 1230 trace_range tb 1231 where 1232 filter_id = $id;`, 1233 { $id: trackId } 1234 ); 1235 1236export const queryThreads = (): Promise<Array<any>> => 1237 query('queryThreads', `select id,tid,(ifnull(name,'Thread') || '(' || tid || ')') name from thread where id != 0;`); 1238 1239export const queryDataDICT = (): Promise<Array<any>> => query('queryDataDICT', `select * from data_dict;`); 1240export const queryProcessContentCount = (): Promise<Array<any>> => 1241 query(`queryProcessContentCount`, `select pid,switch_count,thread_count,slice_count,mem_count from process;`); 1242export const queryProcessThreadsByTable = (): Promise<Array<ThreadStruct>> => 1243 query( 1244 'queryProcessThreadsByTable', 1245 ` 1246 select p.pid as pid,p.ipid as upid,t.tid as tid,p.name as processName,t.name as threadName from thread t left join process p on t.ipid = p.id where t.tid != 0; 1247 ` 1248 ); 1249export const queryVirtualMemory = (): Promise<Array<any>> => 1250 query('queryVirtualMemory', `select id,name from sys_event_filter where type='sys_virtual_memory_filter'`); 1251export const queryVirtualMemoryData = (filterId: number): Promise<Array<any>> => 1252 query( 1253 'queryVirtualMemoryData', 1254 `select ts-${ 1255 (window as any).recordStartNS 1256 } as startTime,value,filter_id as filterID from sys_mem_measure where filter_id=$filter_id`, 1257 { $filter_id: filterId } 1258 ); 1259export const queryProcessThreads = (): Promise<Array<ThreadStruct>> => 1260 query( 1261 'queryProcessThreads', 1262 ` 1263 select 1264 the_tracks.ipid as upid, 1265 the_tracks.itid as utid, 1266 total_dur as hasSched, 1267 process.pid as pid, 1268 thread.tid as tid, 1269 process.name as processName, 1270 thread.name as threadName 1271 from ( 1272 select ipid,itid from sched_slice group by itid 1273 ) the_tracks 1274 left join (select itid,sum(dur) as total_dur from thread_state where state != 'S' group by itid) using(itid) 1275 left join thread using(itid) 1276 left join process using(ipid) 1277 order by total_dur desc,the_tracks.ipid,the_tracks.itid;`, 1278 {} 1279 ); 1280 1281export const queryThreadData = (tid: number, pid: number): Promise<Array<ThreadStruct>> => 1282 query( 1283 'queryThreadData', 1284 ` 1285 select 1286 B.itid as id 1287 , B.tid 1288 , B.cpu 1289 , B.ts - TR.start_ts AS startTime 1290 , B.dur 1291 , B.state 1292 , B.pid 1293 , B.arg_setid as argSetID 1294from thread_state AS B 1295 left join trace_range AS TR 1296where B.tid = $tid and B.pid = $pid;`, 1297 { $tid: tid, $pid: pid } 1298 ); 1299 1300export const queryStartupPidArray = (): Promise<Array<{ pid: number }>> => 1301 query( 1302 'queryStartupPidArray', 1303 ` 1304 select distinct pid 1305from app_startup A,trace_range B left join process P on A.ipid = p.ipid 1306where A.start_time between B.start_ts and B.end_ts;`, 1307 {} 1308 ); 1309 1310export const queryProcessStartup = (pid: number): Promise<Array<AppStartupStruct>> => 1311 query( 1312 'queryProcessStartup', 1313 ` 1314 select 1315 P.pid, 1316 A.tid, 1317 A.call_id as itid, 1318 (case when A.start_time < B.start_ts then 0 else (A.start_time - B.start_ts) end) as startTs, 1319 (case 1320 when A.start_time < B.start_ts then (A.end_time - B.start_ts) 1321 when A.end_time = -1 then 0 1322 else (A.end_time - A.start_time) end) as dur, 1323 A.start_name as startName 1324from app_startup A,trace_range B 1325left join process P on A.ipid = P.ipid 1326where P.pid = $pid 1327order by start_name;`, 1328 { $pid: pid } 1329 ); 1330 1331export const queryProcessSoMaxDepth = (): Promise<Array<{ pid: number; maxDepth: number }>> => 1332 query( 1333 'queryProcessSoMaxDepth', 1334 `select p.pid,max(depth) maxDepth 1335from static_initalize S,trace_range B left join process p on S.ipid = p.ipid 1336where S.start_time between B.start_ts and B.end_ts 1337group by p.pid;`, 1338 {} 1339 ); 1340 1341export const queryProcessSoInitData = (pid: number): Promise<Array<SoStruct>> => 1342 query( 1343 'queryProcessSoInitData', 1344 ` 1345 select 1346 P.pid, 1347 T.tid, 1348 A.call_id as itid, 1349 (A.start_time - B.start_ts) as startTs, 1350 (A.end_time - A.start_time) as dur, 1351 A.so_name as soName, 1352 A.depth 1353from static_initalize A,trace_range B 1354left join process P on A.ipid = P.ipid 1355left join thread T on A.call_id = T.itid 1356where P.pid = $pid;`, 1357 { $pid: pid } 1358 ); 1359 1360export const queryThreadAndProcessName = (): Promise<Array<any>> => 1361 query( 1362 'queryThreadAndProcessName', 1363 ` 1364 select tid id,name,'t' type from thread 1365union all 1366select pid id,name,'p' type from process;`, 1367 {} 1368 ); 1369 1370export const queryThreadStateArgs = (argset: number): Promise<Array<BinderArgBean>> => 1371 query('queryThreadStateArgs', ` select args_view.* from args_view where argset = ${argset}`, {}); 1372 1373export const queryWakeUpThread_Desc = (): Promise<Array<any>> => 1374 query( 1375 'queryWakeUpThread_Desc', 1376 `This is the interval from when the task became eligible to run 1377(e.g.because of notifying a wait queue it was a suspended on) to when it started running.` 1378 ); 1379 1380export const queryCPUWakeUpIdFromBean = (tid: number | undefined): Promise<Array<WakeupBean>> => { 1381 let sql = ` 1382select itid from thread where tid=${tid} 1383 `; 1384 return query('queryCPUWakeUpListFromBean', sql, {}); 1385}; 1386 1387export const queryThreadWakeUp = (itid: number, startTime: number, dur: number): Promise<Array<WakeupBean>> => 1388 query( 1389 'queryThreadWakeUp', 1390 ` 1391select TA.tid,min(TA.ts - TR.start_ts) as ts,TA.pid 1392from 1393 (select min(ts) as wakeTs,ref as itid from instant,trace_range 1394 where name = 'sched_wakeup' 1395 and wakeup_from = $itid 1396 and ts > start_ts + $startTime 1397 and ts < start_ts + $startTime + $dur 1398 group by ref 1399 ) TW 1400left join thread_state TA on TW.itid = TA.itid 1401left join trace_range TR 1402where TA.ts > TW.wakeTs 1403group by TA.tid,TA.pid; 1404 `, 1405 { $itid: itid, $startTime: startTime, $dur: dur } 1406 ); 1407 1408export const queryRunnableTimeByRunning = (tid: number, startTime: number): Promise<Array<WakeupBean>> => { 1409 let sql = ` 1410select ts from thread_state,trace_range where ts + dur -start_ts = ${startTime} and state = 'R' and tid=${tid} limit 1 1411 `; 1412 return query('queryRunnableTimeByRunning', sql, {}); 1413}; 1414 1415export const queryThreadWakeUpFrom = (itid: number, startTime: number): Promise<Array<WakeupBean>> => { 1416 let sql = ` 1417select (A.ts - B.start_ts) as ts, 1418 A.tid, 1419 A.pid, 1420 A.cpu, 1421 A.dur 1422from thread_state A,trace_range B 1423where A.state = 'Running' 1424and A.itid = (select wakeup_from from instant where ts = ${startTime} and ref = ${itid} limit 1) 1425and (A.ts - B.start_ts) < (${startTime} - B.start_ts) 1426order by ts desc limit 1 1427 `; 1428 return query('queryThreadWakeUpFrom', sql, {}); 1429}; 1430/*-------------------------------------------------------------------------------------*/ 1431 1432export const queryHeapGroupByEvent = (type: string): Promise<Array<NativeEventHeap>> => { 1433 let sql1 = ` 1434 select 1435 event_type as eventType, 1436 sum(heap_size) as sumHeapSize 1437 from native_hook 1438 where event_type = 'AllocEvent' or event_type = 'MmapEvent' 1439 group by event_type 1440 `; 1441 let sql2 = ` 1442 select (case when type = 0 then 'AllocEvent' else 'MmapEvent' end) eventType, 1443 sum(apply_size) sumHeapSize 1444 from native_hook_statistic 1445 group by eventType; 1446 `; 1447 return query('queryHeapGroupByEvent', type === 'native_hook' ? sql1 : sql2, {}); 1448}; 1449 1450export const queryAllHeapByEvent = (): Promise<Array<NativeEvent>> => 1451 query( 1452 'queryAllHeapByEvent', 1453 ` 1454 select * from ( 1455 select h.start_ts - t.start_ts as startTime, 1456 h.heap_size as heapSize, 1457 h.event_type as eventType 1458from native_hook h ,trace_range t 1459where h.start_ts >= t.start_ts and h.start_ts <= t.end_ts 1460and (h.event_type = 'AllocEvent' or h.event_type = 'MmapEvent') 1461union 1462select h.end_ts - t.start_ts as startTime, 1463 h.heap_size as heapSize, 1464 (case when h.event_type = 'AllocEvent' then 'FreeEvent' else 'MunmapEvent' end) as eventType 1465from native_hook h ,trace_range t 1466where h.start_ts >= t.start_ts and h.start_ts <= t.end_ts 1467and (h.event_type = 'AllocEvent' or h.event_type = 'MmapEvent') 1468and h.end_ts not null ) order by startTime; 1469`, 1470 {} 1471 ); 1472 1473export const queryHeapAllData = ( 1474 startTs: number, 1475 endTs: number, 1476 ipids: Array<number> 1477): Promise<Array<HeapTreeDataBean>> => 1478 query( 1479 'queryHeapAllData', 1480 ` 1481 select 1482 h.start_ts - t.start_ts as startTs, 1483 h.end_ts - t.start_ts as endTs, 1484 h.heap_size as heapSize, 1485 h.event_type as eventType, 1486 h.callchain_id as eventId 1487 from 1488 native_hook h 1489 inner join 1490 trace_range t 1491 where 1492 event_type = 'AllocEvent' 1493 and 1494 ipid in (${ipids.join(',')}) 1495 and 1496 (h.start_ts - t.start_ts between ${startTs} and ${endTs} or h.end_ts - t.start_ts between ${startTs} and ${endTs})`, 1497 { ipids: ipids, $startTs: startTs, $endTs: endTs } 1498 ); 1499 1500export const queryNativeHookStatistics = (leftNs: number, rightNs: number): Promise<Array<NativeHookMalloc>> => 1501 query( 1502 'queryNativeHookStatistics', 1503 ` 1504 select 1505 event_type as eventType, 1506 sub_type_id as subTypeId, 1507 max(heap_size) as max, 1508 sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte, 1509 sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount, 1510 sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte, 1511 sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount 1512 from 1513 native_hook A, 1514 trace_range B 1515 where 1516 (A.start_ts - B.start_ts) between ${leftNs} and ${rightNs} 1517 and (event_type = 'AllocEvent' or event_type = 'MmapEvent') 1518 group by event_type;`, 1519 { $leftNs: leftNs, $rightNs: rightNs } 1520 ); 1521 1522export const queryNativeHookStatisticsMalloc = (leftNs: number, rightNs: number): Promise<Array<NativeHookMalloc>> => 1523 query( 1524 'queryNativeHookStatisticsMalloc', 1525 ` 1526 select 1527 event_type as eventType, 1528 heap_size as heapSize, 1529 sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte, 1530 sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount, 1531 sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte, 1532 sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount 1533 from 1534 native_hook A, 1535 trace_range B 1536 where 1537 (A.start_ts - B.start_ts) between ${leftNs} and ${rightNs} 1538 and 1539 (event_type = 'AllocEvent' or event_type = 'MmapEvent') 1540 and 1541 sub_type_id is null 1542 group by 1543 event_type, 1544 heap_size 1545 order by heap_size desc 1546 `, 1547 { $leftNs: leftNs, $rightNs: rightNs } 1548 ); 1549 1550export const queryNativeHookStatisticsSubType = (leftNs: number, rightNs: number): Promise<Array<NativeHookMalloc>> => 1551 query( 1552 'queryNativeHookStatisticsSubType', 1553 ` 1554 select 1555 event_type as eventType, 1556 sub_type_id as subTypeId, 1557 max(heap_size) as max, 1558 sum(case when ((NH.start_ts - TR.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte, 1559 sum(case when ((NH.start_ts - TR.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount, 1560 sum(case when ((NH.end_ts - TR.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte, 1561 sum(case when ((NH.end_ts - TR.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount 1562 from 1563 native_hook NH, 1564 trace_range TR 1565 where 1566 (NH.start_ts - TR.start_ts) between ${leftNs} and ${rightNs} 1567 and 1568 (event_type = 'MmapEvent') 1569 group by 1570 event_type,sub_type_id; 1571 `, 1572 { $leftNs: leftNs, $rightNs: rightNs } 1573 ); 1574 1575export const queryNativeHookSubType = (leftNs: number, rightNs: number): Promise<Array<any>> => 1576 query( 1577 'queryNativeHookSubType', 1578 `select distinct sub_type_id as subTypeId, DD.data as subType 1579 from 1580 native_hook NH, 1581 trace_range TR 1582 left join data_dict DD on NH.sub_type_id = DD.id 1583 where 1584 NH.sub_type_id not null and 1585 (NH.start_ts - TR.start_ts) between ${leftNs} and ${rightNs} 1586 `, 1587 { $leftNs: leftNs, $rightNs: rightNs } 1588 ); 1589 1590export const queryNativeHookStatisticSubType = (leftNs: number, rightNs: number): Promise<Array<any>> => 1591 query( 1592 'queryNativeHookStatisticSubType', 1593 `SELECT DISTINCT type as subTypeId, 1594 CASE WHEN type = 2 THEN 'FILE_PAGE_MSG' WHEN type = 3 THEN 'MEMORY_USING_MSG' ELSE 'MmapEvent' END AS subType 1595 FROM 1596 native_hook_statistic NHS, 1597 trace_range TR 1598 WHERE 1599 NHS.type > 1 AND 1600 (NHS.ts - TR.start_ts) between ${leftNs} and ${rightNs} 1601 `, 1602 { $leftNs: leftNs, $rightNs: rightNs } 1603 ); 1604 1605export const queryNativeHookEventTid = ( 1606 leftNs: number, 1607 rightNs: number, 1608 types: Array<string> 1609): Promise<Array<NativeHookStatistics>> => 1610 query( 1611 'queryNativeHookEventTid', 1612 ` 1613 select 1614 callchain_id as eventId, 1615 event_type as eventType, 1616 heap_size as heapSize, 1617 addr, 1618 (A.start_ts - B.start_ts) as startTs, 1619 (A.end_ts - B.start_ts) as endTs, 1620 tid, 1621 sub_type_id as subTypeId, 1622 ifnull(last_lib_id,0) as lastLibId, 1623 t.name as threadName 1624 from 1625 native_hook A, 1626 trace_range B 1627 left join 1628 thread t 1629 on 1630 A.itid = t.id 1631 where 1632 A.start_ts - B.start_ts 1633 between ${leftNs} and ${rightNs} and A.event_type in (${types.join(',')})`, 1634 { $leftNs: leftNs, $rightNs: rightNs, $types: types } 1635 ); 1636 1637export const queryNativeHookStatisticsCount = (): Promise<Array<NativeHookProcess>> => 1638 query('queryNativeHookStatisticsCount', `select count(1) num from native_hook_statistic`, {}); 1639 1640export const queryNativeHookProcess = (table: string): Promise<Array<NativeHookProcess>> => { 1641 let sql = ` 1642 select 1643 distinct ${table}.ipid, 1644 pid, 1645 name 1646 from 1647 ${table} 1648 left join 1649 process p 1650 on 1651 ${table}.ipid = p.id 1652 `; 1653 return query('queryNativeHookProcess', sql, {}); 1654}; 1655 1656export const queryNativeHookSnapshotTypes = (): Promise<Array<NativeHookSampleQueryInfo>> => 1657 query( 1658 'queryNativeHookSnapshotTypes', 1659 ` 1660select 1661 event_type as eventType, 1662 data as subType 1663 from 1664 native_hook left join data_dict on native_hook.sub_type_id = data_dict.id 1665 where 1666 (event_type = 'AllocEvent' or event_type = 'MmapEvent') 1667 group by 1668 event_type,data;`, 1669 {} 1670 ); 1671 1672export const queryAllHookData = (rightNs: number): Promise<Array<NativeHookSampleQueryInfo>> => 1673 query( 1674 'queryAllHookData', 1675 ` 1676 select 1677 callchain_id as eventId, 1678 event_type as eventType, 1679 data as subType, 1680 addr, 1681 heap_size as growth, 1682 (n.start_ts - t.start_ts) as startTs, 1683 (n.end_ts - t.start_ts) as endTs 1684 from 1685 native_hook n left join data_dict on n.sub_type_id = data_dict.id, 1686 trace_range t 1687 where 1688 (event_type = 'AllocEvent' or event_type = 'MmapEvent') 1689 and 1690 n.start_ts between t.start_ts and ${rightNs} + t.start_ts`, 1691 { $rightNs: rightNs } 1692 ); 1693 1694export const queryNativeHookResponseTypes = ( 1695 leftNs: number, 1696 rightNs: number, 1697 types: Array<string> 1698): Promise<Array<any>> => 1699 query( 1700 'queryNativeHookResponseTypes', 1701 ` 1702 select 1703 distinct last_lib_id as lastLibId, 1704 data_dict.data as value 1705 from 1706 native_hook A ,trace_range B 1707 left join data_dict on A.last_lib_id = data_dict.id 1708 where 1709 A.start_ts - B.start_ts 1710 between ${leftNs} and ${rightNs} and A.event_type in (${types.join(',')}); 1711 `, 1712 { $leftNs: leftNs, $rightNs: rightNs, $types: types } 1713 ); 1714/** 1715 * HiPerf 1716 */ 1717export const queryHiPerfEventList = (): Promise<Array<any>> => 1718 query('queryHiPerfEventList', `select id,report_value from perf_report where report_type='config_name'`, {}); 1719export const queryHiPerfEventListData = (eventTypeId: number): Promise<Array<any>> => 1720 query( 1721 'queryHiPerfEventListData', 1722 ` 1723 select s.callchain_id, 1724 (s.timestamp_trace-t.start_ts) startNS 1725 from perf_sample s,trace_range t 1726 where 1727 event_type_id=${eventTypeId} 1728 and s.thread_id != 0 1729 and s.callchain_id != -1; 1730`, 1731 { $eventTypeId: eventTypeId } 1732 ); 1733export const queryHiPerfEventData = (eventTypeId: number, cpu: number): Promise<Array<any>> => 1734 query( 1735 'queryHiPerfEventList', 1736 ` 1737 select s.callchain_id, 1738 (s.timestamp_trace-t.start_ts) startNS 1739 from perf_sample s,trace_range t 1740 where 1741 event_type_id=${eventTypeId} 1742 and cpu_id=${cpu} 1743 and s.thread_id != 0 1744 and s.callchain_id != -1; 1745`, 1746 { $eventTypeId: eventTypeId, $cpu: cpu } 1747 ); 1748export const queryHiPerfCpuData = (cpu: number): Promise<Array<any>> => 1749 query( 1750 'queryHiPerfCpuData', 1751 ` 1752 select s.callchain_id, 1753 (s.timestamp_trace-t.start_ts) startNS 1754 from perf_sample s,trace_range t 1755 where 1756 cpu_id=${cpu} 1757 and s.thread_id != 0 1758 and s.callchain_id != -1;`, 1759 { $cpu: cpu } 1760 ); 1761export const queryHiPerfCpuMergeData = (): Promise<Array<any>> => 1762 query( 1763 'queryHiPerfCpuData', 1764 `select s.callchain_id,(s.timestamp_trace-t.start_ts) startNS from perf_sample s,trace_range t 1765where s.thread_id != 0 and s.callchain_id != -1;`, 1766 {} 1767 ); 1768export const queryHiPerfCpuMergeData2 = (): Promise<Array<any>> => 1769 query( 1770 'queryHiPerfCpuData2', 1771 `select distinct cpu_id from perf_sample where thread_id != 0 order by cpu_id desc;`, 1772 {} 1773 ); 1774 1775export const queryHiPerfProcessData = (pid: number): Promise<Array<any>> => 1776 query( 1777 'queryHiPerfProcessData', 1778 ` 1779SELECT sp.callchain_id, 1780 th.thread_name, 1781 th.thread_id tid, 1782 th.process_id pid, 1783 sp.timestamp_trace - tr.start_ts startNS 1784from perf_sample sp, 1785 trace_range tr 1786 left join perf_thread th on th.thread_id = sp.thread_id 1787where pid = ${pid} and sp.thread_id != 0 and sp.callchain_id != -1;`, 1788 { $pid: pid } 1789 ); 1790 1791export const queryHiPerfThreadData = (tid: number): Promise<Array<any>> => 1792 query( 1793 'queryHiPerfThreadData', 1794 ` 1795SELECT sp.callchain_id, 1796 th.thread_name, 1797 th.thread_id tid, 1798 th.process_id pid, 1799 sp.timestamp_trace - tr.start_ts startNS 1800from perf_sample sp, 1801 trace_range tr 1802 left join perf_thread th on th.thread_id = sp.thread_id 1803where tid = ${tid} and sp.thread_id != 0 and sp.callchain_id != -1;`, 1804 { $tid: tid } 1805 ); 1806 1807export const querySelectTraceStats = (): Promise< 1808 Array<{ 1809 event_name: string; 1810 stat_type: string; 1811 count: number; 1812 source: string; 1813 serverity: string; 1814 }> 1815> => query('querySelectTraceStats', 'select event_name,stat_type,count,source,serverity from stat'); 1816 1817export const queryCustomizeSelect = (sql: string): Promise<Array<any>> => query('queryCustomizeSelect', sql); 1818 1819export const queryDistributedTerm = (): Promise< 1820 Array<{ 1821 threadId: string; 1822 threadName: string; 1823 processId: string; 1824 processName: string; 1825 funName: string; 1826 dur: string; 1827 ts: string; 1828 chainId: string; 1829 spanId: string; 1830 parentSpanId: string; 1831 flag: string; 1832 trace_name: string; 1833 }> 1834> => 1835 query( 1836 'queryDistributedTerm', 1837 ` 1838 select 1839 group_concat(thread.id,',') as threadId, 1840 group_concat(thread.name,',') as threadName, 1841 group_concat(process.id,',') as processId, 1842 group_concat(process.name,',') as processName, 1843 group_concat(callstack.name,',') as funName, 1844 group_concat(callstack.dur,',') as dur, 1845 group_concat(callstack.ts,',') as ts, 1846 cast(callstack.chainId as varchar) as chainId, 1847 callstack.spanId as spanId, 1848 callstack.parentSpanId as parentSpanId, 1849 group_concat(callstack.flag,',') as flag, 1850 (select 1851 value 1852 from 1853 meta 1854 where 1855 name='source_name') as trace_name 1856 from 1857 callstack 1858 inner join thread on callstack.callid = thread.id 1859 inner join process on process.id = thread.ipid 1860 where (callstack.flag='S' or callstack.flag='C') 1861 group by callstack.chainId,callstack.spanId,callstack.parentSpanId` 1862 ); 1863 1864export const queryTraceCpu = (): Promise< 1865 Array<{ 1866 tid: string; 1867 pid: string; 1868 cpu: string; 1869 dur: string; 1870 min_freq: string; 1871 max_freq: string; 1872 avg_frequency: string; 1873 }> 1874> => 1875 query( 1876 'queryTraceCpu', 1877 `SELECT 1878 itid AS tid, 1879 ipid AS pid, 1880 group_concat(cpu, ',') AS cpu, 1881 group_concat(dur, ',') AS dur, 1882 group_concat(min_freq, ',') AS min_freq, 1883 group_concat(max_freq, ',') AS max_freq, 1884 group_concat(avg_frequency, ',') AS avg_frequency 1885 FROM 1886 (SELECT 1887 itid, 1888 ipid, 1889 cpu, 1890 CAST (SUM(dur) AS INT) AS dur, 1891 CAST (MIN(freq) AS INT) AS min_freq, 1892 CAST (MAX(freq) AS INT) AS max_freq, 1893 CAST ( (SUM(dur * freq) / SUM(dur) ) AS INT) AS avg_frequency 1894 from 1895 result 1896 group by 1897 itid, cpu 1898 ) 1899 GROUP BY 1900 ipid, itid 1901 ORDER BY 1902 ipid 1903 ` 1904 ); 1905 1906export const queryTraceCpuTop = (): Promise< 1907 Array<{ 1908 tid: string; 1909 pid: string; 1910 cpu: string; 1911 duration: string; 1912 min_freq: string; 1913 max_freq: string; 1914 avg_frequency: string; 1915 sumNum: string; 1916 }> 1917> => 1918 query( 1919 'queryTraceCpuTop', 1920 `SELECT 1921 itid AS tid, 1922 ipid AS pid, 1923 group_concat(cpu, ',') AS cpu, 1924 group_concat(dur, ',') AS dur, 1925 group_concat(min_freq, ',') AS min_freq, 1926 group_concat(max_freq, ',') AS max_freq, 1927 group_concat(avg_frequency, ',') AS avg_frequency, 1928 sum(dur * avg_frequency) AS sumNum 1929 FROM 1930 (SELECT 1931 itid, 1932 ipid, 1933 cpu, 1934 CAST (SUM(dur) AS INT) AS dur, 1935 CAST (MIN(freq) AS INT) AS min_freq, 1936 CAST (MAX(freq) AS INT) AS max_freq, 1937 CAST ( (SUM(dur * freq) / SUM(dur) ) AS INT) AS avg_frequency 1938 from result group by itid, cpu 1939 ) 1940 GROUP BY 1941 ipid, itid 1942 ORDER BY 1943 sumNum 1944 DESC 1945 LIMIT 10; 1946 ` 1947 ); 1948 1949export const queryTraceMemory = (): Promise< 1950 Array<{ 1951 maxNum: string; 1952 minNum: string; 1953 avgNum: string; 1954 name: string; 1955 processName: string; 1956 }> 1957> => 1958 query( 1959 'queryTraceMemory', 1960 ` 1961 select 1962 max(value) as maxNum, 1963 min(value) as minNum, 1964 avg(value) as avgNum, 1965 filter.name as name, 1966 p.name as processName 1967 from process_measure 1968 left join process_measure_filter as filter on filter.id= filter_id 1969 left join process as p on p.id = filter.ipid 1970 where 1971 filter_id > 0 1972 and 1973 filter.name = 'mem.rss.anon' 1974 group by 1975 filter_id 1976 order by 1977 avgNum desc` 1978 ); 1979 1980export const queryTraceMemoryTop = (): Promise< 1981 Array<{ 1982 maxNum: string; 1983 minNum: string; 1984 avgNum: string; 1985 name: string; 1986 processName: string; 1987 }> 1988> => 1989 query( 1990 'queryTraceMemoryTop', 1991 ` 1992 select 1993 max(value) as maxNum, 1994 min(value) as minNum, 1995 avg(value) as avgNum, 1996 f.name as name, 1997 p.name as processName 1998 from process_measure 1999 left join process_measure_filter as f on f.id= filter_id 2000 left join process as p on p.id = f.ipid 2001 where 2002 filter_id > 0 2003 and 2004 f.name = 'mem.rss.anon' 2005 group by 2006 filter_id 2007 order by 2008 avgNum desc limit 10` 2009 ); 2010 2011export const queryTraceMemoryUnAgg = (): Promise< 2012 Array<{ 2013 processName: string; 2014 name: string; 2015 value: string; 2016 ts: string; 2017 }> 2018> => 2019 query( 2020 'queryTraceMemoryUnAgg', 2021 ` 2022 select 2023 p.name as processName, 2024 group_concat(filter.name) as name, 2025 cast(group_concat(value) as varchar) as value, 2026 cast(group_concat(ts) as varchar) as ts 2027 from process_measure m 2028 left join process_measure_filter as filter on filter.id= m.filter_id 2029 left join process as p on p.id = filter.ipid 2030 where 2031 filter.name = 'mem.rss.anon' 2032 or 2033 filter.name = 'mem.rss.file' 2034 or 2035 filter.name = 'mem.swap' 2036 or 2037 filter.name = 'oom_score_adj' 2038 group by 2039 p.name,filter.ipid 2040 order by 2041 filter.ipid` 2042 ); 2043 2044export const queryTraceTaskName = (): Promise< 2045 Array<{ 2046 id: string; 2047 pid: string; 2048 process_name: string; 2049 thread_name: string; 2050 }> 2051> => 2052 query( 2053 'queryTraceTaskName', 2054 ` 2055 select 2056 P.id as id, 2057 P.pid as pid, 2058 P.name as process_name, 2059 group_concat(T.name,',') as thread_name 2060 from process as P left join thread as T where P.id = T.ipid 2061 group by pid` 2062 ); 2063 2064export const queryTraceMetaData = (): Promise< 2065 Array<{ 2066 name: string; 2067 valueText: string; 2068 }> 2069> => 2070 query( 2071 'queryTraceMetaData', 2072 ` 2073 select 2074 cast(name as varchar) as name, 2075 cast(value as varchar) as valueText 2076 from meta 2077 UNION 2078 select 'start_ts',cast(start_ts as varchar) from trace_range 2079 UNION 2080 select 'end_ts',cast(end_ts as varchar) from trace_range` 2081 ); 2082 2083export const querySystemCalls = (): Promise< 2084 Array<{ 2085 frequency: string; 2086 minDur: string; 2087 maxDur: string; 2088 avgDur: string; 2089 funName: string; 2090 }> 2091> => 2092 query( 2093 'querySystemCalls', 2094 ` 2095 select 2096 count(*) as frequency, 2097 min(dur) as minDur, 2098 max(dur) as maxDur, 2099 avg(dur) as avgDur, 2100 name as funName 2101 from 2102 callstack 2103 group by name 2104 order by 2105 frequency desc limit 100` 2106 ); 2107 2108export const querySystemCallsTop = (): Promise< 2109 Array<{ 2110 tid: string; 2111 pid: string; 2112 funName: string; 2113 frequency: string; 2114 minDur: string; 2115 maxDur: string; 2116 avgDur: string; 2117 }> 2118> => 2119 query( 2120 'querySystemCallsTop', 2121 `SELECT 2122 cpu.tid AS tid, 2123 cpu.pid AS pid, 2124 callstack.name AS funName, 2125 count(callstack.name) AS frequency, 2126 min(callstack.dur) AS minDur, 2127 max(callstack.dur) AS maxDur, 2128 round(avg(callstack.dur)) AS avgDur 2129 FROM 2130 callstack 2131 INNER JOIN 2132 (SELECT 2133 itid AS tid, 2134 ipid AS pid, 2135 group_concat(cpu, ',') AS cpu, 2136 group_concat(dur, ',') AS dur, 2137 group_concat(min_freq, ',') AS min_freq, 2138 group_concat(max_freq, ',') AS max_freq, 2139 group_concat(avg_frequency, ',') AS avg_frequency, 2140 sum(dur * avg_frequency) AS sumNum 2141 FROM 2142 (SELECT 2143 itid, 2144 ipid, 2145 cpu, 2146 CAST (SUM(dur) AS INT) AS dur, 2147 CAST (MIN(freq) AS INT) AS min_freq, 2148 CAST (MAX(freq) AS INT) AS max_freq, 2149 CAST ( (SUM(dur * freq) / SUM(dur) ) AS INT) AS avg_frequency 2150 FROM 2151 result 2152 GROUP BY 2153 itid, cpu 2154 ) 2155 GROUP BY 2156 ipid, itid 2157 ORDER BY 2158 sumNum 2159 DESC 2160 LIMIT 10 2161 ) AS cpu 2162 ON 2163 callstack.callid = cpu.tid 2164 GROUP BY 2165 callstack.name 2166 ORDER BY 2167 frequency 2168 DESC 2169 LIMIT 10` 2170 ); 2171 2172export const getTabLiveProcessData = (leftNs: number, rightNs: number): Promise<Array<LiveProcess>> => 2173 query<LiveProcess>( 2174 'getTabLiveProcessData', 2175 `SELECT 2176 process.id as processId, 2177 process.name as processName, 2178 process.ppid as responsibleProcess, 2179 process.uud as userName, 2180 process.usag as cpu, 2181 process.threadN as threads, 2182 process.pss as memory, 2183 process.cpu_time as cpuTime, 2184 process.disk_reads as diskReads, 2185 process.disk_writes as diskWrite 2186 FROM 2187 ( 2188 SELECT 2189 tt.process_id AS id, 2190 tt.process_name AS name, 2191 tt.parent_process_id AS ppid, 2192 tt.uid as uud, 2193 tt.cpu_usage as usag, 2194 tt.thread_num AS threadN, 2195 mt.maxTT - TR.start_ts as endTs, 2196 tt.pss_info as pss, 2197 tt.cpu_time, 2198 tt.disk_reads, 2199 tt.disk_writes 2200 FROM 2201 live_process tt 2202 LEFT JOIN trace_range AS TR 2203 LEFT JOIN (select re.process_id as idd, max(re.ts) as maxTT, min(re.ts) as minTT 2204 from live_process re GROUP BY re.process_name, re.process_id ) mt 2205 on mt.idd = tt.process_id where endTs >= $rightNS 2206 GROUP BY 2207 tt.process_name, 2208 tt.process_id 2209 ) process ;`, 2210 { $leftNS: leftNs, $rightNS: rightNs } 2211 ); 2212 2213export const getTabProcessHistoryData = ( 2214 leftNs: number, 2215 rightNs: number, 2216 processId: number | undefined, 2217 threadId: number | undefined 2218): Promise<Array<ProcessHistory>> => 2219 query<ProcessHistory>( 2220 'getTabProcessHistoryData', 2221 `SELECT 2222 process.id as processId, 2223 process.isD as alive, 2224 process.startTS as firstSeen, 2225 process.endTs as lastSeen, 2226 process.name as processName, 2227 process.ppid as responsibleProcess, 2228 process.uuid as userName, 2229 process.cpu_time as cpuTime, 2230 0 as pss 2231 FROM 2232 ( 2233 SELECT 2234 tt.process_id AS id, 2235 tt.process_name AS name, 2236 tt.parent_process_id AS ppid, 2237 tt.uid AS uuid, 2238 tt.cpu_time, 2239 (mt.minTT - TR.start_ts ) AS startTS, 2240 mt.maxTT - TR.start_ts as endTs, 2241 (mt.maxTT - TR.start_ts - $rightNS) > 0 as isD 2242 FROM 2243 live_process tt 2244 LEFT JOIN trace_range AS TR 2245 LEFT JOIN (select re.process_id as idd, max(re.ts) as maxTT, min(re.ts) as minTT 2246 from live_process re GROUP BY re.process_name, re.process_id ) mt 2247 on mt.idd = tt.process_id 2248 GROUP BY 2249 tt.process_name, 2250 tt.process_id 2251 ) process;`, 2252 { 2253 $leftNS: leftNs, 2254 $rightNS: rightNs, 2255 $processID: processId, 2256 $threadID: threadId, 2257 } 2258 ); 2259 2260export const getTabCpuAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemCpuSummary>> => 2261 query<SystemCpuSummary>( 2262 'getTabCpuAbilityData', 2263 `SELECT 2264 ( n.ts - TR.start_ts ) AS startTime, 2265 n.dur AS duration, 2266 n.total_load AS totalLoad, 2267 n.user_load AS userLoad, 2268 n.system_load AS systemLoad, 2269 n.process_num AS threads 2270 FROM 2271 cpu_usage AS n, 2272 trace_range AS TR 2273 WHERE 2274 ( n.ts - TR.start_ts ) >= ifnull(( 2275 SELECT 2276 ( usage.ts - TR.start_ts ) 2277 FROM 2278 cpu_usage usage, 2279 trace_range TR 2280 WHERE 2281 ( usage.ts - TR.start_ts ) <= $leftNS 2282 ORDER BY 2283 usage.ts DESC 2284 LIMIT 1 2285 ),0) 2286 AND ( n.ts - TR.start_ts ) <= $rightNS 2287 ORDER BY 2288 startTime ASC; 2289 `, 2290 { $leftNS: leftNs, $rightNS: rightNs } 2291 ); 2292 2293export const getTabMemoryAbilityData = ( 2294 leftNs: number, 2295 rightNs: number 2296): Promise< 2297 Array<{ 2298 startTime: number; 2299 value: string; 2300 name: string; 2301 }> 2302> => 2303 query( 2304 'getTabMemoryAbilityData', 2305 `SELECT 2306 m.ts AS startTime, 2307 GROUP_CONCAT( IFNULL( m.value, 0 ) ) AS value, 2308 GROUP_CONCAT( f.name ) AS name 2309 FROM 2310 sys_mem_measure AS m 2311 INNER JOIN sys_event_filter AS f ON m.filter_id = f.id 2312 AND (f.name = 'sys.mem.total' 2313 or f.name = 'sys.mem.free' 2314 or f.name = 'sys.mem.buffers' 2315 or f.name = 'sys.mem.cached' 2316 or f.name = 'sys.mem.shmem' 2317 or f.name = 'sys.mem.slab' 2318 or f.name = 'sys.mem.swap.total' 2319 or f.name = 'sys.mem.swap.free' 2320 or f.name = 'sys.mem.mapped' 2321 or f.name = 'sys.mem.vmalloc.used' 2322 or f.name = 'sys.mem.page.tables' 2323 or f.name = 'sys.mem.kernel.stack' 2324 or f.name = 'sys.mem.active' 2325 or f.name = 'sys.mem.inactive' 2326 or f.name = 'sys.mem.unevictable' 2327 or f.name = 'sys.mem.vmalloc.total' 2328 or f.name = 'sys.mem.slab.unreclaimable' 2329 or f.name = 'sys.mem.cma.total' 2330 or f.name = 'sys.mem.cma.free' 2331 or f.name = 'sys.mem.kernel.reclaimable' 2332 or f.name = 'sys.mem.zram' 2333 ) 2334 AND m.ts >= ifnull(( 2335 SELECT 2336 m.ts AS startTime 2337 FROM 2338 sys_mem_measure AS m 2339 INNER JOIN sys_event_filter AS f ON m.filter_id = f.id 2340 AND m.ts <= $leftNS 2341 AND (f.name = 'sys.mem.total' 2342 or f.name = 'sys.mem.free' 2343 or f.name = 'sys.mem.buffers' 2344 or f.name = 'sys.mem.cached' 2345 or f.name = 'sys.mem.shmem' 2346 or f.name = 'sys.mem.slab' 2347 or f.name = 'sys.mem.swap.total' 2348 or f.name = 'sys.mem.swap.free' 2349 or f.name = 'sys.mem.mapped' 2350 or f.name = 'sys.mem.vmalloc.used' 2351 or f.name = 'sys.mem.page.tables' 2352 or f.name = 'sys.mem.kernel.stack' 2353 or f.name = 'sys.mem.active' 2354 or f.name = 'sys.mem.inactive' 2355 or f.name = 'sys.mem.unevictable' 2356 or f.name = 'sys.mem.vmalloc.total' 2357 or f.name = 'sys.mem.slab.unreclaimable' 2358 or f.name = 'sys.mem.cma.total' 2359 or f.name = 'sys.mem.cma.free' 2360 or f.name = 'sys.mem.kernel.reclaimable' 2361 or f.name = 'sys.mem.zram' 2362 ) 2363 ORDER BY 2364 m.ts DESC 2365 LIMIT 1 2366 ),0) 2367 AND m.ts <= $rightNS GROUP BY m.ts;`, 2368 { $leftNS: leftNs, $rightNS: rightNs } 2369 ); 2370 2371export const getTabNetworkAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemNetworkSummary>> => 2372 query<SystemNetworkSummary>( 2373 'getTabNetworkAbilityData', 2374 `SELECT 2375 ( n.ts - TR.start_ts ) AS startTime, 2376 n.dur AS duration, 2377 n.rx AS dataReceived, 2378 n.tx_speed AS dataReceivedSec, 2379 n.tx AS dataSend, 2380 n.rx_speed AS dataSendSec, 2381 n.packet_in AS packetsIn, 2382 n.packet_in_sec AS packetsInSec, 2383 n.packet_out AS packetsOut, 2384 n.packet_out_sec AS packetsOutSec 2385 FROM 2386 network AS n, 2387 trace_range AS TR 2388 WHERE 2389 ( n.ts - TR.start_ts ) >= ifnull(( 2390 SELECT 2391 ( nn.ts - T.start_ts ) AS startTime 2392 FROM 2393 network nn, 2394 trace_range T 2395 WHERE 2396 ( nn.ts - T.start_ts ) <= $leftNS 2397 ORDER BY 2398 nn.ts DESC 2399 LIMIT 1 2400 ),0) 2401 AND ( n.ts - TR.start_ts ) <= $rightNS 2402 ORDER BY 2403 startTime ASC`, 2404 { $leftNS: leftNs, $rightNS: rightNs } 2405 ); 2406 2407export const getTabDiskAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemDiskIOSummary>> => 2408 query<SystemDiskIOSummary>( 2409 'getTabDiskAbilityData', 2410 `SELECT 2411 ( n.ts - TR.start_ts ) AS startTime, 2412 n.dur AS duration, 2413 n.rd AS dataRead, 2414 n.rd_speed AS dataReadSec, 2415 n.wr AS dataWrite, 2416 n.wr_speed AS dataWriteSec, 2417 n.rd_count AS readsIn, 2418 n.rd_count_speed AS readsInSec, 2419 n.wr_count AS writeOut, 2420 n.wr_count_speed AS writeOutSec 2421 FROM 2422 diskio AS n, 2423 trace_range AS TR 2424 WHERE 2425 ( n.ts - TR.start_ts ) >= ifnull(( 2426 SELECT 2427 ( nn.ts - T.start_ts ) AS startTime 2428 FROM 2429 diskio AS nn, 2430 trace_range AS T 2431 WHERE 2432 ( nn.ts - T.start_ts ) <= $leftNS 2433 ORDER BY 2434 nn.ts DESC 2435 LIMIT 1 2436 ),0) 2437 AND ( n.ts - TR.start_ts ) <= $rightNS 2438 ORDER BY 2439 startTime ASC; 2440 `, 2441 { $leftNS: leftNs, $rightNS: rightNs } 2442 ); 2443 2444export const queryCpuAbilityData = (): Promise<Array<CpuAbilityMonitorStruct>> => 2445 query( 2446 'queryCpuAbilityData', 2447 `select 2448 (t.total_load) as value, 2449 (t.ts - TR.start_ts) as startNS 2450 from cpu_usage t, trace_range AS TR;` 2451 ); 2452 2453export const queryCpuAbilityUserData = (): Promise<Array<CpuAbilityMonitorStruct>> => 2454 query( 2455 'queryCpuAbilityUserData', 2456 `select 2457 t.user_load as value, 2458 (t.ts - TR.start_ts) as startNS 2459 from cpu_usage t, trace_range AS TR;` 2460 ); 2461 2462export const queryCpuAbilitySystemData = (): Promise<Array<CpuAbilityMonitorStruct>> => 2463 query( 2464 'queryCpuAbilitySystemData', 2465 `select 2466 t.system_load as value, 2467 (t.ts - TR.start_ts) as startNS 2468 from cpu_usage t, trace_range AS TR;` 2469 ); 2470 2471export const queryMemoryUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> => 2472 query( 2473 'queryMemoryUsedAbilityData', 2474 `select 2475 t.value as value, 2476 (t.ts - TR.start_ts) as startNS 2477 from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, 2478 { $id: id } 2479 ); 2480 2481export const queryCachedFilesAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> => 2482 query( 2483 'queryCachedFilesAbilityData', 2484 `select 2485 t.value as value, 2486 (t.ts - TR.start_ts) as startNS 2487 from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, 2488 { $id: id } 2489 ); 2490 2491export const queryCompressedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> => 2492 query( 2493 'queryCompressedAbilityData', 2494 `select 2495 t.value as value, 2496 (t.ts - TR.start_ts) as startNS 2497 from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, 2498 { $id: id } 2499 ); 2500 2501export const querySwapUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> => 2502 query( 2503 'querySwapUsedAbilityData', 2504 `select 2505 t.value as value, 2506 (t.ts - TR.start_ts) as startNS 2507 from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, 2508 { $id: id } 2509 ); 2510 2511export const queryBytesReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 2512 query( 2513 'queryBytesReadAbilityData', 2514 `select 2515 t.rd_speed as value, 2516 (t.ts - TR.start_ts) as startNS 2517 from diskio t, trace_range AS TR;` 2518 ); 2519 2520export const queryBytesWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 2521 query( 2522 'queryBytesWrittenAbilityData', 2523 `select 2524 t.wr_speed as value, 2525 (t.ts - TR.start_ts) as startNS 2526 from diskio t, trace_range AS TR;` 2527 ); 2528 2529export const queryReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 2530 query( 2531 'queryReadAbilityData', 2532 `select 2533 t.rd_count_speed as value, 2534 (t.ts - TR.start_ts) as startNS 2535 from diskio t, trace_range AS TR;` 2536 ); 2537 2538export const queryWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 2539 query( 2540 'queryWrittenAbilityData', 2541 `select 2542 t.wr_count_speed as value, 2543 (t.ts - TR.start_ts) as startNS 2544 from diskio t, trace_range AS TR;` 2545 ); 2546 2547export const queryBytesInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 2548 query( 2549 'queryBytesInAbilityData', 2550 `select 2551 t.tx_speed as value, 2552 (t.ts - TR.start_ts) as startNS 2553 from network t, trace_range AS TR;` 2554 ); 2555 2556export const queryBytesOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 2557 query( 2558 'queryBytesOutAbilityData', 2559 `select 2560 t.rx_speed as value, 2561 (t.ts - TR.start_ts) as startNS 2562 from network t, trace_range AS TR;` 2563 ); 2564 2565export const queryPacketsInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 2566 query( 2567 'queryPacketsInAbilityData', 2568 `select 2569 t.packet_in_sec as value, 2570 (t.ts - TR.start_ts) as startNS 2571 from network t, trace_range AS TR;` 2572 ); 2573 2574export const queryPacketsOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 2575 query( 2576 'queryPacketsOutAbilityData', 2577 `select 2578 t.packet_out_sec as value, 2579 (t.ts - TR.start_ts) as startNS 2580 from network t, trace_range AS TR;` 2581 ); 2582 2583export const queryNetWorkMaxData = (): Promise<Array<any>> => 2584 query( 2585 'queryNetWorkMaxData', 2586 `select 2587 ifnull(max(tx_speed),0) as maxIn, 2588 ifnull(max(rx_speed),0) as maxOut, 2589 ifnull(max(packet_in_sec),0) as maxPacketIn, 2590 ifnull(max(packet_in_sec),0) as maxPacketOut 2591 from network` 2592 ); 2593 2594export const queryMemoryMaxData = (memoryName: string): Promise<Array<any>> => 2595 query( 2596 'queryMemoryMaxData', 2597 `SELECT ifnull(max(m.value),0) as maxValue, 2598 filter_id 2599 from sys_mem_measure m 2600 WHERE m.filter_id = 2601 (SELECT id FROM sys_event_filter WHERE name = $memoryName) 2602`, 2603 { $memoryName: memoryName } 2604 ); 2605 2606export const queryDiskIoMaxData = (): Promise<Array<any>> => 2607 query( 2608 'queryDiskIoMaxData', 2609 `select 2610 ifnull(max(rd_speed),0) as bytesRead, 2611 ifnull(max(wr_speed),0) as bytesWrite, 2612 ifnull(max(rd_count_speed),0) as readOps, 2613 ifnull(max(wr_count_speed),0) as writeOps 2614 from diskio` 2615 ); 2616 2617export const queryAbilityExits = (): Promise<Array<any>> => 2618 query( 2619 'queryAbilityExits', 2620 `select 2621 event_name 2622 from stat s 2623 where s.event_name in ('trace_diskio','trace_network', 'trace_cpu_usage','sys_memory') 2624 and s.stat_type ='received' and s.count > 0` 2625 ); 2626 2627export const queryStartTime = (): Promise<Array<any>> => query('queryStartTime', `SELECT start_ts FROM trace_range`); 2628 2629export const queryPerfFiles = (): Promise<Array<PerfFile>> => 2630 query('queryPerfFiles', `select file_id as fileId,symbol,path from perf_files`, {}); 2631 2632export const queryPerfProcess = (): Promise<Array<PerfThread>> => 2633 query( 2634 'queryPerfThread', 2635 `select process_id as pid,thread_name as processName from perf_thread where process_id = thread_id`, 2636 {} 2637 ); 2638 2639export const queryPerfThread = (): Promise<Array<PerfThread>> => 2640 query( 2641 'queryPerfThread', 2642 `select a.thread_id as tid,a.thread_name as threadName,a.process_id as pid,b.thread_name as processName from perf_thread a left join (select * from perf_thread where thread_id = process_id) b on a.process_id = b.thread_id`, 2643 {} 2644 ); 2645 2646export const queryPerfSampleListByTimeRange = ( 2647 leftNs: number, 2648 rightNs: number, 2649 cpus: Array<number>, 2650 processes: Array<number>, 2651 threads: Array<number> 2652): Promise<Array<PerfSample>> => { 2653 let sql = ` 2654select A.callchain_id as sampleId, 2655 A.thread_id as tid, 2656 C.thread_name as threadName, 2657 A.thread_state as state, 2658 C.process_id as pid, 2659 (timestamp_trace - R.start_ts) as time, 2660 cpu_id as core 2661from perf_sample A,trace_range R 2662left join perf_thread C on A.thread_id = C.thread_id 2663where time >= $leftNs and time <= $rightNs and A.thread_id != 0 2664 `; 2665 if (cpus.length != 0 || processes.length != 0 || threads.length != 0) { 2666 let arg1 = cpus.length > 0 ? `or core in (${cpus.join(',')}) ` : ''; 2667 let arg2 = processes.length > 0 ? `or pid in (${processes.join(',')}) ` : ''; 2668 let arg3 = threads.length > 0 ? `or tid in (${threads.join(',')})` : ''; 2669 let arg = `${arg1}${arg2}${arg3}`.substring(3); 2670 sql = `${sql} and (${arg})`; 2671 } 2672 return query('queryPerfSampleListByTimeRange', sql, { 2673 $leftNs: leftNs, 2674 $rightNs: rightNs, 2675 }); 2676}; 2677 2678export const queryPerfSampleIdsByTimeRange = ( 2679 leftNs: number, 2680 rightNs: number, 2681 cpus: Array<number>, 2682 processes: Array<number>, 2683 threads: Array<number> 2684): Promise<Array<PerfSample>> => { 2685 let sql = ` 2686select A.callchain_id as sampleId 2687from perf_sample A,trace_range R 2688left join perf_thread C on A.thread_id = C.thread_id 2689where (timestamp_trace - R.start_ts) >= $leftNs and (timestamp_trace - R.start_ts) <= $rightNs and A.thread_id != 0 2690 `; 2691 if (cpus.length != 0 || processes.length != 0 || threads.length != 0) { 2692 let arg1 = cpus.length > 0 ? `or A.cpu_id in (${cpus.join(',')}) ` : ''; 2693 let arg2 = processes.length > 0 ? `or C.process_id in (${processes.join(',')}) ` : ''; 2694 let arg3 = threads.length > 0 ? `or A.thread_id in (${threads.join(',')})` : ''; 2695 let arg = `${arg1}${arg2}${arg3}`.substring(3); 2696 sql = `${sql} and (${arg})`; 2697 } 2698 return query('queryPerfSampleIdsByTimeRange', sql, { 2699 $leftNs: leftNs, 2700 $rightNs: rightNs, 2701 }); 2702}; 2703 2704export const queryPerfSampleCallChain = (sampleId: number): Promise<Array<PerfStack>> => 2705 query( 2706 'queryPerfSampleCallChain', 2707 ` 2708 select 2709 callchain_id as callChainId, 2710 callchain_id as sampleId, 2711 file_id as fileId, 2712 symbol_id as symbolId, 2713 vaddr_in_file as vaddrInFile, 2714 name as symbol 2715from perf_callchain where callchain_id = $sampleId and symbol_id != -1 and vaddr_in_file != 0; 2716 `, 2717 { $sampleId: sampleId } 2718 ); 2719 2720export const queryPerfCmdline = (): Promise<Array<PerfCmdLine>> => 2721 query( 2722 'queryPerfCmdline', 2723 ` 2724 select report_value from perf_report where report_type = 'cmdline' 2725 `, 2726 {} 2727 ); 2728 2729export const queryCPuAbilityMaxData = (): Promise<Array<any>> => 2730 query( 2731 'queryCPuAbilityMaxData', 2732 `select ifnull(max(total_load),0) as totalLoad, 2733 ifnull(max(user_load),0) as userLoad, 2734 ifnull(max(system_load),0) as systemLoad 2735 from cpu_usage` 2736 ); 2737 2738export const querySearchFunc = (search: string): Promise<Array<SearchFuncBean>> => 2739 query( 2740 'querySearchFunc', 2741 ` 2742 select c.cookie,c.id,c.name as funName,c.ts - r.start_ts as startTime,c.dur,c.depth,t.tid,t.name as threadName 2743 ,p.pid ,'func' as type from callstack c left join thread t on c.callid = t.id left join process p on t.ipid = p.id 2744 left join trace_range r 2745 where c.name like '%${search}%' and startTime > 0; 2746 `, 2747 { $search: search } 2748 ); 2749 2750export const querySceneSearchFunc = (search: string, processList: Array<string>): Promise<Array<SearchFuncBean>> => 2751 query( 2752 'querySearchFunc', 2753 ` 2754 select c.cookie,c.id,c.name as funName,c.ts - r.start_ts as startTime,c.dur,c.depth,t.tid,t.name as threadName 2755 ,p.pid ,'func' as type from callstack c left join thread t on c.callid = t.id left join process p on t.ipid = p.id 2756 left join trace_range r 2757 where c.name like '%${search}%' and startTime > 0 and p.pid in (${processList.join(',')}); 2758 `, 2759 { $search: search } 2760 ); 2761 2762export const queryBinderBySliceId = (id: number): Promise<Array<any>> => 2763 query( 2764 'queryBinderBySliceId', 2765 `select c.ts-D.start_ts as startTime, 2766 c.dur, 2767 t.tid,p.pid,c.depth 2768 from callstack c,trace_range D 2769 left join thread t on c.callid = t.id 2770 left join process p on p.id = t.ipid 2771where cat = 'binder' and c.id = $id;`, 2772 { $id: id } 2773 ); 2774 2775export const queryThreadByItid = (itid: number, ts: number): Promise<Array<any>> => 2776 query( 2777 'queryThreadByItid', 2778 `select tid,pid,c.dur,c.depth,c.name 2779from thread t left join process p on t.ipid = p.ipid 2780left join callstack c on t.itid = c.callid 2781where itid = $itid and c.ts = $ts;`, 2782 { $itid: itid, $ts: ts } 2783 ); 2784 2785export const queryBinderByArgsId = (id: number, startTime: number, isNext: boolean): Promise<Array<any>> => { 2786 let sql = `select c.ts - D.start_ts as startTime, 2787 c.dur, 2788 t.tid,p.pid,c.depth 2789 from callstack c,trace_range D 2790 left join thread t on c.callid = t.id 2791 left join process p on p.id = t.ipid 2792where cat = 'binder' and c.argsetid = $id`; 2793 if (isNext) { 2794 sql += ' and c.ts > $startTime + D.start_ts'; 2795 } else { 2796 sql += ' and c.ts < $startTime + D.start_ts'; 2797 } 2798 return query('queryBinderByArgsId', sql, { 2799 $id: id, 2800 $startTime: startTime, 2801 }); 2802}; 2803 2804export const getTabPaneFilesystemStatisticsFather = (leftNs: number, rightNs: number): Promise<Array<any>> => 2805 query( 2806 'getTabPaneFilesystemStatisticsFather', 2807 ` 2808 select SUM(dur) as allDuration, 2809 count(f.type) as count, 2810 min(dur) as minDuration, 2811 max(dur) as maxDuration, 2812 round(avg(dur),2) as avgDuration, 2813 p.name, 2814 f.type, 2815 p.pid, 2816 sum(ifnull(size,0)) as size 2817 from file_system_sample as f 2818 left join process as p on f.ipid=p.ipid 2819 where f.start_ts >= $leftNs 2820 and end_ts <= $rightNs 2821 group by f.type; 2822 `, 2823 { $leftNs: leftNs, $rightNs: rightNs } 2824 ); 2825 2826export const getTabPaneFilesystemStatisticsChild = (leftNs: number, rightNs: number): Promise<Array<any>> => 2827 query( 2828 'getTabPaneFilesystemStatisticsChild', 2829 ` 2830 select SUM(dur) as allDuration, 2831 count(f.type) as count, 2832 min(dur) as minDuration, 2833 max(dur) as maxDuration, 2834 round(avg(dur),2) as avgDuration, 2835 p.name, 2836 f.type, 2837 p.pid, 2838 sum(ifnull(size,0)) as size 2839 from file_system_sample as f left join process as p on f.ipid=p.ipid 2840 where f.start_ts >= $leftNs 2841 and end_ts <= $rightNs 2842 group by f.type, f.ipid; 2843`, 2844 { $leftNs: leftNs, $rightNs: rightNs } 2845 ); 2846 2847export const getTabPaneFilesystemStatisticsAll = (leftNs: number, rightNs: number): Promise<Array<any>> => 2848 query( 2849 'getTabPaneFilesystemStatisticsAll', 2850 ` 2851 select SUM(dur) as allDuration, 2852 count(type) as count, 2853 min(dur) as minDuration, 2854 max(dur) as maxDuration, 2855 round(avg(dur),2) as avgDuration, 2856 type 2857 from file_system_sample 2858 where start_ts >= $leftNs 2859 and end_ts <= $rightNs; 2860`, 2861 { $leftNs: leftNs, $rightNs: rightNs } 2862 ); 2863 2864export const getTabPaneFilesystemStatistics = (leftNs: number, rightNs: number, types: number[]): Promise<Array<any>> => 2865 query( 2866 'getTabPaneFilesystemStatistics', 2867 ` 2868 select p.pid, 2869 ifnull(p.name,'Process') as name, 2870 f.type, 2871 count(f.ipid) as count, 2872 sum(ifnull(size,0)) as size, 2873 sum(case when f.type = 2 then ifnull(size,0) else 0 end) as logicalReads, 2874 sum(case when f.type = 3 then ifnull(size,0) else 0 end) as logicalWrites, 2875 sum(case when f.type != 2 and f.type != 3 then ifnull(size,0) else 0 end) as otherFile, 2876 sum(dur) as allDuration, 2877 min(dur) as minDuration, 2878 max(dur) as maxDuration, 2879 avg(dur) as avgDuration 2880 from file_system_sample as f left join process as p on f.ipid=p.ipid 2881 where end_ts >= $leftNs 2882 and end_ts <= $rightNs 2883 and f.type in (${types.join(',')}) 2884 group by f.type,f.ipid 2885 order by f.type; 2886`, 2887 { $leftNs: leftNs, $rightNs: rightNs } 2888 ); 2889 2890export const getTabPaneVirtualMemoryStatisticsData = (leftNs: number, rightNs: number): Promise<Array<any>> => 2891 query( 2892 'getTabPaneVirtualMemoryStatisticsData', 2893 ` 2894 select p.pid, 2895 t.tid, 2896 ifnull(p.name,'Process') as pname, 2897 ifnull(t.name,'Thread') as tname, 2898 f.type, 2899 f.ipid, 2900 f.itid, 2901 count(f.ipid) as count, 2902 sum(dur) as allDuration, 2903 min(dur) as minDuration, 2904 max(dur) as maxDuration, 2905 avg(dur) as avgDuration 2906 from paged_memory_sample as f left join process as p on f.ipid=p.ipid left join thread as t on f.itid=t.itid 2907 where f.end_ts >= $leftNs 2908 and f.end_ts <= $rightNs 2909 group by f.type,f.ipid,f.itid 2910 order by f.type; 2911`, 2912 { $leftNs: leftNs, $rightNs: rightNs } 2913 ); 2914 2915export const getTabPaneIOTierStatisticsData = ( 2916 leftNs: number, 2917 rightNs: number, 2918 diskIOipids: Array<number> 2919): Promise<Array<any>> => { 2920 let str = ''; 2921 if (diskIOipids.length > 0) { 2922 str = ` and i.ipid in (${diskIOipids.join(',')})`; 2923 } 2924 return query( 2925 'getTabPaneIOTierStatisticsData', 2926 ` 2927 select p.pid, 2928 ifnull(p.name,'Process') as pname, 2929 i.tier, 2930 i.ipid, 2931 path_id as path, 2932 count(i.ipid) as count, 2933 sum(latency_dur) as allDuration, 2934 min(latency_dur) as minDuration, 2935 max(latency_dur) as maxDuration, 2936 avg(latency_dur) as avgDuration 2937 from bio_latency_sample as i left join process as p on i.ipid=p.ipid 2938 where i.start_ts+latency_dur >= $leftNs 2939 and i.start_ts+latency_dur <= $rightNs 2940 ${str} 2941 group by i.tier,i.ipid,i.path_id 2942 order by i.tier; 2943`, 2944 { $leftNs: leftNs, $rightNs: rightNs } 2945 ); 2946}; 2947 2948export const getTabPaneCounterSampleData = ( 2949 leftNs: number, 2950 rightNs: number, 2951 cpuStateFilterIds: Array<number> 2952): Promise<Array<any>> => { 2953 let str = ''; 2954 if (cpuStateFilterIds.length > 0) { 2955 str = ` and filter_id in (${cpuStateFilterIds.join(',')})`; 2956 } 2957 return query( 2958 'getTabPaneCounterSampleData', 2959 ` 2960 select value, filter_id as filterId, ts, f.cpu 2961 from measure left join cpu_measure_filter as f on f.id=filter_id 2962 where 2963 ts <= $rightNs${str} order by ts asc; 2964`, 2965 { $leftNs: leftNs, $rightNs: rightNs } 2966 ); 2967}; 2968 2969export const getTabPaneFrequencySampleData = ( 2970 leftNs: number, 2971 rightNs: number, 2972 cpuFreqFilterIds: Array<number> 2973): Promise<Array<any>> => { 2974 let str = ''; 2975 if (cpuFreqFilterIds.length > 0) { 2976 str = ` and filter_id in (${cpuFreqFilterIds.join(',')})`; 2977 } 2978 return query( 2979 'getTabPaneFrequencySampleData', 2980 ` 2981 select value, filter_id as filterId, ts, f.cpu 2982 from measure left join cpu_measure_filter as f on f.id=filter_id 2983 where 2984 ts <= $rightNs${str} order by ts asc; 2985`, 2986 { $leftNs: leftNs, $rightNs: rightNs } 2987 ); 2988}; 2989 2990export const hasFileSysData = (): Promise<Array<any>> => 2991 query( 2992 'hasFileSysData', 2993 ` 2994 select 2995 fsCount, 2996 vmCount, 2997 ioCount from 2998 (select count(1) as fsCount from file_system_sample s,trace_range t where (s.start_ts between t.start_ts and t.end_ts) or (s.end_ts between t.start_ts and t.end_ts) ) 2999 ,(select count(1) as vmCount from paged_memory_sample s,trace_range t where (s.start_ts between t.start_ts and t.end_ts) or (s.end_ts between t.start_ts and t.end_ts) ) 3000 ,(select count(1) as ioCount from bio_latency_sample s,trace_range t where (s.start_ts between t.start_ts and t.end_ts) or (s.end_ts between t.start_ts and t.end_ts) ); 3001 `, 3002 {} 3003 ); 3004 3005export const getFileSysChartDataByType = (type: number): Promise<Array<any>> => 3006 query( 3007 'getFileSysChartData', 3008 ` 3009 select 3010 (A.start_ts -B.start_ts) as startNS, 3011 (A.end_ts - B.start_ts) as endNS, 3012 dur 3013 from file_system_sample A,trace_range B 3014 where type = $type and startNS > 0;`, 3015 { $type: type }, 3016 'exec' 3017 ); 3018 3019export const getFileSysVirtualMemoryChartData = (): Promise<Array<any>> => 3020 query( 3021 'getFileSysVirtualMemoryChartData', 3022 ` 3023 select 3024 (A.start_ts -B.start_ts) as startNS, 3025 (A.end_ts - B.start_ts) as endNS, 3026 dur as dur 3027 from paged_memory_sample A,trace_range B 3028 where startNS > 0 3029 order by A.start_ts;`, 3030 {}, 3031 'exec' 3032 ); 3033 3034export const getDiskIOProcess = (): Promise<Array<any>> => 3035 query( 3036 'getDiskIOProcess', 3037 ` 3038 select name,B.ipid,pid 3039 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 3040 left join process B on A.ipid = B.ipid;`, 3041 {} 3042 ); 3043 3044export const getDiskIOLatencyChartDataByProcess = ( 3045 all: boolean, 3046 ipid: number, 3047 typeArr: Array<number> 3048): Promise<Array<any>> => 3049 query( 3050 'getDiskIOLatencyChartDataByProcess', 3051 ` 3052 select 3053 (A.start_ts -B.start_ts) as startNS, 3054 (A.start_ts - B.start_ts + A.latency_dur) as endNS, 3055 latency_dur as dur 3056 from bio_latency_sample A,trace_range B 3057 where type in (${typeArr.join(',')}) and startNS > 0 3058 ${all ? '' : 'and ipid = ' + ipid} 3059 order by A.start_ts;`, 3060 {}, 3061 'exec' 3062 ); 3063 3064export const querySdkCount = (sql: string, componentId: number, args?: any): Promise<Array<any>> => 3065 query('querySdkCount', sql, args, 'exec-sdk-' + componentId); 3066 3067export const querySdkCounterData = ( 3068 sql: string, 3069 counter_id: number, 3070 componentId: number 3071): Promise<Array<CounterStruct>> => 3072 query('querySdkCounterData', sql, { $counter_id: counter_id }, 'exec-sdk-' + componentId); 3073 3074export const getTabSdkCounterData = ( 3075 sqlStr: string, 3076 startTime: number, 3077 leftNs: number, 3078 rightNs: number, 3079 counters: Array<string>, 3080 componentId: number 3081): Promise<Array<CounterSummary>> => 3082 query<CounterSummary>( 3083 'getTabSdkCounterData', 3084 sqlStr, 3085 { 3086 $startTime: startTime, 3087 $leftNs: leftNs, 3088 $rightNs: rightNs, 3089 $counters: counters, 3090 }, 3091 'exec-sdk-' + componentId 3092 ); 3093 3094export const getTabSdkCounterLeftData = ( 3095 sqlStr: string, 3096 leftNs: number, 3097 counters: Array<string>, 3098 componentId: number 3099): Promise<Array<any>> => 3100 query<any>( 3101 'getTabSdkCounterLeftData', 3102 sqlStr, 3103 { 3104 $leftNs: leftNs, 3105 $counters: counters, 3106 }, 3107 'exec-sdk-' + componentId 3108 ); 3109 3110export const getTabSdkSliceData = ( 3111 sqlStr: string, 3112 startTime: number, 3113 leftNs: number, 3114 rightNs: number, 3115 slices: Array<string>, 3116 componentId: number 3117): Promise<Array<SdkSliceSummary>> => 3118 query<SdkSliceSummary>( 3119 'getTabSdkSliceData', 3120 sqlStr, 3121 { 3122 $startTime: startTime, 3123 $leftNs: leftNs, 3124 $rightNs: rightNs, 3125 $slices: slices, 3126 }, 3127 'exec-sdk-' + componentId 3128 ); 3129 3130export const querySdkSliceData = ( 3131 sqlStr: string, 3132 column_id: number, 3133 startNS: number, 3134 endNS: number, 3135 componentId: number 3136): Promise<Array<SdkSliceStruct>> => 3137 query( 3138 'querySdkSliceData', 3139 sqlStr, 3140 { $column_id: column_id, $startNS: startNS, $endNS: endNS }, 3141 'exec-sdk-' + componentId 3142 ); 3143 3144export const queryCounterMax = (sqlStr: string, counter_id: number, componentId: number): Promise<Array<any>> => 3145 query('queryCounterMax', sqlStr, { $counter_id: counter_id }, 'exec-sdk-' + componentId); 3146 3147export const queryAnomalyData = (): Promise<Array<EnergyAnomalyStruct>> => 3148 query( 3149 'queryAnomalyData', 3150 `select 3151 (S.ts - TR.start_ts) as startNS, 3152 D.data as eventName, 3153 D2.data as appKey, 3154 (case when S.type==1 then group_concat(S.string_value,',') else group_concat(S.int_value,',') end) as Value 3155 from trace_range AS TR,hisys_event_measure as S 3156 left join data_dict as D on D.id=S.name_id 3157 left join app_name as APP on APP.id=S.key_id 3158 left join data_dict as D2 on D2.id=APP.app_key 3159 where D.data in ('ANOMALY_SCREEN_OFF_ENERGY','ANOMALY_KERNEL_WAKELOCK','ANOMALY_CPU_HIGH_FREQUENCY','ANOMALY_WAKEUP') 3160 or (D.data in ('ANOMALY_RUNNINGLOCK','ANORMALY_APP_ENERGY','ANOMALY_GNSS_ENERGY','ANOMALY_CPU_ENERGY','ANOMALY_ALARM_WAKEUP') and D2.data in ("APPNAME")) 3161 group by S.serial,D.data` 3162 ); 3163 3164export const querySystemLocationData = (): Promise< 3165 Array<{ 3166 startNs: string; 3167 eventName: string; 3168 type: string; 3169 state: string; 3170 }> 3171> => 3172 query( 3173 'querySystemLocationData', 3174 `SELECT 3175 ( S.ts - TR.start_ts ) AS ts, 3176 D.data AS eventName, 3177 D2.data AS appKey, 3178 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value 3179 FROM 3180 trace_range AS TR, 3181 hisys_event_measure AS S 3182 LEFT JOIN data_dict AS D ON D.id = S.name_id 3183 LEFT JOIN app_name AS APP ON APP.id = S.key_id 3184 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 3185 WHERE 3186 D.data = 'GNSS_STATE' AND D2.data = 'STATE' 3187 GROUP BY 3188 S.serial, 3189 APP.app_key, 3190 D.data, 3191 D2.data;` 3192 ); 3193 3194export const querySystemLockData = (): Promise< 3195 Array<{ 3196 startNs: string; 3197 eventName: string; 3198 type: string; 3199 state: string; 3200 }> 3201> => 3202 query( 3203 'querySystemLockData', 3204 `SELECT 3205 ( S.ts - TR.start_ts ) AS ts, 3206 D.data AS eventName, 3207 D2.data AS appKey, 3208 group_concat(( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value 3209 FROM 3210 trace_range AS TR, 3211 hisys_event_measure AS S 3212 LEFT JOIN data_dict AS D ON D.id = S.name_id 3213 LEFT JOIN app_name AS APP ON APP.id = S.key_id 3214 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 3215 WHERE 3216 ( D.data = 'POWER_RUNNINGLOCK' AND D2.data in ('TAG','MESSAGE')) 3217 GROUP BY 3218 S.serial;` 3219 ); 3220 3221export const querySystemSchedulerData = (): Promise< 3222 Array<{ 3223 startNs: string; 3224 eventName: string; 3225 appKey: string; 3226 Value: string; 3227 }> 3228> => 3229 query( 3230 'querySystemSchedulerData', 3231 `SELECT 3232 ( S.ts - TR.start_ts ) AS startNs, 3233 D.data AS eventName, 3234 group_concat(D2.data, ',') AS appKey, 3235 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value 3236 FROM 3237 trace_range AS TR, 3238 hisys_event_measure AS S 3239 LEFT JOIN data_dict AS D ON D.id = S.name_id 3240 LEFT JOIN app_name AS APP ON APP.id = S.key_id 3241 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 3242 WHERE 3243 D.data IN ( 'WORK_REMOVE', 'WORK_STOP', 'WORK_ADD' ) AND D2.data in ('NAME','TYPE','WORKID') 3244 GROUP BY 3245 S.serial;` 3246 ); 3247 3248export const querySystemDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> => 3249 query( 3250 'querySystemDetailsData', 3251 `SELECT 3252 ( S.ts - TR.start_ts ) AS ts, 3253 D.data AS eventName, 3254 D2.data AS appKey, 3255 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue 3256 FROM 3257 trace_range AS TR, 3258 hisys_event_measure AS S 3259 LEFT JOIN data_dict AS D ON D.id = S.name_id 3260 LEFT JOIN app_name AS APP ON APP.id = S.key_id 3261 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 3262 WHERE 3263 D.data in ($eventName) 3264 AND 3265 D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL') 3266 AND 3267 (S.ts - TR.start_ts) <= $rightNS 3268 GROUP BY 3269 S.serial, 3270 APP.app_key, 3271 D.data, 3272 D2.data;`, 3273 { $rightNS: rightNs, $eventName: eventName } 3274 ); 3275 3276export const querySystemWorkData = (rightNs: number): Promise<Array<SystemDetailsEnergy>> => 3277 query( 3278 'querySystemWorkData', 3279 `SELECT 3280 ( S.ts - TR.start_ts ) AS ts, 3281 D.data AS eventName, 3282 D2.data AS appKey, 3283 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue 3284 FROM 3285 trace_range AS TR, 3286 hisys_event_measure AS S 3287 LEFT JOIN data_dict AS D 3288 ON D.id = S.name_id 3289 LEFT JOIN app_name AS APP 3290 ON APP.id = S.key_id 3291 LEFT JOIN data_dict AS D2 3292 ON D2.id = APP.app_key 3293 WHERE 3294 D.data in ("WORK_REMOVE", "WORK_STOP", "WORK_ADD", "WORK_START") 3295 and 3296 D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL') 3297 and (S.ts - TR.start_ts) <= $rightNS 3298 GROUP BY 3299 S.serial, 3300 APP.app_key, 3301 D.data, 3302 D2.data;`, 3303 { $rightNS: rightNs } 3304 ); 3305 3306export const queryMaxPowerValue = ( 3307 appName: string 3308): Promise< 3309 Array<{ 3310 maxValue: number; 3311 }> 3312> => 3313 query( 3314 'queryMaxPowerValue', 3315 `SELECT 3316 max( item ) AS maxValue 3317 FROM 3318 ( 3319 SELECT 3320 sum( energy + background_energy + screen_on_energy + screen_off_energy + foreground_energy ) AS item 3321 FROM 3322 energy 3323 WHERE 3324 app_name = $appName 3325 GROUP BY 3326 startNs);`, 3327 { $appName: appName } 3328 ); 3329 3330export const queryPowerData = (): Promise< 3331 Array<{ 3332 startNS: number; 3333 eventName: string; 3334 appKey: string; 3335 eventValue: string; 3336 }> 3337> => 3338 query( 3339 'queryPowerData', 3340 `SELECT 3341 ( S.ts - TR.start_ts ) AS startNS, 3342 D.data AS eventName, 3343 D2.data AS appKey, 3344 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS eventValue 3345 FROM 3346 trace_range AS TR, 3347 hisys_event_measure AS S 3348 LEFT JOIN data_dict AS D 3349 ON D.id = S.name_id 3350 LEFT JOIN app_name AS APP 3351 ON APP.id = S.key_id 3352 LEFT JOIN data_dict AS D2 3353 ON D2.id = APP.app_key 3354 where 3355 D.data in ('POWER_IDE_CPU','POWER_IDE_LOCATION','POWER_IDE_GPU','POWER_IDE_DISPLAY','POWER_IDE_CAMERA','POWER_IDE_BLUETOOTH','POWER_IDE_FLASHLIGHT','POWER_IDE_AUDIO','POWER_IDE_WIFISCAN') 3356 and 3357 D2.data in ('BACKGROUND_ENERGY','FOREGROUND_ENERGY','SCREEN_ON_ENERGY','SCREEN_OFF_ENERGY','ENERGY','APPNAME') 3358 GROUP BY 3359 S.serial, 3360 APP.app_key, 3361 D.data, 3362 D2.data 3363 ORDER BY 3364 eventName;`, 3365 {} 3366 ); 3367 3368export const getTabPowerDetailsData = ( 3369 leftNs: number, 3370 rightNs: number 3371): Promise< 3372 Array<{ 3373 startNS: number; 3374 eventName: string; 3375 appKey: string; 3376 eventValue: string; 3377 }> 3378> => 3379 query( 3380 'getTabPowerDetailsData', 3381 `SELECT 3382 ( S.ts - TR.start_ts ) AS startNS, 3383 D.data AS eventName, 3384 D2.data AS appKey, 3385 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS eventValue 3386 FROM 3387 trace_range AS TR, 3388 hisys_event_measure AS S 3389 LEFT JOIN data_dict AS D ON D.id = S.name_id 3390 LEFT JOIN app_name AS APP ON APP.id = S.key_id 3391 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 3392 where 3393 D.data in ('POWER_IDE_CPU','POWER_IDE_LOCATION','POWER_IDE_GPU','POWER_IDE_DISPLAY','POWER_IDE_CAMERA','POWER_IDE_BLUETOOTH','POWER_IDE_FLASHLIGHT','POWER_IDE_AUDIO','POWER_IDE_WIFISCAN') 3394 and 3395 D2.data in ('APPNAME') 3396 GROUP BY 3397 S.serial, 3398 APP.app_key, 3399 D.data, 3400 D2.data 3401 UNION 3402 SELECT 3403 ( S.ts - TR.start_ts ) AS startNS, 3404 D1.data AS eventName, 3405 D2.data AS appKey, 3406 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS eventValue 3407 FROM 3408 trace_range AS TR, 3409 hisys_event_measure AS S 3410 LEFT JOIN data_dict AS D1 ON D1.id = S.name_id 3411 LEFT JOIN app_name AS APP ON APP.id = S.key_id 3412 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 3413 where 3414 D1.data in ('POWER_IDE_CPU','POWER_IDE_LOCATION','POWER_IDE_GPU','POWER_IDE_DISPLAY','POWER_IDE_CAMERA','POWER_IDE_BLUETOOTH','POWER_IDE_FLASHLIGHT','POWER_IDE_AUDIO','POWER_IDE_WIFISCAN') 3415 and 3416 D2.data in ('CHARGE','BACKGROUND_TIME','SCREEN_ON_TIME','SCREEN_OFF_TIME','LOAD','USAGE','DURATION','CAMERA_ID', 3417 'FOREGROUND_COUNT','BACKGROUND_COUNT','SCREEN_ON_COUNT','SCREEN_OFF_COUNT','COUNT','UID','FOREGROUND_DURATION', 3418 'FOREGROUND_ENERGY','BACKGROUND_DURATION','BACKGROUND_ENERGY','SCREEN_ON_DURATION','SCREEN_ON_ENERGY', 3419 'SCREEN_OFF_DURATION','SCREEN_OFF_ENERGY','ENERGY') 3420 and 3421 (S.ts - TR.start_ts) >= $leftNS 3422 and (S.ts - TR.start_ts) <= $rightNS 3423 GROUP BY 3424 S.serial, 3425 APP.app_key, 3426 D1.data, 3427 D2.data 3428 ORDER BY 3429 eventName;`, 3430 { $leftNS: leftNs, $rightNS: rightNs } 3431 ); 3432 3433export const getTabPowerBatteryData = ( 3434 rightNs: number 3435): Promise< 3436 Array<{ 3437 ts: number; 3438 eventName: string; 3439 appKey: string; 3440 eventValue: string; 3441 }> 3442> => 3443 query( 3444 'getTabPowerBatteryData', 3445 `select 3446 MAX(S.ts) as ts, 3447 D.data as eventName, 3448 D2.data as appKey, 3449 group_concat((case when S.type==1 then S.string_value else S.int_value end), ',') as eventValue 3450 from 3451 trace_range AS TR, 3452 hisys_event_measure as S 3453 left join 3454 data_dict as D 3455 on 3456 D.id=S.name_id 3457 left join 3458 app_name as APP 3459 on 3460 APP.id=S.key_id 3461 left join 3462 data_dict as D2 3463 on 3464 D2.id=APP.app_key 3465 where 3466 D.data = 'POWER_IDE_BATTERY' 3467 and D2.data in ('GAS_GAUGE','CHARGE','SCREEN','LEVEL','CURRENT','CAPACITY','UID') 3468 and (S.ts - TR.start_ts) >= 0 3469 and (S.ts - TR.start_ts) <= $rightNS 3470 group by APP.app_key,D.data,D2.data;`, 3471 { $rightNS: rightNs } 3472 ); 3473 3474export const queryMaxStateValue = ( 3475 eventName: string 3476): Promise< 3477 Array<{ 3478 type: string; 3479 maxValue: number; 3480 }> 3481> => 3482 query( 3483 'queryMaxStateValue', 3484 `select 3485 D.data as type, 3486 max(S.int_value) as maxValue 3487 from trace_range AS TR,hisys_event_measure as S 3488 left join data_dict as D on D.id=S.name_id 3489 left join app_name as APP on APP.id=S.key_id 3490 left join data_dict as D2 on D2.id=APP.app_key 3491 where (case when 'SENSOR_STATE'==$eventName then D.data like '%SENSOR%' else D.data = $eventName end) 3492 and D2.data in ('BRIGHTNESS','STATE','VALUE','LEVEL','VOLUME','OPER_TYPE','VOLUME') 3493 group by APP.app_key,D.data,D2.data;`, 3494 { $eventName: eventName } 3495 ); 3496 3497export const queryStateData = (eventName: string): Promise<Array<EnergyStateStruct>> => 3498 query( 3499 'queryStateData', 3500 `select 3501 (S.ts-TR.start_ts) as startNs, 3502 D.data as type, 3503 D2.data as appKey, 3504 S.int_value as value 3505 from trace_range AS TR,hisys_event_measure as S 3506 left join data_dict as D on D.id=S.name_id 3507 left join app_name as APP on APP.id=S.key_id 3508 left join data_dict as D2 on D2.id=APP.app_key 3509 where (case when 'SENSOR_STATE'==$eventName then D.data like '%SENSOR%' else D.data = $eventName end) 3510 and D2.data in ('BRIGHTNESS','STATE','VALUE','LEVEL','VOLUME','OPER_TYPE','VOLUME') 3511 group by S.serial,APP.app_key,D.data,D2.data;`, 3512 { $eventName: eventName } 3513 ); 3514 3515export const querySyseventAppName = (): Promise< 3516 Array<{ 3517 string_value: string | null; 3518 }> 3519> => 3520 query( 3521 'querySyseventAppName', 3522 ` 3523 SELECT 3524 DISTINCT hisys_event_measure.string_value from data_dict 3525 left join app_name on app_name.app_key=data_dict.id 3526 left join hisys_event_measure on hisys_event_measure.key_id = app_name.id 3527 where data_dict.data = "APPNAME"` 3528 ); 3529 3530export const queryAnomalyDetailedData = (leftNs: number, rightNs: number): Promise<Array<EnergyAnomalyStruct>> => 3531 query<EnergyAnomalyStruct>( 3532 'queryAnomalyDetailedData', 3533 `select 3534 S.ts, 3535 D.data as eventName, 3536 D2.data as appKey, 3537 group_concat((case when S.type==1 then S.string_value else S.int_value end), ',') as Value 3538 from trace_range AS TR,hisys_event_measure as S 3539 left join data_dict as D on D.id=S.name_id 3540 left join app_name as APP on APP.id=S.key_id 3541 left join data_dict as D2 on D2.id=APP.app_key 3542 where D.data in ('ANOMALY_SCREEN_OFF_ENERGY','ANOMALY_ALARM_WAKEUP','ANOMALY_KERNEL_WAKELOCK', 3543 'ANOMALY_RUNNINGLOCK','ANORMALY_APP_ENERGY','ANOMALY_GNSS_ENERGY','ANOMALY_CPU_HIGH_FREQUENCY','ANOMALY_CPU_ENERGY','ANOMALY_WAKEUP') 3544 and D2.data in ('APPNAME') 3545 and (S.ts - TR.start_ts) >= $leftNS 3546 and (S.ts - TR.start_ts) <= $rightNS 3547 group by S.serial,APP.app_key,D.data,D2.data 3548 union 3549 select 3550 S.ts, 3551 D.data as eventName, 3552 D2.data as appKey, 3553 group_concat((case when S.type == 1 then S.string_value else S.int_value end), ',') as Value 3554 from trace_range AS TR,hisys_event_measure as S 3555 left join data_dict as D on D.id = S.name_id 3556 left join app_name as APP on APP.id = S.key_id 3557 left join data_dict as D2 on D2.id = APP.app_key 3558 where D.data in ('ANOMALY_SCREEN_OFF_ENERGY', 'ANOMALY_ALARM_WAKEUP', 'ANOMALY_KERNEL_WAKELOCK', 3559 'ANOMALY_RUNNINGLOCK', 'ANORMALY_APP_ENERGY', 'ANOMALY_GNSS_ENERGY', 'ANOMALY_CPU_HIGH_FREQUENCY', 'ANOMALY_CPU_ENERGY', 'ANOMALY_WAKEUP') 3560 and D2.data not in ('pid_', 'tid_', 'type_', 'tz_', 'uid_', 'domain_', 'id_', 'level_', 'info_', 'tag_', 'APPNAME') 3561 and (S.ts - TR.start_ts) >= $leftNS 3562 and (S.ts - TR.start_ts) <= $rightNS 3563 group by S.serial, APP.app_key, D.data, D2.data;`, 3564 { $leftNS: leftNs, $rightNS: rightNs } 3565 ); 3566 3567export const querySmapsExits = (): Promise<Array<any>> => 3568 query( 3569 'querySmapsExits', 3570 `select 3571 event_name 3572 from stat s 3573 where s.event_name = 'trace_smaps' 3574 and s.stat_type ='received' and s.count > 0` 3575 ); 3576 3577export const querySmapsData = (columnName: string): Promise<Array<any>> => 3578 query( 3579 'querySmapsCounterData', 3580 `SELECT (A.timestamp - B.start_ts) as startNS, sum(${columnName}) as value FROM smaps A,trace_range B GROUP by A.timestamp;` 3581 ); 3582 3583export const querySmapsDataMax = (columnName: string): Promise<Array<any>> => 3584 query( 3585 'querySmapsDataMax', 3586 ` 3587 SELECT (A.timestamp - B.start_ts) as startNS,sum(${columnName}) as max_value FROM smaps A,trace_range B GROUP by A.timestamp order by max_value desc LIMIT 1` 3588 ); 3589 3590export const getTabSmapsMaxRss = (leftNs: number, rightNs: number): Promise<Array<any>> => 3591 query<Smaps>( 3592 'getTabSmapsMaxRss', 3593 ` 3594SELECT (A.timestamp - B.start_ts) as startNS, sum(resident_size) as max_value FROM smaps A,trace_range B where startNS <= $rightNs`, 3595 { $rightNs: rightNs } 3596 ); 3597 3598export const getTabSmapsData = (leftNs: number, rightNs: number): Promise<Array<Smaps>> => 3599 query<Smaps>( 3600 'getTabSmapsData', 3601 ` 3602 SELECT 3603 (A.timestamp - t.start_ts) AS tsNS, 3604 start_addr, 3605 end_addr, 3606 dirty, 3607 swapper, 3608 resident_size AS rss, 3609 pss,virtaul_size AS size,reside,f.data AS permission,d.data AS path 3610 FROM smaps A 3611 LEFT JOIN data_dict d ON a.path_id = d.id LEFT 3612 JOIN data_dict f ON a.protection_id = f.id, 3613 trace_range AS t 3614 WHERE tsNS <= $rightNs`, 3615 { $rightNs: rightNs }, 3616 'exec' 3617 ); 3618 3619export const getTabVirtualMemoryType = (startTime: number, endTime: number): Promise<Array<string>> => 3620 query( 3621 'getTabVirtualMemoryType', 3622 ` 3623 SELECT type from paged_memory_sample s,trace_range t 3624 WHERE s.end_ts between $startTime + t.start_ts and $endTime + t.start_ts group by type`, 3625 { $startTime: startTime, $endTime: endTime }, 3626 'exec' 3627 ); 3628 3629export const getTabIoCompletionTimesType = (startTime: number, endTime: number): Promise<Array<string>> => 3630 query( 3631 'getTabIoCompletionTimesType', 3632 ` 3633 SELECT tier from bio_latency_sample s,trace_range t 3634 WHERE s.start_ts + s.latency_dur between $startTime + t.start_ts and $endTime + t.start_ts group by tier`, 3635 { $startTime: startTime, $endTime: endTime }, 3636 'exec' 3637 ); 3638 3639export const getCpuLimitFreqId = (): Promise<Array<CpuFreqRowLimit>> => 3640 query( 3641 'getCpuMaxMinFreqId', 3642 ` 3643 select cpu,MAX(iif(name = 'cpu_frequency_limits_max',id,0)) as maxFilterId,MAX(iif(name = 'cpu_frequency_limits_min',id,0)) as minFilterId from cpu_measure_filter where name in ('cpu_frequency_limits_max','cpu_frequency_limits_min') group by cpu 3644`, 3645 {} 3646 ); 3647 3648export const getCpuLimitFreqMax = (filterIds: string): Promise<Array<any>> => { 3649 return query( 3650 'getCpuLimitFreqMax', 3651 ` 3652 select max(value) as maxValue,filter_id as filterId from measure where filter_id in (${filterIds}) group by filter_id 3653`, 3654 {} 3655 ); 3656}; 3657 3658export const getCpuLimitFreq = (maxId: number, minId: number, cpu: number): Promise<Array<CpuFreqLimitsStruct>> => 3659 query( 3660 'getCpuLimitFreq', 3661 ` 3662 select ts - T.start_ts as startNs,dur,max(value) as max,min(value) as min,$cpu as cpu from measure,trace_range T where filter_id in ($maxId,$minId) group by ts 3663`, 3664 { $maxId: maxId, $minId: minId, $cpu: cpu } 3665 ); 3666 3667export const queryHisystemEventExits = (): Promise<Array<any>> => 3668 query( 3669 'queryHisystemEventExits', 3670 `select 3671 event_name 3672 from stat s 3673 where s.event_name = 'trace_hisys_event' 3674 and s.stat_type ='received' and s.count > 0` 3675 ); 3676 3677export const queryEbpfSamplesCount = (startTime: number, endTime: number, ipids: number[]): Promise<Array<any>> => 3678 query( 3679 'queryEbpfSamplesCount', 3680 ` 3681 select 3682fsCount, 3683 vmCount from 3684(select count(1) as fsCount from file_system_sample s,trace_range t where s.end_ts between $startTime + t.start_ts and $endTime + t.start_ts ${ 3685 ipids.length > 0 ? `and s.ipid in (${ipids.join(',')})` : '' 3686 }) 3687,(select count(1) as vmCount from paged_memory_sample s,trace_range t where s.end_ts between $startTime + t.start_ts and $endTime + t.start_ts ${ 3688 ipids.length > 0 ? `and s.ipid in (${ipids.join(',')})` : '' 3689 }); 3690`, 3691 { $startTime: startTime, $endTime: endTime } 3692 ); 3693 3694export const querySysLockDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> => 3695 query( 3696 'querySysLockDetailsData', 3697 `SELECT 3698 ( S.ts - TR.start_ts ) AS ts, 3699 D.data AS eventName, 3700 D2.data AS appKey, 3701 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue 3702 FROM 3703 trace_range AS TR, 3704 hisys_event_measure AS S 3705 LEFT JOIN data_dict AS D ON D.id = S.name_id 3706 LEFT JOIN app_name AS APP ON APP.id = S.key_id 3707 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 3708 WHERE 3709 D.data in ($eventName) 3710 AND 3711 D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL') 3712 AND 3713 (S.ts - TR.start_ts) <= $rightNS 3714 GROUP BY 3715 S.serial, APP.app_key, D.data, D2.data;`, 3716 { $rightNS: rightNs, $eventName: eventName } 3717 ); 3718 3719export const queryStateInitValue = (eventName: string, keyName: string): Promise<Array<EnergyStateStruct>> => 3720 query( 3721 'queryStateInitValue', 3722 `select 3723 0 as startNs, 3724 $eventName as type, 3725 '' as appKey, 3726 (case $keyName 3727 when 'brightness' then device_state.brightness 3728 when 'wifi' then device_state.wifi 3729 when 'bt_state' then device_state.bt_state 3730 when 'location' then device_state.location 3731 else 0 end) as value 3732 from device_state;`, 3733 { $eventName: eventName, $keyName: keyName } 3734 ); 3735 3736export const querySysLocationDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> => 3737 query( 3738 'querySysLocationDetailsData', 3739 `SELECT 3740 ( S.ts - TR.start_ts ) AS ts, 3741 D.data AS eventName, 3742 D2.data AS appKey, 3743 group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue 3744 FROM 3745 trace_range AS TR, 3746 hisys_event_measure AS S 3747 LEFT JOIN data_dict AS D ON D.id = S.name_id 3748 LEFT JOIN app_name AS APP ON APP.id = S.key_id 3749 LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 3750 WHERE 3751 D.data in ($eventName) 3752 and 3753 D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL') 3754 and (S.ts - TR.start_ts) <= $rightNS 3755 GROUP BY 3756 S.serial, 3757 APP.app_key, 3758 D.data, 3759 D2.data;`, 3760 { $rightNS: rightNs, $eventName: eventName } 3761 ); 3762export const queryNativeMemoryRealTime = (): Promise<Array<any>> => 3763 query( 3764 'queryNativeMemoryRealTime', 3765 `select cs.ts,cs.clock_name from datasource_clockid dc left join clock_snapshot cs on dc.clock_id = cs.clock_id where data_source_name = 'memory-plugin' or data_source_name = 'nativehook' 3766`, 3767 {} 3768 ); 3769 3770export const queryBootTime = (): Promise<Array<any>> => 3771 query( 3772 'queryBootTime', 3773 `select CS.ts -TR.start_ts as ts ,clock_name from clock_snapshot as CS ,trace_range as TR 3774 where clock_name = 'boottime'`, 3775 {} 3776 ); 3777 3778export const queryConfigSysEventAppName = (): Promise< 3779 Array<{ 3780 process_name: string; 3781 }> 3782> => 3783 query( 3784 'queryConfigSysEventAppName', 3785 ` 3786 SELECT value from trace_config where trace_source = 'hisys_event' and key = 'process_name'` 3787 ); 3788 3789export const queryClockData = (): Promise< 3790 Array<{ 3791 name: string; 3792 num: number; 3793 srcname: string; 3794 }> 3795> => 3796 query( 3797 'queryClockData', 3798 ` 3799 select name || ' Frequency' name, COUNT(*) num, name srcname 3800from (select id, name 3801 from clock_event_filter 3802 where type = 'clock_set_rate') 3803group by name 3804union 3805select name || ' State' name, COUNT(*) num, name srcname 3806from (select id, name 3807 from clock_event_filter 3808 where type != 'clock_set_rate') 3809group by name; 3810` 3811 ); 3812 3813export const queryClockFrequency = (clockName: string): Promise<Array<ClockStruct>> => 3814 query( 3815 'queryClockFrequency', 3816 `with freq as ( select measure.filter_id, measure.ts, measure.type, measure.value from clock_event_filter 3817left join measure 3818where clock_event_filter.name = $clockName and clock_event_filter.type = 'clock_set_rate' and clock_event_filter.id = measure.filter_id 3819order by measure.ts) 3820select freq.filter_id as filterId,freq.ts - r.start_ts as startNS,freq.type,freq.value from freq,trace_range r order by startNS`, 3821 { $clockName: clockName } 3822 ); 3823 3824export const queryClockState = (clockName: string): Promise<Array<ClockStruct>> => 3825 query( 3826 'queryClockState', 3827 `with state as ( 3828select filter_id, ts, endts, endts-ts as dur, type, value from 3829(select measure.filter_id, measure.ts, lead(ts, 1, null) over( order by measure.ts) endts, measure.type, measure.value from clock_event_filter,trace_range 3830left join measure 3831where clock_event_filter.name = $clockName and clock_event_filter.type != 'clock_set_rate' and clock_event_filter.id = measure.filter_id 3832order by measure.ts)) 3833select s.filter_id as filterId,s.ts-r.start_ts as startNS,s.type,s.value,s.dur from state s,trace_range r`, 3834 { $clockName: clockName } 3835 ); 3836 3837export const queryScreenState = (): Promise<Array<ClockStruct>> => 3838 query( 3839 'queryScreenState', 3840 `select m.type, m.ts-r.start_ts as startNS, value, filter_id as filterId from measure m,trace_range r where filter_id in (select id from process_measure_filter where name = 'ScreenState') order by startNS; 3841` 3842 ); 3843 3844export const queryIrqList = (): Promise<Array<{ name: string; cpu: number }>> => 3845 query('queryIrqList', `select cat as name,callid as cpu from irq where cat!= 'ipi' group by cat,callid`); 3846 3847export const queryIrqData = (callid: number, cat: string): Promise<Array<IrqStruct>> => { 3848 let sqlSoftIrq = ` 3849 select i.ts - t.start_ts as startNS,i.dur,i.name,i.depth,argsetid as argSetId,i.id from irq i, 3850trace_range t where i.callid = ${callid} and i.cat = 'softirq' 3851 `; 3852 let sqlIrq = ` 3853 select i.ts - t.start_ts as startNS,i.dur, 3854 case when i.cat = 'ipi' then 'IPI' || i.name else i.name end as name, 3855 i.depth, 3856 argsetid as argSetId, 3857 i.id 3858 from irq i,trace_range t 3859 where i.callid = ${callid} and ((i.cat = 'irq' and i.flag ='1') or i.cat = 'ipi') 3860 `; 3861 return query('queryIrqData', cat === 'irq' ? sqlIrq : sqlSoftIrq, {}); 3862}; 3863 3864export const queryAllJankProcess = (): Promise< 3865 Array<{ 3866 pid: number; 3867 }> 3868> => 3869 query( 3870 'queryAllJankProcess', 3871 ` 3872 SELECT DISTINCT p.pid 3873 FROM frame_slice AS a 3874 LEFT JOIN process AS p ON a.ipid = p.ipid 3875 ` 3876 ); 3877 3878export const queryAllExpectedData = (): Promise<Array<any>> => 3879 query( 3880 'queryAllExpectedData', 3881 ` 3882 SELECT 3883 a.id, 3884 (a.ts - TR.start_ts) AS ts, 3885 a.vsync as name, 3886 a.type, 3887 a.dur, 3888 p.pid, 3889 p.name as cmdline 3890 FROM frame_slice AS a, trace_range AS TR 3891 LEFT JOIN process AS p ON a.ipid = p.ipid 3892 WHERE a.type = 1 3893 and (a.flag <> 2 or a.flag is null) 3894 ORDER BY a.ipid,ts;` 3895 ); 3896 3897export const queryAllActualData = (): Promise<Array<any>> => 3898 query( 3899 'queryAllActualData', 3900 ` 3901 SELECT 3902 a.id, 3903 (a.ts - TR.start_ts) AS ts, 3904 a.vsync AS name, 3905 a.type, 3906 a.dur, 3907 a.src AS src_slice, 3908 a.flag AS jank_tag, 3909 a.dst AS dst_slice, 3910 p.pid, 3911 p.name AS cmdline, 3912 (case when p.name like '%render_service' then 'render_service' else 'app' end) as frame_type 3913 FROM frame_slice AS a, trace_range AS TR 3914 LEFT JOIN process AS p ON a.ipid = p.ipid 3915 WHERE a.type = 0 3916 AND a.flag <> 2 3917 ORDER BY a.ipid, ts;` 3918 ); 3919 3920export const queryActualFrameDate = (): Promise<Array<any>> => 3921 query( 3922 'queryActualFrameDate', 3923 `SELECT 3924 sf.id, 3925 'frameTime' as frame_type, 3926 fs.ipid, 3927 fs.vsync as name, 3928 fs.dur as app_dur, 3929 (sf.ts + sf.dur - fs.ts) as dur, 3930 (fs.ts - TR.start_ts) AS ts, 3931 fs.type, 3932 (case when (sf.flag == 1 or fs.flag == 1 ) then 1 when (sf.flag == 3 or fs.flag == 3 ) then 3 else 0 end) as jank_tag, 3933 pro.pid, 3934 pro.name as cmdline, 3935 (sf.ts - TR.start_ts) AS rs_ts, 3936 sf.vsync AS rs_vsync, 3937 sf.dur AS rs_dur, 3938 sf.ipid AS rs_ipid, 3939 proc.pid AS rs_pid, 3940 proc.name AS rs_name 3941 FROM frame_slice AS fs 3942 LEFT JOIN process AS pro ON pro.id = fs.ipid 3943 LEFT JOIN frame_slice AS sf ON fs.dst = sf.id 3944 LEFT JOIN process AS proc ON proc.id = sf.ipid 3945 LEFT JOIN trace_range TR 3946 WHERE fs.dst IS NOT NULL 3947 AND fs.type = 0 3948 AND fs.flag <> 2 3949 UNION 3950 SELECT 3951 -1 as id, 3952 'frameTime' as frame_type, 3953 fs.ipid, 3954 fs.vsync as name, 3955 fs.dur as app_dur, 3956 fs.dur, 3957 (fs.ts - TR.start_ts) AS ts, 3958 fs.type, 3959 fs.flag as jank_tag, 3960 pro.pid, 3961 pro.name as cmdline, 3962 NULL AS rs_ts, 3963 NULL AS rs_vsync, 3964 NULL AS rs_dur, 3965 NULL AS rs_ipid, 3966 NULL AS rs_pid, 3967 NULL AS rs_name 3968 FROM frame_slice AS fs 3969 LEFT JOIN process AS pro ON pro.id = fs.ipid 3970 LEFT JOIN trace_range TR 3971 WHERE fs.dst IS NULL 3972 AND pro.name NOT LIKE '%render_service%' 3973 AND fs.type = 0 3974 AND fs.flag <> 2 3975 ORDER BY ts;` 3976 ); 3977 3978export const queryExpectedFrameDate = (): Promise<Array<any>> => 3979 query( 3980 'queryExpectedFrameDate', 3981 ` 3982 SELECT 3983 sf.id, 3984 'frameTime' as frame_type, 3985 fs.ipid, 3986 fs.vsync as name, 3987 fs.dur as app_dur, 3988 (sf.ts + sf.dur - fs.ts) as dur, 3989 (fs.ts - TR.start_ts) AS ts, 3990 fs.type, 3991 fs.flag, 3992 pro.pid, 3993 pro.name as cmdline, 3994 (sf.ts - TR.start_ts) AS rs_ts, 3995 sf.vsync AS rs_vsync, 3996 sf.dur AS rs_dur, 3997 sf.ipid AS rs_ipid, 3998 proc.pid AS rs_pid, 3999 proc.name AS rs_name 4000 FROM frame_slice AS fs 4001 LEFT JOIN process AS pro ON pro.id = fs.ipid 4002 LEFT JOIN frame_slice AS sf ON fs.dst = sf.id 4003 LEFT JOIN process AS proc ON proc.id = sf.ipid 4004 LEFT JOIN trace_range TR 4005 WHERE fs.dst IS NOT NULL 4006 AND fs.type = 1 4007 UNION 4008 SELECT 4009 -1 as id, 4010 'frameTime' as frame_type, 4011 fs.ipid, 4012 fs.vsync as name, 4013 fs.dur as app_dur, 4014 fs.dur, 4015 (fs.ts - TR.start_ts) AS ts, 4016 fs.type, 4017 fs.flag, 4018 pro.pid, 4019 pro.name as cmdline, 4020 NULL AS rs_ts, 4021 NULL AS rs_vsync, 4022 NULL AS rs_dur, 4023 NULL AS rs_ipid, 4024 NULL AS rs_pid, 4025 NULL AS rs_name 4026 FROM frame_slice AS fs 4027 LEFT JOIN process AS pro ON pro.id = fs.ipid 4028 LEFT JOIN trace_range TR 4029 WHERE fs.dst IS NULL 4030 AND pro.name NOT LIKE '%render_service%' 4031 AND fs.type = 1 4032 ORDER BY ts;` 4033 ); 4034 4035export const queryFlowsData = (src_slice: Array<string>): Promise<Array<any>> => 4036 query( 4037 'queryFlowsData', 4038 ` 4039 SELECT fs.vsync AS name, 4040 p.pid, 4041 p.name AS cmdline, 4042 fs.type 4043 FROM frame_slice AS fs 4044 LEFT JOIN process AS p ON fs.ipid = p.ipid 4045 WHERE fs.type = 0 4046 AND fs.id IN (${src_slice.join(',')});` 4047 ); 4048 4049export const queryPrecedingData = (dst_slice: string): Promise<Array<any>> => 4050 query( 4051 'queryFlowsData', 4052 ` 4053 SELECT a.vsync AS name, 4054 p.pid, 4055 p.name AS cmdline, 4056 a.type 4057 FROM frame_slice AS a 4058 LEFT JOIN process AS p ON a.ipid = p.ipid 4059 WHERE a.type = 0 4060 AND a.id = $dst_slice;`, 4061 { $dst_slice: dst_slice } 4062 ); 4063 4064export const queryFrameTimeData = (): Promise<Array<any>> => 4065 query( 4066 'queryFrameTimeData', 4067 ` 4068 SELECT DISTINCT p.pid 4069 FROM frame_slice AS a 4070 LEFT JOIN process AS p 4071 ON a.ipid = p.ipid;` 4072 ); 4073 4074export const queryGpuDur = (id: number): Promise<any> => 4075 query( 4076 'queryGpuDur', 4077 ` 4078 SELECT dur AS gpu_dur 4079 FROM gpu_slice 4080 WHERE frame_row = $id;`, 4081 { $id: id } 4082 ); 4083 4084export const queryHeapFile = (): Promise<Array<FileInfo>> => 4085 query( 4086 'queryHeapFile', 4087 `SELECT f.id, f.file_name as name, f.start_time as startTs, f.end_time as endTs, f.pid, f.self_size as size 4088 FROM js_heap_files f,trace_range t 4089 WHERE (t.end_ts >= f.end_time and f.file_name != 'Timeline') 4090 OR f.file_name = 'Timeline'` 4091 ); 4092 4093export const queryHeapInfo = (fileId: number): Promise<Array<any>> => 4094 query( 4095 'queryHeapInfo', 4096 `SELECT file_id as fileId, key, type, int_value as intValue, str_value as strValue 4097 FROM js_heap_info WHERE file_id = ${fileId}` 4098 ); 4099 4100export const queryHeapNode = (fileId: number): Promise<Array<HeapNode>> => 4101 query( 4102 'queryHeapNode', 4103 `SELECT node_index as nodeIndex,type,name as nameIdx,id,self_size as selfSize,edge_count as edgeCount,trace_node_id as traceNodeId,detachedness 4104 FROM js_heap_nodes WHERE file_id = ${fileId}` 4105 ); 4106 4107export const queryHeapEdge = (fileId: number): Promise<Array<HeapEdge>> => 4108 query( 4109 'queryHeapEdge', 4110 `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 4111 FROM js_heap_edges WHERE file_id = ${fileId}` 4112 ); 4113 4114export const queryHeapFunction = (fileId: number): Promise<Array<HeapTraceFunctionInfo>> => 4115 query( 4116 'queryHeapFunction', 4117 `SELECT function_index as index ,function_id as id ,name,script_name as scriptName,script_id as scriptId,line,column 4118 FROM js_heap_trace_function_info WHERE file_id = ${fileId}` 4119 ); 4120 4121export const queryHeapTraceNode = (fileId: number): Promise<Array<any>> => 4122 query( 4123 'queryHeapTraceNode', 4124 `SELECT F.name, 4125 F.script_name as scriptName, 4126 F.script_id as scriptId, 4127 F.column, 4128 F.line, 4129 N.id, 4130 N.function_info_index as functionInfoIndex, 4131 N.parent_id as parentId, 4132 N.count, 4133 N.size, 4134 IFNULL( S.live_count, 0 ) AS liveCount, 4135 IFNULL( S.live_size, 0 ) AS liveSize 4136 FROM 4137 js_heap_trace_node N 4138 LEFT JOIN ( 4139 SELECT 4140 trace_node_id as traceNodeId, 4141 SUM( self_size ) AS liveSize, 4142 count( * ) AS liveCount 4143 FROM 4144 js_heap_nodes 4145 WHERE 4146 file_id = ${fileId} 4147 AND trace_node_id != 0 4148 GROUP BY 4149 trace_node_id 4150 ) S ON N.id = S.trace_node_id 4151 LEFT JOIN js_heap_trace_function_info F ON (F.file_id = N.file_id 4152 AND F.function_index = N.function_info_index) 4153 WHERE 4154 N.file_id = ${fileId} 4155 ORDER BY 4156 N.id` 4157 ); 4158 4159export const queryHeapSample = (fileId: number): Promise<Array<HeapSample>> => 4160 query( 4161 'queryHeapSample', 4162 `SELECT timestamp_us as timestamp , last_assigned_id as lastAssignedId, 0 as size 4163 FROM js_heap_sample WHERE file_id = ${fileId}` 4164 ); 4165 4166export const queryHeapLocation = (fileId: number): Promise<Array<HeapLocation>> => 4167 query( 4168 'queryHeapLocation', 4169 `SELECT object_index as objectIndex,script_id as scriptId ,column 4170 FROM js_heap_location WHERE file_id = ${fileId}` 4171 ); 4172 4173export const queryHeapString = (fileId: number): Promise<Array<any>> => 4174 query( 4175 'queryHeapString', 4176 `SELECT string 4177 FROM js_heap_string WHERE file_id = ${fileId}` 4178 ); 4179export const queryTraceRange = (): Promise<Array<any>> => 4180 query('queryTraceRange', `SELECT t.start_ts as startTs, t.end_ts as endTs FROM trace_range t`); 4181 4182export const queryHiPerfProcessCount = ( 4183 leftNs: number, 4184 rightNs: number, 4185 cpus: Array<number>, 4186 threads: Array<number>, 4187 processes: Array<number> 4188): Promise<Array<any>> => { 4189 let str = ''; 4190 if (processes.length > 0) { 4191 str = ` and C.process_id in (${processes.join(',')})`; 4192 } 4193 if (threads.length > 0) { 4194 str = ` and A.thread_id in (${threads.join(',')}) `; 4195 } 4196 if (processes.length > 0 && threads.length > 0) { 4197 str = ` and (C.process_id in (${processes.join(',')}) or A.thread_id in (${threads.join(',')}))`; 4198 } 4199 if (cpus.length > 0) { 4200 str = ` and A.cpu_id in (${cpus.join(',')})`; 4201 } 4202 if (cpus.length > 0 && processes.length > 0) { 4203 str = ` and (C.process_id in (${processes.join(',')}) or A.cpu_id in (${cpus.join(',')}))`; 4204 } 4205 return query( 4206 'queryHiPerfProcessCount', 4207 ` 4208 select C.process_id as pid, 4209 (A.timestamp_trace - R.start_ts) as time, 4210 C.thread_name as threadName, 4211 A.thread_id as tid, 4212 A.id, 4213 A.callchain_id 4214 from perf_sample A,trace_range R 4215 left join perf_thread C on A.thread_id = C.thread_id and A.thread_id != 0 4216 where time >= $leftNs and time <= $rightNs and A.callchain_id > 0 4217 ${str} 4218 `, 4219 { $leftNs: leftNs, $rightNs: rightNs } 4220 ); 4221}; 4222 4223export const queryConcurrencyTask = (funName: string, selectStartTime: number, selectEndTime: number) => 4224 query<TaskTabStruct>( 4225 'queryConcurrencyTask', 4226 `SELECT thread.tid, 4227 thread.ipid, 4228 callstack.name AS funName, 4229 callstack.ts AS startTs, 4230 callstack.dur, 4231 callstack.id, 4232 task_pool.priority, 4233 task_pool.allocation_task_row AS allocationTaskRow, 4234 task_pool.execute_task_row AS executeTaskRow, 4235 task_pool.return_task_row AS returnTaskRow, 4236 task_pool.execute_id AS executeId 4237 FROM thread 4238 LEFT JOIN callstack ON thread.id = callstack.callid 4239 LEFT JOIN task_pool ON callstack.id = task_pool.execute_task_row 4240 WHERE ipid = (SELECT thread.ipid 4241 FROM thread 4242 LEFT JOIN callstack ON thread.id = callstack.callid 4243 WHERE callstack.name = $funName) 4244 AND thread.name = 'TaskWorkThread' 4245 AND -- 左包含 4246 ($selectStartTime <= callstack.ts AND $selectEndTime > callstack.ts AND callstack.name LIKE 'H:Task Perform:%') 4247 OR -- 右包含 4248 ($selectStartTime < callstack.ts + callstack.dur AND $selectEndTime >= callstack.ts + callstack.dur AND callstack.name LIKE 'H:Task Perform:%') 4249 OR -- 包含 4250 ($selectStartTime >= callstack.ts AND $selectEndTime <= callstack.ts + callstack.dur AND callstack.name LIKE 'H:Task Perform:%') 4251 OR -- 被包含 4252 ($selectStartTime <= callstack.ts AND $selectEndTime >= callstack.ts + callstack.dur AND callstack.name LIKE 'H:Task Perform:%') 4253 ORDER BY callstack.ts;`, 4254 { $funName: funName, $selectStartTime: selectStartTime, $selectEndTime: selectEndTime} 4255 ); 4256 4257export const queryBySelectExecute = ( 4258 executeId: string 4259): Promise< 4260 Array<{ 4261 tid: number; 4262 allocation_task_row: number; 4263 execute_task_row: number; 4264 return_task_row: number; 4265 priority: number; 4266 }> 4267> => { 4268 let sqlStr = `SELECT thread.tid, 4269 task_pool.allocation_task_row, 4270 task_pool.execute_task_row, 4271 task_pool.return_task_row, 4272 task_pool.priority 4273 FROM task_pool 4274 LEFT JOIN callstack ON callstack.id = task_pool.allocation_task_row 4275 LEFT JOIN thread ON thread.id = callstack.callid 4276 WHERE task_pool.execute_id = $executeId; 4277 `; 4278 return query('queryBySelectExecute', sqlStr, { $executeId: executeId }); 4279}; 4280 4281export const queryBySelectAllocationOrReturn = ( 4282 executeId: string 4283): Promise< 4284 Array<{ 4285 tid: number; 4286 allocation_task_row: number; 4287 execute_task_row: number; 4288 return_task_row: number; 4289 priority: number; 4290 }> 4291> => { 4292 let sqlStr = `SELECT thread.tid, 4293 task_pool.allocation_task_row, 4294 task_pool.execute_task_row, 4295 task_pool.return_task_row, 4296 task_pool.priority 4297 FROM task_pool 4298 LEFT JOIN callstack ON callstack.id = task_pool.execute_task_row 4299 LEFT JOIN thread ON thread.id = callstack.callid 4300 WHERE task_pool.execute_task_row IS NOT NULL AND task_pool.execute_id = $executeId; 4301 `; 4302 return query('queryBySelectAllocationOrReturn', sqlStr, { $executeId: executeId }); 4303}; 4304 4305export const queryTaskListByExecuteTaskIds = (executeTaskIds: Array<number>): Promise<Array<TaskTabStruct>> => { 4306 let sqlStr = ` 4307 SELECT 4308 task_pool.allocation_task_row as allocationTaskRow, 4309 task_pool.execute_task_row as executeTaskRow, 4310 task_pool.return_task_row as returnTaskRow, 4311 task_pool.execute_id as executeId, 4312 task_pool.priority 4313 FROM task_pool 4314 LEFT JOIN callstack ON callstack.id = task_pool.allocation_task_row 4315 WHERE task_pool.execute_id IN (${executeTaskIds.join(',')}) AND task_pool.execute_task_row IS NOT NULL; 4316 `; 4317 return query('queryTaskListByExecuteTaskIds', sqlStr, { $executeTaskIds: executeTaskIds }); 4318}; 4319 4320export const queryTaskPoolCallStack = (): Promise<Array<{ id: number; ts: number; dur: number; name: string }>> => { 4321 let sqlStr = `select * from callstack where name like 'H:Task%';`; 4322 return query('queryTaskPoolCallStack', sqlStr, {}); 4323}; 4324 4325 4326export const queryTaskPoolTotalNum = (funName: string) => 4327 query<number>( 4328 'queryTaskPoolTotalNum', 4329 `SELECT thread.tid 4330 FROM thread 4331 LEFT JOIN callstack ON thread.id = callstack.callid 4332 WHERE ipid = (SELECT thread.ipid 4333 FROM thread 4334 LEFT JOIN callstack ON thread.id = callstack.callid 4335 WHERE callstack.name = $funName) 4336 AND thread.name = 'TaskWorkThread' 4337 GROUP BY thread.tid;`, 4338 { $funName: funName} 4339 ); 4340