通过zabbix监控 tomcat

jvm监控  

需要安装一个tomcat  并且需要安装agent

jvm监控 需要 zabbix-server  还需要一个java gateway  通过java gatewat 监控java 的app

java的app 就是 tomcat  

所有的数据 还是写在mysql数据库里面

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp

开始操作

架构图

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_02

先给java gate way 机器 安装zabbix源 1.209

wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-3%2Bbionic_all.deb
dpkg -i zabbix-release_4.0-3+bionic_all.deb

安装

apt update

java gateway 机器不用装agent

apt -y install zabbix-java-gateway

直接安装 zabbix-java-gateway

###注意注意!!!!

如果想用

server---proxy----java gateway---tomcat

proxy和server需要配置的内容一样!!!!

都需要改!!如下

root@zabbix-proxy-2:~# egrep -v '^$|^#' /etc/zabbix/zabbix_proxy.conf 
ProxyMode=0
Server=192.168.1.201
Hostname=Zabbix-proxy-2
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_proxy.pid
SocketDir=/var/run/zabbix
DBHost=192.168.1.202
DBName=zabbix_proxy2
DBUser=zabbix2
DBPassword=123456
JavaGateway=192.168.1.209
StartJavaPollers=20
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=30
ExternalScripts=/usr/lib/zabbix/externalscripts
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000

并且tomcat agent内容如下

