zabbix安裝和擴展(集成JMX和自定義監控JVM資訊)
zabbix簡介
Zabbix 由 Alexei Vladishev 創建,目前由其成立的公司—— Zabbix SIA 積極的持續開發更新維護, 并為用戶提供技術支持服務,
Zabbix 是一個企業級分布式開源監控解決方案,
Zabbix 軟體能夠監控眾多網路引數和服務器的健康度、完整性,Zabbix 使用靈活的告警機制,允許用戶為幾乎任何事件配置基于郵件的告警,這樣用戶可以快速回應服務器問題,Zabbix 基于存盤的資料提供出色的報表和資料可視化功能,這些功能使得 Zabbix 成為容量規劃的理想選擇,
Zabbix 支持主動輪詢(polling)和被動捕獲(trapping),Zabbix所有的報表、統計資料和配置引數都可以通過基于 Web 的前端頁面進行訪問,基于 Web 的前端頁面確保您可以在任何地方訪問您監控的網路狀態和服務器健康狀況,適當的配置后,Zabbix 可以在監控 IT 基礎設施方面發揮重要作用,無論是對于有少量服務器的小型組織,還是擁有大量服務器的大企業而言,同樣適用,
Zabbix 是免費的,Zabbix 是根據 GPL 通用公共許可證的第二版撰寫和發布的,這意味著產品源代碼是免費發布的,可供公共使用
zabbix官網地址:
https://www.zabbix.com/documentation/4.0/zh/manual/introduction/manual_structure
zabbix安裝
環境準備
Oracle VM VirtualBox安裝Centos7- Mini
IP
zabbix-server:192.168.0.195
zabbix-agent-1:192.168.0.191
zabbix-agent-2:192.168.0.190
關系圖

zabbix-agent是放在客戶端,收集客戶端機器的監控資訊(具體的監控內容可以查看官網),zabbix-server是服務端,統計agent收集的資訊,并且保存在資料庫,默認的使用是mysql資料庫,
zabbix存在兩種模式,一種是server去每個agent獲取資訊,另一種是agent主動的向server推送資訊,具體的使用方式則需要根據實際場景來調整了,
安裝
zabbix的安裝依賴特別多,筆者開始安裝的時候也是在離線環境的,通過 “yum install --download --downloaddir=目錄名 軟體名”命令下載安裝包,復制到離線環境進行安裝,由于依賴實在太多了,被迫放棄了這個方式,給虛擬機新增了一個網卡(自己組裝的兩臺雙網卡機器,一個網卡是可以連外網的),還是有網香啊(手動狗頭)
本次安裝的是zabbix3.0,廢話不多說,上安裝命令:
首先安裝zabbix-server
#安裝zabbix源、aliyun YUM源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
#安裝zabbix
yum install -y zabbix-server-mysql zabbix-web-mysql
#安裝啟動 mariadb資料庫
yum install -y mariadb-server
systemctl start mariadb.service
#創建資料庫
mysql -e 'create database zabbix character set utf8 collate utf8_bin;'
mysql -e 'grant all privileges on zabbix.* to zabbix@localhost identified by "zabbix";'
#匯入資料
zcat /usr/share/doc/zabbix-server-mysql-3.0.13/create.sql.gz|mysql -uzabbix -pzabbix zabbix
#配置zabbixserver連接mysql
sed -i.ori '115a DBPassword=zabbix' /etc/zabbix/zabbix_server.conf
#添加時區
sed -i.ori '18a php_value date.timezone Asia/Shanghai' /etc/httpd/conf.d/zabbix.conf
#解決中文亂碼
yum -y install wqy-microhei-fonts
\cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/fonts/dejavu/DejaVuSans.ttf
#啟動服務
systemctl start zabbix-server
systemctl start httpd
#寫入開機自啟動,根據自己需要,建議在除錯期間不要直接寫入,等你穩定了再寫也不遲
chmod +x /etc/rc.d/rc.local
cat >>/etc/rc.d/rc.local<<EOF
systemctl start mariadb.service
systemctl start httpd
systemctl start zabbix-server
EOF
接下來就是說說安裝程序中踩的坑了
這個是因為selinux處于開啟狀態,官網上面有說明,需要關閉,
setenforce 0
第二個問題,由于是參考人家的,所以在匯入資料的步驟路徑沒有改對,所以導致后面頁面配置后沒有資料
#匯入資料
zcat /usr/share/doc/zabbix-server-mysql-3.0.13/create.sql.gz|mysql -uzabbix -pzabbix zabbix
zabbix-server-mysql-3.0.13這個以自己實際的版本為準
到這里zabbix-server安裝成功并且啟動!!!!
安裝客戶端zabbix-agent:
#安裝zabbix源、aliyu nYUM源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
#安裝zabbix客戶端
yum install zabbix-agent -y
#設定server的IP,主動推送的地址
sed -i.ori 's#Server=192.168.0.195#Server=192.168.0.195#' /etc/zabbix/zabbix_agentd.conf
systemctl start zabbix-agent.service
#寫入開機自啟動
chmod +x /etc/rc.d/rc.local
cat >>/etc/rc.d/rc.local<<EOF
systemctl start zabbix-agent.service
EOF
同樣的,這里seliunx也需要關閉,不過啟動的時候經常會出現錯誤資訊,我們可以通過查看日志來鎖定問題,在 /etc/zabbix/zabbix_agent.conf記錄了日志的路徑,默認路徑為/var/log/zabbix/下面

我們已經安裝好了zabbix-server和zabbix-agent,需要檢測下是否連接成功,zabbix給我們提供了工具,zabbix-get需要安裝在server端,安裝一下吧!
yum install zabbix-get
安裝完成后開始檢測是否連接成功,我裝了兩個agent
zabbix_get -s 192.168.0.191 -p 10050 -k “system.cpu.load[all,avg1]”
zabbix_get -s 192.168.0.190 -p 10050 -k “system.cpu.load[all,avg1]”

在此說明下,agent的埠是10050,server的埠是10051
接下來我們就可以去頁面看看我們安裝的zabbix了:http://192.168.0.195/zabbix/setup.php
頁面的配置基本上都是下一步,這里就不過多描述了,網上很多,肯定難不倒各位大佬,跳過(手動狗頭)!
可以參考下面的鏈接,描述的非常詳細
參考 https://www.cnblogs.com/clsn/p/7885990.html#auto-id-1
zabbix集成JMX
上述說的是ZBX模塊的功能,主要是硬體相關的監控,接下來我們就要開始擴展的內容了,
我是一名Java開發,在系統上線后如果經常出現記憶體溢位等情況,就需要跟現場的實施或者運維同事溝通,然后下載dump檔案進行分析,如果現場是個離線的環境那就更痛苦了,如果這時候能有個系統能把JVM也展示出來就方便很多了,從官網上面看zabbix剛好可以做到這點,美滋滋,
監控原理:當Zabbix-Server需要知道java應用程式的某項性能的時候,會啟動自身的一個Zabbix-JavaPollers行程去連接Zabbix-Java-Gateway請求資料,而Zabbix-Java-gateway收到請求后使用"JMXmanagementAPI"去查詢特定的應用程式,而前提是應用程式這端在開啟時需要"-Dcom.sun.management.jmxremote"引數來開啟JMX遠程查詢就行,Java程式會啟動自身的一個簡單的小程式埠12345向Zabbix-JavaGateway提供請求資料,

