<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Observability on Tom Meurs</title>
    <link>https://tommeurs.nl/en/categories/observability/</link>
    <description>Recent content in Observability on Tom Meurs</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© Tom Meurs</copyright>
    <lastBuildDate>Sat, 02 May 2026 20:15:00 +0100</lastBuildDate>
    <atom:link href="https://tommeurs.nl/en/categories/observability/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Grafana Dashboards That Actually Get Used</title>
      <link>https://tommeurs.nl/en/posts/grafana-dashboards-that-work/</link>
      <pubDate>Sat, 02 May 2026 20:15:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/grafana-dashboards-that-work/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Each dashboard answers one question, and within five seconds I know whether I need to care. Four kinds of dashboard cover everything, variables and links tie them together, and the JSON lives in Git. My homelab runs five, and anything that goes a month unopened gets deleted.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;You have Grafana. You have &lt;a href=&#34;https://tommeurs.nl/en/posts/prometheus-thanos-metrics/&#34;&gt;Prometheus metrics&lt;/a&gt;. You have &lt;a href=&#34;https://tommeurs.nl/en/posts/loki-kubernetes-logging/&#34;&gt;logs in Loki&lt;/a&gt; and &lt;a href=&#34;https://tommeurs.nl/en/posts/tempo-distributed-tracing/&#34;&gt;traces in Tempo&lt;/a&gt;. The data&amp;rsquo;s all there.&lt;/p&gt;&#xA;&lt;p&gt;You also have 47 dashboards nobody opens.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Alerting That Works: From Alert Fatigue to Actionable Notifications</title>
      <link>https://tommeurs.nl/en/posts/alerting-that-works/</link>
      <pubDate>Thu, 16 Apr 2026 20:15:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/alerting-that-works/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Most default alert rules page on a number with no user behind it, and after a week of that you stop reading pages. I alert on error rate, P99 latency, a disk that fills within 24 hours and a certificate under seven days, about ten rules in total, each with a runbook. Alertmanager sends critical to the pager, warning to Slack during office hours, info nowhere. Everything that doesn&amp;rsquo;t need a human gets deleted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Distributed Tracing with Tempo and OpenTelemetry</title>
      <link>https://tommeurs.nl/en/posts/tempo-distributed-tracing/</link>
      <pubDate>Sat, 04 Apr 2026 19:47:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/tempo-distributed-tracing/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Tempo is where my traces go. The OpenTelemetry Collector receives spans from every service, tail sampling keeps every error and every slow request, and Tempo writes the rest to MinIO with three days of retention. From a span in Grafana I click through to the Loki lines with the same trace ID. My production values are at the bottom.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Your &lt;a href=&#34;https://tommeurs.nl/en/posts/prometheus-thanos-metrics/&#34;&gt;metrics&lt;/a&gt; say something is slow. Your &lt;a href=&#34;https://tommeurs.nl/en/posts/loki-kubernetes-logging/&#34;&gt;logs&lt;/a&gt; say errors happened. Fine. Which request failed, where did the latency come from, and which service in the chain ate the timeout? Neither of them can tell you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Loki for Kubernetes Logging: The Prometheus-Like Approach</title>
      <link>https://tommeurs.nl/en/posts/loki-kubernetes-logging/</link>
      <pubDate>Tue, 31 Mar 2026 21:15:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/loki-kubernetes-logging/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Loki indexes labels and stores the log text as compressed chunks, so a month of logs fits on commodity hardware. The trade is full-text search. Below is the single-binary install I&amp;rsquo;d hand anyone first, the same chart on MinIO with three replicas, and the knobs I didn&amp;rsquo;t touch until the volume was real.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;You&amp;rsquo;ve got &lt;a href=&#34;https://tommeurs.nl/en/posts/prometheus-thanos-metrics/&#34;&gt;Prometheus for metrics&lt;/a&gt;, so you can already see what&amp;rsquo;s happening across your clusters. Metrics tell you request latency spiked at 14:32. They don&amp;rsquo;t tell you the payment service threw a null pointer because someone shipped a config change with a typo. For that you need the log line.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Thanos Remote Write: Push-Based Metrics for Edge and Multi-Cluster</title>
      <link>https://tommeurs.nl/en/posts/thanos-remote-write-push-architecture/</link>
      <pubDate>Fri, 27 Mar 2026 20:38:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/thanos-remote-write-push-architecture/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Thanos Receive turns the metrics flow around. Each edge Prometheus pushes samples over &lt;code&gt;remote_write&lt;/code&gt; to one central endpoint, buffers in its WAL when the link drops, and never sees an object storage credential. Below is the Receive StatefulSet, the hashring, the edge config, two ways to lock the endpoint down, and the hybrid I run with sidecars on the core clusters.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;In my &lt;a href=&#34;https://tommeurs.nl/en/posts/prometheus-thanos-metrics/&#34;&gt;previous post on Prometheus and Thanos&lt;/a&gt;, I set up the sidecar architecture. &lt;span class=&#34;def&#34; tabindex=&#34;0&#34; data-def=&#34;Gives Prometheus long-term storage in object storage and one query view across several Prometheus servers, without changing how Prometheus scrapes.&#34;&gt;Thanos&lt;/span&gt;&#xA; Sidecar runs next to Prometheus, uploads TSDB blocks to object storage, and exposes the data to the Querier over gRPC. For clusters in the same datacenter with a fat, stable link to the central infrastructure, I&amp;rsquo;ve got no complaints. Everything pulls, and everything can reach everything else.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Prometheus and Thanos: Metrics at Scale</title>
      <link>https://tommeurs.nl/en/posts/prometheus-thanos-metrics/</link>
      <pubDate>Sun, 31 Aug 2025 10:00:00 +0200</pubDate>
      <guid>https://tommeurs.nl/en/posts/prometheus-thanos-metrics/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Prometheus on its own keeps a couple of weeks of metrics on local disk and can&amp;rsquo;t answer a question across clusters. Thanos puts a sidecar next to each Prometheus, ships the blocks to object storage, and puts a querier in front that reads all of it back through the same PromQL. Below is the install, the four components, the HA and multi-cluster wiring, and the numbers I run in production.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
