diff --git a/scalpels/agents/server.py b/scalpels/agents/server.py index 8535835..e8f6f64 100644 --- a/scalpels/agents/server.py +++ b/scalpels/agents/server.py @@ -22,9 +22,11 @@ class TraceEndpoint(object): def tracer_list(self, ctx): tracers = db_api.tracer_list() - ret = {} + ret = list() for tr in tracers: - ret[tr.name] = tr.template + ret.append({"name":tr.name, + "tpl":tr.template, + "running":tr.is_running}) return ret def start_tracers(self, ctx, tracers): @@ -43,6 +45,11 @@ class TraceEndpoint(object): db_api.register_tracer(name=tracer_opts["name"], template=tracer_opts["tpl"]) print "[LOG] registering tracer %(name)s: %(tpl)s" % tracer_opts + def set_tracer_stat(self, ctx, tracer, running): + running=bool(running) + print "[LOG] setting tracer: %s running: %s" % (tracer, running) + db_api.tracer_update(tracer, running=running) + class TaskEndpoint(object): target = oslo_messaging.Target(topic="test", version='1.0') diff --git a/scalpels/client/actions/tracer.py b/scalpels/client/actions/tracer.py index cc4354a..7ab81fb 100644 --- a/scalpels/client/actions/tracer.py +++ b/scalpels/client/actions/tracer.py @@ -8,7 +8,7 @@ from prettytable import PrettyTable def run(config): tracers = agent_api.get_tracer_list() - t = PrettyTable(["tracer", "tracer template"]) - for tracer, script in tracers.items(): - t.add_row([tracer, script]) + t = PrettyTable(["tracer", "tracer template", "is running"]) + for tr in tracers: + t.add_row([tr["name"],tr["tpl"],tr["running"]]) print t diff --git a/scalpels/client/api.py b/scalpels/client/api.py index cbb2699..6c673b0 100644 --- a/scalpels/client/api.py +++ b/scalpels/client/api.py @@ -57,5 +57,8 @@ class API(object): def get_config(self): return rpcapi.get_config() + def set_tracer_stat(self, tracer, running): + rpcapi.set_tracer_stat(tracer=tracer, running=running) + api = API() diff --git a/scalpels/client/rpcapi.py b/scalpels/client/rpcapi.py index 32af529..0bc9099 100644 --- a/scalpels/client/rpcapi.py +++ b/scalpels/client/rpcapi.py @@ -37,5 +37,8 @@ class RPCAPI(object): def get_config(self, ctxt={}): return self._client.call(ctxt, "get_config") + def set_tracer_stat(self, ctxt={}, tracer=None, running=None): + self._client.cast(ctxt, "set_tracer_stat", tracer=tracer, running=running) + transport = messaging.get_transport(cfg.CONF) rpcapi = RPCAPI(transport) diff --git a/scalpels/cmd/agent.py b/scalpels/cmd/agent.py index 5d0195c..8d7a731 100644 --- a/scalpels/cmd/agent.py +++ b/scalpels/cmd/agent.py @@ -3,9 +3,13 @@ # Author: Kun Huang from scalpels.agents.server import server +from oslo_log import log as logging +from oslo_config import cfg def main(): # TODO handle stop later + logging.register_options(cfg.CONF) + logging.setup(cfg.CONF, "scalpels") server.start() server.wait() diff --git a/scalpels/cmd/tracer.py b/scalpels/cmd/tracer.py index 3da0518..cec092b 100644 --- a/scalpels/cmd/tracer.py +++ b/scalpels/cmd/tracer.py @@ -30,15 +30,16 @@ def read_from_ag(ag): # wrong impl. here, need read from config or db instead config = agent_api.get_config() tracers = agent_api.get_tracer_list() - if ag not in tracers.keys(): - raise ValueError("tracer %s is not found" % ag) - tpl = tracers[ag] - return tpl % config + for tr in tracers: + if tr["name"] == ag: + return tr["tpl"] % config + raise ValueError("tracer %s is not found" % ag) def handle_int(signal, frame): print "[LOG] xxx is interupted" stop_tracer() save_result_to_task() + agent_api.set_tracer_stat(ag, running=False) sys.exit(0) def stop_tracer(): @@ -83,8 +84,11 @@ def main(): worker = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) worker_pid = worker.pid + # this time, we got the pid, so tracer is running + agent_api.set_tracer_stat(ag, running=True) while True: t = worker.stdout.readline() + if not len(t): break _t = (time.time(), t.strip()) diff --git a/scalpels/db/api.py b/scalpels/db/api.py index eee8f24..233be0e 100644 --- a/scalpels/db/api.py +++ b/scalpels/db/api.py @@ -68,3 +68,12 @@ def update_config(data_opts): def get_config(): return IMPL.get_config() + +def tracer_get(tracer): + """ + param tracer: tracer name, like, 'rpc' + """ + return IMPL.tracer_get(tracer) + +def tracer_update(tracer, running): + return IMPL.tracer_update(tracer, running) diff --git a/scalpels/db/sqlalchemy/api.py b/scalpels/db/sqlalchemy/api.py index 919c65c..f00b31d 100644 --- a/scalpels/db/sqlalchemy/api.py +++ b/scalpels/db/sqlalchemy/api.py @@ -139,3 +139,15 @@ def update_config(data_opts): def get_config(): config = model_query(models.Setup).first() return config.config + +def tracer_get(tracer): + tracer = model_query(models.Tracer).filter_by(name=tracer).first() + return tracer + +def tracer_update(tracer_name, running): + session = get_session() + tracer = model_query(models.Tracer, session=session).filter_by(name=tracer_name).first() + tracer.update({"is_running":running}) + tracer.save(session=session) + print "[LOG] %s db update running %s" % (tracer.name, running) + return tracer diff --git a/scalpels/db/sqlalchemy/models.py b/scalpels/db/sqlalchemy/models.py index e5a9416..a30bd14 100644 --- a/scalpels/db/sqlalchemy/models.py +++ b/scalpels/db/sqlalchemy/models.py @@ -7,7 +7,7 @@ import json from sqlalchemy import types as sqa_types from scalpels.db.sqlalchemy import BASE -from sqlalchemy import (Column, Integer, String) +from sqlalchemy import (Column, Integer, String, Boolean) from oslo_db.sqlalchemy import models as oslodbmodels @@ -56,5 +56,4 @@ class Tracer(BASE, ScalpelsBase): id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(20), nullable=False, unique=True) template = Column(String(20), nullable=False) - # yes for running, no for not - status = Column(String(20), default=lambda : "No", nullable=False) + is_running = Column(Boolean(), default=False) diff --git a/tools/init_scalpels.sh b/tools/init_scalpels.sh index 108217a..ccc0ec0 100755 --- a/tools/init_scalpels.sh +++ b/tools/init_scalpels.sh @@ -1,7 +1,7 @@ #!/bin/bash -x # Author: Kun Huang -sca-manage setup -f +sca-manage db-create -f sca-manage setup -d rpcport=5672 -t name=rpc -t tpl="bash %(tracer_path)s/port-input-traffic.sh %(rpcport)s" sca-manage setup -t name=mysql -t tpl="bash %(tracer_path)s/mysql-live.sh" sca-manage setup -t name=rabbit -t tpl="python %(tracer_path)s/rbt-trace.py"