skywalking指南—agent日志采集和插件
skywalking指南—agent日志采集和插件延续前两篇,完成skywalking的日志采集,并对插件版本及获取提供帮助
skywalking指南—agent日志采集和插件
文章目录
前言: skywalking其他指南请点击以下链接跳转
skywalking指南—oap及UI的搭建
skywalking指南—skywalking链路追踪
注: 本文中所有代码,皆可在我的GitHub链接中获取
一、agent及引入日志采集
1.1、agent的下载及目录介绍
-
从官网下载agent(本文采用java agent),版本为8.8.0。解压后目录如下。
- activations和plugins中为agent默认扫描的插件目录,将插件的jar包拖入这两个文件夹中即可使用(建议根据含义拖入plugins中)。
- bootstrap-plugins中放置引导插件。
- optional-plugins中放置可选插件。
- config中为agent的配置文件。
-
下载好后,可以修改config中agent.config,可以通过collector.backend_service指定oap-server 地址;
config中所有的配置,都可以通过jvm参数的方式来配置。如collector.backend_service可以设置为 -Dskywalking.collector.backend_service=127.0.0.1:11800,来配置oap-server地址。具体详见官方文档
1.2、项目引入java agent,添加日志采集
- 项目承自第二篇《skywalking指南—创建dubbo项目及追踪》中的项目,项目已实现链路追踪功能。本文将实现日志采集功能。
- 依赖引入,由于项目的日志框架为logback,需要引入logback plugin(其他日志框架的maven plugin详见官网地址)
<!-- 如果想在项目代码中获取链路TraceId,则需要引入此依赖 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.8.0</version>
</dependency>
<!-- skywalking logback插件 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.8.0</version>
</dependency>
- 编写logback日志配置文件。在resources下新建一个logback-spring.xml文件,根据官网文档编写配置文件,可以写作以下两种。
两者的区别就是layout中是采用TraceIdPatternLogbackLayout还是TraceIdMDCPatternLogbackLayout,如果采用TraceIdMDCPatternLogbackLayout,需要将[%tid]改为[%X{tid}]
<!-- class="ch.qos.logback.core.ConsoleAppender"是指打印到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<!-- with the MDC, set %X{tid} in Pattern -->
<!-- MDC是什么:MDC采用Map的方式存储上下文,线程独立的,子线程会从父线程拷贝上下文 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
- 在项目的启动配置中,添加jvm参数。具体jvm参数详见《skywalking指南—创建dubbo项目及追踪》,如需添加其他jvm,可回顾1.1、agent的下载及目录介绍
- 启动项目,通过apifox/postman访问api接口,可以看到控制台打印出了如下日志,TID:后面即本次请求的traceId
- 检查两个项目所有日志打印的结果,是否有断链。确认无断链后,就要做日志采集,将日志推到oap-server。官方文档中gRPC reporter could forward the collected logs to SkyWalking OAP server,具体方式即将appender中的class替换为org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender。以下为最终态的日志配置。
<configuration>
<property name="APM_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n" />
<!-- skyWalking日志采集 -->
<appender name="APM_LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>${APM_PATTERN}</Pattern>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="APM_LOG"/>
</root>
</configuration>
- 在application.properties中添加mybatis日志,logging.level.com.example.start.test.mapper=debug开启mybatis日志。再次启动项目,通过apifox/postman访问api接口。在skywalkingUI的日志中查看采集到的日志。多个服务,单次请求的追踪id是一致的。
- 日志怎么用呢?在链路追踪中,看到有红色的链路,即报错的链路,将链路的traceId复制后,在日志菜单下的追踪id中粘贴搜索,即可看到本次请求整个链路上的所有日志。然后即可根据日志来分析异常原因。日志采集成功后,在链路追踪里也可直接查看每个链路相关的日志,来找异常原因
- 也可在项目中添加全局Response处理,将traceId添加到返回参数中,当出现异常后,即可直接找到对应链路中查找错误原因。
添加后重启项目,可以看到返回的信息中有了traceId,可以通过这个traceId做链路追踪。
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(value = RuntimeException.class)
public Result defaultErrorHandler(HttpServletRequest request, Exception ex) {
String traceId = TraceContext.traceId();
return new Result(400, "失败", ex.getMessage(), traceId);
}
}
@Data
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> implements Serializable {
private Integer code;
private String message;
private T data;
private String traceId;
}
二、关于agent插件
根据官方文档介绍,agent插件支持热插拔,常用的插件放在了plugins中。目前8.8.0中插件支持的中间件、框架的版本见官方链接。当在agent使用过程中,出现链路断裂问题,可先查看版本是否有问题,如果有问题,就需要找对应版本的插件或自行开发插件使用。现在我们来说基于8.8.0版本(当前最新发行版本),如何去找高版本插件,以apache-dubbo为例。
-
查看8.8.0中插件所支持的apache-dubbo版本,以及项目中所使用的版本(我的是3.0.4)。可见8.8.0支持的最高版本为2.7.0,而我使用的版本过高。
-
查看latest版本的agent插件所支持的apache-dubbo版本,为2.7.x -> 3.x,满足我们的需求。
-
打开java-agent的github页面,下载main分支源码,找到源码中apm-sniffer — apm-sdk-plugin 下的dubbo-3.x-conflict-patch和dubbo-3.x-plugin的包,修改parent的version为8.8.0,然后将插件单独deploy。
4.将打包好的jar包放入skywalking agent文件夹的plugins下,再次重启项目、访问接口,去sky walkingUI去看,链路已然完整。
【注:由于agent的插件加载机制,插件可以插拔,对自己不需要的版本,可以直接移除,以免占用空间,需要但没有的插件,可以到github获取或自行开发】
三、插件开发及优秀文章推荐
- skywalking中文文档 https://skyapm.github.io/document-cn-translation-of-skywalking/
- 插件开发优秀文章 https://www.imooc.com/article/312560
- 官方插件开发文档 https://skywalking.apache.org/docs/skywalking-java/v8.8.0/en/setup/service-agent/java-agent/java-plugin-development-guide/
- 待补充
四、问题汇总
如果大家有什么问题,可以在评论区提出,大家一起来解决。评论区中出现的问题,会一并记录到问题记录中
- 按文中加好配置后,没有采集到sql日志。
答:请确认一下,是不是你的项目中有添加mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl - TraceContext这个类找不到,无法在代码中获取traceId
答:需要引入apm-toolkit-trace依赖,如果已引入,尽量将version与oap-server的version一致
更多推荐
所有评论(0)