def load_plugin(fname): f = file(fname) d = json.load(f) f.close() # add class info d["__class__"] = d.get("__class__", "PluginDesc") for m in d["metrics"]: m["__class__"] = m.get("__class__", "MetricDesc") m["cmd"] = m.get("cmd", "") m["interval"] = m.get("interval", 0) # print d # ugly...... # p = agent_utils.from_json(agent_utils.to_json(d)) # print p p = Plugin._make(agent_utils.from_json(agent_utils.to_json(d))) # append plugin and metrics to list plugins.append(p) log.info(u"监控插件: [%s] %s" % (p.type, p.name)) if p.type == "shell": for m in p.metrics: if not metrics.has_key(m.interval): metrics[m.interval] = [] ts[m.interval] = time.time() - m.interval metrics[m.interval].append(Metric._make(m)) log.info(u"数据点 %s" % m.name) elif p.type == "platform": p.handle = subprocess.Popen(shlex.split(p.cmd_list["start"])) log.info(u"加载平台插件 %s, pid = %d" % (p.cmd_list["start"], p.pid)) # mq.connect_control(p.pid) # debug # mq.local_request(agent_utils.to_json(dict(op="open", vm="66ccff66ccff", host="a9b8c7d6e5f4")), p.pid) return p
def plugin_info(filename): global info global metrics # read PluginDesc from json file f = file(filename) d = json.load(f) f.close() # add class info d["__class__"] = d.get("__class__", "PluginDesc") for m in d["metrics"]: m["__class__"] = m.get("__class__", "MetricDesc") m["cmd"] = m.get("cmd", "") m["interval"] = m.get("interval", 0) info = agent_types.Plugin._make(agent_utils.from_json(agent_utils.to_json(d))) # sort Metric for m in info.metrics: metrics[m.interval] = metrics.get(m.interval, []) ts[m.interval] = time.time() - m.interval-1 metrics[m.interval].append(agent_types.Metric._make(m)) if info.type == "platform": # init local mq queue with PollController mq.setup_local_queue() mq.setup_local_control(request=request_callback)
def control_callback(msg): print u"*** 插件返回结果:", msg mq.remote_reply(msg) d = agent_utils.from_json(msg) print u"*** 保存job结果到数据库" try: send_metrics( build_metric("job_result", d, dict(job_id=d["job_id"]), "metric")) except: print "-------------- no jobid" print d raise
def control_callback_remote(msg): d = agent_utils.from_json(msg) jid = d["job_id"] print u"*** 服务端控制请求:", d # simple processing if d["op"] == "plugin_info": ret = get_plugin_info() ret["job_id"] = jid control_callback(agent_utils.to_json(ret)) else: # directly send to plugin q = mq.connect_control(d["pid"]) # mq.local_request(msg, d["pid"]) mq.request(msg, d["pid"]) q.close()
def request_callback(msg): d = agent_utils.from_json(msg) print u"[plugin] 接收到控制消息: ", d # mq.local_reply("[plugin] 返回: %s pid: %d" % (msg, agent_info.pid)) # send to worker directly if request_worker: request_worker(d)
def default_request_worker(msgdict): met = build_metric("plugin_perf", agent_utils.profiler.timers, plugin_info_tags()) msgdict.update(agent_utils.from_json(met.message_json())) mq.local_reply(agent_utils.to_json(msgdict))