分布式链路追踪_skywalking_学习(1)
一、APM 系统概述
1、什么是 APM 系统?
APM :全称 Application Performance Management 即应用性能管理系统。是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。
应用性能管理,主要指对企业的关键业务应用进行监测、优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低IT总拥有成本。
APM 系统是可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。
2、分布式链路追踪
1)随着分布式系统和微服务架构的出现,一次用户的请求会经过多个系统,不同服务之间的调用关系十分复杂,任何一个系统出错都可能影响整个请求的处理结果。以往的监控系统往往只能知道单个系统的健康状况、一次请求的成功失败,无法快速定位失败的根本原因。
2)除此之外,复杂的分布式系统也面临这下面这些问题:
-
性能分析:
一个服务依赖很多服务,被依赖的服务也依赖了其他服务。如果某个接口耗时突然变长了,那未必是直接调用的下游服务慢了,也可能是下游的下游慢了造成的,如何快速定位耗时变长的根本原因呢?
-
链路梳理:
需求迭代很快,系统之间调用关系变化频繁,靠人工很难梳理清楚系统链路拓扑 (系统之间的调用关系)。
3)为了解决这些问题,Google 推出了一个分布式链路跟踪系统 Dapper ,之后各个互联网公司都参照Dapper 的思想推出了自己的分布式链路跟踪系统,而这些系统就是分布式系统下的 APM 系统。
3、什么是 OpenTracing ?
分布式链路跟踪最先由 Google 在 Dapper 论文中提出,而 OpenTracing 通过提供平台无关、厂商无关的 API,使得开发人员能够方便的添加(或更换)追踪系统的实现。
4、主流的开源 APM 产品:
1)PinPoint
Pinpoint 是由一个韩国团队实现并开源,针对 Java 编写的大规模分布式系统设计,通过 JavaAgent 的机制做字节代码植入,实现加入 traceid 和获取性能数据的目的,对应用代码零侵入。
官方网站:
https://github.com/naver/pinpoint
2)SkyWalking
SkyWalking 是 apache 基金会下面的一个开源 APM 项目,为微服务架构和云原生架构系统设计。它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,Skywalking APM 会感知应用间关系和服务间关系,并进行相应的指标统计。Skywalking 支持链路追踪和监控应用组件基本涵盖主流框架和容器,如国产 RPC Dubbo 和 motan 等,国际化的 spring boot,spring cloud。
官方网站:
http://skywalking.apache.org/
3)Zipkin
Zipkin 是由 Twitter 开源,是分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪。Zipkin 基 于Google 的 Dapper 论文实现,主要完成数据的收集、存储、搜索与界面展示。
官方网站:
https://zipkin.io/
4)CAT
CAT 是由大众点评开源的项目,基于 Java 开发的实时应用监控平台,包括实时应用监控,业务监控,可以提供十几张报表展示。
官方网站:
https://github.com/dianping/cat
二、Skywalking 介绍
1、什么是 Skywalking?
根据官方的解释,Skywalking 是一个可观测性分析平台(Observability Analysis Platform 简称 OAP )和应用性能管理系统(Application Performance Management简称 APM )。
提供分布式链路追踪、服务网格(Service Mesh)遥测分析、度量(Metric)聚合和可视化一体化解决方案。
2、Skywalking 的几大特点:
- 多语言自动探针, Java,.NET Core 和 Node.JS。
- 多种监控手段,语言探针和 service mesh。
- 轻量高效。不需要额外搭建大数据平台。
- 模块化架构。 UI、存储、集群管理多种机制可选。
- 支持告警。
- 优秀的可视化效果。
3、Skywalking 整体架构包含如下三个组成部分:
1)探针(agent)负责进行数据的收集,包含了 Tracing 和 Metrics 的数据,agent 会被安装到服务所在的服务器上,以方便数据的获取。
2)可观测性分析平台 OAP(Observability Analysis Platform),接收探针发送的数据,并在内存中使用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如Elasticsearch、MySQL 数据库、H2 数据库等。同时 OAP 还使用查询引擎(Query Core)提供HTTP查询接口。
3)Skywalking 提供单独的 UI 进行数据的查看,此时 UI 会调用 OAP 提供的接口,获取对应的数据然后进行展示。
4、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都支持。
5、Skywalking主要概念介绍
使用如下案例来进行Skywalking主要概念的介绍,Skywalking主要概念包含:
- 服务 (Service)
- 端点 (Endpoint)
- 实例 (Instance)
三、环境搭建-ElasticSearch 环境搭建
1、在虚拟机中搭建 Skywalking 的可观测性分析平台 OAP 环境。Skywalking 默认使用 H2
内存中进行数据的存储,可以替换存储源为 ElasticSearch 保证其查询的高效及可用性。
具体的安装步骤可以在 Skywalking 的官方 github 上找到:
https://github.com/apache/skywalking/blob/master/docs/en/setup/README.md
2、在虚拟机上创建新目录(建议将虚拟机内存设置为 3G 并且将 CPU 设置成 2 核,防止资源不足。)
sudo mkdir /usr/local/skywalking
3、将 elasticsearch 和 skywalking 安装包上传到虚拟机 /usr/local/skywalking 目录下。
1)Skywalking 对 es 版本号有一定要求,最好使用 6.3.2 以上版本,如果是 7.x 版本需要额外进行配置。
2)这里使用的版本分别是:
apache-skywalking-apm-6.5.0.tar.gz
elasticsearch-6.4.0.tar.gz
4、安装 elasticsearch,将压缩包解压。
sudo tar -zxvf ./elasticsearch-6.4.0.tar.gz
5、修改 Linux 系统的限制配置,将文件创建数修改为 65536 个。
1)修改系统中允许应用最多创建多少文件等的限制权限。Linux 默认来说,一般限制应用最多
创建的文件是 65535 个。但是 ES 至少需要 65536 的文件创建数的权限。
2)修改系统中允许用户启动的进程开启多少个线程。默认的 Linux 限制 root 用户开启的进程可
以开启任意数量的线程,其他用户开启的进程可以开启 1024 个线程。必须修改限制数为
4096+。因为 ES 至少需要 4096 的线程池预备。
sudo vi /etc/security/limits.conf #新增如下内容在 limits.conf 文件中 es soft nofile 65536 es hard nofile 65536 es soft nproc 4096 es hard nproc 4096
6、修改系统控制权限, ElasticSearch 需要开辟一个 65536 字节以上空间的虚拟内存。Linux 默认不允许任何用户和应用程序直接开辟这么大的虚拟内存。
sudo vi /etc/sysctl.conf #新增如下内容在sysctl.conf文件中,当前用户拥有的内存权限大小 vm.max_map_count=262144 #让系统控制权限配置生效 sudo sysctl -p
7、新建一个用户 es, 用于 ElasticSearch 启动。
ES 在 5.x 版本之后,强制要求在 linux 中不能使用 root 用户启动 ES 进程。所以必须使用其他用户启动 ES 进程才可以。
#创建用户 sudo useradd es #修改上述用户的密码 sudo passwd es djh12311 djh12311 #修改 elasicsearch 目录的拥有者 cd /usr/local/skywalking sudo chown -R es elasticsearch-6.4.0
8、使用 es 用户启动 elasticsearch
#切换用户 su es djh12311 #到 ElasticSearch 的 bin 目录下 cd elasticsearch-6.4.0/bin/ #后台启动 elasticsearch ./elasticsearch -d # 查看后台运行日志 tail -f logs/elasticsearch
9、默认 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" }
四、环境搭建-skywalking 环境搭建
1、安装 Skywalking,分为两个步骤:
- 安装 Backend 后端服务
- 安装 UI
2、首先切回到 root 用户,切换到 /usr/local/skywalking 目录下,解压 Skywalking 压缩包。
#切换到 root 用户 su root #切换到 skywalking 目录 cd /usr/local/skywalking #解压压缩包 tar -zxvf apache-skywalking-apm-6.4.0.tar.gz
3、修改 Skywalking 存储的数据源配置
cd apache-skywalking-apm-bin vi apache-skywalking-apm-bin/config/application.yml
4、默认配置中,Skywalking 使用了 H2 作为数据源。将其全部注释。
# h2: # driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource} # url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db} # user: ${SW_STORAGE_H2_USER:sa} # metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
5、将 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}
6、Backend 后端服务安装完毕后,安装 UI。先修改 UI 的配置文件端口为:9010,防止端口冲突。
vi apache-skywalking-apm-bin/webapp/webapp.yml
server: port: 9010
7、默认使用了 localhost 下的 ES,所以我们可以不做任何处理,直接进行使用。启动 OAP 程序:
# 启动 OAP apache-skywalking-apm-bin/bin/oapService.sh # 或者 同时启动 OAP 和 UI : apache-skywalking-apm-bin/bin/startup.sh
8、查看启动日志
cd apache-skywalking-apm-bin/logs tail -f webapp.log
9、浏览器地址栏输入:(虚拟机的IP地址:ifconfig 查询,或者:ip addr 命令查询 ip)
172.29.35.23:9010
五、 agent 的使用-简介
1、agent 的使用
agent 探针可以让我们不修改代码的情况下,对 java 应用上使用到的组件进行动态监控,获取运行数据发送到 OAP 上进行统计和存储。agent 探针在 java 中是使用java agent 技术实现的,不需要更改任何代码,java agent 会通过虚拟机(VM)接口来在运行期更改代码。
2、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
3、编辑 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:skywalking_tomcat}
4、重启 tomcat
./shutdown.sh ./startup.sh
六、agent 的使用-linux下 tomcat7 和 8 中使用
1、要使用 Skywalking 监控 Tomcat 中的应用,需要先准备一个 SpringMVC 项目,然后打包成
skywalking_springmvc.war 。
1.1 创建 artifactId 名为 skywalking_springmvc 的 maven 工程。
--> idea --> File --> New --> Project --> Maven Project SDK: ( 1.8(java version "1.8.0_131" ) --> Next --> Groupld : ( djh.it ) Artifactld : ( skywalking_springmvc ) Version : 1.0-SNAPSHOT --> Name: ( skywalking_springmvc ) Location: ( ...\skywalking_springmvc\ ) --> Finish
1.2 在工程 skywalking_springmvc 的 pom.xml 文件中导入依赖坐标。
4.0.0 djh.it skywalking_springmvc1.0-SNAPSHOT war skywalking_springmvc Maven Webapp UTF-8 1.8 1.8 5.0.5.RELEASE org.springframework spring-context${spring.version} org.springframework spring-beans${spring.version} org.springframework spring-webmvc${spring.version} org.springframework spring-jdbc${spring.version} org.springframework spring-aspects${spring.version} org.springframework spring-jms${spring.version} org.springframework spring-context-support${spring.version} javax.servlet servlet-api2.4 provided org.apache.maven.plugins maven-compiler-plugin2.3.2 1.8 org.apache.tomcat.maven tomcat7-maven-plugin8082 / 1.3 在工程 skywalking_springmvc 中,创建 Controller 类 HelloController.java
/** * skywalking_springmvc\src\main\java\djh\it\controller\HelloController.java * * 2024-5-16 创建 Controller 类 HelloController.java */ package djh.it.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"; } }
1.4 在工程 skywalking_springmvc 中,创建配置文件 applicationContext-web.xml
1.5 在工程 skywalking_springmvc 中,创建页面文件 index.jsp
index.jsp
Hello World!
1.6 在工程 skywalking_springmvc 中,创建 web.xml
Archetype Created Web Application springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:applicationContext-web.xml 1 springmvc *.do 1.7 把工程 skywalking_springmvc 打包成 skywalking_springmvc.war 。
2、下载 apache-tomcat-8.5.47.tar.gz 文件并上传至虚拟机 /usr/local/skywalking 目录下,然
后解压:
tar -zxvf apache-tomcat-8.5.47.tar.gz
3、将 skywalking_springmvc.war 包上传至 /usr/local/skywalking/apache-tomcat-8.5.47/webapps/ 下。编辑 /usr/local/skywalking/apache-tomcat-8.5.47/bin/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
4、修改 tomcat 启动端口:
vi conf/server.xml #修改这一行的端口为 8081
5、执行 bin 目录下的 ./startup.sh 文件启动 tomcat。然后访问地址:
http://虚拟机IP:8081/skywalking_springmvc/hello/sayHello.do
如: http://172.29.35.23:8081/skywalking_springmvc/hello/sayHello.do
如果正确打开,输出 hello world。
注意:一定要保证虚拟机和物理机的时间一致,否则访问数据的时候会因为时间不一致而获取不
到数据。
6、此时再访问 Skywalking 的页面( http://172.29.35.23:9010/ ),会发现出现了一个服务和端点,同时有一笔调用显示了调用的应用名和
接口地址。
7、由于没有修改 agent 探针中的应用名,所以默认显示的是 Your_ApplicationName。修改下应
用名称,让他显示的更加正确。编辑 agent 配置文件:
# 切换目录: cd /usr/local/skywalking/apache-skywalking-apm-bin/agent/config # 编辑 agent 配置文件 vi agent.config # 修改前: # The service name in UI agent.service_name=${SW_AGENT_NAME:Your_ApplicationName} # 修改后: # The service name in UI agent.service_name=${SW_AGENT_NAME:skywalking_tomcat}
8、重启 tomcat
./shutdown.sh ./startup.sh
9、Windows 下 Tomcat7 和 8 中使用
Windows 下只需要修改 tomcat 目录 /bin/catalina.bat 文件的第一行为:
set "CATALINA_OPTS=-javaagent:/path/to/skywalking-agent/skywalking-agent.jar"
七、agent 的使用-Spring Boot
Skywalking 与 Spring Boot 集成提供了完善的支持。
1、打开 idea 创建新工程 skywalking_springboot
1.1 在 skywalking_springboot 工程的 pom.xml 文件中导入依赖坐标:
4.0.0 org.springframework.boot spring-boot-starter-parent2.1.10.RELEASE djh.it skywalking_springboot0.0.1-SNAPSHOT skywalking_springboot Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starter-testtest org.springframework.boot spring-boot-maven-plugin1.2 在 skywalking_springboot 工程中,创建 启动类 SkywalkingSpringbootApplication:
/** * 2024-5-20 创建 启动类 SkywalkingSpringbootApplication */ package djh.it.skywalking_springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SkywalkingSpringbootApplication { public static void main(String[] args) { SpringApplication.run(SkywalkingSpringbootApplication.class, args); } }
1.3 在 skywalking_springboot 工程中,创建 Controller 类 MyController.java
/** * 2024-5-20 创建 Controller 类 MyController.java */ package djh.it.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!"; } }
1.4、把工程 skywalking_springboot 打包成 skywalking_springboot.jar 文件
2、复制一份 agent,防止与 tomcat 使用的冲突。并修改配置中的应用名:
## 复制一份 agent 并更名为:agent_boot cd /usr/local/skywalking/apache-skywalking-apm-bin/ cp -r agent agent_boot ## 进入 agent_boot 目录: cd agent_boot ## 修改配置中的应用名 vi agent_boot/config/agent.config # The service name in UI agent.service_name=${SW_AGENT_NAME:skywalking_boot} :wq # 保存并退出编辑器。
3、将 skywalking_springboot.jar 文件上传到 /usr/local/skywalking 目录下。
4、使用命令启动 spring boot项目:
java -javaagent:/usr/local/skywalking/apache-skywalking-apm- bin/agent_boot/skywalking-agent.jar -Dserver.port=8082 -jar skywalking_springboot.jar & # 参数说明: -Dserver.port 参数 :用于指定端口号,防止与 tomcat 冲突。 末尾添加 & 后台运行模式启动 Spring Boot 项目。
5、浏览器地址栏输入:http://虚拟机IP:8082/sayBoot
异常接口访问:http://虚拟机IP:8082/exception
访问之后稍等片刻访问 Skywalking 的 UI 页面,查看访问记录。
八、RocketBot 的使用
1、Skywalking 的监控 UI 页面成为 RocketBot,可以通过 8080 端口进行访问, 由于8080 端口很容易冲突,可以修改 webapp/webapp.yml 来更改启动端口:
server: # port: 8080 # 默认端口 port: 9010 # 修改为 9010
2、打开 RocketBot 默认会出现仪表盘页面:(仪表盘)
1)仪表盘页面分为两大块:
- 服务仪表盘,展示服务的调用情况。
- 数据库仪表盘,展示数据库的响应时间等数据。
2)选中服务仪表盘,有四个维度的统计数据可以进行查看:
- 全局,查看全局接口的调用,包括全局响应时长的百分比,最慢的端点,服务的吞吐量等
- 服务,显示服务的响应时长、 SLA、吞吐量等信息
- 端点,显示端点的响应时长、 SLA、吞吐量等信息
- 实例,显示实例的响应时长、 SLA、吞吐量等信息,还可以查看实例的JVM的GC信息、CPU信息、
内存信息
3、Skywalking 提供拓扑图,直观的查看服务之间的调用关系:
4、追踪:
在 Skywalking 中,每一次用户发起一条请求,就可以视为一条追踪数据,每条追踪数据携带有一个 ID
值。追踪数据在追踪页面中可以进行查询:
5、告警:
Skywalking 中的告警功能相对比较简单,在达到告警阈值之后会生成一条告警记录,在告警页面上进行展示。
-
还没有评论,来说两句吧...