Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

时间:2021-08-19 00:59:03

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

1. 实验环境

本次实验环境见下表

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战


如何查看相应的参数

参看操作系统

[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环境。

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

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常用的参数用表格来展示:

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

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也在这个网页里面

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

点击进入页面,找到jmx exporter,点击连接就可以进入jmx exporter的github页面。从下面的截图可以看出jmx exporter后面还加了一个“offcial”的官方提示。

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

Jmx exporter的github地址为:https://github.com/prometheus/jmx_exporter

3.5 jmx exporter的启动环境

通过浏览jmx exporter的github页面我们可以看到jmx exporter的启动环境,通过下图可以我们可以知道jmx exporter支持两种启动环境。一种是java 6的启动环境另一种是java 7以上的启动环境。

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

4. 安装JMX exporter

4.1 下载jmx exporter

在jmx exporter的github里点击右方的“Releases”后选择版本进行下载

我们这次下载最新版本的jmx exporter,进入到“Releases”页面,找到最新的“1.18.0”版本,选择“jmx_prometheus_httpserver-0.18.0.jar”进行下载。

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

下载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”里提示了该文件在哪里可以找到范例。

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

接着我们进入到存放config.yaml范例的文件夹

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

找到tomcat.yaml文件,点击进去

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

在看到文件内容后将内容全部复制。注意我们需要在前面添加一个“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已经在采集数据

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

6. 配置prometheus采集jmx exporter数据

6.1 修改prometheus配置文件

修改的方式如图:

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

其中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了。

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

7.2 在prometheus里查询jmx exporter监控的数据

我们到prometheus的“Graph”页面,查询prometheus是否采集到jmx exporter的数据

查看jmx exporter版本

Prometheus结合jmx exporter 的http、server模式采集tomcat监控实战

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”这种方式。