1. 程式人生 > 實用技巧 >監控中心Zabbix進階(轉)

監控中心Zabbix進階(轉)

監控中心Zabbix進階

一、Zabbix 基於SNMP監控

1、介紹

  • SNMP:簡單網路管理協議;(非常古老的協議)

  • 三種通訊方式:讀(get, getnext)、寫(set)、trap(陷阱);

  • 埠:

  161/udp

  162/udp

  • SNMP協議:年代久遠

  v1: 1989

  v2c 1993

  v3: 1998

  • 監控網路裝置:交換機、路由器

  • MIB:Management Information Base 資訊管理基礎

  • OID:Object ID 物件ID

2、Linux 啟用 snmp

[root@node1 ~]# yum install net-snmp net-snmp-utils

配置檔案:定義ACL

[root@node1 ~]# vim /etc/snmp/snmpd.conf

啟動服務:

[root@node1 ~]# systemctl start snmpd  # 被監控端開啟的服務
[root@node1 ~]# systemctl start snmptrapd    # 監控端開啟的服務(如果允許被監控端啟動主動監控時啟用)

3、配置檔案的介紹

開放資料:4步

1、定義認證符,將社群名稱"public"對映為"安全名稱"

2、將安全名稱對映到一個組名

3、為我們建立一個檢視,讓我們的團隊有權利

掩碼:我列出一些註釋,有很多,可以再網上查詢

.1.3.6.1.2.1.

   1.1.0:系統描述資訊,SysDesc

   1.3.0:監控時間, SysUptime

   1.5.0:主機名,SysName

   1.7.0:主機提供的服務,SysService

.1.3.6.1.2.2.

   2.1.0:網路介面數目

   2.2.1.2:網路介面的描述資訊

   2.2.1.3:網路介面型別

   ……

4、授予對systemview檢視的只讀訪問權

4、測試工具

[root@node1 ~]# snmpget -v 2c -c public HOST OID
[root@node1 ~]# snmpwalk -v 2c -c public HOST OID # 通過這個埠查詢到的資料,全列出了

4、配置SNMP監控

1、下載,修改配置檔案

[root@node1 ~]# vim /etc/snmp/snmpd.conf
view    systemview    included   .1.3.6.1.2.1.1
view    systemview    included   .1.3.6.1.2.1.2      # 網路介面的相關資料
view    systemview    included   .1.3.6.1.4.1.2021   # 系統資源負載,memory, disk io, cpu load 
view    systemview    included   .1.3.6.1.2.1.25

2、在 agent 上測試

[root@node1 ~]# snmpget -v 2c -c public 192.168.30.2 .1.3.6.1.2.1.1.3.0
[root@node1 ~]# snmpget -v 2c -c public 192.168.30.2 .1.3.6.1.2.1.1.5.0

3、在監控頁面,給node2加一個snmp的介面

4、在 node2 上加一個 Template OS Linux SNMPv2 模板

  • 模板新增成功,生成一系列東西

  • 點開一個item 看一下

5、生成一些最新資料的圖形 graph了

5、設定入站出站packets 的SNMP監控

1、監控網路裝置:交換機、路由器的步驟:

  • 把交換機、路由器的SNMP 把對應的OID的分支啟用起來

  • 瞭解這些分支下有哪些OID,他們分別表示什麼意義

  • 我們要監控的某一資料:如交換機的某一個介面流量、報文,傳送、傳入傳出的報文數有多少個;傳入傳出的位元組數有多少個,把OID取出來,儲存

2、定義入站出站的item監控項

interface traffic packets(in)

interface traffic packets(out)

二、

1、介紹

Java虛擬機器(JVM)具有內建的外掛,使您能夠使用JMX監視和管理它。您還可以使用JMX監視工具化的應用程式。

1、配置設定介紹

1、zabbix-java-gateway主機設定
  • 安裝 zabbix-java-gateway程式包,啟動服務;
[[email protected] ~]# yum -y install zabbix-java-gateway
2、zabbix-server端設定(需要重啟服務)
JavaGateway=172.16.0.70                    #即 zabbix server IP地址
JavaGatewayPort=10052
StartJavaPollers=5  #監控項
3、tomcat主機設定
  • 監控tomcat:
[[email protected] ~]# vim /etc/sysconfig/tomcat
CATALINA_OPTS="-Djava.rmi.server.hostname=TOMCAT_SERVER_IP -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"   #啟用JVM介面,預設沒有啟用

jmx[object_name,attribute_name]
object name      # 它代表MBean的物件名稱
attribute name - # 一個MBean屬性名稱,可選的複合資料欄位名稱以點分隔
示例:
jmx["java.lang:type=Memory","HeapMemoryUsage.used"

4、 jmx的詳細文件:https://docs.oracle.com/javase/1.5.0/docs/guide/management/agent.html

  • 注意: 如果是手動安裝的tomcat 需要編輯 catalina.sh 檔案 ,重啟 tomcat

2、配置JVM介面監控

1、安裝配置 tomcat

1、下載安裝tomcat,主要是用JVM
[[email protected] ~]# yum -y install java-1.8.0-openjdk-devel tomcat-admin-webapps tomcat-docs-webapp
2、加CATALINA_OPTS= #啟用JVM介面,預設沒有啟用
[[email protected] ~]# vim /etc/sysconfig/tomcat
CATALINA_OPTS="-Djava.rmi.server.hostname=192.168.30.2 -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=true   -Dcom.sun.management.jmxremote.port=12345  -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false"

3、開啟服務

[[email protected] ~]# systemctl start tomcat

2、在 zabbix-server 端安裝配置 java-gateway

1、安裝配置 java-gateway
[[email protected] ~]# yum -y install zabbix-java-gateway
[[email protected] ~]# vim /etc/zabbix/zabbix_java_gateway.conf   # 安裝完後,會生成一個java_gateway 的配置檔案
LISTEN_IP="0.0.0.0"                             #監聽伺服器地址
LISTEN_PORT=10052                               #監聽zabbix_java程序的埠,預設是10052
PID_FILE="/tmp/zabbix_java.pid"                 #zabbix_java的pid路徑
START_POLLERS=5                                 #zabbix_java的程序數
TIMEOUT=10                                      #zabbix_java的超時時間
[[email protected] ~]# systemctl start zabbix-java-gateway.service # 可不用修改,直接開啟服務 
2、修改 server 配置開啟 java-gateway 的配置
[[email protected] ~]# vim /etc/zabbix/zabbix_server.conf
JavaGateway=192.168.30.107  
JavaGatewayPort=10052
StartJavaPollers=5    # 開啟5個監控項
3、 重啟zabbix-server 服務
[[email protected] ~]# systemctl restart zabbix-server 

3、在node2 主機上新增JMX介面,實驗模板

1、新增JMX介面

2、在 node2 上連線 tomcat JMX 模板

3、隨便檢視一個監控項 item

4、自己定義一個堆記憶體使用的監控項,基於JVM介面(沒必要,使用模板就好)

三、Zabbix 分散式監控

1、介紹

分散式監控概述:proxy and node

1、Zabbix 的三種架構

  • Server-agent

  • Server-Node-agent

  • Server-Proxy-agent

2、配置介紹

Zabbix Proxy的配置:

  • server-node-agent

  • server-proxy-agent

1、配置proxy主機
1、安裝程式包
zabbix-proxy-mysql zabbix-get zabbix-agent zabbix-sender
2、準備資料庫

  建立、授權使用者、匯入schema.sql;

3、修改配置檔案
Server= zabbix server  # 主機地址;
Hostname=              # 當前代理伺服器的名稱;在server新增proxy時,必須使用此處指定的名稱;需要事先確保server能解析此名稱;
DBHost=
DBName=
DBUser=
DBPassword=
ConfigFrequency=10    # proxy被動模式下,server多少秒同步配置檔案至proxy。該引數僅用於被動模式下的代理。範圍是1-3600*24*7
DataSenderFrequency=1 #代理將每N秒將收集的資料傳送到伺服器。 對於被動模式下的代理,該引數將被忽略。範圍是1-3600
4、在 server 端新增此 Porxy

​ Administration --> Proxies

5、在Server端配置通過此Proxy監控的主機;

注意:zabbix agent 端要允許 zabbix proxy 主機執行資料採集操作:

2、實現分散式 zabbix proxy 監控

1、實驗前準備

  • ntpdate 172.168.30.1 同步時間

  • 關閉防火牆,selinux

  • 設定主機名 hostnamectl set-hostname zbproxy.qfedu.com

  • vim /etc/hosts 每個機器都設定hosts,以解析主機名;DNS也行

2、環境配置(4臺主機)

機器名稱 IP配置 服務角色
zabbix-server 192.168.30.107 監控
agent-node1 192.168.30.7 被監控端
agent-node2 192.168.30.2 被監控端
node3 192.168.30.3 代理proxy

zabbix-server 直接監控一臺主機 node1

zabbix-server 通過代理 node3 監控 node2

3、在 node3 上配置 mysql

1、建立配置 mysql
1、建立 mariadb.repo
[root@node3 ~]# vim /etc/yum.repos.d/mariadb.repo
寫入以下內容:
[mariadb]
name = MariaDB 
baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.4/centos7-amd64 
gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB 
gpgcheck=1
2、yum 安裝最新版本 mariadb
[root@node3 ~]# yum install -y MariaDB-server MariaDB-clien
  • 修改配置檔案
[root@node3 ~]# vim /etc/my.cnf.d/server.cnf
    [mysqld]
    skip_name_resolve = ON          # 跳過主機名解析
    innodb_file_per_table = ON      # 開啟獨立表空間
    innodb_buffer_pool_size = 256M  # 快取池大小
    max_connections = 2000          # 最大連線數
    log-bin = master-log            # 開啟二進位制日誌
3、重啟我們的資料庫服務
[root@node3 ~]#  systemctl restart mariadb
[root@node3 ~]#  mysql_secure_installation  # 初始化mariadb
4、建立資料庫 和 授權使用者
MariaDB [(none)]> create database zbxproxydb character set 'utf8';
MariaDB [(none)]> grant all on zbxproxydb.* to 'zbxproxyuser'@'192.168.30.%' identified by 'zbxproxypass';
MariaDB [(none)]> flush privileges;

3、在node3 上下載zabbix 相關的包,主要是代理proxy的包

[root@node3 ~]# yum -y install zabbix-proxy-mysql zabbix-get zabbix-agent zabbix-sender
1、初始化資料庫

zabbix-proxy-mysql 包裡帶有,匯入資料的檔案

[root@node3 ~]# cp /usr/share/doc/zabbix-proxy-mysql-3.4.4/schema.sql.gz ./ 複製
[root@node3 ~]# gzip -d schema.sql.gz 解包
[root@node3 ~]# mysql -root -p zbxproxydb < schema.sql 匯入資料
2、檢視資料已經生成

4、配置 proxy 端

[root@node3 ~]# vim /etc/zabbix/zabbix_proxy.conf

Server=192.168.30.107        # server 的IP
ServerPort=10051             # server 的埠

Hostname=zbxproxy.qfedu.com  # 主機名
ListenPort=10051             # proxy自己的監聽埠
EnableRemoteCommands=1       # 允許遠端命令
LogRemoteCommands=1          # 記錄遠端命令的日誌

# 資料的配置
DBHost=192.168.30.3
DBName=zbxproxydb  
DBUser=zbxproxyuser
DBPassword=zbxproxypass

ConfigFrequency=30      # 多長時間,去服務端拖一次有自己監控的操作配置;為了實驗更快的生效,這裡設定30秒,預設3600s
DataSenderFrequency=1   # 每一秒向server 端發一次資料,傳送頻度

2、開啟服務

[root@node3 ~]# systemctl start zabbix-proxy

5、配置node2端允許proxy代理監控

[root@node3 ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.30.107,192.168.30.3
ServerActive=192.168.30.107,192.168.30.3
[root@node3 ~]# systemctl restart zabbix-agent # 啟動服務 

6、把代理加入監控 server 建立配置agent 代理

1、建立agent 代理

2、配置

7、建立node2 主機並採用代理監控

  • 設定代理成功

8、建立item監控項

1、隨便創一個監控項 CPU Switches

2、程序裡設定每秒更改

3、成功graph 圖形生成

四、

1、官方的 share 分享網站

https://share.zabbix.com/zabbix-tools-and-utilities

  • 例如:我們要實現監控Nginx ,我們查詢一個模板

  • 就以這個模板為例

2、在node1 上使用此模板

1、安裝配置 nginx

[root@node1 ~]# yum -y install nginx
[root@node1 ~]# vim /etc/nginx/nginx.conf  # 按照網頁的操作指示
location /stub_status {
        stub_status on;
        access_log off;
    #    allow 127.0.0.1;   #為了操作方便,我取消的訪問控制
    #    deny all;
}

2、啟動服務

[root@node1 ~]# systemctl restart nginx

2、下載模板所依賴的指令碼

[root@node1 ~]# mkdir -p /srv/zabbix/libexec/
[root@node1 ~]# cd /srv/zabbix/libexec/
[root@node1 ~]# wget https://raw.githubusercontent.com/oscm/zabbix/master/nginx/nginx.sh # 從網頁上獲取指令碼
[root@node1 ~]# chmod +x nginx.sh # 加執行許可權

3、配置 agent 的使用者引數 UserParameter

[root@node1 ~]# cd /etc/zabbix/zabbix_agentd.d/
[root@node1 ~]# wget https://raw.githubusercontent.com/oscm/zabbix/master/nginx/userparameter_nginx.conf # 很短自己寫也行

4、在 windows 上下載模板並匯入server 的模板中

[root@node1 ~]# wget https://raw.githubusercontent.com/oscm/zabbix/master/nginx/zbx_export_templates.xml

可以現在linux上下載,再sz 匯出到 windows 上

1、匯入下載的模板

2、主機 node1 連結這個模板

3、模板生效

五、Zabbix-server 監控自己,資料庫,nginx

1、下載安裝配置agent

[[email protected] ~]# vim /etc/zabbix/zabbix_agentd.conf
EnableRemoteCommands=1    允許遠端命令
LogRemoteCommands=1    記錄遠端命令
Server=127.0.0.1   #建議真實ip地址
ServerActive=127.0.0.1
Hostname=server.qfedu.com

2、自動生成 Zabbix server 的主機

3、在主機中新增模板

4、啟用Zabbix server

5、監控到資料

zabbix_agent 客戶端操作

1、mysql 建立 zabbix 賬號連線本地mysql

mysql> GRANT ALL ON *.* TO 'zabbix'@'localhost' IDENTIFIED BY 'zabbix';
mysql> FLUSH PRIVILEGES;

2、在 zabbix_agentd 建立 .my.cnf (使用者名稱密碼登入配置檔案)

[[email protected] ~]# cat  /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf  # 獲取登入配置檔案建立路徑
[[email protected] ~]# mkdir -p /var/lib/zabbix
# 在/var/lib/zabbix下建立(隱藏).my.cnf
[[email protected] ~]# cat ./.my.cnf
 [client]
 user=zabbix
 password=zabbix

六、

1、申請企業微信

1、填寫註冊資訊

2、配置微信企業號

1、建立告警組,然後把接受訊息人加進來

2、記錄賬號名稱,等下填寫接收人資訊需要用到

3、點選我的企業,檢視企業資訊,要記錄企業CorpID

4、點選企業應用,建立應用

5、填寫資訊和通知使用者組

6、建立完,記錄Agentld和Secret

3、配置zabbix伺服器

1、首先確認已經記錄的資訊

告警組使用者的賬號,企業CorpID和建立應用的Secret、Agentld

2、修改zabbix.conf

[[email protected] ~]# grep alertscripts /etc/zabbix/zabbix_server.conf 
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts
我們設定zabbix預設指令碼路徑,這樣在web端就可以獲取到指令碼

3、下載並設定指令碼

[[email protected] ~]# cd /usr/lib/zabbix/alertscripts/
[[email protected] alertscripts]# wget https://raw.githubusercontent.com/OneOaaS/weixin-alert/master/weixin_linux_amd64
[[email protected] alertscripts]# mv weixin_linux_amd64 wechat
[[email protected] alertscripts]# chmod 755 wechat 
[[email protected] alertscripts]# chown zabbix:zabbix wechat 

4、執行指令碼進行測試

[[email protected] alertscripts]# ./wechat --corpid=xxx --corpsecret=xxx --msg="您好,告警測試" --user=使用者賬號 --agentid=xxx
{"errcode":0,"errmsg":"ok","invaliduser":""}

提示:

-corpid= 我們企業裡面的id
--corpsecret= 這裡就是我們Secret裡面的id
-msg= 內容
-user=我們邀請使用者的賬號

因為指令碼是編譯過的,無法進行編輯,我們可以使用 ./wechat -h or --help 檢視

4、zabbix web頁面配置告警資訊

1、管理-報警媒介型別-建立告警媒介

2、填寫報警媒介資訊

--corpid=我們企業裡面的id
--corpsecret=這裡就是我們Secret裡面的id
--agentid= Agentld ID
--user={ALERT.SENDTO}
--msg={ALERT.MESSAGE}

3、設定告警使用者

4、設定告警動作

1、動作資訊

2、填寫告警時候操作資訊

故障告警:{TRIGGER.STATUS}: {TRIGGER.NAME} 
告警主機:{HOST.NAME} 
主機地址:{HOST.IP} 
告警時間:{EVENT.DATE} {EVENT.TIME} 
告警等級:{TRIGGER.SEVERITY} 
告警資訊:{TRIGGER.NAME} 
問題詳情:{ITEM.NAME}:{ITEM.VALUE} 
事件程式碼:{EVENT.ID} 
3、填寫恢復操作資訊

故障解除:{TRIGGER.STATUS}: {TRIGGER.NAME} 
恢復主機:{HOST.NAME} 
主機地址:{HOST.IP} 
恢復時間:{EVENT.DATE} {EVENT.TIME} 
恢復等級:{TRIGGER.SEVERITY} 
恢復資訊:{TRIGGER.NAME} 
問題詳情:{ITEM.NAME}:{ITEM.VALUE} 
事件程式碼:{EVENT.ID}

5、手動觸發告警,測試微信接收資訊

  • 在agent端使用yum安裝一下redis:
[root@node1 ~]# yum install redis -y
  • 修改配置檔案
[root@node1 ~]# vim /etc/redis.conf 
bind 0.0.0.0        #不做任何認證操作
  • 修改完成以後啟動服務並檢查埠:
[root@node1 ~]# systemctl start redis
[root@node1 ~]# ss -nutlp | grep redis
tcp    LISTEN     0      128       *:6379                  *:*                   users:(("redis-server",pid=5250,fd=4))

1、定義監控項

  • 進入 配置 ---> 主機 ---> node1 ---> 監控項(items)---> 建立監控項

  • 填寫完畢以後點選下方的新增。

  • 該監控項已成功新增。檢視一下他的值:檢測中 ---> 最新資料

2、定義觸發器

  • 進入 配置 ---> 主機 ---> node1 ---> 觸發器(trigger)---> 建立觸發器

  • 填寫完畢以後點選下方的新增

  • 該觸發器已成功新增。檢視:監測中 ---> 最新資料

  • 手動關閉 redis 服務來檢測:

[root@node1 ~]# systemctl stop redis.service
  • 進入監測中 ---> 問題

  • 已經顯示的是問題了。並且有持續的時間,當服務被開啟,會轉為已解決狀態:
[root@node1 ~]# systemctl start redis.service 

6、微信客戶端檢測

七、Zabbix 調優

1、調優

1、Database:

  • 歷史資料不要儲存太長時長;

  • 儘量讓資料快取在資料庫伺服器的記憶體中;

2、觸發器表示式:

  • 減少使用聚合函式min(), max(), avg();儘量使用last(),nodata(),因為聚合函式,要運算

  • 資料收集:polling較慢(減少使用SNMP/agentless/agent);儘量使用trapping(agent(active)主動監控);

  • 資料型別:文字型資料處理速度較慢;儘量少收集型別為文字 text或string型別的資料;多使用型別為numeric 數值型資料 的;

2、zabbix伺服器的程序

1、伺服器元件的數量;

  • alerter, discoverer, escalator, http poller, hourekeeper, icmp pinger, ipmi polller, poller, trapper, configration syncer, ...

  • StartPollers=60

  • StartPingers=10

  ...

  • StartDBSyncer=5

  ...

2、設定合理的快取大小

  • CacheSize=8M

  • HistoryCacheSize=16M

  • HistoryIndexCacheSize=4M

  • TrendCacheSize=4M

  • ValueCacheSize=4M

3、資料庫優化

  分表:

    history_*

    trends*

    events*

3、其它解決方案

  • grafana:展示

  • collectd:收集

  • influxdb:儲存

4、grafana+collectd+influxdb

5、prometheus:

  • exporter:收集

  • alertmanager:

  • grafana:展示

八、Zabbix監控實戰-Tomcat監控

1、方法一:開發java監控頁面

[[email protected] tomcat8_1]# cat /application/tomcat/webapps/memtest/meminfo.jsp 
<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;

out.println("JVM memory detail info :<br>");
out.println("Max memory:"+mm+"MB"+"<br>");
out.println("Total memory:"+tm+"MB"+"<br>");
out.println("Free memory:"+fm+"MB"+"<br>");
out.println("Available memory can be used is :"+(mm+fm-tm)+"MB"+"<br>");
%>

2、方法二:使用jps命令進行監控

[[email protected] ~]# jps -lvm

31906 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8_1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8_1/endorsed -Dcatalina.base=/application/tomcat8_1 -Dcatalina.home=/application/tomcat8_1 -Djava.io.tmpdir=/application/tomcat8_1/temp

31812 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat/endorsed -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp

31932 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8_2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8_2/endorsed -Dcatalina.base=/application/tomcat8_2 -Dcatalina.home=/application/tomcat8_2 -Djava.io.tmpdir=/application/tomcat8_2/temp

32079 sun.tools.jps.Jps -lvm -Denv.class.path=.:/application/jdk/lib:/application/jdk/jre/lib:/application/jdk/lib/tools.jar -Dapplication.home=/application/jdk1.8.0_60 -Xms8m

3、Tomcat 遠端監控功能

1、修改配置檔案,開啟遠端監控

[[email protected] ~]# vim /application/tomcat8_1/bin/catalina.sh +97
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=10.0.0.17"

2、重啟服務,檢查12345埠是否開啟

[[email protected] ~]# /application/tomcat8_1/bin/shutdown.sh 
[[email protected] ~]# /application/tomcat8_1/bin/startup.sh 
[[email protected] ~]# netstat -tunlp|grep 12345

3、 檢查埠

[[email protected] ~]# netstat -tunlp|grep 12345
tcp6       0      0 :::12345           :::*          LISTEN      33158/java  

4、在windows上監控tomcat

注意:windwos需要安裝jdk環境!

查考:http://www.oracle.com/technetwork/java/javase/downloads/index.html

1、軟體路徑
C:\Program Files\Java\jdk1.8.0_31\bin
jconsole.exe   jvisualvm.exe
2、jconsole.exe 使用說明

​ 連線成功即可進行監控,連線的時候注意埠資訊。

3、jvisualvm.exe 使用說明

輸入ip地址

主機新增完成,新增JMX監控

注意新增的時候輸入埠資訊

​ 新增完成後就能夠多tomcat程式進行監控。

4、zabbix 監控 tomcat 程式

1、zabbix 服務端安裝配置 java監控服務
[[email protected] ~]# yum install zabbix-java-gateway -y
2、檢視配置檔案
配置檔案路徑:/etc/zabbix/zabbix_java_gateway.conf
[[email protected] ~]# sed -i -e '220a JavaGateway=127.0.0.1' -e '236a StartJavaPollers=5'  /etc/zabbix/zabbix_server.conf
3、啟動zabbix-java-gateway服務,與zabbix服務
[[email protected] ~]# systemctl start zabbix-java-gateway.service
[[email protected] ~]# systemctl restart zabbix-server.service
4、檢查java埠是否開啟
[[email protected] ~]# netstat -lntup |grep java
tcp6       0      0 :::10052   :::*    LISTEN      72971/java  
5、檢查java程序是否存在
[[email protected] ~]# ps -ef |grep [j]ava
zabbix    72971      1  0 11:29 ?        00:00:00 java -server -Dlogback.configurationFile=/etc/zabbix/zabbix_java_gateway_logback.xml -classpath lib:lib/android-json-4.3_r3.1.jar:lib/logback-classic-0.9.27.jar:lib/logback-core-0.9.27.jar:lib/slf4j-api-1.6.1.jar:bin/zabbix-java-gateway-3.0.13.jar -Dzabbix.pidFile=/var/run/zabbix/zabbix_java.pid -Dzabbix.timeout=3 -Dsun.rmi.transport.tcp.responseTimeout=3000 com.zabbix.gateway.JavaGateway
zabbix    73255  73226  0 11:35 ?        00:00:00 /usr/sbin/zabbix_server: java poller #1 [got 0 values in 0.000002 sec, idle 5 sec]
zabbix    73256  73226  0 11:35 ?        00:00:00 /usr/sbin/zabbix_server: java poller #2 [got 0 values in 0.000002 sec, idle 5 sec]
zabbix    73257  73226  0 11:35 ?        00:00:00 /usr/sbin/zabbix_server: java poller #3 [got 0 values in 0.000002 sec, idle 5 sec]
zabbix    73258  73226  0 11:35 ?        00:00:00 /usr/sbin/zabbix_server: java poller #4 [got 0 values in 0.000002 sec, idle 5 sec]
zabbix    73259  73226  0 11:35 ?        00:00:00 /usr/sbin/zabbix_server: java poller #5 [got 0 values in 0.000004 sec, idle 5 sec]
6、web介面新增
1、新增主機

2、主機管理模板,注意是JMX模板

3、監控完成

5、排除 tomcat 故障步驟

1、檢視 catalina.out
2、使用 sh show-busy-java-threads.sh 指令碼進行檢測
#!/bin/bash
# @Function
# Find out the highest cpu consumed threads of java, and print the stack of these threads.
#
# @Usage
#   $ ./show-busy-java-threads.sh
#
# @author Jerry Lee

readonly PROG=`basename $0`
readonly -a COMMAND_LINE=("$0" "$@")

usage() {
    cat <<EOF
Usage: ${PROG} [OPTION]...
Find out the highest cpu consumed threads of java, and print the stack of these threads.
Example: ${PROG} -c 10

Options:
    -p, --pid       find out the highest cpu consumed threads from the specifed java process,
                    default from all java process.
    -c, --count     set the thread count to show, default is 5
    -h, --help      display this help and exit
EOF
    exit $1
}

readonly ARGS=`getopt -n "$PROG" -a -o c:p:h -l count:,pid:,help -- "$@"`
[ $? -ne 0 ] && usage 1
eval set -- "${ARGS}"

while true; do
    case "$1" in
    -c|--count)
        count="$2"
        shift 2
        ;;
    -p|--pid)
        pid="$2"
        shift 2
        ;;
    -h|--help)
        usage
        ;;
    --)
        shift
        break
        ;;
    esac
