Wikielele. DNS · self-hosted DNS analytics
docs for
back to the dashboard

Why history is the whole argument

A circular buffer is the constraint every other limitation follows from.

everyoneAssumes a home network and that you have heard of DNS.page 19 of 24

Everything this product does that AdGuard Home does not is downstream of one decision: keep the log instead of letting it overwrite itself.

This is the weakest of the arguments on Pi-hole, and it is worth saying so plainly: FTL already keeps a year. What follows is the AdGuard version of the argument, and then what is actually left of it here.

What a circular buffer means in practice#

A is sized in entries, not in days. When it fills, the oldest entry is overwritten by the newest. On a household doing tens of thousands of lookups a day, that is a few hours.

AdGuard Home query log

holds 0 · 0 lost

fixed capacity · oldest overwritten on arrival

elele. DNS store

holds 0 · 0 lost

append only · detail pruned at 90 days, rollups kept

Both are receiving the same queries. AdGuard Home's log is sized in entries, so on a household doing tens of thousands of lookups a day it holds a few hours; the store keeps ninety days of detail and hourly rollups forever.

It is a completely reasonable design for a resolver. A resolver needs recent history to debug “why did that not load a minute ago”, and keeping more would mean managing storage on devices that often have very little. The constraint only becomes a problem the moment you want to ask a question about last Tuesday.

What becomes possible with ninety days#

QuestionNeeds
Is this domain new to my network?Every domain's first_seen, over the whole window
When is this device usually awake?Enough weeks to make an hour-of-week grid mean something
Did blocking this break anything?Before and after, days apart
Is this thing beaconing?Hundreds of intervals to measure evenness across
Has this device gone quiet?A baseline of what normal was for it
Is my resolver slower than last month?Last month

None of those are exotic. All of them are impossible against four hours of data, and that is the entire reason the ingest layer exists.

What it costs#

  • Disk. 300–500MB for ninety days of a busy household, indexes included.
  • Writes. A handful of rows a second, batched into transactions, on a card that does not love being written to. This is why the SQLite pragmas are what they are.
  • A second process to keep running. If ingest stops, the history stops. There is no way to recover the gap afterwards, because AdGuard Home has already overwritten it.On Pi-hole the gap is usually recoverable, because FTL still has the rows — backfill walks back into them when ingest restarts. It is the one failure mode that is genuinely less bad here. That is why the lag indicator is in the top bar of every screen rather than on a settings page.

See also