开源框架APM工具--SkyWalking原理与应用

2023-05-16

一、分布式链路追踪简介

随着业务系统的不断发展、微服务架构的演进,从原来的单体应用架构、垂直应用架构、分布式 SOA 架构到现在的微服务架构,系统逐步走向微服务化以适应用户高并发请求等需求。在微服务架构中,一个业务操作往往需要多个服务间协同操作,而在一个复杂的系统中出现问题的时候,需要我们能够快速的分析并定位到问题的原因,这就需要我们对业务进行一次还原,正是分布式链路追踪需要解决的问题。

分布式链路追踪就是将一次请求还原成完整的链路,将一次分布式请求的调用情况集中展示,例如请求耗时、请求节点的名称、响应状态等。 分布式链路跟踪主要功能: 故障快速定位:可以通过调用链结合业务日志快速定位错误信息,包括请求时间、响应的状态、节点名称等信息,用于到达故障定位的能力; 链路性能可视化:各个阶段链路耗时、服务依赖关系通过可视化界面展现出来; 链路分析:通过分析链路耗时、服务依赖关系可以得到用户的行为路径,汇总分析应用在很多业务场景。

二、分布式链路追踪的基本原理

2.1 Dapper 模型

链路追踪系统最早是由Goggle公开发布的一篇论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,这篇论文讲述了 Dapper 链路追踪系统的基本原理和关键技术点,通过一个分布式全局唯一的 id(即traceId),将分布在各个服务节点上的同一次请求串联起来,还原调用关系、追踪系统问题、分析调用数据、统计系统指标。

图中一条完整的链路是:user -> 服务A -> 服务B -> 服务C -> 服务D -> 服务E -> 服务C -> 服务A -> user,服务之间经过的每一条链路构成了一条完整的链路,并且每一条局部的链路都可以用唯一的 trace id标识。

通过唯一的 trace id无法知道先是调用了服务A还是先调用了服务B,因此为了去表达这种父子关系引入了 span 的概念,相同层的 parent id 相同,span id不同,并且 span id 由小到大来表示请求的顺序。除此之外,还可以记录其他的一些信息,比如发起服务的名称、IP、被调用服务的名称、返回结果、网络耗时等。

2.2 OpenTracing 模型

OpenTracing 是一个中立的分布式追踪的 API 规范,提供了统一接口方便开发者在自己的服务中集成一种或者多种分布式追踪的实现,使得开发人员能够方便的添加或更换追踪系统的实现。OpenTracing 可以解决不同的分布式追踪系统 API 不兼容的问题,各个分布式追踪系统都来实现这套接口。 OpenTracing 的数据模型,主要有以下三个: Trace:可以理解为一个完整请求链路,也可以认为是由多个 span 组成的有向无环图(DAG); Span:span 代表系统中具有开始时间和执行时长的逻辑运行单元,只要是一个完整生命周期的程序访问都可以认为是一个 span,比如一次数据库访问,一次方法的调用,一次 MQ 消息的发送等;每个 span 包含了操作名称、起始时间、结束时间、阶段标签集合(Span Tag)、阶段日志(Span Logs)、阶段上下文(SpanContext)、引用关系(Reference); SpanContext:Trace 的全局上下文信息,span 的状态通过 SpanContext 跨越进程边界进行传递,比如包含 trace id,span id,Baggage Items(一个键值对集合)。

对于一次完整的登录请求就是一个 Trace,显然需要一个全局的 trace id 来标识,每次服务间的调用就称为一个 span,通过对应协议将 span context 进行传输。 据此调用链路信息画出调用链的可视化视图如下:

三、SkyWalking的原理

3.1 数据采集上报

  SpanType 总共有三种:
  Entry:表示整个进程的 span;
  Local:表示进程内部的处理,是 EntrySpan 的一部分;
  Exit:表示发起一个远程调用,如请求 db、redis,例如:http 请求、rpc 调用、发送 mq 消息。
  Skywalking 采用插件和代理的方式进行链路信息的采集,通过 http 或 grpc 进行链路信息的上报,这样可以做到对代码的无侵入性。在进行跨线程和跨进程时,通过跨进程和跨线程信息传输协议,将当前线程和当前进程的 SpanContext 到下一个线程和下一个进程,并实现相应的 API 进行信息的生成和解析。
