链路追踪Skywalking

一、Skywalking的基础知识

官方网站:https://skywalking.apache.org/

下载地址:https://skywalking.apache.org/downloads/

默认启动三个端口:

  • 11800:收集监控数据的端口

  • 12800:接收前段请求的端口;

  • 8080:webapp前端服务

1、什么事Skywalking?

根据官方的解释,Skywalking是一个可观测性分析平台(Observability Analysis Platform简称OAP)和应用性能管理系统(Application Performance Management简称APM)。

提供分布式链路追踪、服务网格(Service Mesh)遥测分析、度量(Metric)聚合和可视化一体化解决方案。

下面是Skywalking的几大特点:

  • 多语言自动探针,Java,.NET Core和Node.JS。

  • 多种监控手段,语言探针和service mesh。

  • 轻量高效。不需要额外搭建大数据平台。

  • 模块化架构。UI、存储、集群管理多种机制可选。

  • 支持告警。

  • 优秀的可视化效果。

2、Skywalking的整体架构:

image.png

整体架构包含如下三个组成部分:

  • 探针(agent)负责进行数据的收集,包含了Tracing和Metrics的数据,agent会被安装到服务所在的服务器上,以方便数据的获取。

  • 可观测性分析平台OAP(Observability Analysis Platform),接收探针发送的数据,并在内存中使用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如Elasticsearch、MySQL数据库、H2数据库等。同时OAP还使用查询引擎(Query Core)提供HTTP查询接口。

  • Skywalking提供单独的UI进行数据的查看,此时UI会调用OAP提供的接口,获取对应的数据然后进行展示。

3、Skywalking与其他常见链路追踪解决方案的对比:

在微服务治理的过程中,尤其是springcloud解决方案中,我们经常会看到Sleuth + Zipkin的组合套装,这里我们就对比下Sleuth + Zipkin的组合与Skywalking之间的优劣势:

image.png

当然,除了上面这两种,其实还有一些,如:Pinpoint、CAT等,但是我很少用,就不对比着写了,有兴趣的就去了解下!


二、Skywalking环境的搭建

Skywalking默认使用H2内存中进行数据的存储,我们可以替换存储源为ElasticSearch保证其查询的高效及可用性。

而ElasticSearch需要jdk环境,所以我们也还需要准备好jdk环境!

我本次安装的版本为:skywalking-6.5.0 + elasticsearch-6.4.0

[root@skywalking2 /]# ls /jiguiquan/
apache-skywalking-apm-6.5.0.tar.gz  elasticsearch-6.4.0.tar.gz

1、手动安装elasticsearch:

docker安装es很简单,可以参考本篇文章:使用Docker安装Elasticsearch和Kibana

# 解压elasticsearch压缩包
[root@skywalking2 jiguiquan]# tar -zxvf elasticsearch-6.4.0.tar.gz
  • 修改Linux系统的限制配置,将文件创建数修改为65536个。

  • 修改系统中允许应用最多创建多少文件等的限制权限。Linux默认来说,一般限制应用最多创建的文件是65535个。但是ES至少需要65536的文件创建数的权限。

  • 修改系统中允许用户启动的进程开启多少个线程。默认的Linux限制root用户开启的进程可以开启任意数量的线程,其他用户开启的进程可以开启1024个线程。必须修改限制数为4096+。因为ES至少需要4096的线程池预备。

vi /etc/security/limits.conf 

#新增如下内容在limits.conf文件中 
es soft nofile 65536 
es hard nofile 65536 
es soft nproc 4096 
es hard nproc 4096

修改系统控制权限,ElasticSearch需要开辟一个65536字节以上空间的虚拟内存。Linux默认不允许任何用户和应用程序直接开辟这么大的虚拟内存。

vi /etc/sysctl.conf 

#新增如下内容在sysctl.conf文件中,当前用户拥有的内存权限大小 
vm.max_map_count=262144

#让系统控制权限配置生效 
sysctl -p

另外建一个用户, 用于ElasticSearch启动:

ES在5.x版本之后,强制要求在linux中不能使用root用户启动ES进程。所以必须使用其他用户启动ES进程才可以。

#创建用户 
useradd es 

#修改上述用户的密码 
passwd es 

#修改elasicsearch目录的拥有者 
chown -R es elasticsearch-6.4.0

使用es用户启动elasticsearch:

#切换用户 
su es 

#到ElasticSearch的bin目录下 
cd bin/ 

#后台启动 
./elasticsearch -d

默认ElasticSearch是不支持跨域访问的,所以在不修改配置文件的情况下我们只能从虚拟机内部进行访问测试ElasticSearch是否安装成功,使用curl命令访问9200端口:

# 如果显示出如下信息,就证明ElasticSearch安装成功:
[es@skywalking2 bin]$ curl http://localhost:9200
{
  "name" : "Qb971yL",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Pheivtr7Sv2iSDTfhK8_Qg",
  "version" : {
    "number" : "6.4.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "595516e",
    "build_date" : "2018-08-17T23:18:47.308994Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

如果我们想从外部访问elasticsearch,则需要进行以下配置:

[es@skywalking2 elasticsearch-6.4.0]$ vim ./config/elasticsearch.yml
network.host: 0.0.0.0

#之后kill掉原程序,重启elasticsearch即可。

到这里,elasticsearch的安装就告一段落了!

2、手动安装Skywalking:

#使用root用户解压skywalking压缩包并重命名:
[root@skywalking2 jiguiquan]# tar -zxvf apache-skywalking-apm-6.5.0.tar.gz
[root@skywalking2 jiguiquan]# mv apache-skywalking-apm-bin/ skywalking/

修改Skywalking存储的数据源配置(从H2修改为elasticsearch):

[root@skywalking2 /]# cd /jiguiquan/skywalking/config/
[root@skywalking2 config]# vim application.yml

image.png

修改前段项目的启动端口:

[root@skywalking2 skywalking]# vi webapp/webapp.yml
server:
  port: 9010

collector:
  path: /graphql
  ribbon:
    ReadTimeout: 10000
    # Point to all backend's restHost:restPort, split by ,
    listOfServers: 127.0.0.1:12800

之后直接启动Skywalking即可:

[root@skywalking2 bin]# ll
total 40
-rwxr-xr-x. 1 es 1002 1352 Nov 12  2019 oapService.bat
-rwxr-xr-x. 1 es 1002 1364 Nov 12  2019 oapServiceInit.bat
-rwxr-xr-x. 1 es 1002 1597 Nov 12  2019 oapServiceInit.sh
-rwxr-xr-x. 1 es 1002 1367 Nov 12  2019 oapServiceNoInit.bat
-rwxr-xr-x. 1 es 1002 1616 Nov 12  2019 oapServiceNoInit.sh
-rwxr-xr-x. 1 es 1002 1599 Nov 12  2019 oapService.sh  #后端服务
-rwxr-xr-x. 1 es 1002  941 Nov 12  2019 startup.bat
-rwxr-xr-x. 1 es 1002  934 Nov 12  2019 startup.sh     ## 一键启动后端和前端服务
-rwxr-xr-x. 1 es 1002 1426 Nov 12  2019 webappService.bat
-rwxr-xr-x. 1 es 1002 1630 Nov 12  2019 webappService.sh  #前端服务

[root@skywalking2 bin]# ./startup.sh 
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!

至此,我们的Skywalking就算是部署好啦!

image.png


三、agent的基础知识与使用

1、什么是agent?

agent探针可以让我们不修改代码的情况下,对java应用上使用到的组件进行动态监控,获取运行数据发送到OAP上进行统计和存储。agent探针在java中是使用java agent技术实现的,不需要更改任何代码,java agent会通过虚拟机(VM)接口来在运行期更改代码。

Agent探针支持 JDK 1.6 – 12的版本,Agent探针所有的文件在Skywalking的agent文件夹下。

2、agent的文件目录结构:

+-- agent 
	+-- activations 
		apm-toolkit-log4j-1.x-activation.jar 
		apm-toolkit-log4j-2.x-activation.jar 
		apm-toolkit-logback-1.x-activation.jar 
		... 
	//配置文件 
	+-- config 
		agent.config 
	//组件的所有插件 
	+-- plugins 
		apm-dubbo-plugin.jar 
		apm-feign-default-http-9.x.jar 
		apm-httpClient-4.x-plugin.jar 
		..... 
	//可选插件 
	+-- optional-plugins 
		apm-gson-2.x-plugin.jar 
		..... 
	+-- bootstrap-plugins 
		jdk-http-plugin.jar 
		..... 
	+-- logs 
	skywalking-agent.jar

部分插件在使用上会影响整体的性能或者由于版权问题放置于可选插件包中,不会直接加载,如果需要使用,将可选插件中的jar包拷贝到plugins包下。

3、agent的使用配置:

当我们需要使用agent对某个服务进行追踪时,需要copy一份agent文件夹,修改下配置:

vi config/agent.config

# 找到这一行,修改应用名:
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}

4、agent在tomcat项目中的使用:

# 修改tomcat的catalina.sh文件
vim apache-tomcat-8.5.47/bin/catalina.sh

# 在头部增加
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/usr/local/skywalking/apache- skywalking-apm-bin/agent/skywalking-agent.jar"; export CATALINA_OPTS

5、agent在springboot项目中的使用:

java -javaagent:/usr/local/skywalking/apache-skywalking-apm- bin/agent_boot/skywalking-agent.jar -Dserver.port=8082 -jar skywalking_springboot.jar &

四、实战——Skywalking追踪mysql的调用

1、首先准备一个mysql数据库:

连接信息如下:

spring.datasource.url=jdbc:mysql://localhost:33306/skywalking 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 
spring.datasource.username=root 
spring.datasource.password=123456

创建数据库,并初始化数据;

2、准备一个springboot项目:

server.port=8087

并项目代码打成jar包,拷贝到服务器上待用;

3、拷贝一份agent,并修改配置:

[root@skywalking1 jiguiquan]# cd /jiguiquan/skywalking/
[root@skywalking1 skywalking]# cp -r agent/ agent-mysql/

[root@skywalking1 skywalking]# vim agent-mysql/config/agent.config
agent.service_name=${SW_AGENT_NAME:skywalking-mysql}

4、后台启动我们的springboot项目:

java -javaagent:/jiguiquan/skywalking/agent-mysql/skywalking-agent.jar -jar skywalking_mysql.jar &

5、访问几次对应的服务api:  http://192.168.56.21:8087/users  

image.png

6、查看Skywalking的Rocketbot页面:

image.png

也可以看到链路拓扑:

image.png

在追踪页面甚至可以看到最终执行的SQL语句,非常方便!

image.png


五、Skywalking的常用插件

1、配置覆盖

根据上面的实战,我们发现,每次部署一个新应用时候,我们都需要提前copy一份agent,以区分不同服务的配置,这么太麻烦了;

其实skywalking-agent已经提供了解决办法,比如探针配置、系统配置、环境变量等(以上面的实战为例):

  • 探针配置:

nohup java -javaagent:/jiguiquan/skywalking/agent/skywalking-agent.jar=agent.service_name=sk-mysql2 -jar skywalking_mysql.jar &
  • 系统配置:

nohup java -javaagent:/jiguiquan/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=sk-mysql2 -jar skywalking_mysql.jar
  • 环境变量:

export SW_AGENT_NAME=sk-mysql3
nohup java -javaagent:/jiguiquan/skywalking/agent/skywalking-agent.jar -jar skywalking_mysql.jar &

经过上面三种配置后,我们查看skywalking的服务追踪情况:

image.png

说明以上三种配置都生效了,配置生效优先级如下:

探针配置 > 系统配置 >系统环境变量 > 配置文件中的值


六、最新Skywalking实战

1、Skywalking9开始Agent探针被独立出来:

在Skywalking9之前,Agent探针和主项目是在一起的;但是从Skywalking9开始,Agent就被独立出来了!

2、下载最新版的Skywalking和Agent:

下载地址:https://skywalking.apache.org/downloads/

我本次下载的版本是:skywalking9.0 + Agent8.11

image.png

3、启动skywalking(oapserver + webapp):

解压+重命名:

[root@skywalking1 skywalking]# tar -zxvf apache-skywalking-apm-9.1.0.tar.gz
[root@skywalking1 skywalking]# mv apache-skywalking-apm-bin/ skywalking9.1.0/

修改skywalking的数据库配置:

[root@skywalking1 skywalking9.1.0]# vim config/application.yml
storage:
  selector: ${SW_STORAGE:elasticsearch}

修改前段webapp的启动端口:

[root@skywalking1 skywalking9.1.0]# vim webapp/webapp.yml
server:
  port: 9090

一键启动oapserver + webapp:

[root@skywalking1 skywalking9.1.0]# bin/startup.sh
SkyWalking OAP started successfully! 
SkyWalking Web Application started successfully!

4、访问新版的Skywalking页面:   http://ip:9090  

image.png5、通过Agent对我们的服务进行监控:

解压Agent探针的压缩包:

[root@skywalking1 skywalking]# tar -zxvf apache-skywalking-java-agent-8.11.0.tgz

还是以前面的 skywalking_mysql.jar 为例:

nohup java -javaagent:/skywalking/skywalking-agent/skywalking-agent.jar=agent.service_name=new-sk-mysql,collector.backend_service='192.168.56.21:11800' -jar skywalking_mysql.jar &
# 设置服务的service group
nohup java -javaagent:/skywalking/skywalking-agent/skywalking-agent.jar=agent.service_name='test::new-sk-mysql',collector.backend_service='192.168.56.21:11800' -jar skywalking_mysql.jar &

然后顺手访问几次我们的java接口,造几条数据!

6、查看Skywalking的webapp界面:

image.png

服务详情页:

image.png拓扑图:

image.png

追踪页面:

image.png

可以看到,新版的Skywalking比旧版的丰富了很多!

jiguiquan@163.com

文章作者信息...

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