Пример #1
0
class QueryWorker(Worker):
    """
    This class wraps the Server class model with threading functionallity, to
    check the values of the variables in its reports.
    """
    rpc = None
    queue = None
    time_lapse = None
    rrd_dir = None

    def __init__(self, **kwargs):
        Worker.__init__(self, kwargs["id"])
        self.queue = kwargs["queue"]
        self.rpc = JSONRPCClient("http://%(host)s:%(port)d" % kwargs)
        self.time_lapse = kwargs["time_lapse"]
        self.rrd_dir = kwargs["rrd_dir"]

    def get_value(self, server_id, variable):
        """
        """

        if variable.query:
            f = 'doquery'
            kwargs = {'sql': variable.query, 'parsefunc': dict, }
        else:
            f = 'show_status'
            kwargs = {'pattern': variable.name, }
        logger.debug("Method: '%s', kwargs: %s" % (f, \
                repr(kwargs)))
        value = self.rpc.call_method(server_id, f, kwargs)
        logger.debug("Query result: %s" % repr(value))
        return value

    def run(self):
        while not self.queue.empty():
            try:
                (s, se, v) = self.queue.get_nowait()  # A server-variable tuple

                value = self.get_value(s.id, v)

                rrd = rrdtool.RRDWrapper.get_instance(s, se, v,
                        self.time_lapse, self.rrd_dir)
                rrd.update(value[v.name])

            except Queue.Empty:
                pass
            except Exception:
                logger.exception("Exception ocurred when processing "\
                        "an element:")
                continue

        logger.debug("Finished worker job.")