汕尾海湾 发表于 2024-11-9 11:08:01

鸿蒙OpenHarmony【HiSysEvent订阅】子系统DFX

概述

功能简介

HiSysEvent提供了跨历程订阅机制,开发者可以通过注册订阅接口实时获取关注的事故,例如电池模块订阅功耗相干的事故,用于分析耗电情况。
约束与限制

在订阅HiSysEvent事故之前,需要先完成HiSysEvent打点设置
开发引导

接口阐明

C++接口阐明

C++ HiSysEvent订阅开发能力如下:HiSysEventManager类,具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。
表1 HiSysEvent订阅接口
接口名称描述int32_t HiSysEventManager::AddListener(std::shared_ptr listener,  std::vector& rules)接口功能:添加对系统事故的订阅,通过设置规则订阅某些特定的事故。 输入参数: - listener:订阅回调对象。 - rules:事故订阅规则。 返回值: - 0:订阅添加乐成。 - 负值:订阅添加失败。int32_t HiSysEventManager::RemoveListener(std::shared_ptr listener)接口功能:移除对系统事故的订阅。 输入参数: - listener:订阅回调对象。 返回值: - 0:订阅移除乐成。 - 负值:订阅移除失败。 表2 ListenerRule订阅规则对象
接口名称描述ListenerRule(const std::string& tag,  RuleType ruleType = RuleType::WHOLE_WORD)接口功能:订阅规则构造函数,创建事故标签订阅规则对象。 输入参数: - tag:订阅规则中指定的系统事故标签,字符串类型,最大长度16个字符(含),有用字符包含巨细写字母及数字。 - ruleType:订阅规则的规则类型,RuleType罗列类型(参考表3)。ListenerRule(const std::string& domain,  const std::string& eventName,  RuleType ruleType = RuleType::WHOLE_WORD)接口功能:订阅规则构造函数,创建事故领域与事故名称订阅规则对象。 输入参数: - domain:订阅规则中指定的系统事故领域,字符串类型,最大长度16个字符(含),有用字符包含大写字母、数字及下划线。 - eventName:订阅规则中指定的系统事故名称,字符串类型,最大长度32个字符(含),有用字符包含大写字母、数字及下划线。 - ruleType:订阅规则的规则类型,RuleType罗列类型(参考表3)。ListenerRule(const std::string& domain,  const std::string& eventName,  const std::string& tag,  RuleType ruleType = RuleType::WHOLE_WORD)接口功能:订阅规则构造函数,创建事故领域、事故名称,事故标签订阅规则对象。 输入参数: - domain:订阅规则中指定的系统事故领域,字符串类型,最大长度16个字符(含),有用字符包含大写字母、数字及下划线。 - eventName:订阅规则中指定的系统事故名称,字符串类型,最大长度32个字符(含),有用字符包含大写字母、数字及下划线。 - tag:订阅规则中指定的系统事故标签,字符串类型,最大长度16个字符(含),有用字符包含巨细写字母及数字。 - ruleType:订阅规则的规则类型,RuleType罗列类型。 表3 HiSysEventListener订阅对象
接口名称描述void HiSysEventListener::OnEvent(std::shared_ptr sysEvent)接口功能:订阅事故的回调接口。 输入参数: - sysEvent:订阅到的实时系统事故。 返回值: 无。void HiSysEventListener::OnServiceDied()接口功能:服务异常回调。 输入参数: 无。 返回值: 无。 表4 HiSysEventRecord系统事故对象
接口名称描述std::string HiSysEventRecord::AsJson()接口功能:获取该系统事故的内容。 输入参数: 无。 返回值: 该系统事故的内容。std::string HiSysEventRecord::GetDomain()接口功能:获取该系统事故的域名。 输入参数: 无。 返回值: 该系统事故的域名。std::string HiSysEventRecord::GetEventName()接口功能:获取该系统事故的名称。 输入参数: 无。 返回值: 该系统事故的名称。HiSysEvent::EventType HiSysEventRecord::GetEventType()接口功能:获取该系统事故的类型。 输入参数: 无。 返回值: 该系统事故的类型。std::string HiSysEventRecord::GetLevel()接口功能:获取该系统事故的级别。 输入参数: 无。 返回值: 该系统事故的级别。std::string HiSysEventRecord::GetTag()接口功能:获取该系统事故的标签。 输入参数: 无。 返回值: 该系统事故的标签。std::string HiSysEventRecord::GetTimeZone()接口功能:获取该系统事故的时区。 输入参数: 无。 返回值: 时区内容,格式为“+0800”。int HiSysEventRecord::GetTraceFlag()接口功能:获取该系统事故的分布式跟踪标志位。 输入参数: 无。 返回值: 分布式跟踪标志位。int64_t HiSysEventRecord::GetPid()接口功能:获取落盘该系统事故的历程ID。 输入参数: 无。 返回值: 历程ID。int64_t HiSysEventRecord::GetTid()接口功能:获取落盘该系统事故的线程ID。 输入参数: 无。 返回值: 线程ID。int64_t HiSysEventRecord::GetUid()接口功能:获取落盘该系统事故的用户ID。 输入参数: 无。 返回值: 用户ID。uint64_t HiSysEventRecord::GetPspanId()接口功能:获取该系统事故的分布式跟踪父分支ID。 输入参数: 无。 返回值: 分布式跟踪父分支ID。uint64_t HiSysEventRecord::GetSpandId()接口功能:获取该系统事故的分布式跟踪分支ID。 输入参数: 无。 返回值: 分布式跟踪分支ID。uint64_t HiSysEventRecord::GetTime()接口功能:获取该系统事故的时间戳。 输入参数: 无。 返回值: 时间戳。uint64_t HiSysEventRecord::GetTraceId()接口功能:获取该系统事故的分布式跟踪链ID。 输入参数: 无。 返回值: 分布式跟踪链ID。void HiSysEventRecord::GetParamNames(std::vectorstd::string& params)接口功能:获取该系统事故的所有键名。 输入参数: - params:键名数组引用。 返回值: 无。int HiSysEventRecord::GetParamValue(const std::string& param, int64_t& value)接口功能:将该系统事故键名为param的值解析为int64_t类型的值。 输入参数: - param:键名。 - value:int64_t类型引用。 返回值: - 0:解析乐成。 - -1:该系统事故初始化失败,无法解析。 - -2:不存在的键名。 - -3:类型不匹配,无法转换成int64_t类型的值。int HiSysEventRecord::GetParamValue(const std::string& param, uint64_t& value)接口功能:将该系统事故键名为param的值解析为uint64_t类型的值。 输入参数: - param:键名。 - value:uint64_t类型引用。 返回值: - 0:解析乐成。 - -1:该系统事故初始化失败,无法解析。 - -2:不存在的键名。 - -3:类型不匹配,无法转换成uint64_t类型的值。int HiSysEventRecord::GetParamValue(const std::string& param, double& value)接口功能:将该系统事故键名为param的值解析为double类型的值。 输入参数: - param:键名。 - value:double类型引用。 返回值: - 0:解析乐成。 - -1:该系统事故初始化失败,无法解析。 - -2:不存在的键名。 - -3:类型不匹配,无法转换成double类型的值。int HiSysEventRecord::GetParamValue(const std::string& param, std::string& value)接口功能:将该系统事故键名为param的值解析为string类型的值。 输入参数: - param:键名。 - value:std::string类型引用。 返回值: - 0:解析乐成。 - -1:该系统事故初始化失败,无法解析。 - -2:不存在的键名。 - -3:类型不匹配,无法转换成std::string类型的值。int HiSysEventRecord::GetParamValue(const std::string& param, std::vector<int64_t>& value)接口功能:将该系统事故键名为param的值解析为int64_t类型的数组。 输入参数: - param:键名。 - value:int64_t类型数组引用。 返回值: - 0:解析乐成。 - -1:该系统事故初始化失败,无法解析。 - -2:不存在的键名。 - -3:类型不匹配,无法转换成int64_t类型的数组。int HiSysEventRecord::GetParamValue(const std::string& param, std::vector<uint64_t>& value)接口功能:将该系统事故键名为param的值解析为uint64_t类型的数组。 输入参数: - param:键名。 - value:uint64_t类型数组引用。 返回值: - 0:解析乐成。 - -1:该系统事故初始化失败,无法解析。 - -2:不存在的键名。 - -3:类型不匹配,无法转换成uint64_t类型的数组。int HiSysEventRecord::GetParamValue(const std::string& param, std::vector& value)接口功能:将该系统事故键名为param的值解析为double类型的数组。 输入参数: - param:键名。 - value:ouble类型数组引用。 返回值: - 0:解析乐成。 - -1:该系统事故初始化失败,无法解析。 - -2:不存在的键名。 - -3:类型不匹配,无法转换成double类型的数组。int HiSysEventRecord::GetParamValue(const std::string& param, std::vectorstd::string& value)接口功能:将该系统事故键名为param的值解析为string类型的数组。 输入参数: - param:键名。 - value:std::string类型数组引用。 返回值: - 0:解析乐成。 - -1:该系统事故初始化失败,无法解析。 - -2:不存在的键名。 - -3:类型不匹配,无法转换成std::string类型的数组。 C接口阐明