done
count=${count:-5}

redEcho() {
    [ -c /dev/stdout ] && {
        # if stdout is console, turn on color output.
        echo -ne "\033[1;31m"
        echo -n "$@"
        echo -e "\033[0m"
    } || echo "$@"
}

yellowEcho() {
    [ -c /dev/stdout ] && {
        # if stdout is console, turn on color output.
        echo -ne "\033[1;33m"
        echo -n "$@"
        echo -e "\033[0m"
    } || echo "$@"
}

blueEcho() {
    [ -c /dev/stdout ] && {
        # if stdout is console, turn on color output.
        echo -ne "\033[1;36m"
        echo -n "$@"
        echo -e "\033[0m"
    } || echo "$@"
}

# Check the existence of jstack command!
if ! which jstack &> /dev/null; then
    [ -z "$JAVA_HOME" ] && {
        redEcho "Error: jstack not found on PATH!"
        exit 1
    }
    ! [ -f "$JAVA_HOME/bin/jstack" ] && {
        redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack file does NOT exists!"
        exit 1
    }
    ! [ -x "$JAVA_HOME/bin/jstack" ] && {
        redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack is NOT executalbe!"
        exit 1
    }
    export PATH="$JAVA_HOME/bin:$PATH"
fi

readonly uuid=`date +%s`_${RANDOM}_$$

