Skywalking 分布式系统的应用程序性能监视工具
随着微服务架构的流行,尤其是近年来SpringCloud的广泛应用,一些微服务架构下的问题也比较突出,比如一个请求会涉及多个服务,而服务本身可能也会依赖其他服务,整个请求路径就构成了一个网状的调用链,而在整个调用链中一旦某个节点发生异常,整个调用链的稳定性就会受到影响,为快速定位解决问题,需要一套可以跟踪、分析系统性能的工具,即APM(应用性能管理)。
目前主流的APM工具有Skywalking、Cat、Zipkin、Pinpoint,本文主要介绍SkyWalking,它是一款优秀的国产 APM 工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。
官方给出的架构图如下
skywalking-arch
SkyWalking 的核心是数据分析和度量结果的存储平台,通过 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量数据,SkyWalking Collecter 对数据进行分析和聚合,存储到 Elasticsearch、H2、MySQL、TiDB 等其一即可,最后我们可以通过 SkyWalking UI 的可视化界面对最终的结果进行查看。Skywalking 支持从多个来源和多种格式收集数据:多种语言的 Skywalking Agent 、Zipkin v1/v2 、Istio 勘测、Envoy 度量等数据格式。
搭建部署
下面简要介绍Mac下Skywalking的搭建部署
下载
从官方地址选择合适的版本进行下载
解压安装
解压后目录如下
├── agent // 本地代理模块(探针)
│ ├── activations
│ ├── bootstrap-plugins
│ ├── config
│ ├── logs
│ ├── optional-plugins
│ └── plugins
├── bin // 启动脚本
├── config // 数据收集器、存储、告警等配置
├── licenses
│ └── ui-licenses
├── logs
├── mesh-buffer
├── oap-libs
├── tools
│ └── profile-exporter
├── trace-buffer
└── webapp // 管理后台UI工具
不需要修改配置文件,在bin目录下执行startup.sh即可启动服务,成功后可查看到如下嘻嘻
./startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
然后就可以通过访问http://localhost:8080/查看SkywalkingUI界面了
启动后会启动两个服务skywalking-webapp和skywalking-collector,其中
- skywalking-webapp,管理平台页面,默认端口8080(可以在webapp/webapp.yml下修改),用户名密码 admin/admin
- skywalking-collector,追踪信息收集器,通过gRPC或者http收集客户端信息,gRPC默认端口11800,http默认端口12800(可以在config/application.yml下修改)
收集器、存储、可采集信息等配置均可在config/application.yml下修改
Java进程使用
- IDEA中使用,在VM options中增加
-javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=服务名称 -Dskywalking.collector.backend_service=127.0.0.1:12800
-javaagent,skywalking-agent.jar的绝对位置
-Dskywalking.agent.service_name,定义在UI中显示的service名称(可省略)
-Dskywalking.collector.backend_service,收集服务器地址(可省略)
- jar命令启动
和IDEA使用方式相同
常用配置
可在config/application.yml下调整修改相关配置
部署方式
cluster:
selector: ${SW_CLUSTER:standalone}
standalone:
个人电脑可选取standalon,集群部署还支持zookeeper, kubernetes, consul, etcd, nacos等
信息采集协议配置
core:
selector: ${SW_CORE:default}
default:
# Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
# Receiver: Receive agent data, Level 1 aggregate
# Aggregator: Level 2 aggregate
role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
restHost: ${SW_CORE_REST_HOST:0.0.0.0}
restPort: ${SW_CORE_REST_PORT:12800}
restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/}
gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}
gRPCPort: ${SW_CORE_GRPC_PORT:11800}
gRPCSslEnabled: ${SW_CORE_GRPC_SSL_ENABLED:false}
gRPCSslKeyPath: ${SW_CORE_GRPC_SSL_KEY_PATH:""}
gRPCSslCertChainPath: ${SW_CORE_GRPC_SSL_CERT_CHAIN_PATH:""}
gRPCSslTrustedCAPath: ${SW_CORE_GRPC_SSL_TRUSTED_CA_PATH:""}
restPort、gRPCPort分别设置http和gRPC协议的端口,建议使用默认值
存储配置
storage:
selector: ${SW_STORAGE:h2}
elasticsearch:
nameSpace: ${SW_NAMESPACE:""}
默认的是H2(不需要任何其他安装部署),还可以支持ES、mysql等,官方比较推荐ES,也可以增加其他存储如TiDB等
webapp配置
webapp配置默认位置webapp/webapp.yml
server:
port: 8080
collector:
path: /graphql
ribbon:
ReadTimeout: 10000
# Point to all backend's restHost:restPort, split by ,
listOfServers: 127.0.0.1:12800
管理后台端口默认为8080,使用graphql方式访问oap的数据收集端口,默认为12800(rest方式)
agent配置
agent配置默认在agent/config/agent.config
# 不同的namespace会导致调用链路追踪中断
agent.namespace=${SW_AGENT_NAMESPACE:hmall}
# 页面上展示的service的名称,也可以通过-Dskywalking.agent.service_name=xxx指定
agent.service_name=${SW_AGENT_NAME:gateway}
# 平台的调用地址,也可以通过-Dskywalking.collector.backend_service=127.0.0.1:80指定
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:172.28.51.141:11800}
# 忽略指定后缀的请求收集
agent.ignore_suffix=${SW_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg}
# 每3秒的采样率,负数代表100%
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}
插件使用
默认情况agent是不支持对spring-cloud-gateway的监控的,需要插件的支持。我们要将agent/optional-plugins下的插件apm-spring-cloud-gateway-2.x-plugin-7.0.0.jar拷贝到plugins下,使agent可以加载到该插件,其他一些需要额外插件支持的中间件和框架也是同理操作。