<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Will's Blog (Posts about retrospective)</title><link>https://bluesock.org/~willkg/blog/</link><description></description><atom:link href="https://bluesock.org/~willkg/blog/tag/retrospective.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:54:05 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><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: Schema-Based Overhaul of Crash Ingestion: Retrospective (2022)</title><link>https://bluesock.org/~willkg/blog/mozilla/socorro_schema_based_overhaul.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;section id="project"&gt;
&lt;h2&gt;Project&lt;/h2&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt&gt;time&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;2+ years&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;impact&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;radically reduces the risk of data leaks due to misconfigured permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;centralizes and simplifies configuration and management of fields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;normalization and validation are performed during processing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;documentation of data reviews, data caveats, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reduces the risk of bugs when adding new fields—testing is done in CI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;new crash reporting data dictionary with Markdown-formatted descriptions,
real examples, and relevant links&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;I've been working on Socorro, the crash ingestion pipeline at Mozilla, since the
beginning of 2016. During that time, I've focused on streamlining maintenance
of the project, paying down technical debt, reducing risk, and improving crash
analysis tooling.&lt;/p&gt;
&lt;p&gt;Early on, I observed that the crash ingestion pipeline was difficult to reason
about, poorly documented, and full of risk. What did the incoming data look
like? What did the processed data look like? Was it valid? Which fields
contained data anyone could look at? Which fields contained data that was
sensitive and required access controls to access? How do we add support for new
crash annotations? What happens when data is invalid or malformed? At a given
point in the system, what did we know about the data?&lt;/p&gt;
&lt;p&gt;In 2020, Socorro moved into the Data Org, which has multiple data pipelines.
After spending some time looking at how their pipelines work, I decided to
rework the crash ingestion pipeline to be schema-driven and to move data
validation and normalization earlier in the processor.&lt;/p&gt;
&lt;p&gt;The end result of this project is that:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;the project is easier to maintain:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;adding support for new crash annotations is done in a couple of schema
files and possibly a processor rule&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;risk of security issues and data breaches is lower:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;typos, bugs, and mistakes when adding support for a new crash annotation
are caught in CI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions are specified in a central location; changing permission for
fields is trivial and takes effect in the next deploy; setting permissions
supports complex data structures in easy-to-reason-about ways; and
mistakes are caught in CI&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the data is easier to use and reason about:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;normalization and validation of crash annotation data happens during
processing, and downstream uses of the data can expect it to be valid;
further, we get a signal when the data isn't valid, which can indicate
product bugs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;schemas describing incoming and processed data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a crash reporting data dictionary documenting incoming data fields,
processed data fields, descriptions, sources, data gotchas, examples, and
permissions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="what-is-socorro"&gt;
&lt;h2&gt;What is Socorro?&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/mozilla-services/socorro"&gt;Socorro&lt;/a&gt; is the crash ingestion
pipeline for Mozilla products like Firefox, Fenix, Thunderbird, and MozillaVPN.&lt;/p&gt;
&lt;p&gt;When Firefox crashes, the crash reporter asks the user if they would like
to send a crash report. If the user answers "yes!", the crash reporter
collects data related to the crash, generates a crash report, and submits that
crash report as an HTTP POST to Socorro. Socorro saves the submitted crash
report, processes it, and has tools for viewing and analyzing crash data.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="state-of-crash-ingestion-at-the-beginning"&gt;
&lt;h2&gt;State of crash ingestion at the beginning&lt;/h2&gt;
&lt;p&gt;The crash ingestion system was working and it was usable, but it was in a
bad state.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Poor data management&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Normalization and validation of data was all over the codebase and not
consistent:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;processor rule code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS S3 crash storage code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elasticsearch indexing code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Telemetry crash storage code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Super Search querying and result rendering code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;report view and template code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;signature report code and template code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;crontabber job code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;any scripts that used the data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tests -- many of which had bad test data so who knows what they were really
testing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Naive handling of minidump stackwalker output meant that any changes in
the stackwalker output were predominantly unnoticed, and there was no indication
as to whether changed output created issues in the system.&lt;/p&gt;
&lt;p&gt;Further, since it was all over the place, there were no guarantees for data
validity when downloading it using the RawCrash, ProcessedCrash, and
SuperSearch APIs. Anyone writing downstream systems would also have to
normalize and validate the data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Poor permissions management&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Permissions were defined in multiple places:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Elasticsearch json redactor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Super Search fields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RawCrash API allow list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ProcessedCrash API allow list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;report view and template code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Telemetry crash storage code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and other places&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We couldn't effectively manage the permissions of fields in the stackwalker output
because we had no idea what was there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Poor documentation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No documentation of crash annotation fields other than &lt;cite&gt;CrashAnnotations.yaml&lt;/cite&gt;,
which didn't enforce anything in crash ingestion (process, valid type, data
correctness, etc.) and was missing important information like data gotchas,
data review URLs, and examples.&lt;/p&gt;
&lt;p&gt;No documentation of processed crash fields at all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Making changes was high risk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Changing fields from public to protected was high risk because you had to
find all the places it might show up which was intractable. Adding support
for new fields often took multiple passes over several weeks because we'd
miss things. Server errors happened with some regularity due to weirdness with
crash annotation values affecting the Crash Stats site.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tangled concerns across the codebase&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lots of tangled concerns where things defined in one place affected other
places that shouldn't be related. For example, the Super Search fields
definition was acting as a "schema" for other parts of the system that had
nothing to do with Elasticsearch or Super Search.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Difficult to maintain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It was difficult to support new products.&lt;/p&gt;
&lt;p&gt;It was difficult to debug issues in crash ingestion and crash reporting.&lt;/p&gt;
&lt;p&gt;The Crash Stats web app contained lots of if/then/else bits to handle
weirdness in the crash annotation values. Nulls, incorrect types, different
structures, etc.&lt;/p&gt;
&lt;p&gt;Socorro contained lots of vestigial code from half-done field removal,
deprecated fields, fields that were removed from crash reports, etc. These
vestigial bits were all over the code base. Discovering and removing these
bits was time consuming and error prone.&lt;/p&gt;
&lt;p&gt;The code for exporting data to Telemetry built the export data using a list
of fields to &lt;em&gt;exclude&lt;/em&gt; rather than a list of fields to &lt;em&gt;include&lt;/em&gt;. This is
backward and impossible to maintain—we never should have been doing this.
Further, it pulled data from the raw crash, for which we had no validation
guarantees, which would cause issues downstream in the Telemetry import
code.&lt;/p&gt;
&lt;p&gt;There was no way to validate the data used in the unit tests, which meant that
a lot of it was invalid. We had no way to validate the test data, which meant
that CI would pass, but we'd see errors in our stage and production
environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Different from other similar systems&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In 2020, Socorro was moved to the Data Org in Mozilla which had a set of
standards and conventions for collecting, storing, analyzing, and providing
access to data. Socorro didn't follow any of it, which made it difficult to
work on, to connect with, and to staff. Things the Data Org has that Socorro
didn't:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;a schema covering specifying fields, types, and documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;data flow documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;data review policy, process, and artifacts for data being collected and
how to add new data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a data dictionary for fields for users including documentation, data review
URLs, and data gotchas&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary, we had a system that took a lot of effort to maintain, wasn't
serving our users' needs, and was at high risk of a security/data breach.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="project-plan"&gt;
&lt;h2&gt;Project plan&lt;/h2&gt;
&lt;p&gt;Many of these issues can be alleviated and reduced by moving to a
schema-driven system where we:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;define a schema for annotations and a schema for the processed crash&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;change crash ingestion and the Crash Stats site to use those schemas&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When designing this schema-driven system, we should be thinking about:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;how easy is it to maintain the system?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how easy is it to explain?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how flexible is it for solving other kinds of problems in the future?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;what kinds of errors will likely happen when maintaining the system, and how
can we avert them in CI?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;what kinds of errors can happen and how much risk do they pose for data
leaks? what of those can we avert in CI?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how flexible is the system, which needs to support multiple products
potentially with different needs?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I worked out a minimal version of that vision that we could migrate to and then
work with going forward.&lt;/p&gt;
&lt;p&gt;The crash annotations schema should define:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;what annotations are in the crash report?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;which permissions are required to view a field&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;field documentation (provenance, description, data review, related bugs,
gotchas, analysis tips, etc)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The processed crash schema should define:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;what's in the processed crash?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;which permissions are required to view a field&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;field documentation (provenance, description, related bugs, gotchas,
analysis tips, etc)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then we make the following changes to the system:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;write a processor rule to copy, normalize, and validate data from
the raw crash based on the processed crash schema&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch the Telemetry export code to using the processed crash for
data to export&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch the Telemetry export code to using the processed crash schema
for permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch Super Search to using the processed crash for data to index&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch Super Search to using the processed crash schema for documentation
and permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch the Crash Stats site to using the processed crash for data to render&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch the Crash Stats site to using the processed crash schema for
documentation and permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch the RawCrash, ProcessedCrash, and SuperSearch APIs to using the crash
annotations and processed crash schemas for documentation and permissions&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After doing that, we have:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;field documentation is managed in the schemas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions are managed in the schemas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;data is normalized and validated once in the processor and everything
uses the processed crash data for indexing, searching, and rendering&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adding support for new fields and changing existing fields is easier and
problems are caught in CI&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="implementation-decisions"&gt;
&lt;h2&gt;Implementation decisions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Use JSON Schema.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Data Org at Mozilla uses JSON Schema for schema specification. The schema is
written using YAML.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://mozilla.github.io/glean_parser/metrics-yaml.html"&gt;https://mozilla.github.io/glean_parser/metrics-yaml.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The metrics schema is used to define &lt;code class="docutils literal"&gt;metrics.yaml&lt;/code&gt; files which specify the
metrics being emitted and collected.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://searchfox.org/mozilla-central/source/toolkit/mozapps/update/metrics.yaml"&gt;https://searchfox.org/mozilla-central/source/toolkit/mozapps/update/metrics.yaml&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One long-term goal for Socorro is to unify standards and practices
with the Data Ingestion system. Towards that goal, it's prudent to build out a
crash annotation and processed crash schemas using whatever we can take from
the equivalent metrics schemas.&lt;/p&gt;
&lt;p&gt;We'll also need to build out tooling for verifying, validating, and
testing schema modifications to make ongoing maintenance easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use schemas to define and drive everything.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We've got permissions, structures, normalization, validation, definition,
documentation, and several other things related to the data and how it's used
throughout crash ingestion spread out across the codebase.&lt;/p&gt;
&lt;p&gt;Instead of that, let's pull it all together into a single schema and change the
system to be driven from this schema.&lt;/p&gt;
&lt;p&gt;The schema will include:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;structure specification&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;documentation including data gotchas, examples, and implementation details&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;processing instructions&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We'll have a schema for supported annotations and a schema for the processed
crash.&lt;/p&gt;
&lt;p&gt;We'll rewrite existing parts of crash ingestion to use the schema:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;processing&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;use processing instructions to validate and normalize annotation data&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;super search&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;field documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove all the normalization and validation code from indexing&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;crash stats&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;field documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove all the normalization and validation code from page rendering&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Only use processed crash data for indexing and analysis.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The indexing system has its own normalization and validation code since it
pulls data to be indexed from the raw crash.&lt;/p&gt;
&lt;p&gt;The crash stats code has its own normalization and validation code since it
renders data from the raw crash in various parts of the site.&lt;/p&gt;
&lt;p&gt;We're going to change this so that all normalization and validation happens
during processing, the results are stored in the processed crash, and indexing,
searching, and crash analysis only work on processed crash data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By default, all data is protected.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By default, all data is protected unless it is &lt;em&gt;explicitly&lt;/em&gt; marked as public.
This has some consequences for the code:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;any data not specified in a schema is treated as protected&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;all schema fields need to specify permissions for that field&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;any data in a schema is either:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;marked public, OR&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lists the permissions required to view that data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for nested structures, any child field that is public has public ancestors&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We can catch some of these issues in CI and need to write tests to verify them.&lt;/p&gt;
&lt;p&gt;This is slightly awkward when maintaining the schema because it would be more
reasonable to have "no permissions required" mean that the field is public.
However, it's possible to accidentally not specify the permissions, and we don't
want to be in that situation. Thus, we decided to go with explicitly marking
public fields as public.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="work-done"&gt;
&lt;h2&gt;Work done&lt;/h2&gt;
&lt;section id="phase-1-cleaning-up"&gt;
&lt;h3&gt;Phase 1: cleaning up&lt;/h3&gt;
&lt;p&gt;We had a lot of work to do before we could start defining schemas and changing
the system to use those schemas.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;remove vestigial code (some of this work was done in other phases as it was
discovered)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1724933"&gt;[bug 1724933]&lt;/a&gt;: remove unused/obsolete annotations (2021-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1743487"&gt;[bug 1743487]&lt;/a&gt;: remove &lt;code class="docutils literal"&gt;total_frames&lt;/code&gt; (2021-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1743704"&gt;[bug 1743704]&lt;/a&gt;: remove jit crash classifier (2022-02)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1762000"&gt;[bug 1762000]&lt;/a&gt;: remove vestigial &lt;code class="docutils literal"&gt;Winsock_LSP&lt;/code&gt; code (2022-03)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1784485"&gt;[bug 1784485]&lt;/a&gt;: remove vestigial &lt;code class="docutils literal"&gt;exploitability&lt;/code&gt; code (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1784095"&gt;[bug 1784095]&lt;/a&gt;: remove vestigial &lt;code class="docutils literal"&gt;contains_memory_report&lt;/code&gt; code (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787933"&gt;[bug 1787933]&lt;/a&gt;: exorcise flash things from the codebase (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix signature generation&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1753521"&gt;[bug 1753521]&lt;/a&gt;: use fields from processed crash (2022-02)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1755523"&gt;[bug 1755523]&lt;/a&gt;: fix signature generation so it only uses processed crash data (2022-02)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1762207"&gt;[bug 1762207]&lt;/a&gt;: remove &lt;code class="docutils literal"&gt;hang_type&lt;/code&gt; (2022-04)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix Super Search&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1624345"&gt;[bug 1624345]&lt;/a&gt;: stop saving random data to Elasticsearch crashstorage (2020-06)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1706076"&gt;[bug 1706076]&lt;/a&gt;: remove dead Super Search fields (2021-04)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1712055"&gt;[bug 1712055]&lt;/a&gt;: remove &lt;code class="docutils literal"&gt;system_error&lt;/code&gt; from Super Search fields (2021-07)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1712085"&gt;[bug 1712085]&lt;/a&gt;: remove obsolete Super Search fields (2021-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1697051"&gt;[bug 1697051]&lt;/a&gt;: add &lt;code class="docutils literal"&gt;crash_report_keys&lt;/code&gt; field (2021-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1736928"&gt;[bug 1736928]&lt;/a&gt;: remove &lt;code class="docutils literal"&gt;largest_free_vm_block&lt;/code&gt; and &lt;code class="docutils literal"&gt;tiny_block_size&lt;/code&gt; (2021-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1754874"&gt;[bug 1754874]&lt;/a&gt;: remove unused annotations from Super Search (2022-02)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1753521"&gt;[bug 1753521]&lt;/a&gt;: stop indexing items from raw crash (2022-02)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1762005"&gt;[bug 1762005]&lt;/a&gt;: migrate to lower-cased versions of &lt;code class="docutils literal"&gt;Plugin*&lt;/code&gt; fields in
processed crash (2022-03)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1755528"&gt;[bug 1755528]&lt;/a&gt;: fix flag/boolean handling (2022-03)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1762207"&gt;[bug 1762207]&lt;/a&gt;: remove &lt;code class="docutils literal"&gt;hang_type&lt;/code&gt; (2022-04)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1763264"&gt;[bug 1763264]&lt;/a&gt;: clean up super search fields from migration (2022-07)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix data flow and usage&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1740397"&gt;[bug 1740397]&lt;/a&gt;: rewrite &lt;code class="docutils literal"&gt;CrashingThreadInfoRule&lt;/code&gt; to normalize crashing thread (2021-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1755095"&gt;[bug 1755095]&lt;/a&gt;: fix &lt;code class="docutils literal"&gt;TelemetryBotoS3CrashStorage&lt;/code&gt; so it doesn't use Super Search fields (2022-03)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1740397"&gt;[bug 1740397]&lt;/a&gt;: change webapp to pull &lt;code class="docutils literal"&gt;crashing_thread&lt;/code&gt; from processed crash (2022-07)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1710725"&gt;[bug 1710725]&lt;/a&gt;: stop using &lt;code class="docutils literal"&gt;DotDict&lt;/code&gt; for raw and processed data (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;clean up the raw crash structure&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1687987"&gt;[bug 1687987]&lt;/a&gt;: restructure raw crash (2021-01 through 2022-10)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="phase-2-define-schemas-and-all-the-tooling-we-needed-to-work-with-them"&gt;
&lt;h3&gt;Phase 2: define schemas and all the tooling we needed to work with them&lt;/h3&gt;
&lt;p&gt;After cleaning up the code base, removing vestigial code, fixing Super Search,
and fixing Telemetry export code, we could move on to defining schemas and
writing all the code we needed to maintain the schemas and work with them.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1762271"&gt;[bug 1762271]&lt;/a&gt;: rewrite json schema reducer (2022-03)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1764395"&gt;[bug 1764395]&lt;/a&gt;: schema for processed crash, reducers, traversers (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1788533"&gt;[bug 1788533]&lt;/a&gt;: fix &lt;code class="docutils literal"&gt;validate_processed_crash&lt;/code&gt; to handle
&lt;code class="docutils literal"&gt;pattern_properties&lt;/code&gt; (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1626698"&gt;[bug 1626698]&lt;/a&gt;: schema for crash annotations in crash reports (2022-11)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="phase-3-fix-everything-to-use-the-schemas"&gt;
&lt;h3&gt;Phase 3: fix everything to use the schemas&lt;/h3&gt;
&lt;p&gt;That allowed us to fix a bunch of things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1784927"&gt;[bug 1784927]&lt;/a&gt;: remove elasticsearch redactor code (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1746630"&gt;[bug 1746630]&lt;/a&gt;: support new &lt;code class="docutils literal"&gt;threads.N.frames.N.unloaded_modules&lt;/code&gt;
minidump-stackwalk fields (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1697001"&gt;[bug 1697001]&lt;/a&gt;: get rid of UnredactedCrash API and model (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1100352"&gt;[bug 1100352]&lt;/a&gt;: remove hard-coded allow lists from RawCrash  (2022-08)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787929"&gt;[bug 1787929]&lt;/a&gt;: rewrite &lt;code class="docutils literal"&gt;Breadcrumbs&lt;/code&gt; validation (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787931"&gt;[bug 1787931]&lt;/a&gt;: fix Super Search fields to pull permissions from processed
crash schema (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787937"&gt;[bug 1787937]&lt;/a&gt;: fix Super Search fields to pull documentation from processed
crash schema (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787931"&gt;[bug 1787931]&lt;/a&gt;: use processed crash schema permissions for super search (2022-09)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1100352"&gt;[bug 1100352]&lt;/a&gt;: remove hard-coded allow lists from ProcessedCrash models (2022-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1792255"&gt;[bug 1792255]&lt;/a&gt;: add telemetry_environment to processed crash (2022-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1784558"&gt;[bug 1784558]&lt;/a&gt;: add collector metadata to processed crash (2022-11)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1787932"&gt;[bug 1787932]&lt;/a&gt;: add data review urls for crash annotations that have data reviews (2022-11)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="phase-4-improve"&gt;
&lt;h3&gt;Phase 4: improve&lt;/h3&gt;
&lt;p&gt;With fields specified in schemas, we can write a crash reporting data
dictionary:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1803558"&gt;[bug 1803558]&lt;/a&gt;: crash reporting data dictionary (2023-01)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1795700"&gt;[bug 1795700]&lt;/a&gt;: document raw and processed schemas and how to maintain them
(2023-01)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then we can finish:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1677143"&gt;[bug 1677143]&lt;/a&gt;: documenting analysis gotchas (ongoing)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1755525"&gt;[bug 1755525]&lt;/a&gt;: fixing the report view to only use the processed crash (future)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugzil.la/1795699"&gt;[bug 1795699]&lt;/a&gt;: validate test data (future)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="random-thoughts"&gt;
&lt;h2&gt;Random thoughts&lt;/h2&gt;
&lt;p&gt;This was a very very long-term project with many small steps and some really
big ones. Getting large projects done is futile and the only way to do it
successfully is to break it into a million small steps each of which stand on
their own and don't create urgency for getting the next step done.&lt;/p&gt;
&lt;p&gt;Any time I changed field names or types, I'd have to do a data migration. Data
migrations take 6 months to do because I have to wait for existing data to
expire from storage. On the one hand, it's a blessing I could do migrations at
all--you can't do this with larger data sets or with data sets where the data
doesn't expire without each migration becoming a huge project. On the other
hand, it's hard to juggle being in the middle of multiple migrations and
sometimes the contortions one has to perform are grueling.&lt;/p&gt;
&lt;p&gt;If you're working on a big project that's going to require changing data
structures, figure out how to do migrations early with as little work as
possible and use that process as often as you can.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="conclusion-and-where-we-could-go-from-here"&gt;
&lt;h2&gt;Conclusion and where we could go from here&lt;/h2&gt;
&lt;p&gt;This was such a huge project that spanned years. It's so hard to finish
projects like this because the landscape for the project is constantly
changing. Meanwhile, being mid-project has its own set of complexities and
hardships.&lt;/p&gt;
&lt;p&gt;I'm glad I tackled it and I'm glad it's mostly done. There are some minor
things to do, still, but this new schema-driven system has a lot going for it.
Adding support for new crash annotations is much easier, less risky, and takes
less time.&lt;/p&gt;
&lt;p&gt;It took me about a month to pull this post together.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="that-s-it"&gt;
&lt;h2&gt;That's it!&lt;/h2&gt;
&lt;p&gt;That's the story of the schema-based overhaul of crash ingestion. There's
probably some bits missing and/or wrong, but the gist of it is here.&lt;/p&gt;
&lt;p&gt;If you have any questions or bump into bugs, I hang out on &lt;code class="docutils literal"&gt;#crashreporting&lt;/code&gt; on
&lt;code class="docutils literal"&gt;chat.mozilla.org&lt;/code&gt;. You can also write up a &lt;a class="reference external" href="https://bugzilla.mozilla.org/enter_bug.cgi?format=__standard__&amp;amp;product=Socorro"&gt;bug for Socorro&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hopefully this helps. If not, let us know!&lt;/p&gt;
&lt;/section&gt;</description><category>dev</category><category>mozilla</category><category>python</category><category>retrospective</category><category>socorro</category><category>story</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/socorro_schema_based_overhaul.html</guid><pubDate>Wed, 18 Jan 2023 18:00:00 GMT</pubDate></item><item><title>Eliot: retrospective (2021)</title><link>https://bluesock.org/~willkg/blog/mozilla/eliot_project_wrapup.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;1 year&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;reduced risk of a Mozilla Symbols Server outage, which affects symbols
uploads from the build system&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;improves the maintainability of the symbolication service by offloading parsing
of Breakpad symbols files and symbol lookups to an external library that's
used by other tools in the crash reporting ecosystem at Mozilla&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;opens up possible futures around supporting inline functions and using
other debug file types&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="problem-statement"&gt;
&lt;h2&gt;Problem statement&lt;/h2&gt;
&lt;p&gt;Tecken is the &lt;a class="reference external" href="https://symbols.mozilla.org/"&gt;Mozilla Symbols Service&lt;/a&gt;. This service manages several things:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;symbol upload API for uploading and storing debugging symbols generated by
build systems for products like Firefox, Fenix, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;download API for downloading symbols, which could be located in a variety of
different places, supporting tools like Visual Studio, stackwalkers,
profilers, symbolicators, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;symbolication API for finding symbols for memory addresses&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also has a webapp for querying symbols, debugging symbols problems, managing
API tokens, and granting permissions for uploading symbols.&lt;/p&gt;
&lt;p&gt;All of those functions are currently handled by a single webapp service.&lt;/p&gt;
&lt;p&gt;There are a few problems here.&lt;/p&gt;
&lt;p&gt;First, these three different functions of the Mozilla Symbols Service have
vastly different runtime properties.&lt;/p&gt;
&lt;p&gt;Symbol upload API requests can take a long time to process (and it's done
during the HTTP request cycle (which is a different issue for a different
day)). Symbol uploads are critical to the Firefox build system which uploads
symbols from builds.&lt;/p&gt;
&lt;p&gt;We want to reduce the risk of an outage for uploading symbols. When we have
service outages, the build systems can't upload symbols. It tries really hard
to upload symbols, so this increases the build times for Firefox and other
products. On top of that, if the build system doesn't successfully upload
symbols, any crashes in tests or channels result in unsymbolicated stacks, which
obscures the details of the crash.&lt;/p&gt;
&lt;p&gt;Symbol download API requests are fast to process. Symbol downloads are used by
the Firefox profiler, the Socorro stackwalker during crash report processing,
VS Code, and other systems.&lt;/p&gt;
&lt;p&gt;Symbolication API requests take a long time to process, but aren't currently
used by a critical system. There are several projects that are waiting in the
wings to dramatically increase their use of the symbolication API, which
increases the likelihood of an outage with the service that affects symbol
uploads.&lt;/p&gt;
&lt;p&gt;Second, the existing symbolication API implementation is an independent
implementation of sym file parsing, lookups, and symbolication. Whenever we
make adjustments to how sym files are built, structured, or the lookup
algorithms, we have to additionally update the symbolication API code.&lt;/p&gt;
&lt;p&gt;Mozilla is in the process of rewriting crash reporting related code in Rust. It
behooves us greatly to switch from our independent implementation to a shared
library.&lt;/p&gt;
&lt;p&gt;Third, the symbolication API is missing some critical features, like support
for line numbers and inline functions. The existing architecture can't be
changed to support either line numbers or inline functions--we need to rewrite
this code.&lt;/p&gt;
&lt;p&gt;In September 2020, I embarked on a project to break out the symbolication
API as a separate microservice and implement it using the &lt;a class="reference external" href="https://github.com/getsentry/symbolic"&gt;Symbolic library&lt;/a&gt;. That had the following effects:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;eases the risk of an outage due to increasing usage of the symbolication API,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adds support for line numbers and sets us up for adding support for inline
functions, and&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reduces the maintenance work because we'll be using a library used by other
parts of the crash reporting ecosystem&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This post covers that project.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/mozilla/eliot_project_wrapup.html"&gt;Read more…&lt;/a&gt; (4 min remaining to read)&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;</description><category>eliot</category><category>mozilla</category><category>retrospective</category><category>socorro</category><category>story</category><category>tecken</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/eliot_project_wrapup.html</guid><pubDate>Mon, 15 Nov 2021 18:10:24 GMT</pubDate></item><item><title>Data Org Working Groups: retrospective (2020)</title><link>https://bluesock.org/~willkg/blog/mozilla/do_working_groups.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;1 month&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;p&gt;established cross-organization groups as a tool for collaboration&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="problem-statement"&gt;
&lt;h2&gt;Problem statement&lt;/h2&gt;
&lt;p&gt;The Data Org architects, builds, and maintains a data ingestion system and the
ecosystem around it. The group covers a swath of engineering and data science
disciplines and problem domains. Many of us are generalists and have expertise
and interests in multiple areas. Many projects cut across disciplines, problem
domains, and organizational structures. Some projects, disciplines, and problem
domains benefit from the participation of other stakeholders who aren't in the
Data Org.&lt;/p&gt;
&lt;p&gt;In order to succeed in tackling the projects of tomorrow, we need to formalize
the creation, maintenance, and disbanding of groups composed of interested
stakeholders focusing on specific missions. Further, we need a set of best
practices to help make these groups successful.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/mozilla/do_working_groups.html"&gt;Read more…&lt;/a&gt; (7 min remaining to read)&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;</description><category>data</category><category>mozilla</category><category>retrospective</category><category>story</category><guid>https://bluesock.org/~willkg/blog/mozilla/do_working_groups.html</guid><pubDate>Thu, 25 Feb 2021 15:00:00 GMT</pubDate></item><item><title>Socorro Smooth Mega-Migration: retrospective (2018)</title><link>https://bluesock.org/~willkg/blog/mozilla/socorro_migration_2018.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;period&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;1.5 years&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;impact&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;vastly reduced technical debt&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vastly improved developer efficiency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reduced infrastructure security risks&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;&lt;a class="reference external" href="https://github.com/mozilla-services/socorro"&gt;Socorro&lt;/a&gt; is the crash ingestion
pipeline for Mozilla's products like Firefox. When Firefox crashes, the Breakpad
crash reporter asks the user if they would like to send a crash report. If
the user answers "yes!", then the Breakpad crash reporter collects data related
to the crash, generates a crash report, and submits that crash report as an HTTP
POST to Socorro. Socorro collects and saves the crash report, processes it, and
provides an interface for aggregating, searching, and looking at crash reports.&lt;/p&gt;
&lt;p&gt;Over the last year and a half, we've been working on a new infrastructure for
Socorro and migrating the project to it. It was a massive undertaking and
involved changing a lot of code and some architecture and then redoing all the
infrastructure scripts and deploy pipelines.&lt;/p&gt;
&lt;p&gt;On Thursday, March 28th, 2018, we pushed the button and switched to the new
infrastructure. The transition was super smooth. Now we're on the new infra!&lt;/p&gt;
&lt;p&gt;This blog post talks a little about the old and new infrastructures and the work
we did to migrate.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/mozilla/socorro_migration_2018.html"&gt;Read more…&lt;/a&gt; (13 min remaining to read)&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;</description><category>dev</category><category>mozilla</category><category>retrospective</category><category>socorro</category><category>story</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/socorro_migration_2018.html</guid><pubDate>Wed, 04 Apr 2018 16:00:00 GMT</pubDate></item><item><title>html5lib-python 1.0 released!: retrospective (2017)</title><link>https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;section id="project"&gt;
&lt;h2&gt;Project&lt;/h2&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt&gt;time&lt;span class="colon"&gt;:&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;3 months&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;reduced technical debt and maintenance friction for html5lib which
impacts a variety of projects like PyPI, pip, readme_renderer, Jupyter,
TensorFlow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reduced security risks for Bleach&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="html5lib-python-v1-0-released"&gt;
&lt;h2&gt;html5lib-python v1.0 released!&lt;/h2&gt;
&lt;p&gt;Yesterday, Sam released html5lib 1.0 &lt;a class="brackets" href="https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;! The &lt;a class="reference external" href="https://html5lib.readthedocs.io/en/latest/changes.html"&gt;changes&lt;/a&gt; aren't wildly
interesting for users, but are important for the health of the project.&lt;/p&gt;
&lt;p&gt;The more interesting part for me is how the release happened and experimenting
with interim maintainers to get projects going again. I'm going to spend the
rest of this post talking about that.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html#footnote-reference-1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Technically there was a 1.0 release followed by a 1.0.1 release because
the 1.0 release had packaging issues.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
&lt;section id="the-story-of-bleach-and-html5lib"&gt;
&lt;h2&gt;The story of Bleach and html5lib&lt;/h2&gt;
&lt;p&gt;I work on &lt;a class="reference external" href="https://bleach.readthedocs.io/"&gt;Bleach&lt;/a&gt; which is a Python library
for sanitizing and linkifying text from untrusted sources for safe usage in
HTML. It relies heavily on another library called &lt;a class="reference external" href="https://github.com/html5lib/html5lib-python/"&gt;html5lib-python&lt;/a&gt;. Most of the work that I do on
Bleach consists of figuring out how to make html5lib do what I need it to do.&lt;/p&gt;
&lt;p&gt;Over the last few years, maintainers of the html5lib library have been working
towards a 1.0. Those well-meaning efforts got them into a versioning model which
had some unenthusing properties. I would often talk to people about how I was
having difficulties with Bleach and html5lib 0.99999999 (8 9s) and I'd have to
mentally count how many 9s I had said. It was goofy &lt;a class="brackets" href="https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html#footnote-2" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In an attempt to deal with the effects of the versioning, there's a parallel set
of versions that start with 1.0b. Because there are two sets of versions, it was
a total pain in the ass to correctly specify which versions of html5lib that
Bleach worked with.&lt;/p&gt;
&lt;p&gt;While working on Bleach 2.0, I bumped into a few bugs and upstreamed a patch for
at least one of them. That patch sat in the PR queue for months. That's what got
me wondering--what's going on with html5lib?&lt;/p&gt;
&lt;p&gt;I tracked down Sam and talked with her a bit on IRC. She seems to be the only
active maintainer. She was really busy with other things, html5lib doesn't pay,
there's a ton of stuff to do, she's burned out, and recently there have been
spats of negative comments in the issues and PRs. Generally the project had a
lot of stop energy.&lt;/p&gt;
&lt;p&gt;Some time in August, I offered to step up as an interim maintainer and shepherd
html5lib to 1.0. The goals being:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;land or close as many old PRs as possible&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;triage, fix, and close as many issues as possible&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;clean up testing and CI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;clean up documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ship 1.0 which ends the versioning issues&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html#footnote-reference-2"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Many things in life are goofy.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
&lt;section id="thoughts-on-being-an-interim-maintainer"&gt;
&lt;h2&gt;Thoughts on being an interim maintainer&lt;/h2&gt;
&lt;p&gt;I see a lot of open source projects that are in trouble in the sense that they
don't have a critical mass of people and energy. When the sole part-time
volunteer maintainer burns out, the project languishes. Then users show up,
complain, demand changes, and talk about how horrible the situation is and
everyone should be ashamed. It's tough--people are frustrated and then do a
bunch of things that make everything so much worse. How do projects escape the
raging inferno death spiral?&lt;/p&gt;
&lt;p&gt;For a while now, I've been thinking about a model for open source projects
where someone else pops in as an interim maintainer for a short period of time
with specific goals, works to achieve those goals, and then steps down. Maybe
this alleviates users' frustrations? Maybe this gives the part-time volunteer
burned-out maintainer a breather? Maybe this can get the project moving again?
Maybe the temporary interim maintainer can make some of the hard decisions that
a regular long-term maintainer just can't?&lt;/p&gt;
&lt;p&gt;I wondered if I should try that model out here. In the process of convincing
myself that stepping up as an interim maintainer was a good idea &lt;a class="brackets" href="https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html#footnote-3" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, I looked
at projects that rely on html5lib &lt;a class="brackets" href="https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html#footnote-4" id="footnote-reference-4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;4&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pip.pypa.io/en/stable/"&gt;pip&lt;/a&gt; vendors it&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://bleach.readthedocs.io/"&gt;Bleach&lt;/a&gt; relies upon it heavily,
so anything that uses Bleach uses html5lib (jupyter, hypermark,
readme_renderer, TensorFlow, ...)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;anything that uses readme_renderer like PyPI and tools around Python packages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;most web browsers (Firefox, Chrome, servo, etc) have it in their repositories
because &lt;a class="reference external" href="https://github.com/w3c/web-platform-tests"&gt;web-platform-tests&lt;/a&gt; uses
it&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I talked with Sam and offered to step up with these goals in mind.&lt;/p&gt;
&lt;p&gt;I started with cleaning up the milestones in GitHub. I decided the 0.9999999999
(10 9s) milestone was going to be 1.0. I bumped everything from the
0.9999999999 (10 9s) milestone to the 1.0 milestone. I went through all the
issues and PRs and threw any that piqued my interest in the 1.0 milestone
bucket.&lt;/p&gt;
&lt;p&gt;Then I went through the issue tracker and triaged all the issues. I tried to
get steps to reproduce and any other data that would help resolve the issue. I
closed some issues I didn't think would ever get resolved.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/html5lib/html5lib-python/issues/295#issuecomment-333851735"&gt;https://github.com/html5lib/html5lib-python/issues/295#issuecomment-333851735&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/html5lib/html5lib-python/issues/315#issuecomment-347709140"&gt;https://github.com/html5lib/html5lib-python/issues/315#issuecomment-347709140&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I triaged all the pull requests. Some of them had been open for a long time. I
apologized to people who had spent their time to upstream a fix that sat around
for years. In some cases, the changes had bitrotted severely they had to be
re-done &lt;a class="brackets" href="https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html#footnote-5" id="footnote-reference-5" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;5&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/html5lib/html5lib-python/pull/287#issuecomment-326636920"&gt;https://github.com/html5lib/html5lib-python/pull/287#issuecomment-326636920&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/html5lib/html5lib-python/pull/176#issuecomment-333861511"&gt;https://github.com/html5lib/html5lib-python/pull/176#issuecomment-333861511&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I plugged away at issues and pull requests for a couple of months landing
and fixing, and pushed anything out of the milestone that wasn't well-defined
or something we couldn't fix in a week.&lt;/p&gt;
&lt;p&gt;At the end of all that, Sam released version 1.0 and here we are today!&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html#footnote-reference-3"&gt;3&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;I have precious little free time, so this decision had sweeping
consequences for my life, my work, and people around me.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-4" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html#footnote-reference-4"&gt;4&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Recently, I discovered libraries.io--it's pretty amazing project. They
have a &lt;a class="reference external" href="https://libraries.io/pypi/html5lib"&gt;page for html5lib&lt;/a&gt;. I had
written &lt;a class="reference external" href="https://github.com/willkg/whouses"&gt;a (mediocre) tool&lt;/a&gt; that does
vaguely similar things.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-5" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html#footnote-reference-5"&gt;5&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;This is what happens on projects that don't have a critical mass of
energy/people. It sucks for everyone involved.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;/section&gt;
&lt;section id="conclusion-and-more-thoughts"&gt;
&lt;h2&gt;Conclusion and more thoughts&lt;/h2&gt;
&lt;p&gt;I finished up as interim maintainer for html5lib. I don't think I'm going to
continue actively as a maintainer. Yes, Bleach uses it, but I've got other
things I should be doing.&lt;/p&gt;
&lt;p&gt;I think this was an interesting experiment. I also think it was a successful
experiment in regards to achieving my stated goals, but I don't know if it gave
the project much momentum to continue forward.&lt;/p&gt;
&lt;p&gt;I'd love to see other examples of interim maintainers stepping up, achieving
specific goals, and then stepping down again. Does it bring in new people to the
community? Does it affect the raging inferno death spiral at all? What kinds of
projects would benefit from this the most? What kinds of projects wouldn't
benefit at all?&lt;/p&gt;
&lt;/section&gt;</description><category>bleach</category><category>dev</category><category>mozilla</category><category>python</category><category>retrospective</category><category>story</category><guid>https://bluesock.org/~willkg/blog/dev/html5lib_1_0.html</guid><pubDate>Fri, 08 Dec 2017 17:00:00 GMT</pubDate></item><item><title>Socorro signature generation overhaul and command line interface: retrospective (2017)</title><link>https://bluesock.org/~willkg/blog/mozilla/socorro_signature_generation.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 months&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 ease of contribution for signature generation changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;improved ability to experiment with signatures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;improved ability to use Socorro-style crash signatures in other projects&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;This quarter I worked on creating a command line interface for signature
generation and in doing that extracted it from the processor into a
standalone-ish module.&lt;/p&gt;
&lt;p&gt;The end result of this work is that:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;anyone making changes to signature generation can can test the changes out on
their local machine using a Socorro &lt;a class="reference external" href="http://socorro.readthedocs.io/en/latest/gettingstarted.html"&gt;local development environment&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I can trivially test incoming signature generation changes--this both saves
me time and gives me a much higher confidence of correctness without having
to merge the code and test it in our -stage environment &lt;a class="brackets" href="https://bluesock.org/~willkg/blog/mozilla/socorro_signature_generation.html#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;we can research and experiment with changes to the signature generation
algorithm and how that affects existing crash signatures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;it's a step closer to being usable by other groups&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This blog post talks about that work briefly and then talks about some of the
things I've been able to do with it.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://bluesock.org/~willkg/blog/mozilla/socorro_signature_generation.html#footnote-reference-1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;I can't overstate how awesome this is.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/mozilla/socorro_signature_generation.html"&gt;Read more…&lt;/a&gt; (18 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>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/socorro_signature_generation.html</guid><pubDate>Fri, 06 Oct 2017 13:00:00 GMT</pubDate></item><item><title>Socorro local development environment: retrospective (2017)</title><link>https://bluesock.org/~willkg/blog/mozilla/socorro_dev_env.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;1 year&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;vastly reduced time-to-onboard for new developers and contributors from months to days&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vastly improved developer efficacy&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;&lt;a class="reference external" href="https://github.com/mozilla-services/socorro"&gt;Socorro&lt;/a&gt; is the crash ingestion
pipeline for Mozilla's products like Firefox. When Firefox crashes, the Breakpad
crash reporter asks the user if they would like to send a crash report. If
the user answers "yes!", then the Breakpad crash reporter collects data related
to the crash, generates a crash report, and submits it as an HTTP
POST to Socorro. Socorro saves the crash report, processes it, and provides an
interface for aggregating, searching, and viewing crash reports.&lt;/p&gt;
&lt;p&gt;This (long-ish) blog post talks about how, when I started on Socorro, there
wasn't really a local development environment, and how I went on a magical
journey through dark forests and craggy mountains to find one.&lt;/p&gt;
&lt;p&gt;If you do anything with Socorro at Mozilla, you definitely want to at least read
the "Tell me more about this local development environment" part.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/mozilla/socorro_dev_env.html"&gt;Read more…&lt;/a&gt; (13 min remaining to read)&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;</description><category>dev</category><category>mozilla</category><category>retrospective</category><category>socorro</category><category>story</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/socorro_dev_env.html</guid><pubDate>Wed, 20 Sep 2017 16:34:00 GMT</pubDate></item><item><title>Antenna: retrospective (2017)</title><link>https://bluesock.org/~willkg/blog/mozilla/antenna_project_wrapup.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 months&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;reduced risk for deployments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;improved reliability of collector&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reduced technical debt&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;improved developer efficacy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;section id="problem-statement"&gt;
&lt;h2&gt;Problem statement&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/mozilla-services/socorro"&gt;Socorro&lt;/a&gt; is the crash ingestion
pipeline for Mozilla's products like Firefox. When Firefox crashes, the Breakpad
crash reporter asks the user if the user would like to send a crash report. If
the user answers "yes!", then the Breakpad crash reporter collects data related
to the crash, generates a crash report, and submits that crash report as an HTTP
POST to Socorro--specifically the Socorro collector.&lt;/p&gt;
&lt;p&gt;The Socorro collector is one of several components that comprise Socorro. Each
of the components has different uptime requirements and different security risk
profiles. However, all the code is maintained in a single repository and we
deploy everything every time we do a deploy. This is increasingly inflexible and
makes it difficult for us to make architectural changes to Socorro without
affecting everything and incurring uptime risk for components that have high
uptime requirements.&lt;/p&gt;
&lt;p&gt;Because of that, in early 2016, we embarked on a re-architecture to split out
some components of Socorro into separate services. The first component to get
split out was the Socorro collector since it needs has the highest uptime
requirements of all the Socorro components, but rarely changes, so it'd be a lot
easier to meet those requirements if it was separate from the rest of Socorro.&lt;/p&gt;
&lt;p&gt;Thus I was tasked with splitting out the Socorro collector and this blog post
covers that project. It's a bit stream-of-consciousness, because I think there's
some merit to explaining the thought process behind how I did the work over the
course of the project for other people working on projects.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/mozilla/antenna_project_wrapup.html"&gt;Read more…&lt;/a&gt; (14 min remaining to read)&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;</description><category>mozilla</category><category>retrospective</category><category>socorro</category><category>story</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/antenna_project_wrapup.html</guid><pubDate>Mon, 17 Jul 2017 16:00:00 GMT</pubDate></item><item><title>Input: Moving to Django 1.8: retrospective (2015)</title><link>https://bluesock.org/~willkg/blog/mozilla/input_django_1_8_upgrade.html</link><dc:creator>Will Kahn-Greene</dc:creator><description>&lt;div&gt;&lt;section id="project"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="https://bluesock.org/~willkg/blog/mozilla/input_django_1_8_upgrade.html#toc-entry-1" role="doc-backlink"&gt;Project&lt;/a&gt;&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;1 year&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;upgraded Input to Django 1.8&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;paved the road for AMO, MDN, and other Mozilla sites&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wrapped up jingo, jingo-minify, and other playdough-era projects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;built migration path from Tower to Puente and other l10n options&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;&lt;a class="toc-backref" href="https://bluesock.org/~willkg/blog/mozilla/input_django_1_8_upgrade.html#toc-entry-2" role="doc-backlink"&gt;Summary&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Over the course of 2015, we've been reworking large parts of the Fjord
codebase to do the following:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;ditch jingo and friends and other libraries that deviate from typical Django
and aren't active projects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reduce complexity by moving closer to a "default/typical Django project"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;upgrade to Django 1.8&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This blog post covers many grueling details, including the order we did things,
the design decisions we made, and some anecdotes.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bluesock.org/~willkg/blog/mozilla/input_django_1_8_upgrade.html"&gt;Read more…&lt;/a&gt; (13 min remaining to read)&lt;/p&gt;&lt;/section&gt;&lt;/div&gt;</description><category>input</category><category>mozilla</category><category>retrospective</category><category>story</category><category>work</category><guid>https://bluesock.org/~willkg/blog/mozilla/input_django_1_8_upgrade.html</guid><pubDate>Thu, 01 Oct 2015 20:00:00 GMT</pubDate></item></channel></rss>