04 Posts
Notes on building Bilis
What we chose, what we left out, and why. Mostly the parts that are hard to see from the outside: the shape of the ClickHouse table, the contract at the edge of ingest, and the features that are missing on purpose.
Atom feed-
Pointing Bilis at itself found four bugs in an afternoon
Instrumenting Bilis with OpenTelemetry so it stores its own traces. The library choice was the easy part; the interesting part was everything that only breaks when a tracing backend is also a traced application.
Samuel Vrablik
-
Ingest never blames the client
Why the Bilis ingest endpoints answer 202 with a count instead of rejecting your batch, and what that costs us.
Samuel Vrablik
-
Bilis decodes OTLP protobuf without a protobuf library
Why the binary OTLP endpoint is a few hundred lines of hand-written PHP instead of a composer package or a PECL extension, and what makes that a safe thing to hand-write.
Samuel Vrablik
-
The sort key leads with ProjectId
Why the Bilis logs table sorts by project first, why that is worth diverging from the upstream OpenTelemetry exporter for, and why it is not a tenancy boundary.
Samuel Vrablik