Three years of Grafana dashboards as code

At Voi, we’ve been relying on grabana and DARK to generate Grafana dashboards as code for the past three years.

What kind of dashboards did we build? In hindsight, what value did we actually get out of this approach?

Announcing… a Backstage announcements plugin

Technical announcements addressed to engineers are usually made in various places: meetings, Slack channels, Confluence pages, e-mails, …

This plethora of communication channels makes it relatively easy to miss out on relevant information when it’s announced, and almost impossible to re-discover it after the fact.

What if the single pane of glass provided by an engineering portal such as Backstage could be used instead?

Better slack notifications for Grafana

While the introduction of Grafana’s unified alerting system is an improvement, everything isn’t perfect. Slack notifications sent by Grafana whenever an alert is fired or resolved got significantly less readable.

Let’s improve them!

Two years in Sweden

A bit more than two years and a half ago I left my home country – France – to live and work in Stockholm.

Judging by the lack of content on this blog during this period, one could imagine that a lot has happened since.

This post is me, taking a step back and trying to look back at what I’ve accomplished and how much I’ve grown as an engineer.

This blog has continuous integration

It’s probably not a surprise for most of the people reading this blog but I am a software engineer. And as such I spend most of my time writing code, checked in a VCS, reviewed by peers and analyzed by tools before being deployed.

Isn’t it only natural that the content of this blog followed the same rules?

Clusters and data sharding: introducing rendezvous hashing

In a previous article, I started playing with distributed systems by implementing a distributed key-value store.

I used SWIM to create a cluster, know its members and monitor their health. But I still didn’t touch the main feature of my store: actually distributing data. Now is the time to address that.

Questions I ask in an interview

As I currently am looking for a company to work with, I took some time to think about some questions to ask in an interview to gain some insight about the company, its culture and how it works.

Clusters and membership: discovering the SWIM protocol

Have you ever wondered how Cassandra, Redis, Riak, and many others could maintain a cluster? How can a cluster detect nodes addition, nodes removal, nodes failures and keep its state consistent across all the other nodes?
Well, I have. And in this post, we’ll see two of the protocols that this type of service relies upon for their failure detection and memberships.

Best practices for exploitable logs

« What to log? » — That’s the question I often ask myself when I launch new projects or work on existing applications.

And by « what », I mean which events should be logged? Using which format? Where should they be sent?

To answer these questions, we need to ask ourselves why do we need logs in the first place?

Write documentation as tests in PHP using Rusty

Languages such as Python or Rust provide an interesting way to document code: they write code samples inside their documentation and they make them executable. Rusty is an attempt at implementing the same idea in PHP.

Use cases for PHP generators

Despite being available since PHP 5.5.0, generators are still largely underused. Let’s see what how awesome they are through real-world cases.

TIL PHP ::class keyword

The ::class keyword look like it can be used to assert that the generated FQCN will point to a valid class. Guess what: it cant.

Done with school.

That’s it. After five years spent learning computer science in various schools and universities, I’m finally free!

TIL Why is uniqid() slow?

While profiling RulerZ with, I noticed that a non-negligible amount of time was consumed by PHP’s uniqid() function. I found it odd that it consumed so much time and started to investigate why.

TIL Parallel bundle install

In ruby projects, the bundle install command is known to be quite slow. To mitigate this, Bundler provides an option allowing to install gems using parallel workers: bundle install --jobs 4. Just tell Bundler how many concurrent jobs can be launched and let it work.

New life, new blog

I launched my first blog in 2007, when I started to attend lycée (the American equivalent would be High School I guess, something like 9th or 10th grade). While most my posts were kinda tech-oriented, the rest of them were… well let’s say that I was young and that I’ve evolved since!

Symfony best practices

Digest of my best practices for Symfony projects. They are given as is, in no particular order and are far from being exhaustive.