快速学习-skywalking入门

对于APM不了解的同学请先查看上一篇skywalking概述

1.2 什么是Skywalking

1.2.1 Skywalking概述

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

提供分布式链路追踪、服务网格(Service Mesh)遥测分析、度量(Metric)聚合和可视化一体化解决方案。
下面是Skywalking的几大特点:

  • 多语言自动探针,Java,.NET Core和Node.JS。
  • 多种监控手段,语言探针和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

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

  1. 探针(agent)负责进行数据的收集,包含了Tracing和Metrics的数据,agent会被安装到服务所在的
    服务器上,以方便数据的获取。
  2. 可观测性分析平台OAP(Observability Analysis Platform),接收探针发送的数据,并在内存中使
    用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如
    Elasticsearch、MySQL数据库、H2数据库等。同时OAP还使用查询引擎(Query Core)提供HTTP查
    询接口。
  3. Skywalking提供单独的UI进行数据的查看,此时UI会调用OAP提供的接口,获取对应的数据然后
    进行展示。

1.2.2 Skywalking优势

Skywalking相比较其他的分布式链路监控工具,具有以下特点:

  • 社区相当活跃。Skywalking已经进入apache孵化,目前的start数已经超过11K,最新版本6.5.0已
    经发布。开发者是国人,可以直接和项目发起人交流进行问题的解决。
  • Skywalking支持Java,.NET Core和Node.JS语言。相对于其他平台:比如Pinpoint支持Java和
    PHP,具有较大的优势。
  • 探针无倾入性。对比CAT具有倾入性的探针,优势较大。不修改原有项目一行代码就可以进行集
    成。
  • 探针性能优秀。有网友对Pinpoint和Skywalking进行过测试,由于Pinpoint收集的数据过多,所以
    对性能损耗较大,而Skywalking探针性能十分出色。
  • 支持组件较多。特别是对Rpc框架的支持,这是其他框架所不具备的。Skywalking对Dubbo、
    gRpc等有原生的支持,甚至连小众的motan和sofarpc都支持。

1.2.3 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这两个相同服务部署的节点就是实例,实例指同一服务可以部署
    多个。

1.3 环境搭建

接下来我们在虚拟机CentOS中搭建Skywalking的可观测性分析平台OAP环境。Skywalking默认使用H2
内存中进行数据的存储,我们可以替换存储源为ElasticSearch保证其查询的高效及可用性。

具体的安装步骤可以在Skywalking的官方github上找到:
https://github.com/apache/skywalking/blob/master/docs/en/setup/README.md

  1. 创建目录
mkdir /usr/local/skywalking

建议将虚拟机内存设置为3G并且将CPU设置成2核,防止资源不足。
当前dev环境配置为2C4G,且apollo和skywalking公用集群,所以,
测试时请轻一点

  1. 资源版本

当前dev环境es版本为6.4.0, skywalking使用的是6.5.0.
搭建时请自行到官网下载

  1. 首先安装elasticsearch,将压缩包解压。
tar -zxvf ./elasticsearch-6.4.0.tar.gz

修改Linux系统的限制配置,将文件创建数修改为65536个。

  1. 修改系统中允许应用最多创建多少文件等的限制权限。Linux默认来说,一般限制应用最多
    创建的文件是65535个。但是ES至少需要65536的文件创建数的权限。
  2. 修改系统中允许用户启动的进程开启多少个线程。默认的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

当前dev环境可以直接使用以下非root账户
账号: appdeploy
密码: BrysjHhrhl!@12

使用es用户启动elasticsearch

#切换用户
su es
#到ElasticSearch的bin目录下
cd bin/
#后台启动
./elasticsearch -d

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

curl http://localhost:9200

如果显示出如下信息,就证明ElasticSearch安装成功:

{
	"name": "xbruNxf",
	"cluster
	_
	name " : "
	elasticsearch ",
	"cluster
	_uuid " : "
	JJQfHN9QQVuXpH5fu9H1jg ",
	"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"
}

4、安装Skywalking,分为两个步骤:

  • 安装Backend后端服务
  • 安装UI

首先切回到root用户,切换到目录下,解压Skywalking压缩包。

#切换到root用户
su root
#切换到skywalking目录
cd /usr/local/skywalking
#解压压缩包
tar -zxvf apache-skywalking-apm-6.4.0.tar.gz

修改Skywalking存储的数据源配置:

cd apache-skywalking-apm-bin
vi config/application.yml