复制代码

3.2 跨进程传递数据

数据 data 一般分为 Header 和 Body, 例如 Http 请求的请求头和请求体, RocketMQ 也有 MessageHeader,Message Body, 请求体一般放着业务数据,所以不宜在请求体中传递链路数据,应该在 Header 中传递链路数据比较合适。

在 Dubbo 中的 attachment 就相当于 header,所以我们把 context 放在 attachment 中,这样就解决了 context 的传递问题。

3.3 无侵入的字节码增强

JVMTI 提供了一套”代理”程序机制,可以支持第三方工具程序以代理的方式连接和访问 JVM,并利用 JVMTI 提供的丰富的编程接口,完成很多跟 JVM 相关的功能。在 Instrumentation 的实现当中,存在一个 JVMTI 的代理程序,通过调用 JVMTI 当中 Java 类相关的函数来完成Java 类的动态操作。除开 Instrumentation 功能外,JVMTI 还在虚拟机内存管理,线程控制,方法和变量操作等等方面提供了大量有价值的函数。   在JVM启动时,通过JVM参数-javaagent,传入agent jar,Instrument Agent 被加载 也可以在JVM启动后,attach agent包 skywalking 的工作方式就是在 JVM 启动时,通过JVM参数 -javaagent。 Skywalking Agent 就使用 Javaagent 了做字节码植入,无侵入式的收集,并通过 Http 或grpc 方式发送数据到Skywalking Collector(链路数据收集器)。skywalking agent 为了能够让更多开发者加入开发,并且能够有可扩展性,使用了插件机制, agent 启动时会加载所有 plugins,进行字节码增强。 在插件中主要考虑问题: 创建 span,让它能够显示 Trace 调用链;考虑如何传输。

3.4 架构设计

数据收集:Tracing 依赖探针(Agent),Metrics 依赖 Prometheus 或者新版的 Open Telemetry,日志通过 ES 或者 Fluentd。 数据传输:通过 kafka、Grpc、HTTP 传输到 Skywalking Reveiver。 数据解析和分析 :OAP 系统进行数据解析和分析。 数据存储:后端接口支持多种存储实现,例如 ES。 UI模块:通过 GraphQL 进行查询,然后通过 VUE 搭建的前端进行展示。 告警:可以对接多种告警,最新版已经支持钉钉。 微服务想要使用监控追踪,只要加上对应的 agent 就可以了

四、SkyWalking监控与告警应用

4.1 监控

服务告警监控:

服务之间的依赖关系图:

trace 链路查看:

JVM 指标监控:

4.2 告警

告警配置文件alarm-settings.yml ,告警配置由以下几部分组成: service_resp_time_rule:告警规则名称 ***_rule; indicator-name:指标数据名称; op: 操作符: > , < , =; threshold:目标值:指标数据的目标数据 如 sample 中的1000就是服务响应时间,配合上操作符就是大于 1000ms 的服务响应; period: 告警检查周期:多久检查一次当前的指标数据是否符合告警规则; counts: 达到告警阈值的次数; silence-period:忽略相同告警信息的周期; message:告警信息; webhooks:服务告警通知服务地址。 也可以在该配置文件中自定义 webhook 接口,当产生告警时会调用该接口获取 AlarmMessage 信息。例如:配置钉钉告警机器人。

rules:
  service_cpm_rule:
    metrics-name: service
    op: ">"
    threshold: 1
    period: 1
    count: 1
    silence-period: 1
    message: service请求值过多
dingtalkHooks:
  textTemplate: |-
    {
      "msgtype": "text",
      "text": {
      "content": "Apache SkyWalking Alarm: \n %s."
      }  
    }
  webhooks:
    - url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx
​
复制代码

4.3 性能

看一下官方基于 skywalking 3.2 java 探针的压力测试,测试物理机的配置:4 Intel(R) Core(TM) i5-4460 CPU @ 3.20GH, 16G memory。

