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