1. 程式人生 > >Zabbix-(五)監控Docker容器與自定義jvm監控項

Zabbix-(五)監控Docker容器與自定義jvm監控項

Zabbix-(五)監控Docker容器與自定義jvm監控項

一.前言

前文中講述了Zabbix對伺服器硬體方面的監控功能,本文將講述利用Zabbix監控Docker容器中的Java Web服務,並通過自定義監控項,監控JVM老年代使用情況以及GC資訊。Zabbix其實提供了JMX監控,自帶了JMX模板能夠直接監控JVM資訊,本文主要側重於自定義引數與自定義監控項,關於JMX會在之後的文章中介紹。

準備

  • Zabbix Server (Zabbix 4.4) (ip:192.168.152.140)
  • 執行Java應用的主機 以下簡稱Server-A (已被Zabbix監控) (ip:192.168.152.142)


二.開啟agent使用者自定義引數配置

  1. 修改配置

    使用自定義引數時,首先需要修改Server-A的agent配置

    # vim /etc/zabbix/zabbix_agentd.conf

    修改配置 UnsafeUserParameters=1

    UnsafeUserParameters=1
  2. 重啟zabbix-agent

    # systemctl restart zabbix-agent


三.執行tomcat容器

在Server-A執行tomcat容器

# docker run --name tomcat -p 8080:8080 -dit tomcat:jdk8-adoptopenjdk-hotspot

將zabbix賬號新增到docker組。參考部署問題

# sudo gpasswd  -a zabbix docker

外部訪問測試一下


四.建立自定義Docker模板

我們可以定義一個比較通用的Docker模板,有服務需要被監控時,直接連結該模板即可。

  1. 建立群組

    點選【配置】-【主機群組】-【建立主機群組】

    定義一個組名 Docker Group

    配置項
    * 組名 Docker Group

  2. 建立模板

    建立一個自定義模板,模板名稱Docker Template,選擇上步驟建立的Docker Group群組

    配置項
    * 模板名稱 Docker Template
    * 群組 Docker Group


五.編寫指令碼與自定義監控引數

我們需要編寫一個指令碼,用於發現當前正在執行的docker容器(這裡使用容器名稱)。

  1. 在Server-A編寫發現執行容器的python指令碼

    建立指令碼

    # cd /data/zabbix
    # touch find_container.py
    # chmod a+x find_container.py
    # vim find_container.py

    指令碼內容:

    #!/usr/bin/env python
    import os
    import json
    
    # 檢視當前執行的docker容器
    t=os.popen(""" docker ps  |grep -v 'CONTAINER ID'|awk {'print $NF'} """)
    container_name = []
    for container in  t.readlines():
            r = os.path.basename(container.strip())
            container_name += [{'{#CONTAINERNAME}':r}]
    # 轉換成json資料
    print json.dumps({'data':container_name},sort_keys=True,indent=4,separators=(',',':'))
    執行指令碼,檢視一下json資料格式:
    {
        "data":[
            {
                "{#CONTAINERNAME}":"tomcat"
            }
        ]
    }
  2. 在Server-A自定義容器發現引數

    我們需要自定義一個鍵值對的配置型別,以便Zabbix可以通過鍵讀取到值。

    增加自定義引數

    # cd /etc/zabbix/zabbix_agentd.d
    # vim userparameter_find_container.conf
    docker.container /data/zabbix/find_container.py (指令碼的執行結果)
    UserParameter=docker.container,/data/zabbix/find_container.py
  3. 在Server-A建立檢視容器JVM GC情況的指令碼

    我們可以使用jstat -gcutil 命令檢視GC情況


    建立python指令碼

    # cd /data/zabbix
    # touch monitor_gc.py
    # chmod a+x monitor_gc.py
    # vim monitor_gc.py

    指令碼內容

    #!/usr/bin/python
    import sys
    import os
    
    def monitor_gc(container_name, keyword):
            cmd = ''' docker exec %s bash -c "jstat -gcutil 1" | grep -v S0 | awk '{print $%s}' ''' %(container_name, keyword)
            value = os.popen(cmd).read().replace("\n","")
            print value
    
    if __name__ == '__main__':
            # 引數1:容器的名稱
            # 引數2:檢視第幾列(例如 Eden區在第3列傳入3,Full GC次數在第9列傳入9)
            container_name, keyword = sys.argv[1], sys.argv[2]
            monitor_gc(container_name, keyword)

    測試指令碼,檢視當前tomcat容器Full GC次數

    # /data/zabbix/monitor_gc.py 'tomcat' '9'


  4. 在Server-A自定義Zabbix JVM GC引數

    同樣,增加一個conf檔案,表示自定義引數

    # cd /etc/zabbix/zabbix_agentd.d
    # touch userparameter_gc_status.conf
    # vim userparameter_gc_status.conf
    jvm.gc.status[*] /data/zabbix/monitor_gc.py $1 $2
    UserParameter=jvm.gc.status[*], /data/zabbix/monitor_gc.py $1 $2

    jvm.gc.status[*] 表示可以使用引數。其中$1表示引數1,即容器名稱;$2表示引數2,需要檢視哪項GC資訊,$1 $2都是通過Zabbix配置時傳遞的。Zabbix自定義引數

  5. 在Zabbix server上測試自定義引數

    為zabbix sever安裝zabbix-get

    # yum install -y zabbix-get

    測試自定義引數,如果有許可權問題,可以參考部署問題

    # zabbix_get -s 192.168.152.142 -p 10050 -k docker.container
    # zabbix_get -s 192.168.152.142 -p 10050 -k "jvm.gc.status['tomcat', 9]"