基线指标值: CPU: CPU 总体百分比,注:如4核 CPU 此百分比为基于400%计算而来; TPS: 每秒事务数; Response Time. 响应时间,单位:毫秒。

每秒超过5000个 trace segment 的发送对应资源使用和响应时间来看,skywalking 探针的性能表现是非常优秀的。

五、总结

本文简单讲了分布式链路追踪的原理、Skywalking 设计和应用。总的来说,Skywalking 架构简单、利用无侵入的字节码增强技术使用很方便,扩展性强,对 Java 程序分布式监控方案提供了很大的便利性,方便我们更快速定位问题原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源框架APM工具--SkyWalking原理与应用 的相关文章

  • openstack

    云计算架构 openstack整体架构 openstack身份服务 Keystone 管理层次结构 Keystone三大组件 服务 xff08 Server xff09 身份 xff08 Identity xff09 服务 资源 xff08
  • streamlit

    安装streamlit模块 python3 V Python span class token number 3 6 span 8 pip3 span class token function install span upgrade pi
  • docker命令补全

    参考 https blog csdn net weixin 45444133 article details 116950552 系统补全 span class token comment centos span yum y span cl
  • docker监控-Weave-Scope

    Weave Scope服务是一个用来监控docker容器 k8s等 xff08 包括宿主机 xff09 的资源使用状况的 安装 方法1 span class token function wget span https github com
  • 结构化思维读书整理笔记

  • js编写学生系统---增删改查

    所有代码需要在consolg中查看 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title gt 学生管理系统 lt title
  • mac安装homebrew被墙超时

    一 获取 install 文件 xff0c 把官网给的脚本拿下来 curl fsSL https raw githubusercontent com Homebrew install master install gt gt brew in
  • 块元素、行内元素、行内块元素区别及其作用

    块元素 块级元素独占一行 默认会新起一行 xff0c 如 xff1a div p h1 根据这个特性可以实现盒子水平居中margin 0 auto 原理 块级元素独占一行设置大小后水平方向会剩余空间 设置auto左右会自动分配剩余空间 行内
  • Ubuntu安装Docker 时遇到的一个问题

    Ubuntu安装Docker 详细步骤和结果展示 https docs docker com engine install ubuntu 问题描述 xff1a ubuntu 的包管理是通过 apt get 来做的 xff0c 但是默认的 a
  • win10 能Ping通却无法访问虚拟机Ubuntu 14.04 samba的问题(已解决)

    windows系统版本 xff1a Win10 虚拟机版本 xff1a VMware Workstation 12 Pro Ubuntu版本 xff1a 14 04 在更新windows10补丁之前 xff0c Win10是能访问Ubunt
  • c51单片机学习笔记-LED流水灯库函数实验

    目的 xff1a 实现 LED 流水灯 xff0c 只需循环让 D1 D8 指示灯逐个点亮再从D8 D1逐个点亮 xff0c 循环下去 方法 xff1a 利用移位库函数 xff0c 点亮 D1 且把 D2 D8 熄灭 xff0c 延时一段时
  • 关于STM32F405单片机控制雷达模块lidar_lite_v3程序及说明

    include 34 stm32f4 iic h 34 include 34 lidar lite v3 h 34 include 34 stm32f4 delay h 34 uint8 t WriteBuffer 61 0x55 Read
  • 常用串口调试工具比较(详细)

    目前有许多免费的串口调试工具 xff0c 比较常用的有 xff1a 1 友善串口调试助手 xff08 v2 6 5 xff09 优点 xff1a 1 xff09 使用方便 xff0c 不丢包 xff1b 2 xff09 串口自动识别 xff
  • FreeRTOS 变量名,函数名,宏的命名规则(2)

    前言 内容均来自野火相关书籍 xff0c 写博客是为了方便查看 xff1b 博客内容并不完善 xff0c 慢慢补充 xff1b 函数名 xff1a 包含函数返回值的类型 函数所在的文件名和函数的功能 例 xff1a vTaskPriorit
  • 头文件包含顺序的建议

    使用标准的头文件包含顺序可增强可读性 避免隐藏依赖 xff0c 建议的包含顺序如下 xff1a C或C 43 43 等源文件中按照以下顺序包含 xff0c 建议按照稳定度排序 xff1a c cpp对应的头文件 C C 43 43 标准库的
  • [问题解决方案] ubuntu 14.04 分辨率调整 -- xrandr命令

    问题描述 xff1a 自己在安装ubuntu kylin 14 04 TLS系统成功后 xff0c 在调整分辨率的时候 xff08 系统设置 显示 xff09 发现分辨率的选项只有1024x768以及800x600两个选项 xff0c 而台
  • 1、烧录系统到sd卡,从sd卡启动系统

    烧写系统到sd卡 硬件 xff1a 用的是友善之臂的NanoPC T4工业级开发板 步骤 xff1a 1 准备好一个sd卡 xff08 class10以上高速SDHC卡 xff09 和一个读卡器 大小最好16g以上 xff0c 保证空间充裕
  • 12、Gazebo的安装问题

    一 Gazebo的安装问题 1 安装的官网的网址 xff1a http gazebosim org tutorials cat 61 install amp tut 61 install ubuntu amp ver 61 9 0 2 安装
  • 11、ros依赖包安装问题

    一 问题 在ROS编译过程中经常会遇到找不到ROS包的情况 xff0c 那么一般情况下该如何解决问题呢 xff1f 我们通常用apt来进行安装 xff0c 实际上有时候apt在处理依赖关系上是没有aptitude那么智能的 xff0c 所以
  • 12、TX2(ARM架构)平台换源

    关于换源的教程可参考一下其他博主的两篇文章 ARM架构换源 Ubuntu 国内源介绍 针对本机的换源操作如下 xff1a 进入配置目录 span class token function cd span etc apt 备份sources

