【业务功能109】微服务-springcloud-springboot-Skywalking-链路追踪-监控

SkyWalking是一个支持监控、追踪和故障诊断的分布式APM系统,借鉴了Zipkin、Pinpoint和CAT的设计。文章详细介绍了SkyWalking的功能、架构、部署步骤、服务接入和自定义配置,以及告警和信息推送机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Skywalking

skywalking是一个apm系统,包含监控,追踪,并拥有故障诊断能力的 分布式系统

一、Skywalking介绍

1.什么是SkyWalking

  Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin /Pinpoint /CAT 的设计思路。特点是:支持多种插件,UI功能较强,支持非侵入式埋点。目前使用厂商最多,版本更新较快。

  数据存储支持:Elasticsearch、MySQL、H2、TiDB。默认是H2,而且是存到内存。实际我们一般将其存到ES。

主页:http://skywalking.apache.org/
下载:https://skywalking.apache.org/downloads/
github:https://github.com/apache/skywalking
文档:https://github.com/apache/skywalking/tree/master/docs
配置:https://github.com/apache/skywalking/tree/master/docs/en/setup/backend

2.APM

  APM全称Application Performance Management应用性能管理,目的是通过各种探针采集数据,收集关键指标,同时搭配数据呈现以实现对应用程序性能管理和故障管理的系统化解决方案.

  Zabbix、Premetheus、open-falcon等监控系统主要关注服务器硬件指标与系统服务运行状态等,而APM系统则更重视程序内部执行过程指标和服务之间链路调用情况的监控,APM更有利于深入代码找到请求响应“慢”的根本问题,与Zabbix之类的监控是互补关系 目前市面上开源的APM系统主要有CAT、Zipkin、Pinpoint、SkyWalking,大都是参考Google的 Dapper实现的.

3.链路追踪工具对比

链路追踪工具一般要有如下功能:

  • 心跳检测(确定应用是否还在运行)
  • 记录请求的执行流程、执行时间
  • 资源监控(CPU、内存、带宽、磁盘)
  • 告警功能(监控执行时间、成功率等通过邮件、钉钉、短信、微信等进行通知)
  • 可视化页面

常用的工具有:

Zipkin
  Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。
Pinpoint
  韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。
SkyWalking
  本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。
CAT
  大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。

各维度对比

对比项ZipkinPinpointSkyWalkingCat
实现方式拦截请求,发送(Http,MQ)数据到Zipkin服务Java探针,字节码增强Java探针,字节码增强代码埋点(拦截器,注解,过滤器等)
接入方式基于linkerd或者sleuth方式javaagent字节码javaagent字节码代码侵入
agent到collector协议http,MQthriftgRPChttp/tcp
OpenTracing支持不支持支持不支持
颗粒度接口级方法级方法级代码级
全局调用统计不支持支持支持支持
traceid查询支持不支持支持不支持
报警不支持支持支持支持
JVM监控不支持不支持支持支持
UI功能支持支持支持支持
数据存储ES、MySQL等HBaseES/H2/MySQLMySQL/HDFS

性能对比图

image.png

4.SkyWalking的功能特性

  1. 多种监控手段,通过语言探针和Service mesh 获得监控的数据
  2. 支持多种语言自动探针,包括 Java, .NET Core 和 Node.js
  3. 轻量高效,无需大数据平台和大量的服务器资源
  4. 模块化,UI,存储,集群管理都有多种机制可选
  5. 支持报警,告警
  6. 优秀的可视化解决方案

二、SkyWalking环境搭建

1.Skywalking结构

  先来看看Skywalking的结构图

image.png

说明:

  • Skywalking agent 和业务系统绑定在一起,负责收集各种监控数据
  • Skywalking oapservice负责处理监控数据,比如接受Skywalking agent的监控数据,并且存储在数据库中,接受Skywalking webapp前端的请求,从数据库查询数据,并返回给前端,Skywalking oapservice通常会以集群的方式搭建
  • Skywalking webapp ,UI服务,用于可视化展示数据
  • 用户持久化监控数据的数据库,可以选用ElasticSearch、MySQL等

2.Skywalking部署

  从官网提供的下载地址下载安装文件,我们先通过windows操作来演示下:https://skywalking.apache.org/downloads/

image.png

点击对应的下载链接下载即可

image.png

启动服务:

image.png

启动成功后会启动两个服务,一个是Skywalking-oap-server,一个是Skywalking-web-ui:8080

Skywalking-oap-server服务启动后会暴露11800和12800两个端口,分别为收集监控数据的端口11800和接收前端请求的端口12800,修改端口可以修改config/application.yml

image.png

默认端口8080,访问效果如下:

image.png

3.Java Agent

  在新版本中Agent是需要单独下载的。

image.png

下载后解压出来放在了前面Skywalking的解压目录中

image.png

三、服务接入

  然后我们就可以把我们的微服务接入到Skywalking中来监控链路的执行。

