分布式链路追踪工具pinpoint采样率原理分析

前言

一系列的服务上云后,可能分布在几千甚至几万台服务器上,服务与服务之间存在大量复杂的调用关系,而pinpoint在采集这些服务数据时,同样会产生大量的报文。

在naver公司的在线门户服务有海量请求。单个服务每天处理超过200亿请求。如果要跟踪所有的请求,解决的办法是需要添加足够多的网络设施和服务器来来支撑收集数据。

但是对于这种非核心生产的监控系统来说,是很不划算的,浪费金钱又浪费资源。

什么是采样率

在Pinpoint中,可以收集设置采样,而不必跟踪每个请求。在开发环境中请求量很小,每个数据都收集。而在产品环境请求量巨大,收集小比率的数据如1~5%,足够检查整个应用的状态。采样之后,可以最小化应用的网络开销并降低诸如网络和服务器的设施费用。

pinpoint的采样率是如何配置的?

对应的配置项在agent下的pinpoint.config文件中。

# Allow sampling.
profiler.sampling.enable=true

# 1 out of n transactions will be sampled where n is the rate. (20: 5%)
profiler.sampling.rate=1

# 1 out of n entities will be sampled where n is the rate. (10: 10%)
profiler.apache.httpclient4.entity.sampling.rate=1

首先采样率有开关配置。默认"profiler.sampling.rate=1"表示全部

Pinpoint 支持计数采样,如果设置为10则只采样10分之一的请求。我们计划增加新的采样器来更有效率的收集数据。

很多小伙伴,看到采样率配置,以为是配置的百分比,上来就配一个0点几,其实不是的,这里我们简单来理解一下,我们只需要关注分母即可,比如要配10%的采样,那么设置这个属性的值为10即可。

pinpoint内部用的依赖注入框架Google Guice

pinpoint内部的是否采样和采样率,是通过Sampler对象来封装的。

可以看到是通过com.google.inject.Inject注解来进行依赖注入的。

内部使用的是Google Guice ,它一个轻量级的依赖注入框架。和spring不同的是:Spring 耦合度低,而Guice 耦合度高,代码级的标注,DI 标记 @inject 侵入代码中,耦合到了类层面上来。

Guice 使用注解 Annotation,cglib, 效率高,这是与与 Spring 最明显的一个区别,Spring 是在装载配置文件的时候把该注入的地方都注入完,而 Guice 呢,则是在使用的时候去注射,运行效率和灵活性高。

pinpoint采样原理

某条请求是否被采样,取决于整个链路开始的机器。该机器使用特定的采样算法。采样的标志会一直在链路中透传。比如在http里面,会在header里面增加Pinpoint-Sampled字段,使用不同的值表示是否采样。

上图显示pinpoint具体会使用到的一些Header。

具体的判断逻辑,是通过SamplingFlagUtils类来实现的。

代码层面的配置学习

其实,代码层面很简单,就是判断,如果不采样,那就不发送大量的报文就行。

但是!

你总得告诉下游吧,不然怎么串联起来呢,当然每个agent可以单独有自己的采样配置, 最好还是保持一致。

以httpclient4的插件为例。

从当前上下文里面获取Trace对象,并判断是否采样,其Trace体系如下图所示:

发送端采样处理

在请求发送到下游的机器之前,会从当前上下文里面获取Trace对象。

如果不采样,则尝试在http头部写入Pinpoint-Sampled=s0, 其他信息都不传递。

如果为需要采样,则不设置Pinpoint-Sampled字段,只设置其他trace相关字段,比如Header.HTTP_TRACE_ID等。

接收端采样处理

在服务端收到请求之后,会去查看请求里面是否有Pinpoint-Sampled字段和Pinpoint-TraceID等字段。分为下面几种情况:

有Pinpoint-Sampled字段,并且值为s0,表示此条请求不采样。

没有Pinpoint-Sampled字段,但是有Pinpoint-TraceID等字段,表示此条请求被采样。

没有Pinpoint-Sampled字段,也没有Pinpoint-TraceID等字段,认为接收该请求的机器,是整条链路的第一个机器,或者链路信息在前面有丢失。

总结

在系统完成一次业务调用的过程中,会产生很多的调用链打点数据,在业务量大的时候,这些数据可能同样会成为我们系统的负担,所以对数据采样很有必要,在保证样本充足的情况下,同样能够进行数据分析和定位系统性能瓶颈,快速定位异常的服务。本篇文章我们介绍了如下内容:

  • pinpoint采样率的概念和应用。

  • pinpoint采样率的配置。

  • pinpoint使用的依赖注入框架Google Guice和spring的对比。

  • pinpoint的采样原理。

可视化界面在线生成JVM参数

java内存溢出问题分析过程二(附MAT超全操作文档)

使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一)

一文让你理解什么是shallow heap及retained heap

内存分析诊断系列-理解heap dump

记一次服务器被当肉鸡挖矿的经历

如何编写一个可复用的SpringBoot应用运维脚本

高效率编写Dockerfile需要绕过的一些坑

Mysql百万量级数据高效导入Redis

多线程之CountDownLatch的用法及原理笔记

我就知道你“在看”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链路追踪是一种监控和调试技术,可以追踪分布式应用程序中的请求流和代码执行路径。在PHP应用程序中,常见的链路追踪工具包括Xdebug、Blackfire和Pinpoint等。而Easyswoole是一款基于Swoole扩展的高性能PHP框架,它内置了链路追踪功能,可以帮助开发者更方便地进行应用程序的监控和调试。 Easyswoole的链路追踪功能通过在应用程序中插入一些特殊的代码来实现。在每个请求到达应用程序时,链路追踪会生成一个唯一的ID,并将该ID添加到请求头中。然后,在应用程序中的每个关键节点处,链路追踪会将该ID记录下来,以便后续的跟踪和监控。最终,链路追踪会将所有的信息汇总成一个完整的请求流,以供开发者进行分析和优化。 要使用Easyswoole的链路追踪功能,你需要在应用程序中先安装和配置Easyswoole框架。具体步骤可以参考官方文档:https://www.easyswoole.com/Manual/3.x/Cn/_book/Introduction/installation.html 安装完成后,在应用程序中引入链路追踪组件即可: ```php use EasySwoole\Tracer\Trace; // 生成唯一ID $traceId = Trace::getInstance()->newId(); // 在请求头中添加ID $httpResponse->withHeader('X-Trace-Id', $traceId); ``` 在应用程序的关键节点处,你可以使用`Trace`类来记录信息: ```php use EasySwoole\Tracer\Trace; // 记录当前节点信息 Trace::getInstance()->addNode('node1', 'some message'); // 记录子节点信息 $span = Trace::getInstance()->span('node2'); $span->log('some message'); $span->finish(); ``` 最后,你可以使用Easyswoole提供的监控面板来查看完整的请求流程和性能数据。具体使用方法请参考官方文档:https://www.easyswoole.com/Manual/3.x/Cn/_book/Components/Tracer.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值