23 from graphviz
import Digraph
24 from req_utils
import *
30 schema = [(
"s3_request_id",
"s3_request_id",
"client_id",
"s3_request_to_client",
"C")]
35 def get_timelines_ioo(client_id: str, grange: int, client_pid: int, create_attr_graph: bool,
36 export_only: bool, ext_graph: Digraph):
37 return ior.get_timelines(client_id, grange, client_pid, create_attr_graph,
38 export_only, ext_graph,
False)
40 def get_timelines_cob(client_id: str, grange: int, client_pid: int, create_attr_graph: bool,
41 export_only: bool, ext_graph: Digraph):
42 return ior.get_timelines(client_id, grange, client_pid, create_attr_graph,
43 export_only, ext_graph,
True)
45 def get_timelines(s3reqs: List[str], pid: str, create_attr_graph: bool =
False, verbose: bool =
False):
46 get_timelines_fns = [mdr.get_timelines, get_timelines_ioo, get_timelines_cob]
52 s3_req_rel_d = s3_request_uid.select().where(s3_request_uid.uuid == s3id)
54 s3_req_rel_d = s3_request_uid.select().where(s3_request_uid.id == s3id)
57 s3_req_rel_d =
filter(
lambda x: x.pid == pid, s3_req_rel_d)
59 for s3_req_rel
in s3_req_rel_d:
60 s3_req_d =
query2dlist(s3_request_state.select().where(
61 (s3_request_state.id == s3_req_rel.id) &
62 (s3_request_state.pid == s3_req_rel.pid)))
64 r[
'op'] = s3_req_rel.uuid
66 time_table.append(s3_req_d)
68 s3_to_client_d =
query2dlist(s3_request_to_client.select().where(
69 (s3_request_to_client.s3_request_id == s3_req_rel.id) &
70 (s3_request_to_client.pid == s3_req_rel.pid)))
72 s3_to_client_d.sort(key=
lambda s3rc: s3rc[
'client_id'])
74 print(
"Processing S3 request {} (id {}, pid {}), client requests: " 75 .
format(s3_req_rel.uuid, s3_req_rel.id, s3_req_rel.pid), end=
'')
77 for s3c
in s3_to_client_d:
78 cids_str +=
"{}, ".
format(s3c[
'client_id'])
83 select client_req.*, 'client[' || ifnull(cob.op, '') || ifnull(dix.op, '') || ifnull(ioo.op, '') || '] ' || client_req.id as 'op' from 84 client_req LEFT JOIN (select 'cob' as 'op', client_id, pid from client_to_cob) as cob ON cob.client_id = client_req.id AND cob.pid = client_req.pid 85 LEFT JOIN (select 'dix' as 'op', client_id, pid from client_to_dix) as dix ON dix.client_id = client_req.id AND dix.pid = client_req.pid 86 LEFT JOIN (select 'ioo' as 'op', client_id, pid from client_to_ioo) as ioo ON ioo.client_id = client_req.id AND ioo.pid = client_req.pid 87 WHERE client_req.id = {clvid} and client_req.pid = {clvpid}; 89 for s3c
in s3_to_client_d:
90 clvreq = sql_tmpl.format(clvid=s3c[
'client_id'], clvpid=s3c[
'pid'])
91 lbls = [
"time",
"pid",
"id",
"state",
"op"]
92 clov_req_d =
list(map(
lambda tpl: dict(zip(lbls, tpl)),
93 DB.execute_sql(clvreq).fetchall()))
94 time_table.append(clov_req_d)
98 attr_graph = Digraph(strict=
True, format=
'png', node_attr = {
'shape':
'plaintext'})
99 relations = [dict(s3_request_id = s3_req_rel.id, cli_pid = s3_req_rel.pid, srv_pid =
None)]
102 for s3c
in s3_to_client_d:
107 print(
"Processing client request {} (pid {})...".
format(s3c[
'client_id'], s3c[
'pid']))
109 while not found
and i < len(get_timelines_fns):
111 ext_tml, _, _, _, _ = get_timelines_fns[i](s3c[
'client_id'], [0, 0], s3c[
'pid'],
112 create_attr_graph,
True, attr_graph)
119 time_table += ext_tml
123 print(
"Could not build timelines for client request {} (pid: {})".
format(s3c[
'client_id'], s3c[
'pid']))
125 if create_attr_graph:
126 attr_graph.render(filename=
's3_graph_{}'.
format(s3_req_rel.uuid))
131 parser = argparse.ArgumentParser(description=
"draws s3 request timeline")
132 parser.add_argument(
'--s3reqs', nargs=
'+', type=str, required=
True,
133 help=
"requests ids to draw")
134 parser.add_argument(
"-p",
"--pid", type=int, required=
False, default=
None,
135 help=
"Client pid to get requests for")
136 parser.add_argument(
'--db', type=str, required=
False, default=
"m0play.db",
137 help=
"input database file")
138 parser.add_argument(
"-a",
"--attr", action=
'store_true', help=
"Create attributes graph")
139 parser.add_argument(
"-m",
"--maximize", action=
'store_true', help=
"Display in maximised window")
140 parser.add_argument(
"-u",
"--time-unit", choices=[
'ms',
'us'], default=
'us',
141 help=
"Default time unit")
142 parser.add_argument(
"-v",
"--verbose", action=
'store_true',
143 help=
"Display detailed request structure")
144 parser.add_argument(
"-i",
"--index", action=
'store_true',
145 help=
"Create indexes before processing")
147 return parser.parse_args()
150 index_query =
"CREATE INDEX {} ON {} ({});" 151 tbl_name = tbl_model.__name__
152 tbl_fields =
filter(
lambda nm: ((
"id" in nm)
or (
"time" in nm))
and "__" not in nm,
153 tbl_model.__dict__.keys())
155 iq = index_query.format(f
"idx_{tbl_name}_{f}", tbl_name, f)
162 for tbl
in db_create_delete_tables:
165 if __name__ ==
'__main__':
179 print(
"Plotting timelines...")
181 draw_timelines(time_table,
None, 0,
None, args.time_unit,
False, args.maximize)
static struct m0_list list
def prepare_time_table(time_table)
static M0_UNUSED void print(struct m0_be_list *list)
def create_table_index(tbl_model)