如何设计一个通用的前端监控SDK框架

广告位招租
扫码页面底部二维码联系

前端监控是一个大话题,无论在知乎,还是掘【原创不易,请尊重版权】未经授权,禁止复制转载。金,我都阅读过很多相关的文章。但是,在众【本文受版权保护】【转载请注明来源】多文章中,我发现他们都有一些共性,但是你本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net却无法简单说哪些是共性的东西,哪些是专门【原创内容,转载请注明出处】原创内容,盗版必究。的东西。为此,我打算写一篇文章,来讲解我未经授权,禁止复制转载。【未经授权禁止转载】在设计我的前端监控系统时,如何解决前端S【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.netDK的问题。

本文版权归作者所有,未经授权不得转载。【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】

前端监控SDK的共性本文版权归作者所有,未经授权不得转载。

【转载请注明来源】【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】

和其他SDK不同,前端监控SDK基本上要未经授权,禁止复制转载。【版权所有,侵权必究】求开箱即用,一个<script src>就可以完成所有监控逻辑。在文档中插入sc【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】ript标签时,可以带上data-appid属性,以区分当前监控的应用,脚本内可通过著作权归作者所有,禁止商业用途转载。【本文受版权保护】document.currentScri【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】pt读取,当然,如果服务端以及绑定了域名本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】,那不需要appid也无所谓。

【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。

我们要谈的是,作为SDK的提供方,【转载请注明来源】我们要在SDK中怎么写,才能做到这种开箱【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net即用,或者对于下游开发者而言更好用转载请注明出处:www.tangshuang.net

【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【转载请注明来源】

前端监控的目标各有不同,包括:测速、性能【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。、错误、行为等方面。我在过去两年中,重点【作者:唐霜】【原创内容,转载请注明出处】集中在研究监控用户行为,在长时间的探索中【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】,我对SDK进行了多次重构,最终发现,无【原创不易,请尊重版权】【原创内容,转载请注明出处】论以什么方向为目标,SDK的设计都需要包本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】含如下几个方面:

