subsys-dfx-hisysevent-query.md 19.0 KB
Newer Older
D
duangavin123 已提交
1
# HiSysEvent查询
D
duangavin123 已提交
2 3


D
duangavin123 已提交
4
## 概述
D
duangavin123 已提交
5 6 7

HiSysEvent提供了查询接口,支持开发者设置条件查询HiSysEvent事件,例如功耗部件可以通过该接口获取所需的系统事件进行业务分析。

X
xuyong 已提交
8

D
duangavin123 已提交
9
## 开发指导
D
duangavin123 已提交
10

D
duangavin123 已提交
11
### 接口说明
X
xuyong 已提交
12

13 14 15 16
#### C++接口说明

C++ HiSysEvent查询开发能力如下:HiSysEventManager类,具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。

17 18
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
>
19
> HiSysEventQueryCallback查询回调对象OnQuery方法中的形参类型HiSysEventRecord请参考[HiSysEvent订阅](subsys-dfx-hisysevent-listening.md)中的“表5 HiSysEventRecord系统事件对象”说明。
20

D
duangavin123 已提交
21
  **表1** HiSysEvent查询接口
D
duangavin123 已提交
22

23
| 接口名称 | 描述 |
D
duangavin123 已提交
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;负值:查询失败。 |
D
duangavin123 已提交
26

D
duangavin123 已提交
27
  **表2** QueryArg查询参数对象
D
duangavin123 已提交
28

29 30 31 32 33
| 属性名称 | 属性类型 | 描述 |
| -------- | -------- | -------- |
| beginTime | long long | 用于指定查询事件的开始时间,格式为Unix毫秒级时间戳。 |
| endTime | long long | 用于指定查询事件的结束时间,格式为Unix毫秒级时间戳。 |
| maxEvents | int | 用于指定查询返回事件的最多条数。 |
D
duangavin123 已提交
34

D
duangavin123 已提交
35
  **表3** QueryRule查询规则对象
D
duangavin123 已提交
36

37
| 接口名称 | 描述 |
D
duangavin123 已提交
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;类型,事件名称的列表,如果传入的是空字符串,则默认事件名称字段匹配成功。 |
D
duangavin123 已提交
40

41
  **表4** HiSysEventQueryCallback查询回调对象
D
duangavin123 已提交
42

43
| 接口名称 | 描述 |
D
duangavin123 已提交
44
| -------- | -------- |
45 46
| void&nbsp;HiSysEventQueryCallback::OnQuery(std::shared_ptr&lt;std::vector&lt;HiSysEventRecord&gt;&gt;&nbsp;sysEvents) | 接口功能:事件查询的回调。<br/>输入参数:<br/>-&nbsp;sysEvents:返回的事件集合。 |
| void&nbsp;HiSysEventQueryCallback::OnComplete(int32_t&nbsp;reason,&nbsp;int32_t&nbsp;total) | 接口功能:事件查询完成的回调。<br/>输入参数:<br/>-&nbsp;reason:查询结束的返回原因,0表示查询正常结束,其他值表示查询异常结束。<br/>-&nbsp;total:本次查询返回的事件的总数量。 |
D
duangavin123 已提交
47

48
#### C接口说明
D
duangavin123 已提交
49

50
C HiSysEvent查询开发能力如下:具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。
D
duangavin123 已提交
51

52
 **表5** HiSysEvent查询接口
53

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| 接口名称                                                     | 描述                                                         |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| 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;负值:查询失败。 |

 **表6** HiSysEventQueryArg查询参数结构体

| 属性名称  | 属性类型 | 描述                                                 |
| --------- | -------- | ---------------------------------------------------- |
| beginTime | int64_t  | 用于指定查询事件的开始时间,格式为Unix毫秒级时间戳。 |
| endTime   | int64_t  | 用于指定查询事件的结束时间,格式为Unix毫秒级时间戳。 |
| maxEvents | int32_t  | 用于指定查询返回事件的最多条数。                     |

**表7** HiSysEventQueryRule查询规则结构体

