介绍与准备
PinPoint是一款无侵入式的开源APM监控工具,在被测试的Tomcat项目中打入探针,就可以监控整套程序。
为了安装与测试PinPoint,在此创建了两台虚拟机
虚拟机 | 系统 | IP | 描述 |
---|---|---|---|
虚拟机-1 | CentOS 7.0 | 10.100.192.140 | 监控端,安装了Hbase数据库,PinPoint-Collector,以及PinPoint-Web |
虚拟机-2 | CentOS 7.0 | 10.100.192.26 | 被监控端,部署了一个测试项目与PinPoint-Agent |
安装部署过程需要的所有脚本、安装包等都已上传至百度云,有需自取。
- 其中pp_res文件夹中的内容是虚拟机-1即监控端需要的,包括jdk、tomcat、hbase、pinpoint-collector、pinpoint-web、zookeeper(本文未用到zookeeper),以及hbase建表脚本、pinpoint-collector与pinpoint-web的快速启动脚本。
- pp_test文件夹中的内容是虚拟机-2及被监控端需要的,包括一个简单测试项目和pinpoint-agent。另外,虚拟机-2中同样需要jdk和tomcat,在此就不重复放了。
下载的文件可以通过xftp传输到linux系统中,后续修改各类配置文件也会用到xftp。
密码:v5jb
版本说明
软件 | 版本 |
---|---|
pinpoint-collector | 1.7.3 |
pinpoint-agetn | 1.7.3 |
pinpoint-web | 1.7.3 |
hbase | 1.2.6 |
jdk | 1.8.0_171 |
tomcat | 8.0.53 |
步骤
1、虚拟机-1安装hbase、PinPoint-Collector、PinPoint-Web
1.1 系统需要安装Java环境
通过Xftp将所有需要的文件放在 /home/pp_res目录下,方便后续取用。
解压jdk 放到指定目录
cd /home/pp_res/
tar -zxvf jdk-8u171-linux-x64.tar.gz
mkdir /usr/java
mv jdk1.8.0_171/ /usr/java/jdk8
/etc/profile文件末尾配置环境变量
JAVA_HOME=/usr/java/jdk8
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
配置生效
source /etc/profile
1.2 安装Hbase
解压Hbase放入指定目录
cd /home/pp_res/
tar -zxvf hbase-1.2.6-bin.tar.gz
mkdir -p /data/service
mv hbase-1.2.6/ /data/service/hbase
修改 /hbase/conf/hbase-env.sh 中的JAVA_HOME环境变量位置
export JAVA_HOME=/usr/java/jdk8/
在使用JDK8的情况下, hbase-env.sh中这两行可以注释,避免启动警告。
JDK8注释这两行
修改Hbase的配置信息
指定Hbase本地来存储数据,将/hbase/conf/hbase-site.xml文件最下方修改:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///data/hbase</value>
</property>
</configuration>
可以在Linux内使用vi命令进入修改(vi命令的使用请另行查阅资料),或者使用前文提到的Xftp,可直接用windows的软件打开Linux系统中的文件并进行编辑。下文的文件修改大都使用该方法。
Xftp修改文件
启动hbase
cd /data/service/hbase/bin
./start-hbase.sh
查看Hbase是否启动成功,如果启动成功的会看到"HMaster"的进程
[root@localhost bin]# jps
12075 Jps
11784 HMaster
初始化Hbase的pinpoint库
在bin目录下执行pinpoint提供的Hbase初始化语句
./hbase shell /home/pp_res/hbase-create.hbase
执行完了以后,进入Hbase可以看到版本等信息
也可以登录web,来查看HBase的数据是否初始化成功
地址为虚拟机ip:16010
hbase页面端查看
1.3 安装部署pinpoint-collector
解压tomcat到指定位置,用于部署pinpoin-collector
cd /home/pp_res/
tar -zxvf apache-tomcat-8.0.53.tar.gz
mv apache-tomcat-8.0.53/ /data/service/pp-col
修改pp-col的Tomcat配置,修改端口,避免与待会儿还要部署的pp-web端口冲突。
cd /data/service/pp-col/conf/
sed -i 's/port="8005"/port="18005"/g' server.xml
sed -i 's/port="8080"/port="18080"/g' server.xml
sed -i 's/port="8443"/port="18443"/g' server.xml
sed -i 's/port="8009"/port="18009"/g' server.xml
sed -i 's/redirectPort="8443"/redirectPort="18443"/g' server.xml
或使用Xftp打开pp-col/conf/ 下的 server.xml,手动在所有端口号前加1。
部署pinpoint-collector.war包
注意:如果没有unzip命令,可以 "yum -y install unzip" 命令下载安装unzip命令
cd /home/pp_res/
rm -rf /data/service/pp-col/webapps/*
unzip pinpoint-collector-1.7.3.war -d /data/service/pp-col/webapps/ROOT
启动Tomcat
cd /data/service/pp-col/bin/
./startup.sh
使用Xftp打开 pp-col/logs 目录下的 catalina.out可以看到启动日志,查看启动过程是否出现错误。
1.4 安装部署pinpoint-web
再次解压Tomcat,将Tomcat重命名移动到指定位置,这个tomcat用于部署pp-web
cd /home/pp_res/
tar -zxvf apache-tomcat-8.0.53.tar.gz
mv apache-tomcat-8.0.53/ /data/service/pp-web
同样的,可以修改一下端口号,采用下面的命令行或者Xftp打开文件修改皆可
cd /data/service/pp-web/conf/
sed -i 's/port="8005"/port="28005"/g' server.xml
sed -i 's/port="8080"/port="28080"/g' server.xml
sed -i 's/port="8443"/port="28443"/g' server.xml
sed -i 's/port="8009"/port="28009"/g' server.xml
sed -i 's/redirectPort="8443"/redirectPort="28443"/g' server.xml
部署pinpoint-collector.war包
cd /home/pp_res/
rm -rf /data/service/pp-web/webapps/*
unzip pinpoint-web-1.7.3.war -d /data/service/pp-web/webapps/ROOT
说明:
- hbase.properties 配置我们pp-web从哪个数据源获取采集数据,这里我们只指定Hbase的zookeeper地址。
- jdbc.properties pp-web连接自身Mysql数据库的连接认证配置。
- sql目录 pp-web本身有些数据需要存放在MySQL数据库中,这里需要初始化一下表结构。
- pinpoint-web.properties 这里pp-web集群的配置文件,如果你需要pp-web集群的话。
- applicationContext-* .xml 这些文件在后续的调优工作中会用到。
- log4j.xml 日志相关配置
在下一步启动Tomcat之前,建议先阅读本文最后“问题”中的同一个虚拟机中启动两个Tomcat的配置问题,修改相关配置后才能使得两个Tomcat同时运行。
启动Tomcat
cd /data/service/pp-web/bin/
./startup.sh
PinPoint-Web
至此,虚拟机-1上PinPoint监控端的工作就已经完成了。
2、虚拟机-2部署测试项目及PinPoint-Agent
首先同样将所有需要的文件放到虚拟机-2的 /home/pp_test 目录下,包括
- pinpoint-agent
- jdk
- tomcat
- test.war
2.1 在虚拟机-2上,同样需要安装jdk,请参考前文jdk的安装与配置。
2.2 测试项目部署
解压tomcat到指定目录,用于部署测试项目
cd /home/pp_test
mkdir /data
tar -zxvf apache-tomcat-8.0.53.tar.gz
mv apache-tomcat-8.0.53/ /data/pp-test
部署测试项目war包
cd /home/pp_test/
rm -rf /data/pp-test/webapps/*
unzip test.war -d /data/pp-test/webapps/ROOT
运行后直接访问8080端口或者8080/test即可。其中/test是会发生异常的,方便后面的警报功能测试。
2.3 安装配置pp-agent
解压pp-agent
cd /home/pp_test
mkdir /data/pp-agent
tar -zxvf pinpoint-agent-1.7.3.tar.gz -C /data/pp-agent
注意:pinpoint-agent 1.5.2和1.7.3的tar.gz文件内的目录结构不同,因此此处采用与原博客不同的命令
pinpoint-1.7.3的压缩包内没有一级目录编辑配置文件
打开刚刚解压的 /data/pp-agent 目录下的pinpoint.config文件,将其中的 profiler.collector.ip 的值改为安装了pp-col的虚拟机的ip。
profiler.collector.ip=10.100.192.140
回过头再修改刚才测试项目 /data/pp-test/bin 目录下的 catalina.sh启动文件,增加探针。三行代码分别代表
- pp-agent目录下 pinpoint-bootstrap-1.7.3.jar 的全路径
- agent的唯一ID,与被监控的其他项目不能相同
- 采集项目的名字,pp-web页面中,下拉框选择项目时显示的名字
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/data/pp-agent/pinpoint-bootstrap-1.7.3.jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=PP_aid_2018-07-17"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=1.7.3_Test_APP"
探针添加位置参考
配置好后启动测试项目
cd /data/pp-test/bin/
./startup.sh
3、安装、开启MySQL服务
Pinpoint的Alarm功能需要MySQL服务,否则点击pp-web右上角齿轮后,其中一些功能(如编辑用户组、用户等功能)会报如图所示的异常:
MySQL的安装较为复杂,由于篇幅限制本文不再详细介绍,可以参考这篇文章
安装好MySQL之后,按照 /data/service/pp-web/webapps/ROOT/WEB-INF/classes 目录下 jdbc.properties文件的配置,开启连接(即连接的端口号为13306,用户名密码为admin)。也可以开启连接后更改这个属性文件。
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:13306/pinpoint?characterEncoding=UTF-8
jdbc.username=admin
jdbc.password=admin
网上有较多介绍Linux下开启MySQL连接的方法,但是大都直接采用默认3306端口号创建,在此我介绍一下开启连接时指定用户名密码以及端口号的方法。
首先,在安装MySQL的过程中,会将一个 my.conf 文件放到 /etc 目录下,不同教程中的my.conf可能内容不同,我的文件内容如下:
[mysqld]
port = 13306
character_set_server=utf8
init_connect='SET NAMES utf8'
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
#不区分大小写 (sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 这个简单来说就是sql语句是否严格)
lower_case_table_names = 1
log-error=/var/log/mysqld.log
pid-file=/usr/local/mysql/data/mysqld.pid
其中port=13306一行就是指定端口启动服务的效果。
启动MySQL服务并使用如下命令登录
mysql -uroot -p
之后输入密码登录,在MySQL内输入以下命令即可开启指定用户名密码的连接,其中的用户名和密码按照属性文件的要求都改成admin即可:
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
开启连接后,可以在windows系统中使用NaviCat(百度云盘已上传)创建连接!
创建成功后打开连接,新建数据库pinpoint,并在其中执行脚本建表。
两个脚本位于 /data/service/pp-web/webapps/ROOT/WEB-INF/classes/sql 目录下
注意:官方提供的脚本我在执行时会发生错误,需要将前几行删除才可以
脚本删除注释行执行脚本建表完成后,MySQL安装配置即完成。
4、Alarm代码实现
Pinpoint提供了警报触发后自动调用的两个接口方法,具体处理的逻辑代码需要根据自己的使用需求来实现。如通过短信、微信、钉钉等途径发送指定消息。本文以通过钉钉机器人将报警信息发送到钉钉群聊为例,来介绍Alarm的具体实现。
4.1 从官网下载Source Code
下载Source Code,供后续修改4.2 将整个项目以maven项目的方式导入
导入后可以看到整个Pinpoint项目的所有模块。
初次导入往往会存在很多错误,需要根据具体报错信息进行修改,一般出错的原因无外乎maven配置、java环境配置、jar包错误等。
以下列举的几点可能会有所帮助。
4.3 需要安装Java6、7、8环境:
Pinpoint-1.7.3需要同时安装有Java6、7、8环境,才能对修改好的项目进行编译打包。因此在原有JAVA_HOME的基础上,另外再安装三个Java,分别为6、7、8版本,并配置如下图所示的环境变量JAVA_6_HOME、JAVA_7_HOME、JAVA_8_HOME:
多个Java的环境变量
4.4 换用阿里的Maven仓库
Maven Update时默认使用国外的Maven仓库,下载速度较慢而且jar包较多时常常会有失败的情况,换用国内阿里的Maven仓库可以很大程度上避免jar包下载过程出现问题而产生problem红叉,以下为具体操作方法:
4.4.1首先看自己本地maven仓库下有没有settings.xml文件
本地maven仓库默认在 C:\Users\用户名.m2 下,看其中是否已经存在settings.xml文件
settings.xml位置
4.4.2创建或修改settings.xml文件
如果没有settings.xml文件可以自己手动创建,并写入如下代码
<settings>
<localRepository>你自己的路径\.m2\repository</localRepository>
<servers>
<server>
<id>archiva.internal</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>archiva.snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors></settings>
如果已经有settings.xml,则只需要加入中间部分代码。
随后在eclipse的窗口-首选项中,找到Maven - User Settings,中间user settings的文件路径选中该settings.xml文件并应用生效即可。
user settings
4.4.3 出现红叉进行修改后,如果红叉没有消失,可以参考以下几种方法
a) 如果是pom文件中的红叉且存在红色波浪下划线,可以尝试将波浪线处的代码剪切再粘贴回去,有时可以消除一些错误;
b) 如果是java文件中的类无法解析,通常是jdk、jre、jar包相关的错误;
c) 尝试右键pinpoint项目(操作最上面的父项目即可),进行Maven-Update;
d) 使用eclipse的项目-清理功能;
e) 尝试重启eclipse;
4.5 开始实现Alarm功能
4.5.1 创建类实现pinpoint-web下的AlarmMessageSender接口
接口与实现类在实现的sendSms和sendEmail方法中添加具体代码。当pinpoint检测到警报时会自动执行sendSms或sendEmail方法,或两者都执行,根据web设置中的不同选择。
本文开发的功能是通过钉钉群聊机器人,自动发送报警信息到钉钉群里,发送消息的方法可参考github项目:,直接下载该项目中的和放入项目,将DingtalkRobotUtil中的URL改为自己群聊机器人的URL,即可使用发送钉钉消息功能。
修改URL
以下用我自己的AlarmMessageSenderImpl为例:
public class AlarmMessageSenderImpl implements AlarmMessageSender {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void sendSms(AlarmChecker checker, int sequenceCount) {
logger.info("************alarm has been sended by SMS************");
// 获取rule,从中得到发生警报的应用id,警报规则名,警报备注信息
Rule rule = checker.getRule();
String appId = rule.getApplicationId();
String checkerName = rule.getCheckerName();
String notes = rule.getNotes();
// 钉钉消息中title似乎并没有什么用,不会显示
String title = appId + "———" + checkerName;
// 以下为拼接发送消息
StringBuilder text = new StringBuilder("【SMS Alarm】\n\r");
text.append("【App ID】:"+appId+"\n\r");
text.append("【Rule】:"+checkerName+"\n\r");
text.append("【Time】:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"\n\r");
text.append("【Notes】:"+notes+"\n\r");
text.append("【Messages】:\n\r");
List<String> smsMessage = checker.getSmsMessage();
for (String message : smsMessage) {
text.append(message+"\n\r");
}
String[] at = new String[] {"1","2"};
boolean isAtAll = false;
logger.info(text.toString());
// 调用DingtalkRobotUtil类中的相应方法发送消息
DingtalkRobotUtil.messageMarkdown(text.toString(), title, at, isAtAll);
}
@Override
public void sendEmail(AlarmChecker checker, int sequenceCount) {
}
}
为了方便调试,我在该类中加入了日志记录操作,日志文件即为pp-web/logs下的catalina.out。
注意
为了实现钉钉消息发送的功能,我在 pinpoint-web / pom.xml 中加入了一些依赖,但是有一些需要注意的地方:
<!-- DingtalkRobotUtil -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.13</version>
</dependency>
<!-- 此处另做处理
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.5.2</version>
</dependency>
<!-- DingtalkRobotUtil -->
pinpoint / pom.xml
这两个依赖的版本进行手动替换
4.5.2 将该实现类进行注册
applicationContext-web.xml 和下文要用到的 batch.properties 所在位置
注册bean:4.5.3 修改batch.properties
4.6 程序打包
实现Alarm功能,完成以上配置后,如果项目没有错误,就可以对项目进行打包了。
4.6.1 Maven Build设置
打包前对打包进行如下图所示设置,来跳过测试步骤(有些情况下会存在实际没问题而测试发生一系列问题导致打包中止;并且测试大大增加了打包时间,所以我在此跳过测试)。
在Maven Build下新建一个配置,添加项目pinpoint,在Goals中添加参数 -X package ,选中 Update Snapshots 和 Skip Tests
4.6.2 打包前操作
每次打包前建议先进行以下三步操作来确保项目无误:
Maven clean:将以前打包的痕迹删除(项目上右键,在运行或调试里);
Maven update:确保pom中添加的jar包都下载好(项目上右键,在Maven里);
项目-清理:去除一些莫名其妙的错误或者让一些本来没有显示的错误暴露出来。
4.6.3 开始打包
同样的在pinpoint上右键,点击运行或者调试中的 maven build 即可开始打包,打包过程可能会持续10-20分钟,如果后面一直红字提示连接泄漏,可以停止打包,maven clean后重新开始。
4.6.4 war包获取
打包成功后,可以在 项目路径/web/target 文件夹中找到我们需要的war包,按照前文介绍的方法将他部署到虚拟机的pp-web中即可运行。
4.7 警报实现效果
web展示错误call tree
日志记录
钉钉接收到消息
五、最终效果
当虚拟机-1上的hbase、pp-col、pp-web与虚拟机-2上的pp-test都启动后。在浏览器的pp-web下拉框中可以看到我们的测试项目
测试项目出现在下拉框中
访问测试项目
测试项目访问
测试项目访问
即可在pp-web中看到这些访问的数据
拖动鼠标查看详情
注意:1.7.3版本将采样率设置成了1/20,因此如果想要每次访问的记录都显示出来,需要改变配置文件 pinpoint.config
# 1 out of n transactions will be sampled where n is the rate. (20: 5%)
profiler.sampling.rate=1
详细信息
原先采用1.5.2版本,此处的Call Tree无法正常显示,且控制台报错,换成1.7.3版本后解决。
问题
1.Linux安装后联网问题:
-
Linux安装后网卡默认不打开,无法获取到网络,因此需要修改配置打开网卡:
vi /etc/sysconfig/network-scripts/ifcfg-ens33
此处的网卡名可能不一样,可以先执行cd /etc/sysconfig/network-scripts,在目录下使用 ls 进行查看,以确定要修改的文件。
使用vi命令打开ifcfg-ens33文件后,修改最后一行ONBOOT=yes。重启Linux系统即可获取到网络,使用 ip addr命令能够看到ens33的ip即为正常。 IP查看只有当联网后,才能使用Xftp进行连接。
本文的虚拟机使用VM Ware创建,网络连接使用桥接模式,根据使用网络的不同,可能要进行不同的设置。
-
防火墙关闭
虚拟机能够联网后,启动Tomcat项目,外界可能依旧无法访问,此时需要关闭CentOS系统的防火墙。
systemctl stop firewalld
systemctl disable firewalld
2.同一个虚拟机中启动两个Tomcat:
2.1 需要在etc/profile中配置两套环境变量
# Java环境变量
JAVA_HOME=/usr/java/jdk8
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
# 两套Tomcat环境变量
export CATALINA_BASE=/data/service/pp-col
export CATALINA_HOME=/data/service/pp-col
export TOMCAT_HOME=/data/service/pp-col
export CATALINA_2_BASE=/data/service/pp-web
export CATALINA_2_HOME=/data/service/pp-web
export TOMCAT_2_HOME=/data/service/pp-web
2.2 server.xml中配置端口不冲突
2.3 分别在两个Tomcat的startup.sh和shutdown.sh文件的第二行加入:
export JAVA_HOME=$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib
export CATALINA_HOME=$CATALINA_HOME
export CATALINA_BASE=$CATALINA_BASE
以及
export JAVA_HOME=$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib
export CATALINA_HOME=$CATALINA_2_HOME
export CATALINA_BASE=$CATALINA_2_BASE