【转载请注明来源】【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】【原创内容,转载请注明出处】
  • 数据收集本文版权归作者所有,未经授权不得转载。
  • 未经授权,禁止复制转载。【未经授权禁止转载】转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】
  • 数据存储(日志的结构,日志是存在内存中,本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net还是存在indexedDB中)
  • 本文版权归作者所有,未经授权不得转载。【本文受版权保护】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。原创内容,盗版必究。
  • 数据上报(上报周期:立即,延时;上报策略【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。:什么情况下触发上报;上报压缩等)
  • 【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。原创内容,盗版必究。
  • 生命周期【版权所有】唐霜 www.tangshuang.net
  • 原创内容,盗版必究。【原创内容,转载请注明出处】【版权所有,侵权必究】
  • 代码分离(快速加载主体代码,异步加载功能未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。代码;将数据处理移到webworker中【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】
  • 著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】

不管你是做性能监控,还是错误监控,SDK【转载请注明来源】【转载请注明来源】都可以从这几个方面去思考,当然,不同场景本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】下,不一定全部都要,但是作为成年人,我们原创内容,盗版必究。【作者:唐霜】往往全想要。我在写用户行为监控时,还遇到【原创内容,转载请注明出处】【本文首发于唐霜的博客】一些特殊场景:

转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net
  • 仅在某一个特定流程中进行录制,其他页面不【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。需要录制,因此,要求SDK具有可选的录制未经授权,禁止复制转载。【原创内容,转载请注明出处】策略,而不是定死的
  • 【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】【版权所有,侵权必究】
  • 一串用于演示用户行为导致的界面变化的日志原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。,具有不可能遗漏性,一旦遗漏其中一个日志未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。,都有可能导致无法最终还原出用户操作的界转载请注明出处:www.tangshuang.net原创内容,盗版必究。面效果,因此,对SDK收集的日志完整性有本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】要求
  • 【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。
  • 由于考虑到不同业务场景下,对浏览器兼容性著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】又有考虑,所以,对SDK的可扩展性以及功【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net能可替换性有要求
  • 【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】

因此,实际上,我们作为SDK的作者,要考著作权归作者所有,禁止商业用途转载。【本文受版权保护】虑两种场景:SDK直接被网站引用(开箱即【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】用),或者被开发者引用(二次开发)。多次【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】重构中,我逐渐摸索出一套共性的东西,并将转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】它以框架的形式在腾讯内部发布。

原创内容,盗版必究。【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net

通用的前端监控SDK框架原创内容,盗版必究。

转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】

作为框架,它的主要面向用户是开发者,它并未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。不提供直接的功能,而是提供创建功能的底层【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。接口,让开发者通过接口完成功能开发。我刚【版权所有】唐霜 www.tangshuang.net【本文受版权保护】开始撰写用户行为还原SDK时,将所有的功【本文受版权保护】原创内容,盗版必究。能耦合在一起,仅仅是为了完成用户行为信息【未经授权禁止转载】本文作者:唐霜,转载请注明出处。收集和上报的功能。但是,随着我想要收集的【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。信息的扩展,我发现之前的设计并不好,因为【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】每加一个方面的信息,就要再次耦合其中。于【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net是我开始了漫长的重构。

【转载请注明来源】转载请注明出处:www.tangshuang.net【作者:唐霜】【版权所有,侵权必究】

目标很明确,每加一个方面的信息收集能力,【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。不需要修改原有代码,而是提供新的代码,在本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net把新代码模块导出的接口插入到已有代码的某原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】处。于是,一个基于插件系统的架构浮现在我转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】脑海中。比如我现在想要收集用户进入我的网本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】站到离开我的网站之间的时间这样一个信息,【本文首发于唐霜的博客】【本文受版权保护】我不需要修改SDK原有的代码,而是写一个著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net插件,按照SDK的规范,提供不同生命周期【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。节点上的钩子函数,就可以了。

【未经授权禁止转载】【作者:唐霜】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。

前端监控SDK框架示意图本文版权归作者所有,未经授权不得转载。

【本文受版权保护】【作者:唐霜】原创内容,盗版必究。原创内容,盗版必究。

生命周期【版权所有,侵权必究】

转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】

既然提到了生命周期,那就来聊一聊生命周期【未经授权禁止转载】【本文首发于唐霜的博客】吧。

【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】【作者:唐霜】

我向开发者提供了一个类,姑且叫 本文作者:唐霜,转载请注明出处。TheLogger 吧。开发者需要实例化这个类,实例化时,【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】传入各种参数,参数中就包含了插件,这个后【未经授权禁止转载】【未经授权禁止转载】面聊。实例在内存中运行,它会经历给个节点原创内容,盗版必究。原创内容,盗版必究。,完成日志的收集和上报。

【原创内容,转载请注明出处】【本文首发于唐霜的博客】【转载请注明来源】
init (实例化阶段) -> servup (启动服务阶段) -> start (开始收集) -> write (写入日志) -> stop (停止收集) -> destroy (实例销毁)
                                               ^                                    /
                                                `-------------(重新启动)------------

SDK在这些生命周期节点上提供钩子,插件转载请注明出处:www.tangshuang.net【本文受版权保护】们则在这些钩子上挂载一些函数,当框架运行著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。到这些生命周期节点上时,就会触发插件的函【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net数,以实现插件的功能。

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

以如何收集用户的点击事件为例子。当实例化转载请注明出处:www.tangshuang.net【本文受版权保护】时,会去调用插件的options和ini转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】t方法,用以获取插件的配置和在SDK实例【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。化时做一些工作。 实例化过程中,SDK会【原创内容,转载请注明出处】【本文受版权保护】启动服务,这个过程对于插件而言,都是启用【原创内容,转载请注明出处】【转载请注明来源】过程,插件如果有自己的服务,可以在这个阶【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net段启动起来。启动之后,SDK服务就像一个【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】运转中的轮子,当轮子开始转时,把插件挂上【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】去,于是轮子就有了插件提供的能力。接下来【未经授权禁止转载】原创内容,盗版必究。,在插件中,我们要收集用户的点击信息。如著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】何收集呢?当然是addEventList原创内容,盗版必究。【转载请注明来源】ener啦。让插件暴露一个start方法本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。,这个方法会在SDK运转到start这个未经授权,禁止复制转载。未经授权,禁止复制转载。生命周期节点时被调用。在start钩子中【本文受版权保护】本文作者:唐霜,转载请注明出处。,插件可以通过addEventListe著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。ner对用户的点击事件进行监听,回调函数【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net中可以使用this.write方法把收集【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。到的信息,写入到SDK服务中。在stop本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。钩子函数中解除监听。这样,插件自己的任务本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。就完成了。在写入日志时,也可以提供wri【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】te钩子方法,对写入的日志进行改写。

【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【本文受版权保护】【原创内容,转载请注明出处】

关键不在于使用哪些名称的方法,转载请注明出处:www.tangshuang.net关键在于,我采用了一套插件系统,开发者通【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。过自己撰写一个插件,就可以在SDK原来的未经授权,禁止复制转载。【原创不易,请尊重版权】基础上,收集更多信息,为SDK提供更丰富【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net的功能。几乎所有的功能,都可以基于插件去完成,C本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。ore是一个基于生命周期的调度器而已,不【本文首发于唐霜的博客】原创内容,盗版必究。断调用插件的各个方法实现功能。

著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net

生命周期的设计,几乎是所有系统设计的共性【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】,我们现在回来看生命周期,会发现,生命周【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。期是一个系统,一个存在运行时系统的核心,本文作者:唐霜,转载请注明出处。【转载请注明来源】不同的业务场景下,我们提炼出来的生命周期【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。节点是不一样的,流转图也是不同的。在前端原创内容,盗版必究。【本文受版权保护】监控这个领域,SDK的生命周期却都大致相【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】同,因为业务场景基本一致。它围绕监控日志原创内容,盗版必究。【版权所有,侵权必究】的收集、存储、上报进行展开,所以,基本就未经授权,禁止复制转载。【转载请注明来源】是这些流程。一旦这个基本的生命周期流程确【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】定之后,插件的生命周期也就确定了。

本文作者:唐霜,转载请注明出处。【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net

服务转载请注明出处:www.tangshuang.net

【未经授权禁止转载】【本文首发于唐霜的博客】原创内容,盗版必究。

这里的服务(Service)是“真服务”本文作者:唐霜,转载请注明出处。【未经授权禁止转载】,它通过一个常驻的运转流程,不断的监听事著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】件,当事件发生时提供一个响应。在TheL原创内容,盗版必究。【原创内容,转载请注明出处】ogger中,我提供了一套内置的服务,这【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net套服务基于indexedDB+webwo【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。rker,在后台不间断运行。但这套内置的【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】服务是解耦的,它并不属于框架的一部分,框著作权归作者所有,禁止商业用途转载。【本文受版权保护】架并不提供具体的服务,只是提供了服务的抽【本文受版权保护】本文版权归作者所有,未经授权不得转载。象接口。开发者拿到SDK框架之后,默认是【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。不包含服务代码的,开发者可以用一个ext【未经授权禁止转载】原创内容,盗版必究。ends关键字,重写serve, sen【未经授权禁止转载】【转载请注明来源】d方法,把服务挂载进去(通过插件也可以实【原创不易,请尊重版权】【本文首发于唐霜的博客】现)。

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【未经授权禁止转载】

这种设计的好处在于,如果你并不喜欢我的内本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。置服务,你可以不用它,而代码并不在框架中原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。,因此,你最终打包的代码并不包含这部分内未经授权,禁止复制转载。【原创不易,请尊重版权】容。我在为公司内的一个监控平台Aegis【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。提供用户行为监控的能力时,由于Aegis【原创内容,转载请注明出处】未经授权,禁止复制转载。平台有自己的日志存储和上报体系,因此,我【转载请注明来源】本文作者:唐霜,转载请注明出处。不需要把我自己的Service部分再塞到本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。我提供的SDK中,而是只挑选了要使用到的【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。插件,打包之后,再到Aegis中提供一个【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】基于该打包后的SDK的Aegis插件,这著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net样,对于下游用户而言,他们使用了一个Ae本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】gis插件,而这个Aegis插件拥有了T原创内容,盗版必究。未经授权,禁止复制转载。heLogger的功能。

转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net

一个运行中的服务,本质上就是一个资源消费【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】系统。你需要用资源喂它,让它按照它被设计著作权归作者所有,禁止商业用途转载。【本文受版权保护】的方式产出效果。在前端监控SDK里面,这转载请注明出处:www.tangshuang.net【未经授权禁止转载】个服务就是你把日志喂给它,然后让它按照一本文作者:唐霜,转载请注明出处。【本文受版权保护】定的逻辑上报到后台。所以,我设计时,要求本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。开发者从serve和send两个方法实现【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】服务。serve方法用于实例化服务,也就【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】是说在SDK中,你将以什么样的服务处理日【版权所有,侵权必究】【本文受版权保护】志的存储和上报。send方法则是喂日志/【本文首发于唐霜的博客】未经授权,禁止复制转载。消息。send方法接收一个消息,当typ【转载请注明来源】原创内容,盗版必究。e为不同值时,表示要求服务干一件对应的事【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。情,例如type=write表示要服务把本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。我丢过去的日志写入到本地存储中,当typ本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】e=report时表示要服务把我之前丢进【本文首发于唐霜的博客】【版权所有,侵权必究】去的日志上报到服务器上面。当然,不同的开【作者:唐霜】【原创不易,请尊重版权】发者在实现send方法时,具体实现不同,【版权所有】唐霜 www.tangshuang.net【转载请注明来源】极端情况下,我们提供一个同步的服务,当 send({ type: 'write', data }) 发生时,直接将该日志发送到服务端,不需【本文受版权保护】【未经授权禁止转载】要在本地进行存储,这种情况下,serve【本文首发于唐霜的博客】【本文首发于唐霜的博客】方法不需要写任何内容,在send中直接调【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net用上传接口。

【作者:唐霜】【本文受版权保护】【未经授权禁止转载】

插件本文版权归作者所有,未经授权不得转载。

【原创不易,请尊重版权】【本文首发于唐霜的博客】原创内容,盗版必究。【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net

插件是完成日志收集的主要场所。插件暴露的【转载请注明来源】【未经授权禁止转载】接口有两种类型,一种是为SDK框架所调用【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。的生命周期函数,另一种是为增强SDK功能本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net的功能函数。

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。

因为插件的生命周期函数会被SDK的生命周未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。期钩子勾着走,所以单纯看插件代码,插件自本文版权归作者所有,未经授权不得转载。【作者:唐霜】身仿佛也有了生命周期。比如,你可以说插件【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net在实例化、启动、停止时都在做什么。在设计【本文受版权保护】本文作者:唐霜,转载请注明出处。时,我着重强调start/stop两个过【原创不易,请尊重版权】【版权所有,侵权必究】程。start过程是插件真正的收集开始自【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】动化开展过程,stop则是停止这个自动化【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。过程。比如对用户鼠标轨迹的收集,在sta【版权所有,侵权必究】未经授权,禁止复制转载。rt中通过addEventListene【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.netr启动监听,自动收集,而在stop中re【未经授权禁止转载】【本文首发于唐霜的博客】moveEventListener停止这【转载请注明来源】本文作者:唐霜,转载请注明出处。个自动收集过程。

【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】

但,插件的运作方式并非只有自动一种。某些【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net情况下,我们可能不依靠自动收集,而是手动本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】收集,通过在业务代码中调用SDK实例的一【本文首发于唐霜的博客】【转载请注明来源】个方法记录一条日志。比如,你只想记录某一【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】个button被点击的次数,你直接将插件【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。的一个功能函数绑定到该button的cl【作者:唐霜】【版权所有】唐霜 www.tangshuang.netick事件上,这样就完成对单一对象的事件【原创内容,转载请注明出处】原创内容,盗版必究。收集。这时,插件需要做的,是提供一个功能转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net函数(接口),方便你在业务代码中调用。当转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。然,功能函数千变万化,提供什么功能,完全【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。看开发者自己。关键的核心,不在于函数本身,而在于插件是【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。增强SDK系统的一种方式。因为插件系统的设计,配合生命周期,你可以【原创内容,转载请注明出处】原创内容,盗版必究。在SDK的框架上,开发出任意的客户端信息转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】收集的逻辑。

著作权归作者所有,禁止商业用途转载。【转载请注明来源】【原创内容,转载请注明出处】

前端监控SDK的设计技巧【未经授权禁止转载】

本文作者:唐霜,转载请注明出处。【本文受版权保护】本文版权归作者所有,未经授权不得转载。

现在,你有了SDK框架,接下来,你应该利未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。用该框架,撰写一个属于自己的SDK了。当【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net然,作为一个前端监控SDK,它必须配合后【原创内容,转载请注明出处】【本文受版权保护】端的一些规则,不过,由于一般的日志存储系本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net统都是NoSQL的,所以,只要一条符合设未经授权,禁止复制转载。未经授权,禁止复制转载。计的日志,都可以被存到后端数据库中。我们【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net这里要探讨的是,在你的SDK中,可能会涉著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。及一些技巧,以解决某些实际的问题。

【未经授权禁止转载】【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】

延时批量上报【版权所有】唐霜 www.tangshuang.net

转载请注明出处:www.tangshuang.net【版权所有,侵权必究】转载请注明出处:www.tangshuang.net

有些监控系统是实时上报的,有的甚至为了确【作者:唐霜】【本文首发于唐霜的博客】保收集到的信息的完整性,采用<img/>的形式上报用户点击。但是,这种上报在确保转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】实时性和完整性的同时,给后端带来了巨大压未经授权,禁止复制转载。未经授权,禁止复制转载。力,如果一个网站具有极大的PV,那么日志原创内容,盗版必究。【转载请注明来源】上报接口将面临巨大的流量压力,弄的不好是【本文受版权保护】【版权所有,侵权必究】自己给自己创造DDos。而解决的办法之一本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。,就是延时批量上报。比如收集到10条后,本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。再一起上报。但是假如一直收集不到10条呢著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】?你可以说10条都不到,没有价值。不过,转载请注明出处:www.tangshuang.net【作者:唐霜】我们可以通过一个throttle的设计,【本文首发于唐霜的博客】【原创不易,请尊重版权】让它在一定时间周期内上报。

本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】

还有一种,我们并不采取主动策略自动上报日原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。志,而是要等到服务端来索要日志,我们内部未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net黑话叫“日志捞取”。可以通过websoc【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。ket或用户访问某些接口的时候,下发一个【版权所有,侵权必究】转载请注明出处:www.tangshuang.net指令,SDK得到这个指令之后再上报。这就【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net要求,日志数据事先要放在客户端(浏览器)【版权所有,侵权必究】未经授权,禁止复制转载。。这就涉及到一个前端数据存储的问题。

著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【未经授权禁止转载】

前端数据存储本文作者:唐霜,转载请注明出处。

原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net

如前文所说,如果我们将日志放在内存里面,【版权所有,侵权必究】【本文首发于唐霜的博客】那么用户刷新页面,或页面崩溃,这部分数据【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】就丢失了。当然,如果不需要延时上报,立即【本文受版权保护】【本文受版权保护】上报的情况下,前端并不需要存储日志,但是本文作者:唐霜,转载请注明出处。【未经授权禁止转载】,我们设计的是延时批量上报,这样可以给我【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】们带来一些特性,比如按需捞取。既然如此,转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。我们就需要挑选一个前端数据存储的方案。我【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net推荐的存储方案是indexedDB,和l著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.netocalStorage相比而言,它不仅具未经授权,禁止复制转载。原创内容,盗版必究。有较大的容量(500M),更重要的一个原未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。因在于localStorage无法在we【原创不易,请尊重版权】【未经授权禁止转载】bworker中被读取,而在我的设计中,转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。有一种方案时在webworker中处理日【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】志和上报日志。

【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【未经授权禁止转载】【未经授权禁止转载】

但是,indexedDB也有不少坑,包括【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】webworker的坑也不少。index【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。edDB的原生操作比较复杂,你可以使用我【本文首发于唐霜的博客】【原创内容,转载请注明出处】写的库indb【本文首发于唐霜的博客】实现indexedDB的操作。我在设计时【未经授权禁止转载】转载请注明出处:www.tangshuang.net,使用了三个store,一个是confi未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】g,用于在主线程和worker线程之间共本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。享配置,一个是archive,用于存储所【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。有日志,一个是moment,用于存储需要著作权归作者所有,禁止商业用途转载。【转载请注明来源】立即上报的日志的索引信息(索引字段)。由未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。于indexedDB是严格的NoSQL数【转载请注明来源】原创内容,盗版必究。据库,所以非常适合存储日志。archiv【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】e这个store将会保存所有被收集到的日本文作者:唐霜,转载请注明出处。【作者:唐霜】志,存储的时候,并不需要按照某个顺序存,【本文受版权保护】【原创不易,请尊重版权】而且为了更快存入,存储过程不需要复杂逻辑【转载请注明来源】未经授权,禁止复制转载。

【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【未经授权禁止转载】

上报策略【版权所有,侵权必究】

【原创内容,转载请注明出处】【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。原创内容,盗版必究。

我在设计时,采用了三种不同的上报周期:【版权所有,侵权必究】

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net
  • 批量上报,任何日志,都写到archive【本文受版权保护】未经授权,禁止复制转载。 store中,不需要任何顺序,因为正常【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net用户操作的顺序并不代表日志入库顺序,因为【本文首发于唐霜的博客】【本文受版权保护】操作会有异步的情况,archive st【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】ore中存储着全部被收集的没有被上传的日【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。
  • 本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【本文受版权保护】未经授权,禁止复制转载。
  • 立即上报,当发生错误或异常时,往mome【转载请注明来源】原创内容,盗版必究。nt store里面写入对应的日志索引,本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。立即上报的周期比较短,所以,当周期到来时【版权所有】唐霜 www.tangshuang.net【本文受版权保护】,直接将moment store中的全部【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。索引取出,然后到archive stor著作权归作者所有,禁止商业用途转载。【转载请注明来源】e中取出索引对应的全部日志,一次性上报
  • 本文作者:唐霜,转载请注明出处。【作者:唐霜】原创内容,盗版必究。【转载请注明来源】原创内容,盗版必究。
  • 回溯上报,在某些情况下,archive 转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】store中的日志过了很久的时间都没有被本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。上报,这种情况造成的原因多种多样,不好确【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】定,但是,这些日志可能又是有用的,因此,【原创内容,转载请注明出处】原创内容,盗版必究。在一个比较长的周期里面(小于7天,因为i【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。ndexedDB的新策略是会删除7天之后未经授权,禁止复制转载。【版权所有,侵权必究】的数据),要从尾往前遍历,把早期存入的但【本文首发于唐霜的博客】原创内容,盗版必究。没有上报的日志再次上报
  • 【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【本文受版权保护】【关注微信公众号:wwwtangshuangnet】

在日志设计时,通过日志中的level字段本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】来判别该日志属于什么级别。我自己在处理时著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】,error的是立即上报,其他的是批量上【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】报。实际上,我们还可以设计一种有选择性的转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】上报,比如有些日志上报了没啥意义,可以不【转载请注明来源】转载请注明出处:www.tangshuang.net用上报,让浏览器自己处理过期日志,但是,【作者:唐霜】【原创内容,转载请注明出处】如果我们通过服务端发送捞取指令时,又马上【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net把这些日志组织起来进行上报。

【未经授权禁止转载】【原创内容,转载请注明出处】【版权所有,侵权必究】

上报压缩【版权所有】唐霜 www.tangshuang.net

【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。

为了减小流量,我们需要对要上报的日志进行【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。压缩。我自己使用了一个叫pako的库来进【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。行gzip压缩,但是压缩会有一个问题,由【版权所有,侵权必究】【原创不易,请尊重版权】于压缩算法本身要占据一定容量,所以,如果本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】不采取批量上报的逻辑,那么不需要任何压缩【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】,只有当批量上报,且上报数量达到一定数量【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net时才进行压缩,否则压缩一条日志,反而让日【未经授权禁止转载】【本文受版权保护】志容量变大,还要增加服务端解压压力。

【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】【作者:唐霜】

任务/线程【版权所有,侵权必究】

【本文受版权保护】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】

对于一个前端监控的SDK而言,它有可能和未经授权,禁止复制转载。【本文受版权保护】页面中的其他脚本一起强资源,导致页面卡顿【本文受版权保护】未经授权,禁止复制转载。。因此,我们要想办法,降低SDK对界面的【版权所有】唐霜 www.tangshuang.net【转载请注明来源】影响。我提供了两套方案:

未经授权,禁止复制转载。【作者:唐霜】【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net
  1. 启用一个webworker,将所有日志的著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。处理、存储、上报等等,全部放在worke转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。r线程中,主线程仅仅完成数据收集部分,这本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】样,可以降低日志处理上报时,读写数据库等【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。操作带来的卡顿
  2. 【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】【原创不易,请尊重版权】
  3. 直接在主线程完成日志处理和上报,但是创建【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。一个idle任务,只有当页面存在空闲时,转载请注明出处:www.tangshuang.net【未经授权禁止转载】才执行日志处理和上报,当用户在界面进行操【本文受版权保护】著作权归作者所有,禁止商业用途转载。作,并且需要更新界面时,任务会被暂时搁置【版权所有】唐霜 www.tangshuang.net【转载请注明来源】,等到有闲暇时间时再进行
  4. 原创内容,盗版必究。【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。

但是,由于js是单线程运行,所以,即使任【作者:唐霜】【本文受版权保护】务是异步执行的,仍然还是会占用资源。作为【转载请注明来源】转载请注明出处:www.tangshuang.net监控SDK,要尽可能不对运行程序产生任何本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net影响。

【版权所有,侵权必究】【未经授权禁止转载】【原创不易,请尊重版权】

异步加载插件【转载请注明来源】

本文作者:唐霜,转载请注明出处。原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net

在为Aegis撰写插件时,我们发现SDK本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】包的体积对收集到一些特定信息很关键,例如【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net应用启动时的数据。如果SDK包很大,半天转载请注明出处:www.tangshuang.net【转载请注明来源】加载不完,等脚本加载完,早都已经过了收集原创内容,盗版必究。【版权所有,侵权必究】的窗口了。所以,在这种场景下,我们要让S著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。DK尽可能小(10K以内)。但是,很明显【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。,有些功能,这么小体积是不够的。因此,我【本文首发于唐霜的博客】未经授权,禁止复制转载。们设计了一套异步加载的插件体系。对于这些【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。插件而言,它们分为两部分,一部分是直接挂【作者:唐霜】【关注微信公众号:wwwtangshuangnet】在SDK内部,也就是10K以内的代码里面原创内容,盗版必究。【本文首发于唐霜的博客】,收集一些启动时的数据,而收集到的数据暂本文版权归作者所有,未经授权不得转载。【作者:唐霜】时放在内存中,等异步代码加载完运行之后,【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。再取出来做下一步处理。

【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【作者:唐霜】

打点/无埋点著作权归作者所有,禁止商业用途转载。

未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【本文受版权保护】

SDK的灵活性也很重要,在最前面我提到,【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】假如开发者只想监听用户在某3个页面之间的【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net操作信息,而不是全部页面的操作信息,该怎【转载请注明来源】【本文受版权保护】么处理呢?所以,在设计上,我们要提供不同【未经授权禁止转载】转载请注明出处:www.tangshuang.net的打点、上报的方式。我在设计时,提供了“本文版权归作者所有,未经授权不得转载。【转载请注明来源】无埋点、片段、单点”x“自动上报、手动上【本文首发于唐霜的博客】【原创不易,请尊重版权】报”的不同组合方式。针对上述问题,这里简原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。单讲一下怎么实现片段埋点。在前文Serv【原创内容,转载请注明出处】【未经授权禁止转载】ice那一节我已经指出,对于用户行为的监【本文首发于唐霜的博客】【原创不易,请尊重版权】听本质上是一个服务,既然是一个服务,那么【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】就可以让这个服务开始或停止。因此,在上述【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net这个具体问题上,当用户进入指定页面A时,【本文首发于唐霜的博客】【原创不易,请尊重版权】启动服务,服务启动之后,用户的所有操作就未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。会被记录到日志中,用户经过B页然后离开C【版权所有,侵权必究】【版权所有,侵权必究】页时,停止服务,那么用户的这段操作就结束【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。了,这一连串相关的日志,会被一个相同的t著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。raceId串联起来。同样的道理,上报本转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】身也是一个服务,如果我们再实例化时,让服【作者:唐霜】本文版权归作者所有,未经授权不得转载。务自动运行,上报自动完成,我们也可以选择【原创内容,转载请注明出处】【原创内容,转载请注明出处】关闭这个能力,通过手动调用report方原创内容,盗版必究。【本文首发于唐霜的博客】法来触发上报逻辑。

【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。未经授权,禁止复制转载。【原创不易,请尊重版权】

隐私策略【转载请注明来源】

原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【作者:唐霜】

监控行为可能涉及到一些隐私策略问题。不同【原创内容,转载请注明出处】原创内容,盗版必究。的产品,其隐私策略也是不同的。对于开放性【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net大众产品,针对单用户的行为进行分析,很可本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。能能得出针对该用户的一些预测行为,这对商转载请注明出处:www.tangshuang.net【本文受版权保护】业公司的吸引力非常大。但是我们要知道,互【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】联网不是法外之地,我们在实现能力的时候,【转载请注明来源】【作者:唐霜】应该尊重和保护用户隐私。针对隐私问题,S转载请注明出处:www.tangshuang.net【作者:唐霜】DK框架应该提供可扩展的能力,遵循“开放【原创内容,转载请注明出处】【未经授权禁止转载】封闭原则”,让开发者可以自己根据产品需要【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】,有可以与用户交互的过程,而非一股脑全部【关注微信公众号:wwwtangshuangnet】【转载请注明来源】封装死,不管三七二十一收集和提交日志。针【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】对这个方面,我在设计时,做了如下约束:

【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。
  • 任何与密码相关的数据不会被记录,包括用户转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net鼠标在该元素上的操作
  • 【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】
  • 提供特定的html标记,这些标记元素产生本文版权归作者所有,未经授权不得转载。【本文受版权保护】的信息不会被收集
  • 本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】
  • 提供特定的方法,让开发者可以在方法中过滤著作权归作者所有,禁止商业用途转载。【转载请注明来源】日志,或者做脱敏处理
  • 未经授权,禁止复制转载。【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net
  • 在运转流程上,SDK不是一股脑只完成自己本文作者:唐霜,转载请注明出处。【转载请注明来源】的任务,开发者可以控制SDK的运作,比如著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。只有在征得用户同意后才上传日志
  • 【本文首发于唐霜的博客】【版权所有,侵权必究】【本文受版权保护】

总之,隐私策略是产品策略中的重要一环,也【版权所有,侵权必究】【本文受版权保护】是目前我们国家重点关注的一个方面,任何与【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。监控相关的设计都应该慎重考虑。

原创内容,盗版必究。【未经授权禁止转载】【未经授权禁止转载】

结语未经授权,禁止复制转载。

【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

本文详细阐述了我在前端监控SDK框架的设【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】计上的一些经历,虽然没有具体的实现代码,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】但是文章中所提出的这些理念,都可以帮助开【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net发者实现一款自己的SDK框架,在工作中发未经授权,禁止复制转载。【原创内容,转载请注明出处】挥作用。

转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【转载请注明来源】

2020-11-27 9736 ,

为价值买单,打赏一杯咖啡

本文价值97.36RMB
已有1条评论
  1. hayato 2021-03-16 13:36

    最近准备整数据上报,感谢博主的这篇文章。