这篇文章主要是从pinpoint-web界面入手,咱们的目标是弄清楚两个问题:node
从下图能够看出,A显示被USER调用299次,线上数值表明着调用量。
咱们F12跟踪一下接口地址:web
http://webip:port/getServerMapDataV2.pinpoint?applicationName=A &from=1575337980000&to=1575338040000 &callerRange=1&calleeRange=1 &bidirectional=false&wasOnly=false &serviceTypeName=SPRING_BOOT &_=1575337947426
web上显示的数据,都是从hbase查询出来的,因此跟踪后端pinpoint-web工程源代码,咱们能够定位到hbase的一张表:ApplicationMapStatisticsCallee_Ver2。数据库
rowKey生成规则: ApplicationMapStatisticsUtils.makeRowKey(...); Qualify列名生成规则: ApplicationMapStatisticsUtils.makeColumnName(...);
咱们都知道,界面查询的时候能够选择Inboud和outboud,而且最大显示4X4的关系图,
因此在pinpoint设计的时候,就选择存储双向关系:(目的就是构造界面左侧的服务地图)。好比:后端
TOMCAT ===》调用 MYSQL则对调用者生成以下消息:api
emeroad-app (TOMCAT) -> MySQL_DB_ID (MYSQL)[10.25.141.69:3306]
而对被调用者MYSQL生成:app
MySQL (MYSQL) <- emeroad-app (TOMCAT)[localhost:8080]
hbase存储结构如上图所示,由于都是二进制,因此列1,其实也是byte,而不是固定的字符名。spa
#### 何时存储这个双向关系?设计
知道数据的底层存储结构了,下面,咱们继续来跟踪,它是如何存进来的,咱们搜索一下引用,发现,有5个地方调用了这个存储的api。
code
简单明了,那咱们就逐个击破把!blog
①SpanChunkHandler中
在chunk的结构中,要求有spanEventList这个数据,(由于调用量 和它内部的EVENTBo 条数 是1:1),而且须要知足isRecordStatistics记录条件。
当知足这两个条件时,就会生成 A->B, B<--A, 两个关系,使其左侧服务地图调用量+1。
其余位置逻辑相似,篇幅缘由,这里再也不细说。
② SpanHandler,112行
③ SpanHandler,117行
④ SpanHandler,127行
⑤ SpanHandler,189行
#### wasOnly的含义
private final int callerSearchDepth; private final int calleeSearchDepth; private final LinkSelectorType linkSelectorType; private final boolean wasOnly;
怎么去看呢?这里提供一种思路,可能不适合全部人,你们参考一下。
从定义的变量,去理解它的含义,而后去“猜”。
callerSearchDepth: 调用者查询深度。
calleeSearchDepth:被调用者搜索深度。
除了wasOnly 和linkSelectorType不知道具体含义,上面两个应该就是用来控制搜索深度的。那咱们继续跟踪代码:
这里经过判断是不是Was,新建了一个处理器。也就是说具体使用方法应该是在这个:
callerLinkDataMapProcessor 类中。
if (searchOption.isWasOnly()) { callerLinkDataMapProcessor = new WasOnlyProcessor(); }
看到这个类的accept方法相信你们,应该会有所敏感,这应该是用来判断过滤条件的.
从代码中能够看出,这里和Application有关,经过getServiceType
的两个方法来判断是否过滤。
有了这两个方法,就好办了,咱们直接找它的实现就好了。
根据依赖关系,咱们定位到了ServiceTypeFactory这个工厂类、DefaultServiceType及ServiceTypeProperty,具体查找方式能够经过观察这几个类了解,关系以下:
粗略的理解:WAS ONLY会过滤相似于数据库、或者是位置的节点,让界面展现清楚一些。
用程序思惟理解是:它会过滤掉serviceType为Unknown或者是Terminal的节点,具体哪些节点会有这两个属性呢,我想你们能够去自行研究研究。
// Callee node that agent hasn't been installed ServiceType UNKNOWN = of(1, "UNKNOWN", RECORD_STATISTICS);
研究的时候,贴的图文太多,我整理了word,这里就再也不多叙述了,有须要的小伙伴,能够加我,我发给你。欢迎关注侠梦的开发笔记
欢迎来公众号【侠梦的开发笔记】 一块儿交流进步