请问服务端埋点,设计成什么样的实现方式比较好? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Breadykid
V2EX    程序员

请问服务端埋点,设计成什么样的实现方式比较好?

  •  
  •   Breadykid
    breadkid 2024-06-27 14:15:05 +08:00 2802 次点击
    这是一个创建于 554 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如 GA ,神策等,服务端接入,在各个接口调用过程中埋点,什么样的实现方式比较好?
    目前看同事们有的在业务代码中间插一脚开个异步线程,有的在方法头上加切面拦截,写的都很临时。
    我现在新项目要接埋点了,springboot 项目,请问有什么好方式?

    14 条回复    2024-07-01 12:51:25 +08:00
    pvcxy18
        1
    pvcxy18  
       2024-06-27 14:33:29 +08:00
    方法切面拦截,或者配置 Filter 过滤吧。 如果还是觉得侵入性强,可以考虑加个中间层
    lxw520zxl
        2
    lxw520zxl  
       2024-06-27 14:41:14 +08:00
    后端埋点就是埋一些业务数据,比如一个发红包事件(红包 id, 红包金额,发红包人...等等信息),就是侵入业务的,没法完全独立出去的,一般来说就是定义好工具类,工具类上用 @Aysnc 注解来实现异步
    gl3081
        3
    gl3081  
       2024-06-27 14:48:08 +08:00
    埋点需求的数据比较多,没办法做统一处理。
    不过买点的数据对象,这边建议你考虑下 builder 模式,编辑器一般都有插件可以自动给 class 生成 builder 模式
    diagnostics
        4
    diagnostics  
       2024-06-27 15:04:46 +08:00
    APM 的话一般是 Agent ,也算埋点。。。
    xueling
        5
    xueling  
       2024-06-27 16:36:56 +08:00   1
    业务埋点其实不太能做到你期望的与业务完全解耦的状态,一般来说通过切面或注解能实现的都是一些相对固定的、标准化的埋点,而对于大多数自定义业务埋点,由于上报参数和上报时机差异太大,所以并不适合这种相对固定的上报形式。

    1 、服务端埋点方案设计一般侧重在埋点规范的定义、公共参数和业务参数的区分、统一的埋点的上报和接收方案等方面,确保在埋点上报出现问题后不会影响正常的业务服务就可以了,其实不用太纠结与业务代码的耦合;
    2 、埋点接收后将数据写入消息中间件,与数据平台服务解耦,写入消息中间件的数据是一份可以被共用的基础数据(包括实时或离线使用的形式);
    3 、围绕着服务端埋点,大多数的数据指标我建议采用通用型流式统计的方案来实现,接入简单,无 SQL ,不容易出错,针对一份埋点数据可以灵活的实现各种自定义指标,运算性能更加强悍,更容易实现指标之间的交叉验证,能够很方便的的在页面管理每个指标的执行状态,可以了解一下我的开源项目: https://github.com/xl-xueling/xl-lighthouse
    相比于 OLAP 数据指标的实现方案其实有很多好处,服务端埋点可能会经常变动,包括埋点的上下线或参数的变更,但 OLAP 需要维护全部的埋点序列数据,性能并不高,而且容易产生脏数据。
    Breadykid
        6
    strong>Breadykid  
    OP
       2024-06-27 16:51:01 +08:00
    @pvcxy18
    @lxw520zxl
    @gl3081 看来都是异步或拦截,我封装下试试

    @diagnostics elastic apm 有点重了,只是上报几个功能的数据,量不大
    xuanbg
        7
    xuanbg  
       2024-06-27 18:33:05 +08:00
    没听说过过服务端埋点。。。看需求描述的话,统一日志方案例如 ELK ,可以在日志抓取规则中实现提取关键信息的功能。
    zm8m93Q1e5otOC69
        8
    zm8m93Q1e5otOC69  
       2024-06-27 19:39:48 +08:00 via Android
    coderzhangsan
        9
    coderzhangsan  
       2024-06-27 20:53:22 +08:00
    说个题外话,服务端埋点,建议直接接第三方,不然后面一大堆埋点需求,这都不算什么,运营数据核对是个麻烦事。
    diagnostics
        10
    diagnostics  
       2024-06-27 22:22:49 +08:00
    @Breadykid 和 elastic 没啥关系,你没了解过 Prometheus + Grafana 这一套吗?
    Breadykid
        11
    Breadykid  
    OP
       2024-06-28 16:17:43 +08:00
    @diagnostics #10 目前接的神策埋点,接入了他们 sdk ,需要调用 sdk 的方法来上报数据,Prometheus + Grafana 用不了

    @xuanbg 接三方埋点的话,例如 ga (调用接口),神策(调用 sdk ),走日志获取埋点信息再上报不合适了,要另开应用单独做了

    @uselessVisitor
    @xueling
    你俩的 repository 对于这个服务端只上报 1-2 个事件,5-6 个参数的场景,有点重了
    diagnostics
        12
    diagnostics  
       2024-06-28 16:28:23 +08:00
    @Breadykid #11 你仔细去搜搜可观测性怎么干的,和埋点差不多。

    APM 一般都是通用的接口、用 Labe 区分,所以可以一个框架套所有。

    一般的做法,对代码侵入少由高到低

    - AOP:算是运行时织入吧
    - CTW:编译时织入
    - LTW:加载时织入

    LTW 就是我说的 agent ,要埋点的时候加个启动参数带上 jar 包就好
    xueling
        13
    xueling  
       2024-06-28 16:59:41 +08:00
    @Breadykid 我的项目其实不重,有单机版本,可以不用集群版本那一套,一键部署,只是你没有用过,感觉上会重而已。我的项目优势是核心的统计运算方面的功能比神策强多了,不管是承载的数据量、计算性能、能够支撑的数据指标的数量、还是实时统计方面操作的便捷性。当然,如果你确实数据需求较少,也已经部署神策了,而且他们能满足需求,那就忽略吧~~
    Breadykid
        14
    Breadykid  
    OP
       2024-07-01 12:51:25 +08:00
    @diagnostics #12 我学习下,谢谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2189 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:48 PVG 09:48 LAX 17:48 JFK 20:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86