| 属性名称      | 属性类型  | 描述                               |
| ------------- | --------- | ---------------------------------- |
| domain        | char[]    | 用来指定查询的事件领域。           |
| eventList     | char\[][] | 用于指定查询的事件名称列表。       |
| eventListSize | size_t    | 用于指定查询的事件名称列表大小。   |
| condition     | char*     | 用于指定查询的自定义事件参数条件。 |

对于condition参数需要按照指定的JSON字符串格式传入,使用实例如下:

```json
{
    "version":"V1",
    "condition":{
        "and":[
            {"param":"type_","op":">","value":0},
            {"param":"uid_","op":"=","value":1201}
        ],
        "or":[
            {"param":"NAME","op":"=","value":"SysEventService"},
            {"param":"NAME","op":"=","value":"SysEventSource"}
        ]
    }
}
```

- version字段是必选字段,表示传入条件的支持版本,当前只支持V1版本。
- condition字段是必选字段,表示传入条件的具体内容。
  - and字段是可选字段,表示条件之间是与的关系。
  - or字段是可选字段,表示条件之间是或的关系。
    - param字段是必选字段,表示条件匹配的参数名称,必须为字符串类型。
    - op字段是必选字段,表示条件匹配的参数比较符,必须为字符串类型,支持的比较符包括=、>、<>=、<=。
    - value字段是必选字段,表示条件匹配的参数值,必须为字符串类型或整型。

**表8** HiSysEventQueryCallback查询回调结构体

| 属性名称   | 属性类型                                           | 描述                                                         |
| ---------- | -------------------------------------------------- | ------------------------------------------------------------ |
| OnQuery    | void (*)(HiSysEventRecord records[], size_t size); | 接口功能:事件查询的回调。<br/>输入参数:<br/>-&nbsp;records:返回的事件集合。<br/>- size:返回的事件集合大小。 |
| OnComplete | void (*)(int32_t reason, int32_t total);           | 接口功能:事件查询完成的回调。<br/>输入参数:<br/>-&nbsp;reason:查询结束的返回原因,0表示查询正常结束,其他值表示查询异常结束。<br/>-&nbsp;total:本次查询返回的事件的总数量。 |

**表9** HiSysEventRecord事件结构体

| 属性名称  | 属性类型            | 描述                       |
| --------- | ------------------- | -------------------------- |
| domain    | char[]              | 事件的领域名称。           |
| eventName | char\[]             | 事件的名称。               |
| type      | HiSysEventEventType | 事件的类型。               |
| time      | uint64_t            | 事件的时间戳。             |
| tz        | char\[]             | 事件的时区。               |
| pid       | int64_t             | 事件的进程ID。             |
| tid       | int64_t             | 事件的线程ID。             |
| uid       | int64_t             | 事件的用户ID。             |
| traceId   | uint64_t            | 事件的分布式跟踪链ID。     |
| spandId   | uint64_t            | 事件的分布式跟踪分支ID。   |
| pspanId   | uint64_t            | 事件的分布式跟踪父分支ID。 |
| traceFlag | int                 | 事件的分布式跟踪标志位。   |
| level     | char*               | 事件的级别。               |
| tag       | char*               | 事件的标签。               |
| jsonStr   | char*               | 事件的内容。               |

**表10** HiSysEventRecord解析接口

| 接口名称                                                     |                                                              |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| void OH_HiSysEvent_GetParamNames(const HiSysEventRecord& record, char*** params, size_t& len); | 接口功能:获取该事件的所有的参数名。<br/>输入参数:<br/>- record:事件结构体。<br/>-&nbsp;params:参数名数组。<br/>- len:数组大小。 |
| 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类型的参数值。 |
| 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类型的参数值。 |
| 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类型的参数值。 |
| 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\*类型引用。 |
| 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:数组大小。 |
| 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:数组大小。 |
| 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:数组大小。 |
| 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:数组大小。 |

HiSysEventRecord解析接口的返回值说明如下:

- 0,表示解析成功;
- -1,表示该事件初始化失败;
- -2,表示参数名不存在;
- -3,表示要解析的参数值类型与传入的参数值类型不匹配。

### 开发步骤

#### C++ HiSysEvent查询开发步骤

1. 首先,需要引入对应的头文件。

   ```c++
D
duangavin123 已提交
156 157 158
   #include "hisysevent_manager.h"
   ```