cleanupWhenExit() {
    rm /tmp/${uuid}_* &> /dev/null
}
trap "cleanupWhenExit" EXIT

printStackOfThread() {
    local line
    local count=1
    while IFS=" " read -a line ; do
        local pid=${line[0]}
        local threadId=${line[1]}
        local threadId0x=`printf %x ${threadId}`
        local user=${line[2]}
        local pcpu=${line[4]}

        local jstackFile=/tmp/${uuid}_${pid}

        [ ! -f "${jstackFile}" ] && {
            {
                if [ "${user}" == "${USER}" ]; then
                    jstack ${pid} > ${jstackFile}
                else
                    if [ $UID == 0 ]; then
                        sudo -u ${user} jstack ${pid} > ${jstackFile}
                    else
                        redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user})."
                        redEcho "User of java process($user) is not current user($USER), need sudo to run again:"
                        yellowEcho "    sudo ${COMMAND_LINE[@]}"
                        echo
                        continue
                    fi
                fi
            } || {
                redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user})."
                echo
                rm ${jstackFile}
                continue
            }
        }
        blueEcho "[$((count++))] Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user}):"
        sed "/nid=0x${threadId0x} /,/^$/p" -n ${jstackFile}
    done
}


ps -Leo pid,lwp,user,comm,pcpu --no-headers | {
    [ -z "${pid}" ] &&
    awk '$4=="java"{print $0}' ||
    awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}'
} | sort -k5 -r -n | head --lines "${count}" | printStackOfThread

