Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tracer

An mtr-style continuous traceroute with braille-sparkline latency history and simultaneous IPv4 + IPv6 paths.

tracer running against dns.google over both IPv4 and IPv6, with per-hop braille sparklines and a recent-outages panel

tracer  kaiton.local  ·  last 280 pings                    2026-06-25T22:47:30-0700

IPv4 → google.com (142.250.72.46)
 1. gateway                          0%   3.2ms  ⣀⣀⣀⣀⣿⣇⣿⣸⣇⣿⣸⣿⣸⣇⣿⣸⣿⡀⢀
 2. 100.64.0.1                       0%  42.8ms  ⣤⣤⣠⣤⣠⣄⣠⣄⣤⣤⣄⣠⣄⣠⣠⣤⣠⣤⣀
 3. (waiting for reply)            100%     --   ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
 ...

IPv6 → google.com (2607:f8b0:400a:809::200e)
 1. customer.sttlwax1.isp.starlin…   0%   7.4ms  ⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀
 ...

scale 0–102ms   ⣀ low → ⣿ high   ⣿ = packet loss   q quit · r reset stats

Why it's different from mtr

  • Braille sparklines instead of a color key. Each row is a dense sparkline: one braille glyph encodes two consecutive pings as vertical bars 0–4 dots tall, so a row shows twice as many samples as columns. Bar height is the latency on a single global scale (the worst hop sets the ceiling), so you can read where latency enters the path at a glance — no legend to memorize. Lost probes render as full-height bars in red (as × in -mono and -report, where there's no red to set them apart). Like mtr, history is right-aligned with the newest ping pinned to the right edge; probes are paced across the interval so each row's newest column fills in live as its reply lands.
  • Two scales at once. Bar height uses a per-family scale (that family's worst hop sets the ceiling, shown in the header) so you see where latency enters the path without a slow family flattening a fast one. Color is an independent per-row gradient (cool → warm over each hop's own min→max), so you can also spot a hop's jitter even when it's globally flat. Red is reserved for packet loss. Disable the gradient with -mono.
  • Non-responding hops collapse. Consecutive routers that never answer (ICMP filtered) collapse into one dim (no reply) line instead of a wall of red.
  • Origin AS per hop (-z). Annotates each hop with the network that owns it (via Team Cymru), so the handoff between providers — e.g. STARLINKGOOGLE — is obvious, and you can see whether IPv4 and IPv6 transit different networks.
  • Glanceable connectivity banner. A bold ● ONLINE / ◐ UNSTABLE / ● OFFLINE 4s line at the top, driven by how long since the destination last replied — so you get an at-a-glance "is it down right now, and for how long" cue without reading the sparklines. ONLINE if either address family is reachable.
  • Jitter column + availability. Each hop shows RTT stddev (±8ms) — often the first sign a call's about to get choppy, before any loss — and each family header shows its destination availability (98.7% up).
  • Outage log. Recent destination-unreachable episodes are listed below the chart (family, duration, time-ago) and in the -report output. When a family's outages recur regularly (Starlink's satellite cadence often does), it notes the period: v6 ≈ every 15s.
  • Survives outages. Built to be left running through dropouts: a transient network error never kills the receiver, startup DNS retries through a gap, and hop hostname/AS lookups that fail while DNS is down retry on their own, so it keeps monitoring and recovers on its own when the link returns. A reply that straggles in after the timeout (within 60s) is credited back, repairing the loss stats.
  • Adaptive timeout. The wait before a probe counts as lost tracks the measured path RTT (per-hop Jacobson estimator, capped by -t), so loss shows in a fraction of a second on a fast path instead of after a fixed 2s, while a genuinely slow hop is never timed out early.
  • Flags deprioritized routers. Some routers deprioritize ICMP addressed to themselves — their echo replies queue for tens of seconds while packets through them stay fast (Starlink's PoP gateway does this). When such replies are the majority for a hop, tracer greys the whole row and tags it deprioritized instead of showing a misleading multi-second average, and those queued replies never inflate the bar scale, so one deprioritized hop can't flatten the rest of the chart.
  • Dual-stack at once. When a host resolves to both A and AAAA records, tracer runs two independent traceroutes — IPv4 on top, IPv6 below — so path-dependent problems (one family slow or broken) are immediately visible.
  • No sudo required. By default tracer uses unprivileged datagram ICMP sockets (the same mechanism ping uses). On Linux these are gated by a sysctl — make sure your gid is inside net.ipv4.ping_group_range (many distros ship it as 1 0, i.e. nobody). Pass -r to use raw sockets where datagram ICMP isn't permitted; that mode needs root.

Usage

tracer [flags] <host>

  -i  interval between full probe cycles (default 0.5s)
  -t  max timeout before a probe counts as lost (default 2s; adapts down to the path RTT)
  -m  maximum number of hops (default 30)
  -4  IPv4 only
  -6  IPv6 only
  -r  use raw ICMP sockets (needs root)
  -mono  disable the per-row latency color gradient
  -z  show each hop's origin AS number + name (Team Cymru)
  -report <dur>  run headless for the duration, print a plain-text report, exit

Keys while running: q quit, r reset statistics.

Build

go build -o tracer .

Requires Go 1.26+.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages