1 /*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
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
16 #include "trace_streamer_selector.h"
17 #include <algorithm>
18 #include <chrono>
19 #include <cstdlib>
20 #include <fstream>
21 #include <functional>
22 #include <regex>
23 #include "animation_filter.h"
24 #include "app_start_filter.h"
25 #include "args_filter.h"
26 #include "binder_filter.h"
27 #include "clock_filter_ex.h"
28 #include "cpu_filter.h"
29 #include "file.h"
30 #include "filter_filter.h"
31 #include "frame_filter.h"
32 #ifdef ENABLE_HISYSEVENT
33 #include "hi_sysevent_measure_filter.h"
34 #endif
35 #include "irq_filter.h"
36 #include "measure_filter.h"
37 #include "pbreader_parser.h"
38 #ifdef ENABLE_HIPERF
39 #include "perf_data_filter.h"
40 #endif
41 #include "process_filter.h"
42 #include "ptreader_parser.h"
43 #ifdef ENABLE_RAWTRACE
44 #include "rawtrace_parser.h"
45 #endif
46 #include "slice_filter.h"
47 #include "stat_filter.h"
48 #include "string_help.h"
49 #include "system_event_measure_filter.h"
50 #include "task_pool_filter.h"
51
52 namespace {
53 const uint32_t CHUNK_SIZE = 1024 * 1024;
54 constexpr uint16_t RAW_TRACE_MAGIC_NUMBER = 57161;
55 } // namespace
56 using namespace SysTuning::base;
57 namespace SysTuning {
58 namespace TraceStreamer {
59 namespace {
IsHisysEventData(const std::string & bytraceMode)60 bool IsHisysEventData(const std::string &bytraceMode)
61 {
62 auto firstLine = std::find(bytraceMode.begin(), bytraceMode.end(), '}');
63 if (firstLine == bytraceMode.end()) {
64 return false;
65 }
66 std::string line(bytraceMode.begin(), ++firstLine);
67 json jMessage;
68 if (!jMessage.accept(line)) {
69 return false;
70 }
71 std::string startStr = R"({"domain_":)";
72 if (!StartWith(line, startStr)) {
73 return false;
74 }
75 return true;
76 }
GuessFileType(const uint8_t * data,size_t size)77 TraceFileType GuessFileType(const uint8_t *data, size_t size)
78 {
79 if (size == 0) {
80 return TRACE_FILETYPE_UN_KNOW;
81 }
82 std::string start(reinterpret_cast<const char *>(data), std::min<size_t>(size, 20));
83 if (start.find("# tracer") != std::string::npos || start.find("# TRACE") != std::string::npos) {
84 return TRACE_FILETYPE_BY_TRACE;
85 }
86 #ifdef ENABLE_RAWTRACE
87 uint16_t magicNumber = INVALID_UINT16;
88 int ret = memcpy_s(&magicNumber, sizeof(uint16_t), data, sizeof(uint16_t));
89 TS_CHECK_TRUE(ret == EOK, TRACE_FILETYPE_UN_KNOW, "Memcpy FAILED!Error code is %d, data size is %zu.", ret, size);
90 if (magicNumber == RAW_TRACE_MAGIC_NUMBER) {
91 return TRACE_FILETYPE_RAW_TRACE;
92 }
93 #endif
94 std::string lowerStart(start);
95 transform(start.begin(), start.end(), lowerStart.begin(), ::tolower);
96 if ((lowerStart.compare(0, std::string("<!doctype html>").length(), "<!doctype html>") == 0) ||
97 (lowerStart.compare(0, std::string("<html>").length(), "<html>") == 0)) {
98 return TRACE_FILETYPE_BY_TRACE;
99 }
100 if (start.compare(0, std::string("\x0a").length(), "\x0a") == 0) {
101 return TRACE_FILETYPE_UN_KNOW;
102 }
103 if (start.compare(0, std::string("OHOSPROF").length(), "OHOSPROF") == 0) {
104 return TRACE_FILETYPE_H_TRACE;
105 }
106 #ifdef ENABLE_HIPERF
107 if (start.compare(0, std::string("PERFILE2").length(), "PERFILE2") == 0) {
108 return TRACE_FILETYPE_PERF;
109 }
110 #endif
111 const std::regex bytraceMatcher = std::regex(R"(-(\d+)\s+\(?\s*(\d+|-+)?\)?\s?\[(\d+)\]\s*)"
112 R"([a-zA-Z0-9.]{0,5}\s+(\d+\.\d+):\s+(\S+):)");
113 std::smatch matcheLine;
114 std::string bytraceMode(reinterpret_cast<const char *>(data), size);
115 if (std::regex_search(bytraceMode, matcheLine, bytraceMatcher)) {
116 return TRACE_FILETYPE_BY_TRACE;
117 }
118
119 const std::regex hilogMatcher = std::regex(R"( *(\w+ )?([\-\d: ]+\.\d+) +(\d+) +(\d+) +([FEWID]) +(.+?): +(.+))");
120 if (std::regex_search(bytraceMode, matcheLine, hilogMatcher)) {
121 return TRACE_FILETYPE_HILOG;
122 }
123 // Identify hisysevent data
124 if (IsHisysEventData(bytraceMode)) {
125 return TRACE_FILETYPE_HI_SYSEVENT;
126 }
127 return TRACE_FILETYPE_UN_KNOW;
128 }
129 } // namespace
130
TraceStreamerSelector()131 TraceStreamerSelector::TraceStreamerSelector()
132 : ptreaderParser_(nullptr),
133 pbreaderParser_(nullptr),
134 #ifdef ENABLE_RAWTRACE
135 rawTraceParser_(nullptr),
136 #endif
137 fileType_(TRACE_FILETYPE_UN_KNOW)
138 {
139 InitFilter();
140 }
~TraceStreamerSelector()141 TraceStreamerSelector::~TraceStreamerSelector() {}
142
InitFilter()143 void TraceStreamerSelector::InitFilter()
144 {
145 streamFilters_ = std::make_unique<TraceStreamerFilters>();
146 traceDataCache_ = std::make_unique<TraceDataCache>();
147 streamFilters_->animationFilter_ = std::make_unique<AnimationFilter>(traceDataCache_.get(), streamFilters_.get());
148 streamFilters_->cpuFilter_ = std::make_unique<CpuFilter>(traceDataCache_.get(), streamFilters_.get());
149 streamFilters_->sliceFilter_ = std::make_unique<SliceFilter>(traceDataCache_.get(), streamFilters_.get());
150
151 streamFilters_->processFilter_ = std::make_unique<ProcessFilter>(traceDataCache_.get(), streamFilters_.get());
152 streamFilters_->clockFilter_ = std::make_unique<ClockFilterEx>(traceDataCache_.get(), streamFilters_.get());
153 streamFilters_->filterFilter_ = std::make_unique<FilterFilter>(traceDataCache_.get(), streamFilters_.get());
154 streamFilters_->measureFilter_ = std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get());
155 streamFilters_->statFilter_ = std::make_unique<StatFilter>(traceDataCache_.get(), streamFilters_.get());
156 streamFilters_->binderFilter_ = std::make_unique<BinderFilter>(traceDataCache_.get(), streamFilters_.get());
157 streamFilters_->argsFilter_ = std::make_unique<ArgsFilter>(traceDataCache_.get(), streamFilters_.get());
158 streamFilters_->irqFilter_ = std::make_unique<IrqFilter>(traceDataCache_.get(), streamFilters_.get());
159 streamFilters_->frameFilter_ = std::make_unique<FrameFilter>(traceDataCache_.get(), streamFilters_.get());
160 streamFilters_->sysEventMemMeasureFilter_ =
161 std::make_unique<SystemEventMeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_SYS_MEMORY_FILTER);
162 streamFilters_->sysEventVMemMeasureFilter_ = std::make_unique<SystemEventMeasureFilter>(
163 traceDataCache_.get(), streamFilters_.get(), E_SYS_VIRTUAL_MEMORY_FILTER);
164 streamFilters_->appStartupFilter_ = std::make_unique<APPStartupFilter>(traceDataCache_.get(), streamFilters_.get());
165 #ifdef ENABLE_HIPERF
166 streamFilters_->perfDataFilter_ = std::make_unique<PerfDataFilter>(traceDataCache_.get(), streamFilters_.get());
167 #endif
168 streamFilters_->sysEventSourceFilter_ = std::make_unique<SystemEventMeasureFilter>(
169 traceDataCache_.get(), streamFilters_.get(), E_SYS_EVENT_SOURCE_FILTER);
170 #ifdef ENABLE_HISYSEVENT
171 streamFilters_->hiSysEventMeasureFilter_ =
172 std::make_unique<HiSysEventMeasureFilter>(traceDataCache_.get(), streamFilters_.get());
173 #endif
174 streamFilters_->taskPoolFilter_ = std::make_unique<TaskPoolFilter>(traceDataCache_.get(), streamFilters_.get());
175 }
176
WaitForParserEnd()177 void TraceStreamerSelector::WaitForParserEnd()
178 {
179 if (fileType_ == TRACE_FILETYPE_H_TRACE) {
180 pbreaderParser_->WaitForParserEnd();
181 }
182 if (fileType_ == TRACE_FILETYPE_BY_TRACE || fileType_ == TRACE_FILETYPE_HILOG ||
183 fileType_ == TRACE_FILETYPE_HI_SYSEVENT) {
184 ptreaderParser_->WaitForParserEnd();
185 }
186 #ifdef ENABLE_HIPERF
187 if (fileType_ == TRACE_FILETYPE_PERF) {
188 pbreaderParser_->TraceDataSegmentEnd(false);
189 pbreaderParser_->WaitForParserEnd();
190 }
191 #endif
192 #ifdef ENABLE_RAWTRACE
193 if (fileType_ == TRACE_FILETYPE_RAW_TRACE) {
194 rawTraceParser_->WaitForParserEnd();
195 }
196 #endif
197 traceDataCache_->UpdateTraceRange();
198 if (traceDataCache_->AnimationTraceEnabled()) {
199 streamFilters_->animationFilter_->UpdateFrameInfo();
200 streamFilters_->animationFilter_->UpdateDynamicFrameInfo();
201 }
202 #if IS_WASM
203 ComputeDataDictStrHash();
204 #endif
205 }
206
GetMetaData()207 MetaData *TraceStreamerSelector::GetMetaData()
208 {
209 return traceDataCache_->GetMetaData();
210 }
211
SetDataType(TraceFileType type)212 void TraceStreamerSelector::SetDataType(TraceFileType type)
213 {
214 fileType_ = type;
215 if (fileType_ == TRACE_FILETYPE_H_TRACE) {
216 pbreaderParser_ = std::make_unique<PbreaderParser>(traceDataCache_.get(), streamFilters_.get());
217 } else if (fileType_ == TRACE_FILETYPE_BY_TRACE) {
218 ptreaderParser_ = std::make_unique<PtreaderParser>(traceDataCache_.get(), streamFilters_.get());
219 }
220 #ifdef ENABLE_RAWTRACE
221 else if (fileType_ == TRACE_FILETYPE_RAW_TRACE) {
222 rawTraceParser_ = std::make_unique<RawTraceParser>(traceDataCache_.get(), streamFilters_.get());
223 }
224 #endif
225 }
226 // only support parse long trace profiler_data_xxxxxxxx_xxxxxx_x.htrace
BatchParseTraceDataSegment(std::unique_ptr<uint8_t[]> data,size_t size)227 bool TraceStreamerSelector::BatchParseTraceDataSegment(std::unique_ptr<uint8_t[]> data, size_t size)
228 {
229 if (size == 0) {
230 return true;
231 }
232 if (fileType_ == TRACE_FILETYPE_UN_KNOW) {
233 fileType_ = GuessFileType(data.get(), size);
234 if (fileType_ != TRACE_FILETYPE_H_TRACE) {
235 TS_LOGE("File type is not supported in this mode!");
236 return false;
237 }
238 pbreaderParser_ = std::make_unique<PbreaderParser>(traceDataCache_.get(), streamFilters_.get());
239 #ifdef ENABLE_HTRACE
240 pbreaderParser_->EnableOnlyParseFtrace();
241 #endif
242 }
243 pbreaderParser_->ParseTraceDataSegment(std::move(data), size);
244 return true;
245 }
246
GetMarkPositionData(std::unique_ptr<uint8_t[]> & data,size_t & size)247 void TraceStreamerSelector::GetMarkPositionData(std::unique_ptr<uint8_t[]> &data, size_t &size)
248 {
249 if (!markHeard_) {
250 std::string markStr(reinterpret_cast<const char *>(data.get()), size);
251 auto foundPos = markStr.find("MarkPositionJSON->");
252 if (foundPos == std::string::npos) {
253 // trace not MarkPosition,parse trace data
254 hasGotMarkFinish_ = true;
255 return;
256 }
257 // found MarkPosition
258 markHeard_ = true;
259 }
260 auto pos = std::find(data.get(), data.get() + size, '\n');
261 if (pos != data.get() + size) {
262 hasGotMarkFinish_ = true;
263 // Calculate the size of mark position information (include '\n')
264 auto curMarkSize = pos - data.get() + 1;
265 // Move the data pointer to the starting position of the remaining data
266 // The remaining data size is equal to the data size minus the current markinfo size
267 size -= curMarkSize;
268 auto remainingData = std::make_unique<uint8_t[]>(size);
269 memcpy_s(remainingData.get(), size, data.get() + curMarkSize, size);
270 data.reset(remainingData.release());
271 }
272 }
InitializeParser()273 void TraceStreamerSelector::InitializeParser()
274 {
275 if (fileType_ == TRACE_FILETYPE_H_TRACE || fileType_ == TRACE_FILETYPE_PERF) {
276 pbreaderParser_ = std::make_unique<PbreaderParser>(traceDataCache_.get(), streamFilters_.get());
277 #ifdef ENABLE_ARKTS
278 pbreaderParser_->EnableFileSeparate(enableFileSeparate_);
279 #endif
280 } else if (fileType_ == TRACE_FILETYPE_BY_TRACE || fileType_ == TRACE_FILETYPE_HI_SYSEVENT ||
281 fileType_ == TRACE_FILETYPE_HILOG) {
282 ptreaderParser_ = std::make_unique<PtreaderParser>(traceDataCache_.get(), streamFilters_.get(), fileType_);
283 #ifdef ENABLE_BYTRACE
284 ptreaderParser_->EnableBytrace(fileType_ == TRACE_FILETYPE_BY_TRACE);
285 #endif
286 #ifdef ENABLE_RAWTRACE
287 } else if (fileType_ == TRACE_FILETYPE_RAW_TRACE) {
288 rawTraceParser_ = std::make_unique<RawTraceParser>(traceDataCache_.get(), streamFilters_.get());
289 #endif
290 }
291 }
292
ProcessTraceData(std::unique_ptr<uint8_t[]> data,size_t size,int32_t isFinish,bool isWasmReadFile)293 void TraceStreamerSelector::ProcessTraceData(std::unique_ptr<uint8_t[]> data,
294 size_t size,
295 int32_t isFinish,
296 bool isWasmReadFile)
297 {
298 if (fileType_ == TRACE_FILETYPE_H_TRACE) {
299 pbreaderParser_->ParseTraceDataSegment(std::move(data), size);
300 } else if (fileType_ == TRACE_FILETYPE_BY_TRACE || fileType_ == TRACE_FILETYPE_HI_SYSEVENT ||
301 fileType_ == TRACE_FILETYPE_HILOG) {
302 ptreaderParser_->ParseTraceDataSegment(std::move(data), size, isFinish);
303 return;
304 } else if (fileType_ == TRACE_FILETYPE_PERF) {
305 #ifdef ENABLE_HIPERF
306 pbreaderParser_->StoreTraceDataSegment(std::move(data), size, isFinish);
307 #endif
308 } else if (fileType_ == TRACE_FILETYPE_RAW_TRACE) {
309 #ifdef ENABLE_RAWTRACE
310 #ifdef IS_WASM
311 if (isWasmReadFile && !rawTraceParser_->IsWasmReadFile()) {
312 rawTraceParser_->SetWasmReadFile(true);
313 }
314 #endif
315 rawTraceParser_->ParseTraceDataSegment(std::move(data), size, isFinish);
316 #endif
317 }
318
319 SetAnalysisResult(TRACE_PARSER_NORMAL);
320 }
321
ParseTraceDataSegment(std::unique_ptr<uint8_t[]> data,size_t size,bool isSplitFile,int32_t isFinish,bool isWasmReadFile)322 bool TraceStreamerSelector::ParseTraceDataSegment(std::unique_ptr<uint8_t[]> data,
323 size_t size,
324 bool isSplitFile,
325 int32_t isFinish,
326 bool isWasmReadFile)
327 {
328 if (size == 0) {
329 return true;
330 }
331 #if !IS_WASM
332 // if in the linux,hasGotMarkFinish_ = fasle, get markinfo
333 if (!hasGotMarkFinish_) {
334 GetMarkPositionData(data, size);
335 if (!hasGotMarkFinish_) {
336 // Believing that the markInfo data has not been sent completely,Waiting for next send
337 return true;
338 }
339 }
340 #endif
341
342 if (fileType_ == TRACE_FILETYPE_UN_KNOW) {
343 fileType_ = GuessFileType(data.get(), size);
344 if (fileType_ == TRACE_FILETYPE_UN_KNOW) {
345 SetAnalysisResult(TRACE_PARSER_FILE_TYPE_ERROR);
346 TS_LOGI(
347 "File type is not supported!,\nthe head content is:%s\n ---warning!!!---\n"
348 "File type is not supported!,\n",
349 data.get());
350 return false;
351 }
352 InitializeParser();
353 }
354 traceDataCache_->SetSplitFileMinTime(minTs_);
355 traceDataCache_->SetSplitFileMaxTime(maxTs_);
356 traceDataCache_->isSplitFile_ = isSplitFile;
357 ProcessTraceData(std::move(data), size, isFinish, isWasmReadFile);
358
359 #if !IS_WASM
360 // in the linux,isFinish = 1,clear markinfo
361 if (isFinish) {
362 ClearMarkPositionInfo();
363 }
364 #endif
365 return true;
366 }
EnableMetaTable(bool enabled)367 void TraceStreamerSelector::EnableMetaTable(bool enabled)
368 {
369 traceDataCache_->EnableMetaTable(enabled);
370 }
371
EnableFileSave(bool enabled)372 void TraceStreamerSelector::EnableFileSave(bool enabled)
373 {
374 enableFileSeparate_ = enabled;
375 }
376
SetCleanMode(bool cleanMode)377 void TraceStreamerSelector::SetCleanMode(bool cleanMode)
378 {
379 g_curLogLevel = LOG_OFF;
380 }
381
ExportDatabase(const std::string & outputName,TraceDataDB::ResultCallBack resultCallBack)382 int32_t TraceStreamerSelector::ExportDatabase(const std::string &outputName, TraceDataDB::ResultCallBack resultCallBack)
383 {
384 traceDataCache_->UpdateTraceRange();
385 return traceDataCache_->ExportDatabase(outputName, resultCallBack);
386 }
CreatEmptyBatchDB(const std::string dbPath)387 int32_t TraceStreamerSelector::CreatEmptyBatchDB(const std::string dbPath)
388 {
389 return traceDataCache_->CreatEmptyBatchDB(dbPath);
390 }
BatchExportDatabase(const std::string & outputName)391 int32_t TraceStreamerSelector::BatchExportDatabase(const std::string &outputName)
392 {
393 traceDataCache_->UpdateTraceRange();
394 return traceDataCache_->BatchExportDatabase(outputName);
395 }
RevertTableName(const std::string & outputName)396 void TraceStreamerSelector::RevertTableName(const std::string &outputName)
397 {
398 return traceDataCache_->RevertTableName(outputName);
399 }
ExportPerfReadableText(const std::string & outputName,TraceDataDB::ResultCallBack resultCallBack)400 int32_t TraceStreamerSelector::ExportPerfReadableText(const std::string &outputName,
401 TraceDataDB::ResultCallBack resultCallBack)
402 {
403 traceDataCache_->UpdateTraceRange();
404 return traceDataCache_->ExportPerfReadableText(outputName, resultCallBack);
405 }
406
ExportHookReadableText(const std::string & outputName,TraceDataDB::ResultCallBack resultCallBack)407 int32_t TraceStreamerSelector::ExportHookReadableText(const std::string &outputName,
408 TraceDataDB::ResultCallBack resultCallBack)
409 {
410 traceDataCache_->UpdateTraceRange();
411 return traceDataCache_->ExportHookReadableText(outputName, resultCallBack);
412 }
413
ExportEbpfReadableText(const std::string & outputName,TraceDataDB::ResultCallBack resultCallBack)414 int32_t TraceStreamerSelector::ExportEbpfReadableText(const std::string &outputName,
415 TraceDataDB::ResultCallBack resultCallBack)
416 {
417 traceDataCache_->UpdateTraceRange();
418 return traceDataCache_->ExportEbpfReadableText(outputName, resultCallBack);
419 }
420
ReloadSymbolFiles(const std::string & directory,const std::vector<std::string> & fileNames)421 bool TraceStreamerSelector::ReloadSymbolFiles(const std::string &directory, const std::vector<std::string> &fileNames)
422 {
423 bool result = false;
424 bool ret = false;
425 for (auto fileName : fileNames) {
426 std::filesystem::path filePath(fileName);
427 if (std::filesystem::exists(filePath) && std::filesystem::is_regular_file(filePath)) {
428 ret = pbreaderParser_->ReparseSymbolFileAndResymbolization(filePath.parent_path().string(),
429 filePath.filename().string());
430 } else if (std::filesystem::exists(std::filesystem::path(directory) / fileName)) {
431 ret = pbreaderParser_->ReparseSymbolFileAndResymbolization(directory, fileName);
432 }
433 if (ret) {
434 result = true;
435 }
436 }
437 return result;
438 }
Clear()439 void TraceStreamerSelector::Clear()
440 {
441 traceDataCache_->Prepare();
442 traceDataCache_->Clear();
443 }
SearchData()444 std::vector<std::string> TraceStreamerSelector::SearchData()
445 {
446 return traceDataCache_->SearchData();
447 }
OperateDatabase(const std::string & sql)448 int32_t TraceStreamerSelector::OperateDatabase(const std::string &sql)
449 {
450 return traceDataCache_->OperateDatabase(sql);
451 }
SearchDatabase(const std::string & sql,TraceDataDB::ResultCallBack resultCallBack)452 int32_t TraceStreamerSelector::SearchDatabase(const std::string &sql, TraceDataDB::ResultCallBack resultCallBack)
453 {
454 return traceDataCache_->SearchDatabase(sql, resultCallBack);
455 }
SearchDatabaseToProto(const std::string & data,SqllitePreparCacheData::TLVResultCallBack resultCallBack)456 int32_t TraceStreamerSelector::SearchDatabaseToProto(const std::string &data,
457 SqllitePreparCacheData::TLVResultCallBack resultCallBack)
458 {
459 return traceDataCache_->SearchDatabaseToProto(data, resultCallBack);
460 }
SearchDatabase(const std::string & sql,uint8_t * out,int32_t outLen)461 int32_t TraceStreamerSelector::SearchDatabase(const std::string &sql, uint8_t *out, int32_t outLen)
462 {
463 return traceDataCache_->SearchDatabase(sql, out, outLen);
464 }
SearchDatabase(std::string & sql,bool printf)465 int32_t TraceStreamerSelector::SearchDatabase(std::string &sql, bool printf)
466 {
467 return traceDataCache_->SearchDatabase(sql, printf);
468 }
SearchDatabase(const std::string & sql)469 std::string TraceStreamerSelector::SearchDatabase(const std::string &sql)
470 {
471 return traceDataCache_->SearchDatabase(sql);
472 }
InitMetricsMap(std::map<std::string,std::string> & metricsMap)473 void TraceStreamerSelector::InitMetricsMap(std::map<std::string, std::string> &metricsMap)
474 {
475 metricsMap.emplace(TRACE_MEM_UNAGG, MEM_UNAGG_QUERY);
476 metricsMap.emplace(TRACE_MEM, MEM_QUERY);
477 metricsMap.emplace(TRACE_MEM_TOP_TEN, MEM_TOP_QUERY);
478 metricsMap.emplace(TRACE_METADATA, META_DATA_QUERY);
479 metricsMap.emplace(SYS_CALLS, SYS_CALL_QUERY);
480 metricsMap.emplace(TRACE_STATS, TRACE_STATE_QUERY);
481 metricsMap.emplace(TRACE_TASK_NAMES, TRACE_TASK_NAME);
482 }
MetricsSqlQuery(const std::string & metrics)483 const std::string TraceStreamerSelector::MetricsSqlQuery(const std::string &metrics)
484 {
485 std::map<std::string, std::string> metricsMap;
486 InitMetricsMap(metricsMap);
487 auto itor = metricsMap.find(metrics);
488 if (itor == metricsMap.end()) {
489 TS_LOGE("metrics name error!!!");
490 return "";
491 }
492 return itor->second;
493 }
UpdateTraceRangeTime(uint8_t * data,int32_t len)494 int32_t TraceStreamerSelector::UpdateTraceRangeTime(uint8_t *data, int32_t len)
495 {
496 std::string traceRangeStr;
497 (void)memcpy_s(&traceRangeStr, len, data, len);
498 std::vector<std::string> vTraceRangeStr = SplitStringToVec(traceRangeStr, ";");
499 uint64_t minTs = std::stoull(vTraceRangeStr.at(0));
500 uint64_t maxTs = std::stoull(vTraceRangeStr.at(1));
501 traceDataCache_->UpdateTraceTime(minTs);
502 traceDataCache_->UpdateTraceTime(maxTs);
503 return 0;
504 }
SetCancel(bool cancel)505 void TraceStreamerSelector::SetCancel(bool cancel)
506 {
507 traceDataCache_->SetCancel(cancel);
508 }
UpdateBinderRunnableTraceStatus(bool status)509 void TraceStreamerSelector::UpdateBinderRunnableTraceStatus(bool status)
510 {
511 traceDataCache_->UpdateBinderRunnableTraceStatus(status);
512 }
UpdateAnimationTraceStatus(bool status)513 void TraceStreamerSelector::UpdateAnimationTraceStatus(bool status)
514 {
515 traceDataCache_->UpdateAnimationTraceStatus(status);
516 }
UpdateTaskPoolTraceStatus(bool status)517 void TraceStreamerSelector::UpdateTaskPoolTraceStatus(bool status)
518 {
519 traceDataCache_->UpdateTaskPoolTraceStatus(status);
520 }
UpdateAppStartTraceStatus(bool status)521 void TraceStreamerSelector::UpdateAppStartTraceStatus(bool status)
522 {
523 traceDataCache_->UpdateAppStartTraceStatus(status);
524 }
UpdateHMKernelTraceStatus(bool status)525 void TraceStreamerSelector::UpdateHMKernelTraceStatus(bool status)
526 {
527 traceDataCache_->UpdateHMKernelTraceStatus(status);
528 }
UpdateRawTraceCutStartTsStatus(bool status)529 void TraceStreamerSelector::UpdateRawTraceCutStartTsStatus(bool status)
530 {
531 traceDataCache_->UpdateRawTraceCutStartTsStatus(status);
532 }
LoadQueryFile(const std::string & sqlOperator,std::vector<std::string> & sqlStrings)533 bool TraceStreamerSelector::LoadQueryFile(const std::string &sqlOperator, std::vector<std::string> &sqlStrings)
534 {
535 std::ifstream file(sqlOperator);
536 if (!file.is_open()) {
537 TS_LOGE("open file failed!");
538 }
539 std::string sqlString;
540 std::string line;
541 while (std::getline(file, line)) {
542 sqlString += line;
543 }
544 if (!sqlString.empty()) {
545 auto strVec = SplitStringToVec(sqlString, ";");
546 for (auto str : strVec) {
547 auto result = TrimInvisibleCharacters(str);
548 if (!result.empty()) {
549 sqlStrings.push_back(result);
550 }
551 }
552 }
553 file.close();
554 return true;
555 }
ReadSqlFileAndPrintResult(const std::string & sqlOperator)556 bool TraceStreamerSelector::ReadSqlFileAndPrintResult(const std::string &sqlOperator)
557 {
558 std::vector<std::string> sqlStrings;
559 if (!LoadQueryFile(sqlOperator, sqlStrings)) {
560 return false;
561 }
562 if (sqlStrings.empty()) {
563 TS_LOGE("%s is empty!", sqlOperator.c_str());
564 return false;
565 }
566 for (auto &str : sqlStrings) {
567 SearchDatabase(str, true);
568 }
569 return true;
570 }
ParserAndPrintMetrics(const std::string & metrics)571 bool TraceStreamerSelector::ParserAndPrintMetrics(const std::string &metrics)
572 {
573 auto metricsName = SplitStringToVec(metrics, ",");
574 for (const auto &itemName : metricsName) {
575 std::string result = SearchDatabase(MetricsSqlQuery(itemName));
576 if (result == "") {
577 return false;
578 }
579 Metrics metricsOperator;
580 metricsOperator.ParserJson(itemName, result);
581 for (auto item : metricsOperator.GetMetricsMap()) {
582 if (item.second == itemName) {
583 metricsOperator.PrintMetricsResult(item.first, nullptr);
584 continue;
585 }
586 }
587 }
588 return true;
589 }
590
ComputeDataDictStrHash()591 void TraceStreamerSelector::ComputeDataDictStrHash()
592 {
593 auto callStack = traceDataCache_->GetConstInternalSlicesData();
594 for (auto i = 0; i < callStack.NamesData().size(); i++) {
595 auto str = traceDataCache_->GetDataFromDict(callStack.NamesData()[i]);
596 auto res = StrHash(str);
597 traceDataCache_->GetInternalSlicesData()->SetColorIndex(i, res);
598 }
599 }
600 } // namespace TraceStreamer
601 } // namespace SysTuning
602