六.Zabbix模板增加自動發現規則

上述配置中,已經可以通過指令碼獲取到已執行的容器資訊,此步驟將通過Zabbix配置介面,在模板中新增自動發現規則,以發現被監控主機中正在執行的docker容器,並利用這些獲取的資料進一步監控容器中jvm資料。

  1. 建立自動發現規則

    點選【配置】-【模板】-【Docker Template】

    點選【自動發現規則】-【建立發現規則】

    先配置【自動發現規則】

    配置項
    * 名稱 發現正在執行的Docker容器規則
    型別 Zabbix 客戶端
    * 鍵值 docker.container (這是我們上述步驟中自定義的鍵值)
    其他配置 根據需要配置

    鍵值配置項是之前自定義的監控鍵值

    再配置【過濾器】

    巨集則配置自定義指令碼返回json資料中的key值

    配置項
    巨集 {#CONTAINERNAME}

  2. 新增監控項原型

    點選新建的自動發現規則的【監控項原型】-【建立監控項原型】


    輸入引數

    配置項
    * 名稱 Tomcat Full GC次數監控項
    型別 Zabbix 客戶端
    * 鍵值 jvm.gc.status[{#CONTAINERNAME} , 9]
    其他配置項 根據需要填寫

    鍵值是自定義jvm gc引數步驟中定義的引數,{#CONTAINERNAME} 是jvm.gc.status的引數1,使用了自動發現規則,發現到的docker容器名稱(本文中即是 tomcat);引數2 9 則是表示需要檢視FullGC次數,FGC列(第9列)

    除此之外,還可以新增Old老年代(對應第4列),Full GC時間(對應第10列)等監控項,這裡就不一一添加了,和上述過程基本一致,只需修改引數2即可(也可以利用剛新建的監控項原型進行【克隆】)。


七.連結模板

將上述自定義的模板連結到Server-A主機

八.DashBoard新增視覺化圖形

回到Zabbix首頁可以為新增的自定義監控項,增加圖形(新增圖形步驟可以參考Zabbix-(三)監控主機CPU、磁碟、記憶體並建立監控圖形)

九.其他

部署問題

  • zabbix在執行指令碼時,是使用的zabbix賬戶,因此可能要注意要給zabbix賬號賦予許可權。

    例如,zabbix賬戶無法使用docker命令,將zabbix新增到docker組

    # sudo gpasswd -a zabbix docker
  • zabbix server無法執行agent自定義引數中的指令碼

    為agent主機設定

    # setenforce 0