feat(check-ip): print stage timings to stderr

Always-on "Loading X... Nms" lines on stderr for blocklists, geoip,
and whitelist load stages. Makes it obvious at a glance that the cost
is cold-start parsing (not re-downloading) and surfaces the sizes of
the loaded sets. Stdout stays clean for pipe-friendly consumption.
This commit is contained in:
AJ ONeal 2026-04-20 17:36:21 -06:00
parent c99cd3a2b8
commit 36b015f84a
No known key found for this signature in database

View File

@ -134,9 +134,15 @@ func main() {
repo.FilePath("tables/outbound/networks.txt"), repo.FilePath("tables/outbound/networks.txt"),
) )
}) })
t := time.Now()
if err := blocklists.Load(context.Background()); err != nil { if err := blocklists.Load(context.Background()); err != nil {
log.Fatalf("blocklists: %v", err) log.Fatalf("blocklists: %v", err)
} }
fmt.Fprintf(os.Stderr, "Loading blocklists... %s (inbound=%d, outbound=%d)\n",
time.Since(t).Round(time.Millisecond),
cfg.inbound.Value().Size(),
cfg.outbound.Value().Size(),
)
// GeoIP: download the City + ASN tar.gz archives via httpcache // GeoIP: download the City + ASN tar.gz archives via httpcache
// conditional GETs. geoip.Open extracts in-memory — no .mmdb files // conditional GETs. geoip.Open extracts in-memory — no .mmdb files
@ -170,9 +176,11 @@ func main() {
cfg.geo = dataset.Add(geoSet, func() (*geoip.Databases, error) { cfg.geo = dataset.Add(geoSet, func() (*geoip.Databases, error) {
return geoip.Open(maxmindDir) return geoip.Open(maxmindDir)
}) })
t = time.Now()
if err := geoSet.Load(context.Background()); err != nil { if err := geoSet.Load(context.Background()); err != nil {
log.Fatalf("geoip: %v", err) log.Fatalf("geoip: %v", err)
} }
fmt.Fprintf(os.Stderr, "Loading geoip... %s\n", time.Since(t).Round(time.Millisecond))
defer func() { _ = cfg.geo.Value().Close() }() defer func() { _ = cfg.geo.Value().Close() }()
// Whitelist: combined IPs + CIDRs in one file, polled for mtime changes. // Whitelist: combined IPs + CIDRs in one file, polled for mtime changes.
@ -183,9 +191,14 @@ func main() {
cfg.whitelist = dataset.Add(whitelistSet, func() (*ipcohort.Cohort, error) { cfg.whitelist = dataset.Add(whitelistSet, func() (*ipcohort.Cohort, error) {
return ipcohort.LoadFile(cfg.WhitelistPath) return ipcohort.LoadFile(cfg.WhitelistPath)
}) })
t = time.Now()
if err := whitelistSet.Load(context.Background()); err != nil { if err := whitelistSet.Load(context.Background()); err != nil {
log.Fatalf("whitelist: %v", err) log.Fatalf("whitelist: %v", err)
} }
fmt.Fprintf(os.Stderr, "Loading whitelist... %s (entries=%d)\n",
time.Since(t).Round(time.Millisecond),
cfg.whitelist.Value().Size(),
)
} }
for _, ip := range ips { for _, ip := range ips {