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.count(pluginName) == 0) {
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 std::string configData = pluginConfigMap[pluginName];
148 auto cpuConfigNolite = std::make_unique<ForStandard::CpuConfig>();
149 if (!parser_.ParseFromString(configData, cpuConfigNolite.get())) {
150 printf("cpu parse failed!\n");
151 return false;
152 }
153
154 std::vector<uint8_t> configDataVec(cpuConfigNolite->ByteSizeLong());
155 if (cpuConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
156 printf("cpu serialize failed!\n");
157 return false;
158 }
159 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
160 return true;
161 }
162
SetSerializeDiskioConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)163 bool ParsePluginConfig::SetSerializeDiskioConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
164 {
165 std::string configData = pluginConfigMap[pluginName];
166 auto diskioConfigNolite = std::make_unique<ForStandard::DiskioConfig>();
167 if (!parser_.ParseFromString(configData, diskioConfigNolite.get())) {
168 printf("diskio parse failed!\n");
169 return false;
170 }
171
172 std::vector<uint8_t> configDataVec(diskioConfigNolite->ByteSizeLong());
173 if (diskioConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
174 printf("diskio serialize failed!\n");
175 return false;
176 }
177 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
178 return true;
179 }
180
SetSerializeFtraceConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)181 bool ParsePluginConfig::SetSerializeFtraceConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
182 {
183 std::string configData = pluginConfigMap[pluginName];
184 auto ftraceConfigNolite = std::make_unique<ForStandard::TracePluginConfig>();
185 if (!parser_.ParseFromString(configData, ftraceConfigNolite.get())) {
186 printf("ftrace parse failed!\n");
187 return false;
188 }
189
190 std::vector<uint8_t> configNoLiteDataVec(ftraceConfigNolite->ByteSizeLong());
191 if (ftraceConfigNolite->SerializeToArray(configNoLiteDataVec.data(), configNoLiteDataVec.size()) <= 0) {
192 printf("ftrace serialize failed!\n");
193 return false;
194 }
195
196 pluginConfig.set_config_data(static_cast<const void*>(configNoLiteDataVec.data()), configNoLiteDataVec.size());
197 return true;
198 }
199
SetSerializeHidumpConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)200 bool ParsePluginConfig::SetSerializeHidumpConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
201 {
202 std::string configData = pluginConfigMap[pluginName];
203 auto hidumpConfigNolite = std::make_unique<ForStandard::HidumpConfig>();
204 if (!parser_.ParseFromString(configData, hidumpConfigNolite.get())) {
205 printf("hidump parse failed!\n");
206 return false;
207 }
208
209 std::vector<uint8_t> configDataVec(hidumpConfigNolite->ByteSizeLong());
210 if (hidumpConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
211 printf("hidump serialize failed!\n");
212 return false;
213 }
214 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
215 return true;
216 }
217
SetSerializeHiebpfConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)218 bool ParsePluginConfig::SetSerializeHiebpfConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
219 {
220 auto iter = pluginConfigMap.find(pluginName);
221 if (iter == pluginConfigMap.end()) {
222 printf("find %s failed\n", pluginName.c_str());
223 return false;
224 }
225 auto hiebpfConfigNolite = std::make_unique<ForStandard::HiebpfConfig>();
226 if (hiebpfConfigNolite == nullptr) {
227 printf("hiebpfConfigNolite is nullptr\n");
228 return false;
229 }
230 if (!parser_.ParseFromString(iter->second, hiebpfConfigNolite.get())) {
231 printf("hiebpf config parse failed!\n");
232 return false;
233 }
234 std::vector<uint8_t> config(hiebpfConfigNolite->ByteSizeLong());
235 if (hiebpfConfigNolite->SerializeToArray(config.data(), config.size()) <= 0) {
236 printf("hiebpf serialize failed!\n");
237 return false;
238 }
239 pluginConfig.set_config_data(static_cast<const void*>(config.data()), config.size());
240 return true;
241 }
242
SetSerializeHilogConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)243 bool ParsePluginConfig::SetSerializeHilogConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
244 {
245 std::string configData = pluginConfigMap[pluginName];
246 auto hilogConfigNolite = std::make_unique<ForStandard::HilogConfig>();
247 if (!parser_.ParseFromString(configData, hilogConfigNolite.get())) {
248 printf("hilog parse failed!\n");
249 return false;
250 }
251
252 std::vector<uint8_t> configDataVec(hilogConfigNolite->ByteSizeLong());
253 if (hilogConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
254 printf("hilog serialize failed!\n");
255 return false;
256 }
257 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
258 return true;
259 }
260
SetSerializeMemoryConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)261 bool ParsePluginConfig::SetSerializeMemoryConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
262 {
263 std::string configData = pluginConfigMap[pluginName];
264 auto memoryConfigNolite = std::make_unique<ForStandard::MemoryConfig>();
265 if (!parser_.ParseFromString(configData, memoryConfigNolite.get())) {
266 printf("memory parse failed!\n");
267 return false;
268 }
269
270 std::vector<uint8_t> configDataVec(memoryConfigNolite->ByteSizeLong());
271 if (memoryConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
272 printf("memory serialize failed!\n");
273 return false;
274 }
275 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
276 return true;
277 }
278
SetSerializeHookConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)279 bool ParsePluginConfig::SetSerializeHookConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
280 {
281 std::string configData = pluginConfigMap[pluginName];
282 auto hookConfigNolite = std::make_unique<ForStandard::NativeHookConfig>();
283 if (!parser_.ParseFromString(configData, hookConfigNolite.get())) {
284 printf("nativedaemon parse failed!\n");
285 return false;
286 }
287
288 std::vector<uint8_t> configDataVec(hookConfigNolite->ByteSizeLong());
289 if (hookConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
290 printf("nativedaemon serialize failed!\n");
291 return false;
292 }
293 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
294 return true;
295 }
296
SetSerializeNetworkConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)297 bool ParsePluginConfig::SetSerializeNetworkConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
298 {
299 std::string configData = pluginConfigMap[pluginName];
300 auto networkConfigNolite = std::make_unique<ForStandard::NetworkConfig>();
301 if (!parser_.ParseFromString(configData, networkConfigNolite.get())) {
302 printf("network parse failed!\n");
303 return false;
304 }
305
306 std::vector<uint8_t> configDataVec(networkConfigNolite->ByteSizeLong());
307 if (networkConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
308 printf("network serialize failed!\n");
309 return false;
310 }
311 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
312 return true;
313 }
314
SetSerializeProcessConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)315 bool ParsePluginConfig::SetSerializeProcessConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
316 {
317 std::string configData = pluginConfigMap[pluginName];
318 auto processConfigNolite = std::make_unique<ForStandard::ProcessConfig>();
319 if (!parser_.ParseFromString(configData, processConfigNolite.get())) {
320 printf("process parse failed!\n");
321 return false;
322 }
323
324 std::vector<uint8_t> configDataVec(processConfigNolite->ByteSizeLong());
325 if (processConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
326 printf("process serialize failed!\n");
327 return false;
328 }
329 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
330 return true;
331 }
332
SetSerializeHiperfConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)333 bool ParsePluginConfig::SetSerializeHiperfConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
334 {
335 std::string configData = pluginConfigMap[pluginName];
336 auto hiperfConfigNolite = std::make_unique<ForStandard::HiperfPluginConfig>();
337 if (!parser_.ParseFromString(configData, hiperfConfigNolite.get())) {
338 printf("hiperf config parse failed!\n");
339 return false;
340 }
341
342 std::vector<uint8_t> configDataVec(hiperfConfigNolite->ByteSizeLong());
343 if (hiperfConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
344 printf("hiperf config failed!\n");
345 return false;
346 }
347 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
348 return true;
349 }
350
SetSerializeHisyseventConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)351 bool ParsePluginConfig::SetSerializeHisyseventConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
352 {
353 std::string configData = pluginConfigMap[pluginName];
354 auto hisyseventConfigNolite = std::make_unique<ForStandard::HisyseventConfig>();
355 if (!parser_.ParseFromString(configData, hisyseventConfigNolite.get())) {
356 printf("NODE hisysevent parse failed!\n");
357 return false;
358 }
359
360 std::vector<uint8_t> configDataVec(hisyseventConfigNolite->ByteSizeLong());
361 if (hisyseventConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
362 printf("NODE hisysevent serialize failed!\n");
363 return false;
364 }
365 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
366 return true;
367 }
368
SetSerializeXpowerConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)369 bool ParsePluginConfig::SetSerializeXpowerConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
370 {
371 std::string configData = pluginConfigMap[pluginName];
372 auto xpowerConfigNolite = std::make_unique<ForStandard::XpowerConfig>();
373 if (!parser_.ParseFromString(configData, xpowerConfigNolite.get())) {
374 return false;
375 }
376
377 std::vector<uint8_t> configDataVec(xpowerConfigNolite->ByteSizeLong());
378 if (xpowerConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
379 return false;
380 }
381 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
382 return true;
383 }
384
SetSerializeGpuConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)385 bool ParsePluginConfig::SetSerializeGpuConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
386 {
387 std::string configData = pluginConfigMap[pluginName];
388 auto gpuConfigNolite = std::make_unique<ForStandard::GpuConfig>();
389 if (!parser_.ParseFromString(configData, gpuConfigNolite.get())) {
390 return false;
391 }
392
393 std::vector<uint8_t> configDataVec(gpuConfigNolite->ByteSizeLong());
394 if (gpuConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
395 return false;
396 }
397 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
398 return true;
399 }
400
SetSerializeFfrtProfilerConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)401 bool ParsePluginConfig::SetSerializeFfrtProfilerConfig(const std::string& pluginName,
402 ProfilerPluginConfig& pluginConfig)
403 {
404 std::string configData = pluginConfigMap[pluginName];
405 auto ffrtConfigNolite = std::make_unique<ForStandard::FfrtProfilerConfig>();
406 if (!parser_.ParseFromString(configData, ffrtConfigNolite.get())) {
407 return false;
408 }
409
410 std::vector<uint8_t> configDataVec(ffrtConfigNolite->ByteSizeLong());
411 if (ffrtConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
412 return false;
413 }
414 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
415 return true;
416 }
417
SetSerializeNetworkProfilerConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)418 bool ParsePluginConfig::SetSerializeNetworkProfilerConfig(const std::string& pluginName,
419 ProfilerPluginConfig& pluginConfig)
420 {
421 std::string configData = pluginConfigMap[pluginName];
422 auto networkConfigNolite = std::make_unique<ForStandard::NetworkProfilerConfig>();
423 if (!parser_.ParseFromString(configData, networkConfigNolite.get())) {
424 return false;
425 }
426
427 std::vector<uint8_t> configDataVec(networkConfigNolite->ByteSizeLong());
428 if (networkConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
429 return false;
430 }
431 pluginConfig.set_config_data(static_cast<const void*>(configDataVec.data()), configDataVec.size());
432 return true;
433 }
434