Prometheus Histograms on a heatmap (screenshot by author)

I’m a big fan of Grafana’s heatmaps for their rich visualization of time-based distributions. Paired with Prometheus Histograms we have incredible fidelity into Rate and Duration in a single view, showing data we can’t get with simple p* quantiles alone. Additionally histograms, entirely based on simple counters, can easily be aggregated over label dimensions to slice and dice your data. This isn’t possible with StatsD-style timers which require read-time aggregation on already computed percentages creating inaccurate results.

Unfortunately histograms often confuse people accustomed to the StatsD-style timers producing some form of quantiles and visualizing them on line charts. …


Confession: I was a pecking typist. Not two fingers, probably four-ish. I didn’t have to hunt, I knew where the keys were, and would type reasonably well with this approach. I started typing as a child in the mid/late eighties, but missed the boat on formal typing. I remember using Mavis Beacon but it didn’t stick. I never thought much about it, but recently, my index fingers would hurt at the end of the day. It was time to do something. And I needed a new coronavirus activity.

The Keyboard

Having looked around I decided on the Ergodox EZ, a split style…


Declarative build definition for gRPC

gRPCkit and omniproto are two tools to help with your company’s gRPC development.

gRPC and Protocol Buffers are becoming mainstream tools for developing services. Hello world examples are nice for getting started, but fail at making cross-team gRPC development succeed at growing companies. Teams tend to solve the same problem in different ways, and incur technical debt as copy-and-paste hacks spread across repositories and across languages.

Companies like Bugsnag and Namely (my previous employer) have shared their best practices for managing gRPC files across languages and teams, but standard tooling for the end-to-end lifecycle of gRPC development have yet to…


Five years ago this week my wife and I returned from six months of travel around Asia. We documented our journey in a tumblr blog The Great Big Adventure and posted hundreds of photos on Flickr.

We think about that trip daily and the overall experience has weaved its way into our day-to-day psyche. At the time of our return there were two immediate takeaways:

  1. Our Earth is an amazing place full of natural wonder.
  2. Humanity is an experience and interactions with people from all walks of life are humbling and enlightening. People are genuinely good and want to help.


From an engineering perspective systems grow in three ways: there are more features, those features grow more complex, and there are more requests to those features. To address this complexity — like most refactoring — we extract interfaces and subdivide the system into smaller, isolated, more manageable parts that can be composed together. A successful refactoring creates a less brittle system that is easier to develop as a whole.

Microservices is a popular concept to break down monoliths into smaller, more manageable pieces. Microservices are really just services with a specific, well-defined scope. Services are defined by their API and…


A House in the Woods

This wonderful book is about two homeless animals that destroy the personal property of two pigs, then, as compensation, convince a labor union to build a lavish house on public land, in which everyone can cohabitate. The pigs are left to do more work and become sleep deprived as one of the animals has a bad back and a snoring problem.

The Rainbow Fish

An endearing book in which the proletariat convince a wealthy fish to give up all its wealth for friendship, thanks to a hippie living in a cave.

The Pout-Pout Fish

A lovable story about a senile old fish that realizes if he…


Occasionally I need to parse some input for processing and analysis. A Go Advent post from 2014 described handwritten lexers and parsers using Go for this purpose. The post is worth a read, describing how you can implement your own sql interpreter using nothing more than the standard library. The approach is used in InfluxDB’s query engine and can be quite powerful, but requires a certain amount of ceremony that can also be avoided. By using a parser generator like Yacc and a lexer like Ragel you can better define what the structure is from how you interpret that structure.


Fostering faster development without sacrificing quality.

Faster / better / smarter / cheaper: the huge resource sink which focuses so much time and energy in our industry. How can we deliver more and sustain success?

There are no shortage of solutions: waterfall gave way to agile, which gave way to lean. Java/Php/C# yielded to Ruby, Python and Node which now yields to Go, Rust and Scala. IaaS swayed to PaaS with Docker the new king-of-the-hill. Are these tools helping us ship more or are we still spinning our wheels with shiny new toys?

The alternate view is not on technology nor process but on the individual…

Michael Hamrah

Code. Create. Conquer.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store