Ok, I realized what you have made to fix things.

The fix actually deserved a commit of its own, and that's what I've made:

https://github.com/autotest/autotest/commit/982ca304bf1939d377a5e66e4beccd7571654bb2
https://github.com/autotest/autotest/commit/bbcface6ebdd8f862505e851282bd6c4f178ffba

The systemtap profiler is back to next, and I guess it should all be
fine now, thanks!

On Wed, Oct 24, 2012 at 10:40 PM, Yunping Zheng <[email protected]> wrote:
> hi lucas
>
> yes, i have fix this error.
>
> On Wed, 2012-10-24 at 08:50 -0200, Lucas Meneghel Rodrigues wrote:
>
> On 10/24/2012 07:05 AM, [email protected] wrote:
>> From: Yunping Zheng <[email protected]>
>>
>> This patch adds a systemtap profiler to autotest. Now systemtap
>> can run during your test, providing useful debug data.
>>
>> When you use this profiler on virt tests, you should add
>>      'profilers = systemtap'
>> and
>>      'stap_script_file = file_path_systemtap_script'
>>
>> On your test cfg file. If the 'file_path_systemtap_script' you
>> assigned is a relative path,the script will try to find the file
>> under 'test.autodir/profilers/systemtap/scripts'.
>>
>> Before using this patch make sure you host is support "stap",you can
>> run  "stap -e 'probe begin { log(\"Support\") exit() }'" to have a
>> check, if you host not suppor stap,please install systemtap and
>> related packages.
>
> Hey Yunping, I remember the first version of this patch brought problems
> on next testing, it was breaking running the virttests from autotest. Do
> you remember that, and if so, have you fixed that problem?
>
>> 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
>>
>>
>>
>
>
>
> _______________________________________________
> Autotest-kernel mailing list
> [email protected]
> https://www.redhat.com/mailman/listinfo/autotest-kernel



-- 
Lucas

_______________________________________________
Autotest-kernel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/autotest-kernel

Reply via email to