Skip to content

Commit 067d5de

Browse files
committed
tracecmd_to_dataframes.py: load a trace.dat into pandas dataframes
1 parent 76f4f8f commit 067d5de

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

python/tracecmd_to_dataframes.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#!/usr/bin/env python2.7
2+
import tracecmd
3+
import pandas as pd
4+
import logging
5+
6+
CAST = {
7+
'long' : int,
8+
'u64' : int,
9+
'int' : int,
10+
'pid_t' : int,
11+
'char[16]' : str,
12+
'__data_loc char[]' : str,
13+
}
14+
15+
def typeof(key, event):
16+
return tracecmd.tep_format_field_type_get(event[str(key)]._field)
17+
18+
def event_to_dict(event):
19+
ret = {
20+
'event' : event.name,
21+
'timestamp' : event.ts,
22+
'cpu' : event.cpu,
23+
'common_comm' : event.comm,
24+
}
25+
ret.update({
26+
common:event.num_field(common)
27+
for common in [
28+
# "common_type", # TODO: store this instead of name?
29+
"common_flags",
30+
"common_preempt_count",
31+
"common_pid",
32+
]
33+
})
34+
ret.update({
35+
key:CAST[typeof(key,event)](event[str(key)])
36+
for key in event.keys()
37+
})
38+
return ret
39+
40+
def main(trace_path, df_path):
41+
df = DataFrames_from(trace_path)
42+
for k in df:
43+
print(df[k])
44+
DataFrames_to(df, df_path)
45+
46+
def DataFrames_to(df, df_path):
47+
# TODO
48+
pass
49+
50+
def DataFrames_from(trace_path):
51+
df = {
52+
# event : pd.DataFrame()
53+
}
54+
datadict = DataDict_from(trace_path)
55+
logging.info('%s contains %d types of events' % (
56+
trace_path, len(datadict)))
57+
# TODO: in parallel
58+
for event in datadict:
59+
logging.info('Building DataFrame of event %s' % event)
60+
df[event] = pd.DataFrame(datadict[event])
61+
df[event].set_index('timestamp', inplace=True)
62+
df[event].sort_index(inplace=True, ascending=True)
63+
return df
64+
65+
def DataDict_from(trace_path):
66+
datadict = {
67+
# name : [e where e.event==name]
68+
}
69+
trace = tracecmd.Trace(trace_path)
70+
# TODO: in parallel
71+
for cpu in range(trace.cpus):
72+
logging.info('Reading events of cpu %d' % cpu)
73+
event = trace.read_event(cpu)
74+
while event:
75+
event = event_to_dict(event)
76+
datadict.setdefault(event['event'],[]).append(event)
77+
event = trace.read_event(cpu)
78+
return datadict
79+
80+
if __name__ == '__main__':
81+
import sys
82+
# trace_path = sys.argv
83+
logging.basicConfig(level=logging.DEBUG)
84+
main("trace.dat","trace.pandas")

0 commit comments

Comments
 (0)