一 問題描述:前端
在一臺主機上添加了Web監控,當這臺主機下架後沒有在Zabbix頁面中刪除,在Zabbix頁面上仍然可以接收到這臺主機上的Web監控數據。按理來講,主機不可達後Zabbix頁面不該該再看到這臺主機上的任何監控數據,可是惟獨自帶的Web監控能夠看到數據。這是個問題。
web
二 問題分析數據庫
以前一直覺得Zabbix自帶的Web監控是在Agent端執行的,因此爲每一個主機添加相應的Web監控,那麼在Zabbix前端看到的監控數據應該是反映相應的url在這臺主機上訪問狀況。可是當這臺主機不可達時,這臺主機上的Web監控依賴有數據更新。由此猜測,Zabbix自帶的Web監控並非在Agent端執行的,而是在Server端或者Proxy端執行的。緩存
咱們從Zabbix server的源代碼入手一步一步的去了解Zabbix是如何去執行Web監控的curl
調用src/zabbix_server/server.c 代碼中的main()函數執行Zabbix server進程的入口程序ide
調用zbx_load_config() 函數加載配置文件函數
調用libs/zbxnix/daemon.c 代碼中的daemon_start()函數容許進程從後臺運行url
調用src/zabbix_server/server.c 代碼中的MAIN_ZABBIX_ENTRY()函數spa
調用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監控都會失效。