微服务业务监控和行为分析怎么做?试试日志埋点
一、说明
互联网公司一般都会有专门的数据团队对公司的一些业务指标负责;为了拿到这些基本的业务指标,一般也要工程团队去配合做一些数据采集工作,于是埋点诞生了。
埋点的方式有很多种,本文主要介绍 日志埋点
这种方式以及实现思路和案例。
日志埋点
就是通过程序打印log
日志的方式进行业务/行为数据的记录
二、总体架构
通过 日志埋点
来实现业务监控和行为分析主要需要以下4个步骤
- 数据生成(埋点)
- 数据收集
- 数据解析(结构化)
- 数据落盘
- 数据使用(展示/分析)
三、方案说明
3.1. 数据生成
日志数据的生成直接使用 Logback
等日志框架就可以了,可以自己封装公共方法、aop、注解等方式来生成指定的埋点日志
但是为了便于后面的数据解析,日志数据需要规范先行
所有的埋点日志必需约定好统一的格式,例如:{时间}|{来源}|{对象id}|{类型}|{对象属性(以&分割)}
按上面的格式生成的日志为:
2019-11-07 10:32:01|api-gateway|1|request-statistics|ip=171.221.203.106&browser=CHROME&operatingSystem=WINDOWS_10避免埋点的日志文件和系统本身输出的日志混淆
埋点的日志输出的目录、文件等需要和应用本身的日志分离,通过
Logback
的配置就能实现
埋点案例
生成日志
网关埋点用户请求
3.2. 数据收集
关于日志数据的收集可选择的中间件比较多,除了图中的 FileBeat
之外还有 Flume
、Fluentd
、rsyslog
等;需要每台服务器都部署一个收集中间件。
每台服务器部署一个就行了,就算一台服务器中启了多个微服务也是可以一齐收集
PS:日志收集后面的 消息队列
并不是必需的可以去掉,但是增加 消息队列
后有以下两个优点
- 削峰填谷:减轻后面日志解析的压力
- 数据共享:日志数据除了提供给日志系统之外,可以增加消费端的同时提供给其他地方使用,如流计算等
3.3. 数据解析
使用 Logstash
的grok表达式解析日志数据并结构化,以上面的日志数据为例
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
索引并以天为单位分片
可以通过索引模板来指定每个字段的类型和分词器等属性
3.5. 数据使用
日志数据落盘到 Elasticsearch
后,就可以通过聚合查询等方式实时显示监控数据或者分析日志数据
监控案例
四、总结
日志埋点
只是其中一种埋点手段而已,优点是系统无入侵且灵活;日志收集、解析、落盘等都可以灵活搭配选择不同的中间件,并且不需要修改源系统的代码;并且可以方便对接其他分析平台(例如: 大数据平台)
PS:业务监控是否可以不做日志埋点,直接查询业务的数据库呢?(不建议这样做)
- 使用日志埋点能实现监控数据与业务数据分离,监控平台不会影响或增加业务数据库的压力
使用日志埋点能方便实现实时业务数据预警
举个栗子:日志收集后面添加流计算中间件,计算某个时间窗口内优惠卷日志的数量或者金额大于某个阀值,则发出预警
推荐阅读
- 日志排查问题困难?分布式日志链路跟踪来帮你
- zuul集成Sentinel最新的网关流控组件
- Spring Cloud开发人员如何解决服务冲突和实例乱窜?
- Spring Cloud同步场景分布式事务怎样做?试试Seata
- Spring Cloud异步场景分布式事务怎样做?试试RocketMQ
- Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单
扫码关注有惊喜!
原文地址:https://www.cnblogs.com/zlt2000/p/11834372.html
- 七牛镜像存储 WordPress 插件 的代码化
- WordPress 会自动压缩JPEG 格式的图像?
- jquery操作DOM 元素(2)
- WordPress 中部署真正的懒加载(Lazy Load)
- 图形化的2008R2 Server Core 配置管理工具
- 各种浏览器的userAgent
- WordPress 根据浏览器 user-agent 按需加载CSS 文件
- memcached的最新状态
- [程序设计语言]-01:引言
- ASP.NET Ajax 库
- ASP.NET进程优化
- 多说 提速:js内页页脚加载、静态文件CDN
- 微信小程序的王者时代
- [程序设计语言]-[核心概念]-02:名字、作用域和约束(Bindings)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 手写一个Promise/A+,完美通过官方872个测试用例
- 浅析白盒审计中的字符编码及SQL注入
- JS做类型检测到底有几种方法?看完本文就知道了!
- HDwiki时间延迟盲注及利用代码
- JS作用域和变量提升看这一篇就够了
- 不知道怎么提高代码复用性?看看这几种设计模式吧!
- 框架源码中用来提高扩展性的设计模式
- 不知道怎么提高代码质量?来看看这几种设计模式吧!
- 手写React的Fiber架构,深入理解其原理
- emlog后台作者权限SQL注入
- 手写一个Redux,深入理解其原理
- 手写一个React-Redux,玩转React的Context API
- 使用React-Router实现前端路由鉴权
- 手写React-Router源码,深入理解其原理
- 深入Node.js的模块加载机制,手写require函数