<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Will's Blog (Posts about mozilla)</title><link>https://bluesock.org/~willkg/blog/</link><description></description><atom:link href="https://bluesock.org/~willkg/blog/tag/mozilla.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2025 &lt;a href="mailto:willkg@bluesock.org"&gt;Will Kahn-Greene&lt;/a&gt; CC BY-SA 3.0</copyright><lastBuildDate>Tue, 28 Oct 2025 18:03:12 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Open Source Project Maintenance 2025</title><link>https://bluesock.org/~willkg/blog/dev/maintenance_2025.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;div&gt;&lt;p&gt;Every October, I do a maintenance pass on all my projects. At a minimum, that
involves dropping support for whatever Python version is no longer supported
and adding support for the most recently released Python version. While doing
that, I go through the issue tracker, answer questions, and fix whatever I can
fix. Then I release new versions. Then I think about which projects I should
deprecate and figure out a deprecation plan for them.&lt;/p&gt;
&lt;p&gt;This post covers the 2025 round.&lt;/p&gt;
&lt;p&gt;TL;DR&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/sphinx-js/"&gt;sphinx-js&lt;/a&gt; -- transferred to
&lt;a class="reference external" href="https://github.com/pyodide"&gt;pyodide organization&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/crashstats-tools/"&gt;crashstats-tools&lt;/a&gt; and
&lt;a class="reference external" href="https://pypi.org/project/siggen/"&gt;siggen&lt;/a&gt; -- transferred to the Mozilla
crash ingestion team, which I'm no longer on&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/paul-mclendahand/"&gt;paul-mclendahand&lt;/a&gt; -- deprecated and archived&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/willkg/pip-stale/"&gt;pip-stale&lt;/a&gt; -- deprecated and archived&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/everett/"&gt;everett&lt;/a&gt; -- released v3.5.0, then deprecated and archived&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/fillmore/"&gt;fillmore&lt;/a&gt; -- released v2.2.0, then deprecated and archived&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/kent/"&gt;kent&lt;/a&gt; -- released v2.2.0&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/markus/"&gt;markus&lt;/a&gt; -- released v5.2.0&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/bleach/"&gt;bleach&lt;/a&gt; -- released v6.3.0&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/dev/maintenance_2025.html"&gt;Read more…&lt;/a&gt; (7 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>bleach</category><category>dev</category><category>everett</category><category>fillmore</category><category>kent</category><category>markus</category><category>mozilla</category><category>python</category><category>work</category><guid>https://bluesock.org/~willkg/blog/dev/maintenance_2025.html</guid><pubDate>Tue, 28 Oct 2025 14:00:00 GMT</pubDate></item><item><title>crashstats-tools v2.0.0 released!</title><link>https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;section id="what-is-it"&gt;
&lt;h2&gt;What is it?&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/willkg/crashstats-tools/"&gt;crashstats-tools&lt;/a&gt; is a set of
command-line tools for working with Crash Stats
(&lt;a class="reference external" href="https://crash-stats.mozilla.org/"&gt;https://crash-stats.mozilla.org/&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;crashstats-tools comes with four commands:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;supersearch: for performing Crash Stats Super Search queries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;supersearchfacet: for performing aggregations, histograms, and cardinality
Crash Stats Super Search queries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fetch-data: for fetching raw crash, dumps, and processed crash data for
specified crash ids&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reprocess: for sending crash report reprocess requests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="v2-0-0-released"&gt;
&lt;h2&gt;v2.0.0 released!&lt;/h2&gt;
&lt;p&gt;There have been a lot of improvements since the last blog post for the v1.0.1
release. New commands, new features, improved cli ui, etc.&lt;/p&gt;
&lt;p&gt;v2.0.0 focused on two major things:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;improving &lt;code class="docutils literal"&gt;supersearchfacet&lt;/code&gt; to support nested aggregation, histogram, and
cardinality queries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;moving some of the code into a &lt;code class="docutils literal"&gt;crashstats_tools.libcrashstats&lt;/code&gt; module
improving its use as a library&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="improved-supersearchfacet"&gt;
&lt;h2&gt;Improved supersearchfacet&lt;/h2&gt;
&lt;p&gt;The other day, &lt;a class="reference external" href="https://hacks.mozilla.org/2024/04/porting-a-cross-platform-gui-application-to-rust/"&gt;Alex and team finished up the crash reporter Rust rewrite&lt;/a&gt;.
The crash reporter rewrite landed and is available in Firefox, nightly channel,
where &lt;code class="docutils literal"&gt;build_id &amp;gt;= 20240321093532&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The crash reporter is one of the clients that submits crash reports to Socorro
which is now maintained by the Observability Team. Firefox has multiple crash
reporter clients and there are many ways that crash reports can get submitted
to Socorro.&lt;/p&gt;
&lt;p&gt;One of the changes we can see in the crash report data now is the change in
&lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;User-Agent&lt;/span&gt;&lt;/code&gt; header. The new rewritten crash reporter sends a header of
&lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;crash-reporter/1.0.0&lt;/span&gt;&lt;/code&gt;. That gets captured by the collector and put in the
raw crash &lt;code class="docutils literal"&gt;metadata.user_agent&lt;/code&gt; field. It doesn't get indexed, so we can't
search on it directly.&lt;/p&gt;
&lt;p&gt;We can get a sampling of the last 100 crash reports, download the raw crash
data, and look at the user agents.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code bash"&gt;&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-1" name="rest_code_d711066d2e8c419896eedffda462c165-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;supersearch&lt;span class="w"&gt; &lt;/span&gt;--num&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--product&lt;span class="o"&gt;=&lt;/span&gt;Firefox&lt;span class="w"&gt; &lt;/span&gt;--build_id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;gt;=20240321093532'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-2" name="rest_code_d711066d2e8c419896eedffda462c165-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;--release_channel&lt;span class="o"&gt;=&lt;/span&gt;nightly&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;crashids.txt
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-3" name="rest_code_d711066d2e8c419896eedffda462c165-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-3"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;fetch-data&lt;span class="w"&gt; &lt;/span&gt;--raw&lt;span class="w"&gt; &lt;/span&gt;--no-dumps&lt;span class="w"&gt; &lt;/span&gt;--no-processed&lt;span class="w"&gt; &lt;/span&gt;crashdata&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;crashids.txt
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-4" name="rest_code_d711066d2e8c419896eedffda462c165-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-4"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;jq&lt;span class="w"&gt; &lt;/span&gt;.metadata.user_agent&lt;span class="w"&gt; &lt;/span&gt;crashdata/raw_crash/*/*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uniq&lt;span class="w"&gt; &lt;/span&gt;-c
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-5" name="rest_code_d711066d2e8c419896eedffda462c165-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"crashreporter/1.0.0"&lt;/span&gt;
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-6" name="rest_code_d711066d2e8c419896eedffda462c165-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:127.0) Gecko/20100101 Firefox/127.0"&lt;/span&gt;
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-7" name="rest_code_d711066d2e8c419896eedffda462c165-7" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; rv:127.0) Gecko/20100101 Firefox/127.0"&lt;/span&gt;
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-8" name="rest_code_d711066d2e8c419896eedffda462c165-8" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"&lt;/span&gt;
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-9" name="rest_code_d711066d2e8c419896eedffda462c165-9" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;63&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0"&lt;/span&gt;
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-10" name="rest_code_d711066d2e8c419896eedffda462c165-10" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (X11; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0"&lt;/span&gt;
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-11" name="rest_code_d711066d2e8c419896eedffda462c165-11" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (X11; Linux x86_64; rv:127.0) Gecko/20100101 Firefox/127.0"&lt;/span&gt;
&lt;a id="rest_code_d711066d2e8c419896eedffda462c165-12" name="rest_code_d711066d2e8c419896eedffda462c165-12" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d711066d2e8c419896eedffda462c165-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:127.0) Gecko/20100101 Firefox/127.0"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;16 out of 100 crash reports were submitted by the new crash reporter. We were
surprised there are so many Firefox user agents. We discussed this on Slack. I
loosely repeat it here because it's a great way to show off some of the changes
of &lt;code class="docutils literal"&gt;supersearchfacet&lt;/code&gt; in v2.0.0.&lt;/p&gt;
&lt;p&gt;First, the rewritten crash reporter only affects the parent (aka main) process.
The other processes have different crash reporters that weren't rewritten.&lt;/p&gt;
&lt;p&gt;How many process types are there for Firefox crash reports in the last week? We
can see that in the &lt;code class="docutils literal"&gt;ProcessType&lt;/code&gt; annotation
(&lt;a class="reference external" href="https://crash-stats.mozilla.org/documentation/datadictionary/dataset/annotation/field/ProcessType"&gt;docs&lt;/a&gt;)
which is processed and saved in the &lt;code class="docutils literal"&gt;process_type&lt;/code&gt; field
(&lt;a class="reference external" href="https://crash-stats.mozilla.org/documentation/datadictionary/dataset/processed/field/process_type"&gt;docs&lt;/a&gt;).&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code bash"&gt;&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-1" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;supersearchfacet&lt;span class="w"&gt; &lt;/span&gt;--product&lt;span class="o"&gt;=&lt;/span&gt;Firefox&lt;span class="w"&gt; &lt;/span&gt;--build_id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;gt;=20240321093532'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--release_channel&lt;span class="o"&gt;=&lt;/span&gt;nightly
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-2" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;--_facets&lt;span class="o"&gt;=&lt;/span&gt;process_type
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-3" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-3"&gt;&lt;/a&gt;process_type
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-4" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-4"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;process_type&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-5" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-5"&gt;&lt;/a&gt;--------------&lt;span class="p"&gt;|&lt;/span&gt;-------
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-6" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-6"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3664&lt;/span&gt;
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-7" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-7" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-7"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;parent&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2323&lt;/span&gt;
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-8" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-8" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-8"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;gpu&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;855&lt;/span&gt;
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-9" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-9" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-9"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;utility&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;225&lt;/span&gt;
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-10" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-10" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-10"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;rdd&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt;
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-11" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-11" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-11"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;plugin&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-12" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-12" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-12"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;socket&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;a id="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-13" name="rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-13" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_dbe05c8c6e414f95a325c7fe8c49c54d-13"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;total&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7147&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Judging by that output, I would expect to see a higher percentage of
&lt;code class="docutils literal"&gt;crashreporter/1.0.0&lt;/code&gt; in our sampling of 100 crash reports.&lt;/p&gt;
&lt;p&gt;Turns out that Firefox uses different code to submit crash reports not just by
process type, but also by user action. That's in the &lt;code class="docutils literal"&gt;SubmittedFrom&lt;/code&gt; annotation
(&lt;a class="reference external" href="https://crash-stats.mozilla.org/documentation/datadictionary/dataset/annotation/field/SubmittedFrom"&gt;docs&lt;/a&gt;)
which is processed and saved in the &lt;code class="docutils literal"&gt;submitted_from&lt;/code&gt; field
(&lt;a class="reference external" href="https://crash-stats.mozilla.org/documentation/datadictionary/dataset/processed/field/submitted_from"&gt;docs&lt;/a&gt;).&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code bash"&gt;&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-1" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;supersearchfacet&lt;span class="w"&gt; &lt;/span&gt;--product&lt;span class="o"&gt;=&lt;/span&gt;Firefox&lt;span class="w"&gt; &lt;/span&gt;--build_id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;gt;=20240321093532'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--release_channel&lt;span class="o"&gt;=&lt;/span&gt;nightly&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-2" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;--_facets&lt;span class="o"&gt;=&lt;/span&gt;submitted_from
&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-3" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-3"&gt;&lt;/a&gt;submitted_from
&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-4" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-4"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;submitted_from&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-5" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-5"&gt;&lt;/a&gt;----------------&lt;span class="p"&gt;|&lt;/span&gt;-------
&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-6" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-6"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;Auto&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3477&lt;/span&gt;
&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-7" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-7" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-7"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;Client&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1741&lt;/span&gt;
&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-8" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-8" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-8"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;CrashedTab&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;928&lt;/span&gt;
&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-9" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-9" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-9"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;Infobar&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;792&lt;/span&gt;
&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-10" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-10" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-10"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;AboutCrashes&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;209&lt;/span&gt;
&lt;a id="rest_code_808e5197a52a4b28a1ad143cc9507f02-11" name="rest_code_808e5197a52a4b28a1ad143cc9507f02-11" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_808e5197a52a4b28a1ad143cc9507f02-11"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;total&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7147&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What is "Auto"? The user can opt-in to auto-send crash reports. When Firefox
upgrades and this setting is set, then Firefox will auto-send any unsubmitted
crash reports. The nightly channel has two updates a day, so there's lots of
opportunity for this event to trigger.&lt;/p&gt;
&lt;p&gt;What're the counts for &lt;code class="docutils literal"&gt;submitted_from&lt;/code&gt;/&lt;code class="docutils literal"&gt;process_type&lt;/code&gt; pairs?&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code bash"&gt;&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-1" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;supersearchfacet&lt;span class="w"&gt; &lt;/span&gt;--product&lt;span class="o"&gt;=&lt;/span&gt;Firefox&lt;span class="w"&gt; &lt;/span&gt;--build_id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;gt;=20240321093532'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--release_channel&lt;span class="o"&gt;=&lt;/span&gt;nightly&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-2" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;--_aggs.process_type&lt;span class="o"&gt;=&lt;/span&gt;submitted_from
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-3" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-3"&gt;&lt;/a&gt;process_type&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;submitted_from
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-4" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-4"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;process_type&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;submitted_from&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-5" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-5"&gt;&lt;/a&gt;-------------------------------&lt;span class="p"&gt;|&lt;/span&gt;-------
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-6" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-6"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Auto&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2214&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-7" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-7" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-7"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;CrashedTab&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;926&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-8" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-8" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-8"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Infobar&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;399&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-9" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-9" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-9"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;content&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;AboutCrashes&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;125&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-10" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-10" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-10"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;parent&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Client&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1741&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-11" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-11" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-11"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;parent&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Auto&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;450&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-12" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-12" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-12"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;parent&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Infobar&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;107&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-13" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-13" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-13"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;parent&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;AboutCrashes&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-14" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-14" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-14"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;gpu&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Auto&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;565&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-15" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-15" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-15"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;gpu&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Infobar&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;236&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-16" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-16" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-16"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;gpu&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;AboutCrashes&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;54&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-17" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-17" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-17"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;utility&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Auto&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;198&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-18" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-18" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-18"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;utility&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Infobar&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-19" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-19" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-19"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;utility&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;AboutCrashes&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-20" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-20" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-20"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;rdd&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Auto&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;34&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-21" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-21" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-21"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;rdd&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Infobar&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-22" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-22" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-22"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;rdd&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;AboutCrashes&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-23" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-23" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-23"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;plugin&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Auto&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-24" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-24" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-24"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;plugin&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;CrashedTab&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-25" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-25" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-25"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;plugin&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Infobar&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-26" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-26" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-26"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;socket&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Auto&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;a id="rest_code_9986a1a357f8474ea1943c43f1a6177d-27" name="rest_code_9986a1a357f8474ea1943c43f1a6177d-27" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_9986a1a357f8474ea1943c43f1a6177d-27"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;total&lt;span class="w"&gt;                         &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7147&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can spot check these different combinations to see what the user-agent looks
like.&lt;/p&gt;
&lt;p&gt;For brevity, we'll just look at &lt;code class="docutils literal"&gt;parent / Client&lt;/code&gt; in this blog post.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code bash"&gt;&lt;a id="rest_code_550b72ee3ad846bd8ab07e1db777726d-1" name="rest_code_550b72ee3ad846bd8ab07e1db777726d-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_550b72ee3ad846bd8ab07e1db777726d-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;supersearch&lt;span class="w"&gt; &lt;/span&gt;--num&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--product&lt;span class="o"&gt;=&lt;/span&gt;Firefox&lt;span class="w"&gt; &lt;/span&gt;--build_id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;gt;=20240321093532'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--release_channel&lt;span class="o"&gt;=&lt;/span&gt;nightly&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_550b72ee3ad846bd8ab07e1db777726d-2" name="rest_code_550b72ee3ad846bd8ab07e1db777726d-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_550b72ee3ad846bd8ab07e1db777726d-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;--process_type&lt;span class="o"&gt;=&lt;/span&gt;parent&lt;span class="w"&gt; &lt;/span&gt;--submitted_from&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'~Client'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;crashids_clarified.txt
&lt;a id="rest_code_550b72ee3ad846bd8ab07e1db777726d-3" name="rest_code_550b72ee3ad846bd8ab07e1db777726d-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_550b72ee3ad846bd8ab07e1db777726d-3"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;fetch-data&lt;span class="w"&gt; &lt;/span&gt;--raw&lt;span class="w"&gt; &lt;/span&gt;--no-dumps&lt;span class="w"&gt; &lt;/span&gt;--no-processed&lt;span class="w"&gt; &lt;/span&gt;crashdata_clarified&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;crashids_clarified.txt
&lt;a id="rest_code_550b72ee3ad846bd8ab07e1db777726d-4" name="rest_code_550b72ee3ad846bd8ab07e1db777726d-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_550b72ee3ad846bd8ab07e1db777726d-4"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;jq&lt;span class="w"&gt; &lt;/span&gt;.metadata.user_agent&lt;span class="w"&gt; &lt;/span&gt;crashdata_clarified/raw_crash/*/*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uniq&lt;span class="w"&gt; &lt;/span&gt;-c
&lt;a id="rest_code_550b72ee3ad846bd8ab07e1db777726d-5" name="rest_code_550b72ee3ad846bd8ab07e1db777726d-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_550b72ee3ad846bd8ab07e1db777726d-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"crashreporter/1.0.0"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Seems like the crash reporter rewrite only affects crash reports where
&lt;code class="docutils literal"&gt;ProcessType=parent&lt;/code&gt; and &lt;code class="docutils literal"&gt;SubmittedFrom=Client&lt;/code&gt;. All the other
&lt;code class="docutils literal"&gt;process_type&lt;/code&gt;/&lt;code class="docutils literal"&gt;submitted_from&lt;/code&gt; combinations get submitted a different way
where the user agent is the browser itself.&lt;/p&gt;
&lt;p&gt;How many crash reports has the new crash reporter submitted over time?&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code bash"&gt;&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-1" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;supersearchfacet&lt;span class="w"&gt; &lt;/span&gt;--_histogram.date&lt;span class="o"&gt;=&lt;/span&gt;product&lt;span class="w"&gt; &lt;/span&gt;--_histogram.interval&lt;span class="o"&gt;=&lt;/span&gt;1d&lt;span class="w"&gt; &lt;/span&gt;--denote-weekends&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-2" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;--date&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;gt;=2024-03-20'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--date&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;lt;=2024-04-25'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-3" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;--release_channel&lt;span class="o"&gt;=&lt;/span&gt;nightly&lt;span class="w"&gt; &lt;/span&gt;--product&lt;span class="o"&gt;=&lt;/span&gt;Firefox&lt;span class="w"&gt; &lt;/span&gt;--build_id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&amp;gt;=20240321093532'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-4" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;--submitted_from&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'~Client'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--process_type&lt;span class="o"&gt;=&lt;/span&gt;parent
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-5" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-5"&gt;&lt;/a&gt;histogram_date.product
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-6" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-6"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;histogram_date&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Firefox&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;total
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-7" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-7" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-7"&gt;&lt;/a&gt;----------------&lt;span class="p"&gt;|&lt;/span&gt;---------&lt;span class="p"&gt;|&lt;/span&gt;-------
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-8" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-8" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-8"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-21&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;58&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;58&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-9" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-9" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-9"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-22&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;124&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;124&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-10" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-10" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-10"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-23&lt;span class="w"&gt; &lt;/span&gt;**&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;189&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;189&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-11" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-11" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-11"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-24&lt;span class="w"&gt; &lt;/span&gt;**&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;289&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;289&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-12" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-12" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-12"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-25&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;202&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;202&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-13" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-13" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-13"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-26&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;164&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;164&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-14" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-14" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-14"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-27&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;199&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;199&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-15" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-15" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-15"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-28&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;187&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;187&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-16" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-16" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-16"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-29&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;188&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;188&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-17" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-17" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-17"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-30&lt;span class="w"&gt; &lt;/span&gt;**&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;155&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;155&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-18" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-18" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-18"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-31&lt;span class="w"&gt; &lt;/span&gt;**&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;146&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;146&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-19" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-19" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-19"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-01&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;201&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;201&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-20" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-20" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-20"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-02&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;226&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;226&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-21" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-21" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-21"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-03&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;236&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;236&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-22" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-22" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-22"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-04&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;266&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;266&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-23" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-23" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-23"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-05&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;259&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;259&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-24" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-24" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-24"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-06&lt;span class="w"&gt; &lt;/span&gt;**&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;227&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;227&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-25" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-25" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-25"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-07&lt;span class="w"&gt; &lt;/span&gt;**&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;214&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;214&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-26" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-26" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-26"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-08&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;259&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;259&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-27" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-27" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-27"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-09&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;257&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;257&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-28" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-28" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-28"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-10&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;223&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;223&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-29" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-29" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-29"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-11&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;250&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;250&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-30" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-30" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-30"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-12&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;235&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;235&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-31" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-31" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-31"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-13&lt;span class="w"&gt; &lt;/span&gt;**&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;154&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;154&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-32" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-32" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-32"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-14&lt;span class="w"&gt; &lt;/span&gt;**&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;162&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;162&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-33" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-33" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-33"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-15&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;207&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;207&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-34" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-34" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-34"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-16&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;201&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;201&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-35" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-35" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-35"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-17&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;346&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;346&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-36" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-36" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-36"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-18&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;270&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;270&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-37" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-37" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-37"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-19&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;221&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;221&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-38" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-38" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-38"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-20&lt;span class="w"&gt; &lt;/span&gt;**&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;190&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;190&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-39" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-39" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-39"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-21&lt;span class="w"&gt; &lt;/span&gt;**&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;183&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;183&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-40" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-40" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-40"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-22&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;266&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;266&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-41" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-41" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-41"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-23&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;303&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;303&lt;/span&gt;
&lt;a id="rest_code_95591be00e784f1d9d1fc5b69032f26d-42" name="rest_code_95591be00e784f1d9d1fc5b69032f26d-42" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_95591be00e784f1d9d1fc5b69032f26d-42"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-04-24&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;308&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;308&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There are more examples in the &lt;a class="reference external" href="https://github.com/willkg/crashstats-tools"&gt;crashstats-tools README&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="crashstats-tools-libcrashstats-library"&gt;
&lt;h2&gt;crashstats_tools.libcrashstats library&lt;/h2&gt;
&lt;p&gt;Starting with v2.0.0, you can use &lt;code class="docutils literal"&gt;crashstats_tools.libcrashstats&lt;/code&gt; as a
library for Python scripts.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_d078d73b6a834447addb27d810604c06-1" name="rest_code_d078d73b6a834447addb27d810604c06-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d078d73b6a834447addb27d810604c06-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;crashstats_tools.libcrashstats&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;supersearch&lt;/span&gt;
&lt;a id="rest_code_d078d73b6a834447addb27d810604c06-2" name="rest_code_d078d73b6a834447addb27d810604c06-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d078d73b6a834447addb27d810604c06-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_d078d73b6a834447addb27d810604c06-3" name="rest_code_d078d73b6a834447addb27d810604c06-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d078d73b6a834447addb27d810604c06-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;supersearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"_columns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"uuid"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;num_results&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_d078d73b6a834447addb27d810604c06-4" name="rest_code_d078d73b6a834447addb27d810604c06-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d078d73b6a834447addb27d810604c06-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_d078d73b6a834447addb27d810604c06-5" name="rest_code_d078d73b6a834447addb27d810604c06-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d078d73b6a834447addb27d810604c06-5"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_d078d73b6a834447addb27d810604c06-6" name="rest_code_d078d73b6a834447addb27d810604c06-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_d078d73b6a834447addb27d810604c06-6"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class="docutils literal"&gt;libcrashstats&lt;/code&gt; makes using the Crash Stats API a little more ergonomic.&lt;/p&gt;
&lt;p&gt;See the &lt;code class="docutils literal"&gt;crashstats_tools.libcrashstats&lt;/code&gt;
&lt;a class="reference external" href="https://github.com/willkg/crashstats-tools?tab=readme-ov-file#library"&gt;library documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="be-thoughtful-about-using-data"&gt;
&lt;h2&gt;Be thoughtful about using data&lt;/h2&gt;
&lt;p&gt;Make sure to use these tools in compliance with our data policy:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://crash-stats.mozilla.org/documentation/protected_data_access/"&gt;https://crash-stats.mozilla.org/documentation/protected_data_access/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="where-to-go-for-more"&gt;
&lt;h2&gt;Where to go for more&lt;/h2&gt;
&lt;p&gt;See the project on GitHub which includes a README which contains everything
about the project including examples of usage, the issue tracker, and the
source code:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/willkg/crashstats-tools"&gt;https://github.com/willkg/crashstats-tools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let me know whether this helps you!&lt;/p&gt;
&lt;/section&gt;</description><category>dev</category><category>mozilla</category><category>socorro</category><category>story</category><guid>https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html</guid><pubDate>Thu, 25 Apr 2024 16:00:00 GMT</pubDate></item><item><title>Observability Team Newsletter (2024q1)</title><link>https://bluesock.org/~willkg/blog/mozilla/obs_2024q1.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;p&gt;&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/428965889/Observability+Team"&gt;Observability Team&lt;/a&gt;
is a team dedicated to the problem domain and discipline of Observability at
Mozilla.&lt;/p&gt;
&lt;p&gt;We own, manage, and support monitoring infrastructure and tools supporting
Mozilla products and services. Currently this includes
&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/609845437/Sentry"&gt;Sentry&lt;/a&gt;
and crash ingestion related services
(&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/6849069/Crash+Stats+Crash+Reports+Crash+ingestion+Socorro+Antenna"&gt;Crash Stats (Socorro)&lt;/a&gt;,
&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/178061663/Symbols+aka+Tecken"&gt;Mozilla Symbols Server (Tecken)&lt;/a&gt;,
and &lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/178192647/Symbolication+Eliot"&gt;Mozilla Symbolication Service (Eliot)&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In 2024, we'll be working with SRE to take over other monitoring services they
are currently supporting like New Relic, InfluxDB/Grafana, and others.&lt;/p&gt;
&lt;p&gt;This newsletter covers an overview of 2024q1. Please forward it to interested
readers.&lt;/p&gt;
&lt;section id="highlights"&gt;
&lt;h2&gt;Highlights&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;🤹 Observability Services: Change in user support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🏆 Sentry: Change in ownership&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;‼️ Sentry: Please don't start new trials&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⏲️ Sentry: Cron monitoring trial ending April 30th&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⏱️ Sentry: Performance monitoring pilot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🤖 Socorro: Improvements to Fenix support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🐛 Socorro: Support guard page access information&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See details below.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="blog-posts"&gt;
&lt;h2&gt;Blog posts&lt;/h2&gt;
&lt;p&gt;None this quarter.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="detailed-project-updates"&gt;
&lt;h2&gt;Detailed project updates&lt;/h2&gt;
&lt;section id="observability-services-change-in-user-support"&gt;
&lt;h3&gt;Observability Services: Change in user support&lt;/h3&gt;
&lt;p&gt;We overhauled our pages in Confluence, started an #obs-help Slack channel,
created a new Jira OBSHELP project, built out a support rotation, and leveled
up our ability to do support for Observability-owned services.&lt;/p&gt;
&lt;p&gt;See our &lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/605978960/Observability+Service+User+Support"&gt;User Support Confluence page&lt;/a&gt;
for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;where to get user support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;documentation for common tasks (get protected data access, create a Sentry
team, etc)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;self-serve instructions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hop in &lt;a class="reference external" href="https://app.slack.com/client/T027LFU12/C06N3QR11E0"&gt;#obs-help in Slack&lt;/a&gt; to ask for service
support, help with monitoring problems, and advice.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="sentry-change-in-ownership"&gt;
&lt;h3&gt;Sentry: Change in ownership&lt;/h3&gt;
&lt;p&gt;The Observability team now owns Sentry service at Mozilla!&lt;/p&gt;
&lt;p&gt;We successfully completed &lt;a class="reference external" href="https://mozilla-hub.atlassian.net/browse/OBS-21"&gt;Phase 1 of the transition&lt;/a&gt; in Q1. If you're a member
of the Mozilla Sentry organization, you should have received a separate email
about this to the &lt;a class="reference external" href="https://groups.google.com/a/mozilla.com/g/sentry-users"&gt;sentry-users&lt;/a&gt; Google group.&lt;/p&gt;
&lt;p&gt;We've overhauled Sentry user support documentation to improve it in a few ways:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;easier to find "how to" articles for common tasks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;best practices to help you set up and configure Sentry for your project needs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check out our
&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/609452284/Sentry+User+Guide"&gt;Sentry user guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There's still a lot that we're figuring out, so we appreciate your patience and
cooperation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="sentry-please-don-t-start-new-trials"&gt;
&lt;h3&gt;Sentry: Please don't start new trials&lt;/h3&gt;
&lt;p&gt;Sentry sends marketing and promotional emails to Sentry users which often
include links to start a new trial. Please contact us before starting any new
feature trials in Sentry.&lt;/p&gt;
&lt;p&gt;Starting new trials may prevent us from trialing those features in the future
when we’re in a better position to evaluate the feature. There's no way for
admins to prevent users from starting a trial.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="sentry-cron-monitoring-trial-ending-april-30th"&gt;
&lt;h3&gt;Sentry: Cron monitoring trial ending April 30th&lt;/h3&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://docs.sentry.io/product/crons/"&gt;Cron Monitoring&lt;/a&gt; trial that was
started a couple of months ago will end April 30th.&lt;/p&gt;
&lt;p&gt;Based on feedback so far and other factors, we will not be enabling this
feature once the trial ends.&lt;/p&gt;
&lt;p&gt;This is a good reminder to build in redundancy in your monitoring systems.
Don't rely solely on trial or pilot features for mission critical information!&lt;/p&gt;
&lt;p&gt;Once the trial is over, we'll put together an evaluation summary.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="sentry-performance-monitoring-pilot"&gt;
&lt;h3&gt;Sentry: Performance monitoring pilot&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.sentry.io/product/performance/"&gt;Performance Monitoring&lt;/a&gt; is
being piloted by a couple of teams; it is not currently available for general
use.&lt;/p&gt;
&lt;p&gt;In the meantime, if you are not one of these pilot teams, please do not use
Performance Monitoring. There is a shared transaction event quota for the
entire Mozilla Sentry organization. Once we hit that quota, events are dumped.&lt;/p&gt;
&lt;p&gt;If you have questions about any of this, please reach out.&lt;/p&gt;
&lt;p&gt;Once the trial is over, we'll put together an evaluation summary.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="socorro-improvements-to-fenix-support"&gt;
&lt;h3&gt;Socorro: Improvements to Fenix support&lt;/h3&gt;
&lt;p&gt;We worked on improvements to crash ingestion and the Crash Stats site for the
Fenix project:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1812771"&gt;1812771: Fenix crash reporter's Socorro crash reports for Java exceptions have "Platform" = "Unknown" instead of "Android"&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Previously, the platform would be "Unknown". Now the platform for Fenix crash
reports is "Android". Further, the &lt;code class="docutils literal"&gt;platform_pretty_version&lt;/code&gt; includes the
Android ABI version.&lt;/p&gt;
&lt;figure&gt;
&lt;a class="reference external image-reference" href="https://bluesock.org/~willkg/blog/images/obs_2024q1_android_version.png"&gt;
&lt;img alt="/images/obs_2024q1_android_version.thumbnail.png" src="https://bluesock.org/~willkg/blog/images/obs_2024q1_android_version.thumbnail.png"&gt;
&lt;/a&gt;
&lt;figcaption&gt;
&lt;p&gt;Figure 1: Screenshot of Crash Stats Super Search results showing Android
versions for crash reports.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1819628"&gt;1819628: reject crash reports for unsupported Fenix forks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Forks of Fenix outside of our control periodically send large swaths of crash
reports to Socorro. When these sudden spikes happened, Mozillians would spend
time looking into them only to discover they're not related to our code or our
users. This is a waste of our time and resources.&lt;/p&gt;
&lt;p&gt;We implemented support for the &lt;code class="docutils literal"&gt;Android_PackageName&lt;/code&gt; crash annotation and
added a throttle rule to the collector to drop crash reports from any
non-Mozilla releases of Fenix.&lt;/p&gt;
&lt;p&gt;From 2024-01-18 to 2024-03-31, Socorro accepted 2,072,785 Fenix crash reports
for processing and rejected 37,483 unhelpful crash reports with this new rule.
That's roughly 1.7%. That's not a huge amount, but because they sometimes come
in bursts with the same signature, they show up in Top Crashers wasting
investigation time.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1884041"&gt;1884041: fix create-a-bug links to work with java_exception&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A long time ago, in an age partially forgotten, Fenix crash reports from a
crash in Java code would send a crash report with a &lt;code class="docutils literal"&gt;JavaStackTrace&lt;/code&gt; crash
annotation. This crash annotation was a string representation of the Java
exception. As such, it was difficult-to-impossible to parse reliably.&lt;/p&gt;
&lt;p&gt;In 2020, Roger Yang and Will Kahn-Greene spec'd out a new &lt;code class="docutils literal"&gt;JavaException&lt;/code&gt; crash
annotation. The value is a JSON-encoded structure mirroring what Sentry uses
for exception information. This structure provides more information than the
&lt;code class="docutils literal"&gt;JavaStackTrace&lt;/code&gt; crash annotation did and is much easier to work with because we
don't have to parse it first.&lt;/p&gt;
&lt;p&gt;Between 2020 and now, we have been transitioning from crash reports that only
contained a &lt;code class="docutils literal"&gt;JavaStackTrace&lt;/code&gt; to crash reports that contained both a
&lt;code class="docutils literal"&gt;JavaStackTrace&lt;/code&gt; and a &lt;code class="docutils literal"&gt;JavaException&lt;/code&gt;. Once all Fenix crash reports from
crashes in Java code contained a &lt;code class="docutils literal"&gt;JavaException&lt;/code&gt;, we could transition Socorro
code to use the &lt;code class="docutils literal"&gt;JavaException&lt;/code&gt; value for Crash Stats views, signature
generation, generate-create-bug-url, and other things.&lt;/p&gt;
&lt;p&gt;Recently, Fenix dropped the &lt;code class="docutils literal"&gt;JavaStackTrace&lt;/code&gt; crash annotation. However, we
hadn't yet gotten to updating Socorro code to use--and prefer--the
&lt;code class="docutils literal"&gt;JavaException&lt;/code&gt; values. This broke the ability to generate a bug for a Fenix
crash with the needed data added to the bug description.  Work on bug 1884041
fixed that.&lt;/p&gt;
&lt;p&gt;Comments for Fenix Java crash reports went from:&lt;/p&gt;
&lt;pre class="literal-block"&gt;Crash report: https://crash-stats.mozilla.org/report/index/eb6f852b-4656-4cf5-8350-fd91a0240408&lt;/pre&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;pre class="literal-block"&gt;Crash report: https://crash-stats.mozilla.org/report/index/eb6f852b-4656-4cf5-8350-fd91a0240408

Top 10 frames:

0  android.database.sqlite.SQLiteConnection  nativePrepareStatement  SQLiteConnection.java:-2
1  android.database.sqlite.SQLiteConnection  acquirePreparedStatement  SQLiteConnection.java:939
2  android.database.sqlite.SQLiteConnection  executeForString  SQLiteConnection.java:684
3  android.database.sqlite.SQLiteConnection  setJournalMode  SQLiteConnection.java:369
4  android.database.sqlite.SQLiteConnection  setWalModeFromConfiguration  SQLiteConnection.java:299
5  android.database.sqlite.SQLiteConnection  open  SQLiteConnection.java:218
6  android.database.sqlite.SQLiteConnection  open  SQLiteConnection.java:196
7  android.database.sqlite.SQLiteConnectionPool  openConnectionLocked  SQLiteConnectionPool.java:503
8  android.database.sqlite.SQLiteConnectionPool  open  SQLiteConnectionPool.java:204
9  android.database.sqlite.SQLiteConnectionPool  open  SQLiteConnectionPool.java:196&lt;/pre&gt;
&lt;p&gt;This both fixes the bug and also vastly improves the bug comments from what we
were previously doing with &lt;code class="docutils literal"&gt;JavaStackTrace&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Between 2024-03-31 and 2024-04-06, there were 158,729 Fenix crash reports
processed. Of those, 15,556 have the circumstances affected by this bug: a
&lt;code class="docutils literal"&gt;JavaException&lt;/code&gt; but don't have a &lt;code class="docutils literal"&gt;JavaStackTrace&lt;/code&gt;. That's roughly 10% of
incoming Fenix crash reports.&lt;/p&gt;
&lt;p&gt;While working on this, we refactored the code that generates these crash report
bugs, so it's in a separate module that's easier to copy and use in external
systems in case others want to generate bug comments from processed crash data.&lt;/p&gt;
&lt;p&gt;Further, we changed the code so that instead of dropping arguments in function
signatures, it now truncates them at 80 characters.&lt;/p&gt;
&lt;p&gt;We're hoping to improve signature generation for Java crashes using
&lt;code class="docutils literal"&gt;JavaException&lt;/code&gt; values in 2024q2. That work is tracked in
&lt;a class="reference external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1541120"&gt;bug #1541120&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="socorro-support-guard-page-access-information"&gt;
&lt;h3&gt;Socorro: Support guard page access information&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1830954"&gt;1830954: Expose crashes which were likely accessing a guard page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We updated the stackwalker to pick up the changes for determining
&lt;code class="docutils literal"&gt;is_likely_guard_page&lt;/code&gt;. Then we exposed that in crash reports in the
&lt;code class="docutils literal"&gt;has_guard_page_access&lt;/code&gt; field. We added this field to the Details tab in
crash reports and made it searchable. We also added this to the signature
report.&lt;/p&gt;
&lt;p&gt;This helps us know if a crash is possibly due to a bug with memory access that
could be a possible security vulnerability vector--something we want to
prioritize fixing.&lt;/p&gt;
&lt;p&gt;Since this field is security sensitive, it requires protected data access to
view and search with.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="socorro-misc"&gt;
&lt;h3&gt;Socorro misc&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/crashstats-tools/2.0.0/"&gt;crashstats-tools 2.0.0 release&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/siggen/2.1.20240412/"&gt;socorro-siggen 2.1.20240412 release&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;4 signature generation changes. Thank you Andrew McCreight and Jim Blandy!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintenance and documentation improvements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;6 production deploys. Created 71 issues. Resolved 61 issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="tecken-eliot-misc"&gt;
&lt;h3&gt;Tecken/Eliot misc&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Maintenance and documentation improvements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;5 production deploys. Created 21 issues. Resolved 28 issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="more-information"&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;p&gt;Find us:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Confluence page: &lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/428965889/Observability+Team"&gt;Observability Team&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User support hub: &lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/605978960/Observability+Service+User+Support"&gt;User Support&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support: &lt;a class="reference external" href="https://app.slack.com/client/T027LFU12/C06N3QR11E0"&gt;#obs-help&lt;/a&gt; (Slack)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crash ingestion: &lt;a class="reference external" href="https://matrix.to/#/%23crashreporting:mozilla.org"&gt;#crashreporting&lt;/a&gt; (Matrix)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you for reading!&lt;/p&gt;
&lt;/section&gt;</description><category>dev</category><category>eliot</category><category>mozilla</category><category>sentry</category><category>socorro</category><category>tecken</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/obs_2024q1.html</guid><pubDate>Tue, 16 Apr 2024 13:00:00 GMT</pubDate></item><item><title>Observability Team Newsletter (2023q4)</title><link>https://bluesock.org/~willkg/blog/mozilla/obs_2023q4.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;p&gt;&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/428965889/Observability+Team"&gt;Observability Team&lt;/a&gt;
is a team dedicated to the problem domain and discipline of
Observability at Mozilla. We will own, manage, and support infrastructure and
tools supporting Mozilla products and services. Currently this includes crash
ingestion related services:
&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/6849069/Crash+Stats+Crash+Reports+Crash+ingesti"&gt;Crash Stats and crash ingestion pipeline (Socorro)&lt;/a&gt;,
&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/6849069/Crash+Stats+Crash+Reports+Crash+ingesti"&gt;Mozilla Symbols Server (Tecken)&lt;/a&gt;,
and &lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/6849069/Crash+Stats+Crash+Reports+Crash+ingesti"&gt;Mozilla Symbolication Service (Eliot)&lt;/a&gt;.
In 2024, we'll be working with SRE to take over many of the observability tools
that they are currently supporting like Sentry, Grafana, New Relic, and others.&lt;/p&gt;
&lt;p&gt;This newsletter covers an overview of 2023q4. Please forward it to interested readers.&lt;/p&gt;
&lt;section id="highlights"&gt;
&lt;h2&gt;Highlights&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;🎉 Team Changes: Socorro Engineering becomes Observability Team and picks up new members.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Documentation: Overhauled support documentation for crash ingestion services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❤️‍🩹 Socorro: Stability: Fixed ongoing Socorro processor stability problem. [bug 1795017]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🏆 Socorro: Code-info lookup: Implemented code-info lookup for symbols files. [bug 1746940] [Retro]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔒 Tecken: Removed private symbols bucket support.[bug 1843356]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📚 Tecken: Removed missing symbols bookkeeping. [bug 1774004]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📱 Evolving SRE: Took over application support for crash ingestion services.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See details below.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="blog-posts"&gt;
&lt;h2&gt;Blog posts&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bluesock.org/~willkg/blog/mozilla/socorro_tecken_code_info_retro.html"&gt;Code info lookup: retrospective (2023) | willkg's blog&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bluesock.org/~willkg/blog/mozilla/tecken_worker_exit.html"&gt;Long windy journey to reproducing a problem remove_orphaned_files fixes | willkg's blog&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="detailed-project-updates"&gt;
&lt;h2&gt;Detailed project updates&lt;/h2&gt;
&lt;section id="team-changes"&gt;
&lt;h3&gt;Team changes&lt;/h3&gt;
&lt;p&gt;Prior to October, 2023, the Socorro Engineering team maintained crash ingestion
systems and related services: Crash Stats and the crash ingestion pipeline,
Mozilla Symbols Server, and Mozilla Symbolication Service.&lt;/p&gt;
&lt;p&gt;In October 2023, that team picked up a couple of new people--Bianca and
Sven--and changed names to become the Observability Team. In mid-December,
Observability Team picked up a fourth teammate: Relud.&lt;/p&gt;
&lt;p&gt;As we move into 2024, we expect to pick up other observability related services
and work on service stability, support, and building out documentation of best
practices across them supporting Mozilla products and services.&lt;/p&gt;
&lt;p&gt;See our &lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/428965889/Observability+Team"&gt;Confluence page&lt;/a&gt;
for contact information, roughly what we're working on, how to do various
things (add crash annotations, get protected data access, etc), and
service/support documentation.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="overhauled-support-documentation-for-crash-ingestion-services"&gt;
&lt;h3&gt;Overhauled support documentation for crash ingestion services&lt;/h3&gt;
&lt;p&gt;Documentation for crash ingestion services has been kind of all over the place.
Going forward, we're working to make it clearer and easier to find.&lt;/p&gt;
&lt;p&gt;We're moving some "how to" documentation into &lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/450723930/Obs+Service+Documentation"&gt;this tree in Confluence&lt;/a&gt;.
Some interesting ones:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/452493541/How+to+Add+support+for+a+new+product+Socorro"&gt;How to: add support for a new product (Socorro)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/453804150/How+to+Add+support+for+crash+annotations+Socorro"&gt;How to: add support for crash annotations (Socorro)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/453738637/How+to+Get+a+data+review+for+a+crash+annotation+Socorro"&gt;How to: get a data review for a crash annotation (Socorro)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/456392904/How+to+Upload+symbols+Tecken"&gt;How to: upload symbols (Tecken)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We'll add to that and improve it as time goes on. We'll be looking at
centralizing API, tools, data dictionary, and other documentation over the next
year as well.&lt;/p&gt;
&lt;p&gt;If there are things you have questions about and can't find documentation for
it, &lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/428965889/Observability+Team"&gt;please let us know&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="socorro-fixed-ongoing-socorro-processor-stability-problem"&gt;
&lt;h3&gt;Socorro: Fixed ongoing Socorro processor stability problem&lt;/h3&gt;
&lt;p&gt;In September 2022, Mozilla began adding inline function data into symbols
files. This increased the size of symbols files significantly. For example, the
symbols file for &lt;code class="docutils literal"&gt;xul.dll&lt;/code&gt; files went from around 200mb to 700mb. The increase in
file size increased the time it takes for the stackwalker to download and parse
symbols files, reduced the number of files the processor could store in the
on-disk symbols cache, and caused the processor instances to suddenly slow down
in periods of high load. This in turn would cause the processing queue to back
up and page SRE causing work disruption as we scrambled to manually add more
processor instances to increase throughput and reduce the queue.&lt;/p&gt;
&lt;p&gt;We spent a lot of time analyzing the situation, adding new metrics, rewriting
portions of the code based on our theories at the time, and ended up with
several mitigations that reduced the likelihood that the processing queue
backed up and sat with that for several months while we worked on other things.&lt;/p&gt;
&lt;p&gt;One of the first things the Observability Team did was revisit the issue. New
minds brought new theories, one of which was to change the instance type to one
with a local ssd. That eliminated the disk io throttling the processors were
incurring from using EBS for the symbols cache.&lt;/p&gt;
&lt;p&gt;Now the Socorro processors are performing much like they did prior to September
2022, we've removed all the mitigations we had in place, and the processor
queue isn't backing up anymore during periods of high load due to increased
crash report volume and reprocessing. &lt;a class="reference external" href="https://bugzil.la/1795017"&gt;[bug 1795017]&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="socorro-stackwalker-will-use-code-id-when-debug-id-isn-t-available-to-fetch-the-symbols-file"&gt;
&lt;h3&gt;Socorro: Stackwalker will use code id when debug id isn't available to fetch the symbols file&lt;/h3&gt;
&lt;p&gt;This allows symbolication of stacks where the debug id for modules is unknown.
This improves crash signatures. Better signatures gives us better visibility
into what crashes our users are encountering and how often.&lt;/p&gt;
&lt;p&gt;For example, one of the problem signatures (#3 in Top Crashers at the time)
looked like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;OOM | large | mozalloc_abort | xul.dll | _PR_NativeRunThread | pr_root&lt;/pre&gt;
&lt;p&gt;and now looks like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;OOM | large | mozalloc_abort | webrender::renderer::Renderer::render_impl&lt;/pre&gt;
&lt;p&gt;Rough estimate is that this significantly improved the crash signatures for 10k
out of the 300k Firefox Windows crash reports we get a week.&lt;/p&gt;
&lt;p&gt;See`Code info lookup: retrospective &amp;lt;&lt;a class="reference external" href="https://bluesock.org/~willkg/blog/mozilla/socorro_tecken_code_info_retro.html"&gt;https://bluesock.org/~willkg/blog/mozilla/socorro_tecken_code_info_retro.html&lt;/a&gt;&amp;gt;`__
for details. &lt;a class="reference external" href="https://bugzil.la/1746940"&gt;[bug 1746940]&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="socorro-misc"&gt;
&lt;h3&gt;Socorro misc&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;socorro-siggen v2.0.20231009 release.
[&lt;a class="reference external" href="https://github.com/willkg/socorro-siggen/releases/tag/v2.0.20231009"&gt;v2.0.20231009&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;11 signature generation changes most of which were self-serve.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lots of maintenance and documentation improvements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;11 production deploys. Created 61 issues. Resolved 58 issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="tecken-remove-support-for-private-symbols-bucket"&gt;
&lt;h3&gt;Tecken: Remove support for private symbols bucket&lt;/h3&gt;
&lt;p&gt;The Mozilla Symbols Server stored uploaded symbols in several places: a default
storage bucket for build symbols, a "try" storage bucket for symbols from try
builds, and a private symbols bucket. Mozilla primarily used the private
symbols bucket for Flash symbols. However, we don't support Flash anymore, so
we removed the private symbols bucket and all the code to support it. Removing
this simplified symbols upload/download code significantly. &lt;a class="reference external" href="https://bugzil.la/1843356"&gt;[bug 1843356]&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="tecken-remove-missing-symbols-bookkeeping"&gt;
&lt;h3&gt;Tecken: Remove missing symbols bookkeeping&lt;/h3&gt;
&lt;p&gt;Mozilla Symbols Server used to keep track of symbols that were requested but
didn't exist in the symbols buckets. Tecken had an API for querying this data
which was used for reporting on which symbols Mozilla is missing. This helps us
understand which symbols files we're missing when unwinding and symbolication
stacks in crash ingestion.&lt;/p&gt;
&lt;p&gt;There are better ways to get this data and keeping track of missing symbols in
Tecken isn't helpful. We migrated users of this API and removed the data and
code from Tecken. Removing this reduced the size of the database and simplified
the download API code. &lt;a class="reference external" href="https://bugzil.la/1774004"&gt;[bug 1774004]&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="tecken-misc"&gt;
&lt;h3&gt;Tecken misc&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;fx-crash-sig v1.0.1 and v1.0.2 releases.
[&lt;a class="reference external" href="https://github.com/mozilla/fx-crash-sig/releases/tag/v1.0.1"&gt;v1.0.1&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/mozilla/fx-crash-sig/releases/tag/v1.0.2"&gt;v1.0.2&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lots of maintenance and documentation improvements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;16 production deploys. Created 58 issues. Resolved 56 issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="prototyping-evolving-sre"&gt;
&lt;h3&gt;Prototyping Evolving SRE&lt;/h3&gt;
&lt;p&gt;In December, we finished the work to transition the application support role
from Data SRE to the Observability Team making us an engineering team that also
owns application support for the services we maintain.&lt;/p&gt;
&lt;p&gt;We've accrued a lot of experience in how to migrate from the separate
Engineering team and SRE team model to the combined Engineering and SRE team
model. If you're thinking about transitioning to a combined Engineering and SRE
team model and have questions, come find us.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="more-information"&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;p&gt;Find us:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Confluence page: &lt;a class="reference external" href="https://mozilla-hub.atlassian.net/wiki/spaces/CS1/pages/428965889/Observability+Team"&gt;Observability Team&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Matrix: &lt;a class="reference external" href="https://matrix.to/#/%23crashreporting:mozilla.org"&gt;#crashreporting&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you for reading!&lt;/p&gt;
&lt;/section&gt;</description><category>dev</category><category>eliot</category><category>mozilla</category><category>socorro</category><category>tecken</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/obs_2023q4.html</guid><pubDate>Fri, 22 Dec 2023 14:26:00 GMT</pubDate></item><item><title>Tecken: The long windy journey to reproducing a problem remove_orphaned_files fixes</title><link>https://bluesock.org/~willkg/blog/mozilla/tecken_worker_exit.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;This post talks about a stability problem we have with Tecken wherein the
instance runs out of disk and then becomes unhealthy, some work we're doing to
make it better, and the steps to reproduce the problem in a local dev
environment so we can test possible fixes.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/mozilla/tecken_worker_exit.html"&gt;Read more…&lt;/a&gt; (9 min remaining to read)&lt;/p&gt;&lt;/section&gt;</description><category>dev</category><category>mozilla</category><category>story</category><category>tecken</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/tecken_worker_exit.html</guid><pubDate>Thu, 30 Nov 2023 15:00:17 GMT</pubDate></item><item><title>Tecken/Socorro: Code info lookup: retrospective (2023)</title><link>https://bluesock.org/~willkg/blog/mozilla/socorro_tecken_code_info_retro.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;div&gt;&lt;section id="project"&gt;
&lt;h2&gt;Project&lt;/h2&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt&gt;time&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;6 weeks&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;impact&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;improved visibility 3% (10k / 300k) of Firefox crash reports from Windows
users by fixing symbolication and signatures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;better understanding of consequences from sampling Firefox / Windows &amp;lt;
8.1 / ESR crash reports&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;In November 2021, we wrote up a bug in the Tecken product to support download
symbols files using the code file and code id.&lt;/p&gt;
&lt;p&gt;In July 2023, Mozilla migrated users for Windows 7, 8, and 8.1 from Firefox
release channel to ESR channel. Firefox / Windows / release is sampled by the
Socorro collector, so the system only accepts and processes 10% of incoming
crash reports. When the users were migrated, their crash reports moved to an
unsampled group, so then we were getting 100% of those incoming crash reports.
That caused a &lt;a class="reference external" href="https://github.com/willkg/socorro-jupyter/blob/main/notebooks/bug_1795017_volume_20230816.ipynb"&gt;volume increase of 30k&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While looking into adding a sampling rule for Firefox / Windows &amp;lt; 8.1 / ESR, I
noticed many crash reports listed a xul module without a debug file and debug
id. Because of that, the stackwalker isn't able to get symbols and we end up
with crash reports with generic signatures that we have no visibility into.&lt;/p&gt;
&lt;p&gt;I looked at &lt;a class="reference external" href="https://bugzil.la/1746940"&gt;[bug 1746940]&lt;/a&gt; and worked out how to fix it. I thought it would be
relatively straight-forward to implement and it would solve our visibility
problem, so I prioritized working on it with the assumption it'd take a week to
do.&lt;/p&gt;
&lt;p&gt;Work wasn't as straight-forward as I predicted--I hit a bunch of road bumps and
it took me 6 weeks to work through several attempts, settle on a final
architecture, implement it, test it, and push all the pieces to production. I
finished the work on October 24th, 2023.&lt;/p&gt;
&lt;p&gt;The end result is improved visibility for 3% of Firefox Windows crash reports
and a reduction in crash reports with generic signatures because the
stackwalker couldn't find the symbols file for &lt;code class="docutils literal"&gt;xul.dll&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/mozilla/socorro_tecken_code_info_retro.html"&gt;Read more…&lt;/a&gt; (14 min remaining to read)&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;</description><category>dev</category><category>mozilla</category><category>python</category><category>retrospective</category><category>socorro</category><category>story</category><category>tecken</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/socorro_tecken_code_info_retro.html</guid><pubDate>Mon, 30 Oct 2023 18:33:05 GMT</pubDate></item><item><title>Socorro Engineering: 2022 retrospective</title><link>https://bluesock.org/~willkg/blog/mozilla/socorro_2022.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;2022 took forever. At the same time, it kind of flew by. 2023 is already moving
along, so this post is a month late. Here's the retrospective of Socorro
engineering in 2022.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/mozilla/socorro_2022.html"&gt;Read more…&lt;/a&gt; (18 min remaining to read)&lt;/p&gt;&lt;/section&gt;</description><category>dev</category><category>mozilla</category><category>socorro</category><category>tecken</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/socorro_2022.html</guid><pubDate>Mon, 23 Jan 2023 21:00:00 GMT</pubDate></item><item><title>Bleach 6.0.0 release and deprecation</title><link>https://bluesock.org/~willkg/blog/dev/bleach_6_0_0_deprecation.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;section id="what-is-it"&gt;
&lt;h2&gt;What is it?&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bleach.readthedocs.io/"&gt;Bleach&lt;/a&gt; is a Python library for sanitizing
and linkifying text from untrusted sources for safe usage in HTML.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="bleach-v6-0-0-released"&gt;
&lt;h2&gt;Bleach v6.0.0 released!&lt;/h2&gt;
&lt;p&gt;Bleach 6.0.0 cleans up some issues in linkify and with the way it uses html5lib
so it's easier to reason about. It also adds support for Python 3.11 and cleans
up the project infrastructure.&lt;/p&gt;
&lt;p&gt;There are several backwards-incompatible changes, hence the 6.0.0 version.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bleach.readthedocs.io/en/latest/changes.html#version-6-0-0-january-23rd-2023"&gt;https://bleach.readthedocs.io/en/latest/changes.html#version-6-0-0-january-23rd-2023&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I did some rough testing with a corpus of Standup messages data and it looks
like &lt;code class="docutils literal"&gt;bleach.clean&lt;/code&gt; is slightly faster with 6.0.0 than 5.0.0.&lt;/p&gt;
&lt;p&gt;Using Python 3.10.9:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;5.0.0: bleach.clean on 58,630 items 10x: minimum 2.793s&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;6.0.0: bleach.clean on 58,630 items 10x: minimum 2.304s&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The other big change in 6.0.0 is that I've deprecated the project and planning
to move to a minimum-maintenance mode for the foreseeable future.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="bleach-is-deprecated"&gt;
&lt;h2&gt;Bleach is deprecated&lt;/h2&gt;
&lt;p&gt;Bleach sits on top of &lt;a class="reference external" href="https://github.com/html5lib/html5lib-python"&gt;html5lib&lt;/a&gt;
which is not actively maintained. It is increasingly difficult to maintain
Bleach in that context and I think it's nuts to build a security library on top
of a library that's not in active development.&lt;/p&gt;
&lt;p&gt;Over the years, we've talked about other options:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;find another library to switch to&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;take over html5lib development&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fork html5lib and vendor and maintain our fork&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;write a new HTML parser&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;etc&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With the exception of option 1, they greatly increase the scope of the work for
Bleach. They all feel exhausting to me.&lt;/p&gt;
&lt;p&gt;Given that, I think Bleach has run its course and this journey is over.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="what-happens-now"&gt;
&lt;h2&gt;What happens now?&lt;/h2&gt;
&lt;p&gt;Possibilities:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Pass it to someone else?&lt;/p&gt;
&lt;p&gt;No, I won't be passing Bleach to someone else to maintain. Bleach is a
security-related library, so making a mistake when passing it to someone
else would be a mess. I'm not going to do that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Switch to an alternative?&lt;/p&gt;
&lt;p&gt;I'm not aware of any alternatives to Bleach. I don't plan to work on
coordinating the migration for everyone from Bleach to something else.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oh my goodness--you're leaving us with nothing?&lt;/p&gt;
&lt;p&gt;Sort of.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I'm going to continue doing minimal maintenance:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;security updates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;support for new Python versions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fixes for egregious bugs (begrudgingly)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I'll do that for at least a year. At some point, I'll stop doing that, too.&lt;/p&gt;
&lt;p&gt;I think that gives the world enough time for either something to take Bleach's
place, or for the &lt;a class="reference external" href="https://caniuse.com/mdn-api_sanitizer"&gt;sanitizing web api&lt;/a&gt; to kick in, or for everyone to come
to the consensus that they never really needed Bleach in the first place.&lt;/p&gt;
&lt;figure&gt;
&lt;a class="reference external image-reference" href="https://bluesock.org/~willkg/blog/images/bleach_deprecation.jpg"&gt;
&lt;img alt="/images/bleach_deprecation.thumbnail.jpg" src="https://bluesock.org/~willkg/blog/images/bleach_deprecation.thumbnail.jpg"&gt;
&lt;/a&gt;
&lt;figcaption&gt;
&lt;p&gt;Bleach. Tired. At the end of its journey.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/section&gt;
&lt;section id="thanks"&gt;
&lt;h2&gt;Thanks!&lt;/h2&gt;
&lt;p&gt;Many thanks to &lt;a class="reference external" href="https://github.com/g-k"&gt;Greg&lt;/a&gt; who I worked with on Bleach
for a long while and maintained Bleach for several years. Working with Greg was
always easy and his reviews were thoughtful and spot-on.&lt;/p&gt;
&lt;p&gt;Many thanks to &lt;a class="reference external" href="https://github.com/jvanasco"&gt;Jonathan&lt;/a&gt; who, over the years,
provided a lot of insight into how best to solve some of Bleach's more
squirrely problems.&lt;/p&gt;
&lt;p&gt;Many thanks to &lt;a class="reference external" href="https://github.com/gsnedders"&gt;Sam&lt;/a&gt; who was an indispensible
resource on HTML parsing and sanitizing text in the context of HTML.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="where-to-go-for-more"&gt;
&lt;h2&gt;Where to go for more&lt;/h2&gt;
&lt;p&gt;For more specifics on this release, see here:
&lt;a class="reference external" href="https://bleach.readthedocs.io/en/latest/changes.html#version-6-0-0-january-23rd-2023"&gt;https://bleach.readthedocs.io/en/latest/changes.html#version-6-0-0-january-23rd-2023&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Documentation and quickstart here:
&lt;a class="reference external" href="https://bleach.readthedocs.io/en/latest/"&gt;https://bleach.readthedocs.io/en/latest/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Source code and issue tracker here:
&lt;a class="reference external" href="https://github.com/mozilla/bleach"&gt;https://github.com/mozilla/bleach&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</description><category>bleach</category><category>dev</category><category>mozilla</category><category>python</category><category>story</category><guid>https://bluesock.org/~willkg/blog/dev/bleach_6_0_0_deprecation.html</guid><pubDate>Mon, 23 Jan 2023 16:55:31 GMT</pubDate></item><item><title>Socorro: Schema-Based Overhaul of Crash Ingestion: Retrospective (2022)</title><link>https://bluesock.org/~willkg/blog/mozilla/socorro_schema_based_overhaul.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;section id="project"&gt;
&lt;h2&gt;Project&lt;/h2&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt&gt;time&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;2+ years&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;impact&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;radically reduces the risk of data leaks due to misconfigured permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;centralizes and simplifies configuration and management of fields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;normalization and validation are performed during processing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;documentation of data reviews, data caveats, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reduces the risk of bugs when adding new fields—testing is done in CI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;new crash reporting data dictionary with Markdown-formatted descriptions,
real examples, and relevant links&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;I've been working on Socorro, the crash ingestion pipeline at Mozilla, since the
beginning of 2016. During that time, I've focused on streamlining maintenance
of the project, paying down technical debt, reducing risk, and improving crash
analysis tooling.&lt;/p&gt;
&lt;p&gt;Early on, I observed that the crash ingestion pipeline was difficult to reason
about, poorly documented, and full of risk. What did the incoming data look
like? What did the processed data look like? Was it valid? Which fields
contained data anyone could look at? Which fields contained data that was
sensitive and required access controls to access? How do we add support for new
crash annotations? What happens when data is invalid or malformed? At a given
point in the system, what did we know about the data?&lt;/p&gt;
&lt;p&gt;In 2020, Socorro moved into the Data Org, which has multiple data pipelines.
After spending some time looking at how their pipelines work, I decided to
rework the crash ingestion pipeline to be schema-driven and to move data
validation and normalization earlier in the processor.&lt;/p&gt;
&lt;p&gt;The end result of this project is that:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;the project is easier to maintain:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;adding support for new crash annotations is done in a couple of schema
files and possibly a processor rule&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;risk of security issues and data breaches is lower:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;typos, bugs, and mistakes when adding support for a new crash annotation
are caught in CI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions are specified in a central location; changing permission for
fields is trivial and takes effect in the next deploy; setting permissions
supports complex data structures in easy-to-reason-about ways; and
mistakes are caught in CI&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the data is easier to use and reason about:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;normalization and validation of crash annotation data happens during
processing, and downstream uses of the data can expect it to be valid;
further, we get a signal when the data isn't valid, which can indicate
product bugs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;schemas describing incoming and processed data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a crash reporting data dictionary documenting incoming data fields,
processed data fields, descriptions, sources, data gotchas, examples, and
permissions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="what-is-socorro"&gt;
&lt;h2&gt;What is Socorro?&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/mozilla-services/socorro"&gt;Socorro&lt;/a&gt; is the crash ingestion
pipeline for Mozilla products like Firefox, Fenix, Thunderbird, and MozillaVPN.&lt;/p&gt;
&lt;p&gt;When Firefox crashes, the crash reporter asks the user if they would like
to send a crash report. If the user answers "yes!", the crash reporter
collects data related to the crash, generates a crash report, and submits that
crash report as an HTTP POST to Socorro. Socorro saves the submitted crash
report, processes it, and has tools for viewing and analyzing crash data.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="state-of-crash-ingestion-at-the-beginning"&gt;
&lt;h2&gt;State of crash ingestion at the beginning&lt;/h2&gt;
&lt;p&gt;The crash ingestion system was working and it was usable, but it was in a
bad state.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Poor data management&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Normalization and validation of data was all over the codebase and not
consistent:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;processor rule code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS S3 crash storage code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elasticsearch indexing code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Telemetry crash storage code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Super Search querying and result rendering code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;report view and template code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;signature report code and template code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;crontabber job code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;any scripts that used the data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tests -- many of which had bad test data so who knows what they were really
testing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Naive handling of minidump stackwalker output meant that any changes in
the stackwalker output were predominantly unnoticed, and there was no indication
as to whether changed output created issues in the system.&lt;/p&gt;
&lt;p&gt;Further, since it was all over the place, there were no guarantees for data
validity when downloading it using the RawCrash, ProcessedCrash, and
SuperSearch APIs. Anyone writing downstream systems would also have to
normalize and validate the data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Poor permissions management&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Permissions were defined in multiple places:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Elasticsearch json redactor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Super Search fields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RawCrash API allow list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ProcessedCrash API allow list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;report view and template code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Telemetry crash storage code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and other places&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We couldn't effectively manage the permissions of fields in the stackwalker output
because we had no idea what was there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Poor documentation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No documentation of crash annotation fields other than &lt;cite&gt;CrashAnnotations.yaml&lt;/cite&gt;,
which didn't enforce anything in crash ingestion (process, valid type, data
correctness, etc.) and was missing important information like data gotchas,
data review URLs, and examples.&lt;/p&gt;
&lt;p&gt;No documentation of processed crash fields at all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Making changes was high risk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Changing fields from public to protected was high risk because you had to
find all the places it might show up which was intractable. Adding support
for new fields often took multiple passes over several weeks because we'd
miss things. Server errors happened with some regularity due to weirdness with
crash annotation values affecting the Crash Stats site.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tangled concerns across the codebase&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lots of tangled concerns where things defined in one place affected other
places that shouldn't be related. For example, the Super Search fields
definition was acting as a "schema" for other parts of the system that had
nothing to do with Elasticsearch or Super Search.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Difficult to maintain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It was difficult to support new products.&lt;/p&gt;
&lt;p&gt;It was difficult to debug issues in crash ingestion and crash reporting.&lt;/p&gt;
&lt;p&gt;The Crash Stats web app contained lots of if/then/else bits to handle
weirdness in the crash annotation values. Nulls, incorrect types, different
structures, etc.&lt;/p&gt;
&lt;p&gt;Socorro contained lots of vestigial code from half-done field removal,
deprecated fields, fields that were removed from crash reports, etc. These
vestigial bits were all over the code base. Discovering and removing these
bits was time consuming and error prone.&lt;/p&gt;
&lt;p&gt;The code for exporting data to Telemetry built the export data using a list
of fields to &lt;em&gt;exclude&lt;/em&gt; rather than a list of fields to &lt;em&gt;include&lt;/em&gt;. This is
backward and impossible to maintain—we never should have been doing this.
Further, it pulled data from the raw crash, for which we had no validation
guarantees, which would cause issues downstream in the Telemetry import
code.&lt;/p&gt;
&lt;p&gt;There was no way to validate the data used in the unit tests, which meant that
a lot of it was invalid. We had no way to validate the test data, which meant
that CI would pass, but we'd see errors in our stage and production
environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Different from other similar systems&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In 2020, Socorro was moved to the Data Org in Mozilla which had a set of
standards and conventions for collecting, storing, analyzing, and providing
access to data. Socorro didn't follow any of it, which made it difficult to
work on, to connect with, and to staff. Things the Data Org has that Socorro
didn't:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;a schema covering specifying fields, types, and documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;data flow documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;data review policy, process, and artifacts for data being collected and
how to add new data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a data dictionary for fields for users including documentation, data review
URLs, and data gotchas&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary, we had a system that took a lot of effort to maintain, wasn't
serving our users' needs, and was at high risk of a security/data breach.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="project-plan"&gt;
&lt;h2&gt;Project plan&lt;/h2&gt;
&lt;p&gt;Many of these issues can be alleviated and reduced by moving to a
schema-driven system where we:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;define a schema for annotations and a schema for the processed crash&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;change crash ingestion and the Crash Stats site to use those schemas&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When designing this schema-driven system, we should be thinking about:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;how easy is it to maintain the system?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how easy is it to explain?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how flexible is it for solving other kinds of problems in the future?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;what kinds of errors will likely happen when maintaining the system, and how
can we avert them in CI?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;what kinds of errors can happen and how much risk do they pose for data
leaks? what of those can we avert in CI?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how flexible is the system, which needs to support multiple products
potentially with different needs?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I worked out a minimal version of that vision that we could migrate to and then
work with going forward.&lt;/p&gt;
&lt;p&gt;The crash annotations schema should define:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;what annotations are in the crash report?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;which permissions are required to view a field&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;field documentation (provenance, description, data review, related bugs,
gotchas, analysis tips, etc)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The processed crash schema should define:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;what's in the processed crash?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;which permissions are required to view a field&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;field documentation (provenance, description, related bugs, gotchas,
analysis tips, etc)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then we make the following changes to the system:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;write a processor rule to copy, normalize, and validate data from
the raw crash based on the processed crash schema&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch the Telemetry export code to using the processed crash for
data to export&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch the Telemetry export code to using the processed crash schema
for permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch Super Search to using the processed crash for data to index&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch Super Search to using the processed crash schema for documentation
and permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch the Crash Stats site to using the processed crash for data to render&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch the Crash Stats site to using the processed crash schema for
documentation and permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch the RawCrash, ProcessedCrash, and SuperSearch APIs to using the crash
annotations and processed crash schemas for documentation and permissions&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After doing that, we have:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;field documentation is managed in the schemas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions are managed in the schemas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;data is normalized and validated once in the processor and everything
uses the processed crash data for indexing, searching, and rendering&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adding support for new fields and changing existing fields is easier and
problems are caught in CI&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="implementation-decisions"&gt;
&lt;h2&gt;Implementation decisions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Use JSON Schema.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Data Org at Mozilla uses JSON Schema for schema specification. The schema is
written using YAML.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://mozilla.github.io/glean_parser/metrics-yaml.html"&gt;https://mozilla.github.io/glean_parser/metrics-yaml.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The metrics schema is used to define &lt;code class="docutils literal"&gt;metrics.yaml&lt;/code&gt; files which specify the
metrics being emitted and collected.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://searchfox.org/mozilla-central/source/toolkit/mozapps/update/metrics.yaml"&gt;https://searchfox.org/mozilla-central/source/toolkit/mozapps/update/metrics.yaml&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One long-term goal for Socorro is to unify standards and practices
with the Data Ingestion system. Towards that goal, it's prudent to build out a
crash annotation and processed crash schemas using whatever we can take from
the equivalent metrics schemas.&lt;/p&gt;
&lt;p&gt;We'll also need to build out tooling for verifying, validating, and
testing schema modifications to make ongoing maintenance easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use schemas to define and drive everything.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We've got permissions, structures, normalization, validation, definition,
documentation, and several other things related to the data and how it's used
throughout crash ingestion spread out across the codebase.&lt;/p&gt;
&lt;p&gt;Instead of that, let's pull it all together into a single schema and change the
system to be driven from this schema.&lt;/p&gt;
&lt;p&gt;The schema will include:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;structure specification&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;documentation including data gotchas, examples, and implementation details&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;processing instructions&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We'll have a schema for supported annotations and a schema for the processed
crash.&lt;/p&gt;
&lt;p&gt;We'll rewrite existing parts of crash ingestion to use the schema:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;processing&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;use processing instructions to validate and normalize annotation data&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;super search&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;field documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove all the normalization and validation code from indexing&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;crash stats&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;field documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove all the normalization and validation code from page rendering&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Only use processed crash data for indexing and analysis.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The indexing system has its own normalization and validation code since it
pulls data to be indexed from the raw crash.&lt;/p&gt;
&lt;p&gt;The crash stats code has its own normalization and validation code since it
renders data from the raw crash in various parts of the site.&lt;/p&gt;
&lt;p&gt;We're going to change this so that all normalization and validation happens
during processing, the results are stored in the processed crash, and indexing,
searching, and crash analysis only work on processed crash data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By default, all data is protected.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By default, all data is protected unless it is &lt;em&gt;explicitly&lt;/em&gt; marked as public.
This has some consequences for the code:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;any data not specified in a schema is treated as protected&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;all schema fields need to specify permissions for that field&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;any data in a schema is either:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;marked public, OR&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lists the permissions required to view that data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for nested structures, any child field that is public has public ancestors&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We can catch some of these issues in CI and need to write tests to verify them.&lt;/p&gt;
&lt;p&gt;This is slightly awkward when maintaining the schema because it would be more
reasonable to have "no permissions required" mean that the field is public.
However, it's possible to accidentally not specify the permissions, and we don't
want to be in that situation. Thus, we decided to go with explicitly marking
public fields as public.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-done"&gt;
&lt;h2&gt;Work done&lt;/h2&gt;
&lt;section id="phase-1-cleaning-up"&gt;
&lt;h3&gt;Phase 1: cleaning up&lt;/h3&gt;
&lt;p&gt;We had a lot of work to do before we could start defining schemas and changing
the system to use those schemas.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;remove vestigial code (some of this work was done in other phases as it was
discovered)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1724933"&gt;[bug 1724933]&lt;/a&gt;: remove unused/obsolete annotations (2021-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1743487"&gt;[bug 1743487]&lt;/a&gt;: remove &lt;code class="docutils literal"&gt;total_frames&lt;/code&gt; (2021-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1743704"&gt;[bug 1743704]&lt;/a&gt;: remove jit crash classifier (2022-02)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1762000"&gt;[bug 1762000]&lt;/a&gt;: remove vestigial &lt;code class="docutils literal"&gt;Winsock_LSP&lt;/code&gt; code (2022-03)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1784485"&gt;[bug 1784485]&lt;/a&gt;: remove vestigial &lt;code class="docutils literal"&gt;exploitability&lt;/code&gt; code (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1784095"&gt;[bug 1784095]&lt;/a&gt;: remove vestigial &lt;code class="docutils literal"&gt;contains_memory_report&lt;/code&gt; code (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787933"&gt;[bug 1787933]&lt;/a&gt;: exorcise flash things from the codebase (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix signature generation&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1753521"&gt;[bug 1753521]&lt;/a&gt;: use fields from processed crash (2022-02)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1755523"&gt;[bug 1755523]&lt;/a&gt;: fix signature generation so it only uses processed crash data (2022-02)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1762207"&gt;[bug 1762207]&lt;/a&gt;: remove &lt;code class="docutils literal"&gt;hang_type&lt;/code&gt; (2022-04)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix Super Search&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1624345"&gt;[bug 1624345]&lt;/a&gt;: stop saving random data to Elasticsearch crashstorage (2020-06)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1706076"&gt;[bug 1706076]&lt;/a&gt;: remove dead Super Search fields (2021-04)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1712055"&gt;[bug 1712055]&lt;/a&gt;: remove &lt;code class="docutils literal"&gt;system_error&lt;/code&gt; from Super Search fields (2021-07)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1712085"&gt;[bug 1712085]&lt;/a&gt;: remove obsolete Super Search fields (2021-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1697051"&gt;[bug 1697051]&lt;/a&gt;: add &lt;code class="docutils literal"&gt;crash_report_keys&lt;/code&gt; field (2021-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1736928"&gt;[bug 1736928]&lt;/a&gt;: remove &lt;code class="docutils literal"&gt;largest_free_vm_block&lt;/code&gt; and &lt;code class="docutils literal"&gt;tiny_block_size&lt;/code&gt; (2021-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1754874"&gt;[bug 1754874]&lt;/a&gt;: remove unused annotations from Super Search (2022-02)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1753521"&gt;[bug 1753521]&lt;/a&gt;: stop indexing items from raw crash (2022-02)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1762005"&gt;[bug 1762005]&lt;/a&gt;: migrate to lower-cased versions of &lt;code class="docutils literal"&gt;Plugin*&lt;/code&gt; fields in
processed crash (2022-03)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1755528"&gt;[bug 1755528]&lt;/a&gt;: fix flag/boolean handling (2022-03)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1762207"&gt;[bug 1762207]&lt;/a&gt;: remove &lt;code class="docutils literal"&gt;hang_type&lt;/code&gt; (2022-04)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1763264"&gt;[bug 1763264]&lt;/a&gt;: clean up super search fields from migration (2022-07)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix data flow and usage&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1740397"&gt;[bug 1740397]&lt;/a&gt;: rewrite &lt;code class="docutils literal"&gt;CrashingThreadInfoRule&lt;/code&gt; to normalize crashing thread (2021-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1755095"&gt;[bug 1755095]&lt;/a&gt;: fix &lt;code class="docutils literal"&gt;TelemetryBotoS3CrashStorage&lt;/code&gt; so it doesn't use Super Search fields (2022-03)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1740397"&gt;[bug 1740397]&lt;/a&gt;: change webapp to pull &lt;code class="docutils literal"&gt;crashing_thread&lt;/code&gt; from processed crash (2022-07)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1710725"&gt;[bug 1710725]&lt;/a&gt;: stop using &lt;code class="docutils literal"&gt;DotDict&lt;/code&gt; for raw and processed data (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;clean up the raw crash structure&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1687987"&gt;[bug 1687987]&lt;/a&gt;: restructure raw crash (2021-01 through 2022-10)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="phase-2-define-schemas-and-all-the-tooling-we-needed-to-work-with-them"&gt;
&lt;h3&gt;Phase 2: define schemas and all the tooling we needed to work with them&lt;/h3&gt;
&lt;p&gt;After cleaning up the code base, removing vestigial code, fixing Super Search,
and fixing Telemetry export code, we could move on to defining schemas and
writing all the code we needed to maintain the schemas and work with them.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1762271"&gt;[bug 1762271]&lt;/a&gt;: rewrite json schema reducer (2022-03)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1764395"&gt;[bug 1764395]&lt;/a&gt;: schema for processed crash, reducers, traversers (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1788533"&gt;[bug 1788533]&lt;/a&gt;: fix &lt;code class="docutils literal"&gt;validate_processed_crash&lt;/code&gt; to handle
&lt;code class="docutils literal"&gt;pattern_properties&lt;/code&gt; (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1626698"&gt;[bug 1626698]&lt;/a&gt;: schema for crash annotations in crash reports (2022-11)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="phase-3-fix-everything-to-use-the-schemas"&gt;
&lt;h3&gt;Phase 3: fix everything to use the schemas&lt;/h3&gt;
&lt;p&gt;That allowed us to fix a bunch of things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1784927"&gt;[bug 1784927]&lt;/a&gt;: remove elasticsearch redactor code (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1746630"&gt;[bug 1746630]&lt;/a&gt;: support new &lt;code class="docutils literal"&gt;threads.N.frames.N.unloaded_modules&lt;/code&gt;
minidump-stackwalk fields (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1697001"&gt;[bug 1697001]&lt;/a&gt;: get rid of UnredactedCrash API and model (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1100352"&gt;[bug 1100352]&lt;/a&gt;: remove hard-coded allow lists from RawCrash  (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787929"&gt;[bug 1787929]&lt;/a&gt;: rewrite &lt;code class="docutils literal"&gt;Breadcrumbs&lt;/code&gt; validation (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787931"&gt;[bug 1787931]&lt;/a&gt;: fix Super Search fields to pull permissions from processed
crash schema (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787937"&gt;[bug 1787937]&lt;/a&gt;: fix Super Search fields to pull documentation from processed
crash schema (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787931"&gt;[bug 1787931]&lt;/a&gt;: use processed crash schema permissions for super search (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1100352"&gt;[bug 1100352]&lt;/a&gt;: remove hard-coded allow lists from ProcessedCrash models (2022-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1792255"&gt;[bug 1792255]&lt;/a&gt;: add telemetry_environment to processed crash (2022-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1784558"&gt;[bug 1784558]&lt;/a&gt;: add collector metadata to processed crash (2022-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787932"&gt;[bug 1787932]&lt;/a&gt;: add data review urls for crash annotations that have data reviews (2022-11)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="phase-4-improve"&gt;
&lt;h3&gt;Phase 4: improve&lt;/h3&gt;
&lt;p&gt;With fields specified in schemas, we can write a crash reporting data
dictionary:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1803558"&gt;[bug 1803558]&lt;/a&gt;: crash reporting data dictionary (2023-01)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1795700"&gt;[bug 1795700]&lt;/a&gt;: document raw and processed schemas and how to maintain them
(2023-01)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then we can finish:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1677143"&gt;[bug 1677143]&lt;/a&gt;: documenting analysis gotchas (ongoing)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1755525"&gt;[bug 1755525]&lt;/a&gt;: fixing the report view to only use the processed crash (future)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1795699"&gt;[bug 1795699]&lt;/a&gt;: validate test data (future)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="random-thoughts"&gt;
&lt;h2&gt;Random thoughts&lt;/h2&gt;
&lt;p&gt;This was a very very long-term project with many small steps and some really
big ones. Getting large projects done is futile and the only way to do it
successfully is to break it into a million small steps each of which stand on
their own and don't create urgency for getting the next step done.&lt;/p&gt;
&lt;p&gt;Any time I changed field names or types, I'd have to do a data migration. Data
migrations take 6 months to do because I have to wait for existing data to
expire from storage. On the one hand, it's a blessing I could do migrations at
all--you can't do this with larger data sets or with data sets where the data
doesn't expire without each migration becoming a huge project. On the other
hand, it's hard to juggle being in the middle of multiple migrations and
sometimes the contortions one has to perform are grueling.&lt;/p&gt;
&lt;p&gt;If you're working on a big project that's going to require changing data
structures, figure out how to do migrations early with as little work as
possible and use that process as often as you can.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="conclusion-and-where-we-could-go-from-here"&gt;
&lt;h2&gt;Conclusion and where we could go from here&lt;/h2&gt;
&lt;p&gt;This was such a huge project that spanned years. It's so hard to finish
projects like this because the landscape for the project is constantly
changing. Meanwhile, being mid-project has its own set of complexities and
hardships.&lt;/p&gt;
&lt;p&gt;I'm glad I tackled it and I'm glad it's mostly done. There are some minor
things to do, still, but this new schema-driven system has a lot going for it.
Adding support for new crash annotations is much easier, less risky, and takes
less time.&lt;/p&gt;
&lt;p&gt;It took me about a month to pull this post together.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="that-s-it"&gt;
&lt;h2&gt;That's it!&lt;/h2&gt;
&lt;p&gt;That's the story of the schema-based overhaul of crash ingestion. There's
probably some bits missing and/or wrong, but the gist of it is here.&lt;/p&gt;
&lt;p&gt;If you have any questions or bump into bugs, I hang out on &lt;code class="docutils literal"&gt;#crashreporting&lt;/code&gt; on
&lt;code class="docutils literal"&gt;chat.mozilla.org&lt;/code&gt;. You can also write up a &lt;a class="reference external" href="https://bugzilla.mozilla.org/enter_bug.cgi?format=__standard__&amp;amp;product=Socorro"&gt;bug for Socorro&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hopefully this helps. If not, let us know!&lt;/p&gt;
&lt;/section&gt;</description><category>dev</category><category>mozilla</category><category>python</category><category>retrospective</category><category>socorro</category><category>story</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/socorro_schema_based_overhaul.html</guid><pubDate>Wed, 18 Jan 2023 18:00:00 GMT</pubDate></item><item><title>Volunteer Responsibility Amnesty Day: December 2022</title><link>https://bluesock.org/~willkg/blog/dev/vrad_2022_12.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;p&gt;Today is &lt;a class="reference external" href="https://www.volunteeramnestyday.net/"&gt;Volunteer Responsibility Amnesty Day&lt;/a&gt; where I spend some time taking stock
of things and maybe move some projects to the done pile.&lt;/p&gt;
&lt;p&gt;In June, I ran a
&lt;a class="reference external" href="https://bluesock.org/~willkg/blog/mozilla/volunteer_responsibility_amnesty_day_2022_06.html"&gt;Volunteer Responsibility Amnesty Day&lt;/a&gt; &lt;a class="brackets" href="https://bluesock.org/~willkg/blog/dev/vrad_2022_12.html#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;
for Mozilla Data Org because the idea really struck a chord with me and we were
about to embark on 2022h2 where one of the goals was to "land planes" and finish
projects. I managed to pass off &lt;a class="reference external" href="https://github.com/mozilla/dennis"&gt;Dennis&lt;/a&gt;
and end &lt;a class="reference external" href="https://github.com/willkg/puente"&gt;Puente&lt;/a&gt;. I also spent some time
mulling over better models for maintaining a lot of libraries.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://bluesock.org/~willkg/blog/dev/vrad_2022_12.html#footnote-reference-1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;I gave the post an exceedingly long slug. I wish I had thought about
future me typing that repeatedly and made it shorter like I did this time
around.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;p&gt;This time around, I'm just organizing myself.&lt;/p&gt;
&lt;p&gt;Here's the list of things I'm maintaining in some way that aren't the big
services that I work on:&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/mozilla/bleach"&gt;bleach&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Bleach is an allowed-list-based HTML sanitizing Python library.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;no&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;more on this next year&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/willkg/everett"&gt;everett&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Python configuration library.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;yes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;keep on keepin on&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/willkg/markus"&gt;markus&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Python metrics library.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;yes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;keep on keepin on&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/willkg/fillmore"&gt;fillmore&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Python library for scrubbing Sentry events.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;yes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;keep on keepin on&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/willkg/kent"&gt;kent&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Fake Sentry server for local development.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;yes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;keep on keepin on, but would be happy to pass this off&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/mozilla/sphinx-js"&gt;sphinx-js&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Sphinx extension for documenting JavaScript and TypeScript.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;co-maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;yes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;keep on keepin on&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/willkg/crashstats-tools"&gt;crashstats-tools&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Command line utilities for interacting with &lt;a class="reference external" href="https://crash-stats.mozilla.org"&gt;Crash Stats&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;yes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;keep on keepin on&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/willkg/paul-mclendahand"&gt;paul-mclendahand&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Utility for combining GitHub pull requests.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;yes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;keep on keepin on&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://addons.mozilla.org/en-US/firefox/addon/rob-bugson/"&gt;rob-bugson&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Firefox addon for attaching GitHub pull requests to Bugzilla.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;yes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;keep on keepin on&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/mozilla/fx-crash-sig"&gt;fx-crash-sig&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Python library for symbolicating stacks and generating crash signatures.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maybe&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;keep on keepin on for now, but figure out a better long term plan&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/willkg/socorro-siggen"&gt;siggen&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Python library for generating crash signatures.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maintainer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;yes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;keep on keepin on&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a class="reference external" href="https://github.com/mozilla/mozilla-django-oidc"&gt;mozilla-django-oidc&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="field-list simple"&gt;
&lt;dt&gt;what is it&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Django OpenID Connect library.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;role&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;contributor (I maintain &lt;a class="reference external" href="https://github.com/mozilla/docker-test-mozilla-django-oidc"&gt;docker-test-mozilla-django-oidc&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;keep doing&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;maybe&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;next step&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;think about dropping this at some point&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;That's too many things. I need to pare the list down. There are a few I could
probably sunset, but not any time soon.&lt;/p&gt;
&lt;p&gt;I'm also thinking about a maintenance model where I'm squishing it all into a
burst of activity for all the libraries around some predictable event like
Python major releases.&lt;/p&gt;
&lt;p&gt;I tried that out this fall and did a release of everything except Bleach (more
on that next year) and rob-bugson which is a Firefox addon. I think I'll do
that going forward. I need to document it somewhere so as to avoid the
pestering of "Is this project active?" issues. I'll do that next year.&lt;/p&gt;</description><category>dev</category><category>mozilla</category><category>python</category><category>work</category><guid>https://bluesock.org/~willkg/blog/dev/vrad_2022_12.html</guid><pubDate>Wed, 21 Dec 2022 12:59:45 GMT</pubDate></item></channel></rss>