分布式链路追踪_skywalking_学习(3)
一、分布式链路追踪_skywalking :配置覆盖
1、在学习 分布式链路追踪_skywalking 时,可能每次部署应用都需要复制一份 agent,修改其中的服务名称,以防止冲突,这样显得非常麻烦。可以使用 Skywalking 提供的配置覆盖功能通过启动命令动态指定服务名,这样 agent 只需要部署一份 agent 即可。
2、Skywalking 支持的几种配置方式:
2.1 系统配置(System properties)
使用 skywalking. + 配置文件中的配置名作为系统配置项来进行覆盖。
- 为什么需要添加前缀 ?
agent 的系统配置和环境与目标应用共享,所以加上前缀可以有效的避免冲突。
- 案例:通过 如下进行 agent.service_name 的覆盖
-Dskywalking.agent.service_name=skywalking_mysql
2.2 探针配置( Agent options)
Add the properties after the agent path in JVM arguments.
-javaagent:/path/to/skywalking-agent.jar=[option1]=[value1],[option2]=[value2]
- 案例:通过 如下进行 agent.service_name 的覆盖
-javaagent:/path/to/skywalking-agent.jar=agent.service_name=skywalking_mysql
- 特殊字符:如果配置中包含分隔符( , 或者 = ) , 就必须使用引号包裹起来
-javaagent:/path/to/skywalking-agent.jar=agent.ignore_suffix='.jpg,.jpeg'
2.3 系统环境变量( System environment variables)
- 案例:由于 agent.service_name 配置项如下所示:
# The service name in UI
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
可以在环境变量中设置 SW_AGENT_NAME 的值来指定服务名。
2.4 覆盖优先级
探针配置 --> 系统配置 --> 系统环境变量 --> 配置文件中的值
所以启动命令可以修改为:
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent_mysql/skywalking-agent.jar -Dskywalking.agent.service_name=skywalking_mysql -jar skywalking_mysql.jar &
# 或者:
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=config_springboot2 -jar skywalking_springboot.jar &
# 或者:
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent_mysql/skywalking-agent.jar=agent.service_name=skywalking_mysql -jar skywalking_mysql.jar &
# 或者:
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar=agent.service_name=config_springboot -jar skywalking_springboot.jar &
3、浏览器地址栏输入:虚拟机IP:8080/sayBoot 进行测试。输出:Hello Boot!
浏览器地址栏输入:虚拟机IP:9010 查看 skywalking 控制台。
二、分布式链路追踪_skywalking:获取追踪 ID
1、Skywalking 提供 Trace 工具包,用于在追踪链路时进行信息的打印或者获取对应的追踪 ID。
2、创建一个 Spring Boot 工程 skywalking_plugins 并打包成 skywalking_plugins.jar 上传至 /usr/local/skywalking 目录下。进行测试。
2.1 打开 idea,创建 skywalking_plugins 的 maven 工程。
--> idea --> File
--> New --> Project
--> Maven
Project SDK: ( 1.8(java version "1.8.0_131" )
--> Next
--> Groupld : ( djh.it )
Artifactld : ( skywalking_plugins )
Version : 1.0-SNAPSHOT
--> Name: ( skywalking_plugins )
Location: ( \skywalking_plugins\ )
--> Finish
2.2 在工程 skywalking_plugins (模块)中的 pom.xml 中导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>djh.it</groupId>
<artifactId>skywalking_plugins</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>skywalking_plugins</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<skywalking.version>6.5.0</skywalking.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--skywalking trace工具包-->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>${skywalking.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.3 在工程 skywalking_plugins (模块)中,创建配置文件 application.properties。
## 2024-5-21 创建配置文件 application.properties
server.port=8088
2.4 在工程 skywalking_plugins (模块)中,创建 启动类 SkywalkingPluginsApplication.java。
/**
* 2024-5-21 创建 启动类 SkywalkingPluginsApplication.java
*/
package djh.it.skywalking_plugins;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SkywalkingPluginsApplication {
public static void main(String[] args) {
SpringApplication.run(SkywalkingPluginsApplication.class, args);
}
}
2.5 在工程 skywalking_plugins (模块)中,创建 Controler 类 FilterController.java。
/**
* 2024-5-21 创建 接口类 FilterController.java
*/
package djh.it.skywalking_plugins.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FilterController {
//此接口可以被追踪
@GetMapping("/include")
public String include(){
return "include";
}
//此接口不可被追踪
@GetMapping("/exclude")
public String exclude(){
return "exclude";
}
}
2.6 在工程 skywalking_plugins (模块)中,创建 Controller 类 PluginController.java 进行测试。
/**
* 2024-5-21 创建 Controller 类 PluginController.java
*/
package djh.it.skywalking_plugins.controller;
import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PluginController {
//获取trace id,可以在RocketBot追踪中进行查询
@GetMapping("/getTraceId")
public String getTraceId(){
//使当前链路报错,并且提示报错信息
ActiveSpan.error(new RuntimeException("Test-Error-Throwable"));
//打印info信息
ActiveSpan.info("Test-Info-Msg");
//打印debug信息
ActiveSpan.debug("Test-debug-Msg");
return TraceContext.traceId();
}
}
3、将 skywalking_plugins.jar 上传至 /usr/local/skywalking 目录下。
4、启动 skywalking_plugins 应用,等待启动成功。
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=skywalking_plugins -jar skywalking_plugins.jar &
5、调用接口,浏览器地址栏输入:http://虚拟机IP地址:8088/getTraceId
6、此时如果页面显示: 11.28.15753062945970001
7、可以看到追踪 ID已经打印出来,然后在 RocketBot 上进行搜索。
三、分布式链路追踪_skywalking :过滤指定的端点
1、在开发过程中,有一些端点(接口)并不需要去进行监控,比如 Swagger 相关的端点。这时可以使用 Skywalking 提供的过滤插件来进行过滤。
2、在 skywalking_plugins 工程中,编写两个接口进行测试:
/**
* 2024-5-21 创建 接口类 FilterController.java
*/
package djh.it.skywalking_plugins.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FilterController {
//此接口可以被追踪
@GetMapping("/include")
public String include(){
return "include";
}
//此接口不可被追踪
@GetMapping("/exclude")
public String exclude(){
return "exclude";
}
}
3、将 skywalking_plugins.jar 上传至 /usr/local/skywalking 目录下。
4、将 agent 中的 /agent/optional-plugins/apm-trace-ignore-plugin-6.4.0.jar 插件拷贝到 plugins 目录中。
# 进入目录
cd /usr/local/skywalking/apache-skywalking-apm-bin
# 拷贝可选插件
cp optional-plugins/apm-trace-ignore-plugin-6.4.0.jar plugins/apm-trace-ignore-
plugin-6.4.0.jar
5、启动 skywalking_plugins 应用,等待启动成功。
# 查询 oap 脚本 进程是否在启动状态:
ps -ef | oap
# 杀掉 oap 脚本 进程,才能重启它(如:它的PID是:1478)
kill -9 1478
# 重新启动 oap 脚本:
./oapService.sh
# 查询 skywalking_plugins 进程是否已经在运行启动状态
ps -ef | grep plugins
# 杀掉 skywalking_plugins 进程,重启它(如:它的PID是:1751)
kill -9 1751
# 启动 skywalking_plugins 应用(切换目录)
cd /usr/local/skywalking/
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=skywalking_plugins -Dskywalking.trace.ignore_path=/exclude jar skywalking_plugins.jar &
6、参数说明:
这里添加 -Dskywalking.trace.ignore_path=/exclude 参数来标识需要过滤哪些请求,支持 AntPath 表达式:
/path/* , /path/** , /path/?
- ? 匹配任何单字符
- * 匹配0或者任意数量的字符
- ** 匹配0或者更多的目录