前言
一系列的服务上云后,可能分布在几千甚至几万台服务器上,服务与服务之间存在大量复杂的调用关系,而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的采样原理。
使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一)
一文让你理解什么是shallow heap及retained heap
我就知道你“在看”