Source code for duct.sources.apache

"""
.. module:: apache
   :platform: Unix
   :synopsis: A source module for apache stats

.. moduleauthor:: Colin Alston <colin@tamvera.com>
"""

from zope.interface import implementer

from duct.interfaces import IDuctSource
from duct.objects import Source

from duct.utils import HTTPRequest

[docs] @implementer(IDuctSource) class Apache(Source): """Reads Apache mod_status output :param url: URL to fetch status from :type url: str. **Metrics:** :(service name).conns.active: Active connections at this time :(service name).conns.writing: Writing connections :(service name).conns.closing: Closing connections :(service name).conns.keep_alive: KeepAlive connections :(service name).accesses: Accepted connections :(service name).uptime: Server uptime :(service name).cpu_load: CPU load :(service name).total_kbytes: Total kbytes served :(service name).request_rate: Requests per second :(service name).bytes_rate: Bytes per second :(service name).bytes_req: Bytes per request :(service name).workers.busy: Busy workers :(service name).workers.idle: Idle workers """ def _parse_stats(self, stats): stats = stats.strip('\n').split('\n') d = {} for row in stats: k, v = row.split(': ') d[k] = v return { 'conns.active': int(d.get('ConnsTotal', 0)), 'conns.writing': int(d.get('ConnsAsyncWriting', 0)), 'conns.closing': int(d.get('ConnsAsyncClosing', 0)), 'conns.keep_alive': int(d.get('ConnsAsyncKeepAlive', 0)), 'accesses': int(d.get('Total Accesses', 0)), 'uptime': int(d.get('Uptime', 0)), 'cpu_load': float(d.get('CPULoad', 0)), 'total_kbytes': int(d.get('Total kBytes', 0)), 'request_rate': float(d.get('ReqPerSec', 0)), 'bytes_rate': float(d.get('BytesPerSec', 0)), 'bytes_req': float(d.get('BytesPerReq', 0)), 'workers.busy': int(d.get('BusyWorkers', 0)), 'workers.idle': int(d.get('IdleWorkers', 0)) } async def _get_stats(self): url = self.config.get('url', self.config.get('stats_url')) return await HTTPRequest().getBody(url, headers={'User-Agent': 'Duct'})
[docs] async def get(self): stats = await self._get_stats() metrics = self._parse_stats(stats) return [self.createEvent('ok', f'Apache {k}', v, prefix=k) for k, v in metrics.items()]