全链路监控利器skywalking

开发与运维

0.前言

微服务架构,给服务带来很多优秀特性的同时,也给服务的维护带来了挑战。过去单体架构的服务,服务请求慢等异常问题的排查相对简单,但是微服务架构下服务的治理难度就会加大很多,特别是微服务数量众多的情况下,当服务响应变慢,要想知道哪一段请求慢有时候是非常棘手的问题,这个时候就需要用到全链路监控了。目前比较受欢迎的全链路监控方案有:

  • opentelemetry+jaeger;
  • skywalking; 今天我们就来部署并测试下skywalking的基础功能,看下到底好不好用。

1.SkyWalking简介

1.1 介绍

SkyWalking开源项目由吴晟2015年创建,同年10月在GitHub上作为个人项目开源。SkyWalking项目的核心目标,是针对微服务、Cloud Native、容器化架构,提供应用性能监控和分布式调用链追踪能力。 目前已加入Apache孵化器。目前支持链路追踪和监控应用组件如下,基本涵盖主流框架和容器,如国产PRC Dubbo和motan等,国际化的spring boot,spring cloud。

1.2 主要功能

  • 分布式追踪和上下文传输
  • 应用、实例、服务性能指标分析
  • 根源分析
  • 应用拓扑分析
  • 应用和服务依赖分析
  • 慢服务检测
  • 性能优化

1.3 优势

  • 国内开源项目,社区成熟,且可与作者直接沟通
  • 支持语言更多:Java、.NET Core、PHP、Node.JS、Golang
  • 支持java自动探针,代码无侵入,只要简单配置,就可以自动实现各种指标、调用链的埋点
  • 众多存储选择:Banyandb、ElasticSearch、MySql、TiDB、Sharding Sphere
  • 扩展性:支持模块、插件的可拔插
  • 支持java语言的几十种插件,例如:Tomcat、RabbitMq、Kafka,且易于二次开发

1.4 架构图

picture.image

2.资源准备

本次测试需要部署skywalking,banyandb,skywalking-go-agent,测试程序(golang编写),只需要一台服务器即可,服务器配置如下:

操作系统ip地址CPU内存磁盘空间
rocky8 linux10.173.100.464核8G200G磁盘

操作系统和服务器配置可以根据需要自行选择,服务器上还需要准备好go和java环境,保证skywalking和我们用于测试的go程序可以正常运行。

3.skywalking部署

3.1 安装包准备

本次部署的skywalking服务、agent和banyandb均为当前最新版本:
(1)skywalking

picture.image

(2)banyandb

image.png

(3)skywalking-go-agent

image.png

准备好安装包之后,可以将其上传到服务器指定目录,我这里是/root/install目录:

ls /root/install
-rw-r--r--. 1 root root 155705870 Aug 25 17:02 apache-skywalking-apm-10.2.0.tar.gz
-rw-r--r--. 1 root root  59612480 Aug 25 17:27 apache-skywalking-go-0.6.0-bin.tgz
-rw-r--r--. 1 root root 141379837 Aug 25 17:00 skywalking-banyandb-0.8.0-banyand.tgz

3.2 安装banyandb

因为我们下载的是已经编译好的安装包,所以只需要将程序解压到指定目录即可,命令如下:

mkdir -p /usr/local/banyandb
cd /root/install
tar xf skywalking-banyandb-0.8.0-banyand.tgz -C /usr/local/banyandb
mv /usr/local/banyandb/bin/banyand-server-static-linux-amd64 /usr/local/banyandb/bin/banyand

部署完成之后,就可以启动banyanddb了,命令如下:

cd /usr/local/banyandb/bin && ./banyand standalone

启动后输出如下信息:

