杭州谐云 苌程 - 容器环境下基于APM的海量日志全链路跟踪分析

九冷玉

2017/12/18 发布于 技术 分类

ArchSummit全球架构师峰会是InfoQ中国团队推出的面向高端技术管理者、架构师的技术大会,参会者中超过50%拥有8年以上的工作经验。 ArchSummit秉承“实践第一、案例为主”的原则,展示新技术在行业应用中的最新实践,技术在企业转型中的加速作用,帮助企业技术管理者、CTO、架构师做好技术选型、技术团队组建与管理,并确立技术对于产品和业务的关键作用。

文字内容
1. 容器器环境下基于APM的海海量量⽇日 志全链路路跟踪分析 苌程 杭州谐云科技 VP
5. 谐云科技具有强⼤大的研发实⼒力力 谐云科技核⼼心团队来⾃自于浙江⼤大学SEL实验室 在开源Kubernetes上⾯面贡献代码全国第⼀一
6. 苌程 谐云科技 VP 谐云科技联合创始⼈人,专注于分布式系统容错,⼤大数据处理理和分析,主导设计了了 谐云APM产品。
7. 未来的IT架构⼀一定是微服务化的 容器器⽀支持服务,APM定位故障 传统IT 容器器 APM Future 微服务 谐云拥有这两款产品,且有很好结合点
8. • 为什什么需要全链路路的⽇日志排查 • 什什么是全链路路 • 代码中如何实现全链路路 • 如何基于代码增强的⽅方式实现⽇日志增强 • 容器器云带来的挑战
9. 简单应⽤用架构的⽇日志排查过程 ⽤用户 商品 交易易 Web APP 容器器 数据库 ⽤用户表 商品表 交易易表 单台机 器器 ⽤用户 商品 交易易 Web app 容器器 ⽤用户表 数据库 商品表 交易易表 应⽤用服务器器 数据库服务器器 当应⽤用架构较简单的时候 只有⼀一个⽇日志⽂文件,直接查看⽂文件即可 EASY
10. 稍微复杂⼀一点应⽤用架构的排查过程 ⽤用户 商品 交易易 Web app 容器器 应⽤用服务器器1 ⽤用户 商品 交易易 Web app 容器器 应⽤用服务器器2 数据库 ⽤用户表 商品表 交易易表 数据库服务器器 ⼀一个集群⾥里里⾯面有限的⼏几个应⽤用⽇日志 多花点时间,直接查看⽂文件即可 有点烦,但还能接受 强强强强
11. 较复杂的应⽤用架构的⽇日志排查过程 携带session的cookie 负载均衡器器 ⽤用户 应⽤用服务器器1 ⽤用户 应⽤用服务器器2 ⽤用户服务集群 搜 商品 应⽤用服务器器3 商品 应⽤用服务器器4 商品服务集群 写 交易易 应⽤用服务器器5 交易易 应⽤用服务器器6 交易易服务集群 读 NOSQL数据库 缓存集群 同步 搜索引擎 搜索引擎(集群) ⽤用户 商品 交易易 写库垂直拆分 ⽤用户 商品 交易易 读库⽔水平拆分 基于ELK 的统⼀一⽇日 志 ➢ 搜索 ➢ ⽂文件导出 在统⼀一⽇日 志⽀支撑下, 还能统⼀一 接受
12. 典型基于微服务调⽤用的⽇日志排查过程 携带session的cookie 负载均衡器器 商品 商品 系统 系统 商品服务集群 商品中 ⼼心 登录 登录 注册 注册 ⽤用户服务集群 ⽤用户中 ⼼心 搜 写 交易易 交易易 系统 系统 交易易服务集群 交易易中 ⼼心 读 同步 NOSQL数据库 搜索引擎 ⽤用户 商品 交易易 缓存集群 搜索引擎(集群) 写库垂直拆分 ⽤用户 商品 交易易 读库⽔水平拆分 容器器环境的特点 弹性伸缩 1 2 相同的服务实例例 数很多⼏几⼗十个, 甚⾄至上百个
13. 统⼀一⽇日志为啥不不能完全解决问题? 1 统⼀一⽇日志的使⽤用⽅方式是:搜索 2 在微服务的整条链路路上的应⽤用都需要关⼼心 结论:搜索出来的⾮非相关性信息太多 3 • ⽐比如搜索:Error,那意味整个系统所有的微服务的Error⽇日志可能都需要看 • 运⽓气好找到⼀一个相关性的⽇日志之后,再去关联其它服务节点上的⽇日志很复杂,⽆无从 下⼿手
14. 全链路路的⽇日志含义 ▌可以将⽤用户⼀一次访问相关的⽇日志信息经过所有服务不不同实例例完全找出来,并且能 够按照实际响应顺序显示出来 Mar 02, 2016 10:12:28 AM org.apache.coyote.http11.Http11Protocol pause INFO:'>INFO:'>INFO:'>INFO: Pausing Coyote HTTP/1.1 on http-8080 Mar 02, 2016 10:12:29 AM org.apache.catalina.core.StandardService stop INFO:'>INFO:'>INFO:'>INFO: Stopping service Catalina Mar 02, 2016 10:12:29 AM org.apache.coyote.http11.Http11Protocol destroy INFO:'>INFO:'>INFO:'>INFO: Stopping Coyote HTTP/1.1 on http-8080 A服务处 理理此次访 问的⽇日志 信息 B服务处 理理此次访 问的⽇日志 信息 C服务处 理理此次访 问的⽇日志 信息 D服务处 理理此次访 问的⽇日志 信息 a1 b2 c4 d9
15. • 为什什么需要全链路路的⽇日志排查 • 全链路路的⽇日志排查 • 代码中如何实现全链路路 • 如何基于代码增强的⽅方式实现⽇日志增强 • 容器器云带来的挑战
16. 什什么是全链路路?Google Dapper的全链路路
 (User) Reply X Request X A (Frontend) rpc1 rpc2 (Middle Tier) C rpc3 rpc4 B E D (Backend)
