import termcolor
msg = termcolor.colored(msg, 'red', attrs=['bold'])
- except:
+ except ImportError:
pass
print(msg, file=sys.stderr)
self._analysis_conf.refresh_period = refresh_period_ns
self._analysis_conf.period_begin_ev_name = args.period_begin
self._analysis_conf.period_end_ev_name = args.period_end
- self._analysis_conf.period_key_fields = args.period_key.split(',')
+ self._analysis_conf.period_begin_key_fields = \
+ args.period_begin_key.split(',')
+
+ if args.period_end_key:
+ self._analysis_conf.period_end_key_fields = \
+ args.period_end_key.split(',')
+ else:
+ self._analysis_conf.period_end_key_fields = \
+ self._analysis_conf.period_begin_key_fields
+
+ if args.period_key_value:
+ self._analysis_conf.period_key_value = \
+ tuple(args.period_key_value.split(','))
+
if args.cpu:
self._analysis_conf.cpu_list = args.cpu.split(',')
self._analysis_conf.cpu_list = [int(cpu) for cpu in
ap.add_argument('--period-end', type=str,
help='Analysis period end marker event name '
'(requires --period-begin)')
- ap.add_argument('--period-key', type=str, default='cpu_id',
+ ap.add_argument('--period-begin-key', type=str, default='cpu_id',
help='Optional, list of event field names used to '
'match period markers (default: cpu_id)')
+ ap.add_argument('--period-end-key', type=str,
+ help='Optional, list of event field names used to '
+ 'match period marker. If none specified, use the same '
+ ' --period-begin-key')
+ ap.add_argument('--period-key-value', type=str,
+ help='Optional, define a fixed key value to which a'
+ ' period must correspond to be considered.')
ap.add_argument('--cpu', type=str,
help='Filter the results only for this list of '
'CPU IDs')
self.refresh_period = None
self.period_begin_ev_name = None
self.period_end_ev_name = None
- self.period_key_fields = None
+ self.period_begin_key_fields = None
+ self.period_end_key_fields = None
+ self.period_key_value = None
self.begin_ts = None
self.end_ts = None
self.min_duration = None
ev.name != self._conf.period_end_ev_name:
return
- period_key = self._get_period_event_key(ev)
- if not period_key:
- # There was an error caused by a missing field, ignore
- # this period event
- return
-
if self._period_key:
+ period_key = Analysis._get_period_event_key(
+ ev, self._conf.period_end_key_fields)
+
+ if not period_key:
+ # There was an error caused by a missing field, ignore
+ # this period event
+ return
+
if period_key == self._period_key:
if self._conf.period_end_ev_name:
if ev.name == self._conf.period_end_ev_name:
self._end_period()
self._begin_period(period_key, ev.timestamp)
elif ev.name == self._conf.period_begin_ev_name:
+ period_key = Analysis._get_period_event_key(
+ ev, self._conf.period_begin_key_fields)
+
+ if not period_key:
+ return
+
+ if self._conf.period_key_value:
+ # Must convert the period key to string for comparison
+ str_period_key = tuple(map(str, period_key))
+ if self._conf.period_key_value != str_period_key:
+ return
+
self._begin_period(period_key, ev.timestamp)
def _begin_period(self, period_key, timestamp):
def _end_period_cb(self):
pass
- def _get_period_event_key(self, ev):
- if not self._conf.period_key_fields:
+ @staticmethod
+ def _get_period_event_key(ev, key_fields):
+ if not key_fields:
return None
key_values = []
- for field in self._conf.period_key_fields:
+ for field in key_fields:
try:
key_values.append(ev[field])
except KeyError: