侠梦说pinpoint--左侧服务地图调用量和WasOn过滤

2023-11-01 09:30

本文主要是介绍侠梦说pinpoint--左侧服务地图调用量和WasOn过滤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言
  • 这篇文章主要是从pinpoint-web界面入手,我们的目标是弄清楚两个问题:
    - 1、 pinpoint左侧服务地图上的调用量数据是怎么查询的?- 2、界面查询条件WasOnly是什么意思?
左侧服务地图调用量来源

        从下图可以看出,A显示被USER调用299次,线上数值代表着调用量。

file

我们F12跟踪一下接口地址:

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。

调用者(caller)和被调用者callee

rowKey生成规则
  • 细节可以跟踪源代码了解
rowKey生成规则:
ApplicationMapStatisticsUtils.makeRowKey(...);
Qualify列名生成规则:
ApplicationMapStatisticsUtils.makeColumnName(...);

我们都知道,界面查询的时候可以选择Inboud和outboud,并且最大显示4X4的关系图,所以在pinpoint设计的时候,就选择存储双向关系:(目的就是构造界面左侧的服务地图)。比如:

TOMCAT ===》调用 MYSQL则对调用者生成如下消息:

emeroad-app (TOMCAT) -> MySQL_DB_ID (MYSQL)[10.25.141.69:3306]

而对被调用者MYSQL生成:

 MySQL (MYSQL) <- emeroad-app (TOMCAT)[localhost:8080]

hbase存储

file

hbase存储结构如上图所示,因为都是二进制,所以列1,其实也是byte,而不是固定的字符名。

什么时候存储这个双向关系?

  • 知道数据的底层存储结构了,下面,我们继续来跟踪,它是如何存进来的,我们搜索一下引用,发现,有5个地方调用了这个存储的api。
    file
    • 简单明了,那我们就逐个击破把!

①SpanChunkHandler中

  • 在chunk的结构中,要求有spanEventList这个数据,(因为调用量 和它内部的EVENTBo 条数 是1:1),并且需要满足isRecordStatistics记录条件。
  • 当满足这两个条件时,就会生成 A->B, B<--A, 两个关系,使其左侧服务地图调用量 1。
    其他位置逻辑类似,篇幅原因,这里不再细说。
    • ② SpanHandler,112行
  • ③ SpanHandler,117行
  • ④ SpanHandler,127行
  • ⑤ SpanHandler,189行
wasOnly的含义

  • 还是通过上述的接口,我们可以跟踪到,请求的参数,被封装到了一个这些参数都被封装到了SearchOption这个类。
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方法相信大家,应该会有所敏感,这应该是用来判断过滤条件的.file

  • 从代码中可以看出,这里和Application有关,通过getServiceType
    的两个方法来判断是否过滤。
    • 有了这两个方法,就好办了,我们直接找它的实现就行了。
      根据依赖关系,我们定位到了ServiceTypeFactory这个工厂类、DefaultServiceType及ServiceTypeProperty,具体查找方式可以通过观察这几个类了解,关系如下:

file

结论
  • 粗略的理解:WAS ONLY会过滤类似于数据库、或者是位置的节点,让界面展示清楚一些。
  • 用程序思维理解是:它会过滤掉serviceType为Unknown或者是Terminal的节点,具体哪些节点会有这两个属性呢,我想大家可以去自行研究研究。
  • 我这里贴一个Unknown的,这个只有一个类型。
// Callee node that agent hasn't been installed
ServiceType UNKNOWN = of(1, "UNKNOWN", RECORD_STATISTICS);

  • 研究的时候,贴的图文太多,我整理了word,这里就不再多叙述了,有需要的小伙伴,可以加我,我发给你。欢迎关注侠梦的开发笔记

欢迎来公众号【侠梦的开发笔记】 一起交流进步

这篇关于侠梦说pinpoint--左侧服务地图调用量和WasOn过滤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/322070

相关文章

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

java streamfilter list 过滤的实现

《javastreamfilterlist过滤的实现》JavaStreamAPI中的filter方法是过滤List集合中元素的一个强大工具,可以轻松地根据自定义条件筛选出符合要求的元素,本文就来... 目录1. 创建一个示例List2. 使用Stream的filter方法进行过滤3. 自定义过滤条件1. 定

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务