• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2021. 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 "parse_plugin_config.h"
17 
18 #include "cpu_plugin_config_standard.pb.h"
19 #include "gpu_plugin_config_standard.pb.h"
20 #include "diskio_plugin_config_standard.pb.h"
21 #include "hidump_plugin_config_standard.pb.h"
22 #include "hiebpf_plugin_config_standard.pb.h"
23 #include "hilog_plugin_config_standard.pb.h"
24 #include "hiperf_plugin_config_standard.pb.h"
25 #include "hisysevent_plugin_config_standard.pb.h"
26 #include "arkts_plugin_config_standard.pb.h"
27 #include "memory_plugin_common_standard.pb.h"
28 #include "memory_plugin_config_standard.pb.h"
29 #include "native_hook_config_standard.pb.h"
30 #include "network_plugin_config_standard.pb.h"
31 #include "process_plugin_config_standard.pb.h"
32 #include "trace_plugin_config_standard.pb.h"
33 #include "xpower_plugin_config_standard.pb.h"
34 
35 namespace {
36 constexpr int REMAINDER = 2;
37 }
38 
ParsePluginConfig()39 ParsePluginConfig::ParsePluginConfig()
40 {
41     parser_.AllowUnknownField(true);
42 }
43 
GetInstance()44 ParsePluginConfig& ParsePluginConfig::GetInstance()
45 {
46     static ParsePluginConfig parsePluginConfig;
47     return parsePluginConfig;
48 }
49 
GetPluginsConfig(std::string & content)50 std::string ParsePluginConfig::GetPluginsConfig(std::string& content)
51 {
52     std::string pluginConfig = "";
53     std::string pluginName = "";
54     size_t beginPos = 0;
55     size_t endPos = 0;
56     for (int i = 0; content.size() > 0; i++) {
57         // 先获取pluginName,再获取configData
58         std::string destStr = (i % REMAINDER) ? "config_data" : "plugin_name";
59         beginPos = content.find(destStr);
60         if (beginPos == std::string::npos) {
61             break;
62         }
63         pluginConfig += content.substr(0, beginPos);
64         content = content.substr(beginPos + destStr.size(), content.size());
65         destStr = (i % REMAINDER) ? "{" : "\"";
66         beginPos = content.find(destStr);
67         if (beginPos == std::string::npos) {
68             break;
69         }
70         content = content.substr(beginPos + 1, content.size());
71         destStr = (i % REMAINDER) ? "}" : "\"";
72         endPos = content.find(destStr);
73         if (endPos == std::string::npos) {
74             break;
75         }
76         std::string contentStr = content.substr(0, endPos);
77         if (i % REMAINDER == 0) { // set plugin-name
78             pluginName = contentStr;
79 
80             if (pluginName == "") {
81                 return "";
82             }
83             pluginConfig += "name: \"" + pluginName + "\"";
84         } else { // save config_data
85             pluginConfigMap.insert({pluginName, contentStr});
86             pluginConfig += "config_data: \"\"";
87         }
88 
89         content = content.substr(endPos + 1, content.size());
90     }
91 
92     pluginConfig += content;
93     return pluginConfig;
94 }
95 
SetSerializePluginsConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)96 bool ParsePluginConfig::SetSerializePluginsConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
97 {
98     bool ret = false;
99     if (pluginConfigMap.count(pluginName) == 0) {
100         printf("unknown plugin: %s\n", pluginName.c_str());
101         return ret;
102     }
103 
104     // 将pluginConfigMap中保存的configData序列化后写入pluginConfig
105     if (pluginName == "cpu-plugin") {
106         ret = SetSerializeCpuConfig(pluginName, pluginConfig);
107     } else if (pluginName == "diskio-plugin") {
108         ret = SetSerializeDiskioConfig(pluginName, pluginConfig);
109     } else if (pluginName == "ftrace-plugin") {
110         ret = SetSerializeFtraceConfig(pluginName, pluginConfig);
111     } else if (pluginName == "hidump-plugin") {
112         ret = SetSerializeHidumpConfig(pluginName, pluginConfig);
113     } else if (pluginName == "hiebpf-plugin") {
114         ret = SetSerializeHiebpfConfig(pluginName, pluginConfig);
115     } else if (pluginName == "hilog-plugin") {
116         ret = SetSerializeHilogConfig(pluginName, pluginConfig);
117     } else if (pluginName == "memory-plugin") {
118         ret = SetSerializeMemoryConfig(pluginName, pluginConfig);
119     } else if (pluginName == "nativehook") {
120         ret = SetSerializeHookConfig(pluginName, pluginConfig);
121     } else if (pluginName == "network-plugin") {
122         ret = SetSerializeNetworkConfig(pluginName, pluginConfig);
123     } else if (pluginName == "process-plugin") {
124         ret = SetSerializeProcessConfig(pluginName, pluginConfig);
125     } else if (pluginName == "hiperf-plugin") {
126         ret = SetSerializeHiperfConfig(pluginName, pluginConfig);
127     } else if (pluginName == "hisysevent-plugin") {
128         ret = SetSerializeHisyseventConfig(pluginName, pluginConfig);
129     } else if (pluginName == "arkts-plugin") {
130         ret = SetSerializeArkTSConfig(pluginName, pluginConfig);
131     } else if (pluginName == "xpower-plugin") {
132         ret = SetSerializeXpowerConfig(pluginName, pluginConfig);
133     } else if (pluginName == "gpu-plugin") {
134         ret = SetSerializeGpuConfig(pluginName, pluginConfig);
135     } else {
136         printf("unsupport plugin: %s\n", pluginName.c_str());
137     }
138 
139     return ret;
140 }
141 
SetSerializeCpuConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)142 bool ParsePluginConfig::SetSerializeCpuConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
143 {
144     std::string configData = pluginConfigMap[pluginName];
145     auto cpuConfigNolite = std::make_unique<ForStandard::CpuConfig>();
146     if (!parser_.ParseFromString(configData, cpuConfigNolite.get())) {
147         printf("cpu parse failed!\n");
148         return false;
149     }
150 
151     std::vector<uint8_t> configDataVec(cpuConfigNolite->ByteSizeLong());
152     if (cpuConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
153         printf("cpu serialize failed!\n");
154         return false;
155     }
156     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
157     return true;
158 }
159 
SetSerializeDiskioConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)160 bool ParsePluginConfig::SetSerializeDiskioConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
161 {
162     std::string configData = pluginConfigMap[pluginName];
163     auto diskioConfigNolite = std::make_unique<ForStandard::DiskioConfig>();
164     if (!parser_.ParseFromString(configData, diskioConfigNolite.get())) {
165         printf("diskio parse failed!\n");
166         return false;
167     }
168 
169     std::vector<uint8_t> configDataVec(diskioConfigNolite->ByteSizeLong());
170     if (diskioConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
171         printf("diskio serialize failed!\n");
172         return false;
173     }
174     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
175     return true;
176 }
177 
SetSerializeFtraceConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)178 bool ParsePluginConfig::SetSerializeFtraceConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
179 {
180     std::string configData = pluginConfigMap[pluginName];
181     auto ftraceConfigNolite = std::make_unique<ForStandard::TracePluginConfig>();
182     if (!parser_.ParseFromString(configData, ftraceConfigNolite.get())) {
183         printf("ftrace parse failed!\n");
184         return false;
185     }
186 
187     std::vector<uint8_t> configNoLiteDataVec(ftraceConfigNolite->ByteSizeLong());
188     if (ftraceConfigNolite->SerializeToArray(configNoLiteDataVec.data(), configNoLiteDataVec.size()) <= 0) {
189         printf("ftrace serialize failed!\n");
190         return false;
191     }
192 
193     pluginConfig.set_config_data((const void*)configNoLiteDataVec.data(), configNoLiteDataVec.size());
194     return true;
195 }
196 
SetSerializeHidumpConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)197 bool ParsePluginConfig::SetSerializeHidumpConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
198 {
199     std::string configData = pluginConfigMap[pluginName];
200     auto hidumpConfigNolite = std::make_unique<ForStandard::HidumpConfig>();
201     if (!parser_.ParseFromString(configData, hidumpConfigNolite.get())) {
202         printf("hidump parse failed!\n");
203         return false;
204     }
205 
206     std::vector<uint8_t> configDataVec(hidumpConfigNolite->ByteSizeLong());
207     if (hidumpConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
208         printf("hidump serialize failed!\n");
209         return false;
210     }
211     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
212     return true;
213 }
214 
SetSerializeHiebpfConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)215 bool ParsePluginConfig::SetSerializeHiebpfConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
216 {
217     auto iter = pluginConfigMap.find(pluginName);
218     if (iter == pluginConfigMap.end()) {
219         printf("find %s failed\n", pluginName.c_str());
220         return false;
221     }
222     auto hiebpfConfigNolite = std::make_unique<ForStandard::HiebpfConfig>();
223     if (hiebpfConfigNolite == nullptr) {
224         printf("hiebpfConfigNolite is nullptr\n");
225         return false;
226     }
227     if (!parser_.ParseFromString(iter->second, hiebpfConfigNolite.get())) {
228         printf("hiebpf config parse failed!\n");
229         return false;
230     }
231     std::vector<uint8_t> config(hiebpfConfigNolite->ByteSizeLong());
232     if (hiebpfConfigNolite->SerializeToArray(config.data(), config.size()) <= 0) {
233         printf("hiebpf serialize failed!\n");
234         return false;
235     }
236     pluginConfig.set_config_data(static_cast<const void*>(config.data()), config.size());
237     return true;
238 }
239 
SetSerializeHilogConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)240 bool ParsePluginConfig::SetSerializeHilogConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
241 {
242     std::string configData = pluginConfigMap[pluginName];
243     auto hilogConfigNolite = std::make_unique<ForStandard::HilogConfig>();
244     if (!parser_.ParseFromString(configData, hilogConfigNolite.get())) {
245         printf("hilog parse failed!\n");
246         return false;
247     }
248 
249     std::vector<uint8_t> configDataVec(hilogConfigNolite->ByteSizeLong());
250     if (hilogConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
251         printf("hilog serialize failed!\n");
252         return false;
253     }
254     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
255     return true;
256 }
257 
SetSerializeMemoryConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)258 bool ParsePluginConfig::SetSerializeMemoryConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
259 {
260     std::string configData = pluginConfigMap[pluginName];
261     auto memoryConfigNolite = std::make_unique<ForStandard::MemoryConfig>();
262     if (!parser_.ParseFromString(configData, memoryConfigNolite.get())) {
263         printf("memory parse failed!\n");
264         return false;
265     }
266 
267     std::vector<uint8_t> configDataVec(memoryConfigNolite->ByteSizeLong());
268     if (memoryConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
269         printf("memory serialize failed!\n");
270         return false;
271     }
272     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
273     return true;
274 }
275 
SetSerializeHookConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)276 bool ParsePluginConfig::SetSerializeHookConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
277 {
278     std::string configData = pluginConfigMap[pluginName];
279     auto hookConfigNolite = std::make_unique<ForStandard::NativeHookConfig>();
280     if (!parser_.ParseFromString(configData, hookConfigNolite.get())) {
281         printf("nativedaemon parse failed!\n");
282         return false;
283     }
284 
285     std::vector<uint8_t> configDataVec(hookConfigNolite->ByteSizeLong());
286     if (hookConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
287         printf("nativedaemon serialize failed!\n");
288         return false;
289     }
290     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
291     return true;
292 }
293 
SetSerializeNetworkConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)294 bool ParsePluginConfig::SetSerializeNetworkConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
295 {
296     std::string configData = pluginConfigMap[pluginName];
297     auto networkConfigNolite = std::make_unique<ForStandard::NetworkConfig>();
298     if (!parser_.ParseFromString(configData, networkConfigNolite.get())) {
299         printf("network parse failed!\n");
300         return false;
301     }
302 
303     std::vector<uint8_t> configDataVec(networkConfigNolite->ByteSizeLong());
304     if (networkConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
305         printf("network serialize failed!\n");
306         return false;
307     }
308     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
309     return true;
310 }
311 
SetSerializeProcessConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)312 bool ParsePluginConfig::SetSerializeProcessConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
313 {
314     std::string configData = pluginConfigMap[pluginName];
315     auto processConfigNolite = std::make_unique<ForStandard::ProcessConfig>();
316     if (!parser_.ParseFromString(configData, processConfigNolite.get())) {
317         printf("process parse failed!\n");
318         return false;
319     }
320 
321     std::vector<uint8_t> configDataVec(processConfigNolite->ByteSizeLong());
322     if (processConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
323         printf("process serialize failed!\n");
324         return false;
325     }
326     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
327     return true;
328 }
329 
SetSerializeHiperfConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)330 bool ParsePluginConfig::SetSerializeHiperfConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
331 {
332     std::string configData = pluginConfigMap[pluginName];
333     auto hiperfConfigNolite = std::make_unique<ForStandard::HiperfPluginConfig>();
334     if (!parser_.ParseFromString(configData, hiperfConfigNolite.get())) {
335         printf("hiperf config parse failed!\n");
336         return false;
337     }
338 
339     std::vector<uint8_t> configDataVec(hiperfConfigNolite->ByteSizeLong());
340     if (hiperfConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
341         printf("hiperf config failed!\n");
342         return false;
343     }
344     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
345     return true;
346 }
347 
SetSerializeHisyseventConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)348 bool ParsePluginConfig::SetSerializeHisyseventConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
349 {
350     std::string configData = pluginConfigMap[pluginName];
351     auto hisyseventConfigNolite = std::make_unique<ForStandard::HisyseventConfig>();
352     if (!parser_.ParseFromString(configData, hisyseventConfigNolite.get())) {
353         printf("NODE hisysevent parse failed!\n");
354         return false;
355     }
356 
357     std::vector<uint8_t> configDataVec(hisyseventConfigNolite->ByteSizeLong());
358     if (hisyseventConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
359         printf("NODE hisysevent serialize failed!\n");
360         return false;
361     }
362     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
363     return true;
364 }
365 
SetSerializeArkTSConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)366 bool ParsePluginConfig::SetSerializeArkTSConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
367 {
368     std::string configData = pluginConfigMap[pluginName];
369     auto arkTSConfigNolite = std::make_unique<ForStandard::ArkTSConfig>();
370     if (!parser_.ParseFromString(configData, arkTSConfigNolite.get())) {
371         return false;
372     }
373 
374     std::vector<uint8_t> configDataVec(arkTSConfigNolite->ByteSizeLong());
375     if (arkTSConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
376         return false;
377     }
378     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
379     return true;
380 }
381 
SetSerializeXpowerConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)382 bool ParsePluginConfig::SetSerializeXpowerConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
383 {
384     std::string configData = pluginConfigMap[pluginName];
385     auto xpowerConfigNolite = std::make_unique<ForStandard::XpowerConfig>();
386     if (!parser_.ParseFromString(configData, xpowerConfigNolite.get())) {
387         return false;
388     }
389 
390     std::vector<uint8_t> configDataVec(xpowerConfigNolite->ByteSizeLong());
391     if (xpowerConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
392         return false;
393     }
394     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
395     return true;
396 }
397 
SetSerializeGpuConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)398 bool ParsePluginConfig::SetSerializeGpuConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
399 {
400     std::string configData = pluginConfigMap[pluginName];
401     auto gpuConfigNolite = std::make_unique<ForStandard::GpuConfig>();
402     if (!parser_.ParseFromString(configData, gpuConfigNolite.get())) {
403         return false;
404     }
405 
406     std::vector<uint8_t> configDataVec(gpuConfigNolite->ByteSizeLong());
407     if (gpuConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
408         return false;
409     }
410     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
411     return true;
412 }
413