zabbix自动发现 url 以及对http返回状态码监控实现 告警
2019-06-04 18:39:12
目的:批量监控业务URL的返回状态码,通过zabbix监控判断业务好坏。
1、zabbix安装
请查看此永久链接:https://www.cnblogs.com/small-wei/p/10911769.html
2、编写监控脚本
cd /usr/lib/zabbix/externalscripts #本人存放脚本路径,存放路径可以自定义,这个定义文件在zabbix_server.conf中,及zabbix-server服务配置文件。
vim web_site_code_status.sh
#!/bin/bash source /etc/profile >/dev/null 2>&1 WEB_SITE_discovery () { WEB_SITE=($(grep -v "^#" /usr/local/zabbix/etc/zabbix_script.d/WEBURL.txt)) printf '{\n' printf '\t"data":[\n' for((i=0;i<${#WEB_SITE[@]};++i)) { num=$(echo $((${#WEB_SITE[@]}-1))) if [[ "$i" != ${num} ]] then printf "\t\t{ \n" printf "\t\t\t\"{#SITENAME}\":\"${WEB_SITE[$i]}\"},\n" else printf "\t\t{ \n" printf "\t\t\t\"{#SITENAME}\":\"${WEB_SITE[$num]}\"}]}\n" fi } } web_site_code () { #下面注释的是也可以使用域名+端口号 # host=$(echo "$1"|awk -F "/" '{print $3}') # port=$(echo "$1"|awk -F "/" '{print $3}'|awk -F':' '{print $2}') # if [[ -z $port ]] # then # ntlocal="127.0.0.1" # else # ntlocal="127.0.0.1:$port" # fi # http_uri=$(echo "$1"|awk -F "/" '{for(i=4;i<=NF;i++) printf "/" $i;printf "\n"}') # /usr/bin/curl -H "Host:$host" -o /dev/null -s -w %{http_code} $ntlocal${http_uri} /usr/bin/curl -I "$1" 2> /dev/null | grep 'HTTP' | awk '{print $2}' } case "$1" in web_site_discovery) WEB_SITE_discovery ;; web_site_code) web_site_code $2 ;; *) echo "Usage:$0 {web_site_discovery|web_site_code URL}" ;; esac
3、创建URL列表
cat /etc/zabbix/zabbix_script.d/web_url_list.txt #这个文件在上面的脚本中定义。
www.baidu.com www.qq.com www.redhat.com https://www.redhat.com/en
https://www/zabbix.com
注意:这里也可以在后面加端口号
4、在zabbix_agentd.conf中添加相关的key
vim /etc/zabbix/zabbix_agentd.conf #客户端配置文件中添加&修改如下内容
UnsafeUserParameters=1 #允许将参数中的所有字符传递给用户定义的参数。
UserParameter=web.site.discovery,/usr/lib/zabbix/externalscripts/web_site_code_status.sh web_site_discovery
UserParameter=web.site.code[*],/usr/lib/zabbix/externalscripts/web_site_code_status.sh web_site_code $1
5、重启zabbix-agent
Linux6:
service zabbix-agent restart
Linux7:
systemctl restart zabbix-agent
6、导入zabbix监控模板文件。
复制如下代码,在本地计算机中创建一个文件:zbx_export_templates.xml (自定义创建):
<?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>3.4</version> <date>2019-06-04T18:15:17Z</date> <groups> <group> <name>http_status_code</name> </group> </groups> <templates> <template> <template>Automatically discover http_code</template> <name>Automatically discover http_code</name> <description>automatically discover http_status_code</description> <groups> <group> <name>http_status_code</name> </group> </groups> <applications/> <items/> <discovery_rules> <discovery_rule> <name>Disvover http url</name> <type>0</type> <snmp_community/> <snmp_oid/> <key>web.site.discovery</key> <delay>30s</delay> <status>0</status> <allowed_hosts/> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <params/> <ipmi_sensor/> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <filter> <evaltype>0</evaltype> <formula/> <conditions/> </filter> <lifetime>30d</lifetime> <description/> <item_prototypes> <item_prototype> <name>http url $1</name> <type>0</type> <snmp_community/> <snmp_oid/> <key>web.site.code[{#SITENAME}]</key> <delay>30s</delay> <history>90d</history> <trends>365d</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <params/> <ipmi_sensor/> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications/> <valuemap> <name>HTTP response status code</name> </valuemap> <logtimefmt/> <preprocessing/> <jmx_endpoint/> <application_prototypes/> <master_item_prototype/> </item_prototype> </item_prototypes> <trigger_prototypes> <trigger_prototype> <expression>{Automatically discover http_code:web.site.code[{#SITENAME}].last(#3,15)}>=500 and {Automatically discover http_code:web.site.code[{#SITENAME}].last(,0)}</expression> <recovery_mode>0</recovery_mode> <recovery_expression/> <name>web.site.code {#SITENAME} greater 500</name> <correlation_mode>0</correlation_mode> <correlation_tag/> <url/> <status>0</status> <priority>4</priority> <description/> <type>0</type> <manual_close>0</manual_close> <dependencies/> <tags/> </trigger_prototype> <trigger_prototype> <expression>{Automatically discover http_code:web.site.code[{#SITENAME}].last(#3,15)}<>200 and {Automatically discover http_code:web.site.code[{#SITENAME}].last(,0)}</expression> <recovery_mode>0</recovery_mode> <recovery_expression/> <name>web.site.code {#SITENAME} is not 200</name> <correlation_mode>0</correlation_mode> <correlation_tag/> <url/> <status>0</status> <priority>0</priority> <description/> <type>0</type> <manual_close>0</manual_close> <dependencies/> <tags/> </trigger_prototype> </trigger_prototypes> <graph_prototypes> <graph_prototype> <name>web.site.code.on {#SITENAME}</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Automatically discover http_code</host> <key>web.site.code[{#SITENAME}]</key> </item> </graph_item> </graph_items> </graph_prototype> </graph_prototypes> <host_prototypes/> <jmx_endpoint/> </discovery_rule> </discovery_rules> <httptests/> <macros/> <templates/> <screens/> </template> </templates> <value_maps> <value_map> <name>HTTP response status code</name> <mappings> <mapping> <value>100</value> <newvalue>Continue</newvalue> </mapping> <mapping> <value>101</value> <newvalue>Switching Protocols</newvalue> </mapping> <mapping> <value>102</value> <newvalue>Processing</newvalue> </mapping> <mapping> <value>200</value> <newvalue>OK</newvalue> </mapping> <mapping> <value>201</value> <newvalue>Created</newvalue> </mapping> <mapping> <value>202</value> <newvalue>Accepted</newvalue> </mapping> <mapping> <value>203</value> <newvalue>Non-Authoritative Information</newvalue> </mapping> <mapping> <value>204</value> <newvalue>No Content</newvalue> </mapping> <mapping> <value>205</value> <newvalue>Reset Content</newvalue> </mapping> <mapping> <value>206</value> <newvalue>Partial Content</newvalue> </mapping> <mapping> <value>207</value> <newvalue>Multi-Status</newvalue> </mapping> <mapping> <value>208</value> <newvalue>Already Reported</newvalue> </mapping> <mapping> <value>226</value> <newvalue>IM Used</newvalue> </mapping> <mapping> <value>300</value> <newvalue>Multiple Choices</newvalue> </mapping> <mapping> <value>301</value> <newvalue>Moved Permanently</newvalue> </mapping> <mapping> <value>302</value> <newvalue>Found</newvalue> </mapping> <mapping> <value>303</value> <newvalue>See Other</newvalue> </mapping> <mapping> <value>304</value> <newvalue>Not Modified</newvalue> </mapping> <mapping> <value>305</value> <newvalue>Use Proxy</newvalue> </mapping> <mapping> <value>306</value> <newvalue>Switch Proxy</newvalue> </mapping> <mapping> <value>307</value> <newvalue>Temporary Redirect</newvalue> </mapping> <mapping> <value>308</value> <newvalue>Permanent Redirect/Resume Incomplete</newvalue> </mapping> <mapping> <value>400</value> <newvalue>Bad Request</newvalue> </mapping> <mapping> <value>401</value> <newvalue>Unauthorized</newvalue> </mapping> <mapping> <value>402</value> <newvalue>Payment Required</newvalue> </mapping> <mapping> <value>403</value> <newvalue>Forbidden</newvalue> </mapping> <mapping> <value>404</value> <newvalue>Not Found</newvalue> </mapping> <mapping> <value>405</value> <newvalue>Method Not Allowed</newvalue> </mapping> <mapping> <value>406</value> <newvalue>Not Acceptable</newvalue> </mapping> <mapping> <value>407</value> <newvalue>Proxy Authentication Required</newvalue> </mapping> <mapping> <value>408</value> <newvalue>Request Timeout</newvalue> </mapping> <mapping> <value>409</value> <newvalue>Conflict</newvalue> </mapping> <mapping> <value>410</value> <newvalue>Gone</newvalue> </mapping> <mapping> <value>411</value> <newvalue>Length Required</newvalue> </mapping> <mapping> <value>412</value> <newvalue>Precondition Failed</newvalue> </mapping> <mapping> <value>413</value> <newvalue>Payload Too Large</newvalue> </mapping> <mapping> <value>414</value> <newvalue>Request-URI Too Long</newvalue> </mapping> <mapping> <value>415</value> <newvalue>Unsupported Media Type</newvalue> </mapping> <mapping> <value>416</value> <newvalue>Requested Range Not Satisfiable</newvalue> </mapping> <mapping> <value>417</value> <newvalue>Expectation Failed</newvalue> </mapping> <mapping> <value>418</value> <newvalue>I'm a Teapot</newvalue> </mapping> <mapping> <value>419</value> <newvalue>Authentication Timeout</newvalue> </mapping> <mapping> <value>420</value> <newvalue>Method Failure/Enhance Your Calm</newvalue> </mapping> <mapping> <value>421</value> <newvalue>Misdirected Request</newvalue> </mapping> <mapping> <value>422</value> <newvalue>Unprocessable Entity</newvalue> </mapping> <mapping> <value>423</value> <newvalue>Locked</newvalue> </mapping> <mapping> <value>424</value> <newvalue>Failed Dependency</newvalue> </mapping> <mapping> <value>426</value> <newvalue>Upgrade Required</newvalue> </mapping> <mapping> <value>428</value> <newvalue>Precondition Required</newvalue> </mapping> <mapping> <value>429</value> <newvalue>Too Many Requests</newvalue> </mapping> <mapping> <value>431</value> <newvalue>Request Header Fields Too Large</newvalue> </mapping> <mapping> <value>440</value> <newvalue>Login Timeout</newvalue> </mapping> <mapping> <value>444</value> <newvalue>No Response</newvalue> </mapping> <mapping> <value>449</value> <newvalue>Retry With</newvalue> </mapping> <mapping> <value>450</value> <newvalue>Blocked by Windows Parental Controls</newvalue> </mapping> <mapping> <value>451</value> <newvalue>Unavailable for Legal Reasons/Redirect</newvalue> </mapping> <mapping> <value>494</value> <newvalue>Request Header Too Large</newvalue> </mapping> <mapping> <value>495</value> <newvalue>Cert Error</newvalue> </mapping> <mapping> <value>496</value> <newvalue>No Cert</newvalue> </mapping> <mapping> <value>497</value> <newvalue>HTTP to HTTPS</newvalue> </mapping> <mapping> <value>498</value> <newvalue>Token Expired/Invalid</newvalue> </mapping> <mapping> <value>499</value> <newvalue>Client Closed Request/Token Required</newvalue> </mapping> <mapping> <value>500</value> <newvalue>Internal Server Error</newvalue> </mapping> <mapping> <value>501</value> <newvalue>Not Implemented</newvalue> </mapping> <mapping> <value>502</value> <newvalue>Bad Gateway</newvalue> </mapping> <mapping> <value>503</value> <newvalue>Service Unavailable</newvalue> </mapping> <mapping> <value>504</value> <newvalue>Gateway Timeout</newvalue> </mapping> <mapping> <value>505</value> <newvalue>HTTP Version Not Supported</newvalue> </mapping> <mapping> <value>506</value> <newvalue>Variant Also Negotiates</newvalue> </mapping> <mapping> <value>507</value> <newvalue>Insufficient Storage</newvalue> </mapping> <mapping> <value>508</value> <newvalue>Loop Detected</newvalue> </mapping> <mapping> <value>509</value> <newvalue>Bandwidth Limit Exceeded</newvalue> </mapping> <mapping> <value>510</value> <newvalue>Not Extended</newvalue> </mapping> <mapping> <value>511</value> <newvalue>Network Authentication Required</newvalue> </mapping> <mapping> <value>520</value> <newvalue>Unknown Error</newvalue> </mapping> <mapping> <value>598</value> <newvalue>Network Read Timeout Error</newvalue> </mapping> <mapping> <value>599</value> <newvalue>Network Connect Timeout Error</newvalue> </mapping> </mappings> </value_map> </value_maps> </zabbix_export>
7、导入模板文件zbx_export_templates.xml
登录zabbix,登录过程跳过;
导入成功后可以看到如下名称的模板:
8、验证查看监控:
至此url监控完毕。
参考链接:https://blog.csdn.net/qq_34857250/article/details/78323780
参考链接:https://www.zabbix.com