微服务业务监控和行为分析怎么做?试试日志埋点

原创
2019/11/11 13:32
阅读数 1.1W

file

一、说明

互联网公司一般都会有专门的数据团队对公司的一些业务指标负责;为了拿到这些基本的业务指标,一般也要工程团队去配合做一些数据采集工作,于是埋点诞生了。  

埋点的方式有很多种,本文主要介绍 日志埋点 这种方式以及实现思路和案例。

日志埋点 就是通过程序打印 log 日志的方式进行业务/行为数据的记录

 

二、总体架构

file

通过 日志埋点 来实现业务监控和行为分析主要需要以下4个步骤

  1. 数据生成(埋点)
  2. 数据收集
  3. 数据解析(结构化)
  4. 数据落盘
  5. 数据使用(展示/分析)

 

三、方案说明

3.1. 数据生成

日志数据的生成直接使用 Logback 等日志框架就可以了,可以自己封装公共方法、aop、注解等方式来生成指定的埋点日志

但是为了便于后面的数据解析,日志数据需要规范先行

  1. 所有的埋点日志必需约定好统一的格式,例如:{时间}|{来源}|{对象id}|{类型}|{对象属性(以&分割)}

按上面的格式生成的日志为: 2019-11-07 10:32:01|api-gateway|1|request-statistics|ip=171.221.203.106&browser=CHROME&operatingSystem=WINDOWS_10

  1. 避免埋点的日志文件和系统本身输出的日志混淆 file

埋点的日志输出的目录、文件等需要和应用本身的日志分离,通过 Logback 的配置就能实现

 

埋点案例

file

生成日志

file

网关埋点用户请求

 

3.2. 数据收集

关于日志数据的收集可选择的中间件比较多,除了图中的 FileBeat 之外还有 FlumeFluentdrsyslog 等;需要每台服务器都部署一个收集中间件。

每台服务器部署一个就行了,就算一台服务器中启了多个微服务也是可以一齐收集

PS:日志收集后面的 消息队列 并不是必需的可以去掉,但是增加 消息队列 后有以下两个优点

  1. 削峰填谷:减轻后面日志解析的压力
  2. 数据共享:日志数据除了提供给日志系统之外,可以增加消费端的同时提供给其他地方使用,如流计算等

 

3.3. 数据解析

使用 Logstashgrok表达式解析日志数据并结构化,以上面的日志数据为例

2019-11-07 10:32:01|api-gateway|1|request-statistics|ip=171.221.203.106&browser=CHROME&operatingSystem=WINDOWS_10

结构化后的日志数据为:

{
	timestamp: '2019-11-07 10:32:01',
	appName: 'api-gateway',
	resouceid: '1',
	type: 'request-statistics',
	ip: '171.221.203.106',
	browser: 'CHROME',
	operatingSystem: 'WINDOWS_10'
}

 

3.4. 数据落盘

通过 Logstash 能自动创建 Elasticsearch 索引并以天为单位分片 file

可以通过索引模板来指定每个字段的类型和分词器等属性

 

3.5. 数据使用

日志数据落盘到 Elasticsearch 后,就可以通过聚合查询等方式实时显示监控数据或者分析日志数据

监控案例

file

聚合查询逻辑可参考 https://gitee.com/zlt2000/microservices-platform

 

四、总结

日志埋点 只是其中一种埋点手段而已,优点是系统无入侵且灵活;日志收集、解析、落盘等都可以灵活搭配选择不同的中间件,并且不需要修改源系统的代码;并且可以方便对接其他分析平台(例如: 大数据平台)

PS:业务监控是否可以不做日志埋点,直接查询业务的数据库呢?(不建议这样做)

  1. 使用日志埋点能实现监控数据与业务数据分离,监控平台不会影响或增加业务数据库的压力
  2. 使用日志埋点能方便实现实时业务数据预警

举个栗子:日志收集后面添加流计算中间件,计算某个时间窗口内优惠卷日志的数量或者金额大于某个阀值,则发出预警

 

推荐阅读

 

扫码关注有惊喜!

file

展开阅读全文
打赏
5
88 收藏
分享
加载中
架构图是用什么画的啊
2019/11/15 07:24
回复
举报
zlt2000博主
processOn
2019/11/15 10:13
回复
举报
好的,谢谢
2019/11/19 17:56
回复
举报
这个是后端埋点而已!还要前端埋点
2019/11/14 21:14
回复
举报
zlt2000博主
对的,只是抛砖引玉
2019/11/15 10:12
回复
举报
感觉用了PointUtil后,如果是异常日志是不是就不知道异常出现行数了呢?现在我们系统用的是slf4j+log2。
2019/11/13 14:55
回复
举报
zlt2000博主
应用日志和埋点日志不是同一个东西,我文章中提到要分离的,应用的info/error/exception等日志都属于应用日志
2019/11/13 20:17
回复
举报
zlt2000博主
文中的PointUtil只是用于埋点
2019/11/13 20:18
回复
举报
这样的话还是有代码入侵啊,不是很完美
2019/11/14 10:27
回复
举报
zlt2000博主
埋点这个操作并不通用并不能像审计日志那样的封装通用打log;不同的业务不同的场景有不同的埋点需求,你这边如果有更好的想法可以讨论一下
2019/11/14 16:49
回复
举报
本来是想用springAOP拦截日志的 log.error()的,结果发现spring并没有维护log对象,拦截不到。只能考虑通过log4j2的appender 里有一个HTTP 实现把错误日志发送到一个地址进行收集
2019/11/15 14:52
回复
举报
zlt2000博主
没必要的,你的需求就算想error日志单独一个文件?如果是这样的通过log的appender配置很简单就能实现某个日志级别,单独输出都某个文件中去
2019/11/15 21:21
回复
举报
回复 @zlt2000 : 我想的是系统有error的时候能够及时知道,所以用appender通知到HTTP,然后接收后发短信钉钉之类的
2019/11/16 11:16
回复
举报
埋点可以通过自定义日志格式做,不需要改代码
2019/11/13 09:44
回复
举报
zlt2000博主
自定义日志格式是必要的,但是需要分离应用日志与埋点日志
2019/11/13 10:23
回复
举报
我们是filebeat->kafka->flink->es
2019/11/11 14:24
回复
举报
zlt2000博主
👍
2019/11/11 22:18
回复
举报
更多评论
打赏
17 评论
88 收藏
5
分享
返回顶部
顶部