skywalking指南—agent日志采集和插件

前言: skywalking其他指南请点击以下链接跳转
skywalking指南—oap及UI的搭建
skywalking指南—skywalking链路追踪
注: 本文中所有代码,皆可在我的GitHub链接中获取

一、agent及引入日志采集


1.1、agent的下载及目录介绍
  • 官网下载agent(本文采用java agent),版本为8.8.0。解压后目录如下。
    agent目录

    • 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,添加日志采集
  1. 项目承自第二篇《skywalking指南—创建dubbo项目及追踪》中的项目,项目已实现链路追踪功能。本文将实现日志采集功能。
  2. 依赖引入,由于项目的日志框架为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>
  1. 编写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>
  1. 在项目的启动配置中,添加jvm参数。具体jvm参数详见《skywalking指南—创建dubbo项目及追踪》,如需添加其他jvm,可回顾1.1、agent的下载及目录介绍
  2. 启动项目,通过apifox/postman访问api接口,可以看到控制台打印出了如下日志,TID:后面即本次请求的traceId
    控制台打印日志
  3. 检查两个项目所有日志打印的结果,是否有断链。确认无断链后,就要做日志采集,将日志推到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>
  1. 在application.properties中添加mybatis日志,logging.level.com.example.start.test.mapper=debug开启mybatis日志。再次启动项目,通过apifox/postman访问api接口。在skywalkingUI的日志中查看采集到的日志。多个服务,单次请求的追踪id是一致的。
    日志采集
  2. 日志怎么用呢?在链路追踪中,看到有红色的链路,即报错的链路,将链路的traceId复制后,在日志菜单下的追踪id中粘贴搜索,即可看到本次请求整个链路上的所有日志。然后即可根据日志来分析异常原因。日志采集成功后,在链路追踪里也可直接查看每个链路相关的日志,来找异常原因
    日志的使用
    日志的使用
  3. 也可在项目中添加全局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为例

  1. 查看8.8.0中插件所支持的apache-dubbo版本,以及项目中所使用的版本(我的是3.0.4)。可见8.8.0支持的最高版本为2.7.0,而我使用的版本过高。
    官方支持的apache-dubbo

  2. 查看latest版本的agent插件所支持的apache-dubbo版本,为2.7.x -> 3.x,满足我们的需求。
    latest版本支持的apache-dubbo

  3. 打开java-agent的github页面,下载main分支源码,找到源码中apm-sniffer — apm-sdk-plugin 下的dubbo-3.x-conflict-patch和dubbo-3.x-plugin的包,修改parent的version为8.8.0,然后将插件单独deploy。
    java-agent github
    修改pom
    4.将打包好的jar包放入skywalking agent文件夹的plugins下,再次重启项目、访问接口,去sky walkingUI去看,链路已然完整。
    plugins
    【注:由于agent的插件加载机制,插件可以插拔,对自己不需要的版本,可以直接移除,以免占用空间,需要但没有的插件,可以到github获取或自行开发】


三、插件开发及优秀文章推荐


  1. skywalking中文文档 https://skyapm.github.io/document-cn-translation-of-skywalking/
  2. 插件开发优秀文章 https://www.imooc.com/article/312560
  3. 官方插件开发文档 https://skywalking.apache.org/docs/skywalking-java/v8.8.0/en/setup/service-agent/java-agent/java-plugin-development-guide/
  4. 待补充

四、问题汇总


如果大家有什么问题,可以在评论区提出,大家一起来解决。评论区中出现的问题,会一并记录到问题记录中

  1. 按文中加好配置后,没有采集到sql日志。
    答:请确认一下,是不是你的项目中有添加mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  2. TraceContext这个类找不到,无法在代码中获取traceId
    答:需要引入apm-toolkit-trace依赖,如果已引入,尽量将version与oap-server的version一致

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