zabbix-java-gateway充當一個采集器,是一個獨立的模塊,不強制要求安裝在zabbix-server所在的服務器,或者裝在zabbix-agent所在服務器,我這次是安裝在了zabbix-server所在服務器,也就是192.168.0.195上面,不想新創建虛擬機了,
yum install -y zabbix-java-gateway
[root@zabbix ~]# vim /etc/zabbix/zabbix_java_gateway.conf
LISTEN_IP="0.0.0.0" #監聽地址
LISTEN_PORT=10052 #監聽埠
PID_FILE="/var/run/zabbix/zabbix_java.pid"#PID_FILE檔案
START_POLLERS=5 #開啟的作業執行緒數
[root@zabbix ~]# systemctl start zabbix-java-gateway.service
[root@zabbix ~]# systemctl enable zabbix-java-gateway.service
[root@zabbix ~]# vim /etc/zabbix/zabbix_server.conf
JavaGateway=127.0.0.1 #java_gateway的地址
JavaGatewayPort=10052 #java_gateway的埠
StartJavaPollers=5 #采集行程數,與java_gateway配置相同
[root@zabbix ~]# systemctl restart zabbix-server.service #重啟zabbix-server
這樣就配置完成了,就等著某臺機器上面的Java程式啟動了
監控TomCat啟動的服務
加入配置
vim /application/tomcat/bin/catalina.sh
#!/bin/sh
CATALINA_OPTS="-Dcom.sun.management.jmxremote #開啟遠程監控
-Dcom.sun.management.jmxremote.authenticate=false #關閉權限認證
-Dcom.sun.management.jmxremote.ssl=false #遠程ssl驗證為false
-Djava.rmi.server.hostname=192.168.0.191 #部署了tomcat的主機地址
-Dcom.sun.management.jmxremote.port=12345" #遠程監控埠
spring boot直接用Java -jar啟動
需要在啟動的命令上面加一些引數,啟動命令如下:
nohup java -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.0.191 -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dloader.path=config -jar ***.jar &
啟動后在頁面上面:配置–>主機 添加JMX




這些就是JXM的內容,系統使用的是JDK1.8的版本,所以沒有了永久代資訊
從這里我們可以看到,很多JVM資訊在頁面上并沒有看到,比如Full GC的次數,以及Full GC平均耗時,查閱了很多資料,基本上都是使用腳本來收集資料,不過網上對自定義item的描述非常少,所以下面我們就需要了解下自定義item監控JVM剩下的資訊
自定義item監控JVM 垃圾回收(GC)狀態
監控基礎: linux下監控jvm的gc狀態的工具為jdk自帶 jstat

配置agent監控腳本:
vi /etc/zabbix/shell/get_socket_jstat_status.sh
TargetWord和JavaBinDir根據自己實際情況去改了
#!/bin/bash
TargetWord='control_center.jar'
JavaBinDir='/home/java/jdk/jdk1.8.0_311/bin/'
PID=$("${JavaBinDir}"jps -l |grep ${TargetWord} | awk -F' ' '{print $1}')
flag=0
for i in $PID
do
if [ ! -z $i ]
then
let flag+=1
fi
done
if [ $flag -ne 1 ]
then
echo "the number of $TargetWord is more than 1 !!!"
exit
fi
# get value from jstat
function gcstat_colum(){
if [ ! -z ${1} ] && [ -z ${2} ]
then
ret=`"${JavaBinDir}"jstat -gccause $PID 1 1 |tail -1|awk -F' ' '{print $'${1}'}'`
echo $ret
elif [ ! -z ${1} ]&& [ ! -z ${2} ]
then
ret=`"${JavaBinDir}"jstat -gccause $PID 1 1 |tail -1|awk -F' ' '{print $'${1}',$'${2}'}'`
echo $ret
else
echo 'function get wrong arguments !'
fi
}
# print prompt when script parameter is wrong
function print_prompt(){
echo ' please input correct parameter !'
echo '
s1 (Survivor0)
s2 (Survivor1)
eden(Eden)
old (Old)
meta(Metaspace)
css (CCS)
ygc (YGC)
ygct(YGCT)
fgc (FGC)
fgct(FGCT)
gct (GCT)
lgcc(LGCC)
gcc (GCC)
'
}
# transfer script's parameter to function gcstat_colum()
case $1 in
s1)
gcstat_colum 1
;;
s2)
gcstat_colum 2
;;
eden)
gcstat_colum 3
;;
old)
gcstat_colum 4
;;
meta)
gcstat_colum 5
;;
css)
gcstat_colum 6
;;
ygc)
gcstat_colum 7
;;
ygct)
gcstat_colum 8
;;
fgc)
gcstat_colum 9
;;
fgct)
gcstat_colum 10
;;
gct)
gcstat_colum 11
;;
lgcc)
gcstat_colum 12 13
;;
gcc)
gcstat_colum 14 15
;;
*)
print_prompt
;;
esac
添加執行權限
chmod +x /etc/zabbix/shell/get_socket_jstat_status.sh
agent組態檔:
/etc/zabbix/zabbix_agentd.d/userparameter_socket.conf

