1、容器环境下基于APM的海量日志全链路跟踪分析未来的IT架构一定是微服务化的容器APM传统IT容器支持服务,APM定位故障这两款产品,有很好结合点微服务目录CONTENTS为什么需要全链路的日志排为什么需要全链路的日志排查查什么是全链路什么是全链路代码中如何实现全链路代码中如何实现全链路如何基于代码增强的方式实如何基于代码增强的方式实现现 日志增强日志增强容器云带来的挑战容器云带来的挑战简单应用架构的日志排查过程用户商品交易应用服务器应用服务器用户商品交易容器用户表商品表交易表数据库服务器数据库数据库用户商品交易Web app交易Web APP容器数据库用户表 商品表 交易表单台机单台机 器器用
2、户商品当应用架构较简单的时候只有一个日志文件,直接查看文件即可EASY多花点时间,直接查看文件即可强强强强稍微复杂一点应用架构的排查过程用户商品交易Web app容器用户商品交易Web app容器应用服务器1应用服务器2数据库用户表商品表交易表数据库服务器一个集群里面有限的几个应用日志有点烦,但还能接受较复杂的应用架构的日志排查过程负载均衡器携带携带session的的cookie用户服务集群应用服务器1应用服务器2用户用户商品服务集群应用服务器3应用服务器4商品商品交易服务集群应用服务器5应用服务器6交易交易NOSQL数据库缓存集群索引擎搜搜索引擎(集群)写库垂直拆分读库水平拆分用户商品交易交
3、易用户商品搜写读同步基于ELK 的统一日 志 搜索 文件导出在统一日 志支撑下,还能统一接受典型基于微服务调用的日志排查过程负载均衡器携带session的cookie商品商品系统系统缓存集群索引擎NOSQL数据库搜搜索引擎(集群)写库垂直拆分读库水平拆分商品交易用户商品交易用户搜写读同步登录登录注册注册交易交易系统系统商品服务集群用户服务集群交易服务集群商品中 心用户中 心交易中 心容器环境的特点弹性伸缩相同的服务实例 数很多几十个, 甚至上百个统一日志为啥不能完全解决问题?123 在微服务的整条链路上的应用都需要关心结论:搜索出来的非相关性信息太多 比如搜索:Error,那意味整个系统所有的
4、微服务的Error日志可能都需要看 运气好找到一个相关性的日志之后,再去关联其它服务节点上的日志很复杂,无从 下手统一日志的使用方式是:搜索全链路的日志含义c4d9C服务处 理此次访 问的日志 信息D服务处 理此次访 问的日志 信息A服务处 理此次访 问的日志 信息b2B服务处 理此次访 问的日志 信息a1可以将用户一次访问相关的日志信息经过所有服务不同实例完全找出来,并且能够 按照实际响应顺序显示出来Mar 02, 2016 10:12:28 AM org.apache.coyote.http11.Http11Protocol pause INFO: Pausing Coyote HTTP/
5、1.1 on http-8080Mar 02, 2016 10:12:29 AM org.apache.catalina.core.StandardService stopINFO: Stopping service CatalinaMar 02, 2016 10:12:29 AM org.apache.coyote.http11.Http11Protocol destroy INFO: Stopping Coyote HTTP/1.1 on http-8080目录CONTENTS为什么需要全链路的日志排为什么需要全链路的日志排查查全链路的日志排查全链路的日志排查代码中如何实现全链路代码中如何
6、实现全链路如何基于代码增强的方式实如何基于代码增强的方式实现现 日志增强日志增强容器云带来的挑战容器云带来的挑战什么是全链路?Google Dapper的全链路AECBD(User)Reply XRequest Xrpc1rpc2(Middle Tier)(Frontend)rpc3(Backend)rpc4老板老板张三说李四,李四说王张三说李四,李四说王五五,说,说了了半天半天都都两个两个小小时了时了(叹气叹气状状),),就就不能不能解解决地决地快快点吗点吗?员工员工谁不想快啊?但也要快谁不想快啊?但也要快的的起来起来呀呀!老!老板板,我,我们们都没都没偷偷懒啊懒啊(无奈无奈状状)。)。运维
7、运维进程都在,也没看见ZB报错 呀!DBA叫什么叫,连数据都没连上!DBA基础基础叫什么叫,连数据都没连上!傻X,磁盘满了,都不知道在 叫啥。老板老板50万的理财产品登陆不上!火速解决!老板老板VIP用用户户张总,想买50万万的理财 产品失败,登陆不上。李导,我马上联系相关 人,周末请你喝酒(抱 拳状)前台前台我没问题,问问服务报错 了吗?DBA叫什么叫,连数据都没连 上!中台中台后台后台是你没调过来吧,我连日 志都没打!胡说什么?我这有反应, 你传错了!老板老板50万的理财产品登陆不 上!火速解决!为什么要全链路?快速交付与快速排快速交付与快速排查查目录CONTENTS为什么需要全链路的日志
8、排为什么需要全链路的日志排查查全链路的日志排查全链路的日志排查代码中如何实现全链路代码中如何实现全链路如何基于代码增强的方式实如何基于代码增强的方式实现现 日志增强日志增强容器云带来的挑战容器云带来的挑战Node1Node2Node4Node3RPC1RPC2RPC3TxId=Node1Time1 SpanId=1pSpanId=-1TxId=Node1Time 1SpanId=2 pSpanId=1TxId=Node1Time1 SpanId=3 pSpanId=2TxId=Node1Time1 SpanId=4 pSpanId=2TraceID : 识别用户一次请求,所有全链 路上的节点共
9、用一个TraceIDSpanID:正在处理用户请求的节点ParentSpanID:正在处理用户请求节点 的上一个节点全链路的实现Opentracing VS 自动化插裝Opentracing的优略势适用于任何代码框架对代码开发团队需要有较 强的要求,测试团队需要 配合一起测试自动化插裝的优劣势无需代码开发支持的框架有限制目录CONTENTS为什么需要全链路的日志排为什么需要全链路的日志排查查全链路的日志排查全链路的日志排查代码中如何实现全链路代码中如何实现全链路如何基于代码增强的方式实如何基于代码增强的方式实现现 日志增强日志增强容器云带来的挑战容器云带来的挑战全链路日志示例2017-12-0
10、6 18:53:36 ERROR (AccountAction:206) - AccountAction.prepare. , transactionId = testjeeshopclient-3177904429- 875h5:80801512552181462742017-12-06 18:53:36 ERROR (AccountAction:678) - toLogin. , transactionId = testjeeshopclient-3177904429-875h5:80801512552181462742017-12-06 18:53:36 ERROR (FrontInte
11、rceptor:28) -CommonInterceptor.intercept. , transactionId = testjeeshopclient-3177904429-875h5:8080151255218146274Java常用的日志框架配置Log4j Log4j2 Logback日志配置基本相似配置日志格式化输出方式(Layout)配置日志模版(Pattern)Layout的主要作用就是解析Pattern,格式化输出日志信息日志常见配置(Log4J为例)配置日志输出方式配置日志路径配置日志格式化方式配置具体格式,通过layout解析patternlog4j.appender.st
12、dout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%-dyyyy-MM-dd HH:mm:ss %m%n日志解析过程PatternLayoutPatternParserpatternPatternConverter将pattern转为PatternConverter日志事件Patter
13、nLayoutformat遍 历 PatternConverter 链表,填充内容返回格式化日志根据配置文件,实例化PatternLayout,解析patternPatternConverter对象实质就是一个链表,把pattern中的参数拆解每当日志事件到来,调用PatternLayout的format获取格式化日志日志增强输出全链路的traceid自定义开发自定义开发PatternLayout、PatternParser、 PatternConverter在配置文件中需要将在配置文件中需要将layout参数指定为自定义的参数指定为自定义的PatternLayout修修改改pattern,添
14、,添加加%T。“%T”是能够被是能够被PatternConverter识别的,可以识别的,可以 将其转化为将其转化为TraceIDlog4j.appender.CONSOLE.layout=org.xx.TracePatternLayo utlog4j.appender.CONSOLE.layout.ConversionPattern=%d%T %-5p %c1:%L - %m%n基于APM日志增强方式无需额外配置就 可以开启日志增 强拦截某方法,追加Pattern格式,加入%T(只 执行一次)通过每次打印日 志,都会调用 format方法, 按照pattern打印 具体信息。通过 拦 截 f
15、ormat, 注入%T的值。目录CONTENTS为什么需要全链路的日志排为什么需要全链路的日志排查查全链路的日志排查全链路的日志排查代码中如何实现全链路代码中如何实现全链路如何基于代码增强的方式实如何基于代码增强的方式实现现 日志增强日志增强容器云带来的挑战容器云带来的挑战Kubernetes 中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应用)IP不再能唯一的标识一个应用了如何解决?实现简单优点方案一How?记录日志时,同时多记录一个字段,对应的是应用名称缺点浪费存储通过Pod Name来唯一的标识应用采集日志数据时,按照pod name进行应用标识APM的agent也按照pod name进行应用标识感感 谢谢 聆聆 听听Thanks!