C HiSysEvent订阅开发能力如下:具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。
表5 HiSysEvent订阅接口
接口名称描述int OH_HiSysEvent_Add_Watcher(HiSysEventWatcher* watcher, HiSysEventWatchRule rules[], size_t ruleSize);接口功能:添加对系统事故的订阅,通过设置规则订阅某些特定的事故。 输入参数: - watcher:订阅回调对象。 - rules:事故订阅规则数组。 - ruleSize:事故订阅规则数组长度。 返回值: - 0:订阅添加乐成。 - 负值:订阅添加失败。int OH_HiSysEvent_Remove_Watcher(HiSysEventWatcher* watcher);接口功能:移除对系统事故的订阅。 输入参数: - watcher:订阅回调对象。 返回值: - 0:订阅移除乐成。 - 负值:订阅移除失败。 表6 HiSysEventWatcher订阅回调结构体
属性名称属性类型描述OnEventvoid (*)(HiSysEventRecord record);接口功能:订阅事故的回调接口。 输入参数: - record:订阅到的实时系统事故。 返回值: 无。OnServiceDiedvoid (*)();接口功能:服务异常回调。 输入参数: 无。 返回值: 无。 表7 HiSysEventWatchRule订阅规则结构体
属性名称属性类型描述domainchar[]用来指定订阅的系统事故领域。namechar[]用来指定订阅的系统事故名称。tagchar[]用来指定订阅的系统事故标签。ruleTypeint用于指定订阅事故的匹配规则,取值请参考中的“表4 RuleType匹配规则类型罗列”。eventTypeint用于指定订阅事故的事故类型,取值请参考中的“表3 EventType事故类型罗列”,当取值0,体现订阅所有的事故类型。 开发步骤

