예제 #1
0
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
예제 #2
0
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)    
예제 #3
0
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
예제 #4
0
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()
예제 #5
0
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)
예제 #6
0
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))