分布式虚拟跟踪

跟踪提供了对系统的可见性,使开发人员和操作人员可以在运行时观察应用程序。 当系统不断增长并与更多微服务进行交互时,跟踪变得非常有价值。 在这样的环境中,这些痕迹非常棒,可以定位导致性能下降的故障和瓶颈。

在这篇文章中,我们将帮助您详细了解跟踪。 我们将通过示例跟踪事件和问题管理过程中如何使用跟踪。

什么是痕迹?

在检查如何捕获跟踪及其组成之前,让我们看一下跟踪的正式定义:

这样,您可以将跟踪视为一棵树,其根节点是用户进行的交互,并且这些节点代表所有参与处理请求和准备响应的微服务。

分布式跟踪的外观如何?

上面的示例说明了一个由七个跨度组成的迹线。 要了解跨度和轨迹,请看一下定义:

  • 跟踪公开了通过分布式系统的执行路径。 迹线由一个或多个跨度组成。
  • 跟踪中的跨度代表执行路径中的一项微服务。 例如,信用评分检查可能是贷款申请处理过程中的跨度。 跨度可以创建多个子跨度,而一个子跨度恰好具有一个父跨度。

因此,将跨度组合成一条轨迹可以揭示如何处理请求在整个分布式系统中的流动。 可视化跟踪使用父子表示法来显示跨度之间的依赖性以及每个跨度执行所需的时间。

如何捕获跟踪?

所有跟踪解决方案都要求参与处理入站请求的微服务由代理库进行检测。 每个此类代理库都捕获跟踪的一部分,并将其发送到组成跟踪的中央服务器。 要了解它是如何工作的,让我们看一个示例电子商店,该例子说明了跟踪捕获:


每当请求到达系统边界时,代理会通过监视第一个节点为它分配一个唯一的ID。 该标识符称为跟踪ID。

E-shop前端节点处理入站请求,并决定调用下游的SubmitOrder微服务。 这样做时,它通常使用自定义HTTP标头将跟踪ID传递到下游。

SubmitOrder微服务会在HTTP标头中发现跟踪ID。 这使SubmitOrder可以将其跨度与E-shop父级链接。

处理请求时, submitOrder微服务发现它需要调用checkInventory微服务。 再次通过向下游传递跟踪ID来实现。 checkInventory微服务现在是此树中的终端节点,没有子依赖项。 因此,它仅处理请求并将响应发送回父级。 完成此操作后, checkInventory微服务中的整个范围就准备好了。

在SubmitOrder中间节点和E-shop父节点中也是如此。 跨度组成,配备有开始和结束时间戳记,并使用跟踪ID进行链接。

代理库捕获跨度后,它们会将跨度发送到集中式服务器。 在此服务器中,节点被组成跟踪并存储以进行查询。

该过程的结果是组成了完整的痕迹。 在上面的示例中,组合的跟踪看起来类似于以下内容:

代理商如何工作?

可以使用两种不同的方法来构建从单个微服务捕获跨度的代理:

跟踪器库 (例如Zipkin , OpenTracing和Jaeger)使应用程序开发人员可以检测代码并将跨度发送到集中式服务器。 它们提供了最常用的语言和框架的库,并在缺少支持的情况下使用户能够构建自己的库

举例说明如何使用Zipkin来检测PHP微服务的示例可能会给您一个想法:

SubmitOrder微服务会在HTTP标头中发现跟踪ID。这使SubmitOrder可以将其跨度与E-shop父级链接。 

处理请求时, submitOrder微服务发现它需要调用checkInventory微服务。 再次通过向下游传递跟踪ID来实现。 checkInventory微服务现在是此树中的终端节点,没有子依赖项。 因此,它仅处理请求并将响应发送回父级。 完成此操作后, checkInventory微服务中的整个范围就准备好了。

这种方法有其缺点-从将跟踪库引入微服务的示例可以看出,需要更改代码才能捕获所需的信息。 要在大型组织中实现这一目标,而由不同团队开发和维护数十甚至数百个微服务,可能是一个艰巨的挑战。

基于代理的解决方案(例如NewRelic或DataDog或我们自己的Plumbr)使用应用程序运行时中的低级挂钩来对微服务进行检测。 代理已附加在应用程序配置中,不需要更改代码。

例如,使用Plumbr Java Agent进行跟踪等效于仅更改JVM启动参数,类似于:

