- 1、SkyWalking简介
- 2、SkyWalking的搭建
- [2.1 部署Elasticsearch](#2.1 部署Elasticsearch)
- [2.2 部署SkyWalking-Server](#2.2 部署SkyWalking-Server)
- [2.3 部署SkyWalking-UI](#2.3 部署SkyWalking-UI)
- 3、应用接入
- [3.1 jar包部署方式](#3.1 jar包部署方式)
- [3.2 dockerfile方式](#3.2 dockerfile方式)
- [3.3 DockerFile示例](#3.3 DockerFile示例)
- [4、SkyWalking UI 界面说明](#4、SkyWalking UI 界面说明)
- 5、其他相关的配置
- [5.1 数据清理机制](#5.1 数据清理机制)
- [5.2 数据存储和写入优化(针对ES)](#5.2 数据存储和写入优化(针对ES))
- [5.3 链路过长问题](#5.3 链路过长问题)
- 6、参考文档:
随着微服务架构的流行,一些微服务架构下的问题也会越来越突出,比如一个请求会涉及多个服务,而服务本身可能也会依赖其他服务,整个请求路径就构成了一个网状的调用链,而在整个调用链中一旦某个节点发生异常,整个调用链的稳定性就会受到影响。
面对以上情况, 我们就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,这时候 APM(Application Performance Management应用性能管理)工具就该闪亮登场了。
1、SkyWalking简介
- 官方网站
- SkyWalking 文档中文版(社区提供)
- 官方demo网站 (账号:skywalking 密码:skywalking)
SkyWalking 它是一款优秀的国产 APM 工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。
SkyWalking架构分为三部分:
-
skyWalking-collector:链路数据归集器,相当于Skywalking的服务端
-
skyWalking-ui:SkyWalking的web可视化平台
-
skyWalking-agent:探针,与应用容器绑定在一起,启动时通过javaagent进行JVM级别的AOP,收集和发送数据到归集器
SkyWalking 的核心是数据分析和度量结果的存储平台,通过 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量数据,SkyWalking Collecter 对数据进行分析和聚合,存储到 Elasticsearch、H2、MySQL、TiDB 等。
说明: SkyWalking 的核心是数据分析和度量结果的存储平台,通过 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量数据,SkyWalking Collecter 对数据进行分析和聚合,
存储到 Elasticsearch、H2、MySQL、TiDB 等其一即可,最后我们可以通过 SkyWalking UI 的可视化界面对最终的结果进行查看。Skywalking 支持从多个来源和多种格式收集数据:多种语言的 Skywalking Agent 、Zipkin v1/v2 、Istio 勘测、Envoy 度量等数据格式。
整体架构看似模块有点多,但在实际上还是比较清晰的,主要就是通过收集各种格式的数据进行存储,然后展示。
所以搭建 Skywalking 服务我们需要关注的是 SkyWalking Collecter、SkyWalking UI 和 存储设备,SkyWalking Collecter、SkyWalking UI 官方下载安装包内已包含,最终我们只需考虑存储设备即可。
2、SkyWalking的搭建
2.1 部署Elasticsearch
注意:版本与SkyWalking版本对应
展开源码
bash
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
--restart always \
-v /home/docker/elastic/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /home/docker/elastic/elasticsearch/data:/usr/share/elasticsearch/data \
-v /home/docker/elastic/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
--net network_network \
-d elasticsearch:7.17.0
2.2 部署SkyWalking-Server
apache-skywalking-apm-es7-8.3.0.tar.gz 下载地址
- 拉取镜像
展开源码
bash
docker pull apache/skywalking-oap-server:8.3.0-es7
- 运行 skywalking-oap-server 容器 SW_STORAGE:数据存储配置,支持H2,MySQL、ES等,这里改为 elasticsearch7
配置文件路径:apache-skywalking-apm-bin-es7/config/application.yml
SkyWalking 默认使用12800 作为Rest API通信端口,11800为gRPC API端口
展开源码
bash
docker run -d --name skywalking-oap \
-e TZ=Asia/Shanghai \
-p 12800:12800 -p 11800:11800 \
--link elasticsearch:elasticsearch \
--net network_network \
-e SW_STORAGE=elasticsearch7 \
-e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 \
apache/skywalking-oap-server:8.3.0-es7
2.3 部署SkyWalking-UI
配置文件路径:apache-skywalking-apm-bin-es7/webapp/webapp.yml
- 拉取镜像
展开源码
bash
docker pull apache/skywalking-ui:8.3.0
- 运行 skywalking-ui 容器
展开源码
bash
docker run -d --name skywalking-ui \
-e TZ=Asia/Shanghai \
-p 8088:8080 \
--link skywalking-oap:skywalking-oap \
--net network_network \
-e SW_OAP_ADDRESS=skywalking-oap:12800 \
apache/skywalking-ui:8.3.0
3、应用接入
注意:agent 中指定服务名(SW_AGENT_NAME),不同的服务用不同的服务名区分。如果服务名相同,相当于是多个实例。
3.1 jar包部署方式
- 将skywalking安装包下的agent整个目录(apache-skywalking-apm-bin-es7/agent),拷贝到应用机器所在的目录,如:/home/docker/
- 在启动的脚本上添加 skywalking-agent配置:
|---------------------------------------|------------------------------------------|
| 配置参数 | 描述 |
| -javaagent | 配置skywalking-agent.jar位置,确保这个参数在-jar参数之前 |
| -DSW_AGENT_NAME | 配置应用名称,用于区分不用的服务 |
| -DSW_AGENT_COLLECTOR_BACKEND_SERVICES | 配置server的服务地址 |
| | |
展开源码
bash
java -javaagent:/home/docker/agent/skywalking-agent.jar
-DSW_AGENT_NAME=gateway
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
-Dserver.port=9999 -Xmx128m -Xms128m -XX:MaxMetaspaceSize=128m
-jar gateway.jar
3.2 dockerfile方式
- 将skywalking安装包下的agent整个目录(apache-skywalking-apm-bin-es7/agent),拷贝到应用机器所在的目录,如:/home/docker/
- docker-compose.yml
docker-compose.yml 展开源码
bash
# skywalking-aop
skywalking-oap:
image: apache/skywalking-oap-server:8.3.0-es7
container_name: skywalking-oap
links:
- elasticsearch:elasticsearch
restart: always
ports:
- 11800:11800
- 12800:12800
environment:
TZ: Asia/Shanghai
SW_STORAGE: elasticsearch7
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
JAVA_OPTS: "-Xms512m -Xmx512m"
networks:
- network
# skywalking-ui
skywalking-ui:
image: apache/skywalking-ui:8.3.0
container_name: skywalking-ui
links:
- skywalking-oap:skywalking-oap
restart: always
ports:
- 8088:8080
environment:
TZ: Asia/Shanghai
SW_OAP_ADDRESS: skywalking-oap:12800
networks:
- network
4、SkyWalking UI 界面说明
4.1 仪表盘
4.1.1 APM
APM 应用性能管理,分为全局维度、服务维度、实例维度、端点维度
(1)全局维度
- Service Load:服务每分钟请求数
- Slow Services:慢响应服务,服务耗时最长的一次耗时时间
- Un-Health Services(Apdex):服务性能健康指数,0~1
- Slow EndPoints:慢响应的端点
- Global Response Latency:不同百分比的响应延时时间
- Global Heatmap:热力图
(2)服务维度
- Service Apdex:服务性能指数
- Service Apdex(折线图):
- Service Avg Response Time:平均响应时间
- Global Response Time Percentile:百分比的响应时间
- Successful Rate:请求成功率
- Successful Rate(折线图):不同时间的请求的成功率
- Service Load:每分钟请求数
- Service Load(折线图):不同时间的每分钟请求数
- Service Instances Load:每个服务实例的每分钟请求数
- Slow Service Instances:服务实例的最大延时
- Service Instances Successful Rate:服务实例的请求成功率
(3)实例维度
- Service Instances Load:服务实例的每分钟请求数
- Service Instances Successful Rate:服务实例的请求成功率
- Service Instances Latency:服务实例的响应延时
- JVM CPU:占用CPU的百分比
- JVM Memory:内存占用大小
- JVM GC Time:垃圾回收时间,包括Young GC 和 Old GC
- JVM GC Count:垃圾回收次数
- JVM Thread Count:JVM 创建线程数量
- CLR xxx:
(4)端点维度
- EndPoint Load in Current Service:每个端点的每分钟请求数
- Slow Endpoints in Current Service:每个端点的最慢请求时间
- Successful Rate in Current Service:每个端点的请求成功率
- Endpoint Load:当前端点每个时间段的请求数据
- Endpoint Avg Response Time:端点请求的平均响应时间
- Endpoint Response Time Percentile:当前端点每个时间段的响应时间占比
- Endpoint Successful Rate:当前端点每个时间段的请求成功率
4.1.2 数据库
展示数据库的响应时间、响应时间分布、吞吐量、SLA、慢SQL等详细信息,便于直观展示数据库状态
- Database Avg Response Time:数据库平均响应时间
- Database Access Successful Rate:数据库的访问成功率
- Database Traffic:数据库每分钟请求数
- Database Access Latency Percentile:数据库不同比例的响应时间
- Slow Statements:前N个慢查询
- All Database Loads:所有数据库中的每分钟请求数排名
- Un-Health Databas:所有数据库的请求成功率排名
4.1.3 Istio、SelfObservability 、WebBrowser
这几个比较次用,用得不多,不详细介绍
- Istio:结合Istio,适配容器、采集容器信息
- SelfObservability:监控SkyWalking自身信息
- WebBrowser:8.2.0 版本新增的浏览器,提供PV、UV等数据。需结合 Skywalking-Client-js 使用
SkyWalking自监控(SelfObservability)的配置:
修改配置文件apache-skywalking-apm-bin-es7/config/application.yml
修改内容:
Prometheus-fetcher 的selector修改为:default
telemetry的selector修改为:prometheus
SelfObservability:
4.2 拓扑图
服务之间的调用关系。每条连线的颜色反应了服务之间的调用延迟情况,可以非常直观的看到服务与服务之间的调用状态,连线中间的点能点击,可显示两个服务之间链路的平均响应时间、吞吐率以及SLA等信息
4.3 追踪
显示请求的代码内部执行情况,一个完整的请求都经过了哪些服务、执行了哪些代码方法、每个方法的执行时间、执行状态等详细信息,快速定位代码问题
- 左侧:端点信息列表(API接口列表),红色------异常请求;蓝色------正常请求
- 右侧:请求追踪列表,请求中连接各端点的先后顺序和时间
4.4 性能剖析
- 服务:需要分析的服务
- 端点:链路监控中的端点名称(可以在链路追踪中查看端点信息)
- 监控时间:采集数据的开始时间
- 监控持续时间:采集数据的时间长度
- 起始监控时间:多少毫秒后开始进行采集
- 监控间隔:多少毫秒采集一次
- 最大采样数:最大采集多少样本
4.5 日志
参考:微服务链路追踪 Skywalking 生成 Trace ID 以及 logback 日志归集-CSDN博客
在应用代码中添加依赖
展开源码
java
<!--skywalking trace工具包-->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>${skywalking.version}</version>
</dependency>
4.6 告警
参考:Skywalking-告警功能实践_from(endpoint.*).filter(responsecode in [404,500,5-CSDN博客
5、其他相关的配置
5.1 数据清理机制
配置文件路径:apache-skywalking-apm-bin-es7/config/application.yml
展开源码
java
core:
selector: ${SW_CORE:default}
default:
# 数据清理机制的开关,默认开启
enableDataKeeperExecutor: ${SW_CORE_ENABLE_DATA_KEEPER_EXECUTOR:true}
# 数据清理定时器周期,默认5,单位分钟
dataKeeperExecutePeriod: ${SW_CORE_DATA_KEEPER_EXECUTE_PERIOD:5}
# 明细记录数据的有效期,默认3天
recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:3} # Unit is day
# 指标数据的有效期,默认7天
metricsDataTTL: ${SW_CORE_METRICS_DATA_TTL:7} # Unit is day
5.2 数据存储和写入优化(针对ES)
主要是进行bulk 批量写入调整,buffer 优化等,具体参见《elasticsearch写入速度优化》
5.3 链路过长问题
往往就是循环中调用其他服务 或 循环操作数据库;或者 定时任务重跑批处理
方案:
1、不加入链路追踪,直接ignore url 配置忽略
2、业务代码处理,数据库批量更新操作
6、参考文档:
【1】Skywalking分布式追踪与监控(Skywalking分布式追踪与监控)
【2】破解 Java Agent 探针黑科技 (破解 Java Agent 探针黑科技)
【3】elasticsearch 写入速度优化 (elasticsearch 写入速度优化)
【4】SkyWalking 数据清理机制 (SkyWalking 数据清理机制)
【5】开启Apache SkyWalking的自监控 (开启Apache SkyWalking的自监控)
【6】Skywalking-告警功能实践 (Skywalking-告警功能实践)