Zabbix agent掛掉後Zabbix Web監控依然能夠收到數據

一 問題描述:

    在一臺主機上添加了Web監控,當這臺主機下架後沒有在Zabbix頁面中刪除,在Zabbix頁面上仍然能夠接收到這臺主機上的Web監控數據。按理來說,主機不可達後Zabbix頁面不應該再看到這臺主機上的任何監控數據,但是唯獨自帶的Web監控可以看到數據。這是個問題。


二 問題分析

   之前一直以爲Zabbix自帶的Web監控是在Agent端執行的,所以爲每個主機添加相應的Web監控,那麼在Zabbix前端看到的監控數據應該是反映相應的url在這臺主機上訪問情況。但是當這臺主機不可達時,這臺主機上的Web監控依賴有數據更新。由此猜想,Zabbix自帶的Web監控並不是在Agent端執行的,而是在Server端或者Proxy端執行的。

  我們從Zabbix server的源代碼入手一步一步的去了解Zabbix是如何去執行Web監控的


   調用src/zabbix_server/server.c 代碼中的main()函數執行Zabbix server進程的入口程序

   調用zbx_load_config() 函數加載配置文件

   調用libs/zbxnix/daemon.c 代碼中的daemon_start()函數允許進程從後臺運行

   調用src/zabbix_server/server.c 代碼中的MAIN_ZABBIX_ENTRY()函數

   

   調用zbx_free_config() 釋放配置內存

   調用libs/zbxdbcache/dbcache.c 代碼中的init_database_cache()函數爲數據庫緩存分配共享內存

   調用libs/zbxdbcache/dbconfig.c 中的init_configuration_cache()函數爲配置緩存分配共享內存

   調用libs/zbxself/selfmon.c 代碼中的init_selfmon_collector()函數 初始化zabbix 自身監控

   調用libs/zbxdbhigh/db.c  代碼中的zbx_db_get_database_type()函數 判斷當前數據庫是server還是proxy數據庫

    判斷的標準就是 select userid from users  如果至少有一條數據在users表中,那麼就返回ZBX_DB_SERVER,如果沒有就返回ZBX_DB_PROXY

   調用libs/zbxdbhigh/db.c  代碼中的

   調用libs/zbxdbcache/dbconfig.c 代碼中的DBconnect()函數連接Zabbix數據庫

   調用libs/zbxdbcache/dbconfig.c 代碼中的DCload_config() 函數加載config表到緩存中

   調用 DCsync_configuration()函數從數據庫中同步配置數據

   

   Zabbix server啓動的線程總數如下

threads_num = CONFIG_CONFSYNCER_FORKS + CONFIG_WATCHDOG_FORKS + CONFIG_POLLER_FORKS
                        + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_TRAPPER_FORKS + CONFIG_PINGER_FORKS
                        + CONFIG_ALERTER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_TIMER_FORKS
                        + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS + CONFIG_HISTSYNCER_FORKS
                        + CONFIG_ESCALATOR_FORKS + CONFIG_IPMIPOLLER_FORKS + CONFIG_JAVAPOLLER_FORKS
                        + CONFIG_SNMPTRAPPER_FORKS + CONFIG_PROXYPOLLER_FORKS + CONFIG_SELFMON_FORKS
                        + CONFIG_VMWARE_FORKS;

    

   然後對每個線程進行初始化操作

   循環調用get_process_info_by_thread()函數根據線程信息獲取進程信息

   如果thread_args.process_type爲ZBX_PROCESS_TYPE_HTTPPOLLER , 每個http poller線程調用libs/zbxsys/threads.c 代碼中的 zbx_thread_start(httppoller_thread, &thread_args) 函數啓動線程

   然後調用zabbix_server/httppoller/httppoller.c 代碼中的ZBX_THREAD_ENTRY(httppoller_thread, args) 函數循環處理httptests

   然後調用zabbix_server/httppoller/httptest.c 代碼中的process_httptest()函數處理每個httptest

   process_httptest()函數會調用幾個libcurl提供的函數來完成每個httptest中定義的url的訪問

   curl_easy_setopt() 設置libcurl 訪問url時的各種參數

   curl_easy_perform() 執行訪問url操作

   curl_slist_free_all(headers_slist);  curl_easy_perform()執行完後必須要調用這個函數

   curl_easy_getinfo() 獲取訪問url的結果信息

   調用process_step_data()  處理httpstep

   調用process_httptests()  處理httptests

   

   從整個Zabbix server處理Web監控的過程來看,Zabbix server是通過httppoller線程去循環執行各個httptest中的httpstep定義的url訪問的,每次執行的時候都要從相應的表中查找信息然後過濾處理再將執行的結果寫入的相應的表中,和Zabbix agent沒有任何關係,在一些主機上添加Web監控只是當httppoller執行curl操作的時會去讀出這臺主機上的Web監控步驟再在server端執行。

   

   Zabbix Web監控涉及到的表結構可以參考

   http://john88wang.blog.51cto.com/2165294/1828204



 需要了解一下一臺主機如果是通過Zabbix proxy來管理的,那麼在這臺主機上添加的Web監控就會在它所在的proxy上由httppoller線程去執行

  

三 問題總結        

  通過以上分析,可以知道Zabbix server或者proxy在執行Web監控時只是從數據庫中讀取這臺主機相關的Web監控項目獲取url,然後通過libcurl訪問這個url,再將結果寫入到數據庫中。所以,如果是想通過Zabbix自帶的Web監控來檢測各個agent所在的區域的訪問url的質量是行不通的,因爲所有的url都是在proxy或者server端訪問,把server或者proxy端的外網訪問權限去掉,那麼所有的web監控都會失效。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章