{"level":"info","time":"2025-08-26T14:01:34+08:00","message":"maxprocs: Leaving GOMAXPROCS=8: CPU quota undefined"}
{"level":"debug","module":"STANDALONE","name":"metadata","registered":1,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"metric-service","registered":2,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"memory-protector","registered":3,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"property","registered":4,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"measure","registered":5,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"stream","registered":6,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"query","registered":7,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"grpc","registered":8,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"liaison-http","registered":9,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"pprof-service","registered":10,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"DATA","name":"metadata","registered":1,"total":9,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
....................

banyandb使用的端口是17912,查看下该端口是否正常监听,命令如下:

ss -ntlp |grep 17912
LISTEN 0      2048               *:17912            *:*    users:(("banyand",pid=25221,fd=163))

可以看到banyandb已经正常运行了。

3.3 安装skywalking

skywalking的安装也很简单,同样是将安装包解压到指定目录,然后启动服务即可,安装命令如下:

cd /root/install
tar xf apache-skywalking-apm-10.2.0.tar.gz
mv apache-skywalking-apm-bin /usr/local/skywalking

启动命令如下:

cd /usr/local/skywalking/bin
./startup.sh

该命令会同时启动oapService(后端服务,端口号:11800)和webappService(前端服务,端口号8080)
查看服务运行情况:

ss -ntlp |grep -E '11800|8080'
LISTEN 0      2048               *:8080             *:*    users:(("java",pid=12648,fd=63))
LISTEN 0      2048               *:11800            *:*    users:(("java",pid=12647,fd=2787))

可以看到skywalking的前后端服务均正常运行,我们访问下skywalking的前端页面,揭开他的庐山真面目,访问地址为:http://10.173.100.46:8080,可以看到如下界面:

picture.image

3.4 安装go-agent

go-agent主要是用来编译go程序的,只需要安装即可,命令如下:

cd /root/install/
tar xf apache-skywalking-go-0.6.0-bin.tgz
mv apache-skywalking-go-0.6.0-bin /usr/local/skywalking-go
mv /usr/local/skywalking-go/bin/skywalking-go-agent-0.6.0-linux-amd64 /usr/local/skywalking-go/bin/go-agent 

4.链路监控测试

skywalking是支持go语言gin框架的,我们这里就编写一个基于gin框架的web服务,通过go-agent编译运行,再看下skywalking上服务的链路情况。
代码如下:

package main

import (
    "github.com/gin-gonic/gin"
    "time"
    _ "github.com/apache/skywalking-go"
)

func main() {
    r := gin.Default()

    view := r.Group("/users")
    {
            view.GET("", func(c *gin.Context) {
                    time.Sleep(100 * time.Millisecond)
                    c.JSON(200, gin.H{
                            "data": "get users",
                    })
            })

            view.POST("", func(c *gin.Context) {
                    time.Sleep(30 * time.Millisecond)
                    c.JSON(200, gin.H{
                         "data": "create user",                                           })
            })

            view.PUT("", func(c *gin.Context) {
                    time.Sleep(20 * time.Millisecond)
                    c.JSON(200, gin.H{
                            "data": "update user",
                    })
            })

            view.DELETE("", func(c *gin.Context) {
                    time.Sleep(10 * time.Millisecond)
                    c.JSON(200, gin.H{
                            "data": "delete user",
                    })
            })
    }

    r.Run(":9096")
}

可以看到包括GET,POST,PUT和DELETE四种请求,并且为了避免响应太快,还设置了休眠时间。
通过go-agent编译程序,命令如下:

go build -toolexec="/usr/local/skywalking-go/bin/go-agent -config=/usr/local/skywalking-go/config/config.yaml" -a -o test .

(注意:安装包里面并没有agent的配置文件,需要自行添加,配置文件模板地址:https://github.com/apache/skywalking-go/blob/654a5930e77dcbcfb37800e134b0b8651a1e1c61/tools/go-agent/config/agent.default.yaml) 编译完成之后,会生成一个可运行的test文件,之后运行test,命令如下:

./test
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /users                    --> main.main.func1 (3 handlers)
[GIN-debug] POST   /users                    --> main.main.func2 (3 handlers)
[GIN-debug] PUT    /users                    --> main.main.func3 (3 handlers)
[GIN-debug] DELETE /users                    --> main.main.func4 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :9096

可以看到监听端口为9096,我们再发送四个请求到web服务,命令如下:

curl -X GET 10.173.100.46:9096/users
curl -X POST 10.173.100.46:9096/users
curl -X PUT 10.173.100.46:9096/users
curl -X DELETE 10.173.100.46:9096/users

web服务响应如下:

[GIN] 2025/08/26 - 14:11:10 | 200 |   100.45117ms |   10.173.100.46 | GET      "/users"
[GIN] 2025/08/26 - 14:12:00 | 200 |   30.280279ms |   10.173.100.46 | POST     "/users"
[GIN] 2025/08/26 - 14:12:05 | 200 |   20.191316ms |   10.173.100.46 | PUT      "/users"
[GIN] 2025/08/26 - 14:12:11 | 200 |   10.209714ms |   10.173.100.46 | DELETE   "/users"

因为设置了睡眠时间,所以每个请求的响应时间是不一样的。
现在我们再到skywalking上去看下链路监控情况如何,如下图所示: picture.image 可以看到请求的成功率和时延等信息,说明skywalking成功采集到了web接收到的请求时延指标。

5.总结

整个部署和指标采集的过程还是比较简单的,当然skywalking的功能还远不止我们展示的这样,想了解更多详情的,可以查看官方给出的文档,当然skywalking主要是针对微服务的,在微服务时延采集上效果更加明显,大家有兴趣也可以尝试下。

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
CloudWeGo白皮书:字节跳动云原生微服务架构原理与开源实践
本书总结了字节跳动自2018年以来的微服务架构演进之路
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论