SkyWalking 初探
1.概览
1.1.概念
SkyWalking 是什么?
FROM http://skywalking.apache.org/
分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
1.2.功能列表
- 多种监控手段。可以通过语言探针和 service mesh 获得监控是数据。
- 多个语言自动探针。包括 Java,.NET Core 和 Node.JS。
- 轻量高效。无需大数据平台,和大量的服务器资源。
- 模块化。UI、存储、集群管理都有多种机制可选。
- 支持告警。
- 优秀的可视化解决方案。
1.3.整体架构
整个架构,分成上、下、左、右四部分:
考虑到让描述更简单,我们舍弃掉 Metric 指标相关,而着重在 Tracing 链路相关功能。
- 上部分 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 :负责提供控台,查看链路等等。
1.4.官方文档
在 https://skywalking.apache.org/docs/main/latest/readme/ 地址下,提供了 SkyWalking 的英文文档。
比较推荐先阅读 https://github.com/SkyAPM/document-cn-translation-of-skywalking 地址,提供了 SkyWalking 的中文文档。
考虑到使用 SkyWalking 的目的,是实现分布式链路追踪的功能,所以最好去了解下相关的知识。这里推荐阅读两篇文章:
Google 论文 《Dapper,大规模分布式系统的跟踪系统》
2.搭建 SkyWalking 单机环境
2.1.官方包安装
我们来搭建一个 SkyWalking 单机环境,步骤如下:
- 第一步,搭建一个 Elasticsearch 服务
- 第二步,下载 SkyWalking 软件包
- 第三步,搭建一个 SkyWalking OAP 服务
- 第四步,启动一个 Spring Boot 应用,并配置 SkyWalking Agent 探针
- 第五步,搭建一个 SkyWalking UI 服务
ps:推荐使用 Elasticsearch 存储数据,因为 SkyWalking 开发团队所在公司,生产环境都是使用它。
2.1.1.搭建 Elasticsearch
FROM https://www.elastic.co/cn/products/elasticsearch
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
本文是使用宝塔面板docker服务,搭建一个 Elasticsearch 单机服务。
本文使用的 Elasticsearch 版本是 8.15.0 。
2.1.2.下载 SkyWalking 发布版
在 http://skywalking.apache.org/downloads/ 下,我们下载 SkyWalking 发布版。
2.1.2.1.下载 SkyWalking OAP
1 | 创建目录 |
2.1.2.2.下载 SkyWalking Java Agent
1 | 创建目录 |
关于 SkyWalking Agent 提供的插件列表,可以看看《SkyWalking 文档 —— 插件支持列表》
2.1.3.搭建 SkyWalking OAP Server
- 修改 OAP 配置文件 apache-skywalking-apm-bin/config/application.yml
- 通过 storage.selector 配置项来设置具体使用的存储器。
- 启动 SkyWalking OAP 服务
1 | bin/oapService.sh |
是否真正启动成功,打开 logs/skywalking-oap-server.log 日志文件,查看是否有错误日志。 首次启动时,因为 SkyWalking OAP 会创建 Elasticsearch 的索引,所以会“疯狂”的打印日志。
ps:因为首次启动会创建 Elasticsearch 索引,所以可能会比较慢。
2.1.4.SkyWalking UI 搭建
- 启动 SkyWalking UI 服务
1 | bin/webappService.sh |
【可选】如果想要修改 SkyWalking UI 服务的参数,可以编辑 webapp/webapp.yml 配置文件。例如说:
- server.port :SkyWalking UI 服务端口。
- spring.cloud.discovery.client.simple.instances.oap-service :SkyWalking OAP 服务地址数组。因为 SkyWalking UI 界面的数据,是通过请求 SkyWalking OAP 服务来获得的。
- 访问 UI 界面:
浏览器打开 http://127.0.0.1:8080 地址,界面如下图:
2.1.5.SkyWalking Java Agent【Shell】
在启动项目的 Shell 脚本上,可以通过 -javaagent 参数进行配置 SkyWalking Java Agent。
2.1.5.1.上传 Agent 软件包
我们需要将skywalking-agent
目录,拷贝到 Java 应用所在的服务器上。这样,Java 应用才可以配置使用该 SkyWalking Agent。
本文SkyWalking Agent 目录是 /opt/skywalking/skywalking-agent。
考虑到方便,这里提供了一个最简的 Spring Boot 应用tutorial-trace-01-jardemo-2.2.1.RELEASE.jar。对应 Github 仓库是 tutorial-trace-01-jardemo。
2.1.5.2.配置 Java 启动脚本
1 | SkyWalking Agent 配置 |
- 通过环境变量,进行配置。
- 更多的变量,可以在 /opt/skywalking/skywalking-agent/config/agent.config 查看。要注意,可能有些变量是被注释掉的,例如说
SW_AGENT_SPAN_LIMIT
对应的agent.span_limit_per_segment
。
2.1.5.3.启动 Spring Boot 项目
执行上述脚本,启动项目。
日志查看路径:/opt/skywalking/skywalking-agent/logs/skywalking-api.log
2.1.5.4.简单测试
启动完成后,可以去 SkyWalking UI 查看是否链路收集成功。
- 访问下 http://127.0.0.1:44079/demo/echo 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
- 打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。
这里,我们可以看到 Spring Boot 应用的服务为’tutorial-demo-application’,就是我们在环境变量’SW_AGENT_NAME’中所定义的。
服务(Service):表示对请求提供相同行为的一系列或一组工作负载。在使用 Agent 或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用你在平台(例如说 Istio)上定义的名字。
- 点击
tutorial-demo-application
这个服务名,可以看到该服务的【整体监控信息】。
- 点击 [Instance] 选项卡,可以查到该服务的【实例列表】。
服务实例(Service Instance):上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个进程。但当你在使用 Agent 的时候, 一个服务实例实际就是操作系统上的一个真实进程。
- 点击 [Endpoint] 选项卡,可以查看到该服务的【端点列表】。
端点(Endpoint) :对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。 这里,我们可以看到 Spring Boot 应用的一个端点,为 API 接口 /demo/echo。
- 点击 [Topology] 选项卡,可以查看到该服务的【拓扑图】。
- 点击 [Trace] 选项卡,可以查看到该服务的【链路】。
- 点击 [Log] 选项卡,可以查看到该服务的【日志】。
SkyWalking 的日志使用,可见 《SkyWalking Java agent’s toolkits》 文档。
2.1.6.SkyWalking Java Agent【IDEA】
2.2.Docker Compose安装
FROM 《How to use the Docker images》
Start the storage, OAP and Booster UI with docker-compose
As a quick start, you can use our one-liner script to start ElasticSearch or BanyanDB as the storage, OAP server and Booster UI, please make sure you have installed Docker. The versions of the OAP and BanyanDB images are the latest release versions.
- Linux, macOS, Windows (WSL)
1 | bash <(curl -sSL https://skywalking.apache.org/quickstart-docker.sh) |
- Windows (Powershell)
1 | Invoke-Expression ([System.Text.Encoding]::UTF8.GetString((Invoke-WebRequest -Uri https://skywalking.apache.org/quickstart-docker.ps1 -UseBasicParsing).Content)) |
我们来看下https://skywalking.apache.org/quickstart-docker.sh脚本的内容,会发现核心的docker-compose.yml
文件地址为:https://github.com/apache/skywalking/raw/master/docker/docker-compose.yml,由于我们已经搭建了es,故最终docker-compose.yml
文件改造如下:
1 | version: "3.8" |
3.搭建 SkyWalking 集群环境
在生产环境下,我们一般推荐搭建 SkyWalking 集群环境。 当然,如果公司比较抠门,也可以在生产环境下使用 SkyWalking 单机环境,毕竟 SkyWalking 挂了之后,不影响业务的正常运行。
搭建一个 SkyWalking 集群环境,步骤如下:
- 第一步,搭建一个 Elasticsearch 服务的集群
- 第二步,搭建一个注册中心的集群。目前 SkyWalking 支持 Zookeeper、Kubernetes、Consul、Nacos 作为注册中心。
- 第三步,搭建一个 SkyWalking OAP 服务的集群,同时参考 《SkyWalking 文档 —— 集群管理》 ,将 SkyWalking OAP 服务注册到注册中心上
- 第四步,启动一个 Spring Boot 应用,并配置 SkyWalking Agent。另外,在设置 SkyWaling Agent 的 SW_AGENT_COLLECTOR_BACKEND_SERVICES 地址时,需要设置多个 SkyWalking OAP 服务的地址数组
- 第五步,搭建一个 SkyWalking UI 服务的集群,同时使用 Nginx 进行负载均衡。另外,在设置 SkyWalking UI 的
spring.cloud.discovery.client.simple.instances.oap-service
地址时,也需要设置多个 SkyWalking OAP 服务的地址数组
4.Spring Boot 使用示例
待续
6.Spring Cloud 使用示例
待续
99.常见问题
99.1.SpringCloud Gateway没有数据
查看插件是否存在
1 | ls /opt/skywalking/skywalking-agent/optional-plugins |grep apm-spring-webflux |
确认你所使用的插件具体版本,比如:
将对应插件放入plugins目录下
1 | cp /opt/skywalking/skywalking-agent/optional-plugins/apm-spring-cloud-gateway-4.x-plugin-9.5.0.jar /opt/skywalking/skywalking-agent/plugins/ |