C++ HiSysEvent订阅开发步骤


[*] 引入对应的头文件。
#include "hisysevent_manager.h"

[*] 业务领域实现对应的订阅回调接口。
class TestListener : public OHOS::HiviewDFX::HiSysEventListener {
public:
    void OnEvent(std::shared_ptr<HiSysEventRecord> record)
    {
      if (record == nullptr) {
            return;
      }
      std::cout << record->AsJson() << std::endl;
    }

    void OnServiceDied()
    {
      std::cout << std::string("service disconnect, exit") << std::endl;
      exit(0);
    }
};

[*] 在订阅事故的地方调用订阅接口,并传入相应的订阅回调参数、订阅规则列表,在业务竣事,注销此次订阅。
auto testListener = std::make_shared<TestListener>();
// 事件标签规则订阅,规则类型为默认的全词匹配类型
ListenerRule tagRule("dfx");
// 事件标签规则订阅,规则类型为正则匹配类型
ListenerRule regRule("dfx.*", RuleType::REGULAR);
// 事件领域及事件名称规则订阅,规则类型为前缀匹配类型
ListenerRule domainNameRule("HIVIEWDFX", "APP_USAGE", RuleType::PREFIX);
std::vector<ListenerRule> sysRules;
sysRules.push_back(tagRule);
sysRules.push_back(regRule);
sysRules.push_back(domainNameRule);
// 开始系统事件订阅
auto ret = HiSysEventManager::AddListener(testListener, sysRules);
// 订阅结束,移除订阅回调参数。
if (ret == 0) {
   HiSysEventManager::RemoveListener(testListener);
}

C HiSysEvent订阅开发步骤


[*] 引入对应的头文件。
#include "hisysevent_manager_c.h"

[*] 业务领域实现对应的订阅回调接口。
void OnEventTest(HiSysEventRecord record)
{
    printf("OnEventTest: event=%s", record.jsonStr);
}

void OnServiceDiedTest()
{
    printf("OnServiceDied");
}

