<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Monitoring on Tom Meurs</title>
    <link>https://tommeurs.nl/en/tags/monitoring/</link>
    <description>Recent content in Monitoring 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/tags/monitoring/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>Data-Driven Kubernetes Migration: Why You Need Metrics Before You Move</title>
      <link>https://tommeurs.nl/en/posts/kubernetes-resource-sizing/</link>
      <pubDate>Sun, 08 Feb 2026 14:00:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/kubernetes-resource-sizing/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; An e-commerce client moved a PHP monolith to EKS in October, two weeks before Black Friday, with resource limits guessed from the old server specs. Mid-morning the pods hit their memory limit, died in a loop for four hours, and the estimate was €240,000 in lost revenue. The second half is how to get those numbers from load tests and VPA recommendations instead of guessing them.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;We want to migrate to Kubernetes by November.&amp;rdquo;&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>
    <item>
      <title>Runtime Security with Falco: Detect Suspicious Behavior in Your Cluster</title>
      <link>https://tommeurs.nl/en/posts/falco-runtime-security/</link>
      <pubDate>Thu, 07 Aug 2025 10:00:00 +0200</pubDate>
      <guid>https://tommeurs.nl/en/posts/falco-runtime-security/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Trivy and Kyverno check an image before it runs. Falco watches what the container does after that, syscall by syscall, and alerts when the behaviour doesn&amp;rsquo;t match a rule. This post goes from the one thing Falco does to the config I run, with the noise problem in between.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I scanned my images with &lt;a href=&#34;https://tommeurs.nl/en/posts/trivy-container-scanning/&#34;&gt;Trivy&lt;/a&gt;. I enforced policies with &lt;a href=&#34;https://tommeurs.nl/en/posts/kyverno-policies-governance/&#34;&gt;Kyverno&lt;/a&gt;. My workloads got cryptographic identity through &lt;a href=&#34;https://tommeurs.nl/en/posts/spiffe-spire-zero-trust/&#34;&gt;SPIFFE&lt;/a&gt;. Three layers of prevention, all green, and for a while that felt like enough.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Drift Detection with ArgoCD: How to Know If Your Cluster Is Still in Sync</title>
      <link>https://tommeurs.nl/en/posts/argocd-drift-detection/</link>
      <pubDate>Sat, 03 May 2025 19:27:00 +0200</pubDate>
      <guid>https://tommeurs.nl/en/posts/argocd-drift-detection/</guid>
      <description>&lt;p&gt;The whole pitch of GitOps is that Git is the source of truth. That promise holds right up until someone runs &lt;code&gt;kubectl edit&lt;/code&gt; on a deployment at 2am to stop an incident, a mutating webhook quietly rewrites a resource, or a half-finished sync leaves your cluster somewhere between what Git wanted and what it got. Now Git says one thing and the cluster does another, and nobody told you.&lt;/p&gt;&#xA;&lt;p&gt;That gap is configuration drift, and it is the part of GitOps people forget to defend. The good news: &lt;a href=&#34;https://argo-cd.readthedocs.io/&#34;&gt;ArgoCD&lt;/a&gt; already watches for it. The catch is that the defaults don&amp;rsquo;t do what you probably assume, and a few of them will bite you. This post walks from the simplest possible drift check up to the setup I actually run, one layer at a time. Stop wherever you have enough.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
