Add support for different period begin/end keys, constant keys
authorAntoine Busque <abusque@efficios.com>
Fri, 4 Dec 2015 11:39:45 +0000 (06:39 -0500)
committerAntoine Busque <abusque@efficios.com>
Fri, 4 Dec 2015 11:46:01 +0000 (06:46 -0500)
This allows using differently named fields as a period key for begin
and end events. For instance, comparing the `tid` field from a
`sched_waking` event to that of `next_tid` in `sched_switch`.

This also adds support for constant or fixed key value. That is to
say, with the same TID example, one can specify a particular TID
value, and only periods for which the key matches this value will be
accounted for.

In both new features, the order of fields and values must be
consistent across all arguments for multi-field keys.

Signed-off-by: Antoine Busque <abusque@efficios.com>
lttnganalyses/cli/command.py
lttnganalyses/core/analysis.py

index b8226bce01ddd5d448ed8b1ca29549d8c8c9f643..8aa0b1b8093f60acd1410957f47f4843f70a3ba3 100644 (file)
@@ -76,7 +76,7 @@ class Command:
             import termcolor
 
             msg = termcolor.colored(msg, 'red', attrs=['bold'])
-        except:
+        except ImportError:
             pass
 
         print(msg, file=sys.stderr)
@@ -250,7 +250,20 @@ class Command:
         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
@@ -323,9 +336,16 @@ class Command:
         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')
index 3b1dd30150fd001f8f99c85e84990c92dac84ea4..ada9b67a0997185dcf583d0cb7d5e6063003468f 100644 (file)
@@ -26,7 +26,9 @@ class AnalysisConfig:
         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
@@ -131,13 +133,15 @@ class Analysis:
            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:
@@ -148,6 +152,18 @@ class Analysis:
                     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):
@@ -164,13 +180,14 @@ class Analysis:
     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:
This page took 0.028758 seconds and 5 git commands to generate.