17. 为什什么要全链路路? 快速交付与快速排查 VIP⽤用 户 张总,想买50万的理理财 产品失败,登陆不不 上。。。 李李导,我⻢马上联系相关 ⽼老老板 ⼈人,周末请你喝喝酒(抱 拳状) ⽼老老板 50万的理理财产品登陆不不 上!⽕火速解决!!! 前台 我没问题,问问服务报错 了了吗? D中B台A 叫是什你什么没叫调,过连来数吧据,都我没连连⽇日 志都上没!打! 后台 胡说什什么?我这有反应, 你传错了了! ⽼老老板 运维 50万的理理财产品登陆不不 上!⽕火速解决!!! 进程都在,也没看⻅见ZB报错 呀! DBA 叫什什么叫,连数据都没连上! 基础 傻X,磁盘满了了,都不不知道在 叫啥。。。 ⽼老老板 张三说李李四,李李四说王五,说了了半天都两个⼩小时了了(叹⽓气状),就不不能解决地快点吗? 员⼯工 谁不不想快啊?但也要快的起来呀!⽼老老板,我们都没偷懒啊(⽆无奈奈状)。。。。。。
18. • 为什什么需要全链路路的⽇日志排查 • 全链路路的⽇日志排查 • 代码中如何实现全链路路 • 如何基于代码增强的⽅方式实现⽇日志增强 • 容器器云带来的挑战
19. 全链路路的实现 Node1 RPC1 Node2 RPC2 RPC3 TxId=Node1^Time^1 SpanId=1 pSpanId=-1 TxId=Node1^Time^1 SpanId=2 pSpanId=1 TraceID : 识别⽤用户⼀一次请求,所有全链 Node3 路路上的节点共⽤用⼀一个TraceID TxId=Node1^ Time^1 SpanId=3 pSpanId=2 SpanID:正在处理理⽤用户请求的节点 Node4 TxId=Node1^ Time^1 SpanId=4 pSpanId=2 ParentSpanID:正在处理理⽤用户请求节点 的上⼀一个节点
20. Opentracing VS ⾃自动化插裝 Opentracing的优略略势 ① 适⽤用于任何代码框架 ② 对代码开发团队需要有较 强的要求,测试团队需要 配合⼀一起测试 VS ⾃自动化插裝的优劣势 ① ⽆无需代码开发 ② ⽀支持的框架有 限制
21. • 为什什么需要全链路路的⽇日志排查 • 全链路路的⽇日志排查 • 代码中如何实现全链路路 • 如何基于代码增强的⽅方式实现⽇日志增强 • 容器器云带来的挑战
22. 全链路路⽇日志示例例 [2017-12-06 18:53:36] [ERROR] (AccountAction:206) - AccountAction.prepare... , transactionId = test@jeeshopclient-3177904429-875h5:8080'>jeeshopclient-3177904429-875h5:8080'>jeeshopclient-3177904429-875h5:8080'>jeeshopclient-3177904429-875h5:8080^1512552181462^74 [2017-12-06 18:53:36] [ERROR] (AccountAction:678) - toLogin... , transactionId = test@jeeshopclient-3177904429-875h5:8080'>jeeshopclient-3177904429-875h5:8080'>jeeshopclient-3177904429-875h5:8080'>jeeshopclient-3177904429-875h5:8080^1512552181462^74 [2017-12-06 18:53:36] [ERROR] (FrontInterceptor:28) - CommonInterceptor.intercept... , transactionId = test@jeeshopclient-3177904429-875h5:8080'>jeeshopclient-3177904429-875h5:8080'>jeeshopclient-3177904429-875h5:8080'>jeeshopclient-3177904429-875h5:8080^1512552181462^74
23. Java常⽤用的⽇日志框架配置 ⽇日志配置基本相似 Log4j Log4j2 Logback 配置⽇日志格式化输出⽅方式(Layout) 配置⽇日志模版(Pattern) Layout的主要作⽤用就是解析Pattern, 格式化输出⽇日志信息
24. ⽇日志常⻅见配置(Log4J为例例) 配置⽇日志输出⽅方式 log4jj..aappppeennddeer.rs.stdtdoouut=t=orogr.gap.eaAcphpe.elongd4j.ConsoleAppender er 配置⽇日志路路径 lloogg44j.ja.pappepnednedr.setrd.osutdt.oTaurtg=eto=rSgy.setAempp.oeunt d er 配置⽇日志格式化⽅方式 lloogg44jj..aappppeennddeer.rs.stdtdoouut.tla=yoorugt.=eoArpgp.aepnadche.log4j.PatternLayout er 配置具体格式,通过 layout解析pattern lloogg44jj..aappppeennddeer.rs.stdtdoouut.tla=yoorugt..eCAopnpveenrsdionPattern = e%r-d{yyyy-MM-dd HH:mm:ss} %m%n 24
25. ⽇日志解析过程 ▌根据配置⽂文件,实例例化PatternLayout,解析pattern PatternConverter对象实质就是⼀一个链表,把pattern中的参数拆解 PatternLayout pattern PatternParser 将pattern转为 PatternConverter PatternConverter ▌每当⽇日志事件到来,调⽤用PatternLayout的format获取格式化⽇日志 ⽇日志事件 format PatternLayout 遍历 PatternConverter 链表,填充内容 返回格式化⽇日志
26. ⽇日志增强输出全链路路的traceid ⾃自定义开发 PatternLayout、 PatternParser、 PatternConverter 在配置⽂文件中需要将layout参数指定为⾃自定义的PatternLayout log4j.appender.CONSOLE.layout=org.xx.TracePatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d [%T] %-5p %c{1}:%L - %m%n 修改pattern,添 加%T。“%T”是 能够被 PatternConvert er识别的,可以 将其转化为 TraceID 26
27. 基于APM⽇日志增强⽅方式 ⽆无需额外配置就 可以开启⽇日志增 强 拦截某⽅方法,追 加Pattern格式 ,加⼊入%T(只 执⾏行行⼀一次) 通过每次打印⽇日 志,都会调⽤用 format⽅方法,按 照pattern打印 具体信息。通过 拦截format,注 ⼊入%T的值。
28. • 为什什么需要全链路路的⽇日志排查 • 全链路路的⽇日志排查 • 代码中如何实现全链路路 • 如何基于代码增强的⽅方式实现⽇日志增强 • 容器器云带来的挑战
29. Kubernetes 中IP不不固定带来的问题 IP不不再能唯⼀一的标识⼀一个应⽤用了了 10:00 AM :实际产⽣生⽇日志时的链路路信息 10.10.101.100(A应⽤用)->10.10.101.105(B应⽤用)-> 10.10.101.119(C应⽤用) 13:00 PM:分析⽇日志时,⽇日志所记录的IP对应的服务已经不不再是实际产 ⽣生⽇日志的服务 10.10.101.100(C应⽤用)->10.10.101.105(D应⽤用)-> 10.10.101.119(E应⽤用)
30. 如何解决? 优点 实现简单 ⽅方案⼀一 记录⽇日志时,同时多记录⼀一个字段 ,对应的是应⽤用名称 How? 缺点 浪费存储
31. 通过Pod Name来唯⼀一的标识应⽤用 采集⽇日志数据时,按照pod name进⾏行行应⽤用标识 APM的agent也按照pod name进⾏行行应⽤用标识
32. 视频演示