• 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 #include "ffrt_profiler_config_standard.pb.h"
35 #include "network_profiler_config_standard.pb.h"
36 
37 namespace {
38 constexpr int REMAINDER = 2;
39 }
40 
ParsePluginConfig()41 ParsePluginConfig::ParsePluginConfig()
42 {
43     parser_.AllowUnknownField(true);
44 }
45 
GetInstance()46 ParsePluginConfig& ParsePluginConfig::GetInstance()
47 {
48     static ParsePluginConfig parsePluginConfig;
49     return parsePluginConfig;
50 }
51 
GetPluginsConfig(std::string & content)52 std::string ParsePluginConfig::GetPluginsConfig(std::string& content)
53 {
54     std::string pluginConfig = "";
55     std::string pluginName = "";
56     size_t beginPos = 0;
57     size_t endPos = 0;
58     for (int i = 0; content.size() > 0; i++) {
59         // 先获取pluginName,再获取configData
60         std::string destStr = (i % REMAINDER) ? "config_data" : "plugin_name";
61         beginPos = content.find(destStr);
62         if (beginPos == std::string::npos) {
63             break;
64         }
65         pluginConfig += content.substr(0, beginPos);
66         content = content.substr(beginPos + destStr.size(), content.size());
67         destStr = (i % REMAINDER) ? "{" : "\"";
68         beginPos = content.find(destStr);
69         if (beginPos == std::string::npos) {
70             break;
71         }
72         content = content.substr(beginPos + 1, content.size());
73         destStr = (i % REMAINDER) ? "}" : "\"";
74         endPos = content.find(destStr);
75         if (endPos == std::string::npos) {
76             break;
77         }
78         std::string contentStr = content.substr(0, endPos);
79         if (i % REMAINDER == 0) { // set plugin-name
80             pluginName = contentStr;
81 
82             if (pluginName == "") {
83                 return "";
84             }
85             pluginConfig += "name: \"" + pluginName + "\"";
86         } else { // save config_data
87             pluginConfigMap.insert({pluginName, contentStr});
88             pluginConfig += "config_data: \"\"";
89         }
90 
91         content = content.substr(endPos + 1, content.size());
92     }
93 
94     pluginConfig += content;
95     return pluginConfig;
96 }
97 
SetSerializePluginsConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)98 bool ParsePluginConfig::SetSerializePluginsConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
99 {
100     bool ret = false;
101     if (pluginConfigMap.count(pluginName) == 0) {
102         printf("unknown plugin: %s\n", pluginName.c_str());
103         return ret;
104     }
105 
106     // 将pluginConfigMap中保存的configData序列化后写入pluginConfig
107     if (pluginName == "cpu-plugin") {
108         ret = SetSerializeCpuConfig(pluginName, pluginConfig);
109     } else if (pluginName == "diskio-plugin") {
110         ret = SetSerializeDiskioConfig(pluginName, pluginConfig);
111     } else if (pluginName == "ftrace-plugin") {
112         ret = SetSerializeFtraceConfig(pluginName, pluginConfig);
113     } else if (pluginName == "hidump-plugin") {
114         ret = SetSerializeHidumpConfig(pluginName, pluginConfig);
115     } else if (pluginName == "hiebpf-plugin") {
116         ret = SetSerializeHiebpfConfig(pluginName, pluginConfig);
117     } else if (pluginName == "hilog-plugin") {
118         ret = SetSerializeHilogConfig(pluginName, pluginConfig);
119     } else if (pluginName == "memory-plugin") {
120         ret = SetSerializeMemoryConfig(pluginName, pluginConfig);
121     } else if (pluginName == "nativehook") {
122         ret = SetSerializeHookConfig(pluginName, pluginConfig);
123     } else if (pluginName == "network-plugin") {
124         ret = SetSerializeNetworkConfig(pluginName, pluginConfig);
125     } else if (pluginName == "process-plugin") {
126         ret = SetSerializeProcessConfig(pluginName, pluginConfig);
127     } else if (pluginName == "hiperf-plugin") {
128         ret = SetSerializeHiperfConfig(pluginName, pluginConfig);
129     } else if (pluginName == "hisysevent-plugin") {
130         ret = SetSerializeHisyseventConfig(pluginName, pluginConfig);
131     } else if (pluginName == "arkts-plugin") {
132         ret = SetSerializeArkTSConfig(pluginName, pluginConfig);
133     } else if (pluginName == "xpower-plugin") {
134         ret = SetSerializeXpowerConfig(pluginName, pluginConfig);
135     } else if (pluginName == "gpu-plugin") {
136         ret = SetSerializeGpuConfig(pluginName, pluginConfig);
137     } else if (pluginName == "ffrt-profiler") {
138         ret = SetSerializeFfrtProfilerConfig(pluginName, pluginConfig);
139     } else if (pluginName == "network-profiler") {
140         ret = SetSerializeNetworkProfilerConfig(pluginName, pluginConfig);
141     } else {
142         printf("unsupport plugin: %s\n", pluginName.c_str());
143     }
144 
145     return ret;
146 }
147 
SetSerializeCpuConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)148 bool ParsePluginConfig::SetSerializeCpuConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
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((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((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((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((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((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((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((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((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((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((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((const void*)configDataVec.data(), configDataVec.size());
369     return true;
370 }
371 
SetSerializeArkTSConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)372 bool ParsePluginConfig::SetSerializeArkTSConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
373 {
374     std::string configData = pluginConfigMap[pluginName];
375     auto arkTSConfigNolite = std::make_unique<ForStandard::ArkTSConfig>();
376     if (!parser_.ParseFromString(configData, arkTSConfigNolite.get())) {
377         return false;
378     }
379 
380     std::vector<uint8_t> configDataVec(arkTSConfigNolite->ByteSizeLong());
381     if (arkTSConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
382         return false;
383     }
384     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
385     return true;
386 }
387 
SetSerializeXpowerConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)388 bool ParsePluginConfig::SetSerializeXpowerConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
389 {
390     std::string configData = pluginConfigMap[pluginName];
391     auto xpowerConfigNolite = std::make_unique<ForStandard::XpowerConfig>();
392     if (!parser_.ParseFromString(configData, xpowerConfigNolite.get())) {
393         return false;
394     }
395 
396     std::vector<uint8_t> configDataVec(xpowerConfigNolite->ByteSizeLong());
397     if (xpowerConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
398         return false;
399     }
400     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
401     return true;
402 }
403 
SetSerializeGpuConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)404 bool ParsePluginConfig::SetSerializeGpuConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
405 {
406     std::string configData = pluginConfigMap[pluginName];
407     auto gpuConfigNolite = std::make_unique<ForStandard::GpuConfig>();
408     if (!parser_.ParseFromString(configData, gpuConfigNolite.get())) {
409         return false;
410     }
411 
412     std::vector<uint8_t> configDataVec(gpuConfigNolite->ByteSizeLong());
413     if (gpuConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
414         return false;
415     }
416     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
417     return true;
418 }
419 
SetSerializeFfrtProfilerConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)420 bool ParsePluginConfig::SetSerializeFfrtProfilerConfig(const std::string& pluginName,
421     ProfilerPluginConfig& pluginConfig)
422 {
423     std::string configData = pluginConfigMap[pluginName];
424     auto ffrtConfigNolite = std::make_unique<ForStandard::FfrtProfilerConfig>();
425     if (!parser_.ParseFromString(configData, ffrtConfigNolite.get())) {
426         return false;
427     }
428 
429     std::vector<uint8_t> configDataVec(ffrtConfigNolite->ByteSizeLong());
430     if (ffrtConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
431         return false;
432     }
433     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
434     return true;
435 }
436 
SetSerializeNetworkProfilerConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)437 bool ParsePluginConfig::SetSerializeNetworkProfilerConfig(const std::string& pluginName,
438     ProfilerPluginConfig& pluginConfig)
439 {
440     std::string configData = pluginConfigMap[pluginName];
441     auto networkConfigNolite = std::make_unique<ForStandard::NetworkProfilerConfig>();
442     if (!parser_.ParseFromString(configData, networkConfigNolite.get())) {
443         return false;
444     }
445 
446     std::vector<uint8_t> configDataVec(networkConfigNolite->ByteSizeLong());
447     if (networkConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
448         return false;
449     }
450     pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
451     return true;
452 }
453