SkyWalking之APM无侵入可观测原理分析

一、 简介(为什么需要用到可观测能力)

        随着微服务的开发模式的兴起,早期的单体架构系统已拆分为很多的子系统,各个子系统封装为微服务,各服务间通过HTTP协议RESET API或者RPC协议进行调用。

        在单体服务或者微服务较少的情况下,当我们遇到问题时可以直接简单、快速地通过日志进行分析,并迅速判断是A服务还是B服务存在问题,以此快速恢复服务。

        但是,在大型企业中,系统数量已经到达了几十个、甚至上百个,每个系统都有不同的架构和调用协议,那么此时这些系统之间的调用关系会变得错综复杂。当某个API接口的业务逻辑很复杂、且调用链路很长,涉及的系统或微服务较多,一旦其中一环出现问题,想要快速定位问题和解决问题那就太难了,如果还是按照早期一一查看日志的方式进行排查,无疑对运维和开发人员是一场噩梦.....

        那么有什么方式能够做到快速定位和分析,并且在应用不改造的情况下实施呢?此时就需要一套APM(应用性能管理(Application Performance Management))系统,将我们业务开发与运维制定的规范嵌入APM系统,在可视化UI面板+告警快速地,通过服务调用链的拓扑图进行问题定位。

        APM系统开源的其实有很多产品,例如韩国主导的Pinpoint、大众点评的CAT、推特的ZipKin、CNCF的Jaeger以及本文重点介绍的Apache SkyWalking. 感兴趣的同学都可以一一了解和使用。

        APM重点关注三个指标数据: 1、Metrics  2、Logging  3、Tracing

        Peter Bourgon在参加完2017 Distributed Tracing Summit后发表的一篇博文,简洁扼要地介绍了指标(Metrics)、链路(Tracing)、日志(Logging)三者的定义和关系。这三种数据在可观察性中都有各自的发挥空间,但每种数据都没办法完全被其他数据代替。

        我们从一个典型的服务问题排查过程来看:

  1. 通过各式各样的预设报警发现异常(通常是Metrics/Logging)
  2. 打开监控大盘查找异常的曲线,并通过查询找到异常的模块(Metrics)
  3. 对这个模块以及关联日志进行查询分析,找到核心的报错信息(Logging)
  4. 通过详细的调用链数据定位到引起问题的代码(Tracing)

二、SkyWalking

        SkyWalking 由中国华为和 Apache 开源社区共同开发,目前已成为 Apache 基金会下的顶级项目之一,作者吴晟。

        SkyWalking 是基于 Apache 开源生态的分布式应用性能监控系统。它提供了面向云原生架构的 APM(Application Performance Management)解决方案,支持多种语言的应用和多种方式的部署,具有以下特点:

        分布式追踪:支持多种语言、多种协议的应用追踪,可获取全链路的请求数据。

        应用拓扑图:根据追踪数据自动生成应用程序拓扑,便于系统管理员快速定位故障。

        监控告警:具有丰富的监控指标和告警规则,支持第三方告警接口。

        插件化体系:可通过插件模块实现对不同类型服务的监控和数据收集。

2.1 无侵入式说明

        SkyWalking Agent采集调用链信息的客户端对业务是无感的、非侵入式的。 那也就意味着,你的项目代码无须修改一行代码就能加入SkyWalking的采集、监控、调用链追踪。

        原始项目接入SkyWalking很轻松、门槛很低。 底层大概得原理是:JAVA本身就提供JAVAAGENT的机制以及采用动态修改字节码技术的方式,Agent在JVM底层帮我们把调用链采集上报的过程透明化了,开发人员作为业务层写代码是无感的。

        注意:无侵入方式实现

  1. 应用服务器中需要安装SkyWalking-agent.jar
  2. 应用需要重启,并且在启动参数中添加相关配置,在后面案例中会提供详细的参

接下来我会使用入门案例做个简单初步分析和验证.

三、案例验证(使用JAVA+PHP)

3.1 安装SkyWalking的OAP系统安装包

下载:  SkyWalking的OAP压缩包

下载页面: Downloads | Apache SkyWalking

3.2 上传下载好的OAP的tar包

3.3 运行OAP

1、解压 apache-skywalking-apm-9.7.0.tar.gz

tar -zxvf apache-skywalking-apm-9.7.0.tar.gz

2、进入 apache-skywalking-apm-bin

3、在启动OAP之前需要确定机器上是否安装JDK

注意SkyWalking新版安装包需要JDK11以上,否则无法启动

Linux 上安装及卸载JDK(包含yum方式)-CSDN博客

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/skywalking/oap/server/starter/OAPServerStartUp has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

该错误告诉我们,我们的类是在比尝试运行它的版本更高的Java版本下编译的。 更具体地说,在这种情况下,我们使用Java 11编译了我们的类,并尝试使用Java 8运行它。

