文章目录
Apache SkyWalking 分布式追踪与监控的快速入门
SkyWalking的功能十分强大,篇幅有限,所以本篇文章只是对SkyWalking进行简单的介绍和演示,所以你可以把它当做一篇简单的入门教程。
APM系统概述
- APM (Application Performance Management) 即应用性能管理系统,是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。应用性能管理,主要指对企业的关键业务应用进行监测、优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低IT总拥有成本。
- APM系统是可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。
主流的开源APM产品
目前主要的一些 APM(Application Performance Monitor) 工具有: Cat、Zipkin、Pinpoint、SkyWalking。
这里主要介绍 SkyWalking ,它是一款优秀的国产 APM 工具,由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin/Pinpoint/CAT的设计思路,支持非侵入式埋点。是一款基于分布式跟踪的应用程序性能监控系统。包括了分布式追踪、性能指标分析、应用和服务依赖分析等。
Skywalking概述
根据官方的解释,Skywalking是一个可观测性分析平台(Observability Analysis Platform简称OAP)和应用性能管理系统(Application Performance Management简称APM)。
提供分布式链路追踪、服务网格(Service Mesh)遥测分析、度量(Metric)聚合和可视化一体化解决方案。
下面是Skywalking的几大特点:
- 多语言自动探针,Java,.Net Core,PHP,NodeJS,Golang,LUA,C ++。
- 多种监控手段,语言探针和service mesh。
- 轻量高效。不需要额外搭建大数据平台。
- 模块化架构。UI、存储、集群管理多种机制可选。
- 支持告警。
- 优秀的可视化效果。
Skywalking整体架构如下:
Skywalking提供Tracing和Metrics数据的获取和聚合。
- Metric的特点是,它是可累加的:他们具有原子性,每个都是一个逻辑计量单元,或者一个时间
段内的柱状图。 例如:队列的当前深度可以被定义为一个计量单元,在写入或读取时被更新统
计; 输入HTTP请求的数量可以被定义为一个计数器,用于简单累加; 请求的执行时间可以被定
义为一个柱状图,在指定时间片上更新和统计汇总。- Tracing的最大特点就是,它在单次请求的范围内,处理信息。 任何的数据、元数据信息都被绑定
到系统中的单个事务上。 例如:一次调用远程服务的RPC执行过程;一次实际的SQL查询语句;
一次HTTP请求的业务性ID。总结,Metric主要用来进行数据的统计,比如HTTP请求数的计算。Tracing主要包含了某一次请
求的链路数据。
详细的内容可以查看Skywalking开发者吴晟翻译的文章,Metrics, tracing 和 logging 的关系 :
http://blog.oneapm.com/apm-tech/811.html
整体架构包含如下三个组成部分:
- 探针(agent)负责进行数据的收集,包含了Tracing和Metrics的数据,agent会被安装到服务所在的
服务器上,以方便数据的获取。- 可观测性分析平台OAP(Observability Analysis Platform),接收探针发送的数据,并在内存中使
用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如
Elasticsearch、MySQL数据库、H2数据库等。同时OAP还使用查询引擎(Query Core)提供HTTP查
询接口。- Skywalking提供单独的UI进行数据的查看,此时UI会调用OAP提供的接口,获取对应的数据然后
进行展示
Skywalking优势
Skywalking相比较其他的分布式链路监控工具,具有以下特点:
- 开发者是国人,比较有亲切感哈哈。社区相当活跃。目前已经完成 Apache 孵化,成为 Apache 顶级项目。目前版本好像已经到8.4.0了。
- Skywalking支持Java,.NET Core和Node.JS语言。相对于其他平台:比如Pinpoint支持Java和
PHP,具有较大的优势。 - 探针无倾入性。对比CAT具有倾入性的探针,优势较大。不修改原有项目一行代码就可以进行集
成。 - 探针性能优秀。有网友对Pinpoint和Skywalking进行过测试,由于Pinpoint收集的数据过多,所以
对性能损耗较大,而Skywalking探针性能十分出色。 - 支持组件较多。特别是对Rpc框架的支持,这是其他框架所不具备的。Skywalking对Dubbo、
gRpc等有原生的支持,甚至连小众的motan和sofarpc都支持。
看一眼官网介绍的功能,你就知道它有多强大了
Skywalking主要概念介绍
使用如下案例来进行Skywalking主要概念的介绍,Skywalking主要概念包含:
- 服务(Service)
- 端点(Endpoint)
- 实例(Instance)
上图中,我们编写了用户服务,这是一个web项目,在生产中部署了两个节点:192.168.1.100和
192.168.1.101。
- 用户服务就是Skywalking的服务(Service),用户服务其实就是一个独立的应用(Application),在
6.0之后的Skywalking将应用更名为服务(Service)。 - 用户服务对外提供的HTTP接口/usr/queryAll就是一个端点,端点就是对外提供的接口。
- 192.168.1.100和192.168.1.101这两个相同服务部署的节点就是实例,实例指同一服务可以部署
多个。
SkyWalking 环境搭建
这里我们就直接使用windows环境进行安装了,因为比较简单,本文也只是带大家快速的入门一下Skywalking。
下载地址:http://skywalking.apache.org/downloads/
本文下载的版本是:apache-skywalking-apm-es7-8.4.0.tar
当然我们还需要下载es7,因为我们需要使用ElasticSearch作为数据源。
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
本文使用的版本是7.12.0
下载完毕之后我们都把他们解压即可。
接下来我们需要配置一下SkyWalking,更改他的数据源为ElasticSearch
首先我们找到config文件夹里面的application.yml文件,找到如下的配置
然后我们需要把默认的h2更改为elasticsearch7,然后保存即可。
接下来我们首先启动一下ElasticSearch,直接运行elasticsearch.bat脚本就行了,
然后我们浏览器中访问:http://localhost:9200/ 能看到如下的画面就说明已经ok了
接下来我们来启动skywalking
启动的过程中可能webapp启动会失败,可能是端口冲突的原因,因为端口默认是8080
我们可以更改webapp.xml的配置
启动完成之后我们访问:http://localhost:8081/ 即可
出现如下的画面说明已经成功了
Skywalking基础
Agent的使用
Agent探针可以让我们不修改代码的情况下,对java应用上使用到的组件进行动态监控,获取运行数据
发送到OAP上进行统计和存储。agent探针在java中是使用java agent技术实现的,不需要更改任何代
码,java agent会通过虚拟机(VM)接口来在运行期更改代码。
gent探针所有的文件在Skywalking的agent文件夹下。文件目录如下:
部分插件在使用上会影响整体的性能或者由于版权问题放置于可选插件包中,不会直接加载,如果需要使用,将可选插件中的jar包拷贝到plugins包下。
plugins包下有如下的插件:
apm-activemq-5.x-plugin-8.4.0.jar
apm-armeria-0.84.x-plugin-8.4.0.jar
apm-armeria-0.85.x-plugin-8.4.0.jar
apm-asynchttpclient-2.x-plugin-8.4.0.jar
apm-avro-plugin-8.4.0.jar
apm-canal-1.x-plugin-8.4.0.jar
apm-cassandra-java-driver-3.x-plugin-8.4.0.jar
apm-cxf-3.x-plugin-8.4.0.jar
apm-dubbo-2.7.x-plugin-8.4.0.jar
apm-dubbo-plugin-8.4.0.jar
apm-ehcache-2.x-plugin-8.4.0.jar
apm-elastic-job-2.x-plugin-8.4.0.jar
apm-elastic-job-3.x-plugin-8.4.0.jar
apm-elasticsearch-5.x-plugin-8.4.0.jar
apm-elasticsearch-6.x-plugin-8.4.0.jar
apm-feign-default-http-9.x-plugin-8.4.0.jar
apm-finagle-6.25.x-plugin-8.4.0.jar
apm-grpc-1.x-plugin-8.4.0.jar
apm-h2-1.x-plugin-8.4.0.jar
apm-hbase-1.x-plugin-8.4.0.jar
apm-httpasyncclient-4.x-plugin-8.4.0.jar
apm-httpclient-3.x-plugin-8.4.0.jar
apm-httpClient-4.x-plugin-8.4.0.jar
apm-httpclient-commons-8.4.0.jar
apm-hystrix-1.x-plugin-8.4.0.jar
apm-influxdb-2.x-plugin-8.4.0.jar
apm-jdbc-commons-8.4.0.jar
apm-jedis-2.x-plugin-8.4.0.jar
apm-jetty-client-9.0-plugin-8.4.0.jar
apm-jetty-client-9.x-plugin-8.4.0.jar
apm-jetty-server-9.x-plugin-8.4.0.jar
apm-kafka-commons-8.4.0.jar
apm-kafka-plugin-8.4.0.jar
apm-lettuce-5.x-plugin-8.4.0.jar
apm-light4j-plugin-8.4.0.jar
apm-mariadb-2.x-plugin-8.4.0.jar
apm-mongodb-2.x-plugin-8.4.0.jar
apm-mongodb-3.x-plugin-8.4.0.jar
apm-mongodb-4.x-plugin-8.4.0.jar
apm-mssql-commons-8.4.0.jar
apm-mssql-jdbc-plugin-8.4.0.jar
apm-mssql-jtds-1.x-plugin-8.4.0.jar
apm-mysql-5.x-plugin-8.4.0.jar
apm-mysql-6.x-plugin-8.4.0.jar
apm-mysql-8.x-plugin-8.4.0.jar
apm-mysql-commons-8.4.0.jar
apm-netty-socketio-plugin-8.4.0.jar
apm-nutz-http-1.x-plugin-8.4.0.jar
apm-nutz-mvc-annotation-1.x-plugin-8.4.0.jar
apm-okhttp-3.x-plugin-8.4.0.jar
apm-play-2.x-plugin-8.4.0.jar
apm-postgresql-8.x-plugin-8.4.0.jar
apm-pulsar-plugin-8.4.0.jar
apm-quasar-plugin-8.4.0.jar
apm-rabbitmq-5.x-plugin-8.4.0.jar
apm-redisson-3.x-plugin-8.4.0.jar
apm-resttemplate-4.3.x-plugin-8.4.0.jar
apm-rocketmq-3.x-plugin-8.4.0.jar
apm-rocketmq-4.x-plugin-8.4.0.jar
apm-servicecomb-java-chassis-0.x-plugin-8.4.0.jar
apm-servicecomb-java-chassis-1.x-plugin-8.4.0.jar
apm-sharding-jdbc-1.5.x-plugin-8.4.0.jar
apm-sharding-sphere-3.x-plugin-8.4.0.jar
apm-sharding-sphere-4.1.0-plugin-8.4.0.jar
apm-sharding-sphere-4.x-plugin-8.4.0.jar
apm-sharding-sphere-4.x-rc3-plugin-8.4.0.jar
apm-shardingsphere-4.0.x-plugin-8.4.0.jar
apm-solrj-7.x-plugin-8.4.0.jar
apm-spring-async-annotation-plugin-8.4.0.jar
apm-spring-cloud-feign-1.x-plugin-8.4.0.jar
apm-spring-cloud-feign-2.x-plugin-8.4.0.jar
apm-spring-concurrent-util-4.x-plugin-8.4.0.jar
apm-spring-core-patch-8.4.0.jar
apm-spring-kafka-1.x-plugin-8.4.0.jar
apm-spring-kafka-2.x-plugin-8.4.0.jar
apm-spring-scheduled-annotation-plugin-8.4.0.jar
apm-springmvc-annotation-3.x-plugin-8.4.0.jar
apm-springmvc-annotation-4.x-plugin-8.4.0.jar
apm-springmvc-annotation-5.x-plugin-8.4.0.jar
apm-springmvc-annotation-commons-8.4.0.jar
apm-spymemcached-2.x-plugin-8.4.0.jar
apm-struts2-2.x-plugin-8.4.0.jar
apm-undertow-2.x-plugin-8.4.0.jar
apm-vertx-core-3.x-plugin-8.4.0.jar
apm-xmemcached-2.x-plugin-8.4.0.jar
apm-xxl-job-2.x-plugin-8.4.0.jar
baidu-brpc-plugin-8.4.0.jar
dbcp-2.x-plugin-8.4.0.jar
dubbo-2.7.x-conflict-patch-8.4.0.jar
dubbo-conflict-patch-8.4.0.jar
graphql-12.x-plugin-8.4.0.jar
graphql-8.x-plugin-8.4.0.jar
graphql-9.x-plugin-8.4.0.jar
motan-plugin-8.4.0.jar
New Text Document.bat
resteasy-server-3.x-plugin-8.4.0.jar
sofa-rpc-plugin-8.4.0.jar
spring-commons-8.4.0.jar
spring-webflux-5.x-webclient-plugin-8.4.0.jar
thrift-plugin-8.4.0.jar
tomcat-7.x-8.x-plugin-8.4.0.jar
可以看到包含的组件插件真的特别的多,当然如果你够牛逼,你还可以自己开发插件。本文下方的参考链接中包含如何开发agent的插件
Spring Boot中使用
Skywalking与Spring Boot集成提供了完善的支持
这里写了一个简单的web spring boot项目
然后我们需要在启动的时候需要配置一下 IDEA 的【Run/Debug Configurations】配置使用 SkyWalking Agent。如下图所示:
关于Agent名字还有OPA Collector的地址在apache-skywalking-apm-es7-8.4.0\apache-skywalking-apm-bin-es7\agent\config\agent.config
这个配置文件中都有默认的配置。
这个配置的读取也有优先级,文章后面会单独讲一讲。
现在我们把项目运行起来就行了,然后访问:http://localhost:8081/ 即可
UI上面包含了追踪,仪表盘,拓扑图等等一些数据展示。大家自己去玩一玩。
下面我们测试一下关于MYSQL连接的,我们这里创建了一个mybatis的Spring boot项目,具体的代码我们最后会给出源代码地址。
主要的逻辑就是通过mapper去查询DB的数据
跟上面一样我们需要配置一下 IDEA 的【Run/Debug Configurations】
然后运行起来之后访问:http://localhost:8081/ 即可
可以看到关于sql相关的也会追踪下来
包括执行的SQL
还有拓扑图
配置覆盖
优先级从高到低
探针配置(Agent options)
Add the properties after the agent path in JVM arguments.
-javaagent:/path/to/skywalking-agent.jar=[option1]=[value1],[option2]=[value2]
- 特殊字符
如果配置中包含分隔符( , 或者 = ) , 就必须使用引号包裹起来。举例:-javaagent:/path/to/skywalking-agent.jar=agent.ignore_suffix='.jpg,.jpeg'
系统配置(System properties)
使用 skywalking. + 配置文件中的配置名作为系统配置项来进行覆盖.
- 为什么需要添加前缀?
agent的系统配置和环境与目标应用共享,所以加上前缀可以有效的避免冲突。
- 案例
通过 如下进行 agent.service_name 的覆盖
系统环境变量(System environment variables)
- 案例
由于agent.service_name配置项如下所示:
配置文件中的值
覆盖优先级:探针配置 > 系统配置 >系统环境变量 > 配置文件中的值
最后总结
这里只是简单的入门介绍啦,SkyWalking 的功能实在是很强大,新版的功能还加入了关于前端的监控,如果想学习更多的话可以移步到下方参考中的链接或者去官网进行学习啦。
参考
芋道 Spring Cloud 链路追踪 SkyWalking
http://skywalking.apache.org/zh/
SkyWalking 8.2.0 中的新特性: 浏览器端监控; 使用标签查询; 指标分析语言
Apache SkyWalking 5.0 中文版图文详解使用手册