Signed-off-by: Yunping Zheng <[email protected]>
---
client/profilers/catprofile/catprofile.py | 2 +-
client/profilers/cmdprofile/cmdprofile.py | 2 +-
client/profilers/cpistat/cpistat.py | 2 +-
client/profilers/iostat/iostat.py | 2 +-
client/profilers/kvm_modload/kvm_modload.py | 2 +-
client/profilers/kvm_stat/kvm_stat.py | 2 +-
client/profilers/lockmeter/lockmeter.py | 2 +-
client/profilers/mpstat/mpstat.py | 2 +-
client/profilers/oprofile/oprofile.py | 2 +-
client/profilers/perf/perf.py | 2 +-
client/profilers/readprofile/readprofile.py | 2 +-
client/profilers/sar/sar.py | 2 +-
client/profilers/systemtap/control | 5 ++
client/profilers/systemtap/src/.version | 2 +
client/profilers/systemtap/systemtap.py | 82 +++++++++++++++++++++++++++++
client/profilers/vmstat/vmstat.py | 2 +-
16 files changed, 102 insertions(+), 13 deletions(-)
create mode 100644 client/profilers/systemtap/__init__.py
create mode 100644 client/profilers/systemtap/control
create mode 100644 client/profilers/systemtap/src/.version
create mode 100644 client/profilers/systemtap/systemtap.py
diff --git a/client/profilers/catprofile/catprofile.py
b/client/profilers/catprofile/catprofile.py
index b854782..5b8464d 100644
--- a/client/profilers/catprofile/catprofile.py
+++ b/client/profilers/catprofile/catprofile.py
@@ -13,7 +13,7 @@ class catprofile(profiler.profiler):
# filenames: list of filenames to cat
def initialize(self, filenames = ['/proc/meminfo', '/proc/slabinfo'],
- outfile = 'monitor', interval = 1):
+ outfile = 'monitor', interval = 1, **dargs):
self.filenames = filenames
self.outfile = outfile
self.interval = interval
diff --git a/client/profilers/cmdprofile/cmdprofile.py
b/client/profilers/cmdprofile/cmdprofile.py
index c4c6c5a..66e7fde 100644
--- a/client/profilers/cmdprofile/cmdprofile.py
+++ b/client/profilers/cmdprofile/cmdprofile.py
@@ -13,7 +13,7 @@ class cmdprofile(profiler.profiler):
def initialize(self, cmds=['ps'], interval=60, outputfile='cmdprofile',
- outputfiles=None):
+ outputfiles=None, **dargs):
# do some basic sanity checking on the parameters
if not outputfiles and not outputfile:
diff --git a/client/profilers/cpistat/cpistat.py
b/client/profilers/cpistat/cpistat.py
index 8506958..b24e761 100644
--- a/client/profilers/cpistat/cpistat.py
+++ b/client/profilers/cpistat/cpistat.py
@@ -10,7 +10,7 @@ from autotest.client import profiler
class cpistat(profiler.profiler):
version = 1
- def initialize(self, interval = 1):
+ def initialize(self, interval = 1, **dargs):
self.interval = interval
diff --git a/client/profilers/iostat/iostat.py
b/client/profilers/iostat/iostat.py
index b3ebbbc..2a8a7dc 100644
--- a/client/profilers/iostat/iostat.py
+++ b/client/profilers/iostat/iostat.py
@@ -9,7 +9,7 @@ from autotest.client.shared import utils, error
class iostat(profiler.profiler):
version = 2
- def initialize(self, interval = 1, options = ''):
+ def initialize(self, interval = 1, options = '', **dargs):
# Usage: iostat [ options... ] [ <interval> [ <count> ] ]
# e.g, iostat -tmx 2
self.interval = interval
diff --git a/client/profilers/kvm_modload/kvm_modload.py
b/client/profilers/kvm_modload/kvm_modload.py
index 1b9747e..fd234cd 100644
--- a/client/profilers/kvm_modload/kvm_modload.py
+++ b/client/profilers/kvm_modload/kvm_modload.py
@@ -14,7 +14,7 @@ class kvm_modload(profiler.profiler):
version = 4
- def initialize(self, interval=None, options=None):
+ def initialize(self, interval=None, options=None, **dargs):
pass
diff --git a/client/profilers/kvm_stat/kvm_stat.py
b/client/profilers/kvm_stat/kvm_stat.py
index f4d2fa5..ef34e95 100644
--- a/client/profilers/kvm_stat/kvm_stat.py
+++ b/client/profilers/kvm_stat/kvm_stat.py
@@ -17,7 +17,7 @@ class kvm_stat(profiler.profiler):
test execution, redirecting its output to a file on the profile dir.
"""
version = 1
- def initialize(self):
+ def initialize(self, **drags):
"""
Gets path of kvm_stat and verifies if debugfs needs to be mounted.
"""
diff --git a/client/profilers/lockmeter/lockmeter.py
b/client/profilers/lockmeter/lockmeter.py
index 7d774f9..07c5171 100644
--- a/client/profilers/lockmeter/lockmeter.py
+++ b/client/profilers/lockmeter/lockmeter.py
@@ -29,7 +29,7 @@ class lockmeter(profiler.profiler):
self.cmd = self.srcdir + '/lockstat'
- def initialize(self):
+ def initialize(self, **dargs):
self.job.require_gcc()
if not os.path.exists('/proc/lockmeter'):
diff --git a/client/profilers/mpstat/mpstat.py
b/client/profilers/mpstat/mpstat.py
index 1c8a2a0..8fcbcc2 100644
--- a/client/profilers/mpstat/mpstat.py
+++ b/client/profilers/mpstat/mpstat.py
@@ -9,7 +9,7 @@ class mpstat(profiler.profiler):
version = 1
- def initialize(self, interval = 1):
+ def initialize(self, interval = 1, **dargs):
self.interval = interval
diff --git a/client/profilers/oprofile/oprofile.py
b/client/profilers/oprofile/oprofile.py
index 0022fa5..f5dae4b 100644
--- a/client/profilers/oprofile/oprofile.py
+++ b/client/profilers/oprofile/oprofile.py
@@ -95,7 +95,7 @@ class oprofile(profiler.profiler):
self._setup_oprofile()
- def initialize(self, vmlinux=None, events=[], others=None, local=None):
+ def initialize(self, vmlinux=None, events=[], others=None, local=None,
**dargs):
self.job.require_gcc()
if not vmlinux:
diff --git a/client/profilers/perf/perf.py b/client/profilers/perf/perf.py
index 21f7bd6..c3dc737 100644
--- a/client/profilers/perf/perf.py
+++ b/client/profilers/perf/perf.py
@@ -13,7 +13,7 @@ from autotest.client import profiler, os_dep, utils
class perf(profiler.profiler):
version = 1
- def initialize(self, events=["cycles","instructions"], trace=False):
+ def initialize(self, events=["cycles","instructions"], trace=False,
**dargs):
if type(events) == str:
self.events = [events]
else:
diff --git a/client/profilers/readprofile/readprofile.py
b/client/profilers/readprofile/readprofile.py
index 255d90a..c5caa4a 100644
--- a/client/profilers/readprofile/readprofile.py
+++ b/client/profilers/readprofile/readprofile.py
@@ -26,7 +26,7 @@ class readprofile(profiler.profiler):
utils.make('readprofile')
- def initialize(self):
+ def initialize(self, **dargs):
self.job.require_gcc()
try:
diff --git a/client/profilers/sar/sar.py b/client/profilers/sar/sar.py
index ce4d0ff..3d8578b 100644
--- a/client/profilers/sar/sar.py
+++ b/client/profilers/sar/sar.py
@@ -17,7 +17,7 @@ class sar(profiler.profiler):
"""
version = 1
- def initialize(self, interval=1):
+ def initialize(self, interval=1, **dargs):
"""
Set sar interval and verify what flags the installed sar supports.
diff --git a/client/profilers/systemtap/__init__.py
b/client/profilers/systemtap/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/client/profilers/systemtap/control
b/client/profilers/systemtap/control
new file mode 100644
index 0000000..bf600d2
--- /dev/null
+++ b/client/profilers/systemtap/control
@@ -0,0 +1,5 @@
+# You must provide a path to a systemtap script
+st_script = '/usr/share/systemtap/tapset/timestamp.stp'
+job.profilers.add('systemtap', stap_script_file=st_script)
+job.run_test('sleeptest', seconds=5)
+job.profilers.delete('systemtap')
diff --git a/client/profilers/systemtap/src/.version
b/client/profilers/systemtap/src/.version
new file mode 100644
index 0000000..569369f
--- /dev/null
+++ b/client/profilers/systemtap/src/.version
@@ -0,0 +1,2 @@
+I1
+.
\ No newline at end of file
diff --git a/client/profilers/systemtap/systemtap.py
b/client/profilers/systemtap/systemtap.py
new file mode 100644
index 0000000..ce5e4d8
--- /dev/null
+++ b/client/profilers/systemtap/systemtap.py
@@ -0,0 +1,82 @@
+"""
+Autotest systemtap profiler.
+"""
+import logging, os, re, subprocess
+from autotest.client import profiler, os_dep
+from autotest.client.shared import utils, error
+
+
+class systemtap(profiler.profiler):
+ """
+ Tracing test process using systemtap tools.
+ """
+ version = 1
+
+ def initialize(self, **dargs):
+ self.is_enabled = False
+
+ stap_installed = False
+ try:
+ self.stap_path = os_dep.command('stap')
+ stap_installed = True
+ except ValueError:
+ logging.error('Command stap not present')
+
+ if stap_installed:
+ self.is_enabled = True
+ self.script_name = dargs.get('stap_script_file')
+ stap_support_cmd = "stap -e 'probe begin { log(\"Support\") exit()
}'"
+ if not re.findall("Support",
utils.system_output(stap_support_cmd)):
+ logging.warning("Seems your host does not support systemtap")
+ self.is_enabled = False
+ if not self.script_name:
+ logging.warning("You should assign a script file")
+ self.is_enabled = False
+
+
+ def _get_stap_script_name(self, test):
+ try:
+ if os.path.isabs(self.script_name):
+ return self.script_name
+ else:
+ return os.path.join(test.autodir,
"profilers/systemtap/scripts", self.script_name)
+ except AttributeError:
+ return self.script_name
+
+
+ def start(self, test):
+ if self.is_enabled:
+ stap_script = self._get_stap_script_name(test)
+ if os.path.isfile(stap_script):
+ cmd = "stap %s" % (stap_script)
+ logfile = open(os.path.join(test.profdir, "systemtap.log"),
'w')
+ p = subprocess.Popen(cmd, shell=True, stdout=logfile,
+ stderr=subprocess.STDOUT)
+ self.pid = p.pid
+ else:
+ logging.warning("Asked for systemtap profiling, but no script "
+ "file %s not found", stap_script)
+ self.is_enabled = False
+ else:
+ logging.warning("Asked for systemtap profiling, but it couldn't "
+ "be initialized")
+
+
+ def stop(self, test):
+ if self.is_enabled:
+ try:
+ term_profiler = "kill -15 %d" % self.pid
+ # send SIGTERM to iostat and give it a 5-sec timeout
+ utils.system(term_profiler, timeout=5)
+ except error.CmdError: # probably times out
+ pass
+ # do a ps again to see if iostat is still there
+ ps_cmd = "ps -p %d | grep stap" % self.pid
+ out = utils.system_output(ps_cmd, ignore_status=True)
+ if out != '':
+ kill_profiler = 'kill -9 %d' % self.pid
+ utils.system(kill_profiler, ignore_status=True)
+
+
+ def report(self, test):
+ return None
diff --git a/client/profilers/vmstat/vmstat.py
b/client/profilers/vmstat/vmstat.py
index 6195032..6cc174c 100644
--- a/client/profilers/vmstat/vmstat.py
+++ b/client/profilers/vmstat/vmstat.py
@@ -11,7 +11,7 @@ from autotest.client import profiler
class vmstat(profiler.profiler):
version = 1
- def initialize(self, interval = 1):
+ def initialize(self, interval = 1, **dargs):
self.interval = interval