159
2. 然后,业务领域需要实现对应的查询回调接口。
160

161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
   ```c++
   class TestQueryCallback : public HiSysEventQueryCallback {
   public:
       void OnQuery(std::shared_ptr<std::vector<HiSysEventRecord>> sysEvents) override
       {
           if (sysEvents == nullptr) {
           	return;
           }
           for_each((*sysEvents).cbegin(), (*sysEvents).cend(), [](const HiSysEventRecord& event) {
               std::cout << event.AsJson() << std::endl;
           });
       }
   
       void OnComplete(int32_t reason, int32_t total) override
       {
           std::cout << "Query completed" << std::endl;
           return;
       }
   };
D
duangavin123 已提交
180 181
   ```

182
3. 最后,在需要查询的地方调用查询接口,并传入相应的查询参数、查询规则、查询回调参数。
183

184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
   ```c++
   // 创建查询参数对象
   long long startTime = 0;
   long long endTime = 1668245644000; //2022-11-12 09:34:04
   int queryCount = 10;
   QueryArg arg(startTime, endTime, queryCount);
   
   // 创建查询规则对象
   QueryRule rule("HIVIEWDFX", { "PLUGIN_LOAD" });
   std::vector<QueryRule> queryRules = { rule };
   
   // 创建查询回调对象
   auto queryCallback = std::make_shared<TestQueryCallback>();
   
   // 调用查询接口
   HiSysEventManager::Query(arg, queryRules, queryCallback);
D
duangavin123 已提交
200 201
   ```

202 203 204
#### C HiSysEvent查询开发步骤

1. 首先,需要引入对应的头文件。
205

206 207
   ```c++
   #include "hisysevent_manager_c.h"
D
duangavin123 已提交
208
   ```
209

210 211 212 213
2. 然后,业务领域需要实现对应的查询回调接口。

   ```c++
   void OnQueryTest(HiSysEventRecord records[], size_t size)
D
duangavin123 已提交
214
   {
215 216
       for (size_t i = 0; i < size; i++) {
           printf("OnQuery: event=%s", records[i].jsonStr);
217
       }
D
duangavin123 已提交
218
   }
219 220
   
   void OnCompleteTest(int32_t reason, int32_t total)
D
duangavin123 已提交
221
   {
222
       printf("OnCompleted, res=%d, total=%d\n", reason, total);
D
duangavin123 已提交
223 224 225
   }
   ```

226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
3. 最后,在需要查询的地方调用查询接口,并传入相应的查询参数、查询规则、查询回调参数。

   ```c++
   // 创建查询参数对象
   HiSysEventQueryArg arg;
   arg.beginTime = 0;
   arg.endTime = 1668245644000; //2022-11-12 09:34:04
   arg.maxEvents = 10;
   
   // 创建查询规则对象
   constexpr char TEST_DOMAIN[] = "HIVIEWDFX";
   constexpr char TEST_NAME[] = "PLUGIN_LOAD";
   HiSysEventQueryRule rule;
   (void)strcpy_s(rule.domain, strlen(TEST_DOMAIN) + 1, TEST_DOMAIN);
   (void)strcpy_s(rule.eventList[0], strlen(TEST_NAME) + 1, TEST_NAME);
   rule.eventListSize = 1;
   rule.condition = nullptr;
   HiSysEventQueryRule rules[] = { rule };
   
   // 创建查询回调对象
   HiSysEventQueryCallback callback;
   callback.OnQuery = OnQueryTest;
   callback.OnComplete = OnCompleteTest;
   
   // 调用查询接口
   OH_HiSysEvent_Query(arg, rules, sizeof(rules) / sizeof(HiSysEventQueryRule), callback);
D
duangavin123 已提交
252
   ```
253 254 255 256 257 258 259 260 261 262

### 开发实例

#### C++ HiSysEvent查询开发实例

假设业务模块需要查询截止至当前时间、事件领域为HIVIEWDFX、事件名称为PLUGIN_LOAD的所有事件,其完整使用示例如下所示:

1. 首先,需要在业务模块的在BUILD.gn里增加hisysevent_native部件的libhisysevent及libhisyseventmanager依赖。

   ```c++
263 264 265 266
   external_deps = [
     "hisysevent_native:libhisysevent",
     "hisysevent_native:libhisyseventmanager",
   ]
D
duangavin123 已提交
267
   ```
