SkyWalking
SkyWalking介绍
SkyWalking适用于分布式系统的应用程序性能监控(Application Performance Monitoring,即APM)工具,专为微服务、云原生和基于容器 (Kubernetes) 的架构而设计。
官网:https://skywalking.apache.org/
GitHub:https://github.com/apache/skywalking
官网文档:https://skywalking.apache.org/docs/main/v9.4.0/readme/
中文文档:https://skyapm.github.io/document-cn-translation-of-skywalking/
官方提供控制台演示:
arduino
演示地址:http://demo.skywalking.apache.org/
账号:skywalking
密码:skywalking

skywalking架构原理
Skywalking是一种分布式追踪系统,它的原理是在应用程序中嵌入Skywalking Agent,Agent在运行时会自动注入并收集上下文数据,然后将这些数据发送到Skywalking Collector。Collector接收到数据后会将其存储起来,并生成相应的调用链、度量和报告等信息,供开发人员或运维人员进行监控和分析。Skywalking还支持多种语言和框架,可与常见的云原生工具集集成,如Kubernetes、Istio等。
Skywalking中有多个角色:
arduino
Skywalking Agent:嵌入在应用程序中的组件,负责收集和注入上下文数据
Skywalking Collector:接收从 Agent 发送的数据并存储起来,生成调用链、度量和报告等信息
Skywalking Web UI:提供一个用户友好的 Web 界面,以显示应用程序的监控数据和分析结果
Skywalking OAP Server:可选组件,用于扩展 Collector 的功能并与其他数据源集成
数据库:Skywalking 还需要使用一个数据库来保存其元数据和报表数据
集成的组件:Skywalking 还可以与常见的云原生工具集进行集成,如 Kubernetes、Istio等
Skywalking采用分布式追踪技术,其底层原理主要涉及数据收集、传输和存储,以及调用链的构建和服务性能度量。
css
Skywalking Agent:Skywalking Agent嵌入在应用程序中,可以自动收集和注入上下文数据
数据传输:Skywalking Agent将收集到的数据通过HTTP、gRPC等协议发送到Skywalking Collector中。Collector接收到数据后进行处理存储,并通过Web UI提供用户可视化展示
Trace ID:Skywalking采用唯一的Trace ID标识一次调用链,整个调用链的所有节点都使用相同的Trace ID
Span:表示一次服务调用单元,包含一个开始时间和结束时间,每个Span都有属于自己的Trace ID
Trace Segment:一个完整的调用链称为Trace Segment,包含多个Span的集合。Trace Segment会在整个调用链结束后发送到 Collector进行存储和归档
Metrics:Skywalking还支持对服务性能指标的监控和度量,例如延迟、吞吐量等
Windos环境下的安装
确认环境
在开始安装SkyWalking之前,请确认系统中已安装Java 8或更高版本
java
java -version
下载SkyWalking Apm与Agent
下载地址:https://skywalking.apache.org/downloads/
注意:
应该在skywalking9版本
以后将agent进行了单独拆分,因此若要使用9版本以后的,需要下载apm和agent两个压缩包。具体以官方为准。
Apm下载
java
wget https://www.apache.org/dyn/closer.cgi/skywalking/9.4.0/apache-skywalking-apm-9.4.0.tar.gz
wget https://archive.apache.org/dist/skywalking/9.2.0/apache-skywalking-apm-9.2.0.tar.gz
Agent下载
java
wget https://www.apache.org/dyn/closer.cgi/skywalking/java-agent/8.15.0/apache-skywalking-java-agent-8.15.0.tgz
wget https://archive.apache.org/dist/skywalking/java-agent/8.13.0/apache-skywalking-java-agent-8.13.0.tgz
注意:截至当前时间,使用最新版本9.4,发现在Windos环境下死活启动不起来,且无任何日志作为排查,故降低2个版本,使用9.2版本。
目录结构说明
skywalking-apm
包目录结构如下:
skywalking-java-agent
包目录结构如下:

启动SkyWalking
双击bin目录下的oapService.bat
启动Skywalking-Collector服务,追踪信息收集器,通过gRPC/Http收集客户端的采集信息 ,Http默认端口12800,gRPC默认端口11800。
双击bin目录下的webappService.bat
启动Skywalking-Webapp服务,管理平台页面,默认是8080端口
双击bin目录下的startup.bat
同时启动Skywalking-Collector服务与Skywalking-Webapp服务
这里同时启动两个服务 启动后将出现如下2个窗口
访问:
http://127.0.0.1:8080/
Skywalking配置
Skywalking的配置在刚开始使用时,着重关注以下几个文件:
arduino
skywalking-apm/config/application.yml
skywalking-apm/webapp/webapp.yml
skywalking-java-agent/config/agent.config
application.yml
application.yml
关注以下几个点:
cluster:Skywalking的集群配置
core:Skywalking的核心配置
storage:Skywalking的数据存储方式