root@agent-tomcat-1:/apps# egrep -v '^$|^#' /etc/zabbix/zabbix_agentd.conf 
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=192.168.1.201,192.168.1.205
##server端和proxy端
ServerActive=192.168.1.205
##proxy端
Hostname=192.168.1.207
Include=/etc/zabbix/zabbix_agentd.d/*.conf

Zabbix-server的端口号是10051

Zabbixa-gent端口号是10050

Zabbix-proxy端口号是10050

Java-gateway 端口号是10052

装完java-gateway 后会在/etc/zabbix  产生配置文件

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_03

vim /etc/zabbix/zabbix_java_gateway.conf

打开

3-Zabbix JMX 和 TCP 监控 TCP状态_java_04

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_05

3-Zabbix JMX 和 TCP 监控 TCP状态_java_06

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_07

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_08

3-Zabbix JMX 和 TCP 监控 TCP状态_java_09

配置文件并没有指定zabbix-server

保存退出

systemctl start zabbix-java-gateway

启动java-gateway

3-Zabbix JMX 和 TCP 监控 TCP状态_java_10

然后去zabbix-server 机器上调用  这个java-gateway

切换 server端

vim /etc/zabbix/zabbix_server.conf

打开server的配置文件

3-Zabbix JMX 和 TCP 监控 TCP状态_java_11

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_12

3-Zabbix JMX 和 TCP 监控 TCP状态_java_13

3-Zabbix JMX 和 TCP 监控 TCP状态_java_14

3-Zabbix JMX 和 TCP 监控 TCP状态_java_15

保存退出

systemctl restart zabbix-server.service

重启server

egrep -v "^$|^#" /etc/zabbix/zabbix_server.conf

LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
 DBHost=192.168.1.202
DBName=zabbix_server_247
DBUser=zabbix
DBPassword=123456
 JavaGateway=192.168.1.209
 StartJavaPollers=20
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000

这是java-gateway  地址 端口号 以及启动多少个进程来获取数据

 ps -ef | grep zabbix

重启后看下server服务 他会启动很多进程

然后去配置tomcat

如何让java-gateway 去获取 tomcat 的信息

去tomcat 官网

tomcat.apache.org

我也不截图了 反正也看不懂

CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=192.168.1.207"

把这些加到

这个 192.168.1.207  是tomcat 的ip

vim /apps/tomcat/bin/catalina.sh

里面

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_16

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_17

CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
##启动一个端口号12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=192.168.1.207"
##tomcat的本机的ip地址

保存退出 重启tomcat

注意!!!这台机器要安装agent  并且 指向server

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_18

在server控制台上找到这台机器 tomcat

3-Zabbix JMX 和 TCP 监控 TCP状态_java_19

添加jmx接口

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_20

端口号默认是12345

然后添加模板  官方给我们自带了一个jmx模板  

3-Zabbix JMX 和 TCP 监控 TCP状态_java_21

一般都用第一个  叫通用的java 模板

添加 然后更新

等待

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_22

等待jmx变绿

不绿就重启 server端  或者本机agent端 之类的

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_23

然后可以看图了

这是官方给自带的模板

我把这个模板删了 不使用这个

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_24

然后我们加一个模板

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_25

导入模板

3-Zabbix JMX 和 TCP 监控 TCP状态_java_26

tomcat-template-weixiedu.xml

文件

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_27

然后切换到tomcat机器  将导入的模板添加到这个机器上

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_28

这时候再等jmx 变绿

3-Zabbix JMX 和 TCP 监控 TCP状态_java_29

再看图

这就是tomcat 的监控

监控一个jmx 方法:

1 首先安装java-gateway 启动他 端口号10052

2 在zabbix-server 上添加java-gateway 让他知道java-gateway在哪里

3 然后在tomcat上 添加jmx配置

4 在zabbix-web 界面上添加主机和jmx接口

tcp监控

tcp状态值

tcp有十一种状态

tcp三次握手和四次断开

中有11种状态

三次握手状态:

三台握手客户端  服务端 

没连接之前 他们的状态值都是closed(关闭)

一旦客户端需要连接 服务端的时候

肯定是服务端有个服务启动了 他的状态值 变成listen  有个端口号

然后客户端去连接  这个连接 是三次握手的第一步 发起请求 叫SYN请求

发起SYN请求 同时带有seq序列号 比如是x  SYN,seq=x

正常三次握手第一次  服务端有一个服务器启动了 肯定会启动一个端口号

这个端口号 客户端会去连接比如服务的是80端口号  

客户端要去连接服务的的80端口

这时候 客户端的状态不是 closed了  就会变成syn-sent

现在服务端接收到了  客户端的请求 

服务的状态值就变了  不是listen了 就是syn-rcvd

同时服务端 也会响应客户端请求   给客户端响应报文  ACK,ack=x+1,SYN,syn=y

(有个人ack确认消息  同时有个ack序列号 ack=x+1 比上面x大1 同时 他会发起SYN请求他也有一个序列值 seq=y)

第二个包是服务的同时发两个

现在客户端接收到ACK的响应包 同时又接收SYN请求包

这时候 客户端会给服务端响应 然后客户端给服务端响应 ACK,ack=y+1

然后客户端状态会变成established

同样这个时候服务端也会变成established 状态值

当都是ESTABLISHED这时候 在传输数据

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_30

3-Zabbix JMX 和 TCP 监控 TCP状态_java_31

这就是tcp三次握手的整个过程

状态值客户端有三  CLOSED  SYN-SENT  ESTABLISHED

服务端有四个 CLOSED LISTEN  SYN-RCVD  ESTABLISHED

整个三次握手一共出现了 五个状态值

一共是七次

但是有重复的 CLOSED ESTABLISHED

除了这五种以外  还有六种  是在断开数据  四次挥手的过程中 产生的

四次挥手状态

客户端  服务端 

数据传输完成后 要做四次断开

第一个状态值 首先客户端状态值是ESTABLISHED

服务端也是 ESTABLISHED

首先客户端已经把所有数据都传给服务端了 要求断开

客户端 发起FIN 请求 序列号假设为p  FIN,seq=p

然后客户端发完请求 状态值改为FIN-WAIT-1

这时候服务端收到 断开连接的请求 收到后 立即给客户端响应消息

服务端响应 ACK,ack=p+1

同时服务端状态值变为 CLOSED-WAIT(等待关闭的状态)

同时客户端接收响应后 状态值也变成了 FIN-WAIT-2  

虽然服务端给响应了 但是 服务端可能没有传输完数据

服务端如果传输完数据了 会发送断开请求

服务端发FIN,seq=q,ACK,ack=p+1

然后服务端状态值变为LAST-ACK

客户端收到以后 给服务端发送确认消息 ACK,seq=q+1

状态值变为 TIME-WAIT(等待时间)

最终TIME-WAIT时间过了后 客户端状态变为CLOSED

同样服务端也变为CLOSED

当客户端和服务端 状态都为CLOSED 的时候 说明断开了

四次

3-Zabbix JMX 和 TCP 监控 TCP状态_java_32

tcp四次挥手

四次断开 一共有  客户端 有5种状态码

服务端 有 4种状态

一共出现了 7种状态  

三次握手 四次挥手 一共11 种状态

监控这11种状态

需要写脚本

如何获取这些值

ss -tnl

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_33

这些就是状态值

还有

ss -ant

3-Zabbix JMX 和 TCP 监控 TCP状态_java_34

传个脚本 去获取这些值

cd /etc/zabbix/zabbix_agentd.d/

去这个目录写脚本

注意脚本要写在被监控端!!!

tcp_conn_plugin.sh

把这个脚本传进去

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_35

脚本内容如下

#!/bin/bash
tcp_conn_status(){
  TCP_STAT=$1
  ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt
  TCP_NUM=$(grep "$TCP_STAT" /tmp/tcp_conn.txt| cut -d ' ' -f2)
  if [ -z $TCP_NUM ];then
       TCP_NUM=0
  fi

  echo $TCP_NUM 
}

main(){
   case $1 in
        tcp_status)
             tcp_conn_status $2;
        ;;
   esac
}
main $1 $2

解释:

#!/bin/bash

tcp_conn_status(){

  TCP_STAT=$1

##定义一个变量TCP_STAT=$1  最终引用传两个值给他 看最后一行

  ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt

##命令来获取

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_36

##获取当前11种状态值 出现的次数

##把这个值写到/tmp/tcp_conn.txt这个文件里面了 然后过滤这个文件

  TCP_NUM=$(grep "$TCP_STAT" /tmp/tcp_conn.txt| cut -d ' ' -f2)

##过滤这个文件 执行$TCP_STAT 是因为 我需要手工加参数 比如我要获取 ESTAB就需要在执行脚本的时候 加上这个参数

  if [ -z $TCP_NUM ];then

       TCP_NUM=0

##如果获取的这个值为空 那么给他弄个数0  因为如果没有值zabbix会报错 如果没有这个值 说明 系统当时没有出现这个状态

  fi

  echo $TCP_NUM

##如果有的就输出

}

main(){

   case $1 in

        tcp_status)

             tcp_conn_status $2;

##如果$1传的是tcp_status 我就引用上面那个函数 然后给他传个$2  这个$2就相当于上面的 TCP_STAT

##注意!!!虽然上面那个函数写的是$1 但是外面脚本只执行了  第二个函数  然后跟上两个参数  第一个函数的 $1 在tcp_conn_status $2 执行第一个参数  并且后面跟上了 真正的$2  也就是说  上面第一个函数的$1  其实 是$2  因为 tcp_conn_status $2  这就相当于一个独立的脚本 然后跟上了  外面脚本的第二个参数 但是 对于这个第一个函数 来说是第一个参数!!所以 上面$1 等于 外面$2

        ;;

   esac

}

main $1 $2

测试一下

sh tcp_conn_plugin.sh tcp_status LISTEN

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_37

比如我们想获取LISTEN 状态值

$1 是tcp_status $2就是状态名

rm -rf /tmp/tcp_conn.txt

删掉那个文件

这样的话 就能看到 某个状态 当前有多少数量

给脚本加权限

chmod +x tcp_conn_plugin.sh

去修改zabbix_agtent  配置文件 让他支持脚本

vim /etc/zabbix/zabbix_agentd.conf

3-Zabbix JMX 和 TCP 监控 TCP状态_java_38

UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.d/tcp_conn_plugin.sh "$1" "$2"

加入这么一条  指向脚本目录   脚本必须有执行权限

systemctl restart zabbix-agent.service

重启 agent

手工测试一下  去server用命令行测试

切换到zabbix-server  安装

apt -y install zabbix-get

3-Zabbix JMX 和 TCP 监控 TCP状态_java_39

-s 主机ip

-p 端口号

-k key值  这个key值就是在agent配置文件中定义的

zabbix_get -s 192.168.1.207 -k linux_status["tcp_status","LISTEN"]

中括号里的第一个是 $1 第二个是$2

这样通过远程zabbix get 的方式获取

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_40

能获取到 说明 server  和agent 通信没有问题

然后需要在服务端 添加

我们先导入一个模板

template Linux TCP_CONN Status.xml

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_41

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_42

直接导入

然后看下模板里面有啥内容

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_43

有11个监控项

就是监控11个状态值的

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_44

还有个触发器

3-Zabbix JMX 和 TCP 监控 TCP状态_zabbix_45

TCP ESTABLISHED大于5500会报警

然后将模板添加到主机

3-Zabbix JMX 和 TCP 监控 TCP状态_tcp_46

然后去看图 有没有数据

zabbix添加监控过程:

1 在zabbix-agent的zabbix-agentd.conf目录下添加监控脚本

2在zabbix-agent.conf配置文件内添加UserParameter=<item key>,/etc/zabbix/zabbix_agent.d/monitor-scripts “$1” “$2”

3 在zabbix-server上使用zabbix-get命令测试监控项是否正常;zabbix-get -s zabbix-agent-ip -p zabbix-agent-port -k <item key>[“1”,”2”]

4 在zabbix web上对应主机上添加监控项,或者添加到模板内