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