<?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</title><link>https://bluesock.org/~willkg/blog/</link><description>Will Kahn-Greene's blog of Python, Mozilla, random content, personal projects, work projects, and other things mixed in there ad hoc, half-baked, and with a twist of lemon</description><atom:link href="https://bluesock.org/~willkg/blog/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:willkg@bluesock.org"&gt;Will Kahn-Greene&lt;/a&gt; CC BY-SA 3.0</copyright><lastBuildDate>Fri, 05 Jun 2026 13:53:59 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Bleach 6.4.0 releases -- final release</title><link>https://bluesock.org/~willkg/blog/dev/bleach_6_4_0_final_release.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-4-0-released"&gt;
&lt;h2&gt;Bleach v6.4.0 released!&lt;/h2&gt;
&lt;p&gt;Bleach 6.4.0 includes two security fixes, a fix to tinycss2 dependency
requirements, and some other things.&lt;/p&gt;
&lt;p&gt;See the changes here:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bleach.readthedocs.io/en/latest/changes.html#version-6-4-0-june-5th-2026"&gt;https://bleach.readthedocs.io/en/latest/changes.html#version-6-4-0-june-5th-2026&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="bleach-v6-4-0-is-the-final-release"&gt;
&lt;h2&gt;Bleach v6.4.0 is the final release&lt;/h2&gt;
&lt;p&gt;I haven't used Bleach on a project in years, but I still had some time to
maintain it. That changed about a year ago when I got re-orged into a new role
and I haven't had time to do any Bleach work since then.&lt;/p&gt;
&lt;p&gt;To recap, Bleach sits on top of
&lt;a class="reference external" href="https://github.com/html5lib/html5lib-python"&gt;html5lib&lt;/a&gt; which hasn't
been actively maintained in years. It is dangerous to maintain Bleach in that
context.&lt;/p&gt;
&lt;p&gt;We vendored html5lib so we could make adjustments to the library to keep Bleach
going. This is not a sustainable approach, but it was ok for the short term.&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;None of those are feasible for me.&lt;/p&gt;
&lt;p&gt;Bleach has been a solo-maintained project for a while now. The world is crazy
and it's much harder to build a team of trusted maintainers now than it was (or
at least, it sure feels that way). I don't see any possibility of increasing
the maintenance team or passing it to someone else responsibly.&lt;/p&gt;
&lt;p&gt;Switching contexts from my regular work to Bleach is really hard. Bleach is
complicated, the problem domain is complicated, and there's a lot of nuanced
context. I can't just switch gears, spend 15 minutes on Bleach to do something,
and then switch back to the rest of my day. I periodically get nag messages
about this which are entirely valid, but there's nothing I can do about it.
It doesn't feel great.&lt;/p&gt;
&lt;p&gt;Then in 2025, Emil, a long-time Bleach contributor, built
&lt;a class="reference external" href="https://emilstenstrom.github.io/justhtml/"&gt;justhtml&lt;/a&gt; which gives us an easy
migration path off of Bleach. He even took the time to write a
&lt;a class="reference external" href="https://emilstenstrom.github.io/justhtml/bleach-migration.html"&gt;migration guide&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="thoughts-and-statistics"&gt;
&lt;h2&gt;Thoughts and statistics&lt;/h2&gt;
&lt;p&gt;In 2019, when I stepped down the first time, I wrote
&lt;a class="reference external" href="https://bluesock.org/~willkg/blog/dev/bleach_stepping_down.html"&gt;a post on stepping down&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In 2023, when I deprecated the project, I wrote
&lt;a class="reference external" href="https://bluesock.org/~willkg/blog/dev/bleach_6_0_0_deprecation.html"&gt;a post on Bleach 6.0.0 and deprecation&lt;/a&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;From the first commit on 2010-02-18 to today's final commit on 2026-06-05,
the Bleach project lasted 16 years, 3 months — 5,951 days, or about 16.29
years.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There were 64 releases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There were roughly 960 commits.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;From 80 roughly contributors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Top 3:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Will Kahn-Greene: 462&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;James Socol: 182&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Greg Guthe: 133&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Roughly 5,040 lines of Python code excluding the vendored html5lib.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I was maintainer from October 2015 to now--that's a little under 11 years.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It feels weird to end a project that's outlived many of the Mozilla sites and
Python web frameworks it was designed to protect.&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;This is the end of the project.&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. Last release.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you're still using Bleach, I think you have three options:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;End your project.&lt;/strong&gt; Maybe you don't need to be maintaining your thing
anymore? Use Bleach as your reason to exit and do something different with
your time on Earth.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Switch to the sanitizer API.&lt;/strong&gt; Rework your project to use the sanitizer API.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Spec: &lt;a class="reference external" href="https://wicg.github.io/sanitizer-api/"&gt;https://wicg.github.io/sanitizer-api/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docs: &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/Element/setHTML"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Element/setHTML&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Swap Bleach out for justhtml.&lt;/strong&gt; Emil provided a
&lt;a class="reference external" href="https://emilstenstrom.github.io/justhtml/bleach-migration.html"&gt;migration guide&lt;/a&gt;
for switching from Bleach to justhtml.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Good luck with whatever option you choose!&lt;/p&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/jsocol"&gt;James&lt;/a&gt; who created Bleach and
gave it a set of first principles that guided our choices for 16 years.&lt;/p&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/EmilStenstrom"&gt;Emil&lt;/a&gt; who was
a contributor to Bleach for a long while and created
&lt;a class="reference external" href="https://emilstenstrom.github.io/justhtml/"&gt;justhtml&lt;/a&gt;
providing Bleach users a migration path.&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;p&gt;Many thanks to all the users and contributors of Bleach!&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-4-0-june-5th-2026"&gt;https://bleach.readthedocs.io/en/latest/changes.html#version-6-4-0-june-5th-2026&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_4_0_final_release.html</guid><pubDate>Fri, 05 Jun 2026 13:00:00 GMT</pubDate></item><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>Switching from pyenv to uv</title><link>https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;section id="premise"&gt;
&lt;h2&gt;Premise&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://astral.sh/blog/uv-unified-python-packaging"&gt;0.4.0 release of uv&lt;/a&gt;
does everything I currently do with pip, pyenv, pipx, pip-tools, and
pipdeptree. Because of that, I'm in the process of switching to uv.&lt;/p&gt;
&lt;p&gt;This blog post covers switching from pyenv to uv.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="history"&gt;
&lt;h2&gt;History&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2024-08-29: Initial writing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2024-09-12: Minor updates and publishing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2024-09-20: Rename uv-sync (which is confusing) to uv-python-symlink.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="start-state"&gt;
&lt;h2&gt;Start state&lt;/h2&gt;
&lt;p&gt;I'm running Ubuntu Linux 24.04. I have pyenv installed using the
&lt;a class="reference external" href="https://github.com/pyenv/pyenv?tab=readme-ov-file#automatic-installer"&gt;the automatic installer&lt;/a&gt;.
pyenv is located in &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;$HOME/.pyenv/bin/&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I have the following Pythons installed with pyenv:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code shell"&gt;&lt;a id="rest_code_f32946bc19af42d2beeabc97cf6a540a-1" name="rest_code_f32946bc19af42d2beeabc97cf6a540a-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_f32946bc19af42d2beeabc97cf6a540a-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;versions
&lt;a id="rest_code_f32946bc19af42d2beeabc97cf6a540a-2" name="rest_code_f32946bc19af42d2beeabc97cf6a540a-2" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_f32946bc19af42d2beeabc97cf6a540a-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;system
&lt;a id="rest_code_f32946bc19af42d2beeabc97cf6a540a-3" name="rest_code_f32946bc19af42d2beeabc97cf6a540a-3" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_f32946bc19af42d2beeabc97cf6a540a-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.7.17
&lt;a id="rest_code_f32946bc19af42d2beeabc97cf6a540a-4" name="rest_code_f32946bc19af42d2beeabc97cf6a540a-4" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_f32946bc19af42d2beeabc97cf6a540a-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.8.19
&lt;a id="rest_code_f32946bc19af42d2beeabc97cf6a540a-5" name="rest_code_f32946bc19af42d2beeabc97cf6a540a-5" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_f32946bc19af42d2beeabc97cf6a540a-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.9.19
&lt;a id="rest_code_f32946bc19af42d2beeabc97cf6a540a-6" name="rest_code_f32946bc19af42d2beeabc97cf6a540a-6" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_f32946bc19af42d2beeabc97cf6a540a-6"&gt;&lt;/a&gt;*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.10.14&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;by&lt;span class="w"&gt; &lt;/span&gt;/home/willkg/mozilla/everett/.python-version&lt;span class="o"&gt;)&lt;/span&gt;
&lt;a id="rest_code_f32946bc19af42d2beeabc97cf6a540a-7" name="rest_code_f32946bc19af42d2beeabc97cf6a540a-7" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_f32946bc19af42d2beeabc97cf6a540a-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.11.9
&lt;a id="rest_code_f32946bc19af42d2beeabc97cf6a540a-8" name="rest_code_f32946bc19af42d2beeabc97cf6a540a-8" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_f32946bc19af42d2beeabc97cf6a540a-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.12.3
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I'm not sure why I have 3.7 still installed. I don't think I use that for
anything.&lt;/p&gt;
&lt;p&gt;My default version is 3.10.14 for some reason. I'm not sure why I haven't
updated that to 3.12, yet.&lt;/p&gt;
&lt;p&gt;In my 3.10.14, I have the following Python packages installed:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code shell"&gt;&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-1" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;freeze
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-2" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-2" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-2"&gt;&lt;/a&gt;&lt;span class="nv"&gt;appdirs&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.4.4
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-3" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-3" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-3"&gt;&lt;/a&gt;&lt;span class="nv"&gt;argcomplete&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.1.1
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-4" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-4" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-4"&gt;&lt;/a&gt;&lt;span class="nv"&gt;attrs&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;.2.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-5" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-5" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-5"&gt;&lt;/a&gt;&lt;span class="nv"&gt;cffi&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.15.1
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-6" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-6" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-6"&gt;&lt;/a&gt;&lt;span class="nv"&gt;click&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.1.3
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-7" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-7" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-7"&gt;&lt;/a&gt;&lt;span class="nv"&gt;colorama&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.4.6
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-8" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-8" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-8"&gt;&lt;/a&gt;&lt;span class="nv"&gt;diskcache&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.4.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-9" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-9" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-9"&gt;&lt;/a&gt;&lt;span class="nv"&gt;distlib&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.3.8
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-10" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-10" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-10"&gt;&lt;/a&gt;&lt;span class="nv"&gt;distro&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.8.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-11" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-11" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-11"&gt;&lt;/a&gt;&lt;span class="nv"&gt;filelock&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.14.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-12" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-12" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-12"&gt;&lt;/a&gt;glean-parser&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.1.1
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-13" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-13" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-13"&gt;&lt;/a&gt;glean-sdk&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;50&lt;/span&gt;.1.4
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-14" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-14" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-14"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Jinja2&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.1.2
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-15" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-15" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-15"&gt;&lt;/a&gt;&lt;span class="nv"&gt;jsonschema&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.17.3
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-16" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-16" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-16"&gt;&lt;/a&gt;&lt;span class="nv"&gt;MarkupSafe&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.0.1
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-17" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-17" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-17"&gt;&lt;/a&gt;&lt;span class="nv"&gt;MozPhab&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.5.1
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-18" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-18" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-18"&gt;&lt;/a&gt;&lt;span class="nv"&gt;packaging&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;24&lt;/span&gt;.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-19" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-19" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-19"&gt;&lt;/a&gt;&lt;span class="nv"&gt;pathspec&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.11.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-20" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-20" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-20"&gt;&lt;/a&gt;&lt;span class="nv"&gt;pbr&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-21" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-21" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-21"&gt;&lt;/a&gt;&lt;span class="nv"&gt;pipx&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.5.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-22" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-22" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-22"&gt;&lt;/a&gt;&lt;span class="nv"&gt;platformdirs&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.2.1
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-23" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-23" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-23"&gt;&lt;/a&gt;&lt;span class="nv"&gt;pycparser&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.21
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-24" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-24" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-24"&gt;&lt;/a&gt;&lt;span class="nv"&gt;pyrsistent&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.19.3
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-25" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-25" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-25"&gt;&lt;/a&gt;python-hglib&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.6.2
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-26" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-26" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-26"&gt;&lt;/a&gt;&lt;span class="nv"&gt;PyYAML&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-27" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-27" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-27"&gt;&lt;/a&gt;sentry-sdk&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.16.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-28" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-28" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-28"&gt;&lt;/a&gt;&lt;span class="nv"&gt;stevedore&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.2.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-29" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-29" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-29"&gt;&lt;/a&gt;&lt;span class="nv"&gt;tomli&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.0.1
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-30" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-30" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-30"&gt;&lt;/a&gt;&lt;span class="nv"&gt;userpath&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.8.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-31" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-31" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-31"&gt;&lt;/a&gt;&lt;span class="nv"&gt;virtualenv&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;.26.2
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-32" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-32" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-32"&gt;&lt;/a&gt;virtualenv-clone&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.5.7
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-33" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-33" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-33"&gt;&lt;/a&gt;&lt;span class="nv"&gt;virtualenvwrapper&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.1.0
&lt;a id="rest_code_473a4e17cd5e41d1887262a00743fd7d-34" name="rest_code_473a4e17cd5e41d1887262a00743fd7d-34" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_473a4e17cd5e41d1887262a00743fd7d-34"&gt;&lt;/a&gt;&lt;span class="nv"&gt;yamllint&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.29.0
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That probably means I installed the following in the Python 3.10.14 Python
environment:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;MozPhab&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pipx&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;virtualenvwrapper&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maybe I installed some other things for some reason lost in the sands of time.&lt;/p&gt;
&lt;p&gt;Then I had a whole bunch of things installed with pipx.&lt;/p&gt;
&lt;p&gt;I have many open source projects all of which have a &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;.python-version&lt;/span&gt;&lt;/code&gt; file
listing the Python versions the project uses.&lt;/p&gt;
&lt;p&gt;I think that covers the start state.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="steps"&gt;
&lt;h2&gt;Steps&lt;/h2&gt;
&lt;p&gt;First, I made a list of things I had.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I listed all the versions of Python I have installed so I know what I need
to reinstall with uv.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_751c34c6c9a44fa2b9216b77a4f7c26b-1" name="rest_code_751c34c6c9a44fa2b9216b77a4f7c26b-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_751c34c6c9a44fa2b9216b77a4f7c26b-1"&gt;&lt;/a&gt;$ pyenv versions
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I listed all the packages I have installed in my 3.10.14 environment (the
default one).&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_a061cbb7bbd94e49a92ab61aaa0e9cd2-1" name="rest_code_a061cbb7bbd94e49a92ab61aaa0e9cd2-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_a061cbb7bbd94e49a92ab61aaa0e9cd2-1"&gt;&lt;/a&gt;$ pip freeze
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I listed all the packages I installed with pipx.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_0e76c93cbca447008a5d24edb3951104-1" name="rest_code_0e76c93cbca447008a5d24edb3951104-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_0e76c93cbca447008a5d24edb3951104-1"&gt;&lt;/a&gt;$ pipx list
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I uninstalled all the packages I installed with pipx.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code shell"&gt;&lt;a id="rest_code_5ffd514b15044440b0462c44cd981c61-1" name="rest_code_5ffd514b15044440b0462c44cd981c61-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_5ffd514b15044440b0462c44cd981c61-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;pipx&lt;span class="w"&gt; &lt;/span&gt;uninstall&lt;span class="w"&gt; &lt;/span&gt;PACKAGE
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I uninstalled pyenv and everything it uses. I followed the
&lt;a class="reference external" href="https://github.com/pyenv/pyenv?tab=readme-ov-file#uninstalling-pyenv"&gt;pyenv uninstall instructions&lt;/a&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code shell"&gt;&lt;a id="rest_code_4d5b5af83cfa43529946f214895351f2-1" name="rest_code_4d5b5af83cfa43529946f214895351f2-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_4d5b5af83cfa43529946f214895351f2-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-rf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;root&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I removed the bits in my shell that add to the &lt;code class="docutils literal"&gt;PATH&lt;/code&gt; and set up pyenv
and virtualenvwrapper.&lt;/p&gt;
&lt;p&gt;Then I started a new shell that didn't have all the pyenv and virtualenvwrapper
stuff in it.&lt;/p&gt;
&lt;p&gt;Then I installed uv using the
&lt;a class="reference external" href="https://docs.astral.sh/uv/getting-started/installation/#standalone-installer"&gt;uv standalone installer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then I ran &lt;code class="docutils literal"&gt;uv &lt;span class="pre"&gt;--version&lt;/span&gt;&lt;/code&gt; to make sure it was installed.&lt;/p&gt;
&lt;p&gt;Then I
&lt;a class="reference external" href="https://docs.astral.sh/uv/getting-started/installation/#shell-autocompletion"&gt;installed the shell autocompletion&lt;/a&gt;.&lt;/p&gt;
&lt;aside class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;I have a dotfiles thing and separate out bashrc changes by what changes
them. You can see my home-grown thing that works for me here:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/willkg/dotfiles"&gt;https://github.com/willkg/dotfiles&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These instructions are specific to my home-grown dotfiles thing.&lt;/p&gt;
&lt;/aside&gt;
&lt;div class="code"&gt;&lt;pre class="code shell"&gt;&lt;a id="rest_code_9124c4cb39ea48aa9fd4c1398e313349-1" name="rest_code_9124c4cb39ea48aa9fd4c1398e313349-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_9124c4cb39ea48aa9fd4c1398e313349-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'eval "$(uv generate-shell-completion bash)"'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/dotfiles/bash.d/20-uv.bash
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I started a new shell to pick up those changes.&lt;/p&gt;
&lt;p&gt;Then I installed Python versions:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code shell"&gt;&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-1" name="rest_code_aed69fec8c3a4385871e670de398ef29-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.8&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.9&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.11&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.12
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-2" name="rest_code_aed69fec8c3a4385871e670de398ef29-2" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-2"&gt;&lt;/a&gt;Searching&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;versions&lt;span class="w"&gt; &lt;/span&gt;matching:&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.10
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-3" name="rest_code_aed69fec8c3a4385871e670de398ef29-3" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-3"&gt;&lt;/a&gt;Searching&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;versions&lt;span class="w"&gt; &lt;/span&gt;matching:&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.11
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-4" name="rest_code_aed69fec8c3a4385871e670de398ef29-4" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-4"&gt;&lt;/a&gt;Searching&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;versions&lt;span class="w"&gt; &lt;/span&gt;matching:&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.12
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-5" name="rest_code_aed69fec8c3a4385871e670de398ef29-5" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-5"&gt;&lt;/a&gt;Searching&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;versions&lt;span class="w"&gt; &lt;/span&gt;matching:&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.8
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-6" name="rest_code_aed69fec8c3a4385871e670de398ef29-6" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-6"&gt;&lt;/a&gt;Searching&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;versions&lt;span class="w"&gt; &lt;/span&gt;matching:&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.9
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-7" name="rest_code_aed69fec8c3a4385871e670de398ef29-7" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-7"&gt;&lt;/a&gt;Installed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;versions&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.14s
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-8" name="rest_code_aed69fec8c3a4385871e670de398ef29-8" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-8"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;cpython-3.8.19-linux-x86_64-gnu
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-9" name="rest_code_aed69fec8c3a4385871e670de398ef29-9" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-9"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;cpython-3.9.19-linux-x86_64-gnu
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-10" name="rest_code_aed69fec8c3a4385871e670de398ef29-10" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-10"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;cpython-3.10.14-linux-x86_64-gnu
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-11" name="rest_code_aed69fec8c3a4385871e670de398ef29-11" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-11"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;cpython-3.11.9-linux-x86_64-gnu
&lt;a id="rest_code_aed69fec8c3a4385871e670de398ef29-12" name="rest_code_aed69fec8c3a4385871e670de398ef29-12" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_aed69fec8c3a4385871e670de398ef29-12"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;cpython-3.12.5-linux-x86_64-gnu
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When I type "python", I want it to be a Python managed by uv. Also, I like
having "pythonX.Y" symlinks, so I created a &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;uv-python-symlink-sync&lt;/span&gt;&lt;/code&gt; script
which creates symlinks to uv-managed Python versions:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/willkg/dotfiles/blob/main/dotfiles/bin/uv-python-symlink"&gt;https://github.com/willkg/dotfiles/blob/main/dotfiles/bin/uv-python-symlink&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then I installed all my tools using &lt;code class="docutils literal"&gt;uv tool install&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code shell"&gt;&lt;a id="rest_code_fdb82e515e264672bd83efe2f6fa1efd-1" name="rest_code_fdb82e515e264672bd83efe2f6fa1efd-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_fdb82e515e264672bd83efe2f6fa1efd-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;tool&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;PACKAGE
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For &lt;code class="docutils literal"&gt;tox&lt;/code&gt;, I had to install the &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;tox-uv&lt;/span&gt;&lt;/code&gt; package in the &lt;code class="docutils literal"&gt;tox&lt;/code&gt;
environment:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code shell"&gt;&lt;a id="rest_code_c632c0d26efe44f99c86b798e76bfccd-1" name="rest_code_c632c0d26efe44f99c86b798e76bfccd-1" href="https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html#rest_code_c632c0d26efe44f99c86b798e76bfccd-1"&gt;&lt;/a&gt;$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;tool&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--with&lt;span class="w"&gt; &lt;/span&gt;tox-uv&lt;span class="w"&gt; &lt;/span&gt;tox
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now I've got everything I do mostly working.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="so-what-does-that-give-me"&gt;
&lt;h2&gt;So what does that give me?&lt;/h2&gt;
&lt;p&gt;I installed uv and I can upgrade uv using &lt;code class="docutils literal"&gt;uv self update&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Python interpreters are managed using &lt;code class="docutils literal"&gt;uv python&lt;/code&gt;. I can create symlinks to
interpreters using &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;uv-sync&lt;/span&gt;&lt;/code&gt; script. Adding new interpreters and removing old
ones is pretty straight-forward.&lt;/p&gt;
&lt;p&gt;When I type &lt;code class="docutils literal"&gt;python&lt;/code&gt;, it opens up a Python shell with the latest uv-managed
Python version. I can type &lt;code class="docutils literal"&gt;pythonX.Y&lt;/code&gt; and get specific shells.&lt;/p&gt;
&lt;p&gt;I can use tools written in Python and manage them with &lt;code class="docutils literal"&gt;uv tool&lt;/code&gt; including
ones where I want to install them in an "editable" mode.&lt;/p&gt;
&lt;p&gt;I can write scripts that require dependencies and it's a lot easier to run them
now.&lt;/p&gt;
&lt;p&gt;I can create and manage virtual environments with &lt;code class="docutils literal"&gt;uv venv&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="next-steps"&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;Delete all the &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;.python-version&lt;/span&gt;&lt;/code&gt; files I've got.&lt;/p&gt;
&lt;p&gt;Update documentation for my projects and add a &lt;code class="docutils literal"&gt;uv tool install PACKAGE&lt;/code&gt;
option to installation instructions.&lt;/p&gt;
&lt;p&gt;Probably discover some additional things to add to this doc.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="thanks"&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;Thank you to the Astral crew who wrote uv.&lt;/p&gt;
&lt;p&gt;Thank you to Rob Hudson who goaded me into posting this finally rather than sit
on it another month.&lt;/p&gt;
&lt;/section&gt;</description><category>dev</category><category>pyenv</category><category>python</category><category>uv</category><guid>https://bluesock.org/~willkg/blog/dev/switch_pyenv_to_uv.html</guid><pubDate>Thu, 12 Sep 2024 16: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_e712b991d87d4f558ba38e9ec9422324-1" name="rest_code_e712b991d87d4f558ba38e9ec9422324-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-2" name="rest_code_e712b991d87d4f558ba38e9ec9422324-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-3" name="rest_code_e712b991d87d4f558ba38e9ec9422324-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-4" name="rest_code_e712b991d87d4f558ba38e9ec9422324-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-5" name="rest_code_e712b991d87d4f558ba38e9ec9422324-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-6" name="rest_code_e712b991d87d4f558ba38e9ec9422324-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-7" name="rest_code_e712b991d87d4f558ba38e9ec9422324-7" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-8" name="rest_code_e712b991d87d4f558ba38e9ec9422324-8" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-9" name="rest_code_e712b991d87d4f558ba38e9ec9422324-9" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-10" name="rest_code_e712b991d87d4f558ba38e9ec9422324-10" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-11" name="rest_code_e712b991d87d4f558ba38e9ec9422324-11" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_e712b991d87d4f558ba38e9ec9422324-12" name="rest_code_e712b991d87d4f558ba38e9ec9422324-12" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_e712b991d87d4f558ba38e9ec9422324-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_c0ecc627c4d348379aed3fa82ce13c32-1" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c0ecc627c4d348379aed3fa82ce13c32-2" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c0ecc627c4d348379aed3fa82ce13c32-3" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-3"&gt;&lt;/a&gt;process_type
&lt;a id="rest_code_c0ecc627c4d348379aed3fa82ce13c32-4" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c0ecc627c4d348379aed3fa82ce13c32-5" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-5"&gt;&lt;/a&gt;--------------&lt;span class="p"&gt;|&lt;/span&gt;-------
&lt;a id="rest_code_c0ecc627c4d348379aed3fa82ce13c32-6" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c0ecc627c4d348379aed3fa82ce13c32-7" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-7" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c0ecc627c4d348379aed3fa82ce13c32-8" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-8" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c0ecc627c4d348379aed3fa82ce13c32-9" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-9" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c0ecc627c4d348379aed3fa82ce13c32-10" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-10" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c0ecc627c4d348379aed3fa82ce13c32-11" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-11" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c0ecc627c4d348379aed3fa82ce13c32-12" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-12" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c0ecc627c4d348379aed3fa82ce13c32-13" name="rest_code_c0ecc627c4d348379aed3fa82ce13c32-13" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c0ecc627c4d348379aed3fa82ce13c32-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_c50b04c3b24b423da95ce010ddfc77c5-1" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-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_c50b04c3b24b423da95ce010ddfc77c5-2" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-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_c50b04c3b24b423da95ce010ddfc77c5-3" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-3"&gt;&lt;/a&gt;submitted_from
&lt;a id="rest_code_c50b04c3b24b423da95ce010ddfc77c5-4" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-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_c50b04c3b24b423da95ce010ddfc77c5-5" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-5"&gt;&lt;/a&gt;----------------&lt;span class="p"&gt;|&lt;/span&gt;-------
&lt;a id="rest_code_c50b04c3b24b423da95ce010ddfc77c5-6" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-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_c50b04c3b24b423da95ce010ddfc77c5-7" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-7" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-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_c50b04c3b24b423da95ce010ddfc77c5-8" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-8" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-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_c50b04c3b24b423da95ce010ddfc77c5-9" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-9" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-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_c50b04c3b24b423da95ce010ddfc77c5-10" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-10" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-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_c50b04c3b24b423da95ce010ddfc77c5-11" name="rest_code_c50b04c3b24b423da95ce010ddfc77c5-11" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_c50b04c3b24b423da95ce010ddfc77c5-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_40b18339cd4e4f82a0ececfc70d1f234-1" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-2" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-3" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-4" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-5" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-5"&gt;&lt;/a&gt;-------------------------------&lt;span class="p"&gt;|&lt;/span&gt;-------
&lt;a id="rest_code_40b18339cd4e4f82a0ececfc70d1f234-6" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-7" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-7" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-8" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-8" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-9" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-9" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-10" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-10" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-11" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-11" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-12" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-12" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-13" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-13" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-14" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-14" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-15" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-15" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-16" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-16" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-17" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-17" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-18" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-18" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-19" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-19" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-20" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-20" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-21" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-21" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-22" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-22" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-23" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-23" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-24" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-24" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-25" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-25" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-26" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-26" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_40b18339cd4e4f82a0ececfc70d1f234-27" name="rest_code_40b18339cd4e4f82a0ececfc70d1f234-27" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_40b18339cd4e4f82a0ececfc70d1f234-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_fa905382346549e19531ced1885cea8a-1" name="rest_code_fa905382346549e19531ced1885cea8a-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_fa905382346549e19531ced1885cea8a-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_fa905382346549e19531ced1885cea8a-2" name="rest_code_fa905382346549e19531ced1885cea8a-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_fa905382346549e19531ced1885cea8a-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_fa905382346549e19531ced1885cea8a-3" name="rest_code_fa905382346549e19531ced1885cea8a-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_fa905382346549e19531ced1885cea8a-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_fa905382346549e19531ced1885cea8a-4" name="rest_code_fa905382346549e19531ced1885cea8a-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_fa905382346549e19531ced1885cea8a-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_fa905382346549e19531ced1885cea8a-5" name="rest_code_fa905382346549e19531ced1885cea8a-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_fa905382346549e19531ced1885cea8a-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_300b3955d473442fa315870849272bc7-1" name="rest_code_300b3955d473442fa315870849272bc7-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-2" name="rest_code_300b3955d473442fa315870849272bc7-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-3" name="rest_code_300b3955d473442fa315870849272bc7-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-4" name="rest_code_300b3955d473442fa315870849272bc7-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-5" name="rest_code_300b3955d473442fa315870849272bc7-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-5"&gt;&lt;/a&gt;histogram_date.product
&lt;a id="rest_code_300b3955d473442fa315870849272bc7-6" name="rest_code_300b3955d473442fa315870849272bc7-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-7" name="rest_code_300b3955d473442fa315870849272bc7-7" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-8" name="rest_code_300b3955d473442fa315870849272bc7-8" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-9" name="rest_code_300b3955d473442fa315870849272bc7-9" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-10" name="rest_code_300b3955d473442fa315870849272bc7-10" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-11" name="rest_code_300b3955d473442fa315870849272bc7-11" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-12" name="rest_code_300b3955d473442fa315870849272bc7-12" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-13" name="rest_code_300b3955d473442fa315870849272bc7-13" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-14" name="rest_code_300b3955d473442fa315870849272bc7-14" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-15" name="rest_code_300b3955d473442fa315870849272bc7-15" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-16" name="rest_code_300b3955d473442fa315870849272bc7-16" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-17" name="rest_code_300b3955d473442fa315870849272bc7-17" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-18" name="rest_code_300b3955d473442fa315870849272bc7-18" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-19" name="rest_code_300b3955d473442fa315870849272bc7-19" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-20" name="rest_code_300b3955d473442fa315870849272bc7-20" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-21" name="rest_code_300b3955d473442fa315870849272bc7-21" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-22" name="rest_code_300b3955d473442fa315870849272bc7-22" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-23" name="rest_code_300b3955d473442fa315870849272bc7-23" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-24" name="rest_code_300b3955d473442fa315870849272bc7-24" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-25" name="rest_code_300b3955d473442fa315870849272bc7-25" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-26" name="rest_code_300b3955d473442fa315870849272bc7-26" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-27" name="rest_code_300b3955d473442fa315870849272bc7-27" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-28" name="rest_code_300b3955d473442fa315870849272bc7-28" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-29" name="rest_code_300b3955d473442fa315870849272bc7-29" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-30" name="rest_code_300b3955d473442fa315870849272bc7-30" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-31" name="rest_code_300b3955d473442fa315870849272bc7-31" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-32" name="rest_code_300b3955d473442fa315870849272bc7-32" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-33" name="rest_code_300b3955d473442fa315870849272bc7-33" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-34" name="rest_code_300b3955d473442fa315870849272bc7-34" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-35" name="rest_code_300b3955d473442fa315870849272bc7-35" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-36" name="rest_code_300b3955d473442fa315870849272bc7-36" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-37" name="rest_code_300b3955d473442fa315870849272bc7-37" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-38" name="rest_code_300b3955d473442fa315870849272bc7-38" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-39" name="rest_code_300b3955d473442fa315870849272bc7-39" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-40" name="rest_code_300b3955d473442fa315870849272bc7-40" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-41" name="rest_code_300b3955d473442fa315870849272bc7-41" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_300b3955d473442fa315870849272bc7-42" name="rest_code_300b3955d473442fa315870849272bc7-42" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_300b3955d473442fa315870849272bc7-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_6aac1715c83240f99cb61c49675f8121-1" name="rest_code_6aac1715c83240f99cb61c49675f8121-1" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_6aac1715c83240f99cb61c49675f8121-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_6aac1715c83240f99cb61c49675f8121-2" name="rest_code_6aac1715c83240f99cb61c49675f8121-2" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_6aac1715c83240f99cb61c49675f8121-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_6aac1715c83240f99cb61c49675f8121-3" name="rest_code_6aac1715c83240f99cb61c49675f8121-3" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_6aac1715c83240f99cb61c49675f8121-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_6aac1715c83240f99cb61c49675f8121-4" name="rest_code_6aac1715c83240f99cb61c49675f8121-4" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_6aac1715c83240f99cb61c49675f8121-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_6aac1715c83240f99cb61c49675f8121-5" name="rest_code_6aac1715c83240f99cb61c49675f8121-5" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_6aac1715c83240f99cb61c49675f8121-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_6aac1715c83240f99cb61c49675f8121-6" name="rest_code_6aac1715c83240f99cb61c49675f8121-6" href="https://bluesock.org/~willkg/blog/mozilla/crashstats_tools_v2_0_0.html#rest_code_6aac1715c83240f99cb61c49675f8121-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></channel></rss>