不同业务场景下如何选择前端页面代码埋点实现或全埋点

没有更多推荐了,
不良信息举报
举报内容:
大数据时代≠无埋点时代:无埋点优越于代码埋点?
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
不良信息举报
举报内容:
用户行为日志-js埋点(一)实现整体流程
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!前端埋点与后端埋点,如何选择才最科学?前端埋点与后端埋点,如何选择才最科学?乔一鸭V百家号行业差异性明显、企业实际需求不同,因此埋点方式也应有所不同。究竟该如何科学采集数据?要真正实现精细化运营,企业数据采集所采用的埋点方式不应“千企一面”,而应该“因企而异”。数据采集是数据分析的基础,科学数据采集应该从实际业务需求出发。一、适合前端埋点的企业业务需求无论是自建数据分析平台,还是采用第三方数据分析工具,梳理企业需求是第一步,随后按照企业需求完成事件和埋点方案的设计,这也正是神策数据为客户提供多维度数据分析的根基与前提。一般而言,以全埋点(无埋点)为典型代表的前端埋点方案,适合有以下需求的企业。数据采集是数据分析的第一步,埋点是重要的数据采集方式。1、处于运营初级阶段,产品功能相对简单例如,如阅读类、词典类工具性APP的企业客户,在其发展初期的产品运营阶段,产品功能较为基础,无明确业务数据、交易数据,仅通过UV、PV、点击量等基本指标分析即可满足需求。由于神策分析(Sensors Analytics)支持全埋点,SDK支持默认采集APP或者网页浏览页面、激活、启动等前端数据,这类客户可以基于此衡量用户留存以及活跃度。如图1,某广告企业了解用户渠道来源,并判断不同渠道和不同推广方式的投放效果。图1 不同渠道和推广方式的效果分析2、需要分析与后端没有交互的前端行为若运营人员工作需要判断前端界面设计是否合理,是必须采用前端埋点方案的。这也是后端代码埋点无法完全代替全埋点的原因。二、强烈建议后端埋点的业务需求除了支持“前端埋点”(全埋点)方式,神策数据为保证数据采集做到“大、全、细、时”,更推荐“后端埋点”:当前后端都可以实现数据采集时,应优先考虑后端(代码)埋点,尤其在各行业中有特殊业务需求的数据,更是强烈建议通过后端(代码)埋点方式采集。总的来说,后端(代码)埋点,或者“后端(代码)埋点+全埋点”方案,适合有以下需求的企业。1、追求精细化运营,需要进行多维数据分析的企业更多的企业有精细化运营的诉求,科学埋点为运营人员后续进行多维度分析提供保障。《迷城物语》是玩心(上海)网络科技有限公司所研发游戏之一,首日即在各地区App Store和Google Play商店登顶并持续霸榜。其技术负责人马宗骥,在近日公开分享数据驱动游戏设计中介绍:在游戏领域想实现实现精准运营,进行多维数据分析应该优先考虑后端埋点,单纯依赖前端数据采集有许多弊端。例如,有时玩家已经退出游戏,但是链接还在,则前端采集不准,此时PCU数据无法正确衡量服务器的负载情况、数据库的压力情况等,而通过后端代码埋点解决了这一问题。再如,他介绍:“NPC(非玩家控制角色)状态、副本状态、经济系统实时状态等统计类数据,这些是前端埋点无法统计到的,而在后端采集数据可根据实际情节灵活完成数据统计工作。”如图2,运营人员精准找到游戏流失点。在100~110级流失的玩家所操控的角色大多停留在“打怪”动作上,机械地打怪练级,玩家开始感觉枯燥甚至疲惫。找到这一“流失点”后,《迷城物语》运营人员可以适当调整该关卡的怪物数量,并增加新鲜因素,从而平衡游戏趣味性和玩家精力。图2 《迷城物语》玩家“流失点”分析2、包含用户资产数据、用户账户体系相关数据、风控辅助数据等重要业务数据的网站或APP的企业如电商客户、互联网金融包含用户认证身份信息、手机号码、充值账户信息等数据,前端数据无法进行深入分析。再如,在互联网金融企业,最大痛点莫过于揪出“羊毛党”了。“羊毛党”手里握着大量的代理IP、手机虚拟号。这一群体特征十分明显,通常是经过注册、领取福利、流失。这就需要运营人员从IP、设备信息、注册信息、活跃度等进行多维度分析。用户留存是互联网金融企业判断客户是否是“羊毛党”的方式之一。如图3,一般用户完成新手项目(领取福利后),未进行第二次投资,则可能是“羊毛党”成员,在该平台上点击相关数字,人员明细会详细展示出来。图3 “羊毛党”用户甄别——留存数据细查3、对数据安全要求比较高的企业从后端采集数据,例如采集后端的日志,实质上是将数据采集的传输与加密交给了产品本身,认为产品本身的后端数据是可信的。而后端采集数据到分析系统中则是通过内网进行传输,这个阶段不存在安全和隐私性问题。同时,内网传输基本不会因为网络原因丢失数据,所以传输的数据可以非常真实地反应用户行为在系统中的真实体现。基于后端采集此优势,神策分析目前提供了 Java、PHP、Python、Ruby 等后端语言的 SDK,以及 LogAgent、BatchImporter、FormatImporter 等导入工具,支持在后端采集。图5 适合“前端全埋点”的企业需求与适合“后端代码埋点”的企业需求综上所属,笔者做出如下总结:没有任何一种通用数据采集方式,是适合所有企业业务诉求的。根据行业领先企业实践来看,后端代码埋点才是距精细化运营最近的数据采集方式;不从行业特性、自身实际需求出发的数据采集方案,都是耍流氓。本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。乔一鸭V百家号最近更新:简介:关注大数据行业,关注数据驱动作者最新文章相关文章浅谈服务埋点(1)——AOP
  年会圆满结束了,我们的年会系统整体表现也还算不错,但唯一遗憾的是到最后摇一摇的时候,系统卡住了,不过还好最后挺了过来。
  在以往编写应用程序的时候,我们通常会记录日志,以便出了问题之后事后有迹可循,这是一种静态分析。这次UIOC事件的发生,让我意识到系统性能的监控,或者说某一时刻运行的情况,比如当前系统中对外提供了多少次服务,这些服务的响应时间是多少,随时间变化的情况是什么样的,系统出错的频率是多少,这些动态的实时信息对于监控整个系统的运行健康状况来说多么的重要。
  我们发现我们要做的这些监控实际和我们的业务是毫无关系的,说到这里可能了解Spring的朋友们就会想到了AOP。
  所以这一篇我先谈一谈基础知识–AOP。
