• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# HiSysEvent查询
2
3
4## 概述
5
6HiSysEvent提供了查询接口,支持开发者设置条件查询HiSysEvent事件,例如功耗部件可以通过该接口获取所需的系统事件进行业务分析。
7
8
9## 开发指导
10
11### 接口说明
12
13#### C++接口说明
14
15C++ HiSysEvent查询开发能力如下:HiSysEventManager类,具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。
16
17> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
18>
19> HiSysEventQueryCallback查询回调对象OnQuery方法中的形参类型HiSysEventRecord请参考[HiSysEvent订阅](subsys-dfx-hisysevent-listening.md)中的“表5 HiSysEventRecord系统事件对象”说明。
20
21  **表1** HiSysEvent查询接口
22
23| 接口名称 | 描述 |
24| -------- | -------- |
25| int32_t Query(struct&nbsp;QueryArg&amp;&nbsp;arg,<br/>std::vector&lt;QueryRule&gt;&amp;&nbsp;rules,<br/>std::shared_ptr&lt;HiSysEventQueryCallback&gt;&nbsp;callback) | 接口功能:支持根据时间段、事件领域、事件名称等条件,查询满足条件的HiSysEvent事件。<br/>输入参数:<br/>-&nbsp;arg:查询参数。<br/>-&nbsp;rules:事件过滤规则。<br/>-&nbsp;callback:查询接口回调对象。<br/>返回值:<br/>-&nbsp;0:查询成功。<br/>-&nbsp;负值:查询失败。 |
26
27  **表2** QueryArg查询参数对象
28
29| 属性名称 | 属性类型 | 描述 |
30| -------- | -------- | -------- |
31| beginTime | long long | 用于指定查询事件的开始时间,格式为Unix毫秒级时间戳。 |
32| endTime | long long | 用于指定查询事件的结束时间,格式为Unix毫秒级时间戳。 |
33| maxEvents | int | 用于指定查询返回事件的最多条数。 |
34
35  **表3** QueryRule查询规则对象
36
37| 接口名称 | 描述 |
38| -------- | -------- |
39| QueryRule(const&nbsp;std::string&amp;&nbsp;domain,<br/>const&nbsp;std::vector&lt;std::string&gt;&amp;&nbsp;eventList) | 接口功能:查询规则构造函数,创建查询规则对象。<br/>输入参数:<br/>-&nbsp;domain:string类型,用来标识查询规则对象的事件所属领域,如果传入的是空字符串,则默认事件领域字段匹配成功。<br/>-&nbsp;eventList:std::vector&lt;std::string&gt;类型,事件名称的列表,如果传入的是空字符串,则默认事件名称字段匹配成功。 |
40
41  **表4** HiSysEventQueryCallback查询回调对象
42
43| 接口名称 | 描述 |
44| -------- | -------- |
45| void&nbsp;HiSysEventQueryCallback::OnQuery(std::shared_ptr&lt;std::vector&lt;HiSysEventRecord&gt;&gt;&nbsp;sysEvents) | 接口功能:事件查询的回调。<br/>输入参数:<br/>-&nbsp;sysEvents:返回的事件集合。 |
46| void&nbsp;HiSysEventQueryCallback::OnComplete(int32_t&nbsp;reason,&nbsp;int32_t&nbsp;total) | 接口功能:事件查询完成的回调。<br/>输入参数:<br/>-&nbsp;reason:查询结束的返回原因,0表示查询正常结束,其他值表示查询异常结束。<br/>-&nbsp;total:本次查询返回的事件的总数量。 |
47
48#### C接口说明
49
50C HiSysEvent查询开发能力如下:具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。
51
52 **表5** HiSysEvent查询接口
53
54| 接口名称                                                     | 描述                                                         |
55| ------------------------------------------------------------ | ------------------------------------------------------------ |
56| int OH_HiSysEvent_Query(const HiSysEventQueryArg& arg, HiSysEventQueryRule rules[], size_t ruleSize, HiSysEventQueryCallback& callback); | 接口功能:支持根据时间段、事件领域、事件名称、事件参数等条件,查询满足条件的HiSysEvent事件。<br/>输入参数:<br/>-&nbsp;arg:查询参数。<br/>-&nbsp;rules:事件过滤规则。<br/>- ruleSize:事件过滤规则数量。<br/>-&nbsp;callback:查询接口回调。<br/>返回值:<br/>-&nbsp;0:查询成功。<br/>-&nbsp;负值:查询失败。 |
57
58 **表6** HiSysEventQueryArg查询参数结构体
59
60| 属性名称  | 属性类型 | 描述                                                 |
61| --------- | -------- | ---------------------------------------------------- |
62| beginTime | int64_t  | 用于指定查询事件的开始时间,格式为Unix毫秒级时间戳。 |
63| endTime   | int64_t  | 用于指定查询事件的结束时间,格式为Unix毫秒级时间戳。 |
64| maxEvents | int32_t  | 用于指定查询返回事件的最多条数。                     |
65
66**表7** HiSysEventQueryRule查询规则结构体
67
68| 属性名称      | 属性类型  | 描述                               |
69| ------------- | --------- | ---------------------------------- |
70| domain        | char[]    | 用来指定查询的事件领域。           |
71| eventList     | char\[][] | 用于指定查询的事件名称列表。       |
72| eventListSize | size_t    | 用于指定查询的事件名称列表大小。   |
73| condition     | char*     | 用于指定查询的自定义事件参数条件。 |
74
75对于condition参数需要按照指定的JSON字符串格式传入,使用实例如下:
76
77```json
78{
79    "version":"V1",
80    "condition":{
81        "and":[
82            {"param":"type_","op":">","value":0},
83            {"param":"uid_","op":"=","value":1201}
84        ],
85        "or":[
86            {"param":"NAME","op":"=","value":"SysEventService"},
87            {"param":"NAME","op":"=","value":"SysEventSource"}
88        ]
89    }
90}
91```
92
93- version字段是必选字段,表示传入条件的支持版本,当前只支持V1版本。
94- condition字段是必选字段,表示传入条件的具体内容。
95  - and字段是可选字段,表示条件之间是与的关系。
96  - or字段是可选字段,表示条件之间是或的关系。
97    - param字段是必选字段,表示条件匹配的参数名称,必须为字符串类型。
98    - op字段是必选字段,表示条件匹配的参数比较符,必须为字符串类型,支持的比较符包括=、>、<、>=、<=。
99    - value字段是必选字段,表示条件匹配的参数值,必须为字符串类型或整型。
100
101**表8** HiSysEventQueryCallback查询回调结构体
102
103| 属性名称   | 属性类型                                           | 描述                                                         |
104| ---------- | -------------------------------------------------- | ------------------------------------------------------------ |
105| OnQuery    | void (*)(HiSysEventRecord records[], size_t size); | 接口功能:事件查询的回调。<br/>输入参数:<br/>-&nbsp;records:返回的事件集合。<br/>- size:返回的事件集合大小。 |
106| OnComplete | void (*)(int32_t reason, int32_t total);           | 接口功能:事件查询完成的回调。<br/>输入参数:<br/>-&nbsp;reason:查询结束的返回原因,0表示查询正常结束,其他值表示查询异常结束。<br/>-&nbsp;total:本次查询返回的事件的总数量。 |
107
108**表9** HiSysEventRecord事件结构体
109
110| 属性名称  | 属性类型            | 描述                       |
111| --------- | ------------------- | -------------------------- |
112| domain    | char[]              | 事件的领域名称。           |
113| eventName | char\[]             | 事件的名称。               |
114| type      | HiSysEventEventType | 事件的类型。               |
115| time      | uint64_t            | 事件的时间戳。             |
116| tz        | char\[]             | 事件的时区。               |
117| pid       | int64_t             | 事件的进程ID。             |
118| tid       | int64_t             | 事件的线程ID。             |
119| uid       | int64_t             | 事件的用户ID。             |
120| traceId   | uint64_t            | 事件的分布式跟踪链ID。     |
121| spandId   | uint64_t            | 事件的分布式跟踪分支ID。   |
122| pspanId   | uint64_t            | 事件的分布式跟踪父分支ID。 |
123| traceFlag | int                 | 事件的分布式跟踪标志位。   |
124| level     | char*               | 事件的级别。               |
125| tag       | char*               | 事件的标签。               |
126| jsonStr   | char*               | 事件的内容。               |
127
128**表10** HiSysEventRecord解析接口
129
130| 接口名称                                                     |                                                              |
131| ------------------------------------------------------------ | ------------------------------------------------------------ |
132| void OH_HiSysEvent_GetParamNames(const HiSysEventRecord& record, char*** params, size_t& len); | 接口功能:获取该事件的所有的参数名。<br/>输入参数:<br/>- record:事件结构体。<br/>-&nbsp;params:参数名数组。<br/>- len:数组大小。 |
133| int OH_HiSysEvent_GetParamInt64Value(const HiSysEventRecord& record, const char* name, int64_t& value); | 接口功能:将该事件中参数名为name的参数值,解析为int64_t类型并赋值到value。<br/>输入参数:<br/>- record:事件结构体。<br/>-&nbsp;name:参数名。<br/>-&nbsp;value:int64_t类型的参数值。 |
134| int OH_HiSysEvent_GetParamUint64Value(const HiSysEventRecord& record, const char* name, uint64_t& value); | 接口功能:将该事件中参数名为name的参数值,解析为uint64_t类型并赋值到value。<br/>输入参数:<br/>- record:事件结构体。<br/>-&nbsp;name:参数名。<br/>-&nbsp;value:uint64_t类型的参数值。 |
135| int OH_HiSysEvent_GetParamDoubleValue(const HiSysEventRecord& record, const char* name, double& value); | 接口功能:将该事件中参数名为name的参数值,解析为double类型并赋值到value。<br/>输入参数:<br/>- record:事件结构体。<br/>-&nbsp;name:参数名。<br/>-&nbsp;value:double类型的参数值。 |
136| int OH_HiSysEvent_GetParamStringValue(const HiSysEventRecord& record, const char* name, char** value); | 接口功能:将该事件中参数名为name的参数值,解析为char数组类型并赋值到value,value在使用完成后需要手动释放内存。<br/>输入参数:<br/>- record:事件结构体。<br/>-&nbsp;name:参数名。<br/>-&nbsp;value:char\*类型引用。 |
137| int OH_HiSysEvent_GetParamInt64Values(const HiSysEventRecord& record, const char* name, int64_t** value, size_t& len); | 接口功能:将该事件中参数名为name的参数值,解析为int64_t数组类型并赋值到value,value在使用完成后需要手动释放内存。<br/>输入参数:<br/>- record:事件结构体。<br/>-&nbsp;name:参数名。<br/>-&nbsp;value:int64_t\*类型引用。<br/>-&nbsp;len:数组大小。 |
138| int OH_HiSysEvent_GetParamUint64Values(const HiSysEventRecord& record, const char* name, uint64_t** value, size_t& len); | 接口功能:将该事件中参数名为name的参数值,解析为uint64_t数组类型并赋值到value,value在使用完成后需要手动释放内存。<br/>输入参数:<br/>- record:事件结构体。<br/>-&nbsp;name:参数名。<br/>-&nbsp;value:uint64_t\*类型引用。<br/>-&nbsp;len:数组大小。 |
139| int OH_HiSysEvent_GetParamDoubleValues(const HiSysEventRecord& record, const char* name, double** value, size_t& len); | 接口功能:将该事件中参数名为name的参数值,解析为double数组类型并赋值到value,value在使用完成后需要手动释放内存。<br/>输入参数:<br/>- record:事件结构体。<br/>-&nbsp;name:参数名。<br/>-&nbsp;value:double\*类型引用。<br/>-&nbsp;len:数组大小。 |
140| int OH_HiSysEvent_GetParamStringValues(const HiSysEventRecord& record, const char* name, char*** value, size_t& len); | 接口功能:将该事件中参数名为name的参数值,解析为char*数组类型并赋值到value,value在使用完成后需要手动释放内存。<br/>输入参数:<br/>- record:事件结构体。<br/>-&nbsp;name:参数名。<br/>-&nbsp;value:char\*\*类型引用。<br/>-&nbsp;len:数组大小。 |
141
142HiSysEventRecord解析接口的返回值说明如下:
143
144- 0,表示解析成功;
145- -1,表示该事件初始化失败;
146- -2,表示参数名不存在;
147- -3,表示要解析的参数值类型与传入的参数值类型不匹配。
148
149### 开发步骤
150
151#### C++ HiSysEvent查询开发步骤
152
1531. 首先,需要引入对应的头文件。
154
155   ```c++
156   #include "hisysevent_manager.h"
157   ```
158
1592. 然后,业务领域需要实现对应的查询回调接口。
160
161   ```c++
162   class TestQueryCallback : public HiSysEventQueryCallback {
163   public:
164       void OnQuery(std::shared_ptr<std::vector<HiSysEventRecord>> sysEvents) override
165       {
166           if (sysEvents == nullptr) {
167           	return;
168           }
169           for_each((*sysEvents).cbegin(), (*sysEvents).cend(), [](const HiSysEventRecord& event) {
170               std::cout << event.AsJson() << std::endl;
171           });
172       }
173
174       void OnComplete(int32_t reason, int32_t total) override
175       {
176           std::cout << "Query completed" << std::endl;
177           return;
178       }
179   };
180   ```
181
1823. 最后,在需要查询的地方调用查询接口,并传入相应的查询参数、查询规则、查询回调参数。
183
184   ```c++
185   // 创建查询参数对象
186   long long startTime = 0;
187   long long endTime = 1668245644000; //2022-11-12 09:34:04
188   int queryCount = 10;
189   QueryArg arg(startTime, endTime, queryCount);
190
191   // 创建查询规则对象
192   QueryRule rule("HIVIEWDFX", { "PLUGIN_LOAD" });
193   std::vector<QueryRule> queryRules = { rule };
194
195   // 创建查询回调对象
196   auto queryCallback = std::make_shared<TestQueryCallback>();
197
198   // 调用查询接口
199   HiSysEventManager::Query(arg, queryRules, queryCallback);
200   ```
201
202#### C HiSysEvent查询开发步骤
203
2041. 首先,需要引入对应的头文件。
205
206   ```c++
207   #include "hisysevent_manager_c.h"
208   ```
209
2102. 然后,业务领域需要实现对应的查询回调接口。
211
212   ```c++
213   void OnQueryTest(HiSysEventRecord records[], size_t size)
214   {
215       for (size_t i = 0; i < size; i++) {
216           printf("OnQuery: event=%s", records[i].jsonStr);
217       }
218   }
219
220   void OnCompleteTest(int32_t reason, int32_t total)
221   {
222       printf("OnCompleted, res=%d, total=%d\n", reason, total);
223   }
224   ```
225
2263. 最后,在需要查询的地方调用查询接口,并传入相应的查询参数、查询规则、查询回调参数。
227
228   ```c++
229   // 创建查询参数对象
230   HiSysEventQueryArg arg;
231   arg.beginTime = 0;
232   arg.endTime = 1668245644000; //2022-11-12 09:34:04
233   arg.maxEvents = 10;
234
235   // 创建查询规则对象
236   constexpr char TEST_DOMAIN[] = "HIVIEWDFX";
237   constexpr char TEST_NAME[] = "PLUGIN_LOAD";
238   HiSysEventQueryRule rule;
239   (void)strcpy_s(rule.domain, strlen(TEST_DOMAIN) + 1, TEST_DOMAIN);
240   (void)strcpy_s(rule.eventList[0], strlen(TEST_NAME) + 1, TEST_NAME);
241   rule.eventListSize = 1;
242   rule.condition = nullptr;
243   HiSysEventQueryRule rules[] = { rule };
244
245   // 创建查询回调对象
246   HiSysEventQueryCallback callback;
247   callback.OnQuery = OnQueryTest;
248   callback.OnComplete = OnCompleteTest;
249
250   // 调用查询接口
251   OH_HiSysEvent_Query(arg, rules, sizeof(rules) / sizeof(HiSysEventQueryRule), callback);
252   ```
253
254### 开发实例
255
256#### C++ HiSysEvent查询开发实例
257
258假设业务模块需要查询截止至当前时间、事件领域为HIVIEWDFX、事件名称为PLUGIN_LOAD的所有事件,其完整使用示例如下所示:
259
2601. 首先,需要在业务模块的在BUILD.gn里增加hisysevent_native部件的libhisysevent及libhisyseventmanager依赖。
261
262   ```c++
263   external_deps = [
264     "hisysevent_native:libhisysevent",
265     "hisysevent_native:libhisyseventmanager",
266   ]
267   ```
268
2692. 在业务模块的TestQuery()函数中,调用查询接口去查询事件。
270
271   ```c++
272   #include "hisysevent_manager.h"
273   #include <iostream>
274   #include <unistd.h>
275
276   using namespace OHOS::HiviewDFX;
277
278   class TestQueryCallback : public HiSysEventQueryCallback {
279   public:
280       void OnQuery(std::shared_ptr<std::vector<HiSysEventRecord>> sysEvents) override
281       {
282           if (sysEvents == nullptr) {
283           	return;
284           }
285           for_each((*sysEvents).cbegin(), (*sysEvents).cend(), [](const HiSysEventRecord& event) {
286               std::cout << event.AsJson() << std::endl;
287           });
288       }
289
290       void OnComplete(int32_t reason, int32_t total) override
291       {
292           std::cout << "Query completed" << std::endl;
293           return;
294       }
295   };
296
297   int64_t GetMilliseconds()
298   {
299       auto now = std::chrono::system_clock::now();
300       auto millisecs = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
301       return millisecs.count();
302   }
303
304   void TestQuery()
305   {
306       // 创建查询参数对象
307       long long startTime = 0;
308       long long endTime = GetMilliseconds();
309       int maxEvents = 100;
310       QueryArg arg(startTime, endTime, maxEvents);
311
312       // 创建查询规则对象
313       QueryRule rule("HIVIEWDFX", { "PLUGIN_LOAD" });
314       std::vector<QueryRule> queryRules = { rule };
315
316       // 创建查询回调对象
317       auto queryCallback = std::make_shared<TestQueryCallback>();
318
319       // 调用查询接口
320       int ret = HiSysEventManager::Query(arg, queryRules, queryCallback);
321   }
322   ```
323
324#### C HiSysEvent查询开发实例
325
326假设业务模块需要查询截止至当前时间、事件领域为HIVIEWDFX、事件名称为PLUGIN_LOAD的所有事件,其完整使用示例如下所示:
327
3281. 首先,需要在业务模块的在BUILD.gn里增加hisysevent_native部件的libhisyseventmanager依赖。
329
330   ```c++
331   external_deps = [ "hisysevent_native:libhisyseventmanager" ]
332
333   // for strcpy_s
334   deps = [ "//third_party/bounds_checking_function:libsec_shared" ]
335   ```
336
3372. 在业务模块的TestQuery()函数中,调用查询接口去查询事件。
338
339   ```c++
340   #include "hisysevent_manager_c.h"
341   #include <securec.h>
342   #include <time.h>
343
344   void OnQueryTest(HiSysEventRecord records[], size_t size)
345   {
346       for (size_t i = 0; i < size; i++) {
347           printf("OnQuery: event=%s", records[i].jsonStr);
348       }
349   }
350
351   void OnCompleteTest(int32_t reason, int32_t total)
352   {
353       printf("OnCompleted, res=%d, total=%d\n", reason, total);
354   }
355
356   int64_t GetMilliseconds()
357   {
358       return time(NULL);
359   }
360
361   void TestQuery()
362   {
363       // 创建查询参数对象
364       HiSysEventQueryArg arg;
365       arg.beginTime = 0;
366       arg.endTime = GetMilliseconds();
367       arg.maxEvents = 100;
368
369       // 创建查询规则对象
370       constexpr char TEST_DOMAIN[] = "HIVIEWDFX";
371       constexpr char TEST_NAME[] = "PLUGIN_LOAD";
372       HiSysEventQueryRule rule;
373       (void)strcpy_s(rule.domain, strlen(TEST_DOMAIN) + 1, TEST_DOMAIN);
374       (void)strcpy_s(rule.eventList[0], strlen(TEST_NAME) + 1, TEST_NAME);
375       rule.eventListSize = 1;
376       rule.condition = nullptr;
377       HiSysEventQueryRule rules[] = { rule };
378
379       // 创建查询回调对象
380       HiSysEventQueryCallback callback;
381       callback.OnQuery = OnQueryTest;
382       callback.OnComplete = OnCompleteTest;
383
384       // 调用查询接口
385       int ret = OH_HiSysEvent_Query(arg, rules, sizeof(rules) / sizeof(HiSysEventQueryRule), callback);
386   }
387   ```
388