1.开发环境的配置

  首先来看看在开发环境中的配置,因为Skywalking是无侵入式的。我们只需要在启动的时候 idea中的启动类配置中的 VM options 设置参数配置即可

# skywalking-agent.jar 的路径位置
-javaagent:d:\xxx\skywalking-agent.jar
# 在Skywalking中显示的服务名称
-DSW_AGENT_NAME=xxx-skywalking-service
# Skywalking的collector服务的IP及端口
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800

注意:-DSW_AGENT_COLLECTOR_BACKEND_SERVICES 可以指定远程服务,但是 -javaagent必须是本地的jar包.

2.gateway服务

  然后我们接入gateway的服务。在启动时设置对应的参数

image.png

启动服务后,我们进入Skywalking的UI服务中查看

image.png

可以看到有对应的服务信息,但是没有相关的链路信息,主要是因为默认Skywalking中是不支持Gateway的,我们需要显示的添加对应的gateway插件支持

image.png

从我们下载的agent包中的 optional-plugins中把gateway的jar拷贝的对应的plugins中即可

image.png

重启服务测试即可

image.png

3.对接多个服务

  接下来我们就可以把商城系统中的各个服务都对接到Skywalking中,给每个服务添加对应的配置

-Xmx512m
-javaagent:D:\software\apache-skywalking-apm-bin\skywalking-agent\skywalking-agent.jar
-DSW_AGENT_NAME=mall-product
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800

分别启动

image.png

image.png

四、Skywalking持久化

  持久化数据到MySQL中。修改下config/application.yml配置,把原来默认的H2修改为MySQL就可以了。

image.png

mysql://localhost:3306/swtest?rewriteBatchedStatements=true&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8

然后还需要把MySQL的驱动包拷贝到对应的目录中 oap-libs

image.png

然后重启服务即可,对应的数据库会自动生成表结构

image.png

五、自定义SkyWalking链路

  在默认情况下Skywalking是没有记录我们的业务方法的,只会追踪到controller层接口,如果需要添加业务方法的链路监控我们就需要添加如下的依赖

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.8.0</version>
</dependency>

然后在业务方法上添加@Trace注解。那么该方法就会被监控

image.png

重启服务并访问:

image.png

但是查看这个方法的详情中没有返回信息和参数

image.png

这时我们可以通过@Tags和@Tag来解决这个问题

@Trace
    @Tags({
            @Tag(key = "getCatelog2JSON",value = "returnedObj"),
            @Tag(key = "param",value = "arg[0]")
    })

key:方法名 value = returnedObj:是指定返回值

arg[0]:参数

重启测试

image.png

六、集成日志框架

  将微服务的日志框架去集成SkyWalking,我们希望在我们微服务中日志中,能够记录当前调用链路的id,然后我们再根据这个id去SkyWalking的前端界面中进行搜索找到对应的调用链路记录。

  因为springboot默认实现的日志框架是logback,这里也就拿logback举例,使得调用链路的id可以显示在控制台,每当请求接口时,控制台就会输出对应的id,拿到id就可以在skywalking客户端去检索对应的链路,比较方便快速的找到。

在微服务中导入maven坐标

<!-- skywalking 日志记录  -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>8.5.0</version>
</dependency>

在项目中 resources目录下创建 logback-spring.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="console" 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{HH:mm:ss.SSS} [%thread] %-5level logger_name:%logger{36} - [%tid] - message:%msg%n</pattern>
            </layout>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="console" />
    </root>

</configuration>

在Skywalking UI的日志菜单中显示日志信息,那么就需要再配置文件中再增加一个日志配置信息

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--  控制台日志输出的格式中添加tid  -->
    <appender name="console" 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{HH:mm:ss.SSS} [%thread] %-5level logger_name:%logger{36} - [%tid] - message:%msg%n</pattern>
            </layout>
        </encoder>
    </appender>

    <!-- skywalking grpc 日志收集 8.4.0版本开始支持 -->
    <appender name="grpc-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>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="console" />
        <appender-ref ref="grpc-log" />
    </root>

</configuration>

前面的部署环境是在windows下,一般实际上我们都是安装在linux服务器上通过docker容器安装,那么这里还需要注意下,需要在前面安装下载出来的 skywalking-agent文件下 ->> conf ->> agent.config文件,添加以下的配置信息即可,server_host的ip换成所在的服务器ip即可

plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}

image.png

七、告警信息&信息推送

  • 在skywalking客户端上,有告警栏目,当我们请求接口时长过长时,会显示对应接口信息,而告警规则是在前面安装的 skywalking-apm-bin\config\alarm-settings.yml 配置文件中,默认响应配置了一些告警规则,比如10分钟内有多少次接口请求超过1s那么就会显示告警信息在页面上,提供用户查看
  • 而页面上看之外,我们也还可能将告警信息通知到我们的项目中,可以通过配置网络钩子,使得告警信息可以通过指定的接口请求返回给我们。webhooks:- http://127.0.0.1:8087/notify 地址就是指定的微服务的请求地址,如果有符合告警规则的请求场景,配置了这个网络钩子指定的接口,那么就会去自动发起请求接口,那么我们指定的接口,就可以用Object做参数,接收告警信息,接着在方法中做相关的信息推送比如发送邮件,短信等提醒推送功能

   @RestController
