<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Jvqq on JVQ.net</title>
    <link>https://jvq.net/tags/jvqq/</link>
    <description>Recent content in Jvqq on JVQ.net</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 19 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://jvq.net/tags/jvqq/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>A Crashed Writer Left Three Broken Lines in a 1 GiB Log and jq Stopped at the First</title>
      <link>https://jvq.net/a-crashed-writer-left-three-broken-lines-in-a-1-gib-log-and-jq-stopped-at-the-first/</link>
      <pubDate>Mon, 19 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://jvq.net/a-crashed-writer-left-three-broken-lines-in-a-1-gib-log-and-jq-stopped-at-the-first/</guid>
      <description>&lt;p&gt;Logs written by real services aren&amp;rsquo;t always valid JSON Lines. A process killed mid-write leaves half a line. The restarted process appends its first event straight after it, on the same line. Disk-full conditions, log shippers that split long lines and two writers sharing one file all do something similar. The file is 99.9999% fine and has a few lines that no parser will accept.&lt;/p&gt;&#xA;&lt;p&gt;jq treats the input as one stream of JSON, so the first bad line ends the run. This worked example shows what that looks like and what jvqq does instead. We took 1 GiB of generated logs, 3,073,492 lines, and cut three lines in half, each followed by the next line on the same line, the way a crashed writer leaves them. In the broken file they&amp;rsquo;re lines 812,345, 1,604,990 and 2,949,998. The commands below ran with jq 1.7.1 and jvqq 0.1.0 on a two-core cloud VM.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How jvqq Traced a 12-Minute Payments Outage Through 3 Million Log Lines</title>
      <link>https://jvq.net/how-jvqq-traced-a-12-minute-payments-outage-through-3-million-log-lines/</link>
      <pubDate>Mon, 19 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://jvq.net/how-jvqq-traced-a-12-minute-payments-outage-through-3-million-log-lines/</guid>
      <description>&lt;p&gt;The alert says checkout is slow. You have the last six hours of application logs as one JSON Lines file, 1 GiB and 3,073,492 lines, and a handful of questions to answer before anyone can fix anything. Which service? Since when? Which endpoint? Each question is a jq filter, and with jq the first one alone took half a minute.&lt;/p&gt;&#xA;&lt;p&gt;This is a worked example. The log is generated by jvqq&amp;rsquo;s benchmark generator, and we planted an incident in it: from 03:10 to 03:22, about 60% of the billing service&amp;rsquo;s payment requests fail with 503 after 2 to 4 seconds. Everything else in the file is ordinary traffic, with its usual background of errors. The commands and output below are real, run with jvqq 0.1.0 and jq 1.7.1 on a two-core cloud VM.&lt;/p&gt;</description>
    </item>
    <item>
      <title>jvqq Reads a Week of Gzipped Logs Faster Than zcat Can Unzip Them</title>
      <link>https://jvq.net/jvqq-reads-a-week-of-gzipped-logs-faster-than-zcat-can-unzip-them/</link>
      <pubDate>Mon, 19 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://jvq.net/jvqq-reads-a-week-of-gzipped-logs-faster-than-zcat-can-unzip-them/</guid>
      <description>&lt;p&gt;Most log files older than a day are compressed. Logrotate gzips them, object storage keeps them as &lt;code&gt;.gz&lt;/code&gt;, and the habit for querying them is a pipe: &lt;code&gt;zcat app-*.jsonl.gz | jq ...&lt;/code&gt;. It works, and it&amp;rsquo;s slow twice over. gzip unpacks on one core, and jq parses on one core, each waiting on the other.&lt;/p&gt;&#xA;&lt;p&gt;jvqq reads gzip and zstd files directly, recognized by their first bytes, and parses on every core. This worked example is a week of rotated application logs: seven daily files from jvqq&amp;rsquo;s benchmark generator, 150 MiB each uncompressed and about 23 MB each compressed, 161 MB in all and 3,151,367 lines. The commands below ran with jvqq 0.1.0 and jq 1.7.1 on a two-core cloud VM, with the files already in the page cache.&lt;/p&gt;</description>
    </item>
    <item>
      <title>jvqq Runs jq Filters on Every Core and Is Tested Against jq Byte for Byte</title>
      <link>https://jvq.net/jvqq-runs-jq-filters-on-every-core-and-is-tested-against-jq-byte-for-byte/</link>
      <pubDate>Mon, 19 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://jvq.net/jvqq-runs-jq-filters-on-every-core-and-is-tested-against-jq-byte-for-byte/</guid>
      <description>&lt;p&gt;Application logs tend to end up in the same shape: a file of a few gigabytes with one JSON event per line, and a question about it. How many 500s per service since the deploy? Which requests hit the timeout? jq answers that kind of question well. On a big file it takes its time, because it reads on one core.&lt;/p&gt;&#xA;&lt;p&gt;jvqq 0.1 is a command-line tool that takes the same filters and runs them on every core. The output comes out in input order and is what jq would print, down to the byte. On a four-core GitHub-hosted runner, seven filters over 1 GiB of logs took 0.7 to 1.8 seconds each with jvqq and 17 to 35 seconds with jq.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
