HarmonyOS应用事件打点开发指导

代码浮尘
• 阅读 233

简介
传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志,难以识别其中的关键信息。因此,应用开发者需要一种数据打点机制,用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。

HiAppEvent 是在系统层面为应用开发者提供的一种事件打点机制,用于帮助应用记录在运行过程中发生的故障信息、统计信息、安全信息、用户行为信息,以支撑开发者分析应用的运行情况。

基本概念
● 打点

记录由用户操作引起的变化,提供业务数据信息,以供开发、产品、运维分析。

事件设计规范
● 事件领域:用于标识事件的领域,建议设置为业务模块名称,以便于区分不同的业务模块。

● 事件名称:用于指定事件的名称,建议设置为具体的业务名称,以便于描述实际的业务意义。

● 事件类型:用于指定事件的类型,支持以下四种类型事件:行为事件:用于记录用户日常操作行为的事件,例如按钮点击、界面跳转等行为。

○ 故障事件:用于定位和分析应用故障的事件,例如界面卡顿、掉网掉话等异常。

○ 统计事件:用于统计和度量应用关键行为的事件,例如对使用时长、访问数等的统计。

○ 安全事件:用于记录涉及应用安全行为的事件,例如密码修改、用户授权等行为。

● 事件参数:用于指定事件的参数,每个事件可以包含一组参数,建议设置为事件属性或事件发生上下文信息,以便于描述事件的详细信息。

接口说明
应用事件打点接口由 hiAppEvent 模块提供,API 接口的具体使用说明(参数使用限制、具体取值范围等)请参考应用事件打点 API 文档

打点接口功能介绍:
HarmonyOS应用事件打点开发指导

订阅接口功能介绍:
HarmonyOS应用事件打点开发指导

开发步骤
以实现对用户点击按钮行为的事件打点及订阅为例,说明开发步骤。

1.  新建一个 ArkTS 应用工程,编辑工程中的“entry > src > main > ets > entryability > EntryAbility.ts” 文件,在 onCreate 函数中添加对用户点击按钮事件的订阅,完整示例代码如下:

import hilog from '@ohos.hilog';
import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window'
import hiAppEvent from '@ohos.hiviewdfx.hiAppEvent'

export default class EntryAbility extends UIAbility {
    onCreate(want, launchParam) {
        hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO);
        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
        hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? '');
        hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:' + JSON.stringify(launchParam) ?? '');
        hiAppEvent.addWatcher({
            // 开发者可以自定义观察者名称,系统会使用名称来标识不同的观察者
            name: "watcher1",
            // 开发者可以订阅感兴趣的应用事件,此处是订阅了按钮事件
            appEventFilters: [{ domain: "button" }],
            // 开发者可以设置订阅回调触发的条件,此处是设置为事件打点数量满足1个
            triggerCondition: { row: 1 },
            // 开发者可以自行实现订阅回调函数,以便对订阅获取到的事件打点数据进行自定义处理
            onTrigger: function (curRow, curSize, holder) {
                // 返回的holder对象为null,表示订阅过程发生异常,因此在记录错误日志后直接返回
                if (holder == null) {
                    hilog.error(0x0000, 'testTag', "HiAppEvent holder is null")
                    return
                }
                let eventPkg = null
                // 根据设置阈值大小(默认为512KB)去获取订阅事件包,直到将订阅数据全部取出
                // 返回的事件包对象为null,表示当前订阅数据已被全部取出,此次订阅回调触发结束
                while ((eventPkg = holder.takeNext()) != null) {
                    // 开发者可以对事件包中的事件打点数据进行自定义处理,此处是将事件打点数据打印在日志中
                    hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.packageId=%{public}d`, eventPkg.packageId)
                    hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.row=%{public}d`, eventPkg.row)
                    hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.size=%{public}d`, eventPkg.size)
                    for (const eventInfo of eventPkg.data) {
                        hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.info=%{public}s`, eventInfo)
                    }
                }
            }
        })
    }
}
  1. 编辑工程中的“entry > src > main > ets > pages > Index.ets” 文件,添加一个按钮并在其 onClick 函数中进行事件打点,以记录按钮点击事件,完整示例代码如下:
