zoukankan      html  css  js  c++  java
  • zabbix监控域名带宽

    代码地址:https://github.com/Ma-Jing/python/blob/master/ngxv2_traffic_daemon.py

    READ.md里有使用说明!

      1 #!/usr/bin/env python
      2 # -*- coding:utf-8 -*-
      3 # a daemon which collecting channel traffic
      4 
      5 
      6 import subprocess
      7 import multiprocessing
      8 import re
      9 import os
     10 import sys
     11 import time
     12 from os import stat
     13 from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
     14 from SocketServer import ThreadingMixIn
     15 
     16 __authors__ = ['majing <majing@staff.sina.com.cn>']
     17 __version__ = "1.1"
     18 __date__ = "Aug 14, 2015"
     19 __license__ = "GPL license"
     20 
     21 if (hasattr(os, "devnull")):
     22     NULL_DEVICE = os.devnull
     23 else:
     24     NULL_DEVICE = "/dev/null"
     25 
     26 
     27 def _redirectFileDescriptors():
     28     """
     29     Redirect stdout and stderr.
     30     """
     31     import resource  # POSIX resource information
     32     maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
     33     if maxfd == resource.RLIM_INFINITY:
     34         maxfd = 1024
     35 
     36     for fd in range(0, maxfd):
     37         try:
     38             os.ttyname(fd)
     39         except:
     40             continue
     41         try:
     42             os.close(fd)
     43         except OSError:
     44             pass
     45 
     46     os.open(NULL_DEVICE, os.O_RDWR)
     47     os.dup2(0, 1)
     48     os.dup2(0, 2)
     49 
     50 
     51 def python_daemon():
     52     """
     53     Make program run on daemon mode.
     54     """
     55     if os.name != 'posix':
     56         print 'Daemon is only supported on Posix-compliant systems.'
     57         os._exit(1)
     58 
     59     try:
     60         if(os.fork() > 0):
     61             os._exit(0)
     62     except OSError:
     63         print "create daemon failed."
     64         os._exit(1)
     65 
     66     os.chdir('/')
     67     os.setsid()
     68     os.umask(0)
     69 
     70     try:
     71         if(os.fork() > 0):
     72             os._exit(0)
     73         _redirectFileDescriptors()
     74     except OSError:
     75         print "create daemon failed."
     76         os._exit(1)
     77 
     78 
     79 logfile = '/data0/log/sinaedge/esnv2/access.log'
     80 if not os.path.isfile(logfile):
     81     os._exit(1)
     82 
     83 # ensure data is shared between every processes.
     84 manager = multiprocessing.Manager()
     85 channel_traffics = {}
     86 channel_traffics = manager.dict()
     87 
     88 
     89 # a log generator
     90 def logtailer(logfile):
     91     ''' custom a generator, when logfile
     92     rotated, this generator will be closed'''
     93     with open(logfile) as f:
     94         last_inode = stat(logfile).st_ino
     95         f.seek(0, 2)  # seek to eof
     96         while True:
     97             line = f.readline()
     98             if not line:
     99                 if last_inode != stat(logfile).st_ino:
    100                     raise StopIteration('logfile rotated')
    101                 else:
    102                     time.sleep(0.05)
    103                     continue
    104             yield line
    105 
    106 
    107 def analysis_and_format_log():
    108     sourcelines = logtailer(logfile)
    109     while True:
    110         try:
    111             line = sourcelines.next()
    112             channel, transfer_bytes = line.split()[0:11:10]
    113             if not transfer_bytes.isdigit():
    114                 continue
    115             if channel_traffics.has_key(channel):
    116                 channel_traffics[channel] += int(transfer_bytes)
    117             else:
    118                 channel_traffics[channel] = int(transfer_bytes)
    119         except StopIteration, e:
    120             '''
    121             if log rotated, clear channel_traffics dict;
    122             then close old generator, start a new lines generator.
    123             '''
    124             sourcelines.close()
    125             channel_traffics.clear()
    126             sourcelines = logtailer(logfile)
    127         except Exception, e:
    128             continue #ignore other error.
    129 
    130 
    131 class GetChannelBandHandler(BaseHTTPRequestHandler):
    132     ''' a interface for query a channel current traffic'''
    133     def do_GET(self):
    134         self.send_response(200)
    135         self.end_headers()
    136         query_channel = self.path.split('/')[-1]
    137         if query_channel in channel_traffics:
    138             current_traffic = channel_traffics[query_channel]
    139             self.wfile.write(current_traffic)
    140         else:
    141             self.wfile.write("404: channel not found")
    142         return
    143 
    144 
    145 class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    146     pass
    147 
    148 
    149 if __name__ == "__main__":
    150     python_daemon()
    151     # start analysis_and_format_log function, run in backgroud.
    152     d = multiprocessing.Process(name='daemon', target=analysis_and_format_log)
    153     d.daemon = True
    154     d.start()
    155     server = ThreadedHTTPServer(("127.0.0.1", 8888), GetChannelBandHandler)
    156     print 'Starting server on 8888, use <Ctrl-C> to stop'
    157     server.serve_forever()
    ------ 若讷于言,则敏于行!------
  • 相关阅读:
    MySQL之三---MySQL数据库的二进制安装、源码编译和基础入门操作
    yum仓库搭建、http源码编译和磁盘分区
    linux 磁盘管理三部曲——(3)mount挂载,/etc/fstab配置文件
    linux 磁盘管理三部曲——(2)管理分区,文件系统类型格式化
    linux 磁盘管理三部曲——(1)磁盘结构,认识分区
    ssh WARNING:REMOTE HOST IDENTIFICATION HAS CHANGED(警告:远程主机标识已更改)
    httpd源码编译安装
    001 直接throw new RuntimeException("xxx")的异常错误信息是谁打印的?
    77 注解(二)——反射机制读取注解
    76 注解(一)——常用注解、自定义注解、注解的参数
  • 原文地址:https://www.cnblogs.com/searchappiness/p/4746488.html
Copyright © 2011-2022 走看看