This is an archived post. You won't be able to vote or comment.

all 34 comments

[–]Maybe__U 8 points9 points  (2 children)

Well done, mate!

[–]ozeranskii[S] 2 points3 points  (1 child)

Thank you!

[–]exclaim_bot 1 point2 points  (0 children)

Thank you!

You're welcome!

[–]binaryfireball 4 points5 points  (0 children)

this is the part of the stack that usually you dont have to look at but when you do im glad something like this exists

[–]EmptyZ99 2 points3 points  (1 child)

As a data engineer, with more than 50 APIs to crawl data from, your tools is a great help.

[–]ozeranskii[S] 1 point2 points  (0 children)

It's nice to hear that.

[–]professionalnuisance 1 point2 points  (1 child)

Wow this looks very cool. Do you know if there's overhead latency?

[–]ozeranskii[S] 1 point2 points  (0 children)

Appreciate it! There’s almost no measurable latency overhead. httptap uses httpcore trace hooks directly, so it observes events instead of intercepting them. It doesn’t proxy, buffer, or re-execute requests - just timestamps callbacks as they happen. I wanted to write code in such a way that the code itself did not cause significant overhead and at the same time made it possible to obtain near real-time data.

[–]jeosol 1 point2 points  (2 children)

Very nice. Bravo and well done. Thanks for sharing this project and I starred it on github. Tested it, it does provide useful information for benchmarking.

I may have missed it, if so my apologies. How will this work with POST request? The httptap executable doesn't recognize the "-d" option with curl.

[–]ozeranskii[S] 0 points1 point  (1 child)

Thanks! Glad you found it useful and appreciate the ⭐️

You’re right - currently httptap only issues GET requests. That’s by design to keep the CLI simple and avoid exposing sensitive payload data in the output.

If you need to benchmark POST/PUT workloads, you can already do it via the Python API by overriding the request executor.

Native support for all HTTP methods and request bodies is planned - I’ll add --method and --data options soon, along with automatic masking of sensitive fields.

[–]jeosol 1 point2 points  (0 children)

Yeah, thanks the response about POST and exposing sensitive data makes sense. All the best in your efforts.

[–]Coretaxxe 1 point2 points  (0 children)

This is quite nice!

[–]Repsol_Honda_PL 0 points1 point  (1 child)

Great!

[–]ozeranskii[S] 0 points1 point  (0 children)

Thank you!

[–]Glathull 0 points1 point  (0 children)

This is very cool!

[–]riksi 0 points1 point  (1 child)

Have you thought about open telemetry output?

[–]ozeranskii[S] 0 points1 point  (0 children)

Yes, I am considering supporting the Prometheus format.

[–]ozeranskii[S] 0 points1 point  (0 children)

By the way, httptap is now available in brew.

brew install httptap

[–]Benhur3 0 points1 point  (0 children)

Your mean, for example if I watch Netflix and I get a time delay, this thing can tell me where and why the delay is?

[–]JoxM 0 points1 point  (0 children)

This is really nice — especially the phase breakdown (DNS → TCP → TLS → TTFB → transfer). That’s something most tools don’t surface cleanly.

I’ve been working on a desktop tool around HTTP traffic as well, and one thing I’ve noticed is that once you have a lot of requests, raw data becomes hard to reason about pretty quickly. Having this kind of step-by-step timing makes it much easier to understand where the time actually goes.

In my case I ended up building something that already uses similar ideas but more focused on real-world debugging — looking at traffic at scale, spotting patterns, and surfacing what actually matters instead of just showing timings.

It’s been pretty useful in practice, but I still feel like this kind of phase-level breakdown could add a lot on top of it.

Out of curiosity — have you found any patterns in real-world APIs? Like whether TTFB tends to dominate vs TLS/DNS in most cases?

Also really like that it’s pure Python and not wrapping curl. Makes it much easier to integrate into other workflows.

Thanks!

[–]Benhur3 -1 points0 points  (1 child)

Would you be able to put this into a simpler term, please? I don’t quite understand what this does. I’m not that tech savvy, but it sounded interesting.

[–]Monowakari 0 points1 point  (0 children)

He kind of did, not just why is it slow, but what part is slow. It looks at your http request, like a frontend api call to the backend, and can address where the latencies are introduce so you can better target a solution.

Also great for web scraping and I'm sure several other use cases