diff options
Diffstat (limited to 'testing/talos/talos/xtalos/parse_xperf.py')
-rw-r--r-- | testing/talos/talos/xtalos/parse_xperf.py | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/testing/talos/talos/xtalos/parse_xperf.py b/testing/talos/talos/xtalos/parse_xperf.py new file mode 100644 index 0000000000..8daff86d6b --- /dev/null +++ b/testing/talos/talos/xtalos/parse_xperf.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +import os +import subprocess +import sys + +import etlparser +import xtalos +from xperf_analyzer import ( + ProcessStart, + SessionStoreWindowRestored, + XPerfAttribute, + XPerfFile, + XPerfInterval, +) + + +def run_session_restore_analysis(debug=False, **kwargs): + required = ("csv_filename", "outputFile") + for r in required: + if r not in kwargs: + raise xtalos.XTalosError("%s required" % r) + + final_output_file = "%s_session_restore_stats%s" % os.path.splitext( + kwargs["outputFile"] + ) + + output = "time_to_session_store_window_restored_ms\n" + + with XPerfFile(csvfile=kwargs["csv_filename"], debug=debug) as xperf: + fx_start = ProcessStart("firefox.exe") + ss_window_restored = SessionStoreWindowRestored() + + interval = XPerfInterval(fx_start, ss_window_restored) + xperf.add_attr(interval) + + xperf.analyze() + + results = interval.get_results() + if results != {}: + output += "%.3f\n" % (results[XPerfAttribute.RESULT]) + + with open(final_output_file, "w") as out: + out.write(output) + + if debug: + etlparser.uploadFile(final_output_file) + + +def stop(xperf_path, debug=False): + xperf_cmd = [xperf_path, "-stop", "-stop", "talos_ses"] + if debug: + print("executing '%s'" % subprocess.list2cmdline(xperf_cmd)) + subprocess.call(xperf_cmd) + + +def stop_from_config(config_file=None, debug=False, **kwargs): + """start from a YAML config file""" + + # required options and associated error messages + required = { + "xperf_path": "xperf_path not given", + "etl_filename": "No etl_filename given", + } + for key in required: + if key not in kwargs: + kwargs[key] = None + + if config_file: + # override options from YAML config file + kwargs = xtalos.options_from_config(kwargs, config_file) + + # ensure the required options are given + for key, msg in required.items(): + if not kwargs.get(key): + raise xtalos.XTalosError(msg) + + # ensure path to xperf actually exists + if not os.path.exists(kwargs["xperf_path"]): + raise xtalos.XTalosError( + "ERROR: xperf_path '%s' does not exist" % kwargs["xperf_path"] + ) + + # make calling arguments + stopargs = {} + stopargs["xperf_path"] = kwargs["xperf_path"] + stopargs["debug"] = debug + + # call start + stop(**stopargs) + + etlparser.etlparser_from_config( + config_file, + approot=kwargs["approot"], + error_filename=kwargs["error_filename"], + processID=kwargs["processID"], + ) + + csv_base = "%s.csv" % kwargs["etl_filename"] + run_session_restore_analysis(csv_filename=csv_base, debug=debug, **kwargs) + + if not debug: + os.remove(csv_base) + + +def main(args=sys.argv[1:]): + + # parse command line arguments + parser = xtalos.XtalosOptions() + args = parser.parse_args(args) + + # stop xperf + try: + stop_from_config( + config_file=args.configFile, + debug=args.debug_level >= xtalos.DEBUG_INFO, + **args.__dict__ + ) + except xtalos.XTalosError as e: + parser.error(str(e)) + + +if __name__ == "__main__": + main() |