import hiAppEvent from '@ohos.hiviewdfx.hiAppEvent'
import hilog from '@ohos.hilog'

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Button("writeTest").onClick(()=>{
          // 在按钮点击函数中进行事件打点,以记录按钮点击事件
          hiAppEvent.write({
            // 事件领域定义
            domain: "button",
            // 事件名称定义
            name: "click",
            // 事件类型定义
            eventType: hiAppEvent.EventType.BEHAVIOR,
            // 事件参数定义
            params: { click_time: 100 }
          }).then(() => {
            hilog.info(0x0000, 'testTag', `HiAppEvent success to write event`)
          }).catch((err) => {
            hilog.error(0x0000, 'testTag', `HiAppEvent err.code: ${err.code}, err.message: ${err.message}`)
          })
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}
  1. 点击 IDE 界面中的运行按钮,运行应用工程,然后在应用界面中点击按钮“writeTest”,触发一次按钮点击事件打点。
  1. 最终,可以在 Log 窗口看到按钮点击事件打点成功的日志,以及触发订阅回调后对打点事件数据的处理日志:
HiAppEvent success to write event

HiAppEvent eventPkg.packageId=0
HiAppEvent eventPkg.row=1
HiAppEvent eventPkg.size=124
HiAppEvent eventPkg.info={"domain_":"button","name_":"click","type_":4,"time_":1670268234523,"tz_":"+0800","pid_":3295,"tid_
点赞
收藏
评论区
推荐文章
芝士年糕 芝士年糕
3年前
rsyslog详解
这边使用的是3A服务器一、日志介绍日志概念日志是系统用来记录系统及应用程序运行时的一些相关信息的文本文件日志作用日志是为了保存相关程序的运行状态、错误信息等,为了对系统进行分析、保存历史记录以及在出现错误时发现、分析错误使用linux系统日志类型内核信息服务信息应用程序信息二、rsyslog1、rsyslog介绍rsyslog是linux系统中用来实现日志功
Stella981 Stella981
4年前
Linux日志管理
日志是用来记录系统运行状态的历史事件,主要记录特定时间发生的事件,同时根据日志级别,事件的关键性程序,通常叫作LogLevel.系统日志服务syslog:系统级别:syslogd内核级别:klogdrsyslog特点:多线程:UDP,TCP,SSL
Wesley13 Wesley13
4年前
MySQL Binlog 技术原理和业务应用案例分析
导语MySQLBinlog用于记录用户对数据库操作的结构化查询语言(StructuredQueryLanguage,SQL)语句信息。是MySQL数据库的二进制日志,可以使用mysqlbin命令查看二进制日志的内容。爱奇艺在会员订单系统使用到了MySQLBinlog,用来实现订单事件驱动。在使用Binlog后在简化系统设计的同
Stella981 Stella981
4年前
JVM CPU Profiler技术原理及源码深度解析
研发人员在遇到线上报警或需要优化系统性能时,常常需要分析程序运行行为和性能瓶颈。Profiling技术是一种在应用运行时收集程序相关信息的动态分析手段,常用的JVMProfiler可以从多个方面对程序进行动态分析,如CPU、Memory、Thread、Classes、GC等,其中CPUProfiling的应用最为广泛。CPUProfiling经常被用于
Stella981 Stella981
4年前
Guava中的EventBus
其实代码中经常会遇到跟主流程分支出去的异步逻辑,比如说:爬虫处理逻辑中,进行心跳打点,订单处理中,需要触发用户的个人信息变更等。这个时候就应该使用观察者模式。EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建
Stella981 Stella981
4年前
JavaScript 基础
1.简介:  JavaScript(JS)是一种基于对象和事件驱动,可以与HTML标记语言混合使用的脚本语言。广泛用于客户端Web开发,常用来给HTML网页添加动态功能,比如响应用户的各种操作。其编写的程序可以直接在浏览器中解释执行。Javascript的国际标准是ECMAScript(由欧洲计算机制造商协会(ECMA)结合J
绣鸾 绣鸾
2年前
CrossOver for Mac(Mac安装Windows应用)
是一款由CodeWeavers开发的跨平台兼容软件。它允许用户在不同的操作系统上运行Windows应用程序,如Mac、Linux和ChromeOS等。CrossOver基于开源的Wine项目,提供了一种简单而有效的方式来在非Windows操作系统上运行Wi
MYSQL 事务的底层原理 | 京东物流技术团队
事务的底层原理在事务的实现机制上,MySQL采用的是WAL:Writeaheadlogging,预写式日志,机制来实现的。在使用WAL的系统中,所有的修改都先被写入到日志中,然后再被应用到系统中。通常包含redo和undo两部分信息。为什么需要使用WAL,
日志框架简介-Slf4j+Logback入门实践 | 京东云技术团队
前言随着互联网和大数据的迅猛发展,分布式日志系统和日志分析系统已广泛应用,几乎所有应用程序都使用各种日志框架记录程序运行信息。因此,作为工程师,了解主流的日志记录框架非常重要。虽然应用程序的运行结果不受日志的有无影响,但没有日志的应用程序是不完整的,甚至可
日志框架简介-Slf4j+Logback入门实践
作者:京东零售张洪前言随着互联网和大数据的迅猛发展,分布式日志系统和日志分析系统已广泛应用,几乎所有应用程序都使用各种日志框架记录程序运行信息。因此,作为工程师,了解主流的日志记录框架非常重要。虽然应用程序的运行结果不受日志的有无影响,但没有日志的应用程序
代码浮尘
代码浮尘
Lv1
故国三千里,深宫二十年。
文章
5
粉丝
0
获赞
0