一、Skywalking介绍

Skywalking是国人吴晟开发的链路追踪工具,与2017年进入Apache的项目孵化器,如今已成为Apache的一个开源项目。
Skywalking提供了强大的APM应用性能管理功能,专门为微服务等基于容器的云原生架构提供监控服务,Skywalking通过探针收集应用的各项指标,并进行分布式的链路追踪。Skywalking会感知微服务之间的调用链路的关系。生产相应的统计数据。

特性:

1、支持告警;
2、采用探针技术,对业务代码零侵入;
3、轻量高效,无需额外的大数据平台;
4、提供多种监控手段,支持多语言探针;
5、简洁强大的可视化后台管理界面;
6、自身采用模块化架构,包括探针Agent、UI、观测分析平台和存储模块。

二、Skywalking安装

2.1下载、安装、启动windows版Skywalking9.1服务端

skywalking官网地址

http://skywalking.apache.org

该官网地址没有9.1版本的包,我在https://chat.deepseek.com/直接搜索的,会有对应版本的链接,直接下载

apache-skywalking-apm-9.1.0.tar.gz

解压到对应目录,Ctrl+R,输入cmd,进入服务目录启动服务

f:
cd skywalking\apache-skywalking-apm-bin\bin
startup.bat

实际上启动了2个服务,oap-service:OAP,其实现类库位于oap-libs子目录下。
webapp-service:提供UI的webapp应用,位于webapp子目录下。
会有两个对话框弹出表示服务已启动,访问服务:

http://127.0.0.1:8080/

在这里插入图片描述

三、在微服务中安置探针

9.0以上版本需要从官网下载探针包。低版本自带探针。

apache-skywalking-java-agent-9.1.0.tgz

3.1修改微服务配置

在微服务中安置探针:
运行-编辑配置,修改选项,打开添加VM选项,每个微服务都配置,应用-保存,最后是重启以下微服务,会有连接skywalking的日志。

-javaagent:F:\skywalking\skywalking-agent\skywalking-agent.jar       -Dskywalking.agent.service_name=hello-provider-service       -Dskywalking.collector.backend_service=127.0.0.1:11800

-javaagent:F:\skywalking\skywalking-agent\skywalking-agent.jar -Dskywalking.agent.service_name=hello-consumer-service        -Dskywalking.collector.backend_service=127.0.0.1:11800


在这里插入图片描述

3.2业务访问微服务

http://127.0.0.1:8081/greet/hhh

在这里插入图片描述

3.3查看skywalking服务端

在这里插入图片描述

3.4查看拓扑图

3.5查看链路追踪

skywalking会为每一条调用链路都分配了唯一的追踪ID。
在这里插入图片描述

3.6查看监控数据

在这里插入图片描述
在这里插入图片描述

3.7性能分析

在这里插入图片描述

在这里插入图片描述
分析是哪个服务慢:
在这里插入图片描述
在这里插入图片描述
上图可以看出,消费者自身耗时239ms,远程调用接口耗时60秒,总耗时200264ms,且在提供者可以看到该交易在提供者耗时8秒,总耗时60秒结束是因为远程调用默认60秒就读超时。
在这里插入图片描述
在这里插入图片描述

3.8监控告警

服务端的config/alarm-settings.yml文件中有默认的监控项,如下是一个最近3分钟内服务的平均响应时间 > 1秒”的规则。

rules:
  # Rule unique name, must be ended with `_rule`.
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 3
    silence-period: 5
    message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.

说明:

threshold	1000	阈值 1 秒(单位:毫秒)
period	10	检查周期 10 分钟
count	3	连续 3 次满足条件就触发
silence-period: 5 = 告警触发后,5分钟内不再重复发送相同的告警

模拟超时1秒的交易
在消费者或者提供者方法中添加:

try {
            // 方法1: TimeUnit(推荐)
            TimeUnit.SECONDS.sleep(0);

            // 方法2: Thread.sleep 毫秒
            // Thread.sleep(80 * 1000);

        } catch (InterruptedException e) {
            System.err.println("睡眠被中断了!");
            Thread.currentThread().interrupt(); // 恢复中断状态
        }

重启服务。
访问接口让超时1秒。
查看告警:
在这里插入图片描述
在这里插入图片描述

3.9自定义链路追踪

3.9.1给服务的pom.xml添加trace依赖,并重新加载

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

3.9.2在需要在链路追踪展示的方法上添加@Trace注解,在参数上添加@Tag注解

package demo.helloprovider;
import org.apache.skywalking.apm.toolkit.trace.Tag;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;

@RestController
public class HelloProviderController {
    /*
    @GetMapping(value = "/greet/{username}")
    public String greet(@PathVariable String username) {
        return "Hello," + username;
    }
    */

    @Value("${server.port}")
    private String servicePort;

    @Value("${spring.application.name}")
    private String serviceName;

    @GetMapping(value = "/greet/{username}")
    @Trace(operationName = "provide_greet")
    @Tag(key = "arg1",value = "arg[0]")
    @Tag(key="result",value = "returnedOjb")
    public String greet(@PathVariable String username) {
        System.out.println("username"+username);
        try {
            // 方法1: TimeUnit(推荐)
            TimeUnit.SECONDS.sleep(0);

            // 方法2: Thread.sleep 毫秒
            // Thread.sleep(80 * 1000);

        } catch (InterruptedException e) {
            System.err.println("睡眠被中断了!");
            Thread.currentThread().interrupt(); // 恢复中断状态
        }
        return "Hello," + username
               +"<br>Service Name:" + serviceName+"<br>Service Port:"+servicePort;
    }

}

3.9.3重新访问到该方法的接口,在skywalking查看链路追踪

可以看到刚才给方法添加的@Trace注解已生效,可以在链路追踪看到provide_greet端点(该方法的信息),方法执行了2ms。
在这里插入图片描述
点击上图端点,可以看到该端点由@Tag标签标注的arg1和result
在这里插入图片描述
测试,在方法中休眠2秒,查看链路追踪。

try {
            // 方法1: TimeUnit(推荐)
            TimeUnit.SECONDS.sleep(2);

            // 方法2: Thread.sleep 毫秒
            // Thread.sleep(80 * 1000);

        } catch (InterruptedException e) {
            System.err.println("睡眠被中断了!");
            Thread.currentThread().interrupt(); // 恢复中断状态
        }

在这里插入图片描述

3.10忽略端点

项目-运行-编辑
-javaagent:F:\skywalking\skywalking-agent\skywalking-agent.jar -Dskywalking.agent.service_name=hello-provider-service
-Dskywalking.trace.ignore_path=/greet/*
-Dskywalking.collector.backend_service=127.0.0.1:11800

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