1. 实验环境
本次实验环境见下表
如何查看相应的参数
参看操作系统
[root@mufengrow ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
查看hostname
[root@mufengrow7 ~]# hostname
mufengrow7
查看ip
[root@mufengrow7 ~]# ifconfig |grep inet |awk 'NR==1{print $2}'
10.0.0.7
2. 安装tomcat8
本次实验使用tomcat8.5.87版本进行演示。
2.1 安装jdk8
为什么要安装jdk8?
因为在tomcat的官网里已经给出了tomcat8运行的环境。
我们登陆tomcat8的下载网页,点击网页中的“README”,通过下图对“README”页面的截图里看出,官方用红色的字体标出tomcat 8.5的运行环境至少也是Java 7以上。鉴于现在的环境都是基于Java 8进行开发,所以我们本次实验的环境也是使用Java 8环境。
2.1.1 使用yum的方式安装jdk8
安装jdk8有两种方式,一种是到orcale官网上下载官方编译好的jdk二进制安装包,另一种是使用yum命令安装centos7仓库中的opnjdk8,本次实验使用的是第二种方式。
[root@mufengrow7 ~]# yum install -y java-1.8.0-openjdk
代码注释:
-y:对所有的提问都回答“yes”
小提示:
如果忘记了openjdk8的安装包名称,我们可以使用yum list | grep jdk命令来查看openjdk8的安装包的名称:
[root@mufengrow7 ~]# yum list | grep jdk
openjdk-asmtools-javadoc.noarch 7.0.b10-0.2.20210610.gitf40a2c0.el7
2.1.2 检查jdk的版本
通过下面的命令,我们可以查看刚刚安装的openjdk是不是openjdk8的版本。
[root@mufengrow7 ~]# java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-b08)
2.2 安装tomcat8.5.87
2.2.1 下载tomcat8.5.87的二进制安装包
本次实验使用的是tomcat的8.5.87版本,所以我们需要到tomcat官方下载tomcatd8.5.87的二进制安装包。
#创建tomcat安装目录
[root@mufengrow7 ~]# mkdir -p /apps
#进入安装目录
[root@mufengrow7 ~]# cd /apps
#使用wget命令下载tomcat8.5.87的二进制安装包
[root@mufengrow7 apps]# wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.87/bin/apache-tomcat-8.5.87.tar.gz
2.2.2 解压tomcat8.5.87的二进制安装包
[root@mufengrow7 apps]# tar zxvf apache-tomcat-8.5.87.tar.gz
2.2.3 创建软连接
在这里创建软连接是为了方便我们以后对tomcat的更新换代。如果嫌麻烦这一步可以忽略。
[root@mufengrow7 apps]# ln -sv /apps/apache-tomcat-8.5.87 /apps/tomcat
‘/apps/tomcat’ -> ‘/apps/apache-tomcat-8.5.87’
2.2.4 创建tomcat启动用户
在生产的环境中,我们一般不会直接使用root用户来启动tomcat,所以我们需要创建一个普通用户来启动tomcat
[root@mufengrow7 apps]# useradd www
2.2.5 修改tomcat文件所属
因为我们需要使用www用户启动tomcat,而此时tomcat文件所属都是root用户,所以我们需要修改tomcat目录的所属。
[root@mufengrow7 apps]# chown -R www.www /apps/apache-tomcat-8.5.87
2.2.6 查看tomcat的帮助
对于不熟悉tomcat的朋友来说,我们先查看一下tomcat的帮助文档,看看tomcat是如何启动的
#进入到tomcat文件夹下的bin目录里
[root@mufengrow7 apps]# cd tomcat/bin/
#查看tomcat的文件
[root@mufengrow7 bin]# ll
total 892
-rw-r----- 1 www www 36717 Feb 28 03:32 bootstrap.jar
-rw-r----- 1 www www 16840 Feb 28 03:32 catalina.bat
-rwxr-x--- 1 www www 25294 Feb 28 03:32 catalina.sh #tomcat的启动文件
-rw-r----- 1 www www 1664 Feb 28 03:32 catalina-tasks.xml
-rw-r----- 1 www www 2123 Feb 28 03:32 ciphers.bat
-rwxr-x--- 1 www www 1997 Feb 28 03:32 ciphers.sh
-rw-r----- 1 www www 25765 Feb 28 03:32 commons-daemon.jar
-rwxr-x--- 1 www www 1904 Feb 28 03:32 startup.sh
-rw-r----- 1 www www 52826 Feb 28 03:32 tomcat-juli.jar
-rw-r----- 1 www www 437622 Feb 28 03:32 tomcat-native.tar.gz
-rw-r----- 1 www www 4574 Feb 28 03:32 tool-wrapper.bat
-rwxr-x--- 1 www www 5540 Feb 28 03:32 tool-wrapper.sh
-rw-r----- 1 www www 2026 Feb 28 03:32 version.bat
-rwxr-x--- 1 www www 1908 Feb 28 03:32 version.sh
#查看帮助
[root@mufengrow7 bin]# ./catalina.sh --help
Using CATALINA_BASE: /apps/tomcat
Using CATALINA_HOME: /apps/tomcat
Using CATALINA_TMPDIR: /apps/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Usage: catalina.sh ( commands ... )
为了更直观一些,我们把catalina.sh常用的参数用表格来展示:
2.2.7 启动tomcat
我们使用www用户启动tomcat,测试tomcat是否能成功启动
[root@mufengrow7 bin]# su - www -c "/apps/tomcat/bin/catalina.sh start"
Using CATALINA_BASE: /apps/tomcat
Using CATALINA_HOME: /apps/tomcat
Using CATALINA_TMPDIR: /apps/tomcat/temp
Using JRE_HOME: /
Using CLASSPATH: /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
代码注释:
-:使用该用户的shell类型。
-c:向www用户传递一个shell命令。
(注意:一定要使用绝对路径,不能使用相对路径。原因是转换成www用户后,该用户的家目录是在“/home/www”里,而不是在tomcat的目录下。在“/home/www”里没有“catalina.sh”这个文件。使用相对路径的结果只会显示找不到“catalina.sh”这个文件。)
2.2.8 验证tomcat的启动情况
我们使用ps命令来查看tomcat的进程状态,使用ss命令来查看tomcat的端口
#使用ps命令来查看tomcat的进行状态,通过查看下面的结果,我们得知现在的tomcat的确是使用了“www”用户进行启动
[root@mufengrow7 bin]# ps -ef | grep tomcat | grep -v grep
www 2117 1 0 13:00 ? 00:00:02 //bin/java -Djava.util.logging.config.file=/apps/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/apps/tomcat -Dcatalina.home=/apps/tomcat -Djava.io.tmpdir=/apps/tomcat/temp org.apache.catalina.startup.Bootstrap start
#我们都知道tomcat的启动后的默认端口为8080,所以通过命令来查找8080端口确认tomcat的端口是否有启动
[root@mufengrow7 bin]# ss -tnl | grep 8080
LISTEN 0 100 [::]:8080 [::]:*
代码注释:
-ef:在-ef里可以分出两个选项-e和-f
-e:显示所有执行程序的进程(除会话领导者与终端关联的进程)
-f:显示UID,PPIP,C与STIME栏位
-v:得出的结果取反
3. JMX exporter简介
3.1 什么是jmx exporter
jmx exporter是prometheus官方提供的用于采集JMV数据的exporter,而且新出jmx exporter有两种监控方式,分别为“java agent”模式和“http server”模式。
注意:jmx exproter在“0.17.0”版本开始更新了“http server”模式。
3.2 什么是 “java agent”监控模式?
“java agent”监控模式是jmx exproter的最初的形式,该模式是将jmx exporter的这个jar包集成在tomcat内,在tomcat启动时jmx exporter也会一起启动,然后变成一个展示JVM数据的代理。最后由prometheus采集代理展示出来的数据。
想知道怎么使用jmx exporter的“java agent”模式采集tomcat的数据,我们可以看“云原生系列之使用prometheus监控tomcat之使用java agent模式监控”这篇文章
3.3 什么是 “http server”监控模式?
“http server”监控模式,顾名思义就是让jmx exporter变成一个采集JVM数据的server。然后jmx exporter会通过http来采集远程的tomcat服务的数据
3.4 在哪里下载jmx exporter?
我们登陆prometheus官方的下载页面,会发现并没有jmx exporter的下载链接。
prometheus官方下载页面:https://prometheus.io/download/
没有提供jmx rxporter的下载链接,为什么上面会说jmx exproter是prometheus官方提供的exporer呢?是不是博主在骗大家呢?
其实不是,在官方的下载页面里有一个Exporters and integrations链接,里面就有prometheus官方推荐exporter,我们的jmx exporter也在这个网页里面
点击进入页面,找到jmx exporter,点击连接就可以进入jmx exporter的github页面。从下面的截图可以看出jmx exporter后面还加了一个“offcial”的官方提示。
Jmx exporter的github地址为:https://github.com/prometheus/jmx_exporter
3.5 jmx exporter的启动环境
通过浏览jmx exporter的github页面我们可以看到jmx exporter的启动环境,通过下图可以我们可以知道jmx exporter支持两种启动环境。一种是java 6的启动环境另一种是java 7以上的启动环境。
4. 安装JMX exporter
4.1 下载jmx exporter
在jmx exporter的github里点击右方的“Releases”后选择版本进行下载
我们这次下载最新版本的jmx exporter,进入到“Releases”页面,找到最新的“1.18.0”版本,选择“jmx_prometheus_httpserver-0.18.0.jar”进行下载。
下载jmx exporter的命令如下:
#进入到tomcat的bin目录下
[root@mufengrow7 ~]# cd /apps/tomcat/bin/
#使用weget命令进行下载
[root@mufengrow7 bin]# wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_httpserver/0.18.0/jmx_prometheus_httpserver-0.18.0.jar
这里可能会有朋友问到,为什么jmx exporter的jar包要放在这里呢?
原因有两个:
tomcat使用的jar包基本都是放在这里的,所以我也就下载到这里。
由于本次演示,只会启动一个tomcat,放在这里比较好管理,如果有多个tomcat的话,那就把jmx exporter下载到一个公共目录,供所有的tomcat一起使用。
可能还有朋友会问到,既然jmx exporter是通过http与tomcat进行通信,那么jmx exproter是否能不与tomcat安装在同一台服务器上呢?
答案是可以的,只要安装jmx epxorter的服务器可以与安装了tomcat的服务器进行通讯就行。
4.2 添加config.yaml文件
我们在jmx exproter的github页面的提示中可以看到启动jmx exporter的时候需要有一个config.yaml的文件,然后在上面的“java agent”里提示了该文件在哪里可以找到范例。
接着我们进入到存放config.yaml范例的文件夹
找到tomcat.yaml文件,点击进去
在看到文件内容后将内容全部复制。注意我们需要在前面添加一个“hostPort”
[root@mufengrow7 bin]# vim config.yaml
---
hostPort: 10.0.0.17:38081 #这里为远程监控的地址加端口。在启动此jar包后会通过该端口与tomcat进行通信
lowercaseOutputLabelNames: true
lowercaseOutputName: true
rules:
- pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+):'
name: tomcat_$3_total
labels:
port: "$2"
protocol: "$1"
help: Tomcat global $3
type: COUNTER
- pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplicatinotallow=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount):'
name: tomcat_servlet_$3_total
labels:
module: "$1"
servlet: "$2"
help: Tomcat servlet $3 total
type: COUNTER
- pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount):'
name: tomcat_threadpool_$3
labels:
port: "$2"
protocol: "$1"
help: Tomcat threadpool $3
type: GAUGE
- pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), cnotallow=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions):'
name: tomcat_session_$3_total
labels:
context: "$2"
host: "$1"
help: Tomcat session $3 total
type: COUNTER
- pattern: ".*"
4.3 启动jmx exproter
4.3.1 修改 jmx exporter 和 config.yaml 所属
[root@mufengrow7 bin]# chown -R www.www jmx_prometheus_httpserver-0.18.0.jar config.yaml
4.3.2 启动jmx exporter
我们使用www用户启动jmx exporter
[root@mufengrow7 bin]# su - www -c "/usr/bin/nohup /usr/bin/java -jar /apps/tomcat/bin/jmx_prometheus_httpserver-0.18.0.jar 18080 /apps/tomcat/bin/config.yaml &"
[root@mufengrow7 bin]# /usr/bin/nohup: appending output to ‘nohup.out’
代码注释:
-jar:使用jar包启动
-:使用该用户的shell
-c:执行shell命令
18080:jmx exporter暴露出来的端口,prometheus通过这个端口采集jmx exporter的数据
4.3.3 查看jmx exporter启动情况
我们通过ps命令看出jmx exporter正常运行
[root@mufengrow7 bin]# ps -ef | grep jmx | grep -v grep
www 2681 1 2 14:22 ? 00:00:00 /usr/bin/java -jar /apps/tomcat/bin/jmx_prometheus_httpserver-0.18.0.jar 18080 /apps/tomcat/bin/config.yaml
代码注释:
-ef:这里可以拆分为-e和-f两个选项
-e:显示所有执行程序的进程(除会话领导者与终端关联的进程)
-f:显示UID,PPIP,C与STIME栏位
-v:得出的结果取反
5. tomcat启动远程服务
5.1 关闭tomcat
[root@mufengrow7 bin]# ./shutdown.sh
Using CATALINA_BASE: /apps/tomcat
Using CATALINA_HOME: /apps/tomcat
Using CATALINA_TMPDIR: /apps/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
5.2 修改tomcat的配置文件
[root@mufengrow7 bin]# vim catalina.sh
......
# Copy CATALINA_BASE from CATALINA_HOME if not already set
[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"
#添加以下内容,注意tomcat8添加“CATALINA_OPTS”内容是必须写在同一行
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -DJava.rmi.server.hostname=10.0.0.7 -Dcom.sun.management.jmxremote.port=38081 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
......
代码注释:
-Dcom.sun.management.jmxremote:开启jmx远程监控。
-DJava.rmi.server.hostname:监控所在的服务器ip地址。(被监控的ip,一般为本机ip地址)
-Dcom.sun.management.jmxremote.port:开启监控的端口号。(被监控的端口,也就是jmx exporter通过哪个端口与tomcat进行通信,采集tomcat的数据。端口设置根据上面config.yaml的设置进行修改)
-Dcom.sun.management.jmxremote.ssl:是否开启ssl连接。
-Dcom.sun.management.jmxremote.authenticate:监控是否开启用户和密码。
5.3 启动tomcat
[root@mufengrow7 bin]# su - www -c "/apps/tomcat/bin/catalina.sh start"
Using CATALINA_BASE: /apps/tomcat
Using CATALINA_HOME: /apps/tomcat
Using CATALINA_TMPDIR: /apps/tomcat/temp
Using JRE_HOME: /
Using CLASSPATH: /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS: -Dcom.sun.management.jmxremote -DJava.rmi.server.hostname=10.0.0.7 -Dcom.sun.management.jmxremote.port=38081 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
Tomcat started.
查看jmx exporter采集的数据
浏览器访问:
http://10.0.0.7:18080/metrics
通过下图的浏览器访问jmx exporter的WEB页面,可以看出jmx exproter已经在采集数据
6. 配置prometheus采集jmx exporter数据
6.1 修改prometheus配置文件
修改的方式如图:
其中job_name、prometheus读取配置文件的方式、目标的ip和端口都可以根据需求自行修改。
6.2 检查prometheus语法
[root@mufengrow7 prometheus]# ./promtool check config prometheus.yml
Checking prometheus.yml
SUCCESS: prometheus.yml is valid prometheus config file syntax
6.3 让prometheus重新读取配置文件
这里通过重启prometheus的方式让prometheus重新读取配置文件
[root@mufengrow7 prometheus]# systemctl restart prometheus.service
7. 查看prometheus的监控数据
7.1 查看prometheus与jmx exporter的连接是否正常
我们到prometheus的网页端,查看prometheus采集数据的目标是否有tomcat,通过下图,我们知道prometheus已经连接上jmx exporter了。
7.2 在prometheus里查询jmx exporter监控的数据
我们到prometheus的“Graph”页面,查询prometheus是否采集到jmx exporter的数据
查看jmx exporter版本
8. 导入grafana模板
导入grafana模板可以参考“云原生系列之使用prometheus监控tomcat之使用java agent模式监控”这篇文章。
但需要注意的是:在grafana官网里搜索的模板几乎没有为“http server”模式定制dashboard模板,大部分都是使用“java agent”。
9. 总结
9.1 jmx exporter使用“http server”模式采集tomcat数据的步骤
安装jdk8环境
下载jmx exporter的jar包,添加config.yaml文件。(注意:文件里应该添加hostPort字段)
安装tomcat,修改“catalina.sh”文件,添加“CATALINA_OPTS”内容,让jmx exporter能以http的方式采集tomcat的数据
启动jmx exporter和tomccat
验证exproter采集的数据prometheus是否能连接jmx exporter
9.2 对jmx exporter的监控方式的选择
官方更推荐使用“java agent”方式
jmx exporter的“http server”的监控方式,出现的时间不是很久。而且在jxm exporter的github页面上,官方还是推荐使用“java agent”这种方式运行jmx exporter,而不是使用“http server”这种方式。