—————————————请叫我大分割线———————————–
一.为什么要用AOP
  面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。
  但是人们也发现,在分散代码的同时,也增加了代码的重复性。什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。
  也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?
二.什么是AOP
  这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
  一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
  这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码,有了AOP,OOP变得立体了。
  实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
  接下来是一张在知乎上比较传神的图片。
  面向切面,面向方面,也叫刀削面。
这里白面条好比系统的主流业务代码,各种调料和卤汁则好比那些处理琐碎事务的代码。这种将业务代码和琐碎事务代码分离的机制,能够让你在制作的时候只需要考虑自己这一部分的好坏,而不需要考虑其他。而且我需要加一个其他的琐碎的功能就非常方便(加一个配菜即可,不需要重新做一碗)。
—————————————请叫我分割线———————————–
三、AOP应用实战
  前面说了一堆的理论,接下来我们看看如何应用。
1、写死代码
public interface Greeting {
void sayHello(String name);
public class GreetingImpl implements Greeting {
public void sayHello(String name) {
System.out.println("Hello! " + name);
private void before() {
System.out.println("Before");
private void after() {
System.out.println("After");
这不必多说,这样的代码无疑满足了所有low代码的特点,程序员被累死,架构师被气死。
接下来提出三个重构的解决方案:
2、静态代理
最简单的方法是采用设置模式中的代理模式:
public class GreetingProxy implements Greeting {
private GreetingImpl greetingI
public GreetingProxy(GreetingImpl greetingImpl) {
this.greetingImpl = greetingI
public void sayHello(String name) {
greetingImpl.sayHello(name);
private void before() {
System.out.println("Before");
private void after() {
System.out.println("After");
用GreetingProxy这个代理类去代理GreetingImpl实现类。接着,客户端调用:
public class Client {
public static void main(String[] args) {
Greeting greetingProxy = new GreetingProxy(new GreetingImpl());
greetingProxy.sayHello("Jack");
这样做的问题也很明显:XXXProxy这样的代理类会越来越多。
这时需要用到JDK提供的动态代理了:
3、JDK动态代理
public class JDKDynamicProxy implements InvocationHandler {
public JDKDynamicProxy(Object target) {
this.target =
@SuppressWarnings("unchecked")
public &T& T getProxy() {
return (T) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(target, args);
private void before() {
System.out.println("Before");
private void after() {
System.out.println("After");
public class Client {
public static void main(String[] args) {
Greeting greeting = new JDKDynamicProxy(new GreetingImpl()).getProxy();
greeting.sayHello("Jack");
JDKDynamicProxy实现了InvocationHandler接口,那么必须实现该接口的invoke方法,该方法直接通过反射去invoke method,在调用前后分别处理before和after,最后返回result。
它的好处在于接口变了,这个动态的代理类不用动;而静态代理则是接口变了,实现类也要动代理类也要动。但jdk动态代理的缺陷是:它只能代理接口,而不能没有代理没有接口的类。
4、CGlib动态代理
我们使用开源的 CGLib 类库可以代理没有接口的类,这样就弥补了 JDK 的不足。CGLib 动态代理类是这样玩的:
public class CGLibDynamicProxy implements MethodInterceptor {
private static CGLibDynamicProxy instance = new CGLibDynamicProxy();
private CGLibDynamicProxy() {
public static CGLibDynamicProxy getInstance() {
@SuppressWarnings("unchecked")
public &T& T getProxy(Class&T& cls) {
return (T) Enhancer.create(cls, this);
public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Object result = proxy.invokeSuper(target, args);
private void before() {
System.out.println("Before");
private void after() {
System.out.println("After");
以上代码中了 Singleton 模式,那么客户端调用也更加轻松了:
public class Client {
public static void main(String[] args) {
Greeting greeting = CGLibDynamicProxy.getInstance().getProxy(GreetingImpl.class);
greeting.sayHello("Jack");
与JDKDynamicProxy类似,在CGLibDynamicProxy 中也添加一个泛型的getProxy方法,便于我们可以快速地获取自动生成的代理对象。
以上是基于代理的经典AOP,当引入了简单的声明式AOP和基于注解的AOP后,这种代理方式看起来非常笨重和复杂,感觉现在应该很少用到了,只不过我都看了,就写上来了。
5、声明式SpringAop
5.1、配置切入点Pointcut
Spring所有的切面和通知其都必须放在一个&aop:config& 内(可以配置包含多个&aop:config&元素),每一个&aop:config&可以包含pointcut,advisor和aspect元素。
(它们必须按照顺序声明)
切点用于定位应该在什么地方应用切面的通知,切点和通知是切面最基本的元素。
在SpringAOP中,需要使用AspectJ的切点表达式语言来定义切点。
最为常用的是excution()
我们使用execution()指示器选择Instrument的play()方法。*和(..)表示了我们不关心返回值和参数列表。
现在假设我们需要配置切点仅匹配com.springinaction.springidol包,在此场景下,可以使用within()指示器来限制匹配。
同理可以使用 || 和!操作符。
如何声明:
id="businessService" expression="execution(* com.xyz.myapp.service..(..))"/&
5.2、配置切面asspect
&aop:aspect&
id="myAspect" ref="aBean"&
id="businessService"
expression="execution(* com.xyz.myapp.service..(..))"/&
id="aBean" class="..."&
通知advice 分为以下几种:
前置、后置、环绕:
首先有个观众类(Audience),有入座、关机、鼓掌、要求退款 等功能。
把他注册为Spring应用上下文的一个Bean。接下来利用AOP配置,将其变成一个切面。
这样的配置就能在表演者Perform的前、后、以及异常的时候调用观众的方法,而这些事件表演者毫不知情(做到真正意义的解耦)。
由于我们的这些切点都是一样的,所以可以做如下提取。
环绕通知:
如果希望观众一直关注演出,并汇报每个表演的时长,那么前置/后置通知的方法是:前置通知保存开始时间,后置通知通过减法汇报时长。这样做不仅麻烦、而且容易引发线程安全问题。
而环绕通知可以很好的解决,它只需要在一个方法中实现,所以不需要使用成员变量保存状态。
从代码中我们可以看出,环绕通知有一个特点:它要求通知方法的第一个参数必须是ProceedingJoinPoint类型,然后joinpoint.proceed()是执行被通知的方法。
在这个切面中,watchPerformance()方法包含之前的4个通知方法的所有逻辑,但所有的逻辑都放在一个方法中了,而且该方法还负责自身的异常处理。接下来要做的就是配置&aop:around&了。
通知传参:
有时候通知并不仅仅是对方法进行简单包装,还需要校验传递给方法的参数值,这时候就需要为通知传递参数。
现在有个实现MindReader接口的魔术表演者Magican,他想表演监听观众的内心感应和显示他们在想什么。
实现了Thinker的志愿者Volunteer参与了这次表演。
接下来便是Magican利用Spring AOP技术来实现监听Volunteer内心感应的表演了。
这里切点标识了thinkOfSomething()方法,指定了thoughts参数。before标签的arg-names元素意味着该参数必须传递给Magician的interceptThoughts()方法。
由于篇幅原因,还有一些利用AOP引入新方法(introduction)、注解AOP、AspectJ等内容以后再总结吧。
没有更多推荐了,
不良信息举报
举报内容:
浅谈服务埋点(1)——AOP
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
不良信息举报
举报内容:
页面埋点方案
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 神策埋点 代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信