zl程序教程

您现在的位置是:首页 >  Java

当前栏目

【云原生】prometheus结合jmx exporter 的http server模式采集tomcat监控实战

2023-04-18 16:16:29 时间

前言

本文中的是prometheus已经安装好,如果你还未安装,可以参考上一篇文章:prometheus安装及使用入门

🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,双一流院校计算机专业,阿里云博客专家
😉😉 💕 座右铭: 先努力成长自己,再帮助更多的人,一起加油进步
🍺🍺🍺 💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘

在这里插入图片描述

一. 实验环境

本次实验环境见下表

操作系统服务器IPhostname
centos7.910.0.0.7mufengrow7

如何查看相应的参数

  • 参看操作系统
[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

我是沐风晓月,更多内容关注csdn首页:https://blog.csdn.net/wisdom_futrue

二. 安装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)

代码注释:

-verson:显示java的版本

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

代码注释:
--no-check-certificate:下载文件不验证安全证书

2.2.2 解压tomcat8.5.87的二进制安装包

[root@mufengrow7 apps]# tar zxvf apache-tomcat-8.5.87.tar.gz

代码注释:

zxvf:这里可以拆分为“z”,“x”,“v”,"f"四个选项

z:解压的文件包含gzip属性

x:从归档中解压文件

v:列出解压的文件

f:指定解压的文件

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’

代码注释:

-sv:这里可以拆分为“s”,“v”两个选项

s:创建软链接

v:显示创建链接的详细过程

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

代码注释:

-R:递归修改文件所属

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

参数描述
debug以调试的方式启动tomcat
run前台启动tomcat
start后台启动tomcat
stop停止tomcat,在5秒内等待进程的结束
stop -force停止tomcat,如果5秒后进程不结束就直接把进程kill掉强制结束进程
configtest检查server.xml文件的语法
version查看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:得出的结果取反

三. 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以上的启动环境。

四. 安装JMX exporter

4.1 下载jmx exporter

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

![](https://img-blog.csdnimg.cn/img_convert/b585b8f395ed73e2586c013babf448fe.png

我们这次下载最新版本的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包要放在这里呢?

原因有两个:

  1. tomcat使用的jar包基本都是放在这里的,所以我也就下载到这里。

  2. 由于本次演示,只会启动一个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+/$%~_-|!.]*), J2EEApplication=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+&@#/%=~_|]), context=([-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:得出的结果取反

五. 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.

本文首发于csdn,作者:我是沐风晓月,可以关注我的博客一起学习和成长。

查看jmx exporter采集的数据

浏览器访问:

http://10.0.0.7:18080/metrics

通过下图的浏览器访问jmx exporter的WEB页面,可以看出jmx exproter已经在采集数据

六. 配置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

七. 查看prometheus的监控数据

7.1 查看prometheus与jmx exporter的连接是否正常

我们到prometheus的网页端,查看prometheus采集数据的目标是否有tomcat,通过下图,我们知道prometheus已经连接上jmx exporter了。

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

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

  • 查看jmx exporter版本

八. 导入grafana模板

导入grafana模板可以参考“云原生系列之使用prometheus监控tomcat之使用java agent模式监控”这篇文章。

但需要注意的是:在grafana官网里搜索的模板几乎没有为“http server”模式定制dashboard模板,大部分都是使用“java agent”。

九. 总结

9.1 jmx exporter使用“http server”模式采集tomcat数据的步骤

  1. 安装jdk8环境
  2. 下载jmx exporter的jar包,添加config.yaml文件。(注意:文件里应该添加hostPort字段)
  3. 安装tomcat,修改“catalina.sh”文件,添加“CATALINA_OPTS”内容,让jmx exporter能以http的方式采集tomcat的数据
  4. 启动jmx exporter和tomccat
  5. 验证exproter采集的数据prometheus是否能连接jmx exporter

9.2 对jmx exporter的监控方式的选择

  1. 官方更推荐使用“java agent”方式

jmx exporter的“http server”的监控方式,出现的时间不是很久。而且在jxm exporter的github页面上,官方还是推荐使用“java agent”这种方式运行jmx exporter,而不是使用“http server”这种方式。

  1. “http server”的dashboard基本没有

在grafana官网上搜索开源的dashboard,但是基本上所有的jmx exporter都是使用“java agent”的。如果一定要使用“http server”的模式,那么可能需要自己手动创建dashboard了。

  1. 使用“http server”的方式所采集的数据没“java agent”方式的详细。

所以博主对jmx exporter的监控还是推荐使用“java agent”模式

总结

💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
💕 博客主页:mufeng.blog.csdn.net
💕 本文由沐风晓月原创,首发于CSDN博客
💕 全力以赴,持续学习,不负如来不负卿
💕 喜欢的话记得点赞收藏哦