• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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