鸿蒙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]