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