Prometheus运维 监控Tomcat

1.安装部署

1.1 安装Prometheus

部署Prometheus请点击此链接:https://blog.csdn.net/ZhanBiaoChina/article/details/107024115

1.2 安装Tomcat

1.安装Tomcat

$wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.61/bin/apache-tomcat-8.5.61.tar.gz
$ tar zxf apache-tomcat-8.5.61.tar.gz -C /usr/local/
$ ln -s /usr/local/apache-tomcat-8.5.61/ /usr/local/tomcat
$ vim /etc/profile
#添加如下内容
export CATALINA_HOME=/usr/local/tomcat
$ source /etc/profile
$ env |grep -i home
#输出内容
CATALINA_HOME=/usr/local/tomcat
HOME=/root
ZK_HOME=/usr/local/zookeeper/

# 查看熵池的大小: 
cat /proc/sys/kernel/random/entropy_avail 180
增加熵池大小,解决Tomcat在CentOS 7巨慢的问题

# 安装rng服务,增大熵池
yum -y install rng-tools
systemctl start rngd && systemctl enable rngd
# 启动服务访问Tomcat页面快一百倍..

2.创建配置Tomcat systemd服务
指定Tomcat PID文件位置

vim /usr/local/tomcat/bin/catalina.sh
#添加如下内容:
157 # Copy CATALINA_BASE from CATALINA_HOME if not already set
158 [ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"
159 
160 CATALINA_PID="$CATALINA_BASE/tomcat.pid"
161 # Ensure that any user defined CLASSPATH variables are not used on startup,
162 # but allow them to be specified in setenv.sh, in rare case when it is needed.
163 CLASSPATH=

在这里插入图片描述

$ vim /etc/systemd/system/tomcat.service
#添加如下内容:
[Unit]
Description=Tomcat
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
User=root
Group=root
#Environment="JAVA_HOME=/usr/bin/java"
PIDFile=/usr/local/apache-tomcat-8.5.61/tomcat.pid
ExecStart=/usr/local/apache-tomcat-8.5.61/bin/startup.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
systemctl enable tomcat.service
systemctl start tomcat.service
systemctl status tomcat.service

Centos6 Tomcat启动脚本

vim /etc/init.d/tomcat
#!/bin/bash
#chkconfig: 2345 96 14
export JAVA_HOME=/usr/bin/java
export CATALINA_HOME=/usr/local/tomcat
exec $CATALINA_HOME/bin/catalina.sh $*

# $*将脚本本身自带的参数全部传递过来,就是catalina.sh --help看到的所有的参数start stop等

chmod +x /etc/init.d/tomcat
chkconfig --add tomcat
chkconfig tomcat on
service tomcat start
systemctl status tomcat
tail -f catalina.out 服务启动不起来查看这个日志文件```

3.Tomcat相关信息解释

netstat -anput | grep java
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      12481/java
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN      12481/java
tcp        0      0 0.0.0.0:8005            0.0.0.0:*               LISTEN      12481/java

Tomcat三个端口

# 8005:    是tomcat本身的端口,本地管理端口号  
# 8080:    主端口号,是tomcat负责建立http连接的端口,通过浏览器访问tomcat服务器的web 应用时,使用此端口  
# 8009:    是tomcat负责和其他http服务器建立连接的端口,ajp的编辑器 

Tomcat的配置文件
Tomcat的配置文件默认存放在$CATALINA_HOME/conf目录中,主要有以下几个:

1.server.xml:
	Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;
2.web.xml:
	遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;
3.tomcat-user.xml:
	Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将通过编辑此文件实现;
4.catalina.policy:
	Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;
5.catalina.properties:
	Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat6在启动时会事先读取此文件的相关设置;
6.logging.properties:
	Tomcat6通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组件级别以及日志文件的存在位置等;
7.context.xml:
	所有host的默认配置信息;

2.配置JMX Exporter

Prometheus监控Tomcat需要用到jmx_exporter。
jmx_exporter项目地址:https://github.com/prometheus/jmx_exporter

2.1 下载安装JMX Exporter文件

$ mkdir -p /usr/local/jmx/
#下载jar包
$ wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar
$ cp jmx_prometheus_javaagent-0.3.1.jar /usr/local/jmx/
#创建配置文件
$ touch /usr/local/jmx/config.yaml
$ vim /usr/local/jmx/config.yaml
#添加如下内容:
---   
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: ".*"  #让所有的jmx metrics全部暴露出来

修改java_opts,增加java agent信息,让监控和程序一起启动
修改T O M C A T H O M E / b i n 目 录 下 的 c a t a l i n a . s h 脚 本 , 找 到 J A V A O P T S 配 置 代 理 。 如 果 有 多 个 t o m c a t 实 例 , 建 议 将 j m x p r o m e t h e u s j a v a a g e n t 和 c o n f i g . y a m l 文 件 放 到 固 定 的 目 录 , TOMCAT_HOME/bin目录下的catalina.sh脚本,找到JAVA_OPTS配置代理。 如果有多个tomcat实例,建议将jmx_prometheus_javaagent和config.yaml文件放到固定的目录,TOMCATHOME/bincatalina.shJAVAOPTStomcatjmxprometheusjavaagentconfig.yaml,TOMCAT_HOME/bin/catalina.sh文件中写绝对路径。

$ vim /usr/local/tomcat/bin/catalina.sh
#添加如下内容:
JAVA_OPTS="-javaagent:/usr/local/jmx/jmx_prometheus_javaagent-0.3.1.jar=30013:/usr/local/jmx/config.yaml"

在这里插入图片描述
重启tomcat

systemctl restart tomcat
root@iZ2ze6ajmixcunibydkdheZ:~# netstat -anput | grep 30013
tcp        0      0 0.0.0.0:30013           0.0.0.0:*               LISTEN      14833/java    

2.2 收集Tomcat数据

访问地址:http://localhost:30013/
在这里插入图片描述

2.3 集成Prometheus

$ vim /usr/local/prometheus/prometheus.yml
#添加如下内容:
  - job_name: tomcat
    static_configs:
    - targets: ['xxx.xxx.xxx.xxx:30013']
#热加载
#热加载方式:查看Prometheus的进程id,发送SIGHUP信号:
kill -HUP <pid>

在这里插入图片描述
在这里插入图片描述

3.Tomcat关注指标

Tomcat 的关键指标有吞吐量、响应时间、错误数、线程池、CPU 以及 JVM 内存。

1.吞吐量及响应时间

#tomcat处理请求的响应时间累加值 counter类型
tomcat_processingtime_total
#最大处理时间表示服务器处理一个请求所需的最长时间(从可用线程开始处理请求到返回响应为止)。
tomcat_maxtime_total
#访问请求总数对其进行rate计算,得到平秒每秒变化率
tomcat_requestcount_total
#tomcat 实例发送和接收的流量
tomcat_bytesreceived_total
tomcat_bytessent_total

2.错误数
Prometheus记录Timcat的错误的指标:tomcat_errorcount_total

topk(5,tomcat_errorcount_total{protocol=~"http.*"})

tomcat后台本身记录的一个错误总数,需要配合accesslog 看下后台的5xx错误数量仅错误计数指标无法深入了解 Tomcat 正在生成的错误类型,但它可以提供需要调查的潜在问题的高级别视图。您需要通过访问日志中的其他信息来补充此指标,以便更清楚地了解用户遇到的错误类型

3.线程池
currentThreadsBusy(ThreadPool)可以获取到当前连接池中有多少个线程正在处理请求。
若服务收到请求时,如果现有线程不足以覆盖工作负载,则Tomcat将启动更多工作线程,直到达到为池设置的最大线程数为止。
这是由maxThreads为连接器的线程池和maximumPoolSize为执行人。任何后续请求都将放入队列,直到线程可用。
如果队列已满,则服务器将拒绝任何新请求,直到线程可用为止。重要的是要注意繁忙线程的数量,以确保未达到为maxThreads设置的值,因为如果持续达到此上限,则可能需要调整为连接器分配的最大线程数。
使用监视工具,可以通过将当前线程数与繁忙线程数进行比较来计算空闲线程数。空闲线程数与忙碌线程数是微调服务器的好方法。如果服务器的空闲线程过多,则可能无法有效地管理线程池。在这种情况下,可以降低minSpareThreads连接器的值,该值设置池中应始终可用的最小线程数(活动或空闲)。根据应用程序的流量调整此值将确保繁忙线程和空闲线程之间有适当的平衡

现有线程减去忙碌线程=空闲线程,此值设定要是看当前设定的sparethread 默认值是否合适

tomcat_threadpool_currentthreadcount:现有线程
tomcat_threadpool_currentthreadsbusy:忙碌线程

topk(5,sum(tomcat_threadpool_currentthreadcount{protocol=~"http.*"}-tomcat_threadpool_currentthreadsbusy{protocol=~"http.*"})by (instance,port,infra,env,customer,app))

在这里插入图片描述

topk(5,jvm_memory_bytes_init{area="heap"})
topk(5,jvm_memory_bytes_max{area="heap"})
jvm  堆内存初始化值和最大值 放在总览主要是想看每个tomcat 分配的初始值和最大值
topk(5,rate(jvm_memory_bytes_committed{area="heap"}[5m]))
保证可用于JVM的内存量。此数量根据内存使用量而变化,并增加到为JVM设置的最大值
此值为5分钟内的变化的值
topk(5,jvm_memory_bytes_used{area="heap"})
JVM当前使用的内存量(例如,应用程序,垃圾回收)

5.CPU及JVM内存

process_open_fds:文件描述符
process_cpu_seconds_total:处理cpu总秒数
tomcat_requestcount_total:请求总数
jvm_threads_started_total:线程总数
catalina_connector_maxthreads:最大线程数
catalina_threadpool_minsparethreads: 最小空闲线程,此值太大会影响性能,因为不用,也建立线程会使用系统资源
catalina_connector_acceptcount: socket 获取连接的队列最大长度
catalina_threadpool_acceptorthreadcount: 用于接收连接的线程的数量,默认值是1。一般这个指需要改动的时候是因为该服务器是一个多核CPU,如果是多核 CPU 一般配置为 2。
tomcat_threadpool_pollerthreadcount: 表示用于polling IO事件的线程个数,默认为1。在多核CPU架构下,我们可以设置为2来提高polling的能力.
tomcat_bytesreceived_total/tomcat_bytessent_total:流量发送和接受的字节数
tomcat_requestcount_total/tomcat_errorcount_total:请求吞吐量和错误数指标判断请求激增的情况下与错误数量的对比
#tomcat各种线程状态数量
tomcat_threadpool_currentthreadcount
tomcat_threadpool_currentthreadsbusy
tomcat_threadpool_connectioncount
tomcat_threadpool_keepalivecount
#session相关
tomcat_session_expiredsessions_total
tomcat_session_rejectedsessions_total
#
process_start_time_seconds: 已启动时间
java_lang_operatingsystem_availableprocessors:CPU数量
java_lang_operatingsystem_systemloadaverage:系统负载
#进程和系统使用的cpu负载
java_lang_operatingsystem_systemcpuload
java_lang_operatingsystem_processcpuload
#内存池的使用情况
jvm_memory_pool_bytes_used
jvm_memory_pool_bytes_committed
#已经加载的类
jvm_classes_loaded
# gc耗时的平均每秒增长值
jvm_gc_collection_seconds_sum

4.集成Grafana

JMX Exporter 在 Grafana 上为我们提供好了 Dashboard 模板:https://grafana.com/dashboards/
在这里插入图片描述
导入8563模板,简单修改就可以使用了。
在这里插入图片描述
job修改为Prometheus配置文件中对应的名称
在这里插入图片描述
参考文献:
https://www.cnblogs.com/muzhifei/p/13110508.html
https://www.cnblogs.com/you-men/p/13216976.html


版权声明:本文为ZhanBiaoChina原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。