九、zabbix 監控 php-fpm

zabbix監控php-fpm主要是通過nginx配置php-fpm的狀態輸出頁面,在正則取值.要nginx能輸出php-fpm的狀態首先要先修改php-fpm的配置,沒有開啟nginx是沒有法輸出php-fpm status。

1、修改檔案php-fpm

vim /application/php-5.5.32/etc/php-fpm.conf檔案

2、修改nginx配置檔案

vim /application/nginx/conf/extra/www.conf,在server 區塊下新增一行內容

重啟nginx

3、curl 127.0.0.1/php_status 我們可以看到php-fpm 的狀態資訊

欄位 含義
pool php-fpm pool的名稱,大多數情況下為www
process manager 程序管理方式,現今大多都為dynamic,不要使用static
start time php-fpm上次啟動的時間
start since php-fpm已運行了多少秒
accepted conn pool接收到的請求數
listen queue 處於等待狀態中的連線數,如果不為0,需要增加php-fpm程序數
max listen queue php-fpm啟動到現在處於等待連線的最大數量
listen queue len 處於等待連線佇列的套接字大小
idle processes 處於空閒狀態的程序數
active processes 處於活動狀態的程序數
total processess 程序總數
max active process 從php-fpm啟動到現在最多有幾個程序處於活動狀態
max children reached 當pm試圖啟動更多的children程序時,卻達到了程序數的限制,達到一次記錄一次,如果不為0,需要增加php-fpm pool程序的最大數
slow requests 當啟用了php-fpm slow-log功能時,如果出現php-fpm慢請求這個計數器會增加,一般不當的Mysql查詢會觸發這個值

4、編寫監控指令碼和監控檔案

vim /server/scripts/php_fpm-status.sh

#!/bin/sh
#php-fpm status
case $1 in
ping) #檢測php-fpm程序是否存在
/sbin/pidof php-fpm | wc -l
;;
start_since) #提取status中的start since數值
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==4{print $3}'
;;
conn) #提取status中的accepted conn數值
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==5{print $3}'
;;
listen_queue) #提取status中的listen queue數值
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==6{print $3}'
;;
max_listen_queue) #提取status中的max listen queue數值
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==7{print $4}'
;;
listen_queue_len) #提取status中的listen queue len
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==8{print $4}'
;;
idle_processes) #提取status中的idle processes數值
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==9{print $3}'
;;
active_processes) #提取status中的active processes數值
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==10{print $3}'
;;
total_processes) #提取status中的total processess數值
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==11{print $3}'
;;
max_active_processes) #提取status中的max active processes數值
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==12{print $4}'
;;
max_children_reached) #提取status中的max children reached數值
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==13{print $4}'
;;
slow_requests) #提取status中的slow requests數值
/usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==14{print $3}'
;;
*)
echo "Usage: $0 {conn|listen_queue|max_listen_queue|listen_queue_len|idle_processes|active_processess|total_processes|max_active_processes|max_children_reached|slow_requests}"
exit 1
;;
esac

vim /etc/zabbix/zabbix_agentd.d/test.conf

UserParameter=php_status[*],/bin/sh /server/scripts/php_fpm-status.sh $1

5、重啟服務

在服務端測試

6、在web端進行配置

這時候我們再來看最新監控資料,就可以看到我們監控的內容了

配置到這,我們PHP狀態監控基本完成,根據需求配置相應的觸發器,即可。

你要的模板

連結: https://pan.baidu.com/s/1z0IU82uGId-LH1EryyuwCw 提取碼: q6n9

十、zabbix 監控 mysql

1、監控規劃

在建立監控項之前要儘量考慮清楚要監控什麼,怎麼監控,監控資料如何儲存,監控資料如何展現,如何處理報警等。要進行監控的系統規劃需要對Zabbix很瞭解,這裡只是提出監控的需求。

需求一:監控MySQL的狀態,當狀態發生異常,發出報警;

需求二:監控MySQL的操作,並用圖表展現;

2、自定義指令碼監控擴充套件Agent

Zabbix Server與Agent之間監控資料的採集主要是通過Zabbix Server主動向Agent詢問某個Key的值,Agent會根據Key去呼叫相應的函式去獲取這個值並返回給Server端。Zabbix 2.4.7的Agent本並沒有內建MySQL的監控功能(但是Server端提供了相應的Template配置),所以我們需要使用Zabbix的User Parameters功能,為MySQL新增監控指令碼。

3、授權mysql登入使用者(agent端)

mysql> grant usage on *.* to [email protected] identified by 'zabbix';

mysql> flush privileges;

4、agent端配置

存活檢測

利用UserParameter引數自定義Agent Key。
對於需求一 ,我們採用mysqladmin這個工具來實現,命令如下:

mysqladmin -h 127.0.0.1 -u zabbix -pzabbix ping 
#mysqld is alive


如果MySQL狀態正常,會顯示mysqld is alive,否則會提示連線不上。對於伺服器端,mysqld is alive這樣的句子不好理解,伺服器端最好只接收1和0,1表示服務可用,0表示服務不可用。那麼再改進一下這個命令,如下:

mysqladmin -h 127.0.0.1 -u zabbix -pzabbix ping |grep -c alive
#1

使用者名稱和密碼放在命令中對於以後的維護不好,所以我們在/var/lib/zabbix/下建立一個包含MySQL使用者名稱和密碼的配置檔案“.my.cnf”,如下:

mkdir -p /var/lib/zabbix/
vim /var/lib/zabbix/.my.cnf
[mysql]
host=localhost
user=zabbix
password=zabbix
socket=/var/lib/mysql/mysql.sock
[mysqladmin]
host=localhost
user=zabbix
password=zabbix
socket=/var/lib/mysql/mysql.sock

有了這個檔案後的命令變更為

HOME=/var/lib/zabbix/ mysqladmin ping |grep -c alive

1	

做完這一步後需要做的就是,將這個監控命令新增到Zabbix Agent中,並與一個Key對應,這樣Zabbox Server就能通過這個Key獲取MySQL的狀態了。我們使用mysql.ping作為MySQL狀態的Key。

首先在去除/etc/zabbix/zabbix_agentd.conf中“Include=/etc/zabbix_agentd.d/” 這一行的註釋符(預設開啟,檢查一下)。

其次,修改/etc/zabbix/zabbix_agentd.d/目錄下userparameter_mysql.conf檔案。

#備份配置檔案
mv /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf.bak
vim /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
#在檔案中新增如下命令
UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive

使用下面的命令測試是否正常工作。

/usr/sbin/zabbix_agentd -t mysql.ping
#mysql.ping                                    [t|1]

其他效能指標

1.新增userparameter_mysql

監控mysql效能的指令碼

UserParameter=mysql.status[*],/etc/zabbix/zabbix_agentd.d/check_mysql.sh $1

mysql版本

UserParameter=mysql.version,mysql -V

vim /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
#新增下面2行內容
UserParameter=mysql.status[*],/etc/zabbix/zabbix_agentd.d/check_mysql.sh $1
UserParameter=mysql.version,mysql -V
2.check_mysql.sh

建立監控指令碼(修改為自己的密碼和IP地址)

vim /etc/zabbix/zabbix_agentd.d/check_mysql.sh
#!/bin/bash
# -------------------------------------------------------------------------------
# FileName: check_mysql.sh
# Revision: 1.0
# -------------------------------------------------------------------------------
# Copyright:
# License: GPL

