前言
APM(Application Performance Management,应用性能管理)是一套用于监控和管理软件应用程序性能的工具和方法论。微服务盛行之后,这其中链路追踪更是微服务中最必不可少且有别于传统服务架构方案的一个指标。一个微服务集群中的服务少则10几个,多则上百个,如果每个服务为了高可用设置多个实例之后,这个数量就更恐怖了。 链路追踪方面,其实有不少优秀的框架,比如OpenZipkin、Jaeger: open source, distributed tracing platform (jaegertracing.io),以及本次要说的Apache SkyWalking。
SkyWalking简介
在你看过官方文档之后就会知道SkyWalking在架构方面的野心决定不止是一个简单的链路追踪。
rust
Application performance monitor tool for distributed systems, especially designed for microservices, cloud native and container-based (Kubernetes) architectures.
官方的目标是要打造一个云原生的APM平台,包含了监控、日志管理、事物追踪、报警和通知等等APM的常见功能。 我个人比较推荐SkyWalking一方面因为平台确实很全面,接入方案的技术栈覆盖的也比较广;另一方面是因为主创是国人且B站上有不少的视频资料。但是文档真的是稀碎啊,这个好像国人开源项目的通病(简单吐槽下,别上纲上线。当然也有好的,但是感觉多数都是前端项目)。
SkyWalking的部署
这段时间新公司之前一直散养了一堆微服务,那部署情况只能说是乱得让人眼花缭乱。经过技术债评估之后决定要对微服务治理这项技术债下刀了。之所以选了SkyWalking也是看中了全面性和扩展性。
这里不得不说一句哈,skwapm的10.x版本还不是太稳定,我们遇到了各种查询异常,比如endpoint查询提示过长。推荐大家如果没啥特别的需求,主机够用的情况下先别用banyangdb+skw 10。老老实实的用老版本+ES存储
一、确定SkyWalking的整体部署架构
SW在整体架构上其实还是比较干净的,也符合认知知觉。这里说一下我在这基层上的选择。
- 传输层:传输层我选择的是服务接入Agent,直接对接传输到skywalking-oap-server。主要是因为公司的服务都是直接裸机部署,中间没有任何容器化管理环境。自然也不用考虑边车和卫星。如果有K8S等环境的可以试试。
- 接收集群:这个我没看到有啥特殊的,直接用skywalking-oap-server即可。这里有个问题但是我还没深入去搭建集群,从B站上作者的介绍可知,好像在搭建集群的时候要注意分布式的一致性问题,这个等我搞了集群部署在来更新,先埋个坑。
- 聚合存储和输出:这个是大家需要重点选择的。对于告警和Exporter我不多说了,方案看文档即可,存储设施是个坑。存储设施在10.x.x版本的时候我看很多人都推荐SW团队开发banyandb,面相监控指标的存储设施,原配且最适合。但是我实际用下来,它目前真不太适合产。主要问题的是UI太多问题了,高可用部署文档一团糟,容器部署时数据持久化方案都没说,如果你只是本地体验一下做部署可以选择。我这里依然选择了ElasticSearch作为持久化设施。
二、部署SkyWalking
- 创建docker-compose.yaml 安装的时候官方提供过了一个Starter的Demo,可以快速用,下面这个部署的yaml就是基于官方Demo做了一些改造。 正式环境可以选用es作为数据存储,使用ES需要替换oap-es中的
SW_STORAGE_ES_CLUSTER_NODES
说说我改动的点:- BanyanDB的数据存储:
目前只看明白了standalone模式的时候数据怎么存储的,集群模式完全没看懂,别说我描述的夸张,Cluster Installation | Apache SkyWalking这个是BanyanDB的集群模式的安装文档,连单机模式的存储都是翻了官方镜像的Dockerfile才发现的。
- BanyanDB的数据存储:
这篇文章准备发布的时候BanyangDB的文档已经有更新了,可视化的管理界面啥的也都有了,有时间看一下再给大家更新内容,20241104
markdown
2. skywalking-oap-server的主要配置项:这里的其他配置可以根据需要在[Configuration Vocabulary | Apache SkyWalking](https://skywalking.apache.org/docs/main/next/en/setup/backend/configuration-vocabulary/)中查找。说到这不得吐槽下,官方的文档完全是按照本地安装准备的,如果想用容器运行还是需要点基础和跳跃的思路。[How to use the Docker images | Apache SkyWalking](https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-docker/)这个是容器启动,看看吧,你会懂我的第一次接触的痛。
yaml
version: '3.8'
services:
banyandb:
profiles:
- "bydb"
image: localhub.aihelp.net/dockerhub/apache/skywalking-banyandb:0.6.1
container_name: banyandb
restart: always
networks:
- skywalking
expose:
- 17912
ports:
- 17913:17913
command: standalone --stream-root-path /tmp/stream-data --measure-root-path /tmp/measure-data
healthcheck:
test: [ "CMD", "sh", "-c", "nc -nz 127.0.0.1 17912" ]
interval: 5s
timeout: 60s
retries: 120
volumes:
- /root/randy/data/skw/bdb:/tmp
oap-base: &oap-base
container_name: oap
profiles: [ "none" ]
image: localhub.aihelp.net/dockerhub/apache/skywalking-oap-server:10.0.1
restart: always
ports:
- "11800:11800"
- "12800:12800"
networks:
- skywalking
healthcheck:
test: [ "CMD-SHELL", "curl http://localhost:12800/internal/l7check" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
environment: &oap-env
SW_TELEMETRY: prometheus
JAVA_OPTS: "-Xms2048m -Xmx2048m"
SW_CORE_RECORD_DATA_TTL: 7 #记录数据的有效期,单位天
SW_CORE_METRICS_DATA_TTL: 7 #分析指标数据的有效期,单位天
SW_ENABLE_UPDATE_UI_TEMPLATE: "true" # 开启dashboard编辑修改功能
TZ: Asia/Shanghai
volumes:
- /root/randy/data/skw/server/config:/skywalking/config
oap-es:
<<: *oap-base
profiles:
- "es"
environment:
<<: *oap-env
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: 10.0.20.75:9200
oap-bdb:
<<: *oap-base
profiles:
- "bydb"
depends_on:
banyandb:
condition: service_healthy
environment:
<<: *oap-env
SW_STORAGE: banyandb
SW_STORAGE_BANYANDB_TARGETS: banyandb:17912
ui:
image: localhub.aihelp.net/dockerhub/apache/skywalking-ui:10.0.1
container_name: ui
restart: always
ports:
- "8080:8080"
depends_on:
- oap-bdb
networks:
- skywalking
environment:
SW_OAP_ADDRESS: http://oap:12800
SW_ZIPKIN_ADDRESS: http://oap:9412
TZ: Asia/Shanghai
networks:
skywalking:
三、几个要注意的配置
配置文件
SW的配置文件都存储在容器的/skywalking/config
目录中,文档中很多配置都是告诉你独立运行的时候应该怎么改动,但是容器情况下想改动并持久化配置是做不到,这里给大家提供个简单点的思路。
-
先启动,保证
skywalking-oap-server
容器正确运行 -
直接使用
docker cp
将/skywalking/config
-
正式环境执行命令:
- 使用banyandb作为存储:
docker compose -f docker-compose-v10.yml --profile bydb up -d
docker compose -f docker-compose.yml --profile bydb up -d
- 使用ES作为存储:
docker compose -f docker-compose-v10.yml --profile es up -d
docker compose -f docker-compose.yml --profile es up -d
- 使用banyandb作为存储:
shell
docker run --name oap-single --restart always -d -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 apache/skywalking-oap-server:9.0.0
- UI的java参数
ini
-Xms256M -Xmx512M -Dcom.linecorp.armeria.defaultWriteTimeoutMillis=300000 -Dcom.linecorp.armeria.defaultResponseTimeoutMillis=120000 -Dcom.linecorp.armeria.defaultRequestTimeoutMillis=120000 -Dcom.linecorp.armeria.defaultServerIdleTimeoutMillis=120000 -Dcom.linecorp.armeria.defaultConnectTimeoutMillis=120000 -Dcom.linecorp.armeria.defaultHttp2MaxFrameSize=16384000 -Dcom.linecorp.armeria.defaultHttp2MaxHeaderListSize=8192000 -Dcom.linecorp.armeria.defaultHttp1MaxInitialLineLength=4096000 -Dcom.linecorp.armeria.defaultHttp1MaxHeaderSize=8192000 -Dcom.linecorp.armeria.defaultHttp1MaxChunkSize=8192000 -Dcom.linecorp.armeria.defaultMaxTotalAttempts=10000 -Dcom.linecorp.armeria.routeCacheSpec=maximumSize=4096 -Dcom.linecorp.armeria.routeDecoratorCacheSpec=maximumSize=4096 -Dcom.linecorp.armeria.parsedPathCacheSpec=maximumSize=4096 -Dcom.linecorp.armeria.headerValueCacheSpec=maximumSize=4096 -Dcom.linecorp.armeria.fileServiceCacheSpec=maximumSize=1024 -Dcom.linecorp.armeria.dnsCacheSpec=maximumSize=4096 -Dcom.linecorp.armeria.defaultMaxRequestLength=104857600 -Dcom.linecorp.armeria.defaultMaxResponseLength=104857600 -Dcom.linecorp.armeria.defaultHttp2InitialConnectionWindowSize=104857600 -Dcom.linecorp.armeria.defaultHttp2InitialStreamWindowSize=104857600
二、程序的改造
这部分我并没有把Spring的接入列进来,一个是文档比较好找,官方和个人的都很全面,我不嫌丑了,无侵入的接入、完备的配置项文档,你可以信赖。主要说说我趟过的dotnet和golang两个坑。
SKW除了Java的文档之外真的是简略到你怀疑人生,配置项有哪些?配置项名是什么?云配置怎么处理?等等,只要你想工程化的融合到自己公司的生态中你就会遇到各种问题。
这里的接入我并没把官方文档中最简单的接入的文档放进来,因为我觉得没有哪个公司会全默认的接入。
2.1 Dotnet接入
2.1.1 Dotnet程序改造
- 接入:SkyAPM/SkyAPM-dotnet
- 添加依赖
dotnet add package SkyAPM.Agent.AspNetCore
IHostBuilder
中启用APMUseSkyAPM()
- 可选步骤:启用插件
AddSkyApmExtensions().ADD
...
- 添加依赖
- 生成配置文件:生成配置文件有两种方式,一种用工具先行生成生成,自行修改skyapm.json,然后根据环境配置;另一种是Build的时候根据环境生成skyapm.json。 这个是2.2.0的命令,2.3.0还未发布 dotnet tool install -g SkyAPM.DotNet.CLI dotnet skyapm config sample_app 192.168.0.1:11800
- 环境变量:(现有服务修改supervisor配置)
- ASPNETCORE_HOSTINGSTARTUPASSEMBLIES:外挂程序集,增加
SkyAPM.Agent.AspNetCore
- SKYWALKING__SERVICENAME:服务名,属于同一个域下的节点用同一个服务名
- ASPNETCORE_HOSTINGSTARTUPASSEMBLIES:外挂程序集,增加
2.2 GO程序改造
- 接入:GoAgent
- 添加Agent依赖:
go get github.com/apache/skywalking-go
- 接入工程:接入工程有手工和自动两种方式
- 手工:在
main.go
中引入import _ "github.com/apache/skywalking-go"
- 自动:再gomod的目录下直接执行
shell agent -inject /path/to/your/project [-all]
- 手工:在
- 添加Agent依赖:
- 本地Debug:
-toolexec '/path/to/skywalking-go-agent -debug /path/to/current-project-path' -a
. - 环境变量:
- SW_AGENT_NAME=aihelp_server_sdk
- SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE=10.0.20.62:11800
- SW_AGENT_SAMPLE=0.5