[*] 在订阅事故的地方调用订阅接口,并传入相应的订阅回调参数、订阅规则列表,在业务竣事,注销此次订阅。
HiSysEventWatcher watcher;
watcher.OnEvent = OnEventTest;
watcher.OnServiceDied = OnServiceDiedTest;
// 事件标签规则订阅,规则类型为默认的全词匹配类型
constexpr char DFX_TAG[] = "dfx";
HiSysEventWatchRule tagRule;
(void)strcpy_s(tagRule.tag, strlen(DFX_TAG) + 1, DFX_TAG);
tagRule.ruleType = 1;
tagRule.eventType = 0;
// 事件标签规则订阅,规则类型为正则匹配类型
constexpr char DFX_PATTERN_TAG[] = "dfx.*";
HiSysEventWatchRule regRule;
(void)strcpy_s(regRule.tag, strlen(DFX_PATTERN_TAG) + 1, DFX_PATTERN_TAG);
regRule.ruleType = 3;
regRule.eventType = 0;
// 事件领域及事件名称规则订阅,规则类型为前缀匹配类型
constexpr char DOMAIN[] = "HIVIEWDFX";
constexpr char NAME[] = "APP_USAGE";
HiSysEventWatchRule domainNameRule;
(void)strcpy_s(domainNameRule.domain, strlen(DOMAIN) + 1, DOMAIN);
(void)strcpy_s(domainNameRule.name, strlen(NAME) + 1, NAME);
domainNameRule.ruleType = 2;
domainNameRule.eventType = 0;
// 开始系统事件订阅
HiSysEventWatchRule rules[] = {tagRule, regRule, domainNameRule};
int ret = OH_HiSysEvent_Add_Watcher(&watcher, rules, sizeof(rules) / sizeof(HiSysEventWatchRule));
// 订阅结束,移除订阅回调参数。
if (ret == 0) {
    ret = OH_HiSysEvent_Remove_Watcher(&watcher);
}

开发实例

C++ HiSysEvent订阅开发实例

假设业务模块需要订阅事故领域为HIVIEWDFX、事故名称为PLUGIN_LOAD的所有事故,其完整使用示例如下所示:

[*] 在业务模块的在BUILD.gn里增加hisysevent部件的libhisysevent及libhisyseventmanager依靠。
external_deps = [
"hisysevent:libhisysevent",
"hisysevent:libhisyseventmanager",
]

[*] 在业务模块的TestEventListening()函数中,调用订阅接口去订阅事故,业务竣事时移除事故订阅。
#include <iostream>#include "hisysevent_manager.h"
using namespace OHOS::HiviewDFX;class TestListener : public HiSysEventQueryCallback {public:    void OnEvent(std::shared_ptr<HiSysEventRecord> record)    {      if (record == nullptr) {            return;      }      std::cout << record->AsJson() << std::endl;    }    void OnServiceDied()    {      std::cout << std::string("service disconnect, exit") << std::endl;      exit(0);    }};void TestEventListening(){    auto testListener = std::make_shared<TestListener>();    ListenerRule domainNameRule("HIVIEWDFX", "PLUGIN_LOAD", RuleType::WHOLE_WORD);    std::vector<ListenerRule> sysRules;    sysRules.push_back(domainNameRule);    auto ret = HiSysEventManager::AddListener(testListener, sysRules);    if (ret == 0) {      HiSysEventManager::RemoveListener(testListener);    }}
C HiSysEvent订阅开发实例

假设业务模块需要订阅事故领域为HIVIEWDFX、事故名称为PLUGIN_LOAD的所有事故,其完整使用示例如下所示:

[*] 在业务模块的在BUILD.gn里增加hisysevent部件的libhisysevent及libhisyseventmanager依靠。
external_deps = [ "hisysevent:libhisyseventmanager" ]

// for strcpy_s
deps = [ "//third_party/bounds_checking_function:libsec_shared" ]

[*] 在业务模块的TestEventListening()函数中,调用订阅接口去订阅事故,业务竣事时移除事故订阅。
#include <securec.h>#include "hisysevent_manager_c.h"
void OnEventTest(HiSysEventRecord record)
{
    printf("OnEventTest: event=%s", record.jsonStr);
}

void OnServiceDiedTest()
{
    printf("OnServiceDied");
}
void TestEventListening(){    HiSysEventWatcher watcher;    watcher.OnEvent = OnEventTest;    watcher.OnServiceDied = OnServiceDiedTest;    constexpr char DOMAIN[] = "HIVIEWDFX";    constexpr char NAME[] = "PLUGIN_LOAD";    HiSysEventWatchRule domainNameRule;    (void)strcpy_s(domainNameRule.domain, strlen(DOMAIN) + 1, DOMAIN);    (void)strcpy_s(domainNameRule.name, strlen(NAME) + 1, NAME);    domainNameRule.ruleType = 1;    domainNameRule.eventType = 0;    HiSysEventWatchRule rules[] = {domainNameRule};    int ret = OH_HiSysEvent_Add_Watcher(&watcher, rules, sizeof(rules) / sizeof(HiSysEventWatchRule));    if (ret == 0) {       ret = OH_HiSysEvent_Remove_Watcher(&watcher);   }}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 鸿蒙OpenHarmony【HiSysEvent订阅】子系统DFX