public class Api Controller {
    @PostMapping("/notify")
    public String getCurrentSeckillSessionSkus(@ResponseBody Object obj){
        System.out.println("obj="+ obj);
        return "Skywalking warning notify";
    }
<think>好的,我现在要解决用户提到的Docker报错“unknown server OS”。首先,我需要确认用户是在什么情况下遇到这个错误的。通常,Docker会根据运行环境自动选择操作系统,比如在Linux上直接运行,在Windows或macOS上通过虚拟机运行。 接下来,可能的原因有几个:首先是Docker Desktop没有正确安装或者配置,特别是在Windows或macOS上,可能需要启用虚拟化或安装相关组件。其次是用户可能手动配置了错误的上下文(context),比如在Linux系统中错误地指定了Windows的上下文。另外,旧版本的Docker可能存在兼容性问题,更新到最新版可能解决。 然后,我需要考虑具体的解决步骤。第一步,检查Docker的安装状态,确保服务正常运行。如果是Windows,需要确认Hyper-V或WSL2是否启用。第二步,查看当前的Docker上下文设置,使用`docker context ls`命令,如果有不正确的上下文,切换到默认的。第三步,升级Docker到最新版本,修复已知的bug。第四步,检查环境变量是否有冲突,特别是DOCKER_HOST是否被错误设置。最后,如果问题依旧,尝试清理配置或重装Docker。 用户可能需要逐步排查这些可能性,比如先检查安装,再检查上下文,然后升级版本,最后处理环境变量或重装。如果用户提供了更多上下文,比如操作系统或Docker版本,可以更精准地给出建议。同时,提醒用户检查文档或社区是否有类似问题的解决方案。</think>遇到`docker: unknown server OS`错误时,通常与Docker客户端与服务器通信失败或环境配置异常有关。以下是逐步排查和解决方法: --- ### **1. 确认Docker服务状态** - **现象**:Docker客户端无法识别服务器操作系统。 - **原因**:Docker守护进程(Daemon)未运行或通信中断。 - **解决方法**: - **Linux/macOS**:执行 `systemctl status docker`(Linux)或 `sudo service docker status` 确认服务状态。 - **Windows**:检查Docker Desktop是否启动,右下角Docker图标应为绿色。 - 重启Docker服务: ```bash # Linux sudo systemctl restart docker # macOS/Windows 通过Docker Desktop界面重启服务 ``` --- ### **2. 检查Docker上下文(Context)** - **现象**:手动配置了错误的上下文导致通信失败。 - **解决方法**: - 查看当前上下文: ```bash docker context ls ``` - 切换回默认上下文: ```bash docker context use default ``` --- ### **3. 升级Docker版本** - **现象**:旧版本存在兼容性问题。 - **解决方法**: - 更新到最新版本: - [Docker Desktop下载页](https://www.docker.com/products/docker-desktop) - Linux更新命令(Debian/Ubuntu): ```bash sudo apt-get update && sudo apt-get upgrade docker-ce ``` --- ### **4. 检查环境变量冲突** - **现象**:`DOCKER_HOST`环境变量指向错误地址。 - **解决方法**: - 临时取消设置: ```bash unset DOCKER_HOST ``` - 永久修改:检查Shell配置文件(如`.bashrc`、`.zshrc`)并删除相关配置。 --- ### **5. 清理并重装Docker** 若以上方法无效,尝试彻底清理后重装: 1. **卸载Docker**: - Windows/macOS:通过控制面板或应用程序卸载。 - Linux: ```bash sudo apt-get purge docker-ce docker-ce-cli containerd.io ``` 2. **删除残留文件**: ```bash sudo rm -rf /var/lib/docker sudo rm -rf /etc/docker ``` 3. 重新安装最新版本。 --- ### **6. 操作系统兼容性** - **Windows Home版**:需安装WSL2内核并启用“Windows Subsystem for Linux”。 - **旧Linux内核**:确保内核版本≥4.x(通过`uname -r`检查)。 --- ### **总结流程图** $$ \begin{aligned} 1. &\text{检查Docker服务状态} \rightarrow 2. \text{修复或重启} \\ 3. &\text{检查上下文} \rightarrow 4. \text{重置为默认} \\ 5. &\text{升级Docker} \rightarrow 6. \text{解决环境变量冲突} \\ 7. &\text{重装Docker(终极方案)} \end{aligned} $$ 如果问题仍未解决,请提供以下信息进一步排查: - 操作系统及版本 - Docker版本(`docker version`输出) - 错误完整日志(通过`docker info`或`journalctl -u docker.service`获取)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值