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 #ifndef TRACE_STREAMER_SELECTOR_H 17 #define TRACE_STREAMER_SELECTOR_H 18 #include <functional> 19 #include <memory> 20 #include "metrics.h" 21 #include "trace_data_cache.h" 22 #include "trace_streamer_filters.h" 23 24 namespace SysTuning { 25 namespace TraceStreamer { 26 class PtreaderParser; 27 class PbreaderParser; 28 #ifdef ENABLE_RAWTRACE 29 class RawTraceParser; 30 #endif 31 class TraceStreamerSelector { 32 public: 33 TraceStreamerSelector(); 34 ~TraceStreamerSelector(); 35 bool ParseTraceDataSegment(std::unique_ptr<uint8_t[]> data, size_t size, bool isSplitFile, int32_t isFinish); 36 void EnableMetaTable(bool enabled); 37 void EnableFileSave(bool enabled); 38 static void SetCleanMode(bool cleanMode); 39 int32_t ExportDatabase(const std::string &outputName, TraceDataDB::ResultCallBack resultCallBack = nullptr); 40 int32_t ExportPerfReadableText(const std::string &outputName, TraceDataDB::ResultCallBack resultCallBack = nullptr); 41 int32_t ExportHookReadableText(const std::string &outputName, TraceDataDB::ResultCallBack resultCallBack = nullptr); 42 int32_t ExportEbpfReadableText(const std::string &outputName, TraceDataDB::ResultCallBack resultCallBack = nullptr); 43 bool ReloadSymbolFiles(std::string &directory, std::vector<std::string> &symbolsPaths); 44 std::vector<std::string> SearchData(); 45 int32_t OperateDatabase(const std::string &sql); 46 int32_t SearchDatabase(const std::string &sql, TraceDataDB::ResultCallBack resultCallBack); 47 int32_t SearchDatabase(const std::string &sql, uint8_t *out, int32_t outLen); 48 int32_t SearchDatabase(std::string &sql, bool printf); 49 int32_t SearchDatabaseToProto(const std::string &data, SqllitePreparCacheData::TLVResultCallBack resultCallBack); 50 std::string SearchDatabase(const std::string &sql); 51 int32_t UpdateTraceRangeTime(uint8_t *data, int32_t len); 52 void WaitForParserEnd(); 53 void Clear(); 54 MetaData *GetMetaData(); 55 void SetDataType(TraceFileType type); 56 void SetCancel(bool cancel); 57 bool ParserAndPrintMetrics(const std::string &metrics); 58 bool ReadSqlFileAndPrintResult(const std::string &sqlOperator); DataType()59 TraceFileType DataType() const 60 { 61 return fileType_; 62 } 63 void UpdateAnimationTraceStatus(bool status); 64 void UpdateTaskPoolTraceStatus(bool status); 65 void UpdateAppStartTraceStatus(bool status); 66 void UpdateBinderRunnableTraceStatus(bool status); 67 void UpdateHMKernelTraceStatus(bool status); 68 void UpdateRawTraceCutStartTsStatus(bool status); 69 void InitMetricsMap(std::map<std::string, std::string> &metricsMap); 70 const std::string MetricsSqlQuery(const std::string &metrics); GetPtreaderParser()71 auto GetPtreaderParser() 72 { 73 return ptreaderParser_.get(); 74 } 75 #ifdef ENABLE_RAWTRACE GetRawtraceData()76 auto GetRawtraceData() 77 { 78 return rawTraceParser_.get(); 79 } 80 #endif GetPbreaderParser()81 auto GetPbreaderParser() 82 { 83 return pbreaderParser_.get(); 84 } GetFileType()85 const auto GetFileType() 86 { 87 return fileType_; 88 } GetTraceDataCache()89 auto GetTraceDataCache() 90 { 91 return traceDataCache_.get(); 92 } GetStreamFilter()93 auto GetStreamFilter() 94 { 95 return streamFilters_.get(); 96 } 97 void InitializeParser(); 98 void ProcessTraceData(std::unique_ptr<uint8_t[]> data, size_t size, int32_t isFinish); 99 100 // Used to obtain markinfo,skip under Linux ClearMarkPositionInfo()101 void ClearMarkPositionInfo() 102 { 103 hasGotMarkFinish_ = false; 104 markHeard_ = false; 105 }; 106 void GetMarkPositionData(std::unique_ptr<uint8_t[]> &data, size_t &size); 107 108 int32_t CreatEmptyBatchDB(const std::string dbPath); 109 int32_t BatchExportDatabase(const std::string &outputName); 110 bool BatchParseTraceDataSegment(std::unique_ptr<uint8_t[]> data, size_t size); 111 void RevertTableName(const std::string &outputName); 112 uint64_t minTs_ = INVALID_UINT64; 113 uint64_t maxTs_ = INVALID_UINT64; 114 115 private: 116 void InitFilter(); 117 bool LoadQueryFile(const std::string &sqlOperator, std::vector<std::string> &sqlStrings); 118 void ComputeDataDictStrHash(); 119 TraceFileType fileType_; 120 std::unique_ptr<TraceStreamerFilters> streamFilters_ = {}; 121 std::unique_ptr<TraceDataCache> traceDataCache_ = {}; 122 std::unique_ptr<PtreaderParser> ptreaderParser_; 123 std::unique_ptr<PbreaderParser> pbreaderParser_; 124 #ifdef ENABLE_RAWTRACE 125 std::unique_ptr<RawTraceParser> rawTraceParser_; 126 #endif 127 bool enableFileSeparate_ = false; 128 129 // Used to get markinfo,skip under Linux 130 bool hasGotMarkFinish_ = false; 131 bool markHeard_ = false; 132 }; 133 } // namespace TraceStreamer 134 } // namespace SysTuning 135 136 #endif // TRACE_STREAMER_SELECTOR_H 137