SpringCloud下skywalking的快速入门

什么是SkyWalking?

SkyWalking 是观察性分析平台和应用性能管理系统(APM, Application Performance Management),由个人开发者 吴晟 于2015年开源,2017年加入Apache孵化器。

它提供分布式跟踪、服务网格遥测分析、度量聚合和可视化的功能,支持Java、.Net、PHP、NodeJs、Golang、LUA语言探针,以及Envoy+Istio构建的Service Mesh,支持OpenTracing规范。

SkyWalking设计原则

  • 保持可监控性

  • 拓扑、指标和跟踪于一体

  • 轻量级

  • 可插拔

  • 便于部署

  • 与其他系统的可交互性

SkyWalking架构

SkyWalking总体的架构示意图如下:

img

SkyWalking 在逻辑上可以分为四个组件:

  • Probes

    收集数据并转换为SkyWalking要求的格式,发送给后台。宏观的看,Probe包含三种形式:

    • 语言级的原生Agent

      这种Agent跟随目标系统一起运行,就像其代码的一部分,例如SkyWalking的Java Agent,用-javaagent 命令行参数去操纵(修改和注入)执行时的代码。其他方式的Agent,使用目标语言库所提供的hook或拦截等机制。

    • Service Mesh probe

      Service Mesh probe从sidecarservice meshserviecontrol panelproxy获取数据。

    • 第三方工具库

      直接接收外部数据,用第三方库所提供的工具,将该数据转化为SKyWalking的格式发送到后端

  • Platform backend

    SkyWalking的后台,又称为OAP(Observability Analysis Platform),将数据进行聚合、分析以及UI的页面流程控制

  • Storage

    SkyWalking的数据持久层,目前已支持像ElasticSearchMySqlTiDBH2等常见的各种持久化库

  • UI

    用于展示数据

另外,SkyWalking也提供了CLI 可以用命令行进行操作和查询。

SpringCloud中SkyWalking的使用

1. 配置数据库

SkyWalking默认启用了H2的数据库,在生产级,更适合的显然是ElasticSearch(当然,H2下我也遇到了入库时报 Agent 生成的traceId 长度超过200的错误)。

方便起见,直接用 ES的Docker 镜像启用ES集群,本文选用7.9.2的镜像文件。

1
2
3
4
5
$sudo docker pull elasticsearch:7.9.2
# 此处为方便后续容器使用ES,为其创建一个网络
$sudo docker network create esnw
# 仅启动一个单节点做演示
$sudo docker run -d --name elasticsearch --net esnw -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.9.2

注:

Docker启动的ES,默认cluster_namedocker-cluster, 如有需要,可以提前改好,后续需指定

2. 配置并启用OAP后台及UI

2.1 下载包

SkyWalking在下载页面 http://skywalking.apache.org/downloads/ 提供了最新版本的整合包,包含了AgentOAPUI 三个组件,但是,在Dockerhub上是将OAPhttps://hub.docker.com/r/apache/skywalking-oap-server) 和UI(https://hub.docker.com/r/apache/skywalking-ui)是拆分开来了的。

注:

由于ES6和7 API的变动,OAP的分别为6和7单独打了一个包,x.y.z-es6是支持ES6的,x.y.z-es7是支持ES7的,由于我们的数据库选用的是ES7,所以要下的是es7最新的包

1
2
$sudo docker pull apache/skywalking-oap-server:8.1.0-es7
$sudo docker pull apache/skywalking-ui:8.1.0
2.2 配置

OAP 的配置集中在 config/application.yml 中,比较重要的配置有如下几个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cluster:
# 配置SkyWalking的集群方式,默认是单节点,支持zk、k8s、consul、etcd和nacos
selector: ${SW_CLUSTER:standalone}
core:
selector: ${SW_CORE:default}
default:
# 对外暴露Http接口的地址以及端口12800
restHost: ${SW_CORE_REST_HOST:0.0.0.0}
restPort: ${SW_CORE_REST_PORT:12800}
# 对外暴露gRPC接口的地址及端口11800
gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}
gRPCPort: ${SW_CORE_GRPC_PORT:11800}
storage:
# 默认的数据库是H2
selector: ${SW_STORAGE:H2}
elasticsearch7:
# 对应ES的cluser_name,即前面提到的docker-cluster
nameSpace: ${SW_NAMESPACE:"docker-cluster"}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}

此处,我们只需要将SW_STORAGE的默认值从H2 改为elasticsearch7 即可,如果之前改过ES的cluster_name,此处要将SW_NAMESPACE的默认值做对应修改。

Docker的配置,也可直接通过在启动时指定变量值进行改动。

