JAVA中什么是埋点,应用于什么场景?
一个非常好的问题。我是工作多年的Web应用架构师,来回答一下这个问题。欢迎关注我,了解更多IT专业知识。
一,埋点是什么?
埋点是软件开发中的一个术语,用于采集数据或者验证代码执行过程,不只是Java才有,各种开发语言中都有成熟的SDK开发包和框架使用。
埋点的场景有多种,可以在程序执行时,还有在单元测试时。可以在服务器,也可以在客户端。可以收集程序运行数据,也可以收集用户数据。
二,单元测试时的埋点
重点补充单元测试时用到的埋点技术。
单元测试的目的是测试被测函数。但是被测函数往往不是那么“简单”,首先有入参,其次要依赖使用其它的变量、函数、数据、还有第三方接口,等等。
被测试函数的代码执行路径也会有多个,比如if-else,异常处理。
如何模拟不同的场景,控制被测函数的运行依赖环境,验证运行过程和返回结果是否符合预期?以Java开发为例,使用JUnit + Mockit,一个典型的单元测试组成如下:
1. mock模拟依赖的数据、变量、函数、第三方接口,等等
2. stub打桩埋点,设置期望的执行过程、入参、出参等信息。
3. verify验证代码执行过程,比如埋点的函数被调用了1次,入参是abc。
4. doThrow设置异常抛出,验证异常发生时的处理逻辑是否符合预期。
三,单元测试的埋点示例
举个例子,被测试函数parseMsg(),读取ActiveMQ消息内容,转换成JSONObject
1,模拟入参TestMessage
2,在getText()函数处打桩埋点,设置返回值
3,调用被测试函数,验证getText()函数被调用了一次
4,验证异常发生时,处理逻辑是否正确
埋点大概分成2种
业务埋点
这里埋点的含义就是:预先在用户可能操作的"点",埋下上报的代码,一旦用户发生了操作,我就上报该用户操作的详细信息
一般是要产品或者运营提出需求,在哪里埋点,比如
- 进入某个界面,客户端上报"xx用户进入了xx页面"
- 离开时再上报"xx用户离开了xx页面"
本质上是跟踪用户的行为,用户什么时候打开了应用,点击了哪些标题/功能入口/广告,逗留了多长时间
这就是所谓的大数据了,可以分析出用户对什么样的内容感兴趣,从而更精准的向用户推荐内容
最好就是用户每一个操作都能上报给后台,用户不操作,也会触发上报,比如,"进入了xx页面n秒钟没有操作"
要说明的是,这种埋点和具体你用哪种开发语言无关
监控埋点
这种埋点不是给产品和运营分析用户的,是让开发/运维对自己的程序有个更精准的认识
比如
- 定时采集服务器的cpu负载,内存占用情况,io负载,java 的 gc 信息
- 程序执行某个功能的耗时,进行远程调用时的耗时
- 程序在一段时间内捕捉到了哪些异常
- 在一段时间内,远程接口的平均响应时间,请求次数,成功返回次数,失败次数,超时次数
- 等等
这种埋点有助于开发、运维分析程序的性能问题,监控程序的健康程度,提早进行异常的告警
这样的埋点称为metric,grafana就是一款很优秀的开源的metric监控,你只需要定时把埋点数据提交给它,可以查看各项metric的统计曲线,并设定告警规则,当某个metric达到告警阈值,可以通过邮件、短信、即时通信程序(IM)向你推送告警信息
由于这样的埋点对业务代码有很严重的侵入,所以很多公司会开发通用的埋点框架,采用反射等方式进行运行监控

