天天看点

使用Zabbix监控RabbitMQ

<code>写这个的思路</code>

<code>监控脚本主要包括三个部分,监控overview,监控当前主机的节点信息,还有监控各个队列</code>

<code>根据网上的脚本进行了修改,新增加了很多监控项目,把原来脚本中的</code><code>filter</code><code>去掉了</code>

<code>这里顺便提一下,对于网上的各种代码,不能拿来就用,要结合自身的需求对代码进行分析,</code>

<code>也可以提升自己的编码能力,如果只是一味地拿来就用,那永远也得不到提高。</code>

<code>rabbitmq.queues[{</code><code>#VHOSTNAME},queue_messages_ready,{#QUEUENAME}]</code>

<code>key </code><code>=</code> <code>'"rabbitmq.queues[{0},queue_{1},{2}]"'</code><code>.</code><code>format</code><code>(queue[</code><code>'vhost'</code><code>], item, queue[</code><code>'name'</code><code>])</code>

<code>value </code><code>=</code> <code>queue.get(item, </code><code>0</code><code>)</code>

<code>UserParameter</code><code>=</code><code>rabbitmq.discovery_queue,</code><code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python </code><code>/</code><code>opt</code><code>/</code><code>app</code><code>/</code><code>zabbix</code><code>/</code><code>sbin</code><code>/</code><code>rabbitmq_status.py </code><code>-</code><code>-</code><code>check</code><code>=</code><code>list_queues</code>

<code>UserParameter</code><code>=</code><code>rabbitmq.queues,</code><code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python </code><code>/</code><code>opt</code><code>/</code><code>app</code><code>/</code><code>zabbix</code><code>/</code><code>sbin</code><code>/</code><code>rabbitmq_status.py </code><code>-</code><code>-</code><code>check</code><code>=</code><code>queues</code>

<code>UserParameter</code><code>=</code><code>rabbitmq[</code><code>*</code><code>],</code><code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python </code><code>/</code><code>opt</code><code>/</code><code>app</code><code>/</code><code>zabbix</code><code>/</code><code>sbin</code><code>/</code><code>rabbitmq_status.py </code><code>-</code><code>-</code><code>check</code><code>=</code><code>$</code><code>1</code> <code>-</code><code>-</code><code>metric</code><code>=</code><code>$</code><code>2</code>

<code>value </code><code>=</code> <code>queue[</code><code>0</code><code>].get(</code><code>'message_stats'</code><code>, {}).get(</code><code>'deliver_get'</code><code>, </code><code>0</code><code>)</code>

<code>#!/usr/bin/env /usr/bin/python</code>

<code>'''Python module to query the RabbitMQ Management Plugin REST API and get</code>

<code>results that can then be used by Zabbix.</code>

<code>https://github.com/jasonmcintosh/rabbitmq-zabbix</code>

<code>'''</code>

<code>    </code><code>This script is tested on RabbitMQ 3.5.3 </code>

<code>import</code> <code>json</code>

<code>import</code> <code>optparse</code>

<code>import</code> <code>socket</code>

<code>import</code> <code>urllib2</code>

<code>import</code> <code>subprocess</code>

<code>import</code> <code>tempfile</code>

<code>import</code> <code>os</code>

<code>import</code> <code>logging</code>

<code> </code> 

<code>logging.basicConfig(filename</code><code>=</code><code>'/var/log/rabbitmq_zabbix.log'</code><code>, level</code><code>=</code><code>logging.WARNING, </code><code>format</code><code>=</code><code>'%(asctime)s %(levelname)s: %(message)s'</code><code>)</code>

<code>class</code> <code>RabbitMQAPI(</code><code>object</code><code>):</code>

<code>    </code><code>'''Class for RabbitMQ Management API'''</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>, user_name</code><code>=</code><code>'guest'</code><code>, password</code><code>=</code><code>'guest'</code><code>, host_name</code><code>=</code><code>'',</code>

<code>                 </code><code>protocol</code><code>=</code><code>'http'</code><code>, port</code><code>=</code><code>15672</code><code>, conf</code><code>=</code><code>'/usr/local/zabbix/etc/zabbix_agentd.conf'</code><code>, senderhostname</code><code>=</code><code>None</code><code>):</code>

<code>        </code><code>self</code><code>.user_name </code><code>=</code> <code>user_name</code>

<code>        </code><code>self</code><code>.password </code><code>=</code> <code>password</code>

<code>        </code><code>self</code><code>.host_name </code><code>=</code> <code>host_name </code><code>or</code> <code>socket.gethostname()</code>

<code>        </code><code>self</code><code>.protocol </code><code>=</code> <code>protocol</code>

<code>        </code><code>self</code><code>.port </code><code>=</code> <code>port</code>

<code>        </code><code>self</code><code>.conf </code><code>=</code> <code>conf </code><code>or</code> <code>'/usr/local/zabbix/etc/zabbix_agentd.conf'</code>

<code>        </code><code>self</code><code>.senderhostname </code><code>=</code> <code>senderhostname </code><code>if</code> <code>senderhostname </code><code>else</code> <code>host_name</code>

<code>    </code><code>def</code> <code>call_api(</code><code>self</code><code>, path):</code>

<code>        </code><code>'''</code>

<code>           </code><code>All URIs will server only resource of type application/json,and will require HTTP basic authentication. The default username and password is guest/guest.  /%sf is encoded for the default virtual host '/' </code>

<code>        </code><code>url </code><code>=</code> <code>'{0}://{1}:{2}/api/{3}'</code><code>.</code><code>format</code><code>(</code><code>self</code><code>.protocol, </code><code>self</code><code>.host_name, </code><code>self</code><code>.port, path)</code>

<code>        </code><code>password_mgr </code><code>=</code> <code>urllib2.HTTPPasswordMgrWithDefaultRealm()</code>

<code>        </code><code>password_mgr.add_password(</code><code>None</code><code>, url, </code><code>self</code><code>.user_name, </code><code>self</code><code>.password)</code>

<code>        </code><code>handler </code><code>=</code> <code>urllib2.HTTPBasicAuthHandler(password_mgr)</code>

<code>        </code><code>logging.debug(</code><code>'Issue a rabbit API call to get data on '</code> <code>+</code> <code>path)</code>

<code>######## json.loads()  transfer json data to python data</code>

<code>######## json.dump()   transfer python data to json data</code>

<code>        </code><code>return</code> <code>json.loads(urllib2.build_opener(handler).</code><code>open</code><code>(url).read())</code>

<code>    </code><code>def</code> <code>list_queues(</code><code>self</code><code>):</code>

<code>        </code><code>''' curl -i -u guest:guest http://localhost:15672/api/queues  </code>

<code>        </code><code>return a list </code>

<code>        </code><code>queues </code><code>=</code> <code>[]</code>

<code>        </code><code>for</code> <code>queue </code><code>in</code> <code>self</code><code>.call_api(</code><code>'queues'</code><code>):</code>

<code>            </code><code>logging.debug(</code><code>"Discovered queue "</code> <code>+</code> <code>queue[</code><code>'name'</code><code>])</code>

<code>            </code><code>element </code><code>=</code> <code>{</code><code>'{#VHOSTNAME}'</code><code>: queue[</code><code>'vhost'</code><code>],</code>

<code>                       </code><code>'{#QUEUENAME}'</code><code>: queue[</code><code>'name'</code><code>]</code>

<code>                      </code><code>}</code>

<code>            </code><code>queues.append(element)</code>

<code>            </code><code>logging.debug(</code><code>'Discovered queue '</code><code>+</code><code>queue[</code><code>'vhost'</code><code>]</code><code>+</code><code>'/'</code><code>+</code><code>queue[</code><code>'name'</code><code>])</code>

<code>        </code><code>return</code> <code>queues</code>

<code>    </code><code>def</code> <code>list_nodes(</code><code>self</code><code>):</code>

<code>        </code><code>'''Lists all rabbitMQ nodes in the cluster'''</code>

<code>        </code><code>nodes </code><code>=</code> <code>[]</code>

<code>        </code><code>for</code> <code>node </code><code>in</code> <code>self</code><code>.call_api(</code><code>'nodes'</code><code>):</code>

<code>            </code><code># We need to return the node name, because Zabbix</code>

<code>            </code><code># does not support @ as an item parameter</code>

<code>            </code><code>name </code><code>=</code> <code>node[</code><code>'name'</code><code>].split(</code><code>'@'</code><code>)[</code><code>1</code><code>]</code>

<code>            </code><code>element </code><code>=</code> <code>{</code><code>'{#NODENAME}'</code><code>: name,</code>

<code>                       </code><code>'{#NODETYPE}'</code><code>: node[</code><code>'type'</code><code>]}</code>

<code>            </code><code>nodes.append(element)</code>

<code>            </code><code>logging.debug(</code><code>'Discovered nodes '</code><code>+</code><code>name</code><code>+</code><code>'/'</code><code>+</code><code>node[</code><code>'type'</code><code>])</code>

<code>        </code><code>return</code> <code>nodes</code>

<code>    </code><code>def</code> <code>check_queue(</code><code>self</code><code>):</code>

<code>        </code><code>'''Return the value for a specific item in a queue's details.'''</code>

<code>        </code><code>return_code </code><code>=</code> <code>0</code>

<code>        </code><code>#### use tempfile module to create a file on memory, will not be deleted when it is closed , because 'delete' argument is set to False</code>

<code>        </code><code>rdatafile </code><code>=</code> <code>tempfile.NamedTemporaryFile(delete</code><code>=</code><code>False</code><code>)</code>

<code>            </code><code>self</code><code>._get_queue_data(queue, rdatafile)</code>

<code>        </code><code>rdatafile.close()</code>

<code>        </code><code>return_code </code><code>=</code> <code>self</code><code>._send_queue_data(rdatafile)</code>

<code>        </code><code>#### os.unlink is used to remove a file</code>

<code>        </code><code>os.unlink(rdatafile.name)</code>

<code>        </code><code>return</code> <code>return_code</code>

<code>    </code><code>def</code> <code>_get_queue_data(</code><code>self</code><code>, queue, tmpfile):</code>

<code>        </code><code>'''Prepare the queue data for sending'''</code>

<code>          </code><code>### one single  queue's information like this #####</code>

<code>          </code><code>### curl -i -u guest:guest http://localhost:15672/api/queues   dumps a list   ###</code>

<code>{"memory":32064,"message_stats":{"ack":3870,"ack_details":{"rate":0.0},"deliver":3871,"deliver_details":{"rate":0.0},"deliver_get":3871,"deliver_get_details":{"rate":0.0},"disk_writes":3870,"disk_writes_details":{"rate":0.0},"publish":3870,"publish_details":{"rate":0.0},"redeliver":1,"redeliver_details":{"rate":0.0}},"messages":0,"messages_details":{"rate":0.0},"messages_ready":0,"messages_ready_details":{"rate":0.0},"messages_unacknowledged":0,"messages_unacknowledged_details":{"rate":0.0},"idle_since":"2016-03-01 22:04:22","consumer_utilisation":"","policy":"","exclusive_consumer_tag":"","consumers":4,"recoverable_slaves":"","state":"running","messages_ram":0,"messages_ready_ram":0,"messages_unacknowledged_ram":0,"messages_persistent":0,"message_bytes":0,"message_bytes_ready":0,"message_bytes_unacknowledged":0,"message_bytes_ram":0,"message_bytes_persistent":0,"disk_reads":0,"disk_writes":3870,"backing_queue_status":{"q1":0,"q2":0,"delta":["delta",0,0,0],"q3":0,"q4":0,"len":0,"target_ram_count":"infinity","next_seq_id":3870,"avg_ingress_rate":0.060962064328682466,"avg_egress_rate":0.060962064328682466,"avg_ack_ingress_rate":0.060962064328682466,"avg_ack_egress_rate":0.060962064328682466},"name":"app000","vhost":"/","durable":true,"auto_delete":false,"arguments":{},"node":"rabbit@test2"}</code>

<code>        </code><code>for</code> <code>item </code><code>in</code> <code>[ </code><code>'memory'</code><code>,</code><code>'messages'</code><code>,</code><code>'messages_ready'</code><code>,</code><code>'messages_unacknowledged'</code><code>,</code><code>'consumers'</code> <code>]:</code>

<code>            </code><code>#key = rabbitmq.queues[/,queue_memory,queue.helloWorld]</code>

<code>            </code><code>key </code><code>=</code> <code>'"rabbitmq.queues[{0},queue_{1},{2}]"'</code><code>.</code><code>format</code><code>(queue[</code><code>'vhost'</code><code>], item, queue[</code><code>'name'</code><code>])</code>

<code>            </code><code>### if item is in queue,value=queue[item],else value=0</code>

<code>            </code><code>value </code><code>=</code> <code>queue.get(item, </code><code>0</code><code>)</code>

<code>            </code><code>logging.debug(</code><code>"SENDER_DATA: - %s %s"</code> <code>%</code> <code>(key,value))</code>

<code>            </code><code>tmpfile.write(</code><code>"- %s %s\n"</code> <code>%</code> <code>(key, value))</code>

<code>        </code><code>##  This is a non standard bit of information added after the standard items</code>

<code>        </code><code>for</code> <code>item </code><code>in</code> <code>[</code><code>'deliver_get'</code><code>, </code><code>'publish'</code><code>]:</code>

<code>            </code><code>key </code><code>=</code> <code>'"rabbitmq.queues[{0},queue_message_stats_{1},{2}]"'</code><code>.</code><code>format</code><code>(queue[</code><code>'vhost'</code><code>], item, queue[</code><code>'name'</code><code>])</code>

<code>            </code><code>value </code><code>=</code> <code>queue.get(</code><code>'message_stats'</code><code>, {}).get(item, </code><code>0</code><code>)</code>

<code>    </code><code>def</code> <code>_send_queue_data(</code><code>self</code><code>, tmpfile):</code>

<code>        </code><code>'''Send the queue data to Zabbix.'''</code>

<code>        </code><code>'''Get key value from temp file. '''</code>

<code>        </code><code>args </code><code>=</code> <code>'/usr/local/zabbix/sbin/zabbix_sender -c {0} -i {1}'</code>

<code>        </code><code>if</code> <code>self</code><code>.senderhostname:</code>

<code>            </code><code>args </code><code>=</code> <code>args </code><code>+</code> <code>" -s "</code> <code>+</code> <code>self</code><code>.senderhostname</code>

<code>        </code><code>process </code><code>=</code> <code>subprocess.Popen(args.</code><code>format</code><code>(</code><code>self</code><code>.conf, tmpfile.name),</code>

<code>                                           </code><code>shell</code><code>=</code><code>True</code><code>, stdout</code><code>=</code><code>subprocess.PIPE,</code>

<code>                                           </code><code>stderr</code><code>=</code><code>subprocess.PIPE)</code>

<code>        </code><code>out, err </code><code>=</code> <code>process.communicate()</code>

<code>        </code><code>logging.debug(</code><code>"Finished sending data"</code><code>)</code>

<code>        </code><code>return_code </code><code>=</code> <code>process.wait()</code>

<code>        </code><code>logging.info(</code><code>"Found return code of "</code> <code>+</code> <code>str</code><code>(return_code))</code>

<code>        </code><code>if</code> <code>return_code !</code><code>=</code> <code>0</code><code>:</code>

<code>            </code><code>logging.warning(out)</code>

<code>            </code><code>logging.warning(err)</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>logging.debug(err)</code>

<code>            </code><code>logging.debug(out)</code>

<code>    </code><code>def</code> <code>check_aliveness(</code><code>self</code><code>):</code>

<code>        </code><code>'''Check the aliveness status of a given vhost. '''</code>

<code>        </code><code>'''virtual host '/' should be encoded as '/%2f' '''</code> 

<code>        </code><code>return</code> <code>self</code><code>.call_api(</code><code>'aliveness-test/%2f'</code><code>)[</code><code>'status'</code><code>]</code>

<code>    </code><code>def</code> <code>check_overview(</code><code>self</code><code>, item):</code>

<code>        </code><code>'''First, check the overview specific items'''</code>

<code>        </code><code>''' curl -i -u guest:guest http://localhost:15672/api/overview   '''</code>

<code>        </code><code>## rabbitmq[overview,connections]</code>

<code>        </code><code>if</code>   <code>item </code><code>in</code> <code>[ </code><code>'channels'</code><code>,</code><code>'connections'</code><code>,</code><code>'consumers'</code><code>,</code><code>'exchanges'</code><code>,</code><code>'queues'</code> <code>]: </code>

<code>          </code><code>return</code> <code>self</code><code>.call_api(</code><code>'overview'</code><code>).get(</code><code>'object_totals'</code><code>).get(item,</code><code>0</code><code>)</code>

<code>        </code><code>## rabbitmq[overview,messages]</code>

<code>        </code><code>elif</code> <code>item </code><code>in</code> <code>[ </code><code>'messages'</code><code>,</code><code>'messages_ready'</code><code>,</code><code>'messages_unacknowledged'</code> <code>]:</code>

<code>          </code><code>return</code> <code>self</code><code>.call_api(</code><code>'overview'</code><code>).get(</code><code>'queue_totals'</code><code>).get(item,</code><code>0</code><code>)</code>

<code>        </code><code>elif</code> <code>item </code><code>=</code><code>=</code> <code>'message_stats_deliver_get'</code><code>:</code>

<code>          </code><code>return</code> <code>self</code><code>.call_api(</code><code>'overview'</code><code>).get(</code><code>'message_stats'</code><code>, {}).get(</code><code>'deliver_get'</code><code>,</code><code>0</code><code>)</code>

<code>        </code><code>elif</code> <code>item </code><code>=</code><code>=</code> <code>'message_stats_publish'</code><code>:</code>

<code>          </code><code>return</code> <code>self</code><code>.call_api(</code><code>'overview'</code><code>).get(</code><code>'message_stats'</code><code>, {}).get(</code><code>'publish'</code><code>,</code><code>0</code><code>)</code>

<code>        </code><code>elif</code> <code>item </code><code>=</code><code>=</code> <code>'message_stats_ack'</code><code>:</code>

<code>          </code><code>return</code> <code>self</code><code>.call_api(</code><code>'overview'</code><code>).get(</code><code>'message_stats'</code><code>, {}).get(</code><code>'ack'</code><code>,</code><code>0</code><code>)</code>

<code>        </code><code>elif</code> <code>item </code><code>=</code><code>=</code> <code>'message_stats_redeliver'</code><code>:</code>

<code>          </code><code>return</code> <code>self</code><code>.call_api(</code><code>'overview'</code><code>).get(</code><code>'message_stats'</code><code>, {}).get(</code><code>'redeliver'</code><code>,</code><code>0</code><code>)</code>

<code>        </code><code>elif</code> <code>item </code><code>=</code><code>=</code> <code>'rabbitmq_version'</code><code>:</code>

<code>          </code><code>return</code> <code>self</code><code>.call_api(</code><code>'overview'</code><code>).get(</code><code>'rabbitmq_version'</code><code>, </code><code>'None'</code><code>)</code>

<code>    </code><code>def</code> <code>check_server(</code><code>self</code><code>,item,node_name):</code>

<code>        </code><code>'''Return the value for a specific item in a node's details. '''</code>

<code>        </code><code>'''curl -i -u guest:guest http://localhost:15672/api/nodes'''</code>

<code>        </code><code>'''return a list'''</code>

<code>        </code><code># hostname     hk-prod-mq1.example.com</code>

<code>        </code><code># self.call_api('nodes')[0]['name']   rabbit@hk-prod-mq1</code>

<code>        </code><code>node_name </code><code>=</code> <code>node_name.split(</code><code>'.'</code><code>)[</code><code>0</code><code>]</code>

<code>        </code><code>for</code> <code>nodeData </code><code>in</code> <code>self</code><code>.call_api(</code><code>'nodes'</code><code>):</code>

<code>            </code><code>if</code> <code>node_name </code><code>in</code> <code>nodeData[</code><code>'name'</code><code>]:</code>

<code>                </code><code>return</code> <code>nodeData.get(item,</code><code>0</code><code>)</code>

<code>        </code><code>return</code> <code>'Not Found'</code>

<code>def</code> <code>main():</code>

<code>    </code><code>'''Command-line parameters and decoding for Zabbix use/consumption.'''</code>

<code>    </code><code>choices </code><code>=</code> <code>[</code><code>'list_queues'</code><code>, </code><code>'list_nodes'</code><code>, </code><code>'queues'</code><code>, </code><code>'check_aliveness'</code><code>,</code>

<code>               </code><code>'overview'</code><code>,</code><code>'server'</code><code>]</code>

<code>    </code><code>parser </code><code>=</code> <code>optparse.OptionParser()</code>

<code>    </code><code>parser.add_option(</code><code>'--username'</code><code>, </code><code>help</code><code>=</code><code>'RabbitMQ API username'</code><code>,</code>

<code>                      </code><code>default</code><code>=</code><code>'guest'</code><code>)</code>

<code>    </code><code>parser.add_option(</code><code>'--password'</code><code>, </code><code>help</code><code>=</code><code>'RabbitMQ API password'</code><code>,</code>

<code>    </code><code>parser.add_option(</code><code>'--hostname'</code><code>, </code><code>help</code><code>=</code><code>'RabbitMQ API host'</code><code>,</code>

<code>                      </code><code>default</code><code>=</code><code>socket.gethostname())</code>

<code>    </code><code>parser.add_option(</code><code>'--protocol'</code><code>, </code><code>help</code><code>=</code><code>'RabbitMQ API protocol (http or https)'</code><code>,</code>

<code>                      </code><code>default</code><code>=</code><code>'http'</code><code>)</code>

<code>    </code><code>parser.add_option(</code><code>'--port'</code><code>, </code><code>help</code><code>=</code><code>'RabbitMQ API port'</code><code>, </code><code>type</code><code>=</code><code>'int'</code><code>,</code>

<code>                      </code><code>default</code><code>=</code><code>15672</code><code>)</code>

<code>    </code><code>parser.add_option(</code><code>'--check'</code><code>, </code><code>type</code><code>=</code><code>'choice'</code><code>, choices</code><code>=</code><code>choices,</code>

<code>                      </code><code>help</code><code>=</code><code>'Type of check'</code><code>)</code>

<code>    </code><code>parser.add_option(</code><code>'--metric'</code><code>, </code><code>help</code><code>=</code><code>'Which metric to evaluate'</code><code>, default</code><code>=</code><code>'')</code>

<code>    </code><code>parser.add_option(</code><code>'--node'</code><code>, </code><code>help</code><code>=</code><code>'Which node to check (valid for --check=server)'</code><code>)</code>

<code>    </code><code>parser.add_option(</code><code>'--conf'</code><code>, default</code><code>=</code><code>'/usr/local/zabbix/etc/zabbix_agentd.conf'</code><code>)</code>

<code>    </code><code>parser.add_option(</code><code>'--senderhostname'</code><code>, default</code><code>=</code><code>'</code><code>', help='</code><code>Allows including a sender parameter on calls to zabbix_sender')</code>

<code>    </code><code>(options, args) </code><code>=</code> <code>parser.parse_args()</code>

<code>    </code><code>if</code> <code>not</code> <code>options.check:</code>

<code>        </code><code>parser.error(</code><code>'At least one check should be specified'</code><code>)</code>

<code>    </code><code>logging.debug(</code><code>"Started trying to process data"</code><code>)</code>

<code>    </code><code>api </code><code>=</code> <code>RabbitMQAPI(user_name</code><code>=</code><code>options.username, password</code><code>=</code><code>options.password,</code>

<code>                      </code><code>host_name</code><code>=</code><code>options.hostname, protocol</code><code>=</code><code>options.protocol, port</code><code>=</code><code>options.port,</code>

<code>                      </code><code>conf</code><code>=</code><code>options.conf, senderhostname</code><code>=</code><code>options.senderhostname)</code>

<code>    </code><code>if</code> <code>options.check </code><code>=</code><code>=</code> <code>'list_queues'</code><code>:</code>

<code>        </code><code>print</code> <code>json.dumps({</code><code>'data'</code><code>: api.list_queues()},indent</code><code>=</code><code>4</code><code>,separators</code><code>=</code><code>(</code><code>','</code><code>,</code><code>':'</code><code>))</code>

<code>    </code><code>elif</code> <code>options.check </code><code>=</code><code>=</code> <code>'list_nodes'</code><code>:</code>

<code>        </code><code>print</code> <code>json.dumps({</code><code>'data'</code><code>: api.list_nodes()},indent</code><code>=</code><code>4</code><code>,separators</code><code>=</code><code>(</code><code>','</code><code>,</code><code>':'</code><code>))</code>

<code>    </code><code>elif</code> <code>options.check </code><code>=</code><code>=</code> <code>'queues'</code><code>:</code>

<code>        </code><code>print</code> <code>api.check_queue()</code>

<code>    </code><code>elif</code> <code>options.check </code><code>=</code><code>=</code> <code>'check_aliveness'</code><code>:</code>

<code>        </code><code>print</code> <code>api.check_aliveness()</code>

<code>    </code><code>elif</code> <code>options.check </code><code>=</code><code>=</code> <code>'overview'</code><code>:</code>

<code>    </code><code>#rabbitmq[overview,connections]</code>

<code>    </code><code>#--check=overview   --metric=connections</code>

<code>        </code><code>if</code> <code>not</code> <code>options.metric:</code>

<code>            </code><code>parser.error(</code><code>'Missing required parameter: "metric"'</code><code>)       </code>

<code>            </code><code>if</code> <code>options.node:</code>

<code>                </code><code>print</code> <code>api.check_overview(options.metric)</code>

<code>            </code><code>else</code><code>:</code>

<code>    </code><code>elif</code> <code>options.check </code><code>=</code><code>=</code> <code>'server'</code><code>:</code>

<code>    </code><code>#rabbitmq[server,sockets_used]</code>

<code>    </code><code>#--check=server   --metric=sockets_used</code>

<code>         </code><code>if</code> <code>not</code> <code>options.metric:</code>

<code>            </code><code>parser.error(</code><code>'Missing required parameter: "metric"'</code><code>)</code>

<code>         </code><code>else</code><code>:</code>

<code>                </code><code>print</code> <code>api.check_server(options.metric,options.node)</code>

<code>                </code><code>print</code> <code>api.check_server(options.metric,api.host_name)</code>

<code>  </code> 

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>

<code>    </code><code>main()</code>

<code>修改的地方</code>

<code>1.default</code><code>=</code><code>socket.gethostbyname(socket.gethostname())</code>

<code>2.logging</code><code>.warning(args) debug不能显示,不知道什么原因</code>

<code>3.args</code> <code>=</code> <code>'/usr/local/zabbix/bin/zabbix_sender -c {0} -i {1}'</code><code>.</code><code>format</code><code>(</code><code>self</code><code>.conf, tmpfile.name)</code>

<code>4.args</code> <code>=</code> <code>args </code><code>+</code> <code>" -s "</code> <code>+</code> <code>self</code><code>.senderhostname </code><code>+</code> <code>" -z "</code> <code>+</code> <code>serverip</code>

<code>5.subprocess</code><code>.Popen()</code>

<code>process </code><code>=</code> <code>subprocess.Popen(args.shell</code><code>=</code><code>True</code><code>, stdout</code><code>=</code><code>subprocess.PIPE,stderr</code><code>=</code><code>subprocess.PIPE)</code>

<code>out, err </code><code>=</code> <code>process.communicate()</code>

<code>return_code </code><code>=</code> <code>process.wait()</code>

原文http://john88wang.blog.51cto.com/2165294/1745824

继续阅读