webapp.yml
webapp.yml
文件是针对Skywalking-Webapp服务,即管理平台页面做配置
java
server:
port: 8080
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.config
Agent配置参数,以java-agent
对应的配置文件参数说明,以下是一些常见参数
yml
# 在skywalking上显示的服务名,一个服务一个名称,会在界面的拓补图中显示
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
# agent的命名空间
agent.namespace=${SW_AGENT_NAMESPACE:}
# 每三秒追踪链采样数量,负数表示尽可能的多采集,默认为-1
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}
# 配置认证,需要和backend服务中的认证配置相符
agent.authentication=${SW_AGENT_AUTHENTICATION:}
# 配置在单个segment中出现的span的最大数量,skywalking将用这个配置来估计应用的内存开销
agent.span_limit_per_segment=${SW_AGENT_SPAN_LIMIT:300}
# 配置哪些资源不会被skywalking所捕获,设置需要忽略的请求地址,默认配置如下
agent.ignore_suffix=${SW_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg}
# 探针调试开关,如果设置为true,探针会将所有操作字节码的类输出 到/debugging目录下
agent.is_open_debugging_class=${SW_AGENT_OPEN_DEBUG:false}
# 配置collector的地址,多个地址之间以","隔开
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
# 日志文件名称前缀
logging.file_name=${SW_LOGGING_FILE_NAME:skywalking-api.log}
# 日志文件最大大小,默认为300M。如果超过此大小,则会生成新文件
logging.max_file_size=${SW_LOGGING_MAX_FILE_SIZE:314572800}
# 日志级别,默认为INFO
logging.level=${SW_LOGGING_LEVEL:INFO}
# mysql插件配置
# 配置追踪sql参数,这样可以在sql错误的时候查看是否是参数所引起的
plugin.jdbc.trace_sql_parameters=${SW_JDBC_TRACE_SQL_PARAMETERS:false}
程序接入SkyWalking实现监控
配置参数说明
java
# SkyWalking Agent配置参数说明
# skywalking的collector服务的IP及端口
-Dskywalking.collector.backend_service=127.0.0.1:11800
# skywalking‐agent.jar的路径
-javaagent:D:\Development\skywalking-java-agent\skywalking-agent.jar
# 在skywalking上显示的服务名
-Dskywalking.agent.service_name=Agent-Test
IDEA接入
修改项目启动的VM运行参数
Java命令启动
注意:-javaagent
配置参数一定要在-jar
参数之前
java
java -javaagent:D:\Development\skywalking-java-agent\skywalking-agent.jar -Dskywalking.agent.service_name=Agent-Test -Dskywalking.collector.backend_service=localhost:11800 -jar APP.jar
查看监控信息
访问管理平台页面即可看到监控信息
数据存储方式
SkyWalking数据存储方式默认是H2内存数据库,如果重启SkyWalking,数据则都会丢失。可以选择将数据持久化存放在mysql、es中等。更改数据存储方式,需要修改
config/application.yml
使用MySQL存储数据
1.修改数据存储方式,这里指定:mysql
存储
java
storage:
selector: ${SW_STORAGE:mysql}
2.配置MySQL的连接信息 修改MySQL连接信息,注意:需要创建相应数据库,如创建swtest数据库
java
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest?rewriteBatchedStatements=true"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:123456}
3.下载MySQL驱动jar包到oap-libs
目录下
下载地址:https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar
4.双击bin目录下的startup.bat,启动skywalking
启动成功后,数据库中自动生成相应的表

使用elasticsearch存储数据
当Skywalking数据存储量比较大,推荐使用elasticsearch
1.安装Elasticsearch与Elasticsearch-HQ
参考:https://blog.csdn.net/qq_38628046/article/details/126736275
2.配置存储方式,指定使用:elasticsearch
java
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
namespace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:IP:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
connectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:3000}
socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000}
responseTimeout: ${SW_STORAGE_ES_RESPONSE_TIMEOUT:15000}
numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0}
3.双击bin目录下的startup.bat,启动skywalking
4.访问Elasticsearch-HQ
访问Elasticsearch-HQ,发现已生成相关索引

Linux环境下的安装
Linux的安装方式实则与Window安装方式类似,都是解压、配置、启动,只是启动执行脚本不一样。其执行
oapService.sh
、webappService.sh
、startup.sh
等脚本来启动。
Docker部署
安装elasticsearch
java
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms250m -Xmx512m" -d elasticsearch:7.4.0
安装Skywalking-UI
java
docker run --name skywalking-oap --restart always -d -p 11800:11800 -p 12800:12800 apache/skywalking-oap-server:9.2.0
使用ES作为存储
java
docker run --name skywalking-oap --restart always -d -p 11800:11800 -p 12800:12800 --link elasticsearch:es -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=es:9200 apache/skywalking-oap-server:9.2.0
安装Skywalking-UI
java
docker run --name skywalking-ui -d -p 8080:8080 --link skywalking-oap:oap -e SW_OAP_ADDRESS=oap :12800 --restart always apache/skywalking-ui
docker-compose部署
编辑docker-compose.yml
文件
java
version: '3.3'
services:
elasticsearch:
image: elasticsearch:7.4.0
container_name: elasticsearch
restart: always
privileged: true
hostname: elasticsearch
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- TZ=Asia/Shanghai
networks:
- skywalking
ulimits:
memlock:
soft: -1
hard: -1
elasticsearch-hq:
image: elastichq/elasticsearch-hq
container_name: elasticsearch-hq
restart: always
privileged: true
hostname: elasticsearch-hq
ports:
- 5000:5000
environment:
- TZ=Asia/Shanghai
networks:
- skywalking
oap:
image: apache/skywalking-oap-server:9.2.0
container_name: oap
hostname: oap
privileged: true
depends_on:
- elasticsearch
links:
- elasticsearch
restart: always
ports:
- 11800:11800
- 12800:12800
environment:
SW_STORAGE: elasticsearch7
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
TZ: Asia/Shanghai
volumes:
- ./config/alarm-settings.yml:/skywalking/config/alarm-settings.yml
networks:
- skywalking
ui:
image: apache/skywalking-ui:8.9.0
container_name: ui
privileged: true
depends_on:
- oap
links:
- oap
restart: always
ports:
- 8080:8080
environment:
SW_OAP_ADDRESS: oap:12800
TZ: Asia/Shanghai
networks:
- skywalking
networks:
skywalking:
driver: bridge
命令一键启动:
java
docker-compose up -d