import agent_util
import logging
logger = logging.getLogger(__name__)
class UWSGIPlugin(agent_util.Plugin):
textkey = "uwsgi"
label = "UWSGI"
@classmethod
def get_metadata(self, config):
status = agent_util.SUPPORTED
msg = None
# check if uwsgi is even installed
installed = agent_util.which("uwsgi")
if not installed:
self.log.info("The uwsgi binary was not found.")
status = agent_util.UNSUPPORTED
msg = "uwsgi binary not found"
return {}
if not config:
msg = "The [uwsgi] config block is not found in the agent config file."
self.log.info(msg)
status = agent_util.MISCONFIGURED
if status == agent_util.SUPPORTED and (not "server" in config or not "port" in config):
msg = "The server and port settings were not found in the [uwsgi] block of the agent config file."
self.log.info(msg)
status = agent_util.MISCONFIGURED
workers = []
if status is agent_util.SUPPORTED:
try:
status, output = agent_util.execute_command('nc %s %s' % (config['server'], config['port']))
if status != 0: raise Exception(output)
output = agent_util.json_loads(output)
for worker in output["workers"]:
workers.append("Worker #%s" % worker["pid"])
workers.sort()
except:
status = agent_util.MISCONFIGURED
msg = "Unable to get uwsgi status, please make sure uwsgi is running with the status module enabled and that the connection settings in the agent configuration file are valid."
self.log.info(msg)
if status == agent_util.SUPPORTED and not workers:
status = agent_util.MISCONFIGURED
msg = "No workers found."
metadata = {
"requests": {
"label": "Requests per second",
"options": workers,
"status": status,
"error_message": msg,
"unit": "requests"
},
"exceptions": {
"label": "Exceptions",
"options": workers,
"status": status,
"error_message": msg,
"unit": "exceptions"
},
"status": {
"label": "Worker is busy or free to use(BUSY=1, FREE=0)",
"options": workers,
"status": status,
"error_message": msg
},
"rss": {
"label": "Worker RSS (Resident Set Size)",
"options": workers,
"status": status,
"error_message": msg
},
"vsz": {
"label": "Worker VSZ (Virtual Memory Size)",
"options": workers,
"status": status,
"error_message": msg
},
"running_time": {
"label": "How long worker is working",
"options": workers,
"status": status,
"error_message": msg,
"unit": "workers"
},
"respawn_count": {
"label": "How many requests worker did since worker (re)spawn",
"options": workers,
"status": status,
"error_message": msg,
"unit": "requests"
},
"tx": {
"label": "How many data was transmitted by worker",
"options": workers,
"status": status,
"error_message": msg,
"unit": "data"
},
"avg_rt": {
"label": "Average request time",
"options": workers,
"status": status,
"error_message": msg,
"unit": "ms"
}
}
return metadata
def check(self, textkey, worker, config):
status, output = agent_util.execute_command("nc %s %s" %(config["server"],config["port"]))
if status != 0: raise Exception(output)
output = agent_util.json_loads(output)
workers = output["workers"]
pid = worker.replace("Worker #","")
for w in workers:
if w["pid"] == int(pid):
worker = w
break
try:
res = worker[textkey]
if textkey == "status":
if res == "idle": res = 0
else: res = 1
except:
res = 0
return res