文档章节

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

zlt2000
 zlt2000
发布于 11/11 13:32
字数 1239
阅读 3108
收藏 83

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

© 著作权归作者所有

zlt2000

zlt2000

粉丝 16
博文 12
码字总数 13111
作品 1
广州
架构师
私信 提问
加载中

评论(17)

半夜的源迷
半夜的源迷
架构图是用什么画的啊
zlt2000
zlt2000 博主
processOn
半夜的源迷
半夜的源迷
好的,谢谢
开源oschina
开源oschina
这个是后端埋点而已!还要前端埋点
zlt2000
zlt2000 博主
对的,只是抛砖引玉
Skqing
Skqing
感觉用了PointUtil后,如果是异常日志是不是就不知道异常出现行数了呢?现在我们系统用的是slf4j+log2。
zlt2000
zlt2000 博主
应用日志和埋点日志不是同一个东西,我文章中提到要分离的,应用的info/error/exception等日志都属于应用日志
zlt2000
zlt2000 博主
文中的PointUtil只是用于埋点
Skqing
Skqing
这样的话还是有代码入侵啊,不是很完美
zlt2000
zlt2000 博主
埋点这个操作并不通用并不能像审计日志那样的封装通用打log;不同的业务不同的场景有不同的埋点需求,你这边如果有更好的想法可以讨论一下
Skqing
Skqing
本来是想用springAOP拦截日志的 log.error()的,结果发现spring并没有维护log对象,拦截不到。只能考虑通过log4j2的appender 里有一个HTTP 实现把错误日志发送到一个地址进行收集
zlt2000
zlt2000 博主
没必要的,你的需求就算想error日志单独一个文件?如果是这样的通过log的appender配置很简单就能实现某个日志级别,单独输出都某个文件中去
Skqing
Skqing
回复 @zlt2000 : 我想的是系统有error的时候能够及时知道,所以用appender通知到HTTP,然后接收后发短信钉钉之类的
丁富贵
埋点可以通过自定义日志格式做,不需要改代码
zlt2000
zlt2000 博主
自定义日志格式是必要的,但是需要分离应用日志与埋点日志
d
dieslrae
我们是filebeat->kafka->flink->es
zlt2000
zlt2000 博主
👍
Spring Cloud 接入 EDAS 之全链路跟踪

在上一篇 Spring Cloud 接入 EDAS 之服务发现篇 中已经讲解了如何接入 EDAS 的服务注册中心。在这一篇中,我们将聊聊全链路跟踪。 全链路跟踪的必要性 微服务框架带来的好处已经无需多言,模...

flystar32
2017/11/23
0
0
案例|服务化架构系统监控难题解决方案

原文网址链接:http://url.cn/kVjUVO 众所周知,系统监控一直是拥有复杂IT架构的企业所面临的一个重要问题,而这也并不是每家企业都能够轻松解决的技术挑战。OPPO作为一家国际智能终端设备及...

数通畅联
2015/11/02
389
0
分布式调用跟踪系统调研笔记

分布式调用链跟踪系统通常有几个设计目标 低侵入性 -- 作为非业务组件,应当尽可能少侵入或者无侵入其他业务系统,对于使用方透明,减少开发人员的负担; 灵活的应用策略 -- 可以(最好随时)...

ginobefun
2017/05/25
0
0
每周送书 | 基于微服务的日志中心设计、实现与关键配置

引言: 日志向来都是运维以及开发人员最关心的问题。运维人员可以及时的通过相关日志信息发现系统隐患、系统故障并及时安排人员处理解决问题。开发人员解决问题离不开日志信息的协助定位。没...

技术小能手
2018/06/14
0
0
移动应用要如何埋点上传才能收集更多数据?

作者介绍 程君杰,曾就职于阿里巴巴移动事业部,数据技术专家。主要负责业务数据分析挖掘系统架构和设计,包括大规模数据采集、分析处理、数据挖掘、数据可视化、高性能数据服务等。 1简介 ...

刈刀(程君杰)
2016/08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

交换机switch 的shutdown 与 no shutdown

shutdown是关闭接口(端口),接口状态会变为DOWN,no shutdown是激活接口(端口),状态变为UP,一般在给vlan或者端口配置管理ip或者端口ip后使用。 有时候我们配置某个端口前会需要把端口关闭到...

刘日辉
35分钟前
5
0
AOP底层源码分析

思维导图 AOP AOP: 面向切面编程[底层就是动态代理] 指程序在运行期间动态的将某段代码切入到指定方法位置进行运行的编程方式。 AOP通知方式 前置通知: logStart(),在目标方法(div)运行之前运...

volc1612
49分钟前
5
0
OSChina 周六乱弹 —— 别听他们的,你不胖你只是毛茸茸的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @且无需多言 :分享Rise Against的单曲《Audience Of One (Ghost Note Symphonies)》: 硬核朋克不插电版本,隐藏在喧嚣下的柔情! 《Audienc...

小小编辑
今天
34
2
apache httpClient实现代理发送Post请求

CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials( new AuthScope("host", port), new UsernamePasswordCredentials(username, password......

huangkejie
今天
6
0
SpringCloud

单体应用存在的问题 ● 随着业务的发展,开发变得越来越复杂。 ● 修改、新增某个功能,需要对整个系统进行测试,重新部署。 ● 一个模块出现问题,很可能导致整个系统崩溃。 ● 多个开发团队...

Star永恒
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部