UserParameter=Socket.Survivor0,/etc/zabbix/shell/get_socket_jstat_status.sh s1
UserParameter=Socket.Survivor1,/etc/zabbix/shell/get_socket_jstat_status.sh s2
UserParameter=Socket.Eden,/etc/zabbix/shell/get_socket_jstat_status.sh eden
UserParameter=Socket.Old,/etc/zabbix/shell/get_socket_jstat_status.sh old
UserParameter=Socket.Metaspace,/etc/zabbix/shell/get_socket_jstat_status.sh meta
UserParameter=Socket.CCS,/etc/zabbix/shell/get_socket_jstat_status.sh css
UserParameter=Socket.YGC,/etc/zabbix/shell/get_socket_jstat_status.sh ygc
UserParameter=Socket.YGCT,/etc/zabbix/shell/get_socket_jstat_status.sh ygct
UserParameter=Socket.FGC,/etc/zabbix/shell/get_socket_jstat_status.sh fgc
UserParameter=Socket.FGCT,/etc/zabbix/shell/get_socket_jstat_status.sh fgct
UserParameter=Socket.GCT,/etc/zabbix/shell/get_socket_jstat_status.sh gct
UserParameter=Socket.LGCC,/etc/zabbix/shell/get_socket_jstat_status.sh lgcc
UserParameter=Socket.GCC,/etc/zabbix/shell/get_socket_jstat_status.sh gcc
修改zabbix-agent.conf,將上述腳本和zabbix-agent關聯上

vi /etc/zabbix/zabbix_agentd.conf
Include=/etc/zabbix/zabbix_agentd.d/*.conf
重啟zabbix-agent
systemctl restart zabbix-agent.service
檢測是否生效
zabbix_get -s 192.168.0.191 -p 10050 -k "Socket.Eden"

這樣我們就可以監控到JVM Eden的資訊了,腳本里有很多資訊,就不去一一驗證了,
繼續說踩坑,這里面最大的坑就是我手動執行了這個sh檔案,得到了正確的結果,但是用上述命令測驗連通性,就一直不對,提示:the number of $TargetWord is more than 1 !!!,意思就是找不到行程,但是我了解中zabbix用戶是可以訪問到root用戶啟動的執行緒的
#查看root用戶啟動執行緒
ps -ef |grep root

ls -l /proc/1/

都沒有問題,最后發現是jps不能支持跨用戶訪問,面臨選擇,要么改腳本要么用zabbix用戶啟動執行緒,shell腳本對我來說比較陌生,嘗試了幾個方法最后妥協了,無奈,如果有大佬愿意教我一下,我會很感激的,
感覺已經快成功了,就差最后一步配置模板了,沖沖沖
配置–>模板–>創建模板






模板配置完成,檢測下成果

搞定!!!剩下的就不說了,一個個加上去就好了
花了一個禮拜把這些都過了一遍,又花了一下午寫了這篇文章,希望對大家有點幫助,寫的不對的地方希望幫忙指正下,感謝感謝,繼續干活,后續還需要把這些東西放到docker上,估計就近期吧
這塊參考的文章:https://blog.csdn.net/yetugeng/article/details/101681698
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354809.html
標籤:其他
