所有的代码分析基于pinpoint 1.6.2
常用配置
-
profiler.sampling.enable=true
是否进行采样,true表示开启采样,如果关闭采样,将不进行trace
-
profiler.sampling.rate=100
采样率:表示每profiler.sampling.rate次请求,进行一次trace
例如,100表示1/100,1表示每次请求都trace
-
profiler.io.buffering.enable=true
是否开启span缓冲,默认开启(即trace的span先缓冲再发送,减轻发送的压力)
-
profiler.io.buffering.buffersize=20
缓冲的span个数
-
profiler.xx.xx=true
是否开启该插件的trace,例如tomcat:
profiler.tomcat.enable=true
通信相关
-
profiler.collector.ip=trace.tv.sohuno.com
agent与collector通信的ip地址,不能是ip列表,只能是单个ip或者域名
-
span发送(UDP协议)
profiler.collector.span.ip=${profiler.collector.ip} profiler.collector.span.port=9996 # 下面这些选项在3.agent通信里说过,这里不再解释 profiler.spandatasender.write.queue.size=5120 #profiler.spandatasender.socket.sendbuffersize=1048576 #profiler.spandatasender.socket.timeout=3000 profiler.spandatasender.chunk.size=16384 profiler.spandatasender.socket.type=OIO
-
agent stat发送(UDP协议)
profiler.collector.stat.ip=${profiler.collector.ip} profiler.collector.stat.port=9995 # 下面这些选项与spandatasender的类似,这里不再解释 profiler.statdatasender.write.queue.size=5120 #profiler.statdatasender.socket.sendbuffersize=1048576 #profiler.statdatasender.socket.timeout=3000 profiler.statdatasender.chunk.size=16384 profiler.statdatasender.socket.type=OIO
-
agent info发送(TCP协议)
profiler.collector.tcp.ip=${profiler.collector.ip} profiler.collector.tcp.port=9994 # 发送间隔,单位毫秒,默认每5分钟发送一次 profiler.agentInfo.send.retry.interval=300000
-
agent tcp相关配置
# agent是否支持接受command profiler.tcpdatasender.command.accept.enable=true # agent是否支持活跃线程command profiler.tcpdatasender.command.activethread.enable=true # agent是否支持活跃线程数量command(dashboard里选择实时监控,活跃线程数展示) profiler.tcpdatasender.command.activethread.count.enable=true # agent是否支持线程dump command profiler.tcpdatasender.command.activethread.threaddump.enable=false # agent是否支持活跃轻量线程command profiler.tcpdatasender.command.activethread.threadlightdump.enable=true
关于profiler.tcpdatasender.command.activethread.enable:它是总开关,详见如下代码
public ActiveThreadService(ProfilerConfig profilerConfig, ActiveTraceRepository activeTraceRepository) { serviceList = new ArrayList<ProfilerCommandService>(); if (!profilerConfig.isTcpDataSenderCommandActiveThreadEnable()) { return; } if (profilerConfig.isTcpDataSenderCommandActiveThreadCountEnable()) { serviceList.add(new ActiveThreadCountService(activeTraceRepository)); } if (profilerConfig.isTcpDataSenderCommandActiveThreadLightDumpEnable()) { serviceList.add(new ActiveThreadLightDumpService(activeTraceRepository)); } if (profilerConfig.isTcpDataSenderCommandActiveThreadDumpEnable()) { serviceList.add(new ActiveThreadDumpService(activeTraceRepository)); } }
关于活跃轻量线程的理解
一般情况下,线程的dump需要使用MBean的方式(ThreadMXBean),如果在高负载的线上环境执行,可能会造成某些性能问题。
pinpoint会让trace对象持有当前线程,同时会统计活跃的trace,这样通过trace即可统计出线程的状态,比如线程名,id,状态,而不用获取整个堆栈。
trace自身相关
-
profiler.interceptorregistry.size=8192
最大支持多少个拦截器注册,默认8192个
所谓拦截器注册,是指plugin里注册的拦截器,以jetty插件的代码为例:
handleMethodEditorBuilder.addInterceptor("com.navercorp.pinpoint.plugin.jetty.interceptor.ServerHandleInterceptor", va(config.getJettyExcludeUrlFilter()));
-
profiler.callstack.max.depth=64
一个span中,持有的callstack的最大深度,span是一系列本地方法的调用,也就是调用的最大深度。
这块相关的内容可以参考
2.agent追踪的trace结束
部分。 -
profiler.interceptor.exception.propagate=false
拦截器遇到异常后,是否需要抛出,默认不抛出,即应用程序不会接到拦截器抛出的异常,但是日志里会进行记录。
-
profiler.instrument.engine=ASM
字节码注入引擎,默认为ASM,还支持JavaAssist
-
java字节码dump相关
# java bytecode dump option bytecode.dump.enable=false #bytecode.dump.classlist=com.pinpoint.user.UserService,com.pinpoint.debug.TestClass bytecode.dump.classlist= bytecode.dump.bytecode=false bytecode.dump.verify=false bytecode.dump.asm=false
-
profiler.entrypoint=
用户自定义trace的方法,逗号分隔列表,例如:
foo.bar.MyClass.myMethod, foo.bar.MyClass.anotherMethod
各个插件自身的配置
各个插件处理可以是否禁用外,还有一些额外的配置可以使用,这里不再一一列举
未使用的配置
可能是由于历史原因,有一些配置并没有看到使用的地方,在这里列出来
-
profiler.enable=true
是否开启trace
-
profiler.jvm.collect.interval=1000
-
profiler.applicationservertype=TOMCAT
servertype会自动检测,不用指定
-
profiler.type.detect.order=
servertype检测顺序,不用指定
-
profiler.plugin.disable
禁止插件的完成类名,一般每个插件单独设置,这里不使用
-
profiler.include=
用户指定要trace哪几个类,已废弃