SpringBoot 项目如何接入 SkyWalking

7,595 阅读3分钟

背景

最近在调试 BUG 的时候经常会用到 TraceId,大致的场景是这样的:某系统研发人员调用你的服务时发现接口数据返回异常,所以你这边就需要协助解决问题。

但是如何才能找到对应接口调用的日志呢?如何串联起整个调用链条呢?

答案就是 SkyWalking ,虽然有着同样功能也比较优秀的其他工具,但是今天还是理一理 SkyWalking。

SkyWalking 简介

image.png

概述

SkyWalking 是一个可观察性分析平台和应用程序性能管理系统。跟踪、指标和记录一体化解决方案。 SkyWalking 是分布式系统的应用程序性能监控工具,专为微服务、云原生和基于容器(Docker、Kubernetes、Mesos)架构而设计。

功能

  • 服务性能监控,包括网络、磁盘、接口响应等。
  • 多语言自动探针。支持 Java、.Net Core、PHP、NodeJS、Golang、LUA、C++、Python。
  • 轻量高效。无需大数据平台,和大量的服务器资源。
  • 优秀的可视化解决方案,服务拓扑图等

SkyWalking 使用

环境介绍

  1. 基于 Mac 下的 docker、docker-compose 完成。如需使用请读者自行安装,其他操作系统功能使用类似。

  2. 基于 SpringBoot 的项目,没有集成过多的组件只有 SpringBoot。

  3. 项目 Java 版本为 11,能升级的就升级 Java8 有点老了。

SkyWalking 搭建

直接使用 Docker 去启动项目,但是这里有几点说明一下:

  • Skywalking 的配置为默认的是可以修改的,可以通过映射配置文件
  • Skywalking 默认的存储引擎为 H2,因为只是演示这里不做更改,生产选择 ES
  • Skywalking UI 功能很强大,值的慢慢探索
version: '3'
services:
  oap:
    image: apache/skywalking-oap-server:8.4.0-es6
    container_name: oap
    restart: always
    ports:
      - 11800:11800 # agent 上报数据 gRPC 端口
      - 12800:12800 # ui 读取数据 http 端口
  skywaling-ui:
    image: apache/skywalking-ui:8.4.0
    container_name: ui
    depends_on:
      - oap
    links:
      - oap
    ports:
      - 8080:8080
    environment:
      - SW_OAP_ADDRESS=oap:12800

成功启动完成之后应该 打开 http://localhost:8080/ 会进入 SkyWalking 的管理页面。

如下图:

image.png

SpringBoot 接入

    1. SpringBoot 项目初始化

初始化 SpringBoot 项目的步骤这里就不多赘述了,需要初始化的小伙伴可以去看 SpringBoot Quickstart

    1. 配置 SkyWalking Agent

下载 Skywalking Agent 包:

wget https://archive.apache.org/dist/skywalking/8.4.0/apache-skywalking-apm-8.4.0.tar.gz

解压后配置文件:

# 1. 后续需要配置的文件 ./agent/skywalking-agent.jar

# 2. 修改配置文件 agent/config/agent.config

# 配置服务名称
agent.service_name=${SW_AGENT_NAME:winter}

# 服务收集地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
    1. 修改 Log4j 配置

主要的就是修改日志打印的格式,其他的按照配置就行。修改的地方放在下面:

<Properties>
    <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
    <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
    <!-- 主要的就是 traceId 的写入 -->
    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %traceId %-5level %logger{36} - %msg%n" />
    <!-- 定义日志存储的路径 -->
    <property name="FILE_PATH" value="./logs" />
    <property name="FILE_NAME" value="winter" />
</Properties>

<appenders>

    <console name="Console" target="SYSTEM_OUT">
        <!--输出日志的格式-->
        <PatternLayout pattern="${LOG_PATTERN}"/>
        <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
        <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
    </console>
        <!--这里还有很多-->
        <!--这里还有很多-->
        <!--这里还有很多-->
        <!--这里还有很多-->
    
<appenders>
    1. 启动项目

启动项目有两种方式,但是具体的参数都一样的,详细参数如下:

# skywalking-agent 的具体位置
-javaagent:./apache-skywalking-apm-bin/agent/skywalking-agent.jar

# 服务名称
-Dskywalking.agent.service_name=winter

# 采集的后端地址
-Dskywalking.collector.backend_service=127.0.0.1:11800

Idea 启动配置如图:

image.png

Jar 包的方式部署如下:

java \
-javaagent:./apache-skywalking-apm-bin/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=winter \
-Dskywalking.collector.backend_service=127.0.0.1:11800 -jar \
./target/winter-0.0.1-SNAPSHOT.jar

效果展示

SkyWalking 管理界面

先看一下 SkyWalking 的 DashBoard,这数据展示的效果还是挺唬人的:

image.png

image.png

当然关于 SkyWalking 的管理界面还有很多功能,有兴趣的小伙伴可以自行探索。

日志文件格式

再来看看日志的表现,下图中红框的数据就是我们想要的 traceId:

image.png

注意:这里的日志最好应该是落在 Kibana中集中管理,配合 Elasticsearch 能够高效的查询日志,也方便快速定位问题。