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(',')
# convert min/max args from µs to ns, if needed
if hasattr(args, 'min') and args.min is not None:
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',
+ help='Optional, list of event field names used to match '
+ 'period markers (default: cpu_id)')
ap.add_argument('-V', '--version', action='version',
version='LTTng Analyses v' + __version__)
self.refresh_period = None
self.period_begin_ev_name = None
self.period_end_ev_name = None
+ self.period_key_fields = None
self.begin_ts = None
self.end_ts = None
self.min_duration = None
raise NotImplementedError()
def end(self):
- self._end_period()
+ if self._period_start_ts:
+ self._end_period()
def register_notification_cbs(self, cbs):
for name in cbs:
period_key = self._get_period_event_key(ev)
if not period_key:
- # There was an error caused by missing context, ignore
+ # There was an error caused by a missing field, ignore
# this period event
return
self._end_period()
self._period_key = period_key
self._period_start_ts = ev.timestamp
- else:
+ elif ev.name == self._conf.period_begin_ev_name:
self._period_key = period_key
self._period_start_ts = ev.timestamp
pass
def _get_period_event_key(self, ev):
- # TODO: currently the key is hardcoded to the vtid of the
- # thread which generated the event, but eventually there
- # should be the option for a user to specify what fields
- # (context or payload) make up the key.
- try:
- key = ev.vtid
- except AttributeError:
- # TODO warn user of missing context?
- key = None
-
- return key
+ if not self._conf.period_key_fields:
+ return None
+
+ key_values = []
+
+ for field in self._conf.period_key_fields:
+ try:
+ key_values.append(ev[field])
+ except KeyError:
+ # Error: missing field
+ return None
+
+ return tuple(key_values)