曙光埋点 是一套全链路埋点方案,从埋点设计、到客户端三端(iOS、Android、H5)开发、以及埋点校验&稽查、再到埋点数据使用,目前已经广泛应用于云音乐各个主要APP,它集自动化埋点与全链路追踪等特点于一身,近乎完美地解决了传统埋点的所有痛点,兼顾了开发效率与埋点数据的高精度特点。
相比同类竞品的方案,曙光埋点有如下优势
- 规范化: 客户端开发时,格式、参数(公共参数、SDK保留参数、参数类型/格式等)、埋点时机,双端规范统一化,可无缝对接H5、RN等
- 链路追踪: 全链路级别的链路追踪能力,助力绘制用户画像,满足你漏斗分析、个性化推荐、实时分析、离线分析
- 对象化-虚拟树VTree: 从埋点录入人员,到客户端埋点开发人员,我们面向的是一个个的对象
- 埋点数据管理: 埋点虚拟树、埋点对象的可视化管理,涵盖着多版本并行开发管理,告别埋点管理混乱
- 埋点校验&稽查: 线下埋点校验,和线上埋点稽查,同时配备了可供开发/测试方便的客户端层面的可视化工具,保障埋点质量
- iOS SDK
- Android SDK
- H5 SDK(可用于站内/站外)
- Easyinsight埋点管理平台
这个是一个容器级别的壳子工程,以 git submodule 的形式管理其他子项目,子项目包括如下:
- iOS SDK: EventTracing-iOS, Debug工具 EventTracing-iOS-Debug, 埋点校验工具 EventTracing-iOS-LogViewer
- Android SDK: EventTracing-Android
- H5 SDK: EventTracing-web
- 埋点平台 easyinsight-server: easyinsight-server
- 埋点平台 easyinsight-front: easyinsight-front
曙光端侧SDK非常轻量,代码里只有数千行,对APP包体积占用非常小,对原有业务也不会增加额外的负担,这一点在云音乐等业内非常成熟的产品环境得到有力验证。它的接入也十分简单,您只需要根据下述文档即可在很短时间内完成功能的接入与使用。
几乎全自动的链接追踪,开发人员几乎不需要额外的工作,强大又简单。 有关链接跟踪原理的更多介绍,请参阅以下文档 Link Tracking Introduction
- 官方Demo 包含常见场景的使用演示,以及丰富的单元测试
- 快速开始 包含基本场景的SDK接入,以及简单场景的使用
- 曙光接入 包含详细的接入手册,以及各项能力解析
- SDK的详细使用,参见 iOS SDK详细使用,Android SDK详细使用,H5 SDK详细使用
iOS
使用 cocoapods 接入
# 埋点SDK
pod 'EventTracing-iOS'
# 调试工具
pod 'EventTracing-iOS-Debug', :configurations => ["Debug"]
# 埋点校验工具
pod 'EventTracing-iOS-LogViewer', :configurations => ["Debug"]
Android
build.gradle(project)
buildscript {
repositories {
........
maven {
url './repo'
}
}
dependencies {
.......
classpath "com.netease.cloudmusic.plugin:datareport-plugin:1.0.0"
}
}
build.gradle(app)
......
apply plugin: 'datareport-plugin'
dataReportConfig {
targetPackages = ['androidx/appcompat', 'androidx/recyclerview/widget', 'androidx/viewpager/widget','com/netease/datareport/demo']
excludePackages = []
openDebugLog = true
}
dependencies {
......
implementation project(':datareport')
implementation project(':datareport_debug')
}
曙光埋点的启动十分简单,您只需要在APP启动时的合适时机(比如 didFinishLaunch
加入如下代码,进行一些简单配置,即可完成SDK的启动
iOS
[[EventTracingEngine sharedInstance] startWithContextBuilder:^(id<EventTracingContextBuilder> _Nonnull builder) {
// output channel
[builder addOutputChannel:self];
}];
Android
DataReport.getInstance().init(DataReportInner.getInstance(), context,Configuration.builder() //进行一些设置
.build())
H5
Dawn.init({
... // 其他参数
reportLogs: ({ logs }) => {
// 发送 http 请求或通过客户端协议上报 logs
},
});
- 启动SDK后,需要将目标元素设置上合适的oid,oid的类型分为2种:
page
和element
- 这取决于BI对节点如何定义,一般来说某个独立的
XXViewController
建议配置为xx_page
的页面节点类型 - 而
按钮、UI组件
等适合设置为xx_btn
xx_cell
的element节点。
但是每个页面的顶层节点必须被设置为page节点,并且它默认情况下会自动成为根节点
设置 page 节点
可以给 UIViewController 设置 page 节点,等价于给 vc.view 设置
iOS
/* The following two methods are equivalent */
// Set page node for vc
[EventTracingBuilder viewController:self pageId:@"page_list"];
// set page node for view
[EventTracingBuilder view:vc. view pageId:@"page_list"];
Android
NodeBuilder.getNodeBuilder(Activity).setPageId("pageId")
H5
export default () => {
return (
<div
data-log={JSON.stringify({
oid: 'page_web_test',
isPage: true,
events: ['_pv', '_pd'],
})}
>
</div>
);
};
设置 element 节点
iOS
// Set the view as an element node
[[EventTracingBuilder view:self.tableView elementId:@"auto_impress_test_list"] build:^(id<EventTracingLogNodeBuilder> _Nonnull builder) {
builder
// Exposure start, exposure end, click, etc. will be automatically checked
.buildinEventLogDisableStrategy(ETNodeBuildinEventLogDisableStrategyNone)
// Set an object parameter, all buried points generated by the object will carry this parameter
.params.set(@"auto_key", @"auto_val_123");
}];
Android
NodeBuilder.getNodeBuilder(view).setElementId("elementId")
.setVisibleMargin(10, -10, 0, 0)
.setReportPolicy(ReportPolicy.REPORT_POLICY_EXPOSURE)
.params()
.putBIPosition(2)
.putBITitle("xxx")
.putBICustomParam("xxx", "xxx")
H5
export default () => {
return (
<div
data-log={JSON.stringify({
oid: 'btn_web_test',
events: ['_ev', '_ec'],
})}
>
</div>
);
};
一些内置事件列表
支持的自动打点事件包括:
- 曝光:默认开启,分为页面曝光(
_pv
)和元素曝光(_ev
) - 点击:默认开启,元素被点击
_ec
- 结束曝光:默认关闭,页面曝光结束(
_pd
)和元素曝光结束(_ed
) - 冷启动:默认开启,
_ac
- 进入前台:默认开启,
_ai
- 进入后台:默认开启,
_ao
- 滚动:默认关闭,列表视图滚动
_es
手动打点
以上事件即支持自动打点,也支持手动触发打点,比如下方代码演示了如何手动触发1次 点击事件 _ec
iOS
[EventTracingBuilder logWithView:view event:^(id<EventTracingLogNodeEventActionBuilder> _Nonnull builder) {
builder.ec();
}];
Android
DataReporter.clickBI()
.setTarget(view)
.setParam("xx", "xx")
.report()
H5
window.NE_DAWN.trigger(target, options);
比如 iOS 可视化调试工具的截图
欢迎广大开发者一起来添砖加瓦!下面是一些方式来更好的一起参与共建:
- 提Bugs,以及发现新需求,你可以提 issue
- 开发者贡献:如果你有兴趣一起参与共建,可以先看下 以及开发者宣言 code of conduct 以及 开发者建议
你可以通过 Discussions 跟我们一起讨论
也可以加入到我们的 slack工作区
了解更多参见 LICENSE