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