2.3 启动

如果是整合包,则解压后,直接进入bin目录用startup脚本即可同时启动OAPUI服务。

Docker启动:

1
2
3
4
# 启动OAP
$sudo docker run --name oap --network esnw --restart always -d -p 11800:11800 -p12800:12800 -e SW_STORAGE=elasticsearch7 -e
# 启动UI
$docker run --name oap-ui --network esnw --restart always -d -p 8080:8080 -e SW_OAP_ADDRESS=oap:12800 apache/skywalking-ui:8.1.0

注:

SkyWalking的UI有个坑,不支持反向代理,具体可参见 github issue #2675

3. 配置并启用Agent

SkyWalking对于Java项目十分友好,默认提供的Agent就是Java的,使用JavaAgent进行字节码注入实现拦截。SkyWalking是遵循OpenTracing 规范的,下图是OpenTracing 中定义的数据结构。

img

其中,

  • SpanContext:负责上线文信息保持和传递
  • Trace: 一次调用的完整记录
    • Span: 一次调用中的某个节点/步骤,类似于一层堆栈信息,Trace是由多个Span组成,Span本身也是可以嵌套自身的数据结构
      • Tag: 节点/步骤中的关键信息
      • Log: 节点/步骤中的日志,例如抛出的异常栈
    • Baggage: 主要用于运行时跨Span或跨实例的上下文传递
3.1 配置

从前面下载页下载的整合包里,把整个 agent 目录拷到项目文件里,或者单独放在某个位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
activations
bootstrap-plugins
# 配置文件存放目录
config
# agent运行时生成的日志保存在此目录
logs
# 可选用的插件,默认不启用
optional-plugins
# 可选用的reporter插件,默认不启用
optional-reporter-plugins
# 默认启用的插件放于此目录
plugins
# 拦截探针实现
skywalking-agent.jar

暂时没有需要修改的配置,就不去更改配置文件了。

optional-plugins 里的插件默认是不启用的,如果要启用,需要将其移动到plugins目录。

optional-plugins里,有几个可选插件是值得我们注意的:

  • apm-spring-annotation-plugin-8.1.0.jar

    该插件可追踪Spring上下文中被@Bean , @Service@Component@Repository 注解的方法,该插件一旦启用,会产生大量的span,从而消耗更多的资源,所以默认是把它放到了可选插件中。

  • apm-spring-cloud-gateway-2.1.x-plugin-8.1.0.jar

    该插件将从SpringCloudGateway产生的span与后续相同链路的span合并到一起进行追踪,如果没有这个插件,一个REST请求,如/api/hello,经过SC Gateway到达服务a时,将会在UI上展示两个跟踪记录而非一条(服务a也必须启用skywalking agent)。该插件依赖spring-webflux-5.x-plugin。但该插件应该只对Spring Cloud Gateway启用。

  • apm-trace-ignore-plugin-8.1.0.jar

    该插件可以自定义过滤掉一些路径,不被追踪。使用时,需要把/agent/optional-plugins/apm-trace-ignore-plugin/apm-trace-ignore-plugin.config 拷贝到/agent/config目录,然后修改其内容增加想要过滤掉的路径,例如:

    1
    trace.ignore_path=/your/path/1/**,/your/path/2/**
  • apm-customize-enhance-plugin-8.1.0.jar

    该插件可以通过指定增强文件来实现方法级的精细拦截及span生成的定义,而不用写代码。具体参见:这里

为方便测试,我们将apm-spring-annotation-plugin-8.1.0.jar和apm-spring-cloud-gateway-2.1.x-plugin-8.1.0.jar 拷入 plugins 目录启用。

3.2 启动

在启动SC项目文件时,增加JVM参数:

1
-javaagent:<absolute_path>\agent\skywalking-agent.jar -Dskywalking.agent.service_name=<service_name> -Dskywalking.collector.backend_service=<oap_address>:11800

其中,Java Agent 默认采用的gRPC调用,所以端口默认为11800。

启动时,Agent会根据jar包所在位置自动寻找config目录下的agent.config文件读取配置。

至此,SkyWalking的初步整合已经完毕,可以向SpringCloud Gateway发送一个请求到具体的微服务,等待几秒后,可在UI拓扑图页面中看到整个微服务的拓扑,在追踪页面中看到查找到刚才所发请求的整个链路调用过程以及所消耗的时间以及具体的log等。

本文由 EdisonXu - 徐焱飞 创作,采用 CC BY 4.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。
本文链接为http://edisonxu.com/2020/10/13/skywalking-intro.html
如果您觉得文章不错,可以请我喝一杯咖啡!
分布式, 链路跟踪