SkyWalking入门教程 - 分布式系统应用性能监控完整指南
SkyWalking入门教程 - 分布式系统应用性能监控完整指南
目录
1. SkyWalking简介
Apache SkyWalking是一个应用性能监控(APM)和分布式追踪系统,用于监控、追踪和诊断分布式系统,特别是基于微服务架构的系统。
主要功能:
- ✅ 分布式追踪:完整的分布式系统调用链追踪
- ✅ 性能监控:应用性能指标监控和分析
- ✅ 服务拓扑:自动生成服务依赖关系图
- ✅ 告警机制:支持多种告警规则和通知方式
- ✅ 日志集成:与日志系统集成分析
- ✅ 多语言支持:支持Java、.NET、Node.js、Python、Go等
- ✅ 多存储支持:支持Elasticsearch、MySQL、H2、TiDB等
核心组件:
- Agent(探针):嵌入到应用中,收集遥测数据
- OAP(Observability Analysis Platform):接收、分析、聚合和存储数据
- UI(Web界面):可视化展示监控数据
- Storage(存储):存储监控数据
架构图:
应用1(Agent) ──┐
应用2(Agent) ──┼──> OAP Server ──> Storage (ES/MySQL/H2)
应用3(Agent) ──┘ └──> UI (Web界面)- 微服务监控:监控微服务架构中的各个服务
- 性能分析:分析应用性能瓶颈
- 故障排查:快速定位分布式系统中的问题
- 容量规划:基于监控数据进行容量规划
- SLA监控:监控服务级别协议
| 特性 | SkyWalking | Zipkin | Pinpoint | Jaeger |
|---|---|---|---|---|
| 代码侵入性 | 低 | 中 | 低 | 中 |
| 性能开销 | 低 | 低 | 中 | 低 |
| 功能丰富度 | 高 | 中 | 高 | 中 |
| 社区活跃度 | 高 | 中 | 中 | 高 |
| 存储选择 | 多 | 少 | 少 | 多 |
2. 环境准备
操作系统:
- Linux
- macOS
- Windows
Java版本:
- JDK 8或更高版本(推荐JDK 11+)
内存要求:
- OAP Server:至少2GB内存
- Agent:每个应用约50-100MB
存储要求:
- 根据数据保留时间确定(建议至少50GB)
必需:
- JDK 8+
- 存储后端(Elasticsearch 7.x/8.x 或 MySQL 5.7+ 或 H2)
可选:
- Docker(用于容器化部署)
- Kubernetes(用于K8s环境)
官方下载地址:
- Apache官网:https://skywalking.apache.org/downloads/
- GitHub Releases:https://github.com/apache/skywalking/releases
版本选择:
- 稳定版:推荐使用最新稳定版本
- 当前推荐:v9.x或v10.x
下载文件:
# Linux/macOS
wget https://archive.apache.org/dist/skywalking/9.x.x/apache-skywalking-java-agent-9.x.x.tgz
wget https://archive.apache.org/dist/skywalking/9.x.x/apache-skywalking-java-agent-9.x.x.tgz
# Windows
# 下载对应的zip文件3. SkyWalking安装部署
步骤1:下载并解压
# 下载SkyWalking
wget https://archive.apache.org/dist/skywalking/9.x.x/apache-skywalking-java-agent-9.x.x.tgz
# 解压
tar -zxvf apache-skywalking-java-agent-9.x.x.tgz
cd apache-skywalking-java-agent-9.x.x步骤2:启动OAP Server
# Linux/macOS
./bin/oapService.sh
# Windows
bin\oapService.bat步骤3:启动UI
# Linux/macOS
./bin/webappService.sh
# Windows
bin\webappService.bat步骤4:访问UI
打开浏览器访问:http://localhost:8080
Docker Compose方式
创建docker-compose.yml:
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.8.0
container_name: elasticsearch
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es_data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
- "9300:9300"
networks:
- skywalking
oap:
image: apache/skywalking-oap-server:9.5.0
container_name: oap
depends_on:
- elasticsearch
environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
SW_ES_USER: ""
SW_ES_PASSWORD: ""
JAVA_OPTS: "-Xms2048m -Xmx2048m"
ports:
- "11800:11800"
- "12800:12800"
networks:
- skywalking
ui:
image: apache/skywalking-ui:9.5.0
container_name: ui
depends_on:
- oap
environment:
SW_OAP_ADDRESS: http://oap:12800
ports:
- "8080:8080"
networks:
- skywalking
volumes:
es_data:
networks:
skywalking:
driver: bridge启动服务:
docker-compose up -d安装Elasticsearch
# 使用Docker
docker run -d \
--name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
docker.elastic.co/elasticsearch/elasticsearch:8.8.0配置OAP使用Elasticsearch
编辑config/application.yml:
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
namespace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
trustStorePath: ${SW_STORAGE_ES_SSL_TRUST_STORE_PATH:""}
trustStorePass: ${SW_STORAGE_ES_SSL_TRUST_STORE_PASS:""}
dayStep: ${SW_STORAGE_DAY_STEP:1}
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1}
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1}创建数据库
CREATE DATABASE IF NOT EXISTS skywalking DEFAULT CHARACTER SET utf8mb4;执行初始化脚本
# 执行SQL脚本
mysql -u root -p skywalking < config/schema/mysql-mysql.sql配置OAP使用MySQL
编辑config/application.yml:
storage:
selector: ${SW_STORAGE:mysql}
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/skywalking"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}4. Java应用集成
方式1:使用-javaagent参数
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAME=your-service-name \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800 \
-jar your-application.jar方式2:配置环境变量
export SW_AGENT_NAME=your-service-name
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar \
-jar your-application.jar方式3:修改启动脚本
创建start.sh:
#!/bin/bash
SKYWALKING_AGENT_PATH=/path/to/skywalking-agent/skywalking-agent.jar
SW_AGENT_NAME=your-service-name
SW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800
java -javaagent:${SKYWALKING_AGENT_PATH} \
-DSW_AGENT_NAME=${SW_AGENT_NAME} \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=${SW_AGENT_COLLECTOR_BACKEND_SERVICES} \
-jar your-application.jar方式1:Maven项目配置
在pom.xml中添加:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>
-javaagent:/path/to/skywalking-agent/skywalking-agent.jar
-DSW_AGENT_NAME=spring-boot-app
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800
</jvmArguments>
</configuration>
</plugin>
</plugins>
</build>方式2:使用SkyWalking Spring Boot Starter
添加依赖:
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>9.5.0</version>
</dependency>配置application.yml:
spring:
application:
name: your-service-name
skywalking:
agent:
service_name: ${spring.application.name}
collector:
backend_service: localhost:11800编辑config/agent.config:
# 服务名称
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
# 后端服务地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
# 采样率(0-10000,10000表示100%采样)
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:10000}
# 日志级别
logging.level=${SW_LOGGING_LEVEL:INFO}
# 插件配置
plugin.mysql.trace_sql_parameters=${SW_MYSQL_TRACE_SQL_PARAMETERS:true}
plugin.springmvc.collect_http_params=${SW_PLUGIN_SPRINGMVC_COLLECT_HTTP_PARAMS:true}使用@Trace注解
import org.apache.skywalking.apm.toolkit.trace.Trace;
@Service
public class UserService {
@Trace
public User getUserById(Long id) {
// 业务逻辑
return userRepository.findById(id);
}
@Trace(operationName = "custom_operation")
public void customMethod() {
// 自定义操作名称
}
}手动创建Span
import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
public class CustomService {
public void doSomething() {
// 获取当前TraceId
String traceId = TraceContext.traceId();
// 创建自定义Span
ActiveSpan.tag("custom_tag", "value");
ActiveSpan.info("Custom log message");
// 业务逻辑
processData();
// Span会自动结束
}
}Spring Cloud集成
spring:
cloud:
skywalking:
enabled: true
agent:
service-name: ${spring.application.name}
collector:
backend-service: localhost:11800Dubbo集成
Agent自动支持Dubbo,无需额外配置。
Kafka集成
# 在agent.config中启用Kafka插件
plugin.kafka.bootstrap_servers=localhost:90925. SkyWalking UI使用
打开浏览器访问:http://localhost:8080
功能:
- 全局概览
- 服务性能指标
- 服务实例状态
- 端点性能统计
主要指标:
- SLA:服务级别协议达成率
- CPM:每分钟调用次数
- Avg Response Time:平均响应时间
- Apdex:应用性能指数
功能:
- 服务依赖关系可视化
- 服务间调用关系
- 服务健康状态
- 流量流向
操作:
- 点击服务节点查看详情
- 拖拽调整布局
- 筛选特定服务
功能:
- 分布式调用链追踪
- 请求详情分析
- 性能瓶颈定位
- 异常追踪
使用步骤:
- 选择服务
- 设置时间范围
- 查看追踪列表
- 点击查看详细调用链
调用链信息:
- 每个Span的耗时
- 调用关系
- 参数和返回值
- 异常信息
功能:
- 线程性能分析
- CPU使用分析
- 方法调用栈分析
使用场景:
- 性能瓶颈分析
- CPU热点定位
- 方法耗时分析
功能:
- 日志查看
- 日志搜索
- 日志关联追踪
配置:
需要在应用中集成日志收集器。
功能:
- 告警规则配置
- 告警历史查看
- 告警通知配置
6. 性能监控详解
服务列表
在UI的"Service"页面可以查看:
- 服务名称
- 平均响应时间
- 成功率
- 吞吐量(CPM)
- SLA
服务详情
点击服务名称查看详情:
- 服务概览:整体性能指标
- 服务实例:该服务的所有实例
- 端点列表:该服务的所有端点
- 拓扑关系:与其他服务的关系
端点性能
关键指标:
- 响应时间:P50、P75、P90、P95、P99
- 吞吐量:每分钟请求数
- 成功率:成功请求占比
- SLA:服务级别协议
慢端点识别
在"Endpoint"页面可以:
- 查看所有端点
- 按响应时间排序
- 识别慢端点
- 分析慢端点原因
实例状态
状态类型:
- 正常:实例运行正常
- 异常:实例出现异常
- 离线:实例已下线
实例指标
- JVM内存使用
- CPU使用率
- 线程数
- GC情况
内存监控
指标:
- Heap内存使用
- Non-Heap内存使用
- 内存使用趋势
GC监控
指标:
- GC次数
- GC耗时
- GC类型分布
线程监控
指标:
- 线程总数
- 运行线程数
- 等待线程数
- 阻塞线程数
7. 链路追踪分析
Trace和Span:
- Trace:一次完整的请求追踪
- Span:Trace中的一个操作单元
Span类型:
- Entry Span:入口Span(如HTTP请求入口)
- Exit Span:出口Span(如调用外部服务)
- Local Span:本地Span(如方法调用)
追踪列表
在"Trace"页面:
- 选择服务
- 设置时间范围
- 查看追踪列表
- 可以按状态筛选(成功/失败)
追踪详情
点击追踪ID查看详情:
- 调用链图:可视化展示调用关系
- Span列表:所有Span的详细信息
- 时间线:Span的时间分布
- 异常信息:如有异常会显示
识别性能瓶颈
- 查看Span耗时
- 找出耗时最长的Span
- 分析该Span的详细信息
- 定位具体问题
分析异常
- 筛选失败的Trace
- 查看异常Span
- 查看异常堆栈
- 关联日志分析
分析慢请求
- 按响应时间排序
- 查看慢Trace详情
- 分析调用链
- 找出慢的原因
添加自定义Span
import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
import org.apache.skywalking.apm.toolkit.trace.Trace;
@Service
public class BusinessService {
@Trace
public void processOrder(Order order) {
// 添加标签
ActiveSpan.tag("order.id", order.getId());
ActiveSpan.tag("order.amount", String.valueOf(order.getAmount()));
// 添加日志
ActiveSpan.info("Processing order: " + order.getId());
// 业务逻辑
validateOrder(order);
calculatePrice(order);
saveOrder(order);
}
}异步追踪
import org.apache.skywalking.apm.toolkit.trace.RunnableWrapper;
import org.apache.skywalking.apm.toolkit.trace.TraceCrossThread;
@Service
public class AsyncService {
public void asyncProcess() {
CompletableFuture.runAsync(
RunnableWrapper.of(() -> {
// 异步任务逻辑
processData();
})
);
}
}8. 告警配置
编辑config/alarm-settings.yml:
rules:
# 服务响应时间告警
service_sla_rule:
metrics-name: service_sla
threshold: 8000
op: "<"
period: 10
count: 3
message: "Service {name} SLA is less than 8000ms in 3 minutes of last 10 minutes"
# 服务响应时间百分比告警
service_resp_time_rule:
metrics-name: service_resp_time
threshold: 1000
op: ">"
period: 10
count: 3
message: "Service {name} response time is greater than 1000ms in 3 minutes of last 10 minutes"
# 服务成功率告警
service_success_rate_rule:
metrics-name: service_success_rate
threshold: 8000
op: "<"
period: 10
count: 3
message: "Service {name} success rate is less than 80% in 3 minutes of last 10 minutes"
# 端点响应时间告警
endpoint_resp_time_rule:
metrics-name: endpoint_resp_time
threshold: 1000
op: ">"
period: 10
count: 3
message: "Endpoint {name} response time is greater than 1000ms in 3 minutes of last 10 minutes"
# 数据库连接池告警
database_access_rule:
metrics-name: database_access
threshold: 50
op: ">"
period: 10
count: 2
message: "Database access {name} response time is greater than 50ms"
# JVM Old GC告警
jvm_old_gc_rule:
metrics-name: jvm_old_gc
threshold: 1000
op: ">"
period: 10
count: 2
message: "JVM Old GC time is greater than 1000ms"
# JVM Young GC告警
jvm_young_gc_rule:
metrics-name: jvm_young_gc
threshold: 100
op: ">"
period: 10
count: 2
message: "JVM Young GC time is greater than 100ms"
webhooks:
- http://127.0.0.1:8080/webhook创建Webhook接收服务
@RestController
@RequestMapping("/webhook")
public class AlarmWebhookController {
@PostMapping
public void receiveAlarm(@RequestBody List<AlarmMessage> alarms) {
for (AlarmMessage alarm : alarms) {
System.out.println("告警: " + alarm.getAlarmMessage());
// 发送通知(邮件、短信、钉钉等)
sendNotification(alarm);
}
}
}
@Data
class AlarmMessage {
private int scopeId;
private String name;
private String alarmMessage;
private long startTime;
}配置钉钉Webhook
webhooks:
- http://your-dingtalk-webhook-url钉钉消息格式
{
"msgtype": "text",
"text": {
"content": "SkyWalking告警: {告警内容}"
}
}配置邮件服务器:
mail-sender:
host: smtp.example.com
port: 587
username: your-email@example.com
password: your-password
from: skywalking@example.com9. 存储配置
优势
- 强大的搜索能力
- 支持大规模数据
- 灵活的查询
- 良好的扩展性
配置
storage:
selector: elasticsearch
elasticsearch:
namespace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1}
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1}
dayStep: ${SW_STORAGE_DAY_STEP:1}数据保留策略
recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:3} # 记录数据保留3天
metricsDataTTL: ${SW_CORE_METRICS_DATA_TTL:7} # 指标数据保留7天优势
- 简单易用
- 运维成本低
- 适合小规模部署
配置
storage:
selector: mysql
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/skywalking"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}优势
- 零配置
- 适合测试和开发
- 轻量级
限制
- 不适合生产环境
- 数据存储在内存或文件
- 性能有限
10. 高级特性
集成Logback
添加依赖:
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>9.5.0</version>
</dependency>配置logback.xml:
<configuration>
<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>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>Prometheus集成
配置application.yml:
prometheus:
host: ${SW_PROMETHEUS_HOST:0.0.0.0}
port: ${SW_PROMETHEUS_PORT:1234}访问:http://localhost:1234/metrics
import org.apache.skywalking.apm.toolkit.meter.Counter;
import org.apache.skywalking.apm.toolkit.meter.Gauge;
import org.apache.skywalking.apm.toolkit.meter.MeterFactory;
@Service
public class MetricsService {
private final Counter orderCounter = MeterFactory.counter("order_count")
.tag("status", "success")
.build();
private final Gauge activeUsers = MeterFactory.gauge("active_users")
.build();
public void processOrder() {
orderCounter.increment();
activeUsers.setValue(getActiveUserCount());
}
}HTTP调用追踪
Agent自动支持HTTP客户端(如OkHttp、HttpClient)。
消息队列追踪
支持Kafka、RocketMQ等消息队列的追踪。
采样率设置
# 在agent.config中
agent.sample_n_per_3_secs=10000 # 100%采样
agent.sample_n_per_3_secs=5000 # 50%采样
agent.sample_n_per_3_secs=1000 # 10%采样动态采样
import org.apache.skywalking.apm.toolkit.trace.IgnoredTracerContext;
// 忽略特定请求的追踪
if (shouldIgnore(request)) {
IgnoredTracerContext.ignore();
}11. 最佳实践
生产环境使用Elasticsearch:性能和扩展性更好
OAP Server高可用:部署多个OAP实例
Agent配置统一管理:使用配置中心
监控OAP本身:监控OAP Server的性能
合理设置采样率:根据流量调整采样率
优化存储:合理设置数据保留时间
批量上报:Agent会批量上报数据
网络优化:确保Agent到OAP的网络稳定
服务名称:使用有意义的服务名称
端点名称:使用RESTful风格的端点名称
标签命名:使用统一的标签命名规范
关键服务100%采样:核心业务服务全采样
非关键服务降采样:减少存储压力
异常全采样:异常请求全采样便于排查
分级告警:根据严重程度分级
避免告警风暴:合理设置告警阈值
告警聚合:相同告警聚合通知
12. 常见问题与故障排查
问题现象:
- UI中看不到服务数据
- Agent日志显示连接失败
排查步骤:
- 检查OAP是否启动
- 检查网络连通性:
telnet oap-host 11800 - 检查Agent配置:
SW_AGENT_COLLECTOR_BACKEND_SERVICES - 查看Agent日志:
logs/skywalking-api.log
问题现象:
- OAP正常运行但UI无数据
排查步骤:
- 检查存储配置是否正确
- 检查存储服务是否正常(ES/MySQL)
- 查看OAP日志:
logs/oap.log - 检查时间范围设置
问题现象:
- OAP Server CPU/内存占用高
- UI响应慢
解决方案:
- 增加OAP Server资源
- 降低采样率
- 优化存储配置
- 增加OAP实例(集群部署)
问题现象:
- 部分请求没有追踪数据
可能原因:
- 采样率设置过低
- Agent配置错误
- 网络问题导致数据丢失
- 存储写入失败
错误1:ClassNotFoundException
java.lang.ClassNotFoundException: org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter解决方案:
- 检查Agent版本是否匹配
- 检查Agent路径是否正确
错误2:端口被占用
Address already in use: 11800解决方案:
- 修改OAP端口配置
- 或停止占用端口的进程
错误3:存储连接失败
Failed to connect to Elasticsearch解决方案:
- 检查Elasticsearch是否启动
- 检查连接配置
- 检查网络连通性
13. 总结与进阶
通过本教程,你已经掌握了:
- ✅ SkyWalking的基本概念和架构
- ✅ SkyWalking的安装和部署
- ✅ Java应用的集成方法
- ✅ UI界面的使用
- ✅ 性能监控和链路追踪
- ✅ 告警配置
- ✅ 存储配置
- ✅ 高级特性
- 源码学习:深入了解SkyWalking的实现原理
- 插件开发:开发自定义插件
- 性能调优:大规模部署的性能优化
- 集成其他系统:与Prometheus、Grafana等集成
- Kubernetes部署:在K8s环境中部署
- 官方文档:https://skywalking.apache.org/docs/
- GitHub:https://github.com/apache/skywalking
- 社区:https://github.com/apache/skywalking/discussions
- 博客:官方博客和社区文章
- 从简单开始:先用H2存储快速体验
- 逐步深入:逐步使用Elasticsearch等存储
- 结合实际项目:在真实项目中应用
- 持续优化:根据实际情况调整配置
结语
SkyWalking是一个功能强大的APM工具,可以帮助你更好地监控和管理分布式系统。通过本教程的学习,相信你已经掌握了SkyWalking的核心功能和使用方法。
记住:
- 多实践:理论结合实践,多动手操作
- 关注性能:注意Agent的性能开销
- 合理配置:根据实际情况调整配置
- 持续学习:关注SkyWalking的更新和发展
祝你学习愉快,监控顺利! 🚀
本教程由Java突击队学习社区编写,如有问题欢迎反馈。