1. 背景
增强服务可观测性,预测与发现系统性能瓶颈,透视系统状态,为系统调优和改进提供可靠数据支撑
整个平台分为监控门户,服务日志,链路跟踪,业务指标,性能指标5部分,本文重点介绍服务日志
服务日志包括数据变更跟踪,即,服务调用改变了什么数据,数据从什么值改为什么值,但该部分需要链路跟踪支持,因此放到链路跟踪介绍
2. 参考和术语
详解可观测性监控系统中的“金三角” - 尔达Erda - 博客园
Metrics
Metrics 计算 Events 发生数量的数据集,这些数据通常具有原子性,且可以聚合。从操作系统到应用程序,任何事物都会产生 Metrics 数据,这些数据可以用来度量操作系统或应用程序是否健康,或者是用以计算一段时间内请求的平均延时。
Logging
记录离散 Events,Logging 描述的是一些列离散事件,在缺乏有力的监控系统时,Logging 数据通常是工程师在定位生产问题时最直接的手段。如果说 Metrics 可以告诉你系统或者应用程序出现问题,那么 Logging 就可以告诉你为什么会出现问题。关于日志的采集现在也有很多方法,比如:filebeat, fluented, loki 等。
Tracing
- 记录应用程序操作的数据
- 一次请求的完整生命周期
- 分布式系统中一次请求经历过多个服务产生操作的数据(Spans)
Tracing 是通过有向无环图的方式记录在分布式系统中发生的 Events 之间的因果关系。云原生场景下,多个服务之间或多或少存在着依赖关系,一次 Tracing 通常会经过多个服务(Span),甚至在高度复杂的分布式系统中,一次 Tracing 包含数以万计的 Span 也是可能存在的。再者,Tracing 更多的是关注这种端到端系统之间的联系,基于该需求,分布式追踪系统应运而生。
3. 总体规划特性
- 监控门户,统一监控门户,用户自定义视图,告警(页面,钉钉,邮件);Prometheus+grafana(运维);elasticsearch agg+数据可视化(开发)
- 服务日志: 记录时间(起始/结束),用户,用户地点(ip),服务节点(ip),服务名称,模块名称,参数(可配置),tracingId,支持异步写入,减少服务正常执行影响
- 服务性能指标,RT,请求数(1m/5m/15m),异常数(1m/5m/15m),失败数(1m/5m/15m)
- 服务调用链路,服务调用拓扑,调用关系性能,topN(最忙服务,最慢服务)
- 业务度量组件,如,拉单每秒字节数,数据笔数,拉单作业数
*日志收集ELK不在本次计划
*系统监控,如cpu,线程数(jvm),内存(jvm),磁盘io,网络io 直接使用Prometheus,不在本平台范围
4. 总体技术架构
监控门户支持用户自定义视图
5. 服务日志
- aspect/annotation 切面/注解,拦截服务,构建服务日志;支持正常日志,错误日志
- repository日志存储,默认es,支持扩展,组件提供查询功能
- model 服务log类,model .param 服务参数步处理
- event 日志打印采用事件异步,依赖guava的event bus包
- config spring boot自动配置
- adapter 适配接口,获取系统用户信息;实现由集成服务提供
- 关联链路跟踪,日志增加tracingId;支持开关,依赖tracing 上下文
- tracing上下文 zipkin/skywalking/…, 获取tracingId
- 数据变更跟踪,依赖链路跟踪,数据库需增加tracingId字段,canal捕获数据变更,最后定时任务关联服务日志和数据变更,支持开关
5.1 技术架构
service-log采用切面,非侵入拦截服务调用,切面收集信息,包括当前用户,入参等以事件发送到eventbus,使用AsynEvnetBUs,异步实现,eventbus调用onesearch索引事件到elasticsearch,本组件没有提供查找日志服务,用户需开发查询功能
5.2 开发指南
5.2.1 依赖
<dependency>
<groupId>com.leehom.arch.obs</groupId>
<artifactId>service-log</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
5.2.2 实现用户适配服务
service-log需要获取当前用户信息,用户提供UserService接口实现,demo和单元测试提供了mock服务实
5.2.3 设置和配置注解
service-log使用切面拦截服务,切面以注解标记
注解可配置params,抓取参数,使用springEL,指定抓取什么参数
"#i", "#s",基本变量参数抓取,如,int,Integer,long,Long
"#arrayStr[1]", "#listStr[1]", "#mapStr[\"1\"]"
结合类型抓取,数组,list,map
#order.orderName", "#order.item.itemName"
bean类型参数抓取
5.2.4 代码(收费)
https://download.youkuaiyun.com/download/szlhj/43622303
demo环境,eureka,zuul,elasticsearch
目前未实现链路跟踪相关部分,关联tracingId,数据变更跟踪
5.2.5 示例(收费)
单元测试和demo
https://download.youkuaiyun.com/download/szlhj/43623523
单元测试
ServiceLogTest类,日志记录测试,覆盖基本变量,集合变量,bean,异常场景
ServiceLogSearchTest 日志搜索测试
demo完整的网关到服务全链路集成测试
5.2.6 日志记录效果
数据变更跟踪
数据变更跟踪是服务日志延申,记录服务更改了什么数据,数据从什么值变更到什么值
微服务可观测平台 (二)- 链路跟踪 & 数据变更跟踪设计_leehom的博客-优快云博客
微服务可观测平台(一)-总体设计
微服务可观测平台(三)-链路跟踪及数据变更跟踪设计与实现
微服务可观测平台(四)-业务metrics设计与实现
微服务可观测平台(五)-性能metrics设计与实现