Name Description Size Coverage
__init__.py 0 -
analyze.py The analysis is based on stack frames of the following form: [ { "submit_timeabs": 1788912018146, "build_id": "20260908042139", "client_id": "0013a68f-9893-461a-93d4-2d7a2f85583f", "session_id": "8cd37159-bd5c-481c-99ad-9eace9ea726a", "event_timestamp": 1788907668153, "seq": 4294967297, "context": "Initialization::TemporaryStorage", "source_file": "dom/localstorage/ActorsParent.cpp", "source_line": "1018", "severity": "ERROR", "result": "NS_ERROR_FILE_NOT_FOUND" }, ... ] session_id is the id of the Glean events ping (document_id), see fetch.py. The location of the input file is expected to be found in the last item of the list inside qmexecutions.json. 5312 -
cli.py 729 -
fetch.py The analysis is based on the following query: https://sql.telemetry.mozilla.org/queries/126505/source?p_year=2026&p_month=09&p_day=09&p_build=20260901000000&p_last=0 SELECT UNIX_MILLIS(submission_timestamp) AS submit_timeabs, client_info.app_build AS build_id, COALESCE(legacy_telemetry_client_id, client_id) AS client_id, COALESCE(JSON_VALUE(metrics, '$.uuid.legacy_telemetry_session_id'), document_id) AS session_id, UNIX_MILLIS(event_timestamp) AS event_timestamp, CAST(JSON_VALUE(event_extra, '$.seq') AS INT64) AS seq, JSON_VALUE(event_extra, '$.context') AS context, JSON_VALUE(event_extra, '$.source_file') AS source_file, JSON_VALUE(event_extra, '$.source_line') AS source_line, JSON_VALUE(event_extra, '$.severity') AS severity, JSON_VALUE(event_extra, '$.result') AS result FROM firefox_desktop.events_stream WHERE DATE(submission_timestamp) >= CAST('{{ year }}-{{ month }}-{{ day }}' AS DATE) AND normalized_channel = 'nightly' AND event_category = 'dom.quota.try' AND event_name = 'error_step' AND client_info.app_build >= '{{ build }}' AND UNIX_MILLIS(submission_timestamp) > {{ last }} ORDER BY submit_timeabs LIMIT 600000 We fetch events in chronological order, as we want to keep track of where we already arrived with our analysis. To accomplish this we write our runs into qmexecutions.json. [ { "workdir": ".", "daysback": 1, "numrows": 17377, "lasteventtime": 1617303855145, "rawfile": "./qmrows_until_1617303855145.json" } ] lasteventtime is the highest value of submit_timeabs we found in our data. analyze_qm_failures instead needs the rows to be ordered by client_id, session_id, thread_id, submit_timeabs, seq Thus we sort the rows accordingly before writing them. 4634 -
fetch_fn_names.sh 575 -
fn_anchors.py 2165 -
htmlreport.py body { font-family: sans-serif; margin: 2em; } table { border-collapse: collapse; margin-bottom: 1.5em; } th, td { border: 1px solid #ccc; padding: 0.3em 0.6em; vertical-align: top; } th { background: #eee; text-align: left; } td.num { text-align: right; white-space: nowrap; } td.stack { font-family: monospace; word-break: break-all; } th.sortable { cursor: pointer; } th.sortable::after { content: " \\2195"; color: #999; } th.sortable.asc::after { content: " \\2191"; color: inherit; } th.sortable.desc::after { content: " \\2193"; color: inherit; } 6846 -
logging.py 566 -
report.py Report QM failures to Bugzilla based on stack analysis. 9433 -
stackanalysis.py 13875 -
telemetry.py 1749 -
utils.py 3008 -