作为参考,让我们快速看一下Java版本号。 如果我们需要下载适当的Java版本,这将很方便。

主版本号和次版本号存储在类字节码中的字节六和七中。

让我们看看主要版本号如何映射到Java版本:

45 = Java 1.1

46 = Java 1.2

47 = Java 1.3

48 = Java 1.4

49 = Java 5

50 = Java 6

51 = Java 7

52 = Java 8

53 = Java 9

54 = Java 10

55 = Java 11

56 = Java 12

57 = Java 13

4、进入bin目录有启动脚本,我们先启动oapService.sh(服务端)、再启动webappService.sh(UI客户端)

sh oapService.sh 
sh webappService.sh

5、启动完毕,执行jps程序查看进程有没有正常拉起来

如果JPS无法使用,则参考linux环境下JPS命令未找到-CSDN博客

6、正常会出现上面两个进程,如果没有拉起来在logs目录可以查看错误信息进行排查,如无问题则继续往下

7、访问SkyWalking 8080 UI界面,默认端口8080

http://$ip:8080

       目前刚开始服务列表这些是空的, SkyWalking支持多种数据存储介质例如默认内存、MySQL、ES等等,一般生产环境使用ES集群进行存储,我们测试直接不用改什么配置,默认采用内存的形式。那就意味着如果服务重启,则之前的测试数据会丢失。

3.4 Trace调用链追踪的基本原理介绍

       Trace调用链追踪,例如A->B->C->D  存在4个微服务的调用链关系。 假设我们通过HTTP协议进行交互,该怎么把调用链信息拿到呢? 

        Google的Dapper论文中提到了一种分布式调用链追踪的实现方式, 市面上的APM系统调用链追踪大部分是参考这篇论文实现的。 每个调用链可以使用TraceId进行标识,每个服务被调用称为一个Span会伴随一个SpanId, 每当父服务调用子服务的时候会将TraceId以及父层的SpanId往子服务传递,子服务收到后,记录父层传递的SpanId作为自己Span的父id,  最后2个服务都会把调用信息上报到APM的服务端,例如SkyWalking的某个端口。

        最后SkyWalking因为采集到了这些Span的信息,Span信息记录着父子关系、调用时间信息、TraceId等等,经过UI绘制,就能把这一次调用的TraceId的所有Span进行串联,最终形成调用链拓扑图。

        接下来我们部署一个SpringBoot项目和一个PHP项目,很简单的链路,SpringBoot调用PHP项目的HTTP接口,我们来看下SkyWalking的UI界面以及分析原理验证。

3.5 运行项目
        我本地搭建了一套SpringBoot项目,但是如果只是简单运行,那肯定和我们的SkyWalking还没进行结合。那怎么结合起来呢?  那就是通过运行的时候,设置参数,和SkyWalking Agent进行结合。

        我们上面提到过,使用SkyWalking Agent最大的好处就是【无代码侵入】,那也就是意味着我们的源代码无须做任何变更, 只需要在运行java -jar JAR包的时候额外加入一下参数即可:

      下载Agent:

下载后进行解压,我将使用两种方式验证;

本地IDEA运行和Linux环境下运行,但注意运行需要同时配置JVM启动参数

# skywalking‐agent.jar的本地磁盘的路径
-javaagent:F:\Apache\skywalking-agent\skywalking-agent.jar
# 在skywalking上显示的服务名
-Dskywalking.agent.service_name=SkyWalking-Test
# skywalking的collector服务的IP及端口
-Dskywalking.collector.backend_service=192.168.20.128:11800
  • 本地IDEA运行

访问接口,即可在UI界面上展示信息

服务列表信息

查看调用service调用拓扑图

查看调用链详细信息

  • Linux上运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/401308.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Halcon set_origin_pose变换的原理

为什么要对标定好的坐标系原点进行变换? 在Halcon相机标定的过程中,总是要用到set_origin_pose对世界坐标系进行变换,如果不使用set_origin_pose函数来显式设置坐标系的原点和姿态,默认情况下使用的是第一张图的位姿。这对于不需要进行复杂…

Spring Boot中的@Scheduled注解:定时任务的原理与实现

1. 前言 本文将详细探讨Spring Boot中Scheduled注解的使用,包括其原理、实现流程、步骤和代码示例。通过本文,读者将能够了解如何在Spring Boot应用中轻松创建和管理定时任务。 2. Scheduled注解简介 在Spring框架中,Scheduled注解用于标记…

【网站项目】167校园失物招领小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

ChatGPT在数据分析OKR计划中的应用

ChatGPT在数据分析OKR计划中的应用 ​ 现在大多数公司引入了OKR(objective & key result)计划,数据分析师也需要定期制定和检查自己的OKR计划。我们不仅可以利用ChatGPT辅助制定OKR计划,也可以让其对OKR计划内容进行调整、优…

探索Go语言中的HTTP路由和中间件

在Go语言中,HTTP路由和中间件是实现Web应用程序核心功能的关键组件。路由负责将传入的HTTP请求分发到适当的处理函数,而中间件则提供了一种在请求处理过程中插入额外逻辑的机制。 HTTP路由 在Go中,net/http标准库提供了基本的路由功能&…

01 Linux简介

Linux背景 发展史 linux从哪来的?怎么发展的?得从UNIX说起 1968年,一些来自通用电气公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念1969-1970年&am…

Sora--首个大型视频生成模型

Sora--首个大型视频生成模型 胡锡进于2024年2月20日认为:台当局怂了 新的改变世界模拟器视觉数据转换视频压缩时空补丁(Spacetime Laten Patches)视频生成扩展变压器算法和模型架构结语 胡锡进于2024年2月20日认为:台当局怂了 **T…

《深入浅出 Spring Boot 3.x》预计3月份发版

各位,目前本来新书《深入浅出 Spring Boot 3.x》已经到了最后编辑排版阶段,即将在3月份发布。 目录: 现在把目录截取给大家: 主要内容: 本书内容安排如下。 ● 第 1 章和第 2 章讲解 Spring Boot 和传统 Spri…

C语言菜鸟入门·数组简介

目录 1. 简介 2. 声明数组 3. 初始化数组 3. 访问数组元素 4. 获取数组长度 5. 数组名 1. 简介 在 C 语言中,数组是一种用来存储相同类型数据元素的集合。数组提供了一种便捷的方式来管理一系列相同类型的数据,可以按照索引来访问和操作数组…

【免费雾锁王国】2024年新手搭建雾锁王国服务器教程

免费自建雾锁王国Enshrouded服务器,先领取阿里云300元无门槛代金券,然后在雾锁王国Enshrouded专题页一键部署,不需要基础,鼠标点选即可10秒钟创建一台雾锁王国游戏服务器,超简单,阿里云服务器网aliyunfuwuq…

Wireshark过滤DNS协议包语法实战

背景 现网DNS服务器发现CPU突增,发现有可能是客户恶意发起的随机子域名扫描,对服务器进行抓包分析,记录下当时的操作。 抓包 执行命令 tcpdump -iany port 53 and host $ip -nnv -w $ip.pcap进行抓包导出到本地,使用Wireshark进…

vue3中使用 tui-image-editor进行图片处理,并上传

效果图 下载包 pnpm i tui-image-editor pnpm i tui-color-picker调用组件 //html部分 <el-dialog v-model"imgshow" destroy-on-close width"40%" draggable align-center :show-close"true":close-on-click-modal"false">&l…

“成像光谱遥感技术中的AI革命:ChatGPT应用指南“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用&#xff0c;人工智…

Redis篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、Redis 的持久化机制是什么?各自的优缺点?二、Redis 常见性能问题和解决方案:三、redis 过期键的删除策略?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

h5网页和 Android APP联调,webview嵌入网页,网页中window.open打开新页面,网页只在webview中打开,没有重开一个app窗口

我是h5网页开发&#xff0c;客户app通过webview嵌入我的页面 点击标题window.open跳转到长图页面&#xff0c;客户的需求是在app里新开一个窗口展示长图页面&#xff0c;window.open打开&#xff0c;ios端是符合客户需求的&#xff0c;但是在安卓端他会在当前webview打开 这…

消息队列-RabbitMQ:死信队列

十五、死信队列 1、死信的概念 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或者直接到 queue 里了&#xff0c;consumer 从 que…

【Chrono Engine学习总结】4-vehicle-4.3-两个vehicle碰撞测试

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 今天突发奇想&#xff0c;想试一下&#xff0c;是否可以实现两个vehicle的碰撞&#xff1f; 1、两辆vehicle的仿真 官方提供了demo_VEH_TwoCars这个demo&#xff0c…

【更新公告】AirtestIDE更新至1.2.17版本

1. 前言 本次更新为AirtestIDE、Airtest-Selenium库更新。 AirtestIDE更新至1.2.17版本&#xff0c;AirtestIDE内置库Airtest更新为1.3.3.1版本&#xff0c;Poco更新为1.0.94版本&#xff0c;主要支持了selenium4.0以上版本&#xff0c;ADB更换为41版本&#xff0c;Airtest新…

数据驱动决策:掌握高效数据分析的七大步骤

在这个数据驱动的时代&#xff0c;无论是企业决策还是个人发展&#xff0c;数据分析都扮演着至关重要的角色。然而&#xff0c;想要从海量数据中提炼出有价值的信息&#xff0c;并不是一件容易的事情。本文为你详细解读高效数据分析&#xff0c;让你的数据开口说话&#xff0c;…

GIS技术在灾后重建中的空间规划与决策支持

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…