1. 简介
1.1 概念
- 一个开源的可观测平台, 用于从服务和云原生基础设施收集, 分析, 聚合及可视化数据。SkyWalking 提供了一种简便的方式来清晰地观测分布式系统, 甚至横跨多个云平台。SkyWalking 更是一个现代化的应用程序性能监控(Application Performance Monitoring)系统, 尤其专为云原生、基于容器的分布式系统设计。
1.2 功能列表
- 多种监控手段。可以通过语言探针和 service mesh 获得监控是数据。
- 多个语言自动探针。包括 Java,.NET Core 和 Node.JS。
- 轻量高效。无需大数据平台,和大量的服务器资源。
- 模块化。UI、存储、集群管理都有多种机制可选。
- 支持告警。
- 优秀的可视化解决方案。
1.3 整体架构

整个架构,分成上、下、左、右四部分:
- 上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器。
- 下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。
- 右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。
- 左部分 SkyWalking UI :负责提供控台,查看链路等等。
2. 搭建 SkyWalking 单机环境

- 第一步,搭建一个 Elasticsearch 服务。
- 第二步,*载下** SkyWalking 软件包。
- 第三步,搭建一个 SkyWalking OAP 服务。
- 第四步,启动一个 Spring Boot 应用,并配置 SkyWalking Agent。
- 第五步,搭建一个 SkyWalking UI 服务。
2.1 Elasticsearch 搭建
- 2.1.1 *载下**安装包
- 2.1.2 安装elasticsearch,将压缩包解压
tar -zxvf ./elasticsearch-6.4.0.tar.gz
- 2.1.3 修改Linux系统的限制配置,将文件创建数修改为65536个。
修改系统中允许应用最多创建多少文件等的限制权限。Linux默认来说,一般限制应用最多 创建的文件是65535个。但是ES至少需要65536的文件创建数的权限。 修改系统中允许用户启动的进程开启多少个线程。默认的Linux限制root用户开启的进程可 以开启任意数量的线程,其他用户开启的进程可以开启1024个线程。必须修改限制数为 4096+。因为ES至少需要4096的线程池预备。
vi /etc/security/limits.conf
#新增如下内容在limits.conf文件中
es soft nofile 65536
es hard nofile 65536
es soft nproc 4096
es hard nproc 4096
修改系统控制权限,ElasticSearch需要开辟一个65536字节以上空间的虚拟内存。Linux默认不允许任何用户和应用程序直接开辟这么大的虚拟内存。
vi /etc/sysctl.conf
#新增如下内容在sysctl.conf文件中,当前用户拥有的内存权限大小
vm.max_map_count=262144
#让系统控制权限配置生效
sysctl -p
建一个用户, 用于ElasticSearch启动。
ES在5.x版本之后,强制要求在linux中不能使用root用户启动ES进程。所以必须使用其他用户开启ES进程才可以。
#创建用户
useradd es
#修改上述用户的密码
passwd es
#创建密码记得不能太过简单
#修改elasicsearch目录的拥有者
chown -R es elasticsearch-6.4.0
使用es用户启动elasticsearch
#切换用户
su es
#到ElasticSearch的bin目录下
cd bin/
#后台启动
./elasticsearch -d
访问:IP:9200 ,如果显示出如下信息,就证明ElasticSearch安装成功:
{
"name" : "node-1",
"cluster_name" : "CollectorDBCluster",
"cluster_uuid" : "aP9RJgc0S5iTXhOPj1fJhA",
"version" : {
"number" : "7.15.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "93d5a7f6192e8a1a12e154a2b81bf6fa7309da0c",
"build_date" : "2021-11-04T14:04:42.515624022Z",
"build_snapshot" : false,
"lucene_version" : "8.9.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
修改:elasticsearch.yml
node.name: node-1 //节点名称
cluster.initial_master_nodes: ["node-1"] //初始化节点
network.host: 0.0.0.0 // 内网访问
# 如果 cluster.name 不设置为 CollectorDBCluster ,则需要修改 SkyWalking 的配置文件
cluster.name: CollectorDBCluster
node.master: true
#指定该节点是否存储索引数据,默认为true
node.data: true
2.2 安装Skywalking,分为两个步骤:
- 安装Backend后端服务
- 安装UI
2.2.1 安装Backend后端服务
① 首先切回到root用户,切换到目录下,解压Skywalking压缩包。
#切换到root用户
su root
# 解压
$ tar -zxvf apache-skywalking-apm-es7-6.6.0.tar.gz
$ cd apache-skywalking-apm-bin-es7
$ ls -ls
4 drwxr-xr-x 8 root root 4096 Sep 9 15:09 agent # SkyWalking Agent
4 drwxr-xr-x 2 root root 4096 Sep 9 15:44 bin # 执行脚本
4 drwxr-xr-x 2 root root 4096 Sep 9 15:44 config # SkyWalking OAP Server 配置文件
32 -rwxr-xr-x 1 root root 28903 Sep 9 14:32 LICENSE
4 drwxr-xr-x 3 root root 4096 Sep 9 15:44 licenses
32 -rwxr-xr-x 1 root root 31850 Sep 9 14:32 NOTICE
16 drwxr-xr-x 2 root root 16384 Sep 9 15:22 oap-libs # SkyWalking OAP Server
4 -rw-r--r-- 1 root root 1978 Sep 9 14:32 README.txt
4 drwxr-xr-x 2 root root 4096 Sep 9 15:44 webapp # SkyWalking UI
② 修改Skywalking存储的数据源配置:
cd apache-skywalking-apm-bin
vi config/application.yml
我们可以看到默认配置中,使用了H2作为数据源。我们将其全部注释。将ElasticSearch对应的配置取消注释:
cluster:
# selector: ${SW_CLUSTER:standalone}
standalone: // 单机模式
core:
default:
# 混合角色:接收代理数据,1级聚合、2级聚合
# 接收者:接收代理数据,1级聚合点
# 聚合器:2级聚合点
role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
restHost: ${SW_CORE_REST_HOST:0.0.0.0} #skywalking服务端的REST绑定的IP
restPort: ${SW_CORE_REST_PORT:12800}
restContextPath: ${sSW_CORE_REST_CONTEXT_PATH:/}
gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0} #skywalking服务端GRPC通信绑定的IP
gRPCPort: ${SW_CORE_GRPC_PORT:11800}
storage:
selector: ${SW_STORAGE:elasticsearch7} # elasticsearch 的集群名称
elasticsearch7:
nameSpace: ${SW_NAMESPACE:"CollectorDBCluster"} #会相应修改es中存储的索引的前缀
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} # elasticsearch 集群节点的地址及端口
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
user: ${SW_ES_USER:""} # elasticsearch 的用户名
password: ${SW_ES_PASSWORD:""} # elasticsearch 的密码
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2} # 设置 elasticsearch 索引分片数量
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0} # 设置 elasticsearch 索引副本数
# Those data TTL settings will override the same settings in core module.
recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # 记录明细有效期,默认7,单位天。
otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # 其他指标(分钟/小时/天)数据有效期,默认45,单位天。
monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # 月级指标数据有效期,默认18,单位月
# Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
# 批量处理配置
bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # # 每2000个请求执行一次批量
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} ## 无论请求的数量如何,每10秒刷新一次堆
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # 并发请求的数量
resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000} # elasticsearch 查询的最大数量
segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200} # elasticsearch 查询段最大数量
- 重点修改 storage 配置项,通过 storage.selector 配置项来设置具体使用的存储器。
- storage.elasticsearch 配置项,设置使用 Elasticsearch 6.X 版本作为存储器。胖友可以主要修改 nameSpace 、 clusterNodes 两个配置项即可,设置使用的 Elasticsearch 的集群和命名空间。
- storage.elasticsearch7 配置项,设置使用 Elasticsearch 7.X 版本作为存储器。
③ 启动 SkyWalking OAP 服务
$ bin/oapService.sh
SkyWalking OAP started successfully!
是否 真正 启动成功,胖友打开 logs/skywalking-oap-server.log 日志文件,查看是否有错误日志。首次启动时,因为 SkyWalking OAP 会创建 Elasticsearch 的索引,所以会“疯狂”的打印日志。最终,我们看到如下日志,基本可以代表 SkyWalking OAP 服务启动成功:
友情提示:因为首次启动会创建 Elasticsearch 索引,所以可能会比较慢。
2026-03-18T15:04:37+00:00,635 - org.eclipse.jetty.server.Server - 444 [main] INFO [] - Started @35249ms
2.2.2 安装UI
这样安装Backend后端服务就已经完毕了,接下来我们安装UI。先来看一下UI的配置文件:
cat webapp/webapp.yml
#默认启动端口
server:
port: 8081
spring:
cloud:
gateway:
routes:
- id: oap-route
uri: lb://oap-service
predicates:
- Path=/graphql/**
discovery:
client:
simple:
instances:
oap-service:
- uri: http://127.0.0.1:12800
# - uri: http://<oap-host-1>:<oap-port1>
# - uri: http://<oap-host-2>:<oap-port2>
mvc:
throw-exception-if-no-handler-found: true #出现错误时, 直接抛出异常
web:
resources:
add-mappings: true #关闭工程中的资源文件建立映射
management:
server:
base-path: /manage
# 设置Agent命名空间,它用来隔离追踪和监控数据,当两个应用使用不同的名称空间时,跨进程传播链会中断。
agent.namespace=${SW_AGENT_NAMESPACE:default-namespace}
# 设置服务名称,会在 Skywalking UI 上显示的名称
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
# 每 3秒采集的样本跟踪比例,如果是负数则表示 100%采集
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}
# 启用 Debug ,如果为 true 则将把所有检测到的类文件保存在"/debug"文件夹中
# agent.is_open_debugging_class = ${SW_AGENT_OPEN_DEBUG:true}
# 后端的 collector 端口及地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.2.215:11800}
# 日志级别
logging.level=${SW_LOGGING_LEVEL:DEBUG}
目前的默认配置不用修改就可以使用,启动UI程序:
[root@localhost bin]# webappService.sh
然后我们就可以通过浏览器访问Skywalking的可视化页面了,访问地址:http://虚拟机IP地址:8080,如果 出现下面的图,就代表安装成功了。

/bin/startup.sh可以同时启动backend和ui,后续可以执行该文件进行重启。
2.3 SkyWalking Agent
① Agent 软件包
我们需要将 apache-skywalking-apm-bin/agent 目录,拷贝到 Java 应用所在的服务器上。这样,Java 应用才可以配置使用该 SkyWalking Agent。我们来看看 Agent 目录下有哪些:
$ ls -ls
total 35176
0 drwxr-xr-x@ 7 yunai staff 224 Dec 24 14:20 activations
0 drwxr-xr-x@ 4 yunai staff 128 Dec 24 14:21 bootstrap-plugins
0 drwxr-xr-x@ 3 yunai staff 96 Dec 24 14:12 config # SkyWalking Agent 配置
0 drwxr-xr-x@ 3 yunai staff 96 Jan 2 19:29 logs # SkyWalking Agent 日志
0 drwxr-xr-x@ 13 yunai staff 416 Dec 24 14:22 optional-plugins # 可选插件
0 drwxr-xr-x@ 68 yunai staff 2176 Dec 24 14:20 plugins # 插件
35176 -rw-r--r--@ 1 yunai staff 18006420 Dec 24 14:12 skywalking-agent.jar # SkyWalking Agent
② 配置 Java 启动脚本
# SkyWalking Agent 配置
export SW_AGENT_NAME=demo-application # 配置 Agent 名字。一般来说,我们直接使用 Spring Boot 项目的 `spring.application.name` 。
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 # 配置 Collector 地址。
export SW_AGENT_SPAN_LIMIT=2000 # 配置链路的最大 Span 数量。一般情况下,不需要配置,默认为 300 。主要考虑,有些新上 SkyWalking Agent 的项目,代码可能比较糟糕。
export JAVA_AGENT=-javaagent:/Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar # SkyWalking Agent jar 地址。
# Jar 启动
java -jar $JAVA_AGENT -jar lab-39-demo-2.2.2.RELEASE.jar
- 通过环境变量,进行配置。
- 更多的变量,可以在 /skywalking/apache-skywalking-apm-bin/agent/config/agent.config 查看。要注意,可能有些变量是被注释掉的,例如说 SW_AGENT_SPAN_LIMIT 对应的 agent.span_limit_per_segment 。
③ 执行脚本:
直接执行上述的 Shell 脚本,启动 Java 项目。在启动日志中,我们可以看到 SkyWalking Agent 被加载的日志。日志示例如下:
DEBUG 2026-03-18T15:04:37+00:00:400 main AgentPackagePath : The beacon class location is jar:file:/Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar!/org/apache/skywalking/apm/agent/core/boot/AgentPackagePath.class.
INFO 2026-03-18T15:04:37+00:00:402 main SnifferConfigInitializer : Config file found in /Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/config/agent.config.
同时,也可以在 /Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/agent/logs/skywalking-api.log 查看对应的 SkyWalking Agent 日志。日志示例如下:
DEBUG 2026-03-18T15:04:37+00:00:539 SkywalkingAgent-5-ServiceAndEndpointRegisterClient-0 ServiceAndEndpointRegisterClient : ServiceAndEndpointRegisterClient running, status:CONNECTED.
- 这里,我们看到 status:CONNECTED ,表示 SkyWalking Agent 连接 SkyWalking OAP 服务成功。
3. UI页面元素解析
3.1页面简介
- 功能选项卡选择区. 这里列出了主要特性。更多细节将在下面介绍.
- 重载区. 控制重新加载机制,包括定期重新加载或手动重新加载.
- 时间选择器. 控制时区和时间范围。这里有一个中文/英文切换按钮,默认,UI使用浏览器语言设置

3.2 仪表板
指示板提供服务、服务实例和端点的指标。这里需要了解一些度量术语
吞吐量CPM,表示每分钟的调用 Apdex分数,参考Apdex in WIKI 响应时间百分比,包括 p99, p95, p90, p75, p50.参考percentile in WIKI SLA表示成功率。对于HTTP,表示响应为200的请求 服务、实例和仪表板选择器可以手动重新加载,而不是重新加载整个页面。注意,重载区域** 不会重载这些选择器

这里,我们会看到 SkyWalking 中非常重要的三个概念:
- 服务(Service) :表示对请求提供相同行为的一系列或一组工作负载。在使用 Agent 或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用你在平台(例如说 Istio)上定义的名字。 这里,我们可以看到 Spring Boot 应用的 服务 为 "demo-application" ,就是我们在环境变量 SW_AGENT_NAME 中所定义的。
- 服务实例(Service Instance) :上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个进程。但当你在使用 Agent 的时候, 一个服务实例实际就是操作系统上的一个真实进程。 这里,我们可以看到 Spring Boot 应用的 服务 为 {agent_name}-pid:{pid}@{hostname} ,由 Agent 自动生成。
- 端点(Endpoint) :对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。 这里,我们可以看到 Spring Boot 应用的一个 端点 ,为 API 接口 /product/list 。
3.3 Global全局维度


- Services load:服务每分钟请求数
- Slow Services:慢响应服务,单位ms
- Un-Health services(Apdex):Apdex性能指标,1为满分。
- Global Response Latency:百分比响应延时,不同百分比的延时时间,单位ms
- Global Heatmap:服务响应时间热力分布图,根据时间段内不同响应时间的数量显示颜色深度
- 底部栏:展示数据的时间区间,点击可以调整。
3.4 service维度


- Service Apdex(数字):当前服务的评分
- Service Apdex(折线图):不同时间的Apdex评分
- Successful Rate(数字):请求成功率
- Successful Rate(折线图):不同时间的请求成功率
- Servce Load(数字):每分钟请求数
- Servce Load(折线图):不同时间的每分钟请求数
- Service Avg Response Times:平均响应延时,单位ms
- Global Response Time Percentile:百分比响应延时
- Servce Instances Load:每个服务实例的每分钟请求数
- Show Service Instance:每个服务实例的最大延时
- Service Instance Successful Rate:每个服务实例的请求成功率
3.5 Instance维度


- Service Instance Load:当前实例的每分钟请求数
- Service Instance Thorughput:当前实例吞吐量
- Service Instance Successful Rate:当前实例的请求成功率
- Service Instance Latency:当前实例的响应延时
- JVM CPU:jvm占用CPU的百分比
- JVM Memory:JVM内存占用大小,单位m
- JVM GC Time:JVM垃圾回收时间,包含YGC和OGC
- JVM GC Count:JVM垃圾回收次数,包含YGC和OGC
- JVM Thread Count :JVM线程数
- JVM Thread state Count :JVM活动的线程数
- JVM Thread Count :JVM线程数
- CLR XX:类似JVM虚拟机
3.6 Endpoint端点(API)维度


- Endpoint Load in Current Service:每个端点的每分钟请求数
- Slow Endpoints in Current Service:每个端点的最慢请求时间,单位ms
- Successful Rate in Current Service:每个端点的请求成功率
- Endpoint Load:当前端点每个时间段的请求数据
- Endpoint Avg Response Time:当前端点每个时间段的请求行响应时间
- Endpoint Response Time Percentile:当前端点每个时间段的响应时间占比
- Endpoint Successful Rate:当前端点每个时间段的请求成功率
3.7 拓扑图

Skywalking提供拓扑图,直观的查看服务之间的调用关系
3.8 追踪
在Skywalking中,每一次用户发起一条请求,就可以视为一条追踪数据,每条追踪数据携带有一个ID值。追踪数据在追踪页面中可以进行查询:
左侧:api接口列表,红色-异常请求,蓝色-正常请求 右侧:api追踪列表,api请求连接各端点的先后顺序和时间

3.9 数据库维度

Database 内可以展示数据库的响应时间、响应时间分布、吞吐量、SLA、慢SQL等详细信息,便于直观展示数据库状态
- Database Avg Response Time:当前数据库事件平均响应时间,单位ms
- Database Access Successful Rate:当前数据库访问成功率
- Database Traffic:CPM,当前数据库每分钟请求数
- Database Access Latency Percentile:数据库不同比例的响应时间,单位ms
- Slow Statements:前N个慢查询,单位ms
- All Database Loads:所有数据库中CPM排名
- Un-Health Databases:所有数据库健康排名,请求成功率排名
3.10 性能剖析
- 剖析端点的响应时间必须大于监控间隔时间
由于性能栈快照有一定的性能消耗,所以采集周期不宜过密, SkyWalking 目前不支持小于 10ms 的采集间隔。所以如果问题方法执行时间小于 10ms,此方法并不适用。同时剖析端点的响应速度如果小于监控时间间隔,也无法进行监控采集。

- 左侧列表:任务及对应的采样请求
表格中从左到右分别展示了方法名、开始时间、执行时长、执行时间占比、API类型、服务名和跨度信息
- 右侧:端点链路及每个端点的堆栈信息
从左右到右分别展示了栈帧名称、该栈帧总计耗时(包含其下面所有自栈帧)、当前栈帧自身耗时和监控次数
3.11 日志
- pom中引入相关依赖,版本与SkyWalking一致
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.5.0</version>
</dependency>
- 在logback.xml中加入配置
<appender name="msystem-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<!-- 日志输出编码 -->
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="msystem-log"/>
</root>
- 展示结果

3.12 告警
https://www.cnblogs.com/heihaozi/p/apache-skywalking-alarm.html