Source code

Revision control

Copy as Markdown

Other Tools

#!/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()