随机推荐

  • VirtualBox 每天自动创建快照

    需求很简单 每天自动对虚拟机创建一个快照 避免忘记备份 同时给自己减少一点工作量 主要思路就是通过VBoxManage的命令行操作和windows的任务计划程序来完成定时备份的工作 VBoxManage 使用帮助如下 C Program F
  • c51单片机学习笔记-动态数码管实验(un)

    目的 xff1a 控制动态数码管从左至右显示数字 0 7 编译软件 xff1a keil5 过程 1 xff09 首先将 51 单片机的头文件包含进来 xff0c 然后定义 38 译码器的控制引脚 xff0c 并将共阴数码管 0 F 断码数
  • 在py-faster-rcnn/lib里make时报错: unrecognized command line option ‘-Wdate-time’

    在py faster rcnn lib里make时报错 xff1a c 43 43 pthread shared Wl O1 Wl Bsymbolic functions Wl Bsymbolic functions Wl z relro
  • C/C++ 日常学习总结(第十九篇)多线程详解

    这些讲解多线程文章都是非常好的 xff0c 我这边就归结出一个 lt 多线程详解 gt 出来 xff0c 感谢各位原创作者的辛苦劳动 xff0c 这些收藏起来方便自己消化 1 多线程笔试面试题汇总 解答地址 xff1a 概念问答 2 深入分
  • python3 算法题:七进制加法

    题目 xff1a 要求键盘输入两个七进制 0 6 数 xff0c 以空格分开 xff0c 计算两者之和输出 xff0c 例如 xff1a 输入 xff1a 16 1 输出 xff1a 20 思路 xff1a 这个题目跟十进制加法一样 xff
  • python3 实现麻将胡牌问题

    题目描述 xff1a 清一色是麻将番种之一 xff0c 指由一种花色的序数牌组成的和牌 数字1 9 xff0c 每个数字最多有4张牌 我们不考虑具体花色 xff0c 我们只看数字组合 刻子 xff1a 三张一样的牌 xff1b 如 111
  • python3爬虫简单介绍

    本文是为了防止自己以后忘了 xff0c 小白可以参考 xff0c 大神请绕道 先来扫盲 xff0c 什么是爬虫 xff1a 爬虫就是一系列按照某种规则自动从网上爬取信息的代码或者脚本 本文代码功能 xff1a 从百度百科里面爬取20个和py
  • python3 使用urllib.request.urlopen及re.findall爬取网页图片并保持本地

    本例使用urllib及re正则表达式 xff0c 爬取网页上 xff08 王俊凯百度百科 xff09 所有以jpg结尾的图片 xff0c 并保存本地 import re from urllib span class token punctu
  • python3 爬取网页内容解析并存入MySQL数据库

    爬取网页内容解析并存入MySQL数据库 用到的第三方库 xff1a BeautifulSoup xff1a 解析网页内容 xff0c 建议安装方法 xff1a pip install beautifulsoup4 pymysql xff1a
  • python二维列表按照某列(字符串列)排序;忽略大小写+区分大小写

    python二维列表按照某列 xff08 字符串列 xff09 排序 xff1b 忽略大小写 43 区分大小写 使用list自带的sorted 方法 xff0c data 61 sorted data key 61 lambda x x 1
  • tkinter 出现两个窗口 tk(未响应) 解决方法

    问题 xff1a tkinter界面开发 xff0c 莫名出现一个叫 tk 未响应 的小窗口 xff0c 最后发现是因为自定义了窗口图标导致产生多余窗口 解决方法 xff1a 将设置窗口图标代码放到设置窗口大小代码之后即可 xff08 该方
  • python3适配pykml教程

    pykml是用python2写的 xff0c 由于python3和python2语法及函数名有所不同 xff0c python3使用的时候需要手动修改几个地方 xff0c 如下 xff1a 1 出现 xff1a ModuleNotFound
  • c51单片机学习笔记-独立按键实验

    目的 xff1a 通过开发板上的独立按键 K1 控制 D1 指示灯亮灭 编译软件 xff1a keil5 过程 xff1a xff08 1 xff09 定义独立按键控制脚 sbit KEY1 61 P3 1 sbit KEY2 61 P3
  • openpyxl为指定区域设置边框为粗匣框线

    前言 xff1a 最近在用openpyxl分析Excel数据 xff0c 为了让表格层次更分明 xff0c 想给制定区域添加粗匣框线 xff0c 网上没有找到现成的方法 xff0c 自己摸索了一下 xff0c 终于解决了 xff0c 现在记
  • ubuntu上网问题以及ping通网络设备

    问题一 xff1a ubuntu上网问题 如何ping www baidu com Ubuntu上网模式有两种 xff1a 桥接和NAT 1 桥接模式 xff1a 前提是 xff1a 主机是连接的无线网 xff0c 主机有线网卡的IP设置的
  • Python脚本调用C++动态库,C++调用Python脚本实操

    一 Python调用C 43 43 动态库 实现方法 xff1a 使用python 的ctypes 模块加载dll 首先 xff0c 需要用VS创建一个dll动态库 xff0c 网上方法很多 xff0c 就不细说了 xff0c 代码如下 x
  • 利用GPU训练时的常见错误

    1 CUDA VIDIBLE DEVICES 61 4 5 python3 main py 我想在集群条件下利用4 5号GPU xff0c 由于模型较小 xff0c 并不清楚是都可以指定4 5号GPU xff08 内存占用情况看不出来 后续
  • Jetson TX1底板的接口调试

    1 I2C总线上外设查询 I2C Tools的安装和使用 在控制台输入 sudo apt get install i2c tools 安装完成后可以使用命令验证安装成功 sudo i2cdetect l I2C设备查询使用 sudo i2c
  • 驱动——platform驱动总线三种匹配方式

    三种platform驱动匹配方式代码案例以及现象 方式一 xff1a 通过设置名字进行匹配 相关API简介 xff1a 1 platform device的API 分配对象 struct platform device const char
  • 开源框架APM工具--SkyWalking原理与应用

    一 分布式链路追踪简介 随着业务系统的不断发展 微服务架构的演进 xff0c 从原来的单体应用架构 垂直应用架构 分布式 SOA 架构到现在的微服务架构 xff0c 系统逐步走向微服务化以适应用户高并发请求等需求 在微服务架构中 xff0c