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