SkyWalking链路追踪技术
文章目录
一. 认识SkyWalking
SkyWalking解决了什么问题?-----》微服务架构中,各个服务之间调用关系错综复杂,所以需要一个能捋清复杂情况下调用关系的解决方案,这就是SkyWalking,目前最强大的链路追踪技术;
要使用SkyWalking,需要给我们的项目中绑定一个agent探针,绑定后,SkyWalking就会将你项目整体的监控数据反馈给SkyWalking oapservice,SkyWalking oapservice就是SkyWalking的服务端,oapservice会将这些监控数据做处理,然后存储到数据库中:SkyWalking支持的数据库有很多种:ES,Mysql等等很多都支持;然后SkyWalking 提供了一个前端的可视化ui界面,我们程序员可以通过这个ui界面方便的查看到我们项目整体的数据,因为这个前端界面会向oapservice发送请求查询数据;
二、下载SkyWalking
1.下载SkyWalking
下载网址:http://skywalking.apache.org/downloads/
点击Distribution选择要下载的版本----》我们可以看到skywalking它每一个版本都提供了两份:
其中v8.5.0 for ElasticSearch 6 是针对于es6的,也就是说它的oapservice收集到数据后并处理后,会将其存储到es6中;
另一个版本是针对于其他数据库进行存储,比如H2,Mysql,ES7等等(我也不知道为什么要把ES6,ES7分成两部分?)
2. 启动方式
下载好后,解压,然后打开bin文件夹,然后双击startup.bat命令就可以启动skywalking;
双击startup.bat—》它会帮我们同时启动oapservice.bat与webappService.bat;
假如你是用的liunx系统,那么你需要点击startup.sh进行启动,window系统下用startup.bat;
3. 目录文件解释
1.webapp文件夹
这个文件夹中放的是:skywalking的ui前端界面的jar包跟yaml配置文件;
如果你要修改它的前端ui界面的配置,就要在这个文件夹下的webapp.yaml中进行修改;
通过都是需要修改的,因为这个ui前端界面的默认端口号是8080,基本不会用这个端口,容易重复且易被攻击
这是前端界面配置文件打开后的样子;
2.config文件夹
这个文件夹中放的就是常用的配置文件
这里面最重要的文件就是这个application.yml
2.1 application.yml文件详解
2.1.1 监控数据存储方式修改
打开这个文件,里面有个
storage:
selector: ${SW_STORAGE: h2}
这个表示oapservice读取到的监控数据的存储方式,可以看到它默认的存储方式就是采用的h2数据库,这是一种基于内存的数据库,我们不用它,因为它基于内存,只要一重启skywalking,这些监控数据就会消失;
注意:skywalking最优的监控数据存储方式是es,但是很多人可能不懂es,也可以用mysql替代;
3. agent文件夹
这个文件夹里有个最重要的东西:skywalking-agent.jar,这个jar包到时候需要跟我们的微服务进行绑定,绑定后oapservice才能从我们的微服务中获取监控数据;
3. bin文件夹
这个文件夹里放的都是一些启动脚本;
5. oap-libs
这个文件夹下放的是:oapservice服务器所用的jar包
三、启动skywalking
1.启动成功界面
双击startup.bat命令后,出现下面这个界面就表示skywalking启动成功;
2.oapservice的日志文件
oapservice已经自己集成好了日志功能,它在使用过程中就会输出日志;
日志记录会被输出到logs文件夹中下的两个.log文件中,一个是记录的前端ui界面的日志,一个是记录后端oapservice的日志;
3. oapservice的端口
oapservice自动暴露了两个端口,11800端口和12800端口;
11800端口是oapservice用来收集微服务监控数据的端口,
12800是oapservice用来接收前端ui界面请求的端口;
我们也可以通过config文件夹下的application.yaml来修改这些端口号;
注意:在我们自己的微服务中,要将oapservice的端口号告诉给我们的微服务,否则我们自己的微服务是不知道oapservice的端口的,就没有传递监控数据给oapservice了
4. 打开前端ui界面
你在webapp文件夹下的webapp.yml中将前端ui界面的端口号配置好后,你可以直接在你的浏览器中使用 localhost:你配置好的端口号,来访问前端ui界面;
这就是打开后的样子;
5. 将skywalking与我们自己的微服务绑定
通过上面的操作:修改前端ui界面端口号,双击startup.bat,我们已经成功的启动好了前端ui界面,也成功了启动好了oapservice服务了;
现在还差的是:将我们自己的微服务与skywalking进行绑定,以便skywalking能从我们的微服务获取监控数据;
5.1 在windows环境下绑定skywalking
这种方式是在idea中配置,首先找到Edit Configuration,点击打开;
我们选择gateway这个服务,(这里只是以gateway服务作为一个例子用来讲解)
然后找到VM options,在里面按照图片中的格式进行配置;
注意点1:这里是通过jvm的参数来进行的配置,可以达到对代码无侵入的效果;
注意点2:下面截图中VM options中是写了注释的,这是为了我们学习时方便理解,你真正要去配的时候,不能往里面加注释,因为VM options中是识别不了的,会报错;
配置好后–》再点击ok完成配置
5.2.1 查看结果
我们进入到前端ui界面,点击右上角的刷新(我们可以点击左边的"自动",当"自动"变成蓝色后,前端ui界面就会按照你指定的频率每隔几秒刷新一次界面);
但是我们刷新后,只是在上面看到一个api-service,这是我们在gateway服务的VM options中给gateway服务取的名字,我们只看到了这个名字,刷新后下面的界面也看不到任何东西;
然后我们点击上方的拓扑图,
拓扑图里面也只是有一个服务名称,但是没有任何数据,这是为什么呢?
5.2.2 skywalking与gateway之间存在的问题
这里一定要注意:skywalking在默认情况下是不会显示gateway的,就算你把gateway服务跟skywalking的skywalking-agent.jar进行了绑定,在skywalking前端界面中也是不会显示gateway的任何信息的;
解决办法:
第一步:打开skywalking安装目录下的agent文件夹
第二步:再打开plugins文件夹,这个文件夹中是skywalking集成的所有插件,在这里面可以找到很多jar包,包括mysql,rocketmq等等很多,但你就是找不到gateway的jar包,所以才导致出现上面的问题;
所以你只需要将gateway的jar包放入plugins文件夹里面就可以了
第三步:gateway的jar包到哪里去拿呢?
其实skywalking已经帮我们准备好了gateway的jar包,在我们下载skywalking的安装包时,gateway的jar包已经包含在里面了;
我们找到optional-plugins文件夹,这个文件的意思是:可选的插件;
点开文件夹后,会看到里面就有gateway的jar包,有两个,我们可以选择2.1.x那个,这个更新一点;
然后将它复制一份,复制到plugins文件夹中,然后重启skywalking服务;这样就可以了;
5.2.3 再次查看结果
1. 全局响应时间与全局心跳时间
重启后,我们再次打开skywalking的前端ui界面,就能在下面的页面中看到两个板块;
左边的折线图表示:全局的响应时间
右边的图表示:全局的心跳时间
我们还可以点击界面下方的时间,选择最近多少分钟进行查看;
2. 服务,端点,实例
然后我们还可以看到下图圈起来的部分:
最左边的Services Load 表示当前服务的硬件性能,比如cpu等等;
Slow-Services表示慢加载;
Un-Health Services表示不健康的服务;
Slow Endpoints表示慢端点,就是慢接口的意思,就是说你当前服务有哪些接口比较慢;
然后还有个部分叫"当前实例",如果你当前这个服务是做了集群的,那么你点击当前实例是可以看到好几个实例的,下图只显示了一个,因为我们作为案例的这个gateway服务没有做集群;
3. 拓扑图
然后我们再点击拓扑图,就会显示成这个样子;
意思就是:User用户发送请求到了api-service,也就是gateway,然后gateway又调用一台192.168.65.106:8020的机器(这台机器实际上是订单服务),为什么订单服务在拓扑图中没有显示服务名称而是显示ip地址跟端口呢?这是因为我们现在只是将gateway服务与skywalking-agent.jar绑定了,订单服务没有跟它绑定,所以只是显示ip与端口;
4. 追踪
我们可以点到追踪界面,追踪界面有三种查看形式,列表,树结构,表格;
图中展示的是表格的显示形式:
图中红色圈起来这里有个"/order/get",意思就是你这次发起的请求是"/order/get",
然后发起这次请求,从上往下看,你首先经过了gateway的RoutingFilter接口,也就是经过了路由过滤器,
然后再经过了gateway的sendRequest接口,将请求发送了出去;
那既然是发送请求给订单服务的"/order/get"接口,那为什么sendRequest接口下面就没有显示了呢?
这是因为我们还没有把订单服务跟skywalking-agent.jar进行绑定,skywalking就不会显示在订单服务中的调用链路,所以这里调用链路只显示到了gateway;
5. 性能剖析,日志,告警
这三个部分如果我们要看的话,需要做单独的处理,这里还没处理所以看不到,后面再讲;
5.2 在linux环境下绑定skywalking
5.3 将多个服务与skywalking进行绑定
以上案例只将gateway一个服务与skywalking进行了绑定,实际开发过程中,我们会将很多服务都跟skywalking进行绑定,也很简单,还是只需要在每个服务的VM options中配置就行了;
6. skywalking中持久化数据到数据库
6.1 h2数据库:skywalking的默认存储方式
skywalking默认是将数据存储到h2数据库中的,这是一个内存数据库;
如果将这些监控数据存储到内存中,有两个弊端:
1.一旦你的skywalking重启,内存中的这些监控数据必然会丢失,但其实影响也不是很大,因为监控数据基本都是实时的,没有必要保存下来,更没有必要查看一个月以前的监控数据;就这个方面来说,h2数据库也不是不可以;
2.但是当我们skywalking长期启动,会有越来越多的监控数据被存入内存中,最终就会导致内存爆满,到时候我们依然要重启skywalking,所以从这个方面来说,h2数据库并不合适,所以可以采用mysql,存储到mysql后,我们定时去清空就好了;
6.2 skywalking的持久化方式
1. 修改配置文件
我们如何修改skywalking的存储数据库?—》找到config文件夹------》找到application.yml,找到110行,将h2改成mysql,----》最后找到172行,配置mysql的ip地址,端口号,数据库名称,账户密码等信息;
2. mysql中建数据库
然后在mysql中建好配置文件中的数据库,这个库名要跟我们配置文件中配置的名称swtest一致,建好库之后我们就不用管了,因为skywalking在被启动时,自动在我们建好的这个库中创建它需要的表;
3.skywalking启动时的bug
在我们修改好配置文件,将h2改成mysql后,再启动skywalking就会出现bug:双击startup.bat时出现闪退,无法启动成功,此时我们找到logs文件夹下的skywalking-oap-server.log这个日志文件,我们点进去拉到下面,就能看到如下报错提示:获取不到驱动实例;
造成这个bug的原因是什么呢?是因为skywalking的plugins文件夹下没有mysql的驱动jar包,我们可以到自己的maven仓库中找到mysql驱动包,复制到plugins文件夹下即可
maven仓库中mysql驱动包长这个样子
2.读入数据
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。