SubmitOrder微服务会在HTTP标头中发现跟踪ID。这使SubmitOrder可以将其跨度与E-shop父级链接。 

处理请求时, submitOrder微服务发现它需要调用checkInventory微服务。 再次通过向下游传递跟踪ID来实现。 checkInventory微服务现在是此树中的终端节点,没有子依赖项。 因此,它仅处理请求并将响应发送回父级。 完成此操作后, checkInventory微服务中的整个范围就准备好了。

因此,推出基于代理的解决方案更加简单,尤其是在管理更大的部署时。 但是,大多数基于代理的解决方案都是商业的, 而不是开放源代码的跟踪器库,因此涉及一些成本。

标记轨迹和跨度

迹线和跨度倾向于被标记以支持分析迹线的多维查询。 常用标签的一些示例:

  • 用户身份
  • serverId
  • clusterId
  • API端点
  • HTTP响应码

使用标签,可以轻松回答不同的问题:

  • 此微服务中的哪个API端点已损坏?
  • 该前端中哪些API端点最慢?
  • 哪些用户遇到了错误?
  • 罪魁祸首是哪个微服务?

良好的跟踪提供程序将不同的维度无缝集成到产品UI和警报设置中,因此您可以避免使用数百万条单独的跟踪,而是立即而及时地获得宝贵的见解。

带走

跟踪是一种非常强大的诊断工具,尤其是在应用于分布式环境时。 由于可以在执行路径中观察每个单独的请求,因此问题得以解决。 借助标签,可以公开分析查询,从而使影响估算变得微不足道。

翻译自: https://www.javacodegeeks.com/2020/02/distributed-tracing-for-dummies.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 删除数组的空元素,php删除数组空元素的方法_后端开发

php如何实现自动跳转_后端开发php实现自动跳转的方法:1、通过php内置函数“header”,将http响应头中的“Location”设置为要跳转的URL即可;2、可以在javascript代码中将“window.location.href”指向要跳转的URL即可。php删除数组空元素的方法…

map for循环_JavaScript 用 for 循环太 low?你是不是有什么误解

天要吐槽下,我时不时地看到有些文章说“循环语句不好,你应该用 filter,map 和 reduce ”——每次看到有文章鼓吹,所有需要循环的场景一律用这几个函数式方法,我都恨得牙痒痒。没错,这些函数式方法确实有它们…

vue 动态组件组件复用_真正的动态声明性组件

vue 动态组件组件复用在这篇简短的文章中,我将重点介绍ADF动态声明性组件。 我的意思是一个众所周知的ADF标签af:declarativeComponent 。 它可以用作将页面设计为页面片段和组件组成的一种非常便捷的方法。 例如,我们的页面可以包含以下代码…

简单工程验收单表格_中铁超大型工程项目-123个精细化管理手册配套表格附件,超全...

中铁超大型工程项目-123个精细化管理手册配套表格附件,超全!什么是项目精细化?答:工程项目精细化管理是一个系统的管理体系,包含一系列管理制度和办法,除了《工程项目精细化管理办法》这个纲领性文件外&…

php 执行 javascript,Bash/PHP/Javascript:如何运行输出javascript的php文件,并执行该javascript?...

