summaryrefslogtreecommitdiffstats
path: root/testing/talos/talos/xtalos/parse_xperf.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/talos/talos/xtalos/parse_xperf.py')
-rw-r--r--testing/talos/talos/xtalos/parse_xperf.py127
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()