初识Pinpoint
Pinpoint简介
Pinpoint是一个用Java/PHP语言为大规模分布式系统开发的APM (Application Performance Management)工具。它受到了Google Dapper的启发(官方介绍链接地址:https://ai.google/research/pubs/pub36356)。Pinpoint通过跟踪分布式应用程序之间的调用(transaction),为帮助分析系统的整体结构以及它们中的组件如何相互连接,提供了一种解决方案。
备注:Pinpoint的官方介绍中大量使用了transaction这个单词,笔者认为翻译成调用更好,这个transaction就是TPS中的T。
如果你有如下的需求,那么你一定要体验一下Pinpoint:
了解你应用的拓扑图;
实时监控你的应用;
获取每个调用代码级可见性;
不需要修改任何代码就能安装APM代理;
对性能有很小的影响;
带来什么
今天的服务通常由许多不同的组件组成,彼此之间进行通信,并且通过API调用外部服务。如此一来,每个调用如何执行对程序员来说就成了黑盒,跟踪问题变得异常艰难。Pinpoint追踪这些组件之间的调用流,并且为确定问题范围和潜在的性能瓶颈提供了一个非常清晰的试图。
部署Pinpoint后,能为我们的服务带来的好处有:
ServerMap - 通过可视化分布式系统各个组件如何互联来了解分布式系统的拓扑图。点击任意一个节点能够得到这个组件的细节,例如:当前状态,事务数。
Realtime Active Thread Chart - 实时监控应用内部活动线程数。
Request/Response Scatter Chart - 随着时间的推移可视化请求和响应概要信息从而识别潜在问题。并且通过拖动图表可以选择某个时间范围内获取调用的更多细节(如下图所示的红色框所示,用鼠标画一个范围框即可,这个操作有点骚气
^_^
)。
CallStack - 获得分布式环境中每个调用代码级别的可见性,从而在单个视图中识别瓶颈和故障点。
Inspector - 观测应用额外的细节,例如:CPU使用率,内存和垃圾回收,TPS和JVM参数等。
安装
本文以安装Pinpoint 1.8.2
为例。
Pinpoint由三个主要的组件组成:Collector, Web, Agent,使用HBase作为它的存储。 Collector 和Web 被打包成一个简单的WAR包。 Agent被打成jar包,以便作为java agent附加到应用上。 所以,如果要安装Pinpoint,就需要安装如下4个组件:
HBase
Pinpoint Collector
Pinpoint Web
Pinpoint Agent
MySQL(可选)
说明:如果需要维护用户、用户组和告警配置,那么还需要部署MySQL。
接下来一步一步讲解如何部署Pinpoint环境。
HBase
由于Pinpoint只能使用HBase作为它的存储,所以,必须要安装HBase。如何选择HBase版本,请参考下图。笔者安装Pinpoint1.8.2,所以,HBase选择1.2.10。
说明:笔者这里只安装HBase的单机模式,如果你要试试分布式模式,请参考:http://hbase.apache.org/book.html#distributed。
安装JDK
由于HBase运行在JVM上,所以安装HBase的第一步是安装JDK。至于HBase和JDK版本的关系,请参考下图:
笔者选择目前使用最广泛的JDK8,安装非常简单,就不过多介绍了。
安装HBase
安装HBase大概需要这几步:下载、配置、运行,非常简单:
下载:链接地址为 http://mirrors.hust.edu.cn/apache/hbase/hbase-1.2.10/,然后下载hbase-1.2.10-bin.tar.gz,注意不要下载hbase-1.2.10-src.tar.gz(不推荐编译部署)
解压:tar xzvf hbase-1.2.10-bin.tar.gz
切换目录:cd hbase-1.2.10/
设置JAVA_HOME:在配置文件conf/hbase-env.sh中设置即可,例如:JAVA_HOME=/app/jdk1.8.0_162/
修改配置文件:修改配置文件conf/hbase-site.xml(此文件默认为空,请参考下面的
hbase-site.xml参考
)运行HBase:执行命令bin/start-hbase.sh即可运行HBase
创建Schema:创建运行Pinpoint需要的表 bin/hbase shell hbase-create.hbase(hbase-create.hbase这个脚本所在地址:https://github.com/naver/pinpoint/tree/master/hbase/scripts)
访问HBase Web UI:http://localhost:16010/master-status (请适配IP地址)
访问Web UI,能够看到安装的HBase有一个Region服务,以及刚才为了运行Pinpoint而创建的表:
说明:HBase启动成功后,通过jps -l | grep HMaster
命令能够看到一个org.apache.hadoop.hbase.master.HMaster
的进程,说明HBase部署成功。需要说明的是HBase单机模式下,所有守护进程都在一个JVM中,例如:HMaster,HRegionServer和ZooKeeper。由于部署的是单机版的HBase,所以HBase使用自带的zookeeper,那么export HBASE_MANAGER_ZK=true
(如果是生产环境使用独立的zookeeper,那么需要在conf/hbase-env.sh中配置export
HBASE_MANAGER_ZK=false)。
hbase-site.xml参考
重点修改hbase.rootdir
和hbase.zookeeper.property.dataDir
两个属性的值,并且这两个路径不需要手动创建,HBase会自动创建,当然前提是启动HBase的用户有创建权限:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///data/pinpoint/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/data/pinpoint/zookeeper</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
<description>
hello, HBase !
</description>
</property>
</configuration>
HBase单机模式安装参考:http://hbase.apache.org/book.html#quickstart。
Pinpoint
接下来介绍如何安装Pinpoint。
安装Pinpoint几个组件的第一步就是下载安装包,下载地址为:https://github.com/naver/pinpoint/releases/tag/1.8.2。 三个安装包pinpoint-agent-1.8.2.tar.gz、pinpoint-collector-1.8.2.war、pinpoint-web-1.8.2.war都需要下载。
Apache Tomcat
由于Pinpoint的web和collector还是非常落后的war包,所以需要下载tomcat,由于选择了JDK8,所以tomcat也选择tomcat8,下载地址:https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.38/bin/ 。安装方式就不过多介绍了,因为太简单了。
Pinpoint Collector
Pinpoint Collector建议部署成ROOT应用(即访问路径没有上下文):
rm -rf tomcat8-collector/webapps/ROOT/
unzip pinpoint-collector-1.8.2.war -d tomcat8-collector/webapps/ROOT/
启动web容器之前,需要先修改webapps/ROOT/WEB-INF/classes/目录下的两个配置文件pinpoint-collector.properties和hbase.properties中的一些配置(也可以用默认端口):
pinpoint-collector.properties :
collector.tcpListenPort (agent’s profiler.collector.tcp.port - default: 9994)
collector.udpStatListenPort (agent’s profiler.collector.stat.port - default: 9995)
collector.udpSpanListenPort (agent’s profiler.collector.span.port - default: 9996)
hbase.properties
hbase.client.host (default: localhost)
hbase.client.port (default: 2181)
Pinpoint Web
强烈建议使用Google Chrome浏览器访问Pinpoint Web UI。
Pinpoint Web要部署成ROOT应用(即访问路径没有上下文):
rm -rf tomcat8-web/webapps/ROOT/
unzip pinpoint-web-1.8.2.war -d tomcat8-web/webapps/ROOT/
启动web容器之前,需要先修改webapps/ROOT/WEB-INF/classes/目录下的两个配置文件pinpoint-web.properties和hbase.properties中的一些配置:
pinpoint-web.properties :
cluster.zookeeper.address (default: localhost)
admin.password (default: admin)
hbase.properties
hbase.client.host (default: localhost)
hbase.client.port (default: 2181)
Pinpoint agent
解压下载的文件pinpoint-agent-1.8.2.tar.gz后,你应该看到如下文件目录结构:
pinpoint-agent
|-- boot
|-- lib
|-- log
|-- `pinpoint-bootstrap-1.8.2.jar`
|-- `pinpoint.config`
|-- pinpoint-real-env-lowoverhead-sample.config
|-- plugin
|-- script
|-- tools
Pinpoint agent作为一个java agent附在运行的应用上的。为了给应用集成Pinpoint只需要添加如下三个参数:
-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar
- 即将Pinpoint作为一个java agent运行。-Dpinpoint.agentId
- 唯一标识运行agent程序的应用实例,一个JVM实例对应一个agentId,必须全局唯一,例如-Dpinpoint.agentId=usercenter122,-Dpinpoint.agentId=usercenter123。-Dpinpoint.applicationName
- 组合若干个相同的应用实例为一个服务,例如若干个用户服务都配置-Dpinpoint.applicationName=usercenter。
pinpoint.config
重点需要关注配置文件pinpoint.config中如下几个配置项:
profiler.collector.ip=172.29.0.1
profiler.collector.span.ip=${profiler.collector.ip}
profiler.collector.span.port=9996
profiler.collector.stat.ip=${profiler.collector.ip}
profiler.collector.stat.port=9995
profiler.collector.tcp.ip=${profiler.collector.ip}
profiler.collector.tcp.port=9994
接下来介绍两种最常用的服务部署形式tomcat和springboot,说明服务如何集成Pinpoint。
tomcat示例
修改catalina.sh即可:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/app/pinpoint-agent/pinpoint-bootstrap-1.8.2.jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=$AGENT_ID"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=$APPLICATION_NAME"
springboot示例
java -jar demo-1.0.0-SNAPSHOT.jar
修改为:
java -jar -javaagent:/app/pinpoint-agent/pinpoint-bootstrap-1.8.2.jar -Dpinpoint.agentId=$AGENT_ID -Dpinpoint.applicationName=$APPLICATION_NAME demo-1.0.0-SNAPSHOT.jar
检查状态
接下来通过访问Pinpoint的Web UI 进行验证: http://localhost:28080(ip和host是部署pinpoint-web的tomcat的服务器ip和配置的port)
附:Pinpoint最近几个版本重要更新
下面列举Pinpoint-1.7以后几个版本更新的关键特性,。
1.8.2
Bug Fix for MongoDB
Bug Fix for Undertow in SpringBoot
支持Kafka 2.0.0+
1.8.1
支持JDK11;
支持HBase;
支持MongoDB;
支持Apache Openwhisk;
支持Druid;
支持gRPC;
支持Lettuce;
支持fastjson;
支持spring-kafka;
1.8.0
支持jdk9和jdk10;
支持WEB容器(JBoss,Jetty,Resin,Tomcat,Websphere,Weblogic)的异步通信;
支持kafka;
支持akka-http;
支持undertow;
支持spring异步通信;
支持weblogic;
开始收集Direct/Mapped Buffer Metric,Open File Descriptor Metric;
1.7.3
Bug Fix RabbitMQ plugin;
Bug Fix Dubbo plugin;
1.7.2
支持RabbitMQ,;
支持ActiveMQ;
1.7.1
Bug Fixes;
1.7.0
支持VertX;
支持RxJava1.x;
支持Hystrix;
支持JSP;
支持Netty;
支持MySQL connector 6;
增加对应用的Inspector;
支持监控代理服务器;
线程死锁探测;
支持显示平均响应时间(Avg Response Time);
附:Pinpoint支持组件
JDK 6~11
Tomcat 6/7/8/9, Jetty 8/9, JBoss EAP 6/7, Resin 4, Websphere 6/7/8, Vertx 3.3/3.4/3.5, Weblogic 10/11g/12c, Undertow
Spring, Spring Boot (Embedded Tomcat, Jetty, Undertow), Spring asynchronous communication
Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient, Akka-http, Apache CXF
Thrift Client, Thrift Service, Dubbo Provider, Dubbo Consumer, gRPC
ActiveMQ, RabbitMQ, Kafka
MySQL, Oracle, MSSQL(jtds), CUBRID, PostgreSQL, MariaDB
Arcus, Memcached, Redis(Jedis, Lettuce), Cassandra, MongoDB, Hbase
iBATIS, MyBatis
DBCP, DBCP2, HikariCP, Druid
gson, Jackson, Json Lib, Fastjson
log4j, Logback
参考链接
http://naver.github.io/pinpoint/1.8.2/installation.html