1/* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15import { TraficEnum } from './utils/QueryEnum'; 16import { hiLogList } from './utils/AllMemoryCache'; 17import { filterDataByGroupLayer } from './utils/DataFilter'; 18import { Args } from './CommonArgs'; 19 20export const chartLogDataSql = (args: Args): string => { 21 return `SELECT l.seq AS id, 22 l.pid, 23 l.tid, 24 CASE 25 WHEN l.ts < ${args.oneDayTime} THEN 0 26 ELSE (l.ts - ${args.recordStartNS}) 27 END AS startTs, 28 CASE 29 WHEN l.level = 'D' THEN 0 30 WHEN l.level = 'I' THEN 1 31 WHEN l.level = 'W' THEN 2 32 WHEN l.level = 'E' THEN 3 33 WHEN l.level = 'F' THEN 4 34 END AS depth, 35 1 AS dur, 36 ((l.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) + 37 CASE 38 WHEN l.level = 'D' THEN 0 39 WHEN l.level = 'I' THEN 1 40 WHEN l.level = 'W' THEN 2 41 WHEN l.level = 'E' THEN 3 42 WHEN l.level = 'F' THEN 4 43 END * ${args.width} AS px 44 FROM (SELECT DISTINCT seq FROM log) AS inner_log 45 JOIN log AS l ON l.seq = inner_log.seq 46 WHERE (CASE 47 WHEN l.ts < ${args.oneDayTime} THEN 0 48 ELSE (l.ts - ${args.recordStartNS}) 49 END) + 1 >= ${Math.floor(args.startNS)} 50 AND (CASE 51 WHEN l.ts < ${args.oneDayTime} THEN 0 52 ELSE (l.ts - ${args.recordStartNS}) 53 END) <= ${Math.floor(args.endNS)} 54 GROUP BY px`; 55}; 56 57export const chartLogDataMemorySql = (args: Args): string => { 58 return `SELECT l.seq AS id, 59 l.pid, 60 l.tid, 61 CASE 62 WHEN l.ts < ${args.oneDayTime} THEN 0 63 ELSE (l.ts - ${args.recordStartNS}) 64 END AS startTs, 65 CASE 66 WHEN l.level = 'D' THEN 0 67 WHEN l.level = 'I' THEN 1 68 WHEN l.level = 'W' THEN 2 69 WHEN l.level = 'E' THEN 3 70 WHEN l.level = 'F' THEN 4 71 END AS depth, 72 1 AS dur 73 FROM (SELECT DISTINCT seq FROM log) AS inner_log 74 JOIN log AS l ON l.seq = inner_log.seq 75 ORDER BY l.seq`; 76}; 77 78export function logDataReceiver(data: unknown, proc: Function): void { 79 // @ts-ignore 80 if (data.params.trafic === TraficEnum.Memory) { 81 // @ts-ignore 82 if (!hiLogList.has(data.params.id)) { 83 // @ts-ignore 84 let sql = chartLogDataMemorySql(data.params); 85 // @ts-ignore 86 hiLogList.set(data.params.id, proc(sql)); 87 } 88 // @ts-ignore 89 let list = hiLogList.get(data.params.id) || []; 90 let res = filterDataByGroupLayer( 91 list || [], 92 'depth', 93 'startTs', 94 'dur', 95 // @ts-ignore 96 data.params.startNS, 97 // @ts-ignore 98 data.params.endNS, 99 // @ts-ignore 100 data.params.width 101 ); 102 // @ts-ignore 103 arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 104 } else { 105 // @ts-ignore 106 let sql = chartLogDataSql(data.params); 107 let res = proc(sql); 108 // @ts-ignore 109 arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 110 } 111} 112 113function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 114 // @ts-ignore 115 let id = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.id); 116 // @ts-ignore 117 let startTs = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTs); 118 // @ts-ignore 119 let pid = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.pid); 120 // @ts-ignore 121 let tid = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.tid); 122 // @ts-ignore 123 let dur = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 124 // @ts-ignore 125 let depth = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.depth); 126 res.forEach((it, index) => { 127 // @ts-ignore 128 data.params.trafic === TraficEnum.ProtoBuffer && (it = it.logData); 129 // @ts-ignore 130 id[index] = it.id; 131 // @ts-ignore 132 startTs[index] = it.startTs; 133 // @ts-ignore 134 pid[index] = it.pid; 135 // @ts-ignore 136 tid[index] = it.tid; 137 // @ts-ignore 138 dur[index] = it.dur; 139 // @ts-ignore 140 depth[index] = it.depth; 141 }); 142 143 (self as unknown as Worker).postMessage( 144 { 145 // @ts-ignore 146 id: data.id, 147 // @ts-ignore 148 action: data.action, 149 results: transfer 150 ? { 151 id: id.buffer, 152 startTs: startTs.buffer, 153 pid: pid.buffer, 154 tid: tid.buffer, 155 dur: dur.buffer, 156 depth: depth.buffer, 157 } 158 : {}, 159 len: res.length, 160 transfer: transfer, 161 }, 162 transfer ? [id.buffer, startTs.buffer, pid.buffer, tid.buffer, dur.buffer, depth.buffer] : [] 163 ); 164} 165