"""
.. module:: uwsgi
:platform: Any
:synopsis: Reads UWSGI stats
.. moduleauthor:: Colin Alston <colin@imcol.in>
"""
import time
import json
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
from twisted.internet import defer, reactor
from twisted.protocols.basic import LineReceiver
from twisted.internet.protocol import ClientCreator, Protocol
from zope.interface import implementer
from tensor.interfaces import ITensorSource
from tensor.objects import Source
from tensor.aggregators import Counter, Counter32
[docs]class JSONProtocol(Protocol):
"""
JSON line protocol
"""
delimiter = '\n'
def __init__(self):
self.ready = False
self.buffer = StringIO()
self.d = defer.Deferred()
def dataReceived(self, data):
self.buffer.write(data)
def connectionLost(self, why):
self.buffer.seek(0)
self.d.callback(json.load(self.buffer))
def disconnect(self):
return self.transport.loseConnection()
@implementer(ITensorSource)
[docs]class Emperor(Source):
"""Connects to UWSGI Emperor stats and creates useful metrics
**Configuration arguments:**
:param host: Hostname (default localhost)
:type host: str.
:param port: Port
:type port: int.
"""
@defer.inlineCallbacks
def get(self):
host = self.config.get('host', 'localhost')
port = int(self.config.get('port', 6001))
proto = yield ClientCreator(reactor, JSONProtocol
).connectTCP(host, port)
stats = yield proto.d
nodes = stats.get('vassals', [])
events = []
active = 0
accepting = 0
respawns = 0
for node in nodes:
if node['accepting'] > 0:
active += 1
accepting += node['accepting']
if node['respawns'] > 0:
respawns += 1
events.extend([
self.createEvent('ok', 'accepting', node['accepting'],
prefix=node['id'] + '.accepting'),
self.createEvent('ok', 'respawns', node['respawns'],
prefix=node['id'] + '.respawns'),
])
events.extend([
self.createEvent('ok', 'active', active, prefix='total.active'),
self.createEvent('ok', 'accepting', accepting,
prefix='total.accepting'),
self.createEvent('ok', 'respawns', respawns,
prefix='total.respawns'),
])
defer.returnValue(events)