D
duangavin123 已提交
268

269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387
2. 在业务模块的TestQuery()函数中,调用查询接口去查询事件。
   
   ```c++
   #include "hisysevent_manager.h"
   #include <iostream>
   #include <unistd.h>
   
   using namespace OHOS::HiviewDFX;
   
   class TestQueryCallback : public HiSysEventQueryCallback {
   public:
       void OnQuery(std::shared_ptr<std::vector<HiSysEventRecord>> sysEvents) override
       {
           if (sysEvents == nullptr) {
           	return;
           }
           for_each((*sysEvents).cbegin(), (*sysEvents).cend(), [](const HiSysEventRecord& event) {
               std::cout << event.AsJson() << std::endl;
           });
       }
   
       void OnComplete(int32_t reason, int32_t total) override
       {
           std::cout << "Query completed" << std::endl;
           return;
       }
   };
   
   int64_t GetMilliseconds()
   {
       auto now = std::chrono::system_clock::now();
       auto millisecs = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
       return millisecs.count();
   }
   
   void TestQuery()
   {
       // 创建查询参数对象
       long long startTime = 0;
       long long endTime = GetMilliseconds();
       int maxEvents = 100;
       QueryArg arg(startTime, endTime, maxEvents);
   
       // 创建查询规则对象
       QueryRule rule("HIVIEWDFX", { "PLUGIN_LOAD" });
       std::vector<QueryRule> queryRules = { rule };
   
       // 创建查询回调对象
       auto queryCallback = std::make_shared<TestQueryCallback>();
   
       // 调用查询接口
       int ret = HiSysEventManager::Query(arg, queryRules, queryCallback);
   }
   ```

#### C HiSysEvent查询开发实例

假设业务模块需要查询截止至当前时间、事件领域为HIVIEWDFX、事件名称为PLUGIN_LOAD的所有事件,其完整使用示例如下所示:

1. 首先,需要在业务模块的在BUILD.gn里增加hisysevent_native部件的libhisyseventmanager依赖。

   ```c++
   external_deps = [ "hisysevent_native:libhisyseventmanager" ]
   
   // for strcpy_s
   deps = [ "//third_party/bounds_checking_function:libsec_shared" ]
   ```

2. 在业务模块的TestQuery()函数中,调用查询接口去查询事件。

   ```c++
   #include "hisysevent_manager_c.h"
   #include <securec.h>
   #include <time.h>
     
   void OnQueryTest(HiSysEventRecord records[], size_t size)
   {
       for (size_t i = 0; i < size; i++) {
           printf("OnQuery: event=%s", records[i].jsonStr);
       }
   }
   
   void OnCompleteTest(int32_t reason, int32_t total)
   {
       printf("OnCompleted, res=%d, total=%d\n", reason, total);
   }
   
   int64_t GetMilliseconds()
   {
       return time(NULL);
   }
   
   void TestQuery()
   {
       // 创建查询参数对象
       HiSysEventQueryArg arg;
       arg.beginTime = 0;
       arg.endTime = GetMilliseconds();
       arg.maxEvents = 100;
   
       // 创建查询规则对象
       constexpr char TEST_DOMAIN[] = "HIVIEWDFX";
       constexpr char TEST_NAME[] = "PLUGIN_LOAD";
       HiSysEventQueryRule rule;
       (void)strcpy_s(rule.domain, strlen(TEST_DOMAIN) + 1, TEST_DOMAIN);
       (void)strcpy_s(rule.eventList[0], strlen(TEST_NAME) + 1, TEST_NAME);
       rule.eventListSize = 1;
       rule.condition = nullptr;
       HiSysEventQueryRule rules[] = { rule };
   
       // 创建查询回调对象
       HiSysEventQueryCallback callback;
       callback.OnQuery = OnQueryTest;
       callback.OnComplete = OnCompleteTest;
   
       // 调用查询接口
       int ret = OH_HiSysEvent_Query(arg, rules, sizeof(rules) / sizeof(HiSysEventQueryRule), callback);
   }
   ```