# 使用者名稱
MYSQL_USER='zabbix'

# 密碼
MYSQL_PWD='zabbix'

# 主機地址/IP
MYSQL_HOST='127.0.0.1'

# 埠
MYSQL_PORT='3306'

# 資料連線
MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT}"

# 引數是否正確
if [ $# -ne "1" ];then
echo "arg error!"
fi

# 獲取資料
case $1 in
Uptime)
result=`${MYSQL_CONN} status 2>/dev/null |cut -f2 -d":"|cut -f1 -d"T"`
echo $result
;;
Com_update)
result=`${MYSQL_CONN} extended-status   2>/dev/null  |grep -w "Com_update"|cut -d"|" -f3`
echo $result
;;
Slow_queries)
result=`${MYSQL_CONN} status  2>/dev/null  |cut -f5 -d":"|cut -f1 -d"O"`
echo $result
;;
Com_select)
result=`${MYSQL_CONN} extended-status  2>/dev/null  |grep -w "Com_select"|cut -d"|" -f3`
echo $result
;;
Com_rollback)
result=`${MYSQL_CONN} extended-status  2>/dev/null   |grep -w "Com_rollback"|cut -d"|" -f3`
echo $result
;;
Questions)
result=`${MYSQL_CONN} status   2>/dev/null |cut -f4 -d":"|cut -f1 -d"S"`
echo $result
;;
Com_insert)
result=`${MYSQL_CONN} extended-status   2>/dev/null  |grep -w "Com_insert"|cut -d"|" -f3`
echo $result
;;
Com_delete)
result=`${MYSQL_CONN} extended-status   2>/dev/null  |grep -w "Com_delete"|cut -d"|" -f3`
echo $result
;;
Com_commit)
result=`${MYSQL_CONN} extended-status   2>/dev/null  |grep -w "Com_commit"|cut -d"|" -f3`
echo $result
;;
Bytes_sent)
result=`${MYSQL_CONN} extended-status  2>/dev/null  |grep -w "Bytes_sent" |cut -d"|" -f3`
echo $result
;;
Bytes_received)
result=`${MYSQL_CONN} extended-status  2>/dev/null  |grep -w "Bytes_received" |cut -d"|" -f3`
echo $result
;;
Com_begin)
result=`${MYSQL_CONN} extended-status  2>/dev/null  |grep -w "Com_begin"|cut -d"|" -f3`
echo $result
;;

*)
echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"
;;
esac

3.授權:
chmod +x  /etc/zabbix/zabbix_agentd.d/check_mysql.sh
chown zabbix.zabbix  /etc/zabbix/zabbix_agentd.d/check_mysql.sh
#重啟agent
systemctl restart zabbix-agent
4. zabbix_agent上測試:

zabbix_agentd -t mysql.ping

5.Zabbix_server測試

zabbix_get -s ip -P 埠 -k mysql.ping

5、在web端進行配置

**建立主機 **

關聯模板

建立監控項

建立圖形

檢視監控影象

其他監控項配置:

6、zabbix自帶mysql監控項

version:資料庫版本
key_buffer_size:myisam的索引buffer大小
sort_buffer_size:會話的排序空間(每個執行緒會申請一個)
join_buffer_size:這是為連結操作分配的最小快取大小,這些連線使用普通索引掃描、範圍掃描、或者連線不適用索引
max_connections:最大允許同時連線的數量
max_connect_errors:允許一個主機最多的錯誤連結次數,如果超過了就會拒絕之後連結(預設100)。可以使用flush hosts命令去解除拒絕
open_files_limits:作業系統允許mysql開啟的檔案數量,可以通過opened_tables狀態確定是否需要增大table_open_cache,如果opened_tables比較大且一直還在增大說明需要增大table_open_cache
max-heap_tables_size:建立的記憶體表的最大大小(預設16M)這個引數和tmp_table_size一起限制內部臨時表的最大值(取這兩個引數的小的一個),如果超過限制,則表會變為innodb或myisam引擎,(5.7.5之前是預設是myisam,5.7.6開始是innodb,可以通過internal_tmp_disk_storage_engine引數調整)。
max_allowed_packet:一個包的最大大小
##########GET INNODB INFO
#INNODB variables
innodb_version:
innodb_buffer_pool_instances:將innodb緩衝池分為指定的多個(預設為1)
innodb_buffer_pool_size:innodb緩衝池大小、5.7.5引入了innodb_buffer_pool_chunk_size,
innodb_doublewrite:是否開啟doublewrite(預設開啟)
innodb_read_io_threads:IO讀執行緒的數量
innodb_write_io_threads:IO寫執行緒的數量
########innodb status
innodb_buffer_pool_pages_total:innodb緩衝池頁的數量、大小等於innodb_buffer_pool_size/(16*1024)
innodb_buffer_pool_pages_data:innodb緩衝池中包含資料的頁的數量
########## GET MYSQL HITRATE
1、查詢快取命中率
如果Qcache_hits+Com_select<>0則為 Qcache_hits/(Qcache_hits+Com_select),否則為0

2、執行緒快取命中率
如果Connections<>0,則為1-Threads_created/Connections,否則為0

3、myisam鍵快取命中率
如果Key_read_requests<>0,則為1-Key_reads/Key_read_requests,否則為0

4、myisam鍵快取寫命中率
如果Key_write_requests<>0,則為1-Key_writes/Key_write_requests,否則為0

5、鍵塊使用率
如果Key_blocks_used+Key_blocks_unused<>0,則Key_blocks_used/(Key_blocks_used+Key_blocks_unused),否則為0

6、建立磁碟儲存的臨時表比率
如果Created_tmp_disk_tables+Created_tmp_tables<>0,則Created_tmp_disk_tables/(Created_tmp_disk_tables+Created_tmp_tables),否則為0

7、連線使用率
如果max_connections<>0,則threads_connected/max_connections,否則為0

8、開啟檔案比率
如果open_files_limit<>0,則open_files/open_files_limit,否則為0

9、表快取使用率
如果table_open_cache<>0,則open_tables/table_open_cache,否則為0

十一、 zabbix其他常用自定義監控項

redis相關的自定義項

vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/redis.conf
UserParameter=Redis.Status,/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 ping |grep -c PONG
UserParameter=Redis_conn[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "connected_clients" | awk -F':' '{print $2}'
UserParameter=Redis_rss_mem[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_memory_rss" | awk -F':' '{print $2}'
UserParameter=Redis_lua_mem[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_memory_lua" | awk -F':' '{print $2}'
UserParameter=Redis_cpu_sys[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_sys" | awk -F':' '{print $2}'
UserParameter=Redis_cpu_user[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_user" | awk -F':' '{print $2}'
UserParameter=Redis_cpu_sys_cline[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_sys_children" | awk -F':' '{print $2}'
UserParameter=Redis_cpu_user_cline[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_user_children" | awk -F':' '{print $2}'
UserParameter=Redis_keys_num[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "$$1" | grep -w "keys" | grep db$3 | awk -F'=' '{print $2}' | awk -F',' '{print $1}'
UserParameter=Redis_loading[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep loading | awk -F':' '{print $$2}'

Redis.Status --檢測Redis執行狀態, 返回整數
Redis_conn  --檢測Redis成功連線數,返回整數
Redis_rss_mem  --檢測Redis系統分配記憶體,返回整數
Redis_lua_mem  --檢測Redis引擎消耗記憶體,返回整數
Redis_cpu_sys --檢測Redis主程式核心CPU消耗率,返回整數
Redis_cpu_user --檢測Redis主程式使用者CPU消耗率,返回整數
Redis_cpu_sys_cline --檢測Redis後臺核心CPU消耗率,返回整數
Redis_cpu_user_cline --檢測Redis後臺使用者CPU消耗率,返回整數
Redis_keys_num --檢測庫鍵值數,返回整數
Redis_loding --檢測Redis持久化檔案狀態,返回整數

nginx相關的自定義項

vim /etc/nginx/conf.d/default.conf
    location /nginx-status
    {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }

    
vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/nginx.conf
UserParameter=Nginx.active,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | awk '/Active/ {print $NF}'
UserParameter=Nginx.read,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | grep 'Reading' | cut -d" " -f2
UserParameter=Nginx.wrie,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | grep 'Writing' | cut -d" " -f4
UserParameter=Nginx.wait,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | grep 'Waiting' | cut -d" " -f6
UserParameter=Nginx.accepted,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $1}'
UserParameter=Nginx.handled,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $2}'
UserParameter=Nginx.requests,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $3}'

TCP相關的自定義項

vim /usr/local/zabbix/share/zabbix/alertscripts/tcp_connection.sh
#!/bin/bash
function ESTAB { 
/usr/sbin/ss -ant |awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'ESTAB' | awk '{print $2}'
}
function TIMEWAIT {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'TIME-WAIT' | awk '{print $2}'
}
function LISTEN {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LISTEN' | awk '{print $2}'
}
$1

vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/cattcp.conf
UserParameter=tcp[*],/usr/local/zabbix/share/zabbix/alertscripts/tcp_connection.sh $1

tcp[TIMEWAIT] --檢測TCP的駐留數,返回整數
tcp[ESTAB]  --檢測tcp的連線數、返回整數
tcp[LISTEN] --檢測TCP的監聽數,返回整數

系統監控常用自帶監控項

agent.ping 檢測客戶端可達性、返回nothing表示不可達。1表示可達
system.cpu.load --檢測cpu負載。返回浮點數
system.cpu.util -- 檢測cpu使用率。返回浮點數
vfs.dev.read -- 檢測硬碟讀取資料,返回是sps.ops.bps浮點型別,需要定義1024倍
vfs.dev.write -- 檢測硬碟寫入資料。返回是sps.ops.bps浮點型別,需要定義1024倍
net.if.out[br0] --檢測網絡卡流速、流出方向,時間間隔為60S
net-if-in[br0] --檢測網絡卡流速,流入方向(單位:位元組) 時間間隔60S
proc.num[]  目前系統中的程序總數,時間間隔60s
proc.num[,,run] 目前正在執行的程序總數,時間間隔60S
###處理器資訊
通過zabbix_get 獲取負載值
合理的控制使用者態、系統態、IO等待時間剋保證程序高效率的執行
系統態執行時間較高說明程序進行系統呼叫的次數比較多,一般的程式如果系統態執行時間佔用過高就需要優化程式,減少系統呼叫
io等待時間過高則表明硬碟的io效能差,如果是讀寫檔案比較頻繁、讀寫效率要求比較高,可以考慮更換硬碟,或者使用多磁碟做raid的方案
system.cpu.swtiches --cpu的程序上下文切換,單位sps,表示每秒取樣次數,api中引數history需指定為3
system.cpu.intr  --cpu中斷數量、api中引數history需指定為3
system.cpu.load[percpu,avg1]  --cpu每分鐘的負載值,按照核數做平均值(Processor load (1 min average per core)),api中引數history需指定為0
system.cpu.load[percpu,avg5]  --cpu每5分鐘的負載值,按照核數做平均值(Processor load (5 min average per core)),api中引數history需指定為0
system.cpu.load[percpu,avg15]  --cpu每5分鐘的負載值,按照核數做平均值(Processor load (15 min average per core)),api中引數history需指定為0

系統監控常用自定義監控項

####記憶體相關
vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/catcarm.conf
UserParameter=ram.info[*],/bin/cat  /proc/meminfo  |awk '/^$1:{print $2}'
ram.info[Cached] --檢測記憶體的快取使用量、返回整數,需要定義1024倍
ram.info[MemFree] --檢測記憶體的空餘量,返回整數,需要定義1024倍
ram.info[Buffers] --檢測記憶體的使用量,返回整數,需要定義1024倍

####TCP相關的自定義項
vim /usr/local/zabbix/share/zabbix/alertscripts/tcp_connection.sh
#!/bin/bash
function ESTAB { 
/usr/sbin/ss -ant |awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'ESTAB' | awk '{print $2}'
}
function TIMEWAIT {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'TIME-WAIT' | awk '{print $2}'
}
function LISTEN {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LISTEN' | awk '{print $2}'
}
$1

vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/cattcp.conf
UserParameter=tcp[*],/usr/local/zabbix/share/zabbix/alertscripts/tcp_connection.sh $1

tcp[TIMEWAIT] --檢測TCP的駐留數,返回整數
tcp[ESTAB]  --檢測tcp的連線數、返回整數
tcp[LISTEN] --檢測TCP的監聽數,返回整數