/dawn

曙光项目

Mozilla Public License 2.0MPL-2.0

version
version version version
version version

曙光

曙光埋点 是一套全链路埋点方案,从埋点设计、到客户端三端(iOS、Android、H5)开发、以及埋点校验&稽查、再到埋点数据使用,目前已经广泛应用于云音乐各个主要APP,它集自动化埋点与全链路追踪等特点于一身,近乎完美地解决了传统埋点的所有痛点,兼顾了开发效率与埋点数据的高精度特点。

云音乐曙光埋点:还原数据理想国

为什么用曙光

相比同类竞品的方案,曙光埋点有如下优势

  • 规范化: 客户端开发时,格式、参数(公共参数、SDK保留参数、参数类型/格式等)、埋点时机,双端规范统一化,可无缝对接H5、RN等
  • 链路追踪: 全链路级别的链路追踪能力,助力绘制用户画像,满足你漏斗分析、个性化推荐、实时分析、离线分析
  • 对象化-虚拟树VTree: 从埋点录入人员,到客户端埋点开发人员,我们面向的是一个个的对象
  • 埋点数据管理: 埋点虚拟树、埋点对象的可视化管理,涵盖着多版本并行开发管理,告别埋点管理混乱
  • 埋点校验&稽查: 线下埋点校验,和线上埋点稽查,同时配备了可供开发/测试方便的客户端层面的可视化工具,保障埋点质量

曙光包含哪些

  • iOS SDK
  • Android SDK
  • H5 SDK(可用于站内/站外)
  • Easyinsight埋点管理平台

工程介绍

这个是一个容器级别的壳子工程,以 git submodule 的形式管理其他子项目,子项目包括如下:

iOS & Android端侧SDK特点

轻量

曙光端侧SDK非常轻量,代码里只有数千行,对APP包体积占用非常小,对原有业务也不会增加额外的负担,这一点在云音乐等业内非常成熟的产品环境得到有力验证。它的接入也十分简单,您只需要根据下述文档即可在很短时间内完成功能的接入与使用。

自动埋点

曙光支持常见事件的自动打点,包括点击曝光滚动等。 event product

链路追踪

几乎全自动的链接追踪,开发人员几乎不需要额外的工作,强大又简单。 有关链接跟踪原理的更多介绍,请参阅以下文档 Link Tracking Introduction

模块架构

arch

使用曙光

全局配置

引入 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')
}

SDK 初始化

曙光埋点的启动十分简单,您只需要在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
    },
});

设置节点 oid (Object ID)

  • 启动SDK后,需要将目标元素设置上合适的oid,oid的类型分为2种:pageelement
  • 这取决于BI对节点如何定义,一般来说某个独立的 XXViewController建议配置为 xx_page的页面节点类型
  • 按钮、UI组件等适合设置为 xx_btn xx_cell的element节点。

但是每个页面的顶层节点必须被设置为page节点,并且它默认情况下会自动成为根节点

这里涉及了多个关键名词,比如oid, 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, Android

比如 iOS 可视化调试工具的截图

image

埋点实时校验工具

  • 为了更方便地进行本地埋点校验,我们跟平台一起对接,做了埋点实时校验工具
  • 工具的相关用法见文档 iOS, Android

开发者共建

欢迎广大开发者一起来添砖加瓦!下面是一些方式来更好的一起参与共建:

  • 提Bugs,以及发现新需求,你可以提 issue
  • 开发者贡献:如果你有兴趣一起参与共建,可以先看下 以及开发者宣言 code of conduct 以及 开发者建议

一起探讨

你可以通过 Discussions 跟我们一起讨论

也可以加入到我们的 slack工作区

或者添加下方微信,申请加入我们的官方微信群: image

License

了解更多参见 LICENSE