坚持原创,共同进步!请关注我,后续分享更精彩!
分布式链路
一个看似简单的互联网App背后往往有着庞大的分布式系统集群支撑。集群中系统实例数量繁多,调用依赖关系复杂。用户在app上的一次请求操作,可能影响后台多个系统间的相互协作。而这一次请求所流经的系统调用关系,就构成了一个完整的分布式调用链路。
上图,就是用户一次操作,产生的一个完整的分布式调用链路图。
背景
skywalking针对分布式链路监控有着完整的方案实现(关于skywalking,可参考我之前的文章:分布式调用链监控,SkyWalking入门介绍),但针对一些小型企业有点过重,不仅需要部署skywalking server集群,可能还会涉及elasticsearch集群,成本效益极低。
本文讨论在不额外增加服务节点前提下,不做应用的日志归集,如何做到在现有应用日志中埋点全局的traceId。虽然缺少可视化的界面,但不会新增成本。拥有全局的traceId日志,在分布式系统间日志排查和定位依旧有着极大的帮助。
方案
使用skywalking agent对应用进行traceId埋点,项目中通过logback插件把traceId添加到MDC上下文。这样原有业务日志在不受任何影响情况下,自动的添加了traceId到日志log中。
本方案要求业务项目中使用logback日志框架。
集成
分布式traceId日志集成,分为以下步骤:
- 1.下载skywalking java agent程序。
- 2.项目工程引入依赖jar包。
- 3.配置logback.xml。
- 4.项目工程启动添加agent参数。
1.skywalking java agent
使用下面地址下载skywalking 软件包,这里选择
apache-skywalking-apm-es7-8.5.0.tar.gz。
https://skywalking.apache.org/downloads/
下载完成,解压到某一目录。
bin/skywalking-agent.jar 为默认代理/探针程序,记住该文件路径地址,后面会有使用。
2.maven依赖
项目工程中添加以下maven依赖
<dependency>
<groupId>org.apache.skywalkinggroupId>
<artifactId>apm-toolkit-logback-1.xartifactId>
<version>8.5.0version>
dependency>
3.logback.xml配置
项目logback.xml文件,输出appender pattern模式中添加%X{tid},注入MDC。
%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n
注意:Appender配置中encoder和layout元素的使用类。
4.项目工程agent启动参数配置
项目启动时,添加以下3个启动参数:
#代理程序路径
-javaagent:/path/to/path/skywalking-agent.jar
#代理服务名
-Dskywalking.agent.service_name=YOUR_APP_NAME
#保持trace跟踪,即使收集后台服务不可用。默认是false
-Dskywalking.agent.keep_tracing=true
springboot项目启动命令。其中-javaagent值,对应上文bin/skywalking-agent.jar文件路径。
java \
-javaagent:d:\working\workspace\opensource\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar \
-Dskywalking.agent.service_name=app \
-Dskywalking.agent.keep_tracing=true -jar app.jar
启动项目,请求任意接口。查看日志,输出TID表示集成成功。
小结
本文介绍了分布式调用链路监控,在应用logback框架中的集成。通过skywalking agent进行traceId埋点,再通过logback插件插入traceId到MDC上下文中。在不影响原有业务系统日志的情况下,自动记录全局traceId信息。
最后,希望本文对大家有所帮助和参考。若有疑问,欢迎留言讨论。