| __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 |
- |