Beispiel #1
0
class MemoryDataSource(DataSource):
    '''
    Monitor memory usage via psutil.
    '''
    def __init__(self):
        DataSource.__init__(self)
        x = virtual_memory(
        )  # as per psutil docs: first call will give rubbish
        self._keys = [ a for a in dir(x) if not a.startswith('_') and \
            not callable(getattr(x,a)) ]
        self._results = ResultsContainer()
        self._log = logging.getLogger('mm')

    def __call__(self):
        sample = virtual_memory()
        self._results.add_result(
            dict([(k, getattr(sample, k)) for k in self._keys]))

    @property
    def name(self):
        return 'mem'

    def metadata(self):
        self._results.drop_first()
        self._log.info("Mem summary: {}".format(self._results.summary(mean)))
        return self._results.all()

    def show_status(self):
        pass
class CPUDataSource(DataSource):
    '''
    Monitor CPU usage (via psutil module)
    '''
    def __init__(self):
        DataSource.__init__(self)
        self._results = ResultsContainer()
        cpulist = cpu_times_percent(percpu=True) # as per psutil docs: first call gives rubbish 
        self._log = logging.getLogger('mm')
        x = cpulist.pop(0)
        self._keys = [ a for a in dir(x) if not a.startswith('_') and \
            not callable(getattr(x,a)) ]

    def __call__(self):
        sample = cpu_times_percent(percpu=True)
        result = { "cpu{}_{}".format(i,k):getattr(sample[i],k) for i in range(len(sample)) \
            for k in self._keys }
        result['idle'] = mean([ getattr(x, 'idle') for x in sample ])
        self._results.add_result(result)

    @property
    def name(self):
        return 'cpu'

    def metadata(self):
        self._results.drop_first()
        self._log.info("CPU summary: {}".format(self._results.summary(mean)))
        return self._results.all()

    def show_status(self):
        self._log.info("CPU idle: {}".format(self._results.last_result('idle')))
class NetIfDataSource(DataSource):
    '''
    Monitor network interface counters.  Can be constructed with one or more names
    (strings) of network interfaces, or nothing to monitor all interfaces.  The psutil
    call just yields current counter values; internally we keep last sample and only
    store differences.
    '''
    def __init__(self, *nics_of_interest):
        DataSource.__init__(self)
        x = self._lastsample = net_io_counters(pernic=True) # as per psutil docs: first call will give rubbish 
        if not nics_of_interest:
            self._nics = list(x.keys())
        else:
            self._nics = [ n for n in x.keys() if n in nics_of_interest ]
        if not self._nics:
            raise ConfigurationError("Bad interface names specified for netstat monitor: {}".format(', '.join(nics_of_interest)))

        d1 = list(self._nics)[0]

        self._keys = [ a for a in dir(x[d1]) if not a.startswith('_') and \
            not callable(getattr(x[d1],a)) ]
        self._results = ResultsContainer()
        self._log = logging.getLogger('mm')

    def __call__(self):
        sample = net_io_counters(pernic=True)
        rd = {
          '_'.join((n,k)):_compute_diff_with_wrap(getattr(sample[n], k), \
                                     getattr(self._lastsample[n], k)) \
                    for k in self._keys for n in self._nics
        }
        self._results.add_result(rd)

    @property
    def name(self):
        return 'netstat'

    def metadata(self):
        self._results.drop_first()
        self._log.info("Netstat summary: {}".format(self._results.summary(mean)))
        return self._results.all()

    def show_status(self):
        pass
Beispiel #4
0
class IODataSource(DataSource):
    '''
    Monitor disk IO counters via psutil.  The psutil call just yields the current
    counter values; internally we keep last sample and only store differences.
    '''
    def __init__(self):
        DataSource.__init__(self)
        x = self._lastsample = disk_io_counters(
            perdisk=True)  # as per psutil docs: first call will give rubbish
        self._disks = x.keys()
        self._results = ResultsContainer()
        self._log = logging.getLogger('mm')
        d1 = list(self._disks)[0]
        self._keys = [ a for a in dir(x[d1]) if not a.startswith('_') and \
            not callable(getattr(x[d1],a)) ]

    def __call__(self):
        sample = disk_io_counters(perdisk=True)
        rd = {
          '_'.join((d,k)):_compute_diff_with_wrap(getattr(sample[d], k), \
                                     getattr(self._lastsample[d], k)) \
                    for k in self._keys for d in self._disks
        }
        self._lastsample = sample
        self._results.add_result(rd)

    @property
    def name(self):
        return 'io'

    def metadata(self):
        self._results.drop_first()
        self._log.info("IO summary: {}".format(self._results.summary(mean)))
        return self._results.all()

    def show_status(self):
        pass