<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SelimBF</title>
    <description>The latest articles on DEV Community by SelimBF (@selimbf).</description>
    <link>https://dev.to/selimbf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F902636%2Ffe61d0bf-d4ce-4983-a55d-37fefd380e2a.jpeg</url>
      <title>DEV Community: SelimBF</title>
      <link>https://dev.to/selimbf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/selimbf"/>
    <language>en</language>
    <item>
      <title>Predict an OOM kill before it happens</title>
      <dc:creator>SelimBF</dc:creator>
      <pubDate>Sat, 07 Nov 2026 11:09:21 +0000</pubDate>
      <link>https://dev.to/selimbf/predict-an-oom-kill-before-it-happens-b8k</link>
      <guid>https://dev.to/selimbf/predict-an-oom-kill-before-it-happens-b8k</guid>
      <description>&lt;p&gt;Most memory alerts fire too late. A rule like "memory above 90% of the limit" tells you a pod is in trouble, but not whether it will be killed in two minutes or never. By the time the alert is read, the container has often already exited with &lt;code&gt;OOMKilled&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ruptura takes a different approach: instead of a threshold, it gives you a &lt;strong&gt;time left&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  One conclusion instead of one more chart
&lt;/h2&gt;

&lt;p&gt;Ruptura runs in your cluster, on top of the Prometheus you already have. For each workload it watches, it returns one structured result per failure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"workload"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo-shop/Deployment/step-leak"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"failureMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"saturation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"predicted"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"degraded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"etaSeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;626&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recommendedAction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Review the memory limit or restart the pod before it is killed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Memory at 75% of its limit"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That reads as: this Deployment is on course to reach its memory limit in about ten minutes, here is why, and here is what to do. The result goes to your Alertmanager, so it follows the routes, silences and receivers you already use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Predicted versus detected
&lt;/h2&gt;

&lt;p&gt;Every result says whether it is &lt;strong&gt;predicted&lt;/strong&gt; (it has not happened yet, and carries &lt;code&gt;etaSeconds&lt;/code&gt;) or &lt;strong&gt;detected&lt;/strong&gt; (it is happening now). Ruptura never dresses up a detection as a prediction.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Predicted&lt;/th&gt;
&lt;th&gt;Detected&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory saturation&lt;/td&gt;
&lt;td&gt;OOM kill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A release that leaks faster than the one it replaced&lt;/td&gt;
&lt;td&gt;Crash loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One replica leaking while its siblings stay flat&lt;/td&gt;
&lt;td&gt;Pod stuck at startup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failures recurring on a regular rhythm&lt;/td&gt;
&lt;td&gt;Unavailable replicas, stuck rollout, CPU throttling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The full rules are on the &lt;a href="https://docs.getruptura.dev/failures/" rel="noopener noreferrer"&gt;failure modes&lt;/a&gt; page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Each workload against its own history
&lt;/h2&gt;

&lt;p&gt;A single global threshold is wrong for most workloads: a cache is supposed to sit near its limit, a stateless API is not. Ruptura compares every workload with its own history. Two of the newest checks show why that matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Release regression.&lt;/strong&gt; When a new version of a Deployment grows toward its memory limit at least 3 times faster than the version it replaced, Ruptura warns up to 2 hours ahead and suggests a roll back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replica divergence.&lt;/strong&gt; When one replica out of three or more grows 3 times faster than the others, Ruptura names that pod. An average across replicas would never show it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest about what it cannot see
&lt;/h2&gt;

&lt;p&gt;A container without a memory limit cannot be forecast for saturation, and a new workload needs about 10 minutes of samples first. Until then its state is &lt;code&gt;calibrating&lt;/code&gt;. &lt;code&gt;GET /api/v2/coverage&lt;/code&gt; lists what each instance can and cannot measure on your cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in two minutes
&lt;/h2&gt;

&lt;p&gt;Locally, no cluster needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/benfradjselim/ruptura
&lt;span class="nb"&gt;cd &lt;/span&gt;ruptura
docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:8081" rel="noopener noreferrer"&gt;http://localhost:8081&lt;/a&gt; and sign in with &lt;code&gt;ruptura-local-dev&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On OpenShift or Kubernetes, follow the &lt;a href="https://github.com/benfradjselim/ruptura#getting-started" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt;: one operator, one &lt;code&gt;RupturaInstance&lt;/code&gt; resource.&lt;/p&gt;

&lt;h2&gt;
  
  
  Help shape it
&lt;/h2&gt;

&lt;p&gt;Ruptura is open source (Apache 2.0) and still early: it is not yet recommended for production. I am looking for teams running Kubernetes or OpenShift with Prometheus who will try it on a test cluster and tell me what is missing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tell me which failure pages you most often in &lt;a href="https://github.com/benfradjselim/ruptura/discussions" rel="noopener noreferrer"&gt;Discussions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Report bugs in &lt;a href="https://github.com/benfradjselim/ruptura/issues" rel="noopener noreferrer"&gt;Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;If it is useful to you, a star on &lt;a href="https://github.com/benfradjselim/ruptura" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; helps others find it&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Docs and getting started: &lt;a href="https://getruptura.dev/?utm_campaign=devto" rel="noopener noreferrer"&gt;getruptura.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>sre</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
