This blog goes back to 2019, and the archive won’t tell you which posts are worth your time. This page will.
I work on Go instrumentation at Datadog APM. Before that I built continuous profiling at Polar Signals (Parca), and I maintain Prometheus. Most of what follows comes out of that work: making production systems legible, then measuring them honestly. Pick the path that matches whatever dragged you here.
Profiling and symbolization
How profilers turn a running program into something a human can read. Start with the pictures, then work down to the symbol tables underneath.
- Ice and Fire: How to read icicle and flame graphs. If a flame graph has ever stared back at you, start here. What the widths mean, why icicles hang upside down, and when to reach for each.
- Fantastic Symbols and Where to Find Them - Part 1. How debuggers and profilers translate raw memory addresses into function names using ELF, DWARF, and symbol tables. The compiled-language half of the story.
- Fantastic Symbols and Where to Find Them - Part 2. The messy half: finding symbols in Python, Ruby, JavaScript, the JVM, and other runtimes that generate code on the fly.
- Profiling Python with eBPF. What it takes to profile Python continuously in production without touching the code, using Parca.
eBPF and instrumentation
Getting telemetry out of programs that were never asked politely. I spent years building eBPF-based profilers; these days I instrument Go for a living.
- Profiling Python and Ruby using eBPF. Interpreter internals from the kernel’s point of view: how an eBPF profiler walks a Python or Ruby stack.
- Auto-Instrumenting Go: From eBPF to USDT Probes. Four ways to instrument Go without changing source code (eBPF, compile-time, runtime injection, USDT), with benchmarks. My day job, measured.
- OTel Unplugged EU 2026: Field Notes. Where OpenTelemetry auto-instrumentation is heading, straight from the hallway track in Brussels.
Go and performance
Making Go fast, and proving it with numbers instead of vibes.
- Measuring Software Performance: Why Your Benchmarks Are Probably Lying. Opens with a loose cable that briefly broke physics, ends with practical advice on hardware noise and statistics.
- Fix Go Module Downloads Behind a Corporate VPN. A small GOPROXY trick (the pipe separator) for when the corporate module proxy is unreachable.
- Making Drone Builds 10 Times Faster!. The post that started this blog: building and open-sourcing drone-cache to cut CI times.
If the Go toolchain itself is your thing, the talk Unleashing the Go Toolchain covers what -toolexec makes possible at compile time.
AI-assisted engineering
The newest thread. I’m figuring this out in public, same as everyone else.
- Vibe Coding with Cursor: My R&D Week Adventure. A week of using an AI-powered IDE for everything, code and notes alike. Where it shines and where it face-plants.
- Stop Putting API Keys in Your Shell Config. Every agent wants an API key, and your
.zshrcis not a vault. A five-minute fix with the 1Password CLI. - When Hustle Culture and Personal Values Collide. What a short stint at an AI/ML startup taught me about pace, values, and knowing when to leave.
Keep going
I speak at conferences more often than I blog; the talks page has recordings on Thanos, Parca, Prometheus, and eBPF going back to 2020. For new posts by email, there’s the newsletter. And if you want to know who’s behind all this, the about page has the full story, PGP key included.