python实现监控服务器的UDP丢包情况
简介
利用python实现udp丢包情况,只能监控到服务器应用程序不能及时处理udp包导致的udp丢包情况。
实现原理:
1.通过netstat -su 命令周期性的获取服务器启动到当前时间udp丢包情况,packet receive errors字段的值,通过两次相邻时间获取的udp丢包值获取相邻时间内服务器的udp丢包情况
2.如果相邻时间内有udp丢包,发送警告到sentry
实现代码:
# -*- coding: utf-8 -*-
import os
import socket
import raven
from time import sleep
# change to your own sentry client key (修改为自己的sentry client key)
client = raven.Client("http://08eb7a241d1c4acd95e1b1b6978c0dfd:[email protected]:9000/6")
# How long does it take to get a packet loss data (多长时间获取一次丢包数据)
rate = 10
last_errors_packet = None
def udp_info_cmd():
# can't get udp stat info on mac os, maybe also windows(此命令在mac下不能获取udp统计信息, windows 估计也不能)
cmd = "netstat -su"
return cmd
def get_host_name():
name = socket.gethostname()
return name
def get_udp_error_packet():
cmd = udp_info_cmd()
file_object = os.popen(cmd)
for line in file_object:
if "packet receive errors" in line:
errors_packet_line = line.strip()
errors_packet = int(errors_packet_line.split()[0])
return errors_packet
return 0
def main():
global last_errors_packet
while 1:
errors_packet = get_udp_error_packet()
if last_errors_packet:
lost_packet = errors_packet - last_errors_packet
if lost_packet:
host_name = get_host_name()
message = "%s lost packets: %s packets" % (host_name, lost_packet)
# send message to sentry (发送丢包信息到sentry)
client.captureMessage(message)
last_errors_packet = errors_packet
sleep(rate)
if __name__ == "__main__":
main()