目前我试图发送一个webhook请求来争执,所以我可以发送更新到我的资源库到我的不一致服务器中的一个频道。如果我在浏览器中加载页面,它会运行此代码,并且该消息将出现在我的不一致中:$(document).ready(function(){setTimeout(sen…

递归分解WAR文件

抽象 是否曾经需要分解WAR文件以及分解WAR文件中的所有JAR文件? 是的,我也是! 我写了Ferris-war-exploder来爆炸: 一个JAR文件 一个WAR文件,它找到的每个JAR文件也会爆炸。 包含每个JAR文件(请参阅&…

判断unsigned long long乘法溢出_信息安全课程17:缓冲区溢出2

在之前所讲述的内容中,都是我们在自己的程序中自行修改的;正常情况下,没有程序员会在自己的代码中这样写——那有没有办法攻击别人正常的程序呢?攻击者怎么样能够影响到不是自己的程序的返回地址呢?以及怎么样通过攻击…

java 保垒机telnet,开源堡垒机系统Teleport

一. teleport简介Teleport是一款简单易用的堡垒机系统,具有小巧、易用的特点,支持 RDP/SSH/SFTP/Telnet 协议的远程连接和审计管理。Teleport由两大部分构成:跳板核心服务WEB操作界面官网地址: https://tp4a.com/ 官网文档: https://docs.…

choiceformat_ChoiceFormat:数字范围格式

choiceformatChoiceFormat类的Javadoc指出ChoiceFormat “允许您将格式附加到一系列数字上”,并且“通常在MessageFormat中用于处理复数”。 这篇文章描述了java.text.ChoiceFormat并提供了一些在Java代码中应用它的示例。 ChoiceFormat与java.text包中其他“ 格式…

python和rpa_什么是RPA

产品介绍阿里云RPA产品是一款新型工作流程自动化办公机器人软件,通过模拟人工操作进行自动流程执行处理。它可以将办公人员从每日的重复工作中解放出来,提高生产效率。具体而言,阿里云RPA是基于软件机器人和人工智能(AI,Artificia…

php背景图片随页面大小改变,css背景图根据屏幕大小自动缩放

css背景图根据屏幕大小自动缩放代码:html,body{margin:0px;padding:0px;}#background { position: fixed;top: 0;left: 0;width: 100%;height: 100%;overflow: hidden;background-color: #211f1f; display:none\8;}#background .bg-photo {position: absolute;top: …

Java –缺少字体–崩溃的应用程序!

Eclipse MAT和Heaphero都是分析大型堆转储的流行Java工具。 最近,当我们尝试在Eclipse MAT中分析堆转储文件时遇到了一个有趣的问题。 工具因缺少字体crash而崩溃。 我们认为我们将与您分享发现的结果。 CompositeStrike.getStrikeForSlot()…

forever不重启 node_运维监控Prometheus,部署安全的node_exporter监控主机

简介prometheus监控系统的时候,是使用pull的方式来获取监控数据,需要被监控端监听对应的端口,prometheus从这些端口服务中拉取对应的数据。node_exporter安全性讨论node_exporter是收集操作系统的指标的一个程序。例如CPU,内存&am…

netbeans ide_IDE:5个最喜欢的NetBeans功能

netbeans ide愉快的发展……。 NetBeans具有许多有趣的功能 ,这些功能使开发非常容易,只需很少的步骤,并且可以在非常快速地将产品推向市场的过程中创造出非常高效的环境 。 将我的谈话仅限于五个功能非常困难,而此IDE具有大量有…

python做excel麻烦_高效办公必备:别人通宵做的 Excel,我用Python 半小时搞定!

原标题:高效办公必备:别人通宵做的 Excel,我用Python 半小时搞定!最近经常听到周围的人抱怨:“工作忙,在加班……”不知不觉,当代职场人早就被“996”支配得体无完肤了,不仅身体吃尽熬夜加班的苦…

matlab resample,resample matlab实现

使用线性插值实现sample rate转换。function output simpleResample(input, inputfs, outputfs)inputLen length(input(:, 1));outputLen floor(inputLen * outputfs / inputfs);output zeros(outputLen, 1);timeStep inputfs / outputfs;curTime 1;integer 0;frac 0;f…

那是两个小时我不会回来

正如我之前关于linting主题所说的 ,花时间修改代码的好处很有限,因为自动工具告诉您这样做。 更糟糕的是,这些工具并非万无一失。 例如,我们一直在针对完美无害的try-with-resources构造周围的SpotBugs警告中添加排除项&#xff…

php助手函数自定义,Laravel 添加自定义助手函数

前言在学习完教程中添加自定义助手函数文件时,还是得记录一下,感觉对composer知道的东西太少了,一些命令到底做了什么还是不知道,总结一下。添加自定义助手函数文件在开发项目的时候,有时候会定义一些函数,…

oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...

作者:缪晓丽DBA、数据库爱好者、从业10年。对 DB2、PostgreSQL、Oracle 均有较长的运维经验。本次演示的 test 表如下:01Oracle 的 rowidSQL 语句:DELETE FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS rn, id, name…

jpa 实体映射视图_JPA教程:映射实体–第1部分

jpa 实体映射视图在本文中,我将讨论JPA中的实体映射过程。 至于我的示例,我将使用与 我以前的一篇文章中使用的模式相同的模式 。 在前两篇文章中,我解释了如何在Java SE环境中设置JPA。 我不打算为Web应用程序编写设置过程,因为…