我们可以看到默认配置中,使用了H2作为数据源。我们将其全部注释。
在这里插入图片描述

将ElasticSearch对应的配置取消注释:

storage:
  elasticsearch:
    nameSpace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
    trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}
    trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}
    user: ${SW_ES_USER:""}
    password: ${SW_ES_PASSWORD:""}
    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
    # Those data TTL settings will override the same settings in core module.
    recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is day
    otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # Unit is day
    monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # Unit is month
    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
    bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests
    flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
    concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
    resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
    metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
    segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}

默认使用了localhost下的ES,所以我们可以不做任何处理,直接进行使用。启动OAP程序:

bin/oapService.sh

这样安装Backend后端服务就已经完毕了,接下来我们安装UI。先来看一下UI的配置文件:

cat webapp/webapp.yml
#默认启动端口
server:
  port: 8080

collector:
  path: /graphql
  ribbon:
    ReadTimeout: 10000
    #OAP服务,如果有多个用逗号隔开
    listOfServers: 127.0.0.1:8001

目前的默认配置不用修改就可以使用,启动UI程序:

/bin/webappService.sh

然后我们就可以通过浏览器访问Skywalking的可视化页面了,访问地址:http://虚拟机IP地址:8080,如果
出现下面的图,就代表安装成功了。

/bin/startup.sh可以同时启动backend和ui,后续可以执行该文件进行重启。

在这里插入图片描述

2.Skywalking基础

2.1 agent的使用

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

Agent探针支持 JDK 1.6 - 12的版本,Agent探针所有的文件在Skywalking的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包下。

由于没有修改agent探针中的应用名,所以默认显示的是Your_ApplicationName。我们修改下应用名
称,让他显示的更加正确。编辑agent配置文件:

cd /usr/local/skywalking/apache-skywalking-apm-bin/agent/config
vi agent.config

我们在配置中找到这么一行:

# The service name in UI
agent.service_name=${SW_AGENT_NAME:application_springboot}

这里的配置含义是可以读取到SW_AGENT_NAME配置属性,如果该配置没有指定,那么默认名称为
Your_ApplicationName。这里我们把Your_ApplicationName替换成skywalking_tomcat。

# The service name in UI
agent.service_name=${SW_AGENT_NAME:skywalking_tomcat}

然后将tomcat重启:

./shutdown.sh
./startup.sh

2.1.1 Linux 下Tomcat7和8中使用

1.要使用Skywalking监控Tomcat中的应用,需要先准备一个Spring Mvc项目,在资源中已经提供了打
包好的文件

devops/skywalking_springboot/skywalking_springmvc-1.0-SNAPSHOT.war

以下是该项目的接口代码:

package com.sf.saas.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/hello")
//hello/sayHello.do
public class HelloController {
    @RequestMapping("/sayHello")
    @ResponseBody
    public String sayHello(String name){
        return "hello world";
    }
}

tomcat采用的是8.5.47版本, 请自行安装, 这里不做展示

将war包上传至/usr/local/skywalking/apache-tomcat-8.5.47/webapps/下。编
辑 /usr/local/skywalking/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

修改tomcat启动端口:

vi conf/server.xml
#修改这一行的端口为8081
<Connector port="8080" protocol=...

执行bin目录下的./startup.sh 文件启动tomcat。然后访问地址:
http://虚拟机IP:8081/skywalking_springmvc-1.0-SNAPSHOT/hello/sayHello.do

如果正确打开,能输出hello world。

注意:一定要保证虚拟机和物理机的时间一致,否则访问数据的时候会因为时间不一致而获取不
到数据。

此时再访问Skywalking的页面,会发现出现了一个服务和端点,同时有一笔调用显示了调用的应用名和
接口地址。
在这里插入图片描述

由于没有修改agent探针中的应用名,所以默认显示的是Your_ApplicationName。接下来我们修改下应
用名称,让他显示的更加正确。编辑agent配置文件:

cd /usr/local/skywalking/apache-skywalking-apm-bin/agent/config
vi agent.config

我们在配置中找到这么一行:

# The service name in UI
agent.service_name=${SW_AGENT_NAME:application_springboot}

这里的配置含义是可以读取到SW_AGENT_NAME配置属性,如果该配置没有指定,那么默认名称为
Your_ApplicationName。这里我们把Your_ApplicationName替换成skywalking_tomcat。

# The service name in UI
agent.service_name=${SW_AGENT_NAME:skywalking_tomcat}

然后将tomcat重启:

./shutdown.sh
./startup.sh

在这里插入图片描述

2.1.2 Windows 下Tomcat7和8中使用

Windows下只需要修改f tomcat目录/bin/catalina.bat 文件的第一行为:

set "CATALINA_OPTS=-javaagent:/path/to/skywalking-agent/skywalking-agent.jar"

2.1.3 Spring Boot中使用

Skywalking与Spring Boot集成提供了完善的支持。

  1. 首先我们复制一份agent,防止与tomcat使用的冲突。
cd /usr/local/skywalking/apache-skywalking-apm-bin/
cp -r agent agent_boot
vi agent_boot/config/agent.config

修改配置中的应用名为:

# The service name in UI
agent.service_name=${SW_AGENT_NAME:skywalking_springboot}

2.将资源文件夹中 skywalking_springboot.jar 文件上传到 /usr/local/skywalking 目录下。

devops/skywalking_springboot/skywalking_springboot-0.0.1-SNAPSHOT.jar

Controller层代码如下,提供了一个正常访问的接口和一个异常访问接口:

package com.sf.saas.skywalking_springboot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    //正常访问接口
    @RequestMapping("/sayBoot")
    public String sayBoot(){
        return "Hello Boot!";
    }

    //异常访问接口
    @RequestMapping("/exception")
    public String exception(){
        int i = 1/0;
        return "Hello Boot!";
    }
}

使用命令启动spring boot项目:

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

使用jar包启动的项目如果需要集成skywalking,需要添加-javaagent参数,参数值为agent的jar
包梭子啊位置。

-Dserver.port参数用于指定端口号,防止与tomcat冲突。

末尾添加 & 后台运行模式启动Spring Boot项目。
此时我们可以访问http://虚拟机IP:8082/sayBoot地址来进行访问,访问之后稍等片刻访问Skywalking
的UI页面。

在这里插入图片描述

2.2 RocketBot的使用

Skywalking的监控UI页面称为RocketBot,我们可以通过 8080 端口进行访问, 由于8080端口很容易冲
突,可以修改 webapp/webapp.yml 来更改启动端口:

server:
  port: 8080

本例中我们更改为9010端口防止冲突。访问http://虚拟机IP:9010/打开RocketBot的页面。

2.2.1 仪表盘

打开RocketBot默认会出现仪表盘页面:
在这里插入图片描述

仪表盘页面分为两大块:

  • 服务仪表盘,展示服务的调用情况
  • 数据库仪表盘,展示数据库的响应时间等数据

选中服务仪表盘,有四个维度的统计数据可以进行查看:

  • 全局,查看全局接口的调用,包括全局响应时长的百分比,最慢的端点,服务的吞吐量等
  • 服务,显示服务的响应时长、SLA、吞吐量等信息
  • 端点,显示端点的响应时长、SLA、吞吐量等信息
  • 实例,显示实例的响应时长、SLA、吞吐量等信息,还可以查看实例的JVM的GC信息、CPU信息、
    内存信息

2.2.2 拓扑图

Skywalking提供拓扑图,直观的查看服务之间的调用关系:
在这里插入图片描述

User代表用户应用,目前案例中其实是浏览器

图中Skywalking_boot应用被User调用,同时显示它是一个Spring MVC的应用。后续案例中会出现多个
应用调用,使用拓扑图就能清楚的分析其调用关系了。

2.2.3 追踪

在Skywalking中,每一次用户发起一条请求,就可以视为一条追踪数据,每条追踪数据携带有一个ID
值。追踪数据在追踪页面中可以进行查询:

在这里插入图片描述

左侧是追踪列表,也可以通过上方的追踪ID来进行查询。点击追踪列表某一条记录之后,右侧会显示出
此条追踪的详细信息。有三种显示效果:

  • 列表
  • 树结构
  • 表格

可以很好的展现此条追踪的调用链情况而链路上每个节点,可以通过左键点击节点查看详细信息:

在这里插入图片描述

当前的接口是HTTP的GET请求,相对比较简单,后续的示例中出现异常情况或者数据库访问,可以打印
出异常信息、堆栈甚至详细的SQL语句。

2.2.4 告警

Skywalking中的告警功能相对比较简单,在达到告警阈值之后会生成一条告警记录,在告警页面上进行
展示。当前时间紧迫, 后续有机会再继续补充.