侠梦说pinpoint--界面上的图标之AgetnInfo数据研究

前言
  • 在启动一个挂载pinpoint的springboot项目的时候,界面上显示成了jboss的图标,因此今天研究了一下这个数据是怎么来的。spring

  • 咱们知道不一样图标和服务类型有关,服务不一样,图标就不一样,这在代码里面使用一个ServiceType属性来描述。springboot

file

从agent启动开始
  • 咱们都知道pinpoint采用的是字节码注入来实现APM监控,由Agent采集数据上报给Collector,因此咱们的研究入口是agent下面的日志,启动过程当中输出以下:
Sending AgentInfo TAgentInfo....
 hostname:izwz98jc3nwxdjxg1yfd1hz, ip:172.xx.xx, ports:, 
 agentId:testboot_agentId, applicationName:testboot_45, 
 serviceType:1210, pid:28277, agentVersion:1.8.0,

 AgentInfo sent.
  • 这里会显示咱们配置的服务名,agentId、ip等参数。
  • agent信息由AgentInfoSendTask这个类定时生成发送。
  • 这几个数据在代码里面都是经过注解来获取的:
@AgentId String agentId, 
@ApplicationName String applicationName, 
@Container boolean isContainer, 
@AgentStartTime long agentStartTime, 
@ApplicationServerType ServiceType serverType
  • 那么由此可知,找到注入@ApplicationServerType的地方就是真相!

file

  • 研究出依赖关系以下:

file

  • 这里咱们只关注服务类型,读代码可知,启动时会读取agent配置,因此若是你想显示的指定服务类型,那么在agent的pinpoint.config中配置这个属性便可。
// service type
        this.applicationServerType = readString("profiler.applicationservertype", null);
  • 带着疑问继续,那么咱们通常也没有配置,它是如何识别不一样的类型的呢?
插件声明类型
  • 上一篇文章有说过ServiceType,不一样的插件须要声明一个code码来惟一标识。
  • 若是咱们没有显式配置profiler.applicationservertype,pinpoint会怎么处理呢?
  • 继续来看日志

file

  • 没错,就是UNDEFINED。没定义确定取不到值呀。app

  • 此时,pinpoint会获取全部已经注册的插件,调用他们的detect方法。若是校验经过,则直接返回插件中配置的serviceType。maven

boolean detect(ConditionProvider provider);
  • 若是都找不到就会返回:STAND_ALONE
ServiceType STAND_ALONE = of(1000, "STAND_ALONE", RECORD_STATISTICS);

file

  • 那为文章开头的那个图标不是springboot呢?
  • 借用下群友图片,咱们知道若是不配置,默认会去检测MAIN-CLASS的值有没有和pinpoint.config中的配置对应上。
    fileide

  • 一旦检测到,就返回对应插件的serverType,也就是SpringBoot。this

file

  • 我这里没有显示boot的缘由是,我使用maven原生的方式打包,将依赖包lib分离开了,启动的main-class不是上述配置哪些。
  • 至于为何显示成了jboss,是因为我配置了
profiler.jboss.traceEjb=false
profiler.applicationservertype=JBOSS

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

相关文章
相关标签/搜索