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