<?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: Metta Surendhar</title>
    <description>The latest articles on DEV Community by Metta Surendhar (@mettasurendhar).</description>
    <link>https://dev.to/mettasurendhar</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%2F1852199%2F386f4c11-0921-400a-a4c6-2a4201a0d3a6.png</url>
      <title>DEV Community: Metta Surendhar</title>
      <link>https://dev.to/mettasurendhar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mettasurendhar"/>
    <language>en</language>
    <item>
      <title>How a Simple Undo Button Made AI Agents 1.5x Better at Fixing Cloud Outages</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Mon, 17 Aug 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/how-a-simple-undo-button-made-ai-agents-15x-better-at-fixing-cloud-outages-1hfm</link>
      <guid>https://dev.to/mettasurendhar/how-a-simple-undo-button-made-ai-agents-15x-better-at-fixing-cloud-outages-1hfm</guid>
      <description>&lt;p&gt;Have you ever wondered how increasing the diameter of a toothpaste tube’s nozzle drastically increased sales? &lt;br&gt;
Turns out it just happens by making &lt;strong&gt;a small change&lt;/strong&gt;, a small tweak to something that already exists.&lt;/p&gt;

&lt;p&gt;Similarly, by adding an &lt;strong&gt;“UNDO”&lt;/strong&gt; to an agentic system, &lt;strong&gt;STRATUS&lt;/strong&gt; significantly outperforms state-of-the-art SRE agents.&lt;br&gt;
At least &lt;strong&gt;1.5x better&lt;/strong&gt; in success rate on failure-mitigation problems, across both &lt;strong&gt;AIOpsLab&lt;/strong&gt; and &lt;strong&gt;ITBench&lt;/strong&gt;, and across various models.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feiqyc3no9qajalllmxja.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feiqyc3no9qajalllmxja.png" width="300" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I mentioned in my previous ITBench post, &lt;a href="https://medium.com/@mettasurendhar/ai-agents-arent-ready-for-it-operations-yet-and-now-there-s-a-benchmark-that-proves-it-8e62a230e2d3" rel="noopener noreferrer"&gt;&lt;strong&gt;AI agents aren’t ready for IT operations yet&lt;/strong&gt;&lt;/a&gt;, and ITBench proved it with systematic benchmarking. Agents powered by the best available models were only able to fully resolve &lt;strong&gt;13.8% of SRE scenarios — a number STRATUS simply blows past.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me explain how they pulled this off, as simply as possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  So How Does “Undo” Even Work?
&lt;/h2&gt;

&lt;p&gt;The UNDO in STRATUS works the same way a normal undo operation works in any system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn1m4pcco5j2qaoc8pqz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn1m4pcco5j2qaoc8pqz7.png" width="399" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yes, of course. But under the hood, it’s using a &lt;strong&gt;stack&lt;/strong&gt; data structure.&lt;/p&gt;

&lt;p&gt;Using the &lt;strong&gt;Last-In-First-Out&lt;/strong&gt; (LIFO) property of a stack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Every action the agent takes gets &lt;strong&gt;pushed&lt;/strong&gt; onto an “&lt;strong&gt;undo stack&lt;/strong&gt;”, one after another as action A1, then A2, then A3, and so on.&lt;/li&gt;
&lt;li&gt;When something needs to be &lt;strong&gt;undone&lt;/strong&gt;, the system &lt;strong&gt;pops&lt;/strong&gt; the &lt;em&gt;most recent action&lt;/em&gt; off the top of the stack first — that’s it.&lt;/li&gt;
&lt;li&gt;Once an action is popped, it’s undone, and it’s removed from the stack.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kodr9uw1yyhh3chkcd1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kodr9uw1yyhh3chkcd1.png" alt="credits&amp;nbsp;: www.besanttechnologies.com" width="500" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;STRATUS uses the same mechanism, calls it as &lt;strong&gt;Transactional Non-Regression (TNR),&lt;/strong&gt; a stack-based rollback mechanism , that enables safe exploration and iteration with help of agents, assumptions, tools, and oracles.&lt;/p&gt;

&lt;p&gt;To understand this properly, we just get to know a glimpse of STRATUS’s helpers and honestly, this is the fun part, and it’s easier than it sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet the Agents
&lt;/h2&gt;

&lt;p&gt;STRATUS has 4 kinds of agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Detection Agent&lt;/strong&gt; — Agent-D&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagnosis Agent&lt;/strong&gt; — Agent-G&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mitigation Agent&lt;/strong&gt; — Agent-M&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undo Agent&lt;/strong&gt; — Agent-U&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fckqksc2uwma2cubsz8zx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fckqksc2uwma2cubsz8zx.png" width="556" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not all agents get access to perform all actions — because they don’t need to. So actions are split into an &lt;strong&gt;Action Space&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read Action&lt;/strong&gt; — for Detection, Diagnosis, and Mitigation agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write Action&lt;/strong&gt; — for the Mitigation agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undo Action&lt;/strong&gt; — for the Undo agent (which internally uses write actions)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzh69ny3p4e7sp3u8gxtc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzh69ny3p4e7sp3u8gxtc.png" width="360" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With these, we construct a &lt;strong&gt;Transaction (T),&lt;/strong&gt; a sequence of read or write actions (commands) of length &lt;code&gt;k&lt;/code&gt;. How &lt;code&gt;k&lt;/code&gt; is decided is where the assumptions come in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Assumptions
&lt;/h2&gt;

&lt;p&gt;Assumptions are base conditions you accept as true before moving forward with something, like assuming Google Maps’ traffic data is live and reliable before you actually take the suggested route.&lt;/p&gt;

&lt;p&gt;Same idea here. STRATUS assumes:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Writer Exclusivity :&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;At most one writer agent&lt;/strong&gt; (Agent-M or Agent-U) is scheduled to execute commands that alter the system state at a time, which means that particular agent gets exclusive access on the environment.&lt;/li&gt;
&lt;li&gt;This is enforced with a lock called the &lt;strong&gt;Agent-Lock (A-Lock)&lt;/strong&gt;, which simply locks the system to whichever writer agent is currently making changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Faithful Undo :&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;To make undo possible, STRATUS ensures every agent action has a &lt;strong&gt;corresponding undo operator&lt;/strong&gt;, otherwise, that action isn’t allowed at all.&lt;/li&gt;
&lt;li&gt;So actions that can’t be recovered are either turned into recoverable actions with the help of agent tools, or rejected entirely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Bounded Risk Window:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A transaction can have length &lt;code&gt;k&lt;/code&gt;, meaning &lt;code&gt;k&lt;/code&gt; actions in sequence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpzcd1jot7yxb74jvhvg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpzcd1jot7yxb74jvhvg.png" width="336" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqymx4bzniulxbwch1cf8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqymx4bzniulxbwch1cf8.png" width="336" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is solved by the &lt;strong&gt;Bounded Risk Window&lt;/strong&gt;, a key safety mechanism that caps the number of actions (&lt;code&gt;K&lt;/code&gt;) a transaction can perform.&lt;/li&gt;
&lt;li&gt;The optimal value turned out to be &lt;strong&gt;K = 20,&lt;/strong&gt; found by running the agents with different limits and seeing what actually worked best.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsfkrokhrzv5k6th8c122.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsfkrokhrzv5k6th8c122.png" width="770" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tools That Make It Move
&lt;/h2&gt;

&lt;p&gt;We now know the base conditions but how do the agents actually &lt;strong&gt;execute&lt;/strong&gt; &lt;strong&gt;actions&lt;/strong&gt;? That’s where agent tools come in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent tools&lt;/strong&gt; are just tools that help the agent interact with the cloud environment, kind of like the &lt;strong&gt;Clap&lt;/strong&gt; button that help me write more blogs, so please go click it bro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbddk4ny58crclzum0ec9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbddk4ny58crclzum0ec9.png" width="262" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few of the main ones:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Observability Tools:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;For observing the cloud by collecting telemetry data and system states.&lt;/li&gt;
&lt;li&gt;They also help pre-process logs and other data instead of dumping raw numbers straight at the agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Command-Line Tools:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;For constructing the actual commands that make changes (and perform undo).&lt;/li&gt;
&lt;li&gt;Also helps notify humans once a task wraps up.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  But How Does It Know When to Stop?
&lt;/h2&gt;

&lt;p&gt;The agents, assumptions, and tools are all ready, and the system starts taking actions but wait,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo60vls518wgl40fo453u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo60vls518wgl40fo453u.png" width="319" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s genuinely worth knowing before we go further.&lt;/p&gt;

&lt;p&gt;For this, STRATUS integrates a structured &lt;strong&gt;Validation and Termination Approach (VTA)&lt;/strong&gt;. In simple words, it assesses system health using three oracles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Alerts&lt;/strong&gt; — whether the alert that reported the target failure is cleared ?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Requests&lt;/strong&gt; — whether user requests can be successfully returned ?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System Health&lt;/strong&gt; — whether system components running in healthy state ?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combining these forms one strong oracle that STRATUS uses to determine successful mitigation and termination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now Comes the Hero: TNR aka UNDO
&lt;/h2&gt;

&lt;p&gt;How does it actually work?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quick note:&lt;/strong&gt; let &lt;strong&gt;b&lt;/strong&gt; denote the severity score of the system the moment the failure was first detected, in other words, a score of just how bad that first failure is.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;According to TNR, every state (&lt;code&gt;Sᵢ&lt;/code&gt;) in the state transition sequence will have severity &lt;em&gt;less than or equal to&lt;/em&gt; &lt;code&gt;b&lt;/code&gt; , meaning no state the agent ever leaves the system in, gets worse than where it started.&lt;/p&gt;

&lt;p&gt;Here’s the loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From a state &lt;code&gt;Sᵢ&lt;/code&gt;, when &lt;strong&gt;Agent-M&lt;/strong&gt; runs a Transaction &lt;code&gt;Tᵢ&lt;/code&gt;, it moves the system toward &lt;code&gt;Sᵢ₊₁&lt;/code&gt;, and each action in the &lt;strong&gt;transaction gets pushed&lt;/strong&gt; onto the stack one by one as it runs.&lt;/li&gt;
&lt;li&gt;If the agent ends up in an &lt;strong&gt;error state&lt;/strong&gt; (&lt;code&gt;S-e&lt;/code&gt;), determined with the help of the oracles, the transaction gets flagged to &lt;strong&gt;abort&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;On abort, Agent-U kicks in, &lt;strong&gt;popping&lt;/strong&gt; actions off the stack one at a time and performing each one’s corresponding undo operation.&lt;/li&gt;
&lt;li&gt;Once the stack is fully emptied, the transaction is completely reverted, back from &lt;code&gt;Sᵢ₊₁&lt;/code&gt; to &lt;code&gt;Sᵢ&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;TNR is then re-verified by checking the severity of the (now restored) state and it holds.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5r8xl7z1948a4xzchgnm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5r8xl7z1948a4xzchgnm.png" width="770" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I mentioned at the start, it’s really just UNDO, done efficiently, with the help of assumptions, tools, and oracles working together.&lt;/p&gt;

&lt;p&gt;I just wanted to share how this one “simple” idea “&lt;strong&gt;UNDO&lt;/strong&gt;”, pushed STRATUS to results 1.5x better than other agents.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr5b7cp1qg7u9jwjph11j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr5b7cp1qg7u9jwjph11j.png" width="430" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to dig deeper, the full results and evaluations, give the paper a read: &lt;a href="https://arxiv.org/abs/2506.02009" rel="noopener noreferrer"&gt;STRATUS: A Multi-agent System for Autonomous Reliability Engineering of Modern Clouds&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>research</category>
      <category>sre</category>
      <category>agents</category>
    </item>
    <item>
      <title>SigNoz Speaks Two Dialects. I Built the Thing That Translates Between Them.</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Thu, 13 Aug 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/signoz-speaks-two-dialects-i-built-the-thing-that-translates-between-them-5ank</link>
      <guid>https://dev.to/mettasurendhar/signoz-speaks-two-dialects-i-built-the-thing-that-translates-between-them-5ank</guid>
      <description>&lt;p&gt;Someone on your team writes every query in &lt;a href="https://prometheus.io/docs/prometheus/latest/querying/basics/" rel="noopener noreferrer"&gt;PromQL&lt;/a&gt;. Someone else only touches Query Builder. Both are “right” — &lt;a href="https://signoz.io/" rel="noopener noreferrer"&gt;SigNoz&lt;/a&gt; genuinely supports both. The problem shows up the moment a panel needs to cross from one person to the other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The PromQL person&lt;/em&gt;&lt;/strong&gt; writes a query that works first try, hands the panel over so someone can add a &lt;code&gt;having&lt;/code&gt; filter through the UI. They switch to Query Builder. It's empty. Nothing carried over. The panel gets rebuilt from zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The Query Builder person&lt;/em&gt;&lt;/strong&gt; goes the other way — clicks their way to a working panel, hits a feature the builder doesn’t expose, and has no idea what to type to get the same result in PromQL.&lt;/p&gt;

&lt;p&gt;Same tool, same data, two dialects that don’t talk to each other.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkuwb88kiied0y2bv9tlq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkuwb88kiied0y2bv9tlq.png" width="770" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Janus,&lt;/strong&gt; a browser extension that converts between them, in both directions, without leaving the SigNoz tab. Named after the Roman god with two faces, looking both ways at once, felt fitting for something that has to fluently speak two directions of the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Janus Actually Does
&lt;/h2&gt;

&lt;p&gt;Two modes, one popup:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;PromQL → Query Builder :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Paste a query, or pull one straight off a panel that’s already in PromQL mode. Convert it. Push the result into the panel it came from, or open it fresh in Explorer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fanhjyu1gltmyj4g7wd79.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fanhjyu1gltmyj4g7wd79.png" width="770" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Query Builder → PromQL :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Point Janus at a dashboard panel. It reads that panel’s &lt;em&gt;live&lt;/em&gt; query state and converts it. Anything it can’t convert cleanly goes into a &lt;strong&gt;Notes&lt;/strong&gt; section instead of getting quietly guessed at.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjylp7zfmxe3rewzz1h8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjylp7zfmxe3rewzz1h8z.png" width="770" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That second part mattered more to me than the conversion itself. &lt;strong&gt;&lt;em&gt;A tool that guesses silently and a tool that’s honest about its gaps look identical right up until the moment they don’t.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  WorkFlow :
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
                        ┌────────────────────────┐
                        │        SigNoz          │
                        │  dashboard / explorer  │
                        └───────────┬────────────┘
                     ┌──────────────┴──────────────┐
                     │                             │
        - - - - - - - - - - - - -       - - - - - - - - - - - - -
        | PromQL → Query Builder |      | Query Builder → PromQL |
        - - - - - - - - - - - - -       - - - - - - - - - - - - -
                     │                              │
                     ▼                              ▼
        ┌─────────────────────────┐    ┌──────────────────────────┐
        │  Paste PromQL, or load  │    │   Panel URL, auto-filled │
        │  from a panel URL       │    │   from the active tab    │
        └────────────┬────────────┘    └────────────┬─────────────┘
                     │                              │
                     ▼                              ▼
        ┌─────────────────────────┐    ┌──────────────────────────┐
        │     Parse and convert   │    │  Read live compositeQuery│
        │                         │    │      from the URL        │
        └────────────┬────────────┘    └────────────┬─────────────┘
                     │                              │
                     │                              ▼
                     │                  ┌────────────────────────┐
                     │                  │  Convert, show warnings│
                     │                  └───────────┬────────────┘
                     │                              │
                     ▼                              ▼
        ┌────────────────────────┐    ┌─────────────────────────┐
        │  Open in Explorer, or  │    │  Open in the same panel,│
        │  back in the panel     │    │  now in PromQL mode     │
        └────────────┬───────────┘    └─────────────┬───────────┘
                     │                              │
                     └──────────────┬───────────────┘
                                    │
                                    ▼
                        ┌─────────────────────────┐
                        │     back to SigNoz      │
                        └─────────────────────────┘

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both directions read and write SigNoz’s own &lt;code&gt;compositeQuery&lt;/code&gt; URL parameter : no DOM scraping, no reading class names that'll break the moment SigNoz's frontend changes. Janus reads the same state SigNoz's own UI reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Actually Built It
&lt;/h2&gt;

&lt;p&gt;I didn’t start with a browser extension.&lt;/p&gt;

&lt;p&gt;I started with &lt;code&gt;promql2qb&lt;/code&gt;, a Go CLI that only did &lt;strong&gt;PromQL → Query Builder&lt;/strong&gt; JSON, no UI, nothing pretty; just a command that printed text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The reasoning was simple:&lt;/strong&gt; I wanted to figure out SigNoz's actual internals without also fighting a browser manifest at the same time. It's still the reference implementation for that direction's core logic and Janus ports the same conversion rules to TypeScript rather than reinventing them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Info:&lt;/strong&gt; If you need a real SigNoz instance to test any of this against and you’re on Windows like I was, &lt;a href="https://medium.com/@mettasurendhar/installing-signoz-on-windows-the-fastest-way-5-minutes-no-docker-desktop-eb7c581ff246" rel="noopener noreferrer"&gt;I wrote up the fastest way to get one running&lt;/a&gt; — WSL2, Docker Engine, five minutes, no Docker Desktop crash-loop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That decision paid off fast, because almost everything I assumed going in turned out to be wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Wrong guess #1 — time isn’t time.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;SigNoz’s fixed-step aggregation and PromQL’s &lt;code&gt;_over_time&lt;/code&gt; functions &lt;em&gt;look&lt;/em&gt; like the same idea. I ran the identical query at 60s, 120s, and 300s steps, once through SigNoz's UI, once through the PromQL equivalent and compared the plots.&lt;/p&gt;

&lt;p&gt;At 60s and 120s: close enough to pass as interchangeable. &lt;br&gt;
At 300s: SigNoz flattened to almost one value, while PromQL kept the full shape underneath.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; SigNoz bins the whole range into fixed buckets. PromQL’s &lt;code&gt;_over_time&lt;/code&gt; is a sliding window looking backward from each point. They only agree when the step is small relative to how the data moves.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Wrong guess #2 — it passed my own tests, and that’s exactly the problem.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;My &lt;code&gt;having&lt;/code&gt; conversion produced &lt;code&gt;sum() &amp;gt; 50&lt;/code&gt;, no metric name inside the parens. Looked fine. Passed every test I wrote, because I'd written the tests to expect the same wrong thing.&lt;/p&gt;

&lt;p&gt;I only found the real shape &lt;code&gt;sum(gen) &amp;gt; 50&lt;/code&gt;,by capturing an actual request SigNoz's UI sent and comparing it field by field against what I was generating.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Wrong guess #3 — the most expensive one.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Once I moved from CLI to extension, I wanted Janus to open a converted query directly back into SigNoz. My first URL guess didn’t work. I concluded the &lt;em&gt;path&lt;/em&gt; was wrong and rebuilt the whole flow around a different route.&lt;/p&gt;

&lt;p&gt;The path was fine the entire time. The JSON I was sending it wasn’t.&lt;/p&gt;

&lt;p&gt;SigNoz’s frontend URL state and its query API turned out to be &lt;strong&gt;two different envelopes for the same query,&lt;/strong&gt; not one shape reused twice, which is what I’d assumed. I only caught it by putting a captured URL side by side with the real API request it triggered.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkbse6ak1wthnp5pvptug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkbse6ak1wthnp5pvptug.png" width="770" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Then a different kind of problem entirely.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Building the reverse direction, Query Builder back to PromQL, meant handling real boolean logic: &lt;code&gt;AND&lt;/code&gt;, &lt;code&gt;OR&lt;/code&gt;, &lt;code&gt;NOT&lt;/code&gt;, &lt;code&gt;IN&lt;/code&gt;. Converting that cleanly into PromQL meant parsing that grammar and reducing it to &lt;a href="https://en.wikipedia.org/wiki/Disjunctive_normal_form" rel="noopener noreferrer"&gt;disjunctive normal form&lt;/a&gt;, so any boolean combination collapses into one or more AND-only branches — each one mapping to a clean PromQL selector.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outcomes
&lt;/h2&gt;

&lt;p&gt;Janus does both directions today, live inside SigNoz’s own tabs, tested the whole way through against a real self-hosted instance, not a mocked API. Every JSON shape it produces has a real captured payload it was checked against.&lt;/p&gt;

&lt;p&gt;It’s not comprehensive, and I didn’t want it to pretend to be. It covers a defined subset of PromQL: the aggregations, functions, and grouping people actually reach for and the project is upfront, in its own &lt;code&gt;LIMITATIONS.md&lt;/code&gt;, about what falls outside that subset.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Proof both directions actually land back in a working SigNoz panel :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcvjp1q6yqn1jx6p4ccpw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcvjp1q6yqn1jx6p4ccpw.png" width="770" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxpdcktoss1lk9b3u10ft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxpdcktoss1lk9b3u10ft.png" width="770" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I’d Do Differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I’d capture real network traffic earlier.&lt;/strong&gt; All three wrong guesses above cost time for the same reason: I trusted a plausible-looking assumption before checking it against something real. The fix, every time, was identical; stop reasoning about how SigNoz &lt;em&gt;probably&lt;/em&gt; works, go watch what it actually sends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I’d test the reverse direction against messier, real dashboards from the start.&lt;/strong&gt; Most of my Query Builder test cases were ones I’d built myself clean, on purpose.&lt;/p&gt;

&lt;p&gt;Real dashboards, clicked together by different people over months, are messier than anything I’d construct to test against. And messier states are exactly where a converter’s quiet assumptions get found out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqs3i1urdpsmuiuoa9v6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqs3i1urdpsmuiuoa9v6b.png" width="770" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two directions, one popup.&lt;/p&gt;

&lt;p&gt;Most of the real work wasn’t the conversion logic, it was catching my own wrong guesses against something real, instead of trusting the first one that looked right.&lt;/p&gt;

&lt;p&gt;If your team is split between PromQL people and Query Builder people, give it a try: &lt;a href="https://github.com/MettaSurendhar/janus" rel="noopener noreferrer"&gt;github.com/MettaSurendhar/janus&lt;/a&gt; · CLI reference implementation: &lt;a href="https://github.com/MettaSurendhar/promql2qb" rel="noopener noreferrer"&gt;promql2qb&lt;/a&gt;&lt;/p&gt;

</description>
      <category>observability</category>
      <category>signoz</category>
      <category>prometheus</category>
      <category>chromeextension</category>
    </item>
    <item>
      <title>Tired of Doing Job Prep Manually Every Day? I Built Agents That Do It For Me</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Tue, 11 Aug 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/tired-of-doing-job-prep-manually-every-day-i-built-agents-that-do-it-for-me-49mp</link>
      <guid>https://dev.to/mettasurendhar/tired-of-doing-job-prep-manually-every-day-i-built-agents-that-do-it-for-me-49mp</guid>
      <description>&lt;p&gt;When I started serious interview prep, I ran into the same problem every day: what do I even practice today?&lt;/p&gt;

&lt;p&gt;One day it was a random LeetCode problem, the next day I'd forget CS fundamentals entirely, and interview Q&amp;amp;A prep only happened the night before an actual interview.&lt;/p&gt;

&lt;p&gt;There was no rhythm to it — just scattered effort.&lt;/p&gt;

&lt;p&gt;So I built the &lt;strong&gt;Job Prep Agents :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwq5y5m3xr6ke3aghdjrv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwq5y5m3xr6ke3aghdjrv.png" width="770" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A fully local, scheduled system that wakes up every morning and hands me a fresh &lt;strong&gt;DSA problem&lt;/strong&gt;, a &lt;strong&gt;CS fundamentals concept&lt;/strong&gt;, and a &lt;strong&gt;tailored interview Q&amp;amp;A&lt;/strong&gt;, generated by a local LLM running through &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No API costs&lt;/strong&gt;. Nothing sent to third parties, aside from an optional job-digest agent that uses Ollama's hosted search plus DuckDuckGo/YouTube for links and videos.&lt;/p&gt;

&lt;p&gt;In this blog, I'll walk through exactly how I set this up on Windows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installing &lt;strong&gt;Ollama&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Configuring &lt;em&gt;my profile&lt;/em&gt; with help from &lt;strong&gt;Claude&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Testing the scheduler&lt;/li&gt;
&lt;li&gt;Testing the batch file&lt;/li&gt;
&lt;li&gt;Scheduling it both via terminal and the Task Scheduler UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end, I'll also point you to the &lt;strong&gt;customizable edition&lt;/strong&gt; of this project if you want to run your own version.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Actually Does
&lt;/h2&gt;

&lt;p&gt;Every morning, it prepares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A real LeetCode problem&lt;/strong&gt; (Beginner/Intermediate/Advanced) with hints, three solution tiers (Brute Force → Better → Optimal), a Mermaid diagram, and real LeetCode + YouTube links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A CS fundamentals concept&lt;/strong&gt; (OS, DBMS, CN, OOP, System Design — rotating) with a diagram and live further-reading links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A tailored interview Q&amp;amp;A&lt;/strong&gt;, grounded in my actual projects and past interview questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;(Mon &amp;amp; Thu) A job digest&lt;/strong&gt; of fresh postings matching my target roles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5l1l7ga0m84cr3mnhi3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5l1l7ga0m84cr3mnhi3w.png" width="770" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All of it shows up in a tabbed, dark-themed local web viewer, with a native desktop popup telling me when it’s ready.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Repo:&lt;/em&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Inspired by freeCodeCamp’s blog :&lt;/em&gt;
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Step 1: Install Ollama and Pull a Model
&lt;/h2&gt;

&lt;p&gt;The whole point of this project is that inference happens &lt;strong&gt;locally&lt;/strong&gt;. That’s powered by &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/a&gt;, which makes running open LLMs on your own machine almost trivial on Windows.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download and install Ollama from ollama.com — it installs like any normal Windows app and runs as a background service.&lt;/li&gt;
&lt;li&gt;Pull a model. I settled on &lt;strong&gt;phi4-mini&lt;/strong&gt;, which runs comfortably even on a modest GPU (I’m on a GTX 1050, 4GB VRAM):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama pull phi4-mini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxi2lwpc7tieb27qaqoj8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxi2lwpc7tieb27qaqoj8.png" width="770" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Test run the pulled model :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama run phi4-mini:latest "Say hello in one sentence."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvzmzsyz4j518k5xdso4o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvzmzsyz4j518k5xdso4o.png" width="770" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quick tip:&lt;/strong&gt; some models default to a huge context window, which can force way more memory allocation than the model’s file size suggests — sometimes spilling a small GPU into slow CPU inference. This project caps context at &lt;code&gt;num_ctx=4096&lt;/code&gt; in every agent to avoid that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If things run slowly, check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1gujajgdgeh9k56d2tu6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1gujajgdgeh9k56d2tu6.png" width="770" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;PROCESSOR&lt;/code&gt; isn't close to 100% GPU, the model/context is too big for your VRAM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Clone the Repo and Set Up the Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Project Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/MettaSurendhar/job-prep-agents
cd job-prep-agents

python -m venv .venv
.venv\Scripts\activate

pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Project structure:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;job-prep-agents/
├── agents/
│   ├── dsa_problem.py       # curated LeetCode problems + tiered solutions
│   ├── cs_fundamentals.py   # rotating OS/DBMS/CN/OOP/System Design concepts
│   ├── interview_qa.py      # tailored + generic interview Q&amp;amp;A
│   └── job_digest.py        # Mon &amp;amp; Thu: job postings matching target roles
├── config/
│   └── profile.py           # my real background/projects/target roles
├── scheduler.py             # loads every agent, runs what's due, builds the viewer
├── run_scheduler.bat        # Windows Task Scheduler entry point
├── notify.ps1               # native popup notification
└── .env.example             # copy to .env for model/API-key settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE :&lt;/strong&gt; Every agent is just a Python file with a &lt;code&gt;NAME&lt;/code&gt; and a &lt;code&gt;run()&lt;/code&gt; that returns Markdown. &lt;code&gt;scheduler.py&lt;/code&gt; discovers and runs whatever's in &lt;code&gt;agents/&lt;/code&gt;, based on each agent's own &lt;code&gt;SCHEDULE&lt;/code&gt;. That's the trick &lt;strong&gt;one scheduled task instead of four&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 3: Configure the Profile — With Help From Claude
&lt;/h2&gt;

&lt;p&gt;The one file with actual personal content is &lt;code&gt;config/profile.py&lt;/code&gt; — my background, real projects, target roles, and past interview questions. This is what makes the daily Q&amp;amp;A feel tailored instead of generic.&lt;/p&gt;

&lt;p&gt;Instead of writing this by hand, I used &lt;strong&gt;Claude&lt;/strong&gt;: I fed it my resume and a rough note of my target roles, and had it draft &lt;code&gt;config/profile.py&lt;/code&gt; in the structure the project expects. This is exactly the kind of scaffolding an AI assistant is good at — turning a messy resume into a clean, structured config file, which I then reviewed and tightened up myself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7j62onlrmogv1udrc91v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7j62onlrmogv1udrc91v.png" width="770" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Set up the environment file:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copy .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In &lt;code&gt;.env&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OLLAMA_MODEL&lt;/strong&gt; — set to &lt;code&gt;phi4-mini&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OLLAMA_API_KEY&lt;/strong&gt; &lt;em&gt;(optional)&lt;/em&gt; — only needed for the &lt;code&gt;job_digest&lt;/code&gt; agent's live search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YOUTUBE_API_KEY&lt;/strong&gt; &lt;em&gt;(optional)&lt;/em&gt; — enables real embedded videos for DSA problems&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 4: Test the Scheduler Manually
&lt;/h2&gt;

&lt;p&gt;Before scheduling anything, I ran it by hand to confirm it actually worked end-to-end:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python scheduler.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Watch for &lt;code&gt;[run]&lt;/code&gt; / &lt;code&gt;[ok]&lt;/code&gt; lines as each agent fires — DSA problem, CS fundamentals, interview Q&amp;amp;A (and job digest, on Mon/Thu). Once it finishes, the browser auto-opens to &lt;code&gt;outputs/viewer-&amp;lt;today&amp;gt;.html&lt;/code&gt;, and a popup notification confirms it's done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft79oma609ldttakab7aq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft79oma609ldttakab7aq.png" width="770" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fivont5ci06j95cut9rvi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fivont5ci06j95cut9rvi.png" width="749" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE :&lt;/strong&gt; This manual run is the real checkpoint. If something’s misconfigured like wrong model name, missing API key, Ollama not running then it shows up here, in a plain terminal, long before Task Scheduler enters the picture.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 5: Test the Batch File
&lt;/h2&gt;

&lt;p&gt;Task Scheduler doesn’t play nicely with Python scripts directly — it’s much easier to point it at a &lt;code&gt;.bat&lt;/code&gt; file that activates the virtual environment and calls the script. That's &lt;code&gt;run_scheduler.bat&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I edited the two paths in it (project folder + venv’s &lt;code&gt;python.exe&lt;/code&gt;), then ran it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.\run_scheduler.bat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This writes the same output into &lt;code&gt;runner.log&lt;/code&gt;, so I could confirm the batch file behaves exactly like the manual run:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwrpj3xk9g3wutnn65cdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwrpj3xk9g3wutnn65cdk.png" width="770" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Gotcha:&lt;/strong&gt; if your project path has spaces, the &lt;strong&gt;entire path&lt;/strong&gt; needs to sit inside one pair of quotes. Wrong: &lt;code&gt;cd /d C:\"My Folder"\project&lt;/code&gt;. Right: &lt;code&gt;cd /d "C:\My Folder\project"&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 6: Schedule It With Windows Task Scheduler
&lt;/h2&gt;

&lt;p&gt;With the batch file confirmed working, the last step was making it run automatically every morning. I tried &lt;strong&gt;both&lt;/strong&gt; the terminal command and the Task Scheduler UI to compare.&lt;/p&gt;

&lt;h3&gt;
  
  
  Via Terminal (&lt;code&gt;schtasks&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;schtasks /Create /SC DAILY /TN "Job Prep Agents" /TR "D:\full\path\to\job-prep-agents\run_scheduler.bat" /ST 10:30 /RL HIGHEST
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a daily task named “Job Prep Agents” that fires &lt;code&gt;run_scheduler.bat&lt;/code&gt; at 10:30 AM with the highest available privileges (&lt;code&gt;/RL HIGHEST&lt;/code&gt; — without it, some non-interactive runs get blocked).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify it anytime with:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;schtasks /Query /TN "Job Prep Agents" /V /FO LIST
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE :&lt;/strong&gt; The field to watch is &lt;strong&gt;Last Result&lt;/strong&gt; — &lt;code&gt;0&lt;/code&gt; means success. Anything else, most commonly &lt;code&gt;-2147024891&lt;/code&gt; (0x80070005, "Access Denied"), usually points to a Task Scheduler permissions issue, not a broken script. Recreating the task with &lt;code&gt;/RL HIGHEST&lt;/code&gt;, or checking Windows Security → Virus &amp;amp; Threat Protection → Controlled Folder Access, tends to fix it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftel13lw6j9zhezxc4du2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftel13lw6j9zhezxc4du2.png" width="770" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Via the Task Scheduler UI
&lt;/h3&gt;

&lt;p&gt;I also set this up through &lt;strong&gt;Task Scheduler&lt;/strong&gt; (&lt;code&gt;taskschd.msc&lt;/code&gt;) to see the equivalent flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Task Scheduler → &lt;strong&gt;Create Task&lt;/strong&gt; (not “Basic Task” — this gives access to all options).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General tab&lt;/strong&gt; — name it “Job Prep Agents,” set “Run whether user is logged on or not,” and “Run with highest privileges.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Triggers tab&lt;/strong&gt; — New → Daily → set start time (10:30 AM, matching the terminal example).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actions tab&lt;/strong&gt; — New → Start a program → point it at &lt;code&gt;run_scheduler.bat&lt;/code&gt;, with "Start in" set to the project folder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditions/Settings tabs&lt;/strong&gt; — unchecked “Start the task only if the computer is on AC power,” since this runs on a laptop.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn9ip2lg5jrik2fthhfla.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn9ip2lg5jrik2fthhfla.png" width="749" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffw5wp4ljt69lud8jbqpv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffw5wp4ljt69lud8jbqpv.png" width="770" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3jzgxzu1u8bahh45jqaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3jzgxzu1u8bahh45jqaf.png" width="617" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7u205ivemkjvp9wcmycz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7u205ivemkjvp9wcmycz.png" width="770" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both routes create the exact same underlying task — &lt;code&gt;schtasks&lt;/code&gt; is faster once you know the flags, the UI is easier to eyeball and tweak.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Results
&lt;/h2&gt;

&lt;p&gt;With the task scheduled, this now runs unattended every morning. Here’s what actually shows up:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Main dashboard :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl74ne57acnslshqws1hr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl74ne57acnslshqws1hr.png" width="770" height="698"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;CS Fundamentals tab :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faaahl04inpcnik874hl9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faaahl04inpcnik874hl9.png" width="770" height="693"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;DSA Problem tab :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftwkq5i3nb930n06ornm9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftwkq5i3nb930n06ornm9.png" width="770" height="722"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Interview Q&amp;amp;A tab :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsxypn5pnr8nmjxh6d1o3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsxypn5pnr8nmjxh6d1o3.png" width="770" height="705"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few things worth flagging after actually living with this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No-repeat memory works well&lt;/strong&gt; — every agent tracks what’s already covered in &lt;code&gt;history/&lt;/code&gt;, so I'm not seeing the same DSA problem or interview question loop back too soon.&lt;/li&gt;
&lt;li&gt;Small local models like &lt;code&gt;phi4-mini&lt;/code&gt; occasionally produce invalid Mermaid diagram syntax. The viewer validates this before rendering and shows a clean "Diagram unavailable" message instead of breaking.&lt;/li&gt;
&lt;li&gt;Small local models still hallucinate sometimes. I treat the DSA solutions, job postings, and technical explanations as a study nudge, not gospel — spot-check before trusting anything fully.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Want Your Own Version? Try the Customizable Edition
&lt;/h2&gt;

&lt;p&gt;Everything above is &lt;em&gt;my&lt;/em&gt; real setup — my resume data, my target roles, tuned for my hardware. If you want your &lt;strong&gt;own&lt;/strong&gt; version with your own background, and a choice of LLM provider (not just Ollama — Groq, Mistral, or Gemini too, if you’d rather skip local GPU constraints).&lt;/p&gt;

&lt;h3&gt;
  
  
  Customizable edition:
&lt;/h3&gt;

&lt;p&gt;Same agents, same features, but config-driven:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;config/profile.py&lt;/code&gt; is where &lt;strong&gt;your&lt;/strong&gt; background, projects, and target roles go — with a filled-out example in &lt;code&gt;examples/profile.metta.py&lt;/code&gt; for reference&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LLM_PROVIDER&lt;/code&gt; in &lt;code&gt;.env&lt;/code&gt; switches between &lt;code&gt;ollama&lt;/code&gt;, &lt;code&gt;groq&lt;/code&gt;, &lt;code&gt;mistral&lt;/code&gt;, or &lt;code&gt;gemini&lt;/code&gt; — one line, nothing else in the codebase changes&lt;/li&gt;
&lt;li&gt;It ships with a &lt;strong&gt;CLAUDE.md&lt;/strong&gt; file written specifically to guide Claude (or Claude Code) through setting the whole thing up — picking a provider, filling in your profile from your resume, installing dependencies, and scheduling it. If you have Claude Code, just open the repo and ask it to set the project up for you.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scheduler.py&lt;/code&gt; itself runs fine on macOS/Linux too (cron instead of Task Scheduler); the popup notification (&lt;code&gt;notify.ps1&lt;/code&gt;) is currently Windows-only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re a fresher, a career-switcher, or anyone doing structured interview prep who’d rather have a study plan waiting each morning than build one from scratch every day — this fork is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Job prep doesn’t need to be something you scramble to figure out every single day. By combining a &lt;strong&gt;local LLM&lt;/strong&gt;, a set of small &lt;strong&gt;Python agents&lt;/strong&gt;, and &lt;strong&gt;Windows Task Scheduler&lt;/strong&gt;, I turned my daily study routine into something that just runs itself — for free, entirely on my own machine.&lt;/p&gt;

&lt;p&gt;If you’re prepping for interviews and want this same daily rhythm without the manual effort, give &lt;strong&gt;Job Prep Agents&lt;/strong&gt; a try — and if you want your own personalized version, the &lt;a href="https://github.com/MettaSurendhar/job-prep-agents-customizable" rel="noopener noreferrer"&gt;customizable edition&lt;/a&gt; is ready to fork.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>jobinterview</category>
      <category>automation</category>
    </item>
    <item>
      <title>Installing SigNoz on Windows: the Fastest Way (5 Minutes, No Docker Desktop)</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Thu, 06 Aug 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/installing-signoz-on-windows-the-fastest-way-5-minutes-no-docker-desktop-1d52</link>
      <guid>https://dev.to/mettasurendhar/installing-signoz-on-windows-the-fastest-way-5-minutes-no-docker-desktop-1d52</guid>
      <description>&lt;p&gt;If you’ve looked at &lt;a href="https://signoz.io/docs/install/" rel="noopener noreferrer"&gt;SigNoz’s install docs&lt;/a&gt;, you’ve probably noticed something. There’s no “Windows” tab. That’s because Windows isn’t officially supported, so you need a Linux environment underneath it, one way or another.&lt;/p&gt;

&lt;p&gt;I went through this myself this week, hit a few things worth flagging, and figured I’d write down the exact path that actually works: fast, free, and without the one Windows-specific trap that’ll cost you an hour if you don’t know about it upfront.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ways to install SigNoz
&lt;/h2&gt;

&lt;p&gt;Before picking one, here’s the full menu, so you know what you’re opting into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose&lt;/strong&gt; (via Foundry): single machine, fastest to stand up, what we’re doing today&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes / Helm&lt;/strong&gt;: if you already run a cluster and want SigNoz alongside your other workloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;systemd / bare metal&lt;/strong&gt;: installing directly onto a Linux VM without containers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Swarm&lt;/strong&gt;: multi-node, production-leaning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A free-tier cloud VM (e.g. Oracle Cloud’s always-free tier)&lt;/strong&gt;: skip Windows/WSL entirely, run a genuine free Linux VM and install SigNoz there instead&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SigNoz Cloud&lt;/strong&gt;: fully hosted, zero install, but it’s a 30-day free trial, not free forever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a local dev/hackathon &lt;strong&gt;setup on Windows, Docker Compose is the easiest&lt;/strong&gt;, and it’s genuinely free with no trial clock. Here’s the whole path, start to finish.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Check your WSL version
&lt;/h2&gt;

&lt;p&gt;Open PowerShell and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu3hh9yj3yd6ci2j72w9t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu3hh9yj3yd6ci2j72w9t.png" width="770" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If that errors out, you don’t have WSL yet. No problem, next step installs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Install Ubuntu on WSL2
&lt;/h2&gt;

&lt;p&gt;Still in PowerShell (as Administrator):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --install -d Ubuntu-24.04
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart if it asks you to.&lt;/p&gt;

&lt;p&gt;On first launch, it’ll ask you to set a &lt;strong&gt;username/password for your Linux user&lt;/strong&gt;. That’s separate from your Windows login.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpe8trwhkoj2x9s6lrwie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpe8trwhkoj2x9s6lrwie.png" width="770" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Memory note:&lt;/strong&gt; WSL2 auto-allocates up to about half your system RAM by default. SigNoz’s containers need roughly 4GB free to run comfortably, so if your machine has 8GB total, keep an eye on things. You can cap or raise WSL’s memory limit later via a &lt;code&gt;.wslconfig&lt;/code&gt; file if needed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. (Optional) Move it to a different drive
&lt;/h2&gt;

&lt;p&gt;By default WSL installs onto your C: drive. If you’d rather keep it elsewhere, here’s how I moved mine to &lt;code&gt;D:\WSL\Ubuntu&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir D:\WSL\Ubuntu
wsl --export Ubuntu-24.04 D:\WSL\ubuntu_backup.tar
wsl --unregister Ubuntu-24.04
wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\ubuntu_backup.tar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs12oyedwo1brbd18rf2v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs12oyedwo1brbd18rf2v.png" width="770" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Skip this if C: has room to spare.&lt;/p&gt;

&lt;h3&gt;
  
  
  One gotcha with imported distros:
&lt;/h3&gt;

&lt;p&gt;They default to logging you in as &lt;code&gt;root&lt;/code&gt; instead of your own user. Fix it by opening the distro and editing its config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl -d Ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2aegbumbvztyxmy3t33o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2aegbumbvztyxmy3t33o.png" width="770" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This drops you into the Ubuntu terminal, which is also how you’ll re-enter it every time going forward. Once inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo -e "[user]\ndefault=&amp;lt;your-username&amp;gt;" | sudo tee -a /etc/wsl.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then from PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reopen with &lt;code&gt;wsl -d Ubuntu&lt;/code&gt; and you'll land as your own user from now on.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Docker Desktop or Docker Engine? Pick Engine.
&lt;/h2&gt;

&lt;p&gt;This is the trap I mentioned. It’s tempting to just install Docker Desktop since it’s the familiar Windows-friendly option, but &lt;a href="https://signoz.io/docs/install/docker/" rel="noopener noreferrer"&gt;SigNoz’s own docs&lt;/a&gt; specifically call out a known issue. ClickHouse Keeper (part of SigNoz’s storage layer) has been reported to crash in a restart loop under Docker Desktop’s virtualization layer on Windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing Docker Engine&lt;/strong&gt; directly inside WSL sidesteps this entirely, and it’s barely more work.&lt;/p&gt;

&lt;h3&gt;
  
  
  From inside your Ubuntu (WSL) terminal:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quick way :&lt;/strong&gt;&lt;br&gt;
(Docker’s own official convenience script, fine for dev/hackathon boxes)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://get.docker.com | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Or the fuller, version-pinned way :&lt;/strong&gt;&lt;br&gt;
(Worth doing if this becomes a permanent setup rather than a one-off hackathon box)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get install ca-certificates curl gnupg -y
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;amp;&amp;amp; echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0stqu8zqkika7c71l74v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0stqu8zqkika7c71l74v.png" width="770" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs34quoigapzy4zo4ffco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs34quoigapzy4zo4ffco.png" width="770" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6xi2sp9gs7vz3qgs04bk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6xi2sp9gs7vz3qgs04bk.png" width="770" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyt9e1vujeilwwwqurld4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyt9e1vujeilwwwqurld4.png" width="770" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Either way, each SigNoz container is fairly light individually, but ClickHouse (the storage backend) is the heaviest piece. Budget about 4GB overall for the full stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify Docker’s actually working:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that prints its welcome message, you’re good.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kuhg8jzgh5svcsejqie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kuhg8jzgh5svcsejqie.png" width="770" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Let your user run Docker without &lt;code&gt;sudo&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo usermod -aG docker $USER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Close and reopen your WSL terminal for this to take effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What’s Foundry?
&lt;/h2&gt;

&lt;p&gt;Foundry is SigNoz’s own installer/deployment tool. One CLI (&lt;code&gt;foundryctl&lt;/code&gt;) that generates and runs the right Docker Compose (or Kubernetes, or systemd) setup for you, based on a small config file called a &lt;a href="https://github.com/SigNoz/foundry/blob/main/docs/concepts/casting.md" rel="noopener noreferrer"&gt;&lt;strong&gt;casting&lt;/strong&gt;&lt;/a&gt;. For the full concepts, &lt;a href="https://github.com/SigNoz/foundry/blob/main/docs/getting-started.md" rel="noopener noreferrer"&gt;Foundry's docs&lt;/a&gt; are worth a read. Here's just enough to get running.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Foundry :
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://signoz.io/foundry.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F80lru3gl4oyw2tj8pug1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F80lru3gl4oyw2tj8pug1.png" width="770" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Export path :
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH="/home/&amp;lt;your-unix-username&amp;gt;/.local/bin:$PATH"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnhwfo0pq9raqcfkni0tz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnhwfo0pq9raqcfkni0tz.png" width="770" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Write your casting file
&lt;/h2&gt;

&lt;p&gt;A casting is just a YAML file describing how you want SigNoz deployed. This is the minimal version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir ~/signoz &amp;amp;&amp;amp; cd ~/signoz
cat &amp;gt; casting.yaml &amp;lt;&amp;lt; 'EOF'
apiVersion: v1alpha1
metadata:
  name: signoz
spec:
  deployment:
    mode: docker
    flavor: compose
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc4gkjr4ck25hijhfrcae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc4gkjr4ck25hijhfrcae.png" width="770" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There’s a lot you can customize here, like retention periods, resource limits, and individual component configs, but this is all you need to get your first instance running. &lt;a href="https://github.com/SigNoz/foundry/blob/main/docs/concepts/casting.md" rel="noopener noreferrer"&gt;Foundry’s casting concepts doc&lt;/a&gt; covers the rest if you want to go deeper later.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Deploy
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foundryctl cast -f casting.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fry8xvijspnuw3fgtbpr1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fry8xvijspnuw3fgtbpr1.png" width="770" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This checks your prerequisites, generates the actual Compose files, and starts everything in one command.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Verify and see it running
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg3zxwjfzd65z4x4mpj9t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg3zxwjfzd65z4x4mpj9t.png" width="770" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything should show &lt;code&gt;Up&lt;/code&gt;. Then, in your regular Windows browser, go to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WSL2 forwards localhost to Windows automatically, so no extra networking setup needed. You should land straight on SigNoz’s UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd53m2ucbkxmanuwsa0um.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd53m2ucbkxmanuwsa0um.png" width="770" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxd2y1ov3hluh9zrh1kgl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxd2y1ov3hluh9zrh1kgl.png" width="770" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  That’s it
&lt;/h2&gt;

&lt;p&gt;About 5 minutes of reading, 2 minutes of actually typing commands, and you’ve got a fully self-hosted, genuinely free SigNoz instance running on Windows. No Docker Desktop bug to debug, no trial clock running out on you. Next up for me: getting my first real trace into it.&lt;/p&gt;

</description>
      <category>signoz</category>
      <category>foundry</category>
      <category>installation</category>
      <category>windows</category>
    </item>
    <item>
      <title>AI agents aren’t ready for IT operations yet and now there’s a benchmark that proves it</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Tue, 04 Aug 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/ai-agents-arent-ready-for-it-operations-yet-and-now-theres-a-benchmark-that-proves-it-mal</link>
      <guid>https://dev.to/mettasurendhar/ai-agents-arent-ready-for-it-operations-yet-and-now-theres-a-benchmark-that-proves-it-mal</guid>
      <description>&lt;p&gt;There’s a lot of momentum right now behind building and deploying AI agents to automate critical IT tasks, often without really assessing how efficient they are in real-world conditions.&lt;/p&gt;

&lt;p&gt;Assessing here doesn’t mean testing in a controlled sandbox, it means running the agent across many real-time scenarios and measuring its actual performance and efficiency. That’s why benchmarking agents matters, the same way benchmarking LLMs does. That’s where &lt;strong&gt;ITBench&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ITBench actually measures ?
&lt;/h2&gt;

&lt;p&gt;ITBench is a first-of-its-kind framework that measures the performance of AI agents across a wide variety of complex, real-world-inspired IT automation tasks.&lt;/p&gt;

&lt;p&gt;It’s part of &lt;strong&gt;IBM Research’s&lt;/strong&gt; &lt;a href="https://huggingface.co/collections/ibm-research/enterprise-agents-and-benchmarks" rel="noopener noreferrer"&gt;Enterprise Agents and Benchmarks&lt;/a&gt; collection on Hugging Face, a family of open benchmarks for evaluating AI agents on enterprise tasks.&lt;/p&gt;

&lt;p&gt;It measures agent performance across three IT personas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Site Reliability Engineering (SRE)&lt;/strong&gt; — availability and resiliency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance and Security Operations (CISO)&lt;/strong&gt; — compliance and security of IT implementations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Financial Operations (FinOps)&lt;/strong&gt; — cost efficiency and return optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcsq57x3ob0y6h0az8peu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcsq57x3ob0y6h0az8peu.png" width="770" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Benchmarks already exist for pieces of this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SRE — AIOpsLab, InsightBench, TSB-AD, TrainTicket&lt;/li&gt;
&lt;li&gt;CISO — CIS Benchmark&lt;/li&gt;
&lt;li&gt;FinOps — nothing comparable; the FinOps Foundation publishes scorecards, but no benchmark that actually tests agent resolution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While these are valuable resources individually, they’re limited, they don’t reflect real-world IT problems well, they cover too narrow a slice of the IT landscape, and few of them automate evaluation end-to-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ITBench&lt;/strong&gt; tries to address all three limitations at once, and the fact that FinOps essentially had &lt;em&gt;no&lt;/em&gt; real benchmark until this paper is one of the more interesting gaps it fills&lt;/p&gt;

&lt;h2&gt;
  
  
  How ITBench is Built ?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1nmdowu9xo1vtgwip5pb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1nmdowu9xo1vtgwip5pb.png" width="770" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scenario Specification and Environment&lt;/li&gt;
&lt;li&gt;AI Agent&lt;/li&gt;
&lt;li&gt;Leaderboard&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Scenario Specification and Environment
&lt;/h3&gt;

&lt;p&gt;A scenario in ITBench is formalized as a tuple &lt;strong&gt;p = ⟨M, E, T, D⟩&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;M (Scenario Specification)&lt;/strong&gt; — metadata and deployment descriptors for the scenario&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E (Environment)&lt;/strong&gt; — the operational testbed (e.g. a Kubernetes cluster, a RHEL9 host) where the problem actually occurs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T (Triggering Events)&lt;/strong&gt; — the alerts that fire when the fault manifests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D (Desired Outcome)&lt;/strong&gt; — the automation objective; what “solved” means&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each scenario also carries a &lt;strong&gt;ground truth&lt;/strong&gt; — the task-specific expected outcome the Evaluator checks the agent’s final result against.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI Agents
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F34hj0olfl5n7f04xfamy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F34hj0olfl5n7f04xfamy.png" width="770" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ITBench agents operate under a POMDP (Partially Observed Markov Decision Process) model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent never sees the full environment state directly, it only receives observations returned by tools&lt;/li&gt;
&lt;li&gt;It decides its next action based on the current observation plus the full history of past observations and actions.&lt;/li&gt;
&lt;li&gt;The environment itself evolves as a function of its previous state and the agent’s last action.&lt;/li&gt;
&lt;li&gt;In short the agent probes, decides, acts, and the loop repeats until it either reaches the goal state or gives up. Success is measured by comparing the final (terminated) state against the goal state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ITBench’s baseline agents are built on different LLMs for both natural language reasoning and code generation. Each agent is initialized with a prompt describing its goal, context, task, and expected output format, and interacts with the environment in natural language through a toolbox.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Leaderboard
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdfwxa53td72wbagr4w0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdfwxa53td72wbagr4w0z.png" width="770" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ITBench includes a leaderboard to promote reproducibility and comparative analysis, offering a predefined, extensible set of performance metrics.&lt;/p&gt;

&lt;p&gt;For each scenario, ITBench records the final system state after task completion and validates it against ground truth at the end of the run.&lt;/p&gt;

&lt;p&gt;Notably, it supports &lt;strong&gt;partial scoring,&lt;/strong&gt; not just pass/fail, which gives more meaningful &amp;amp; constructive feedback than a binary result would.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it Works ?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlo6ydth0243n7ymduno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlo6ydth0243n7ymduno.png" width="770" height="1618"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The end-to-end benchmarking flow, after an agent registers, looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;New benchmark jobs go into a &lt;strong&gt;queue&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Benchmark Runner&lt;/strong&gt; pulls a scenario for a registered agent and provisions the environment per the scenario spec.&lt;/li&gt;
&lt;li&gt;The environment is deployed and a fault is injected, the agent is only given access once the environment reports itself “Ready.”&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;agent&lt;/strong&gt; works the problem: it polls for readiness, then diagnoses and mitigates using its toolset, reporting STARTED and FINISHED status as it goes.&lt;/li&gt;
&lt;li&gt;Once the agent finishes (or times out), the Benchmark Runner evaluates the final environment state against ground truth and tears the scenario down.&lt;/li&gt;
&lt;li&gt;Results across all scenarios in the run are aggregated and published to the leaderboard.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The environment is fully under the agent’s control during this window, so it’s treated as a “playground” destructive actions are expected and accounted for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;pass@1&lt;/strong&gt; — used for both fault localization and mitigation.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;fault localization&lt;/strong&gt;, correctness means the predicted root cause exactly matches ground truth.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;mitigation&lt;/strong&gt;, correctness means the agent actually found, applied, and resolved the issue. Reported as a percentage.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Time-based metrics&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mean Time to Diagnose (MTTD)&lt;/strong&gt; — time taken to successfully diagnose a scenario&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mean Time to Repair (MTTR)&lt;/strong&gt; — time taken to successfully execute a fix&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time to Process (TTP)&lt;/strong&gt; — time taken to determine compliance posture (pass/fail)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SRE:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GPT-4o was the &lt;strong&gt;strongest performer&lt;/strong&gt;: 13.81% pass@1 on diagnosis, 11.43% on mitigation — meaningfully higher than any other model tested.&lt;/li&gt;
&lt;li&gt;Llama-3.1–8B, despite far fewer parameters, had the &lt;strong&gt;fastest detection&lt;/strong&gt; (57.50s MTTD) and repair (245.13s MTTR) among its successful runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuhvl7trsw4eje3nyu590.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuhvl7trsw4eje3nyu590.png" width="770" height="133"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  CISO:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GPT-based models dominate both pass@1 and TTP, pass@1 is nearly 2x the next-best models, while also processing scenarios fastest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi5udg8w9x54zhrzxotp7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi5udg8w9x54zhrzxotp7.png" width="770" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  FinOps:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GPT-4o led diagnosis at a 33% pass rate for identifying the cause of a cost increase.&lt;/li&gt;
&lt;li&gt;On cost and efficiency metrics specifically, performance was flat across all models, none achieved optimal CPU/memory cost or high CPU efficiency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9e6ackr48otbgvcyz745.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9e6ackr48otbgvcyz745.png" width="770" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Four findings worth sitting with
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Impact of scenario complexity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SRE&lt;/strong&gt;: 
Scenarios are categorized Easy/Medium/Hard based on fault propagation chain length, number of resolution steps, and technology diversity. 
Success rates decline clearly as complexity increases, GPT-4o (the best model) diagnosed only 36%, 7.73%, and 5.0% of Easy, Medium, and Hard scenarios respectively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CISO&lt;/strong&gt;: 
Complexity maps directly to scenario class; Kyverno scenarios are Easy, k8s-opa and rhel-opa are Medium, Kyverno-update is Hard. All models degrade predictably as difficulty rises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FinOps&lt;/strong&gt;: With only two scenarios (one Easy, one Hard), no model besides GPT-4o could even diagnose the hard scenario, and none could mitigate it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Inherent non-determinism in the environment
&lt;/h3&gt;

&lt;p&gt;GPT-4o stayed the top performer across all three personas, but it was far from deterministic, despite hyperparameter tuning aimed at consistency.&lt;/p&gt;

&lt;p&gt;On one SRE scenario it diagnosed correctly in only 1 of 10 runs; on another, 8 of 10. Mitigation showed the same spread. This wasn’t unique to SRE — CISO and FinOps scenarios showed the same instability.&lt;/p&gt;

&lt;p&gt;The paper attributes this to small real-time telemetry fluctuations altering the model’s token generation from run to run. Practically, this means a single “pass@1 score” for an agent isn’t really a fixed number, it’s closer to a distribution, and ITBench’s repeated-run methodology is what makes that visible in the first place.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Interdependence between diagnosis and mitigation
&lt;/h3&gt;

&lt;p&gt;Diagnosis and mitigation are usually assumed to be tightly coupled: get the root cause right, and the fix should follow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8mee9h1wde7b2ti57mm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8mee9h1wde7b2ti57mm.png" width="770" height="1155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But the results don’t fully support that.&lt;/p&gt;

&lt;p&gt;In one scenario, an SRE agent using llama-3.3–70b misidentified the root cause as a memory limit issue, when the actual cause was an HTTP request corruption fault; yet it still resolved the incident, essentially by accident, by scaling up service replicas as a generic remedy.&lt;/p&gt;

&lt;p&gt;In another scenario labeled “Easy,” agents diagnosed the root cause with high confidence but couldn’t produce a working fix in any run.&lt;/p&gt;

&lt;p&gt;So correct diagnosis doesn’t guarantee a fix, and a fix doesn’t require correct diagnosis. That’s a genuinely counterintuitive finding, and it says something about how brittle “generic” mitigation actions can be as a substitute for actually understanding the fault.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Impact of tracing on accuracy
&lt;/h3&gt;

&lt;p&gt;ITBench’s alert-driven workflow mirrors how SREs are actually notified via golden-signal alerts from collected telemetry, not raw data dumps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxzrfe30py037z80gagd4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxzrfe30py037z80gagd4.png" width="770" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To test how much this telemetry actually matters, ITBench supports automated data masking, and the results are stark:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removing trace data dropped GPT-4o’s diagnosis pass@1 from 13.81% to 9.52%, and mitigation collapsed from 11.43% to 2.86%.&lt;/li&gt;
&lt;li&gt;One “Easy” scenario went from an 80% diagnosis rate with traces to 0% without them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the finding that lines up most closely with what I’ve actually built.&lt;/p&gt;

&lt;p&gt;Having spent the last year on the observability side, routing logs through Cribl, collecting metrics with Prometheus, visualizing through Grafana and Loki.&lt;/p&gt;

&lt;p&gt;This result isn’t surprising from the infra side, but it’s rarely the headline when people talk about “AI agents for SRE.”&lt;/p&gt;

&lt;p&gt;Everyone benchmarks the model. Almost no one benchmarks the instrumentation the model depends on.&lt;/p&gt;

&lt;p&gt;And the paper notes only about 20% of real applications have tracing enabled at allb which means for most production systems today, agents are operating closer to the “no traces” number than the “with traces” one.&lt;/p&gt;

&lt;p&gt;The ceiling on agent performance here isn’t model capability, it’s observability coverage. That’s a much less exciting thing to fix than “use a better model,” but it’s probably the more important one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;ITBench’s headline numbers, 13.8% resolved for SRE, 25.2% for CISO, 0% for FinOps, are a useful corrective against the current narrative that agentic AI is close to running IT operations unsupervised.&lt;/p&gt;

&lt;p&gt;It isn’t, yet. But the more interesting part of this paper isn’t the leaderboard, it’s &lt;em&gt;why&lt;/em&gt; agents fail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thin observability&lt;/li&gt;
&lt;li&gt;Non-deterministic environments&lt;/li&gt;
&lt;li&gt;A diagnosis-mitigation gap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;that no one’s really solved.&lt;/p&gt;

&lt;p&gt;If you’re building in this space, that’s where the real work is.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Paper:&lt;/em&gt; &lt;a href="https://arxiv.org/abs/2502.05352" rel="noopener noreferrer"&gt;&lt;em&gt;ITBench: Evaluating AI Agents across Diverse Real-World IT Automation Tasks&lt;/em&gt;&lt;/a&gt; &lt;em&gt;(Jha, Arora, Watanabe et al., IBM Research / UIUC, 2025)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>research</category>
      <category>observability</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>Tired of Writing the Same Tests Again and Again? Meet Keploy</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Tue, 09 Sep 2025 21:26:27 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/stop-writing-repetitive-tests-how-keploy-generates-them-automatically-cim</link>
      <guid>https://dev.to/mettasurendhar/stop-writing-repetitive-tests-how-keploy-generates-them-automatically-cim</guid>
      <description>&lt;p&gt;When I first started learning about APIs and CRUD operations, I tested everything manually. I would run the application, perform an action in the UI or call an API, and then check if it behaved correctly. At that point, I didn’t even know what unit testing or or API tests was.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpbmoot8et012fsi4hpz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpbmoot8et012fsi4hpz.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Later, I realized that writing test cases is crucial. They help catch bugs early, reduce the risk of regressions, and give confidence when making changes. However, there was one big problem: &lt;strong&gt;writing tests felt repetitive and time-consuming&lt;/strong&gt;. Instead of focusing on building features, I was spending hours writing boilerplate code for tests.&lt;/p&gt;

&lt;p&gt;That’s when I came across &lt;strong&gt;Keploy&lt;/strong&gt;, a tool that &lt;strong&gt;automatically records API calls and generates test cases and data mocks&lt;/strong&gt;. This means you can test your application without writing traditional test scripts. &lt;/p&gt;




&lt;h2&gt;
  
  
  Why Automated Testing Matters
&lt;/h2&gt;

&lt;p&gt;Before diving into code, let’s briefly revisit why automated tests — whether &lt;strong&gt;unit tests&lt;/strong&gt; or &lt;strong&gt;API tests&lt;/strong&gt; — are important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Catch bugs early&lt;/strong&gt; – Problems are detected before deployment.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevent regressions&lt;/strong&gt; – Ensures that new changes don’t break existing features.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve confidence&lt;/strong&gt; – Developers can refactor code without fear.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save time in the long run&lt;/strong&gt; – Manual testing becomes unnecessary for routine checks.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only challenge? Writing and maintaining tests manually is tedious. This is where &lt;strong&gt;Keploy&lt;/strong&gt; steps in.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Keploy?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://keploy.io/" rel="noopener noreferrer"&gt;Keploy&lt;/a&gt; is an open-source testing toolkit designed primarily for &lt;strong&gt;API testing&lt;/strong&gt;. It helps you automate validation without writing traditional test scripts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Records API calls and responses while you use your application.
&lt;/li&gt;
&lt;li&gt;Automatically generates test cases in YAML format.
&lt;/li&gt;
&lt;li&gt;Creates mocks for external dependencies (databases, third-party APIs).
&lt;/li&gt;
&lt;li&gt;Provides a simple test mode to replay requests and validate responses.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of Keploy as a &lt;strong&gt;record-and-replay testing tool&lt;/strong&gt;. You interact with your app once, and Keploy creates reusable &lt;strong&gt;API-level tests&lt;/strong&gt; for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Build the To-Do List App
&lt;/h2&gt;

&lt;p&gt;Before we dive into Keploy, let’s first build a simple To-Do List application. This app will serve as the foundation on which we’ll later generate automated test cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  We’ll use:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flask&lt;/strong&gt; → A lightweight Python web framework.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite&lt;/strong&gt; → A simple database to store tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flask-SQLAlchemy&lt;/strong&gt; → ORM (Object Relational Mapper) for managing database operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jinja2 Templates&lt;/strong&gt; → To render HTML pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app is a classic CRUD (Create, Read, Update, Delete) example, which makes it a perfect candidate for learning automated testing.&lt;/p&gt;




&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;p&gt;Our To-Do List app will support the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add tasks&lt;/strong&gt;: Enter a task and save it into the database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View tasks&lt;/strong&gt;: See all tasks with their creation time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update tasks&lt;/strong&gt;: Edit an existing task’s content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete tasks&lt;/strong&gt;: Remove tasks you no longer need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API endpoints&lt;/strong&gt;: Access the same functionality programmatically with REST APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This way, we’ll have both a web UI and a set of APIs for interaction.&lt;/p&gt;




&lt;h3&gt;
  
  
  Project Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D:.
├─ static
│  └─ css
├─ templates
├─ tests
└─ app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;app.py&lt;/code&gt; – Main Flask application containing:

&lt;ul&gt;
&lt;li&gt;Database model (Todo)&lt;/li&gt;
&lt;li&gt;UI routes (for web pages)&lt;/li&gt;
&lt;li&gt;API routes (for REST APIs)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;templates/&lt;/code&gt; – HTML templates used for rendering pages:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;base.html&lt;/code&gt; → Shared layout for all pages.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;index.html&lt;/code&gt; → Main page showing the task list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;update.html&lt;/code&gt; → Page for updating an existing task.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;static/css/&lt;/code&gt; – Custom CSS for styling the UI.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tests/&lt;/code&gt; – Placeholder directory where automated test cases will be generated later using Keploy.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Database Model
&lt;/h3&gt;

&lt;p&gt;Inside app.py, we’ll define a simple Todo model using SQLAlchemy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt;: Unique identifier for each task.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;content&lt;/code&gt;: The actual task description.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;date_created&lt;/code&gt;: Timestamp of when the task was added.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Task List UI
&lt;/h3&gt;

&lt;p&gt;Once you start the app and add some tasks, the home page (index.html) will display them in a neat table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Column 1&lt;/em&gt; → Task description.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Column 2&lt;/em&gt; → Date created.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Column 3&lt;/em&gt; → Update/Delete actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the bottom, there’s a form input to quickly add new tasks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8ucmb42e2p4f3minwve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8ucmb42e2p4f3minwve.png" alt=" " width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ At this point, we’ve built a complete Flask To-Do List app with both UI and APIs. This will now serve as the base project for integrating Keploy and generating test cases automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Run the Application
&lt;/h2&gt;

&lt;p&gt;You can clone the project from [&lt;a href="https://github.com/MettaSurendhar/To-Do-List-Flask/tree/main" rel="noopener noreferrer"&gt;To-Do-List-Flask&lt;/a&gt;] and follow the README to initialize and run the app.&lt;/p&gt;

&lt;p&gt;Install &lt;code&gt;virtualenv&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pip install virtualenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a terminal in the project root directory and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python -m venv .venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ .venv\Scripts\activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install the dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ (.venv) pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally start the web server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ (env) python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This server will start on &lt;a href="http://127.0.0.1:8080/" rel="noopener noreferrer"&gt;http://127.0.0.1:8080/&lt;/a&gt; by default&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Install Keploy
&lt;/h2&gt;

&lt;p&gt;If you’re on Windows, you’ll need WSL (Windows Subsystem for Linux).&lt;/p&gt;

&lt;p&gt;Initialize wsl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Users\Dell&amp;gt; wsl
unix@DESKTOP:/mnt/c/Users/Dell$ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ curl --silent -O -L https://keploy.io/install.sh &amp;amp;&amp;amp; source install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check Installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ keploy -v 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 For Linux/macOS, follow the &lt;a href="https://keploy.io/docs/server/installation/" rel="noopener noreferrer"&gt;Keploy installation guide&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Record with Keploy:
&lt;/h2&gt;

&lt;p&gt;Now comes the fun part. Keploy has a record mode that listens to API calls while you use your application.&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;keploy record -c "python app.py"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwh1pwddtg4xow8urr9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwh1pwddtg4xow8urr9b.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, perform some actions through both the UI and APIs.&lt;/p&gt;




&lt;h3&gt;
  
  
  UI Actions Captured
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0lduzkk2vthkgwiknjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0lduzkk2vthkgwiknjr.png" alt=" " width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6owf29msi2qpdcfis98.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6owf29msi2qpdcfis98.png" alt=" " width="800" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update a task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29gzp4srdrel4865apdv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29gzp4srdrel4865apdv.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8snl2ztf8ntyzwpny67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8snl2ztf8ntyzwpny67.png" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete a task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyilht6d37hdp30earzfr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyilht6d37hdp30earzfr.png" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Terminal Output&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnlkc7kgvtywz5oc89gva.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnlkc7kgvtywz5oc89gva.png" alt=" " width="799" height="355"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  API Actions Captured
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a task
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST http://localhost:8080/api/tasks \
  -H "Content-Type: application/json" \
  -d '{"content":"blog demo task"}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0ivdj0upvilh5hn7i6v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0ivdj0upvilh5hn7i6v.png" alt=" " width="625" height="127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update a task
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X PUT http://localhost:8080/api/tasks/1 \
  -H "Content-Type: application/json" \
  -d '{"content":"updated task"}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fez5yaqv9uy2x1482f84g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fez5yaqv9uy2x1482f84g.png" alt=" " width="571" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View tasks
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X GET http://localhost:8080/api/task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqzrg9xo7m242j4tut83.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqzrg9xo7m242j4tut83.png" alt=" " width="799" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete a task
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X DELETE http://localhost:8080/api/tasks/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foizbtm237jdkmmx9e207.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foizbtm237jdkmmx9e207.png" alt=" " width="650" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terminal Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhlh2egzsoijfrk4ib7w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhlh2egzsoijfrk4ib7w.png" alt=" " width="798" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each of these interactions gets stored as a test case in YAML format inside the keploy-tests/ folder.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 5: Run Tests with Keploy
&lt;/h2&gt;

&lt;p&gt;Once tests are recorded, run them anytime with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ keploy test -c "python app.py"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Keploy will:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replay all recorded requests.&lt;/li&gt;
&lt;li&gt;Compare the actual responses with recorded ones.&lt;/li&gt;
&lt;li&gt;Generate a detailed test report.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures that your API behaves consistently over time.&lt;/p&gt;

&lt;p&gt;Generated Test Cases:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faj2rk3kv5i97x48uz1yk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faj2rk3kv5i97x48uz1yk.png" alt=" " width="259" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Generated Reports:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0zw58jozuwfagucm878.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0zw58jozuwfagucm878.png" alt=" " width="295" height="101"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Benefits of Using Keploy
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rybqrsj8mbdwhy17w5s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rybqrsj8mbdwhy17w5s.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adopting Keploy in your development workflow brings several advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatic Test Generation&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No need to manually write repetitive test cases.
&lt;/li&gt;
&lt;li&gt;Keploy records your real API traffic and generates test cases in YAML format.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Keeps Tests Up-to-Date&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whenever your API changes, just record again.
&lt;/li&gt;
&lt;li&gt;Test cases evolve with your application, reducing maintenance overhead.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Mocks for External Services&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keploy automatically generates mocks for databases, third-party APIs, or external dependencies.
&lt;/li&gt;
&lt;li&gt;This allows tests to run reliably without depending on live external systems.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Language &amp;amp; Framework Agnostic&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works with popular backend frameworks like Flask, Django, FastAPI, Spring Boot, Express.js, and more.
&lt;/li&gt;
&lt;li&gt;Flexible enough to integrate into diverse tech stacks.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;End-to-End Coverage&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Captures both UI-driven actions and API requests.
&lt;/li&gt;
&lt;li&gt;Provides comprehensive testing without extra setup.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CI/CD Integration&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generated tests can be run in pipelines.
&lt;/li&gt;
&lt;li&gt;Ensures every deployment is validated with the same rigor as your local environment.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Automated testing is critical for building robust, bug-free applications, but writing and maintaining test cases can often feel repetitive and time-consuming. This is where Keploy changes the game.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5ju42tefnvssq0p0ana.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5ju42tefnvssq0p0ana.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By automatically recording real-world &lt;strong&gt;API interactions&lt;/strong&gt; and generating tests with data mocks, Keploy ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your APIs behave consistently.
&lt;/li&gt;
&lt;li&gt;Tests evolve naturally with your application.
&lt;/li&gt;
&lt;li&gt;Development cycles become faster and more reliable.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this blog, we built a Flask To-Do List app and saw how easily Keploy can record interactions, generate API test cases, and validate our endpoints. The key takeaway is:&lt;/p&gt;

&lt;p&gt;👉 With &lt;a href="https://keploy.io/" rel="noopener noreferrer"&gt;Keploy&lt;/a&gt;, you record once and test forever.  &lt;/p&gt;

&lt;p&gt;If you’re working with Flask, Django, FastAPI, or any modern backend, I highly encourage you to give Keploy a try. It’s a huge productivity booster and ensures your applications remain reliable as they grow.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>testing</category>
      <category>opensource</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Final Year, No Guarantee - What It's Really Like Looking for a Job</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Fri, 05 Sep 2025 18:08:44 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/the-honest-side-of-my-job-hunt-not-the-linkedin-version-l14</link>
      <guid>https://dev.to/mettasurendhar/the-honest-side-of-my-job-hunt-not-the-linkedin-version-l14</guid>
      <description>&lt;h2&gt;
  
  
  How tough is getting a job?
&lt;/h2&gt;

&lt;p&gt;How stressful is getting a job? How much preparation is needed? How much time should I spend? How much better should I become? Am I ready? Will I be suitable for this job? Should I apply or not?&lt;/p&gt;

&lt;p&gt;These are the questions running through my brain often. And honestly, I escape from them by procrastinating—scrolling through social media or distracting myself with other work instead of doing what’s needed.&lt;/p&gt;

&lt;p&gt;Yes, I know this isn’t the right way. But the truth is, I don’t really know what I should do or how I should handle it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;The irony?&lt;/strong&gt;&lt;/em&gt; I actually have good stories and experiences to share. I’m capable of competing. I’ve done the work needed for job seeking and building a career. All I need to do is put everything I’ve done over the past years together and prepare. But right now, it feels like a burden—or sometimes even useless.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/em&gt; Because I’m not getting opportunities in on-campus placements. Off-campus companies reject me right at the resume shortlisting round. And the job market itself isn’t great right now.&lt;/p&gt;

&lt;p&gt;Most companies seem to prefer experienced people. And even when there are fresher openings, many of them are purely for BE and BTech graduates.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I Stand ?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgtqovudtqqtbzcbtx20m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgtqovudtqqtbzcbtx20m.png" alt=" Where I Stand ? (cover image)" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;I’m not an Engineer&lt;/strong&gt;&lt;/em&gt;, but I study in one of the top engineering colleges in India: &lt;strong&gt;College of Engineering, Guindy (CEG), Anna University (AU)&lt;/strong&gt;. It’s a pioneer institution, built during the British era, with a long history and many achievements.&lt;/p&gt;

&lt;p&gt;Technically, I’m not called an “&lt;em&gt;engineer&lt;/em&gt;” because of my course. But the reality is—I follow almost the same syllabus, build the same skills, and work on similar projects as BE CS and BTech IT students. The only difference is the title.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;I’m not even a scientist&lt;/strong&gt;&lt;/em&gt;, though my degree is &lt;strong&gt;M.Sc. Information Technology&lt;/strong&gt;, an integrated course at CEG. Professionally, I don’t fit into the “&lt;em&gt;scientist&lt;/em&gt;” label either, since our course doesn’t involve research. Instead, it’s packed with the technical learning, tools, and hands-on practice that an engineer or IT professional would need.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;The tough part?&lt;/strong&gt;&lt;/em&gt; This course is managed by the Mathematics Department. So we don’t get CS scholars or experienced professors—only teaching fellows, most of whom aren’t strong enough to guide us properly.&lt;/p&gt;

&lt;p&gt;Because of this, our course doesn’t get proper on-campus placement opportunities. Most companies reject us immediately after seeing the course name. From the placement cell’s side, there’s also little to no support, even though we’ve been requesting it for years.&lt;/p&gt;

&lt;p&gt;The frustrating part is that our students are equally skilled, and some are even better than BE CS and BTech IT students in terms of projects and internships. Yet, we don’t get proper recognition or placements.&lt;/p&gt;

&lt;p&gt;With all this happening, I honestly don’t know how to face the situation. &lt;/p&gt;

&lt;p&gt;Have you ever felt like no matter how much effort you put in, the system just doesn’t see it?&lt;/p&gt;




&lt;h2&gt;
  
  
  My Journey So Far
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/metta-surendhar/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fncvsmzlmfcygg9zf99vx.png" alt=" My Journey So Far (cover image) " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From my &lt;strong&gt;&lt;em&gt;2nd year&lt;/em&gt;&lt;/strong&gt; onwards, I started taking small steps for the sake of my career and professional profile.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I created my LinkedIn account, began following students, alumni, professors, and tech pages.&lt;/li&gt;
&lt;li&gt;I started learning web development—first simple frontend projects, then functional pages. I built my portfolio and worked with a college team as a frontend developer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During the &lt;strong&gt;&lt;em&gt;transition from 2nd to 3rd year&lt;/em&gt;&lt;/strong&gt;, I learned version control, handling packages, and frameworks. I moved into backend development, did a full-stack project, and took on more backend roles in different projects.&lt;/p&gt;

&lt;p&gt;By &lt;strong&gt;&lt;em&gt;3rd year&lt;/em&gt;&lt;/strong&gt;, I was deeply interested in backend development. I worked on a college project as a backend developer for 3 months. At the same time, I also took up responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I served as the General Secretary of my college, co-organizing events and fests, and voicing student concerns to the management.&lt;/li&gt;
&lt;li&gt;I led a team of 5 on an alumni platform project, managing the entire backend myself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I barely had personal time, but I didn’t mind. I loved what I was doing and stayed true to my responsibilities. Isn’t it funny how when you truly enjoy something, you forget about time?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Between 3rd and 4th year&lt;/strong&gt;&lt;/em&gt;, I had to get an internship as part of my curriculum. During the internship drive, I attended only one company’s process—and I got selected.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;&lt;em&gt;4th year&lt;/em&gt;&lt;/strong&gt;, I worked as a Platform Engineering Intern at Invisibl Cloud Solutions. Some of my alumni were there, so I got the chance to connect with them. I learned a lot—new tools, frameworks, and technologies—throughout those six months. Around this time, I also started attending tech meetups, made new connections, and gained great experiences.&lt;/p&gt;

&lt;p&gt;After the internship, I continued with my course. Around then, I took responsibility &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For sponsorship and logistics for my department symposium Mathrix, as the Head of Industry Relations. &lt;/li&gt;
&lt;li&gt;I worked hard, brought in sponsorships, managed logistics, and actually enjoyed the whole process.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where I’m Stuck Now
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzjx50l6mp5vxh309cr9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzjx50l6mp5vxh309cr9n.png" alt=" Where I’m Stuck Now (cover image)" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, I’m in my &lt;strong&gt;&lt;em&gt;final year&lt;/em&gt;&lt;/strong&gt;, preparing for placements. Alongside that, I’m handling two responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I’m the Placement Representative, responsible for handling placements and bringing in companies.&lt;/li&gt;
&lt;li&gt;I’m also one of the Heads of Marketing and External Relations at Guindy Times, our college media club.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With all this going on, I still want to learn ML—but right now, I feel stuck and don’t know how to move forward.&lt;/p&gt;

&lt;p&gt;I know some of you reading this might be in the same state as me. And some of you may have already been through this and moved forward. If so, please share your experiences—it might help me, and others like me. After all, sometimes hearing someone else’s journey is all the push we need.&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>discuss</category>
      <category>learning</category>
    </item>
    <item>
      <title>This Event Cleared My Doubts About MLOps, DevOps &amp; Platform Engineering  -  OpsFusion 2024 Recap</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Sat, 12 Jul 2025 20:32:21 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/opsfusion-2024-insights-into-mlops-devops-and-platform-engineering-44m7</link>
      <guid>https://dev.to/mettasurendhar/opsfusion-2024-insights-into-mlops-devops-and-platform-engineering-44m7</guid>
      <description>&lt;p&gt;Recently, I had the opportunity to attend OpsFusion: Where Dev Meets ML—a technical meetup that brought together practitioners and enthusiasts across DevOps, MLOps, and Platform Engineering. The event was an excellent blend of hands-on sessions, real-world experiences, and emerging trends across these intersecting domains.&lt;/p&gt;

&lt;p&gt;In this blog, I’ve shared a structured summary of each session, along with key takeaways that resonated with me.&lt;/p&gt;

&lt;h2&gt;
  
  
  MLOps in Vertex AI – &lt;em&gt;by &lt;a href="https://www.linkedin.com/in/ACoAAAJ-XxUBPTKNK3_EdtDVJy-tU7cR9yO9GKs?lipi=urn%3Ali%3Apage%3Ad_flagship3_company_posts%3BuamMgHa0S0iASmsfzjWDdA%3D%3D" rel="noopener noreferrer"&gt;Navaneethan Gopal&lt;/a&gt;&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;This session focused on building end-to-end machine learning pipelines using Vertex AI, with a specific emphasis on automating the ML lifecycle beyond model development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feceruu2lnljot3pp4hna.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feceruu2lnljot3pp4hna.jpg" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The demonstration used a multi-class classification problem (Dry Beans dataset) developed in Google Colab using Gemini for code assistance.&lt;/li&gt;
&lt;li&gt;It was emphasized that less than 1% of MLOps involves actual ML code. The remaining majority lies in operations—such as infrastructure, orchestration, testing, and monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Core Components of MLOps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Data collection and validation&lt;/li&gt;
&lt;li&gt;Model training and testing&lt;/li&gt;
&lt;li&gt;Debugging and analysis&lt;/li&gt;
&lt;li&gt;Model monitoring post-deployment&lt;/li&gt;
&lt;li&gt;Cross-functional collaboration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  MLOps Lifecycle Phases
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Discovery – problem and data exploration&lt;/li&gt;
&lt;li&gt;Development – feature engineering, dataset versioning, and integration with feature stores&lt;/li&gt;
&lt;li&gt;Deployment – serving the model through automated pipelines&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Maturity Levels in MLOps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Level 0: Manual build and deploy&lt;/li&gt;
&lt;li&gt;Level 1: Automated training workflows&lt;/li&gt;
&lt;li&gt;Level 2: Fully automated and reproducible pipelines across environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vertex AI Pipeline Overview
&lt;/h3&gt;

&lt;p&gt;The speaker provided a walkthrough of how to build and deploy a Vertex AI pipeline triggered from Bitbucket or a cronjob. The steps included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a GCS (Google Cloud Storage) bucket&lt;/li&gt;
&lt;li&gt;Defining dataset and training components using XGBoost&lt;/li&gt;
&lt;li&gt;Initializing and deploying the pipeline via SDK integration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Emerging Operations in ML
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;FMOps (Foundation Model Operations): Managing LLMs, latency, token usage, and cost&lt;/li&gt;
&lt;li&gt;LLMOps: Operations tailored to Retrieval-Augmented Generation (RAG) and large language models&lt;/li&gt;
&lt;li&gt;PromptOps: Monitoring and optimizing prompt performance and hallucination tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kubeflow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Introduction to Kubeflow as a Kubernetes-native platform for ML workflows&lt;/li&gt;
&lt;li&gt;Creating custom components and reusable pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This session bridged the gap between foundational ML and scalable production pipelines, highlighting the growing need for robust, reproducible ML systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trunk-Based Development with Terraform – &lt;em&gt;by &lt;a href="https://www.linkedin.com/in/ACoAABKQasYBihAT9MUPw_7aNk5I4BLhrbo7RcU?lipi=urn%3Ali%3Apage%3Ad_flagship3_company_posts%3BuamMgHa0S0iASmsfzjWDdA%3D%3D" rel="noopener noreferrer"&gt;Harini Muralidharan&lt;/a&gt;&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;This session covered the developer-driven DevOps model, focusing on enabling application developers to define and manage infrastructure using Infrastructure as Code (IaC).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6u4ph0vuul1j2kntm6y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6u4ph0vuul1j2kntm6y.jpg" alt=" " width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Context: Challenges in Traditional DevOps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Frequent inconsistencies between dev and production environments&lt;/li&gt;
&lt;li&gt;Developer reliance on operations teams for even minor infrastructure changes&lt;/li&gt;
&lt;li&gt;Lack of visibility and traceability in changes made to the system&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Principles of Developer-Driven DevOps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developers define and version infrastructure alongside application code&lt;/li&gt;
&lt;li&gt;Early detection and mitigation of issues via automation&lt;/li&gt;
&lt;li&gt;Promotes ownership without expecting developers to become operations experts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Introduction to Terraform
&lt;/h3&gt;

&lt;p&gt;The session provided a deep dive into Terraform, its ecosystem, and how it enables scalable infrastructure on GCP.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why Terraform?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Open-source and cloud-agnostic&lt;/li&gt;
&lt;li&gt;Declarative syntax (HCL)&lt;/li&gt;
&lt;li&gt;Native support for GCP&lt;/li&gt;
&lt;li&gt;Strong community adoption and extensibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Core Components
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Providers: Connect Terraform with cloud services&lt;/li&gt;
&lt;li&gt;Resources: Define infrastructure components&lt;/li&gt;
&lt;li&gt;Variables &amp;amp; Outputs: Parameterization and visibility&lt;/li&gt;
&lt;li&gt;State Management: Track infrastructure state across teams&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Common Workflow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform init → terraform plan → terraform apply → terraform destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Integrating Terraform with CI/CD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Using CI/CD pipelines (YAML) to automate Terraform commands&lt;/li&gt;
&lt;li&gt;Promotes consistent, reliable infrastructure changes with version control&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Store code in Git with proper version control&lt;/li&gt;
&lt;li&gt;Use remote state storage (e.g., GCS or Terraform Cloud)&lt;/li&gt;
&lt;li&gt;Follow the principle of least privilege&lt;/li&gt;
&lt;li&gt;Modularize Terraform codebases for reusability&lt;/li&gt;
&lt;li&gt;Perform automated testing on infra modules&lt;/li&gt;
&lt;li&gt;Monitor for configuration drift and enforce corrective actions&lt;/li&gt;
&lt;li&gt;This talk emphasized the benefits of empowering developers while maintaining operational integrity, security, and scalability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This session bridged the gap between foundational ML and scalable production pipelines, highlighting the growing need for robust, reproducible ML systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Platform Engineering vs DevOps: Evolution or Revolution? – &lt;em&gt;by &lt;a href="https://www.linkedin.com/in/ACoAAC-62I8BWfvgj0Z5C_10Uh4ftmvyQUIZh_k?lipi=urn%3Ali%3Apage%3Ad_flagship3_company_posts%3BuamMgHa0S0iASmsfzjWDdA%3D%3D" rel="noopener noreferrer"&gt;Crystal Darling&lt;/a&gt;&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;This session helped clarify the difference between DevOps, SRE, and the growing field of Platform Engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faa6tqe7z9nvl9x0it7zr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faa6tqe7z9nvl9x0it7zr.jpg" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges in Traditional DevOps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Operations teams are often blocked by development timelines&lt;/li&gt;
&lt;li&gt;Developers submit tickets for operational support, resulting in slow turnaround&lt;/li&gt;
&lt;li&gt;Limited autonomy in environments, infrastructure, and tool usage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Is Platform Engineering?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The practice of building and maintaining Internal Developer Platforms (IDPs)&lt;/li&gt;
&lt;li&gt;Platform engineers build self-service tools and abstractions for developers&lt;/li&gt;
&lt;li&gt;Treat developers as clients, providing them with consistent and secure environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Platform Engineering Skills
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes orchestration&lt;/li&gt;
&lt;li&gt;IaC tools like Terraform and Helm&lt;/li&gt;
&lt;li&gt;CI/CD systems&lt;/li&gt;
&lt;li&gt;CNCF tooling for observability, deployment, and monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Core Message
&lt;/h3&gt;

&lt;p&gt;Platform Engineering is not a rebranding of DevOps. It is a cultural and architectural evolution focused on developer experience, autonomy, and scalability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discussions on ML Research and Networking
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4g5x3gii028ifzmpi160.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4g5x3gii028ifzmpi160.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
The event concluded with group discussions on recent research papers from Microsoft and Google—specifically those related to Copilot, RAG, and the inner workings of generative systems.&lt;/p&gt;

&lt;p&gt;It was a highly engaging session where I got to connect with fellow learners, exchange ideas, and hear how others are applying these concepts in real-world environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Attending OpsFusion gave me a broader and more integrated view of how software systems are evolving—whether it’s about scaling ML models through MLOps, automating infrastructure with Terraform, or building robust internal platforms that make developer lives easier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxecjx0ihktiau3x6o7ot.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxecjx0ihktiau3x6o7ot.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're someone who is navigating the intersection of ML, infrastructure, and deployment—or wants to bridge the gap between development and operations—events like these are immensely valuable.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>discuss</category>
      <category>cloud</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Building Real-World Infrastructure as a Fresher: My Story with Logs, AI &amp; Observability</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Sun, 29 Jun 2025 11:30:57 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/engineering-logs-intelligence-my-internship-journey-at-invisibl-cloud-solutions-1lcd</link>
      <guid>https://dev.to/mettasurendhar/engineering-logs-intelligence-my-internship-journey-at-invisibl-cloud-solutions-1lcd</guid>
      <description>&lt;p&gt;I'm thrilled to share that I’ve successfully completed my six-month internship(June 2024 – December 2024) as a &lt;strong&gt;Platform Engineer&lt;/strong&gt; at &lt;strong&gt;Invisibl Cloud Solutions&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;What started as an exploration of unfamiliar tools and domains quickly turned into one of the most fulfilling technical journeys I’ve had so far.&lt;/p&gt;

&lt;p&gt;From building a log observability infrastructure to developing an AI-powered research agent, this internship helped me grow technically, professionally, and personally.&lt;/p&gt;




&lt;h3&gt;
  
  
  Internship Experience: &lt;em&gt;Learning, Growth &amp;amp; Gratitude&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;The internship was hybrid in nature—split between working from home and at the office workspace. What made the experience even more special was that many of the senior staff were alumni from our college, making the workspace incredibly friendly and collaborative.&lt;/p&gt;

&lt;p&gt;On the days I went to the office in person, I would ride along with Dinesh Kumar—it took us nearly an hour to reach the workspace, and we had some of the best conversations along the way.&lt;br&gt;
Sometimes, we’d reminisce about college days, exams, and projects. Other times, we’d discuss our ongoing work, explore technologies, and talk about careers, placements, and what the future holds. Those morning rides were truly special—casual, thoughtful, and always enriching.&lt;/p&gt;

&lt;p&gt;I personally loved going to the office because many of our seniors—alumni from our very own course—would be there. Since we shared that common ground, we had so much to talk about. Whether it was clearing doubts, learning about the industry, or just general chit-chat, they always made time for us.&lt;br&gt;
During lunch, we’d all sit together, gossip, joke around, and just have fun. Looking back, those were some of my favorite memories—I genuinely miss those days.&lt;/p&gt;

&lt;p&gt;Beyond office hours, I was deeply focused on learning and growing. Over the six months, I attended technical meetups, joined bootcamps, started blogging, and participated in hackathons. These experiences helped me not only sharpen my skills but also connect with the broader tech community.&lt;br&gt;
All of this complemented what I was learning at Invisibl Cloud, helping me grow both in depth and in direction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsgoplv4to05w7q5hucra.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsgoplv4to05w7q5hucra.webp" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During my first three months, I worked on an &lt;strong&gt;&lt;em&gt;Observability Infrastructure Project&lt;/em&gt;&lt;/strong&gt;, where I dove deep into system logs, tools like Cribl and Grafana, and built a full-stack monitoring setup. Then, I transitioned to a &lt;strong&gt;&lt;em&gt;Generative AI-based project&lt;/em&gt;&lt;/strong&gt; centered around intelligent research paper discovery using RAG.&lt;/p&gt;

&lt;p&gt;I’m proud to share that the demos for both projects received positive feedback from the client, which was deeply satisfying, especially considering both domains were completely new to me when I started.&lt;/p&gt;

&lt;h4&gt;
  
  
  Gratitude
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I owe a huge thank you to the entire &lt;a href="https://invisibl.io/" rel="noopener noreferrer"&gt;Invisibl Cloud Solutions&lt;/a&gt; team for this enriching opportunity.&lt;/li&gt;
&lt;li&gt;A heartfelt thank you to &lt;a href="https://www.linkedin.com/in/harishganesan/" rel="noopener noreferrer"&gt;Harish Ganesan&lt;/a&gt;, CEO of Invisibl Cloud Solutions, for not only trusting me with impactful work but also giving me the opportunity to work on the Gen AI project. His involvement and encouragement were truly motivating.&lt;/li&gt;
&lt;li&gt;A big thanks to &lt;a href="https://www.linkedin.com/in/vijayramh/" rel="noopener noreferrer"&gt;VijayRam Harinathan&lt;/a&gt; for his support and mentorship in the observability project—his feedback and belief in my work made a huge difference.&lt;/li&gt;
&lt;li&gt;Special appreciation to &lt;a href="https://www.linkedin.com/in/farhana-s-64b5b8212/" rel="noopener noreferrer"&gt;Farhana S&lt;/a&gt;, whose consistent mentorship helped me navigate the observability space for the very first time.&lt;/li&gt;
&lt;li&gt;I'm equally grateful to &lt;a href="https://www.linkedin.com/in/suryaa-azhakhiamanavalan-007468189/" rel="noopener noreferrer"&gt;Suryaa Azhakhiamanavalan&lt;/a&gt; for his guidance on the Generative AI project. His mentorship turned this challenge into a rewarding experience.&lt;/li&gt;
&lt;li&gt;And of course, &lt;a href="https://www.linkedin.com/in/harshita-miranda/" rel="noopener noreferrer"&gt;Harshita Miranda&lt;/a&gt;, my project partner from day one. Working with her on both projects was a joy—we shared ideas, solved challenges together, and supported each other throughout.&lt;/li&gt;
&lt;li&gt;Lastly, shoutout to my amazing friends who interned alongside me—&lt;a href="https://www.linkedin.com/in/dinesh-kumar-ch/" rel="noopener noreferrer"&gt;Dinesh Kumar&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/sree-varshan-m-328b45222/" rel="noopener noreferrer"&gt;Sree Varshan M&lt;/a&gt;, and &lt;a href="https://www.linkedin.com/in/harini-s-995684248/" rel="noopener noreferrer"&gt;Harini S&lt;/a&gt;. You all made the workspace vibrant and the learning process fun!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;em&gt;Project 1:&lt;/em&gt; Building Observability Infrastructure for System Logs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Objective:&lt;/em&gt;&lt;/strong&gt; To extend the existing metrics-based monitoring stack by incorporating log observability across Windows and Linux systems.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Tech Stack:&lt;/em&gt;&lt;/strong&gt; Grafana, Loki, Cribl Edge, Cribl Stream, rsyslog, Prometheus&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Key Concepts:&lt;/em&gt;&lt;/strong&gt; Log collection, log routing, centralized logging, visualization&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwk396u14xp0dz28qaqpm.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwk396u14xp0dz28qaqpm.webp" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As someone &lt;a href="https://dev.to/mettasurendhar/observability-simplified-a-first-timers-guide-to-system-health-53nj"&gt;new to observability&lt;/a&gt;, I began with research into best practices and tools. The organization already had &lt;a href="https://dev.to/mettasurendhar/step-by-step-guide-to-configuring-cribl-and-grafana-for-data-processing-1j0f"&gt;metrics monitoring&lt;/a&gt;, and I was tasked with building the logs monitoring infrastructure from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows Log Monitoring&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leveraged native Event Logs (Application, System, Security).&lt;/li&gt;
&lt;li&gt;Collected logs using Cribl Agent.&lt;/li&gt;
&lt;li&gt;Processed and routed them through Cribl Edge and Cribl Stream.&lt;/li&gt;
&lt;li&gt;Stored in Grafana Loki.&lt;/li&gt;
&lt;li&gt;Visualized using &lt;a href="https://dev.to/mettasurendhar/getting-started-with-grafana-your-observability-superhero-awaits-okl"&gt;Grafana dashboards&lt;/a&gt;, with alerting and filtering options.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Linux Log Monitoring&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux was more challenging due to the absence of structured default logs.&lt;/li&gt;
&lt;li&gt;Created a Ubuntu virtual machine.&lt;/li&gt;
&lt;li&gt;Researched and implemented rsyslog to generate logs in custom templates.&lt;/li&gt;
&lt;li&gt;Integrated the logs into the same Cribl → Loki → Grafana pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Outcome:&lt;/em&gt;&lt;/strong&gt; Successfully built and delivered a cross-platform proof of concept for full-stack log observability, integrated seamlessly into the existing infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;em&gt;Project 2:&lt;/em&gt; Generative AI Research Agent
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Objective:&lt;/em&gt;&lt;/strong&gt; To build an intelligent AI agent capable of retrieving and summarizing research papers based on user queries.&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Tech Stack:&lt;/strong&gt;&lt;/em&gt; Haystack, FastAPI, Streamlit, Python, Arxiv API, Gemini, OpenSearch&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Key Concepts:&lt;/strong&gt;&lt;/em&gt; Agent pipelines, Retrieval-Augmented Generation (RAG), API development, LLM integration&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsxfe8mxmxb3gob4rkbxw.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsxfe8mxmxb3gob4rkbxw.webp" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the second half of my internship, I worked on this exciting project with one other teammate. The goal was to help researchers find academic papers faster and more efficiently using Generative AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Contributions
&lt;/h3&gt;

&lt;p&gt;🌟&lt;em&gt;Integrated the Arxiv API&lt;/em&gt; to fetch relevant research papers.&lt;br&gt;
🌟&lt;em&gt;Designed the agent pipeline&lt;/em&gt; using Haystack and Gemini, implementing RAG to combine retrieval with generation.&lt;br&gt;
🌟&lt;em&gt;Stored extracted data in OpenSearch&lt;/em&gt; for quick and context-aware access.&lt;br&gt;
🌟&lt;em&gt;Built a Streamlit-based POC&lt;/em&gt; to demo the functionality.&lt;br&gt;
🌟Later &lt;em&gt;developed a FastAPI version&lt;/em&gt; for production-level usage.&lt;/p&gt;

&lt;p&gt;The first month of development was incredibly intense—we often worked for over 10 hours a day to shape the prototype. With consistent support and motivation from Suryaa Azhakhiamanavalan and Harish Ganesan, and after multiple review meetings and revisions, we (myself and Harshita Miranda) were able to complete the proof of concept within the first month.&lt;br&gt;
Even though the pace felt heavy at the time, it turned out to be one of the most rewarding learning experiences of my internship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Outcome:&lt;/em&gt;&lt;/strong&gt; Delivered a fully functional prototype in under a month, and then enhanced it into an API-ready microservice with scalable architecture.&lt;/p&gt;




&lt;h4&gt;
  
  
  Key Takeaways
&lt;/h4&gt;

&lt;p&gt;This internship gave me a crash course in:&lt;br&gt;
✔️Observability tools and infrastructure, from system logs to dashboard visualization.&lt;br&gt;
✔️Generative AI workflows, agent chaining, and RAG pipelines.&lt;br&gt;
✔️Real-world problem solving across two very different but equally challenging domains.&lt;br&gt;
✔️Working in a collaborative team, presenting demos to clients, and adapting to fast-paced learning curves.&lt;br&gt;
✔️Most importantly, it showed me the importance of taking initiative, asking the right questions, and owning the full cycle of a product — from idea to implementation.&lt;/p&gt;

&lt;h4&gt;
  
  
  Final Thoughts
&lt;/h4&gt;

&lt;p&gt;Looking back, I’m proud of how much I was able to learn and build in just six months. The trust, guidance, and opportunities I received from Invisibl Cloud Solutions shaped this internship into something I’ll always remember.&lt;/p&gt;

&lt;p&gt;From configuring log protocols on Linux to chaining LLM agents for intelligent research—this journey has been transformative. I’m grateful for every challenge, every lesson, and every teammate who made it all worthwhile.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>ai</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>Hackathon Realities: What It's Like to Build, Code &amp; Ship in a Weekend</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Thu, 16 Jan 2025 14:00:00 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/hackathon-highlights-story-from-hackz-2024-finalist-23np</link>
      <guid>https://dev.to/mettasurendhar/hackathon-highlights-story-from-hackz-2024-finalist-23np</guid>
      <description>&lt;p&gt;I had the honor of leading my team in Hackz 2024, an intense 24-hour hackathon that stretched from 10 AM on November 23rd to 10 AM on November 24th. The event was buzzing with energy, creativity, and an overwhelming sense of purpose. With over 1000 teams registered, 500+ submitted their ideas, and only 20 were selected for the final round, our journey to the top felt nothing short of incredible.&lt;/p&gt;

&lt;p&gt;What made it even more special? We were the only team from the College of Engineering, Guindy (CEG) to make it this far—a proud moment for all of us.&lt;/p&gt;

&lt;p&gt;Despite the hackathon being hosted at our college, many teams from CEG had submitted ideas, but we were the sole representatives from our campus in the finals. Representing CEG among teams from diverse colleges and states was both a responsibility and a privilege.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4fhh4h3xdn360pqsmw5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4fhh4h3xdn360pqsmw5.jpg" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Challenge: Building Financial Inclusion for Seniors
&lt;/h2&gt;

&lt;p&gt;Our problem statement was as compelling as it was challenging:&lt;/p&gt;

&lt;p&gt;Develop an AI-powered financial inclusion platform designed for elderly individuals to simplify digital banking and financial planning. The platform should support voice commands, provide timely alerts for financial milestones, and offer tailored scam protection. By addressing digital literacy challenges, this solution aims to enhance independence and promote safe, accessible engagement with financial services for seniors.&lt;/p&gt;

&lt;p&gt;When we read this, we knew this was more than just a technical challenge; it was an opportunity to create a meaningful impact. With the rise in digital banking and scams targeting vulnerable populations, creating a tool to empower the elderly felt deeply significant.&lt;/p&gt;




&lt;h2&gt;
  
  
  Our Solution: &lt;em&gt;A Fintech Platform for Empowering the Elderly&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;After a whirlwind of brainstorming, designing, and coding, we presented our prototype, packed with features designed specifically for seniors:&lt;/p&gt;

&lt;p&gt;✔️ Voice Commands: For intuitive, hands-free interactions—perfect for users unfamiliar with complex interfaces.&lt;br&gt;
✔️ AI Chat Assistant: A personalized guide to help with financial queries and planning.&lt;br&gt;
✔️ Scam Protection Education: To safeguard users against fraud and teach them to spot red flags.&lt;br&gt;
✔️ Expense, Savings, and Investment Insights: Tailored recommendations to support better financial management.&lt;br&gt;
✔️ Ease of Use: Every feature was designed with accessibility and simplicity in mind to bridge the digital literacy gap.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Role as Team Lead: A Learning Curve
&lt;/h2&gt;

&lt;p&gt;As the team lead, I had the responsibility of steering our efforts. Coordinating a team in such a high-pressure environment was both thrilling and demanding. I learned the importance of quick decision-making, fostering collaboration, and staying calm under pressure.&lt;/p&gt;

&lt;p&gt;I’m incredibly grateful to my teammates—Harini S., Sundar Balamoorthy, and Adhithya—for their dedication and hard work. Sundar and Adhithya were new to hackathons and development, but they stepped up brilliantly, proving that a willingness to learn and contribute matters more than experience. I hope this journey encourages them to take part in more hackathons.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjtc7kiqzq91npq9pqk7y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjtc7kiqzq91npq9pqk7y.jpg" alt=" " width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Hackz 2024 was no ordinary hackathon. It brought together diverse minds from across states, creating a vibrant melting pot of ideas and innovation. The energy in the room as we worked through the night, fueled by adrenaline (and coffee!), was unlike anything else.&lt;/p&gt;

&lt;p&gt;We worked tirelessly for 24 hours, juggling ideas, implementing features, and debugging issues, but it was all worth it. By the end, we had a working prototype—a tangible result of our collaboration and effort.&lt;/p&gt;

&lt;p&gt;While we didn’t win, being among the top 20 teams out of 500+ submissions was a milestone we cherished.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuf6rkn3skd9uptgi2n4e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuf6rkn3skd9uptgi2n4e.jpg" alt=" " width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I want to express my heartfelt gratitude to:&lt;/p&gt;

&lt;p&gt;Navaneethan, our mentor, for his unwavering support and guidance. His encouragement kept us motivated till the very end. Navaneethan, I’m sorry we couldn’t bring home a trophy, but I’ve learned so much from you, and your insights will stay with me as I take on future projects.&lt;/p&gt;

&lt;p&gt;CSEA for organizing such a well-structured and supportive event. From managing logistics to ensuring participants were cared for, they truly went above and beyond.&lt;/p&gt;

&lt;p&gt;Temenos for sponsoring Hackz 2024 and fostering innovation among young developers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Takeaways and Reflections
&lt;/h2&gt;

&lt;p&gt;Hackz 2024 wasn’t just about creating a product; it was a journey of growth and discovery. Here’s what I’m taking away:&lt;/p&gt;

&lt;p&gt;🌟 Leadership Lessons: Leading a team under a tight deadline taught me how to manage people, tasks, and time effectively.&lt;/p&gt;

&lt;p&gt;🌟 Problem-Solving Skills: Tackling real-world challenges pushed me to think creatively and practically.&lt;/p&gt;

&lt;p&gt;🌟 Understanding Expectations: Getting feedback from judges and mentors helped me understand what it takes to impress industry experts.&lt;/p&gt;

&lt;p&gt;I also realized that mistakes are stepping stones to growth. Each bug we fixed, each feature we struggled to implement, and every moment of doubt taught me something valuable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnm6rf3ytznv11zbzq546.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnm6rf3ytznv11zbzq546.jpg" alt=" " width="800" height="671"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hackz 2024 has left me inspired and more determined than ever to create impactful tech solutions. The journey doesn’t end here; it’s just the beginning. I plan to build on these experiences, improve my skills, and continue pushing boundaries.&lt;/p&gt;

&lt;p&gt;To anyone considering participating in a hackathon: go for it! You’ll leave with more than just technical skills—you’ll gain memories, friendships, and a sense of achievement that’s hard to match.&lt;/p&gt;

&lt;p&gt;Once again, thank you to everyone who made this journey unforgettable—my team, mentor, organizers, and sponsors. Here’s to many more hackathons and challenges ahead! 💪&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>fintech</category>
      <category>ai</category>
      <category>aiops</category>
    </item>
    <item>
      <title>What IBM's SRE Expert Wants You to Know About Observability - A Beginner's Guide</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Thu, 09 Jan 2025 14:00:00 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/observability-unveiled-key-insights-from-ibms-sre-expert-4k1h</link>
      <guid>https://dev.to/mettasurendhar/observability-unveiled-key-insights-from-ibms-sre-expert-4k1h</guid>
      <description>&lt;p&gt;During the &lt;strong&gt;Grafana and Friends Meetup&lt;/strong&gt; in Chennai, I had the opportunity to attend an insightful session by &lt;a href="https://www.linkedin.com/in/manojkumar-g-27574a13/?lipi=urn%3Ali%3Apage%3Ad_flagship3_detail_base%3Bba6HJha5QsOLPgCk8Usz%2FA%3D%3D" rel="noopener noreferrer"&gt;&lt;strong&gt;Manojkumar&lt;/strong&gt;&lt;/a&gt;, an SRE professional from &lt;a href="https://www.linkedin.com/company/ibm/" rel="noopener noreferrer"&gt;IBM&lt;/a&gt;. His talk centered around observability and how IBM tackles real-world challenges using &lt;strong&gt;Grafana&lt;/strong&gt; and &lt;strong&gt;AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Out of all the sessions that day, this one stood out as my personal favorite, and I couldn’t wait to share some key takeaways here!The talk covered four critical components in modern observability systems: &lt;strong&gt;logs&lt;/strong&gt;, &lt;strong&gt;metrics&lt;/strong&gt;, &lt;strong&gt;traces&lt;/strong&gt;, and &lt;strong&gt;profiling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These make up the foundation for any robust observability setup, and he explained how each one plays a role in monitoring and troubleshooting large-scale infrastructures.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Observability Stack - Logs, Metrics, Traces, and Profiling&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;1. &lt;strong&gt;Logs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Logs are often the first step in diagnosing issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They provide a granular record of everything happening within the system, from user activities to errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At IBM, logs are used to trace the precise sequence of events that can lead to potential failures or performance degradation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2. &lt;strong&gt;Metrics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Metrics come in when you need to track the overall health of your system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By monitoring things like &lt;strong&gt;CPU usage&lt;/strong&gt;, &lt;strong&gt;memory consumption&lt;/strong&gt;, and &lt;strong&gt;response times&lt;/strong&gt;, metrics give a top-level view of how different components are performing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;While logs help you understand the "what" and "when," metrics help you catch patterns before they escalate into critical issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3. &lt;strong&gt;Traces:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Traces become vital in &lt;strong&gt;distributed systems&lt;/strong&gt; where a single request might travel through multiple services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IBM uses traces to monitor each step of the request path, allowing them to pinpoint bottlenecks and understand complex interactions between microservices.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4. &lt;strong&gt;Profiling:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Profiling takes observability to the next level by digging into the code execution itself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It’s useful for spotting inefficiencies in &lt;strong&gt;resource usage&lt;/strong&gt; (like CPU or memory) at a granular level, making it easier to optimize and fine-tune system performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Profiling provides the precision needed to identify which parts of the code need optimization, especially in performance-critical applications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Real-World Challenges &amp;amp; Solutions in Observability&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Manojkumar didn’t just talk theory — also shared practical challenges he faced and the solutions implemented using Grafana and AI. Three problems, in particular, stood out:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Problem 1: Missing Logs in the Centralized Logging System&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  One of the biggest challenges they encountered was missing logs in their centralized logging system. Relying on CloudWatch metrics alone led to gaps in visibility, which made it hard to troubleshoot incidents.
&lt;/h4&gt;

&lt;p&gt;To close the gaps, they decided to &lt;strong&gt;&lt;em&gt;incorporate ElasticSearch metrics&lt;/em&gt;&lt;/strong&gt; alongside CloudWatch data. This approach gave them a more comprehensive view and reduced the chance of missed log entries, ensuring no critical data was lost in the process.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Problem 2: Where to Start Diagnostics?&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  With data pouring in from multiple sources—Prometheus, MySQL, Oracle, AWS, Azure—it can be overwhelming to know where to begin diagnosing a system issue.
&lt;/h4&gt;

&lt;p&gt;The team built a &lt;strong&gt;&lt;em&gt;collective dashboard&lt;/em&gt;&lt;/strong&gt; that aggregates data from all these different sources. This unified view streamlined their diagnostics process, allowing them to get a clearer picture faster. Instead of hunting for data in different places, everything was available in one interface, which reduced the mean time to recovery (MTTR).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Problem 3: Multiple Alerts for a Single Issue&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Receiving multiple alerts for the same underlying issue was a common problem, leading to alert fatigue. This made it difficult to focus on the real issue amidst the flood of notifications.
&lt;/h4&gt;

&lt;p&gt;By utilizing &lt;strong&gt;&lt;em&gt;LLMs (Large Language Models)&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;KNN (K-Nearest Neighbors)&lt;/em&gt;&lt;/strong&gt; algorithms, they were able to intelligently group alerts. The system consolidated related alerts into one primary notification using &lt;strong&gt;&lt;em&gt;AI-driven operations&lt;/em&gt;&lt;/strong&gt; through &lt;strong&gt;&lt;em&gt;ClickHouse&lt;/em&gt;&lt;/strong&gt; , drastically cutting down on unnecessary noise. This way, the team could focus on solving the root cause without getting overwhelmed by redundant alerts.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why This Talk Stood Out for Me&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As someone deeply interested in &lt;strong&gt;observability&lt;/strong&gt; and system health, Manojkumar’s talk felt incredibly relevant and timely. I’ve worked with observability tools like &lt;strong&gt;Grafana&lt;/strong&gt; and &lt;strong&gt;Cribl&lt;/strong&gt;, but seeing how IBM integrates AI to enhance monitoring was eye-opening. Their ability to handle large-scale infrastructure challenges using observability and AI offered a glimpse into the future of system monitoring.&lt;/p&gt;

&lt;p&gt;The solutions they’ve implemented—whether it's creating multi-source dashboards or using AI for alert grouping—demonstrate how powerful modern observability tools have become. It also reinforced the idea that observability is not just about collecting data; it’s about making sense of it efficiently to keep systems running smoothly.&lt;/p&gt;




&lt;p&gt;His talk has inspired me to dive even deeper into observability. In the coming weeks, I’ll be exploring more advanced Grafana features and tools like &lt;strong&gt;LGTM Stack (Loki, Grafana, Tempo, Mimir)&lt;/strong&gt; and &lt;strong&gt;Cribl&lt;/strong&gt; for smarter log management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay tuned&lt;/strong&gt; as I continue this journey into understanding how we can use observability to improve system reliability and performance.&lt;/p&gt;

</description>
      <category>observability</category>
      <category>ibm</category>
      <category>sre</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Cribl &amp; Grafana: Build a Full Observability Pipeline From Scratch</title>
      <dc:creator>Metta Surendhar</dc:creator>
      <pubDate>Thu, 02 Jan 2025 14:00:00 +0000</pubDate>
      <link>https://dev.to/mettasurendhar/step-by-step-guide-to-configuring-cribl-and-grafana-for-data-processing-1j0f</link>
      <guid>https://dev.to/mettasurendhar/step-by-step-guide-to-configuring-cribl-and-grafana-for-data-processing-1j0f</guid>
      <description>&lt;p&gt;Data is the pulse of any system, and effectively managing it can bring significant value to your business. In this blog, we'll guide you step-by-step through setting up &lt;strong&gt;Cribl Edge&lt;/strong&gt; for data collection, &lt;strong&gt;Cribl Stream&lt;/strong&gt; for processing, and &lt;strong&gt;Grafana&lt;/strong&gt; for visualizing your metrics. Whether you're new to Cribl or looking for a refresher, this guide will have you up and running in no time.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Here’s what we'll cover:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setting Up Cribl Agent for Data Collection&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configuring Cribl Edge to Send Data to Cribl Stream&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Processing Data with Cribl Stream&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Utilizing Data in Grafana&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s dive in!&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 1: Setting Up Cribl Agent for Data Collection&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Efficient data collection is the first step towards real-time system monitoring. &lt;strong&gt;Cribl Edge&lt;/strong&gt; helps you capture system metrics and logs from multiple sources and send them to &lt;strong&gt;Cribl Stream&lt;/strong&gt; for processing.&lt;/p&gt;

&lt;p&gt;Follow these instructions to install and configure Cribl Edge on &lt;strong&gt;Linux&lt;/strong&gt; and &lt;strong&gt;Windows&lt;/strong&gt; systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1.1 Create an Account in Cribl Cloud&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Before we begin, we need to set up an account in Cribl Cloud:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sign-Up Process&lt;/strong&gt;: Go to &lt;a href="https://cribl.cloud/" rel="noopener noreferrer"&gt;Cribl Cloud&lt;/a&gt; and create an account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Login&lt;/strong&gt;: After signing up, log into Cribl Cloud with your credentials. The Cribl Cloud will be your primary interface for managing Edge nodes and data pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1k5td7bq1y0lz7pxi3lf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1k5td7bq1y0lz7pxi3lf.png" alt=" " width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚙️ Note:&lt;/strong&gt; For learning purposes, we will use Cribl Cloud to manage our data collection agents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1.2 Access the Edge Fleet&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Navigate to Edge&lt;/strong&gt; : After logging in, select the “Manage” button in the Cribl Edge section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m0hl8lurok5lwpaa850.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m0hl8lurok5lwpaa850.png" alt=" " width="611" height="448"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fleet Overview&lt;/strong&gt;: This will redirect you to the Edge page, where you can see a list of fleets and analytics&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3osl2oet2tvgpaohdkp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3osl2oet2tvgpaohdkp.png" alt=" " width="298" height="246"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Navigate to Default Fleet:&lt;/strong&gt; In Cribl Cloud, only one fleet (&lt;code&gt;default_fleet&lt;/code&gt;) will be available by default. Click on &lt;code&gt;default_fleet&lt;/code&gt; to view the monitoring data for Edge nodes, sources, and destinations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1.3 Add an Edge Node&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edge Node Overview&lt;/strong&gt;: Edge nodes are responsible for collecting and sending data from your system to Cribl Stream&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Edge Node Installation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the &lt;code&gt;default_fleet&lt;/code&gt; page, click the "Add/Update Edge Node" button in the upper right corner
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmdev4a7qyla6xf8lwx0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmdev4a7qyla6xf8lwx0.png" alt=" " width="266" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose an environment (Linux or Windows) where you want to install the Cribl Edge agent.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Linux Edge Node&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hover over the Linux tab, click "Add", and copy the installation script.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the Script&lt;/strong&gt;: Open a terminal and execute the script as the root user.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start and Verify&lt;/strong&gt;: After installation, ensure the agent is running with the command: &lt;code&gt;systemctl status cribl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tz45vw3llyfr2zfkccu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tz45vw3llyfr2zfkccu.png" alt=" " width="352" height="192"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows Edge Node&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hover over "Windows" and click "Add" to view the command prompt and PowerShell scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modify the Script&lt;/strong&gt;: Edit the script by changing &lt;code&gt;"/qn"&lt;/code&gt; to &lt;code&gt;"/q"&lt;/code&gt; to ensure the installation runs in the foreground.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run as Admin&lt;/strong&gt;: Run the script with administrator privileges to install the agent&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzidd7g0xtuodd58sqb3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzidd7g0xtuodd58sqb3.png" alt=" " width="352" height="192"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1.4 Check the Data Flow&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verify Agent Installation&lt;/strong&gt;: Once the Edge node is installed, monitor its status in the Cribl Cloud by navigating to the &lt;strong&gt;Edge Node Monitoring&lt;/strong&gt; page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-Time Data Monitoring&lt;/strong&gt;: Under &lt;strong&gt;Edge Fleet → default_fleet → Overview → Monitor&lt;/strong&gt;, you can view metrics such as &lt;strong&gt;events in&lt;/strong&gt; and &lt;strong&gt;bytes in&lt;/strong&gt; to verify that the Edge node is collecting data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;List View for Health Status&lt;/strong&gt;: Use the “List View” to check the health and status of each Edge node  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3jd1dfitt5razxz76uh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3jd1dfitt5razxz76uh.png" alt=" " width="513" height="135"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 2: Configuring Cribl Edge to Send Data to Cribl Stream&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once the Cribl Edge agent is installed and collecting data, you need to configure it to send the collected data to &lt;strong&gt;Cribl Stream&lt;/strong&gt; for further processing&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.1 Configure Source in Cribl Edge&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sources Overview&lt;/strong&gt;: Data sources represent the type of data being collected (e.g., system metrics, logs).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to &lt;strong&gt;default_fleet → More → Sources&lt;/strong&gt; to add a new data source. Depending on your environment, configure one of the following:    &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rkhgybnfv02cdrxs1jr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rkhgybnfv02cdrxs1jr.png" alt=" " width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows Metrics:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n9gbndfmzwlwoch7q3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n9gbndfmzwlwoch7q3j.png" alt=" " width="222" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable the &lt;code&gt;in_windows_metrics&lt;/code&gt; source and configure it by setting host metrics to "All."&lt;/li&gt;
&lt;li&gt;Set processing settings with Fields to a field name and value like &lt;code&gt;observ_data = 'edge_win_metrics'&lt;/code&gt; , Preprocessing Pipeline to &lt;code&gt;passthru&lt;/code&gt; and Connect Destination set to &lt;code&gt;Send to Routes.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Commit and deploy the changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;System Metrics:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjk3af36irzh2pu78t9y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjk3af36irzh2pu78t9y.png" alt=" " width="218" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable the &lt;code&gt;in_system_metrics&lt;/code&gt; source and configure processing settings.&lt;/li&gt;
&lt;li&gt;Set Fields to a field name and value like &lt;code&gt;observ_data = 'edge_lin_metrics'&lt;/code&gt; , Preprocessing Pipeline to &lt;code&gt;passthru&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ensure Connect Destination set to &lt;code&gt;Send to Routes&lt;/code&gt; and commit/deploy changes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Can’t enable both Windows and Linux sources in the same fleet simultaneously.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The destination can also be connected via interface using quick connect for more details check the &lt;a href="https://docs.cribl.io/stream/quickconnect/" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.2 Configure Destination in Cribl Edge&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;strong&gt;default_fleet → More → Destinations&lt;/strong&gt; to add a new destination.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwq4auk2hyubv0rsxaxtw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwq4auk2hyubv0rsxaxtw.png" alt=" " width="763" height="230"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;strong&gt;Cribl TCP&lt;/strong&gt; as the destination for both Windows and Linux sources:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwil0wtzixc1djy51hif.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwil0wtzixc1djy51hif.png" alt=" " width="222" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set a unique output ID (e.g., &lt;code&gt;cribl_system&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Enter the IP address from Cribl Cloud’s Access Details (can be get from your &lt;strong&gt;cribl cloud → Access details → Ingress IPs&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Enter the port number (e.g., &lt;code&gt;10300&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Commit and deploy the changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.3 Verify Source and Destination Configuration&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Verify that both source and destination are enabled (indicated by a check mark).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If there’s an issue (indicated by a cross mark), check the logs to resolve &lt;a href="https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=2ahUKEwjhitbkuuyIAxW5xjgGHeOdKjkQFnoECB4QAw&amp;amp;url=https%3A%2F%2Fdocs.cribl.io%2Fstream%2F4.6%2Fcommon-errors%2F%23%3A~%3Atext%3DCause%253A%2520Cribl%2520Stream%2520doesn%27t%2Cyour%2520Cribl%2520Stream%2520Sources%27%2520configuration.&amp;amp;usg=AOvVaw2jdYzkFyD8qENs-Ddu-ENg&amp;amp;opi=89978449" rel="noopener noreferrer"&gt;configuration errors&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.4 Create the Data Route&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Route Overview&lt;/strong&gt;: The data route links the source (e.g., &lt;code&gt;Windows or Linux metrics&lt;/code&gt;) to the destination (Cribl Stream).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Route Configuration&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In Cribl Stream, go to &lt;strong&gt;default_fleet → More → Data Routes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F294mx6gkmaucd3knrey0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F294mx6gkmaucd3knrey0.png" alt=" " width="798" height="275"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new route that links the source and destination:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2flfjfs957jg2o813dsx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2flfjfs957jg2o813dsx.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name the route and set filter expressions (&lt;code&gt;observ_data == 'edge_win_metrics'&lt;/code&gt; for Windows and &lt;code&gt;observ_data == 'edge_lin_metrics'&lt;/code&gt; for Linux) to ensure only Windows/Linux metrics are sent through this route.&lt;/li&gt;
&lt;li&gt;Set the pipeline to &lt;code&gt;passthru&lt;/code&gt; (default pipeline that doesn't modify data) and output to the Cribl TCP destination created earlier (&lt;code&gt;cribl_tcp:cribl_system&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Save the changes and Commit and deploy it to activate the route.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.5 Capture and Verify Data Flow&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Status Check:&lt;/strong&gt; Use the source and destination status and chart pages to view live data&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3z03rch2ozaqzqeacu5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3z03rch2ozaqzqeacu5.png" alt=" " width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Capture Events&lt;/strong&gt;: Monitor live data capture in source, destination and the data route.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fckk4miq29d7nxy1nbaof.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fckk4miq29d7nxy1nbaof.png" alt=" " width="799" height="320"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verify Routing&lt;/strong&gt;: Ensure that data flows seamlessly from source to destination by capturing data in the data route as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr2zepaw1j70z227l9g0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr2zepaw1j70z227l9g0.png" alt=" " width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Troubleshoot&lt;/strong&gt;: If data doesn’t flow as expected, check the logs in &lt;strong&gt;Cribl Edge&lt;/strong&gt; for potential configuration errors.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jyq35gadbiy1j35l1xj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jyq35gadbiy1j35l1xj.png" alt=" " width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 3: Processing Data with Cribl Stream&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that Cribl Edge is sending data to Cribl Stream, the next step is to configure &lt;strong&gt;Cribl Stream&lt;/strong&gt; to receive, process, and route this data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxi7ryc8pnpxicufn614.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxi7ryc8pnpxicufn614.png" alt=" " width="610" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3.1 Configure Source in Cribl Stream&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Setting Up the TCP Source&lt;/strong&gt;: Cribl Stream needs to listen for incoming data from Cribl Edge via a TCP connection.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Navigate to &lt;strong&gt;Cribl Stream → Default → Data → Sources&lt;/strong&gt; and add a source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzyz7qtpdspm9krwc1sjp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzyz7qtpdspm9krwc1sjp.png" alt=" " width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Cribl TCP Source&lt;/strong&gt; to match the configuration of the Cribl Edge TCP destination.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2waa4de19y3pvmujgeyl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2waa4de19y3pvmujgeyl.png" alt=" " width="221" height="200"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new source with a unique input ID, set the IP to bind to the edge which will be in default &lt;code&gt;0.0.0.0&lt;/code&gt;, and configure it with the same port used in Cribl Edge (e.g., &lt;code&gt;10300&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Commit and deploy the changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3.2 Configure Destination in Cribl Stream&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Destination Configuration&lt;/strong&gt;: The processed data will be sent to &lt;strong&gt;Grafana&lt;/strong&gt; using &lt;strong&gt;Prometheus Remote Write&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;strong&gt;Cribl Stream → Default → Data → Destinations&lt;/strong&gt; and select &lt;strong&gt;Prometheus&lt;/strong&gt; destination.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1x7iwzsfxycrj0aivl73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1x7iwzsfxycrj0aivl73.png" alt=" " width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new destination with a unique input ID like &lt;code&gt;prometheus-output&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6w5nj883a2teqgmkst0y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6w5nj883a2teqgmkst0y.png" alt=" " width="221" height="205"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the remote write URL , get the &lt;strong&gt;Prometheus Remote Write URL&lt;/strong&gt; from your &lt;a href="https://grafana.com/auth/sign-up/create-user" rel="noopener noreferrer"&gt;Grafana Cloud&lt;/a&gt; account (found under &lt;strong&gt;Prometheus → Send Metrics → Write URL&lt;/strong&gt; )&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Commit and deploy the changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3.3 Create a Processing Pack&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Processing Packs&lt;/strong&gt;: A processing pack in Cribl Stream allows you to create modular pipelines to filter, enrich, or modify data before it reaches its destination.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;strong&gt;Cribl Stream → Default → Processing → Packs&lt;/strong&gt; and add a pack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd3t3vc8gu0jf39wqemwf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd3t3vc8gu0jf39wqemwf.png" alt=" " width="239" height="204"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new pack (e.g., &lt;code&gt;Cribl-Windows-Metrics&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgbo5n1j2jr474kkbf2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgbo5n1j2jr474kkbf2f.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use functions and routes within the pack to process data via adding a pipelines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3xydwh38qhikj6og6si.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3xydwh38qhikj6og6si.png" alt=" " width="799" height="615"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For more details on packs and pipelines, refer to Cribl &lt;a href="https://docs.cribl.io/stream/packs/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3.4 Configure the Data Route&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Data Route&lt;/strong&gt;: Similar to Cribl Edge, create a data route that links the TCP source to the Prometheus destination.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In Cribl Stream, go to &lt;strong&gt;Default → Routing → Data Routes&lt;/strong&gt; and add a route.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qfjf7xfpc323uf5gack.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qfjf7xfpc323uf5gack.png" alt=" " width="799" height="252"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set filter expressions based on the source tags (&lt;code&gt;observ_data=='edge_win_metrics'&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Link the pack (&lt;code&gt;Cribl-Windows-Metrics&lt;/code&gt;) to the source and set the output to &lt;strong&gt;Prometheus (&lt;/strong&gt;&lt;code&gt;prometheus:prometheus-output&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff44xx1r7bhu2xsntavbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff44xx1r7bhu2xsntavbs.png" alt=" " width="799" height="423"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Commit and deploy the changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3.5 Verify Data Flow&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitor Event Flow&lt;/strong&gt;: Use the data capture and status pages in &lt;strong&gt;Cribl Stream&lt;/strong&gt; to verify that events are flowing correctly from the sources to the destinations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn25y3avvzy2xqebcfvrv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn25y3avvzy2xqebcfvrv.png" alt=" " width="798" height="172"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Capture Data&lt;/strong&gt;: Monitor live data for around 50 minutes and ensure the data is being processed and sent to Grafana.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdu8ohj0viv0mgixutf6r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdu8ohj0viv0mgixutf6r.png" alt=" " width="799" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogezoh66jtjw89snik4z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogezoh66jtjw89snik4z.png" alt=" " width="799" height="266"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Troubleshoot&lt;/strong&gt;: If data doesn’t flow or doesn’t processed as expected , check the logs for potential &lt;a href="https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=2ahUKEwjhitbkuuyIAxW5xjgGHeOdKjkQFnoECBoQAQ&amp;amp;url=https%3A%2F%2Fdocs.cribl.io%2Fstream%2Fcommon-errors&amp;amp;usg=AOvVaw3IxyywzbFiHO9uTEbAHzBu&amp;amp;opi=89978449" rel="noopener noreferrer"&gt;configuration errors&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 4: Utilizing Data in Grafana&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once the data has been processed by Cribl Stream, you can visualize it in &lt;strong&gt;Grafana&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.1 Create a Dashboard in Grafana&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Log in to Grafana Cloud&lt;/strong&gt;: If you don’t have an account, sign up at &lt;a href="https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=2ahUKEwjGy9eb1e2IAxXbnK8BHfYrPAMQFnoECAkQAQ&amp;amp;url=https%3A%2F%2Fgrafana.com%2Fauth%2Fsign-in&amp;amp;usg=AOvVaw3p5Bo4MhZ_R_HkXs6wXoGn&amp;amp;opi=89978449" rel="noopener noreferrer"&gt;Grafana Cloud&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Dashboard&lt;/strong&gt;: After logging in, go to &lt;strong&gt;Create Dashboard&lt;/strong&gt; and add a &lt;strong&gt;new panel&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdamw9hj5zfui2szmrj7k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdamw9hj5zfui2szmrj7k.png" alt=" " width="211" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Source&lt;/strong&gt;: Set the data source to &lt;strong&gt;Prometheus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi87zgfdog44b4vducdbb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi87zgfdog44b4vducdbb.png" alt=" " width="716" height="730"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Query Configuration&lt;/strong&gt;: Use PromQL queries to retrieve data from Prometheus. For example, &lt;code&gt;windows_cpu_percent_active&lt;/code&gt; to visualize CPU usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Customize the Panel&lt;/strong&gt;: Give the panel a meaningful name (e.g., &lt;code&gt;Windows CPU Metrics&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzo09mp4hz6hs0ph7zgmy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzo09mp4hz6hs0ph7zgmy.png" alt=" " width="800" height="649"&gt;&lt;/a&gt;       &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.2 Fine-Tuning Visualization&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Panel Customization&lt;/strong&gt;: Adjust time ranges, choose chart types (line, bar, etc.), and set thresholds for key metrics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multiple Panels&lt;/strong&gt;: Add panels for different metrics (memory, disk usage, network I/O).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deploy Dashboard&lt;/strong&gt;: Save and deploy the dashboard for real-time monitoring.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4.3 Monitoring and Analyzing Data&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-Time Data&lt;/strong&gt;: Grafana will now display real-time metrics based on the data collected, processed, and routed from Cribl Edge and Stream.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Alerts and Notifications&lt;/strong&gt;: Set up alerts in Grafana based on threshold values (e.g., high CPU usage).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;And there you have it! By following these steps, you can successfully set up Cribl Edge for data collection, Cribl Stream for processing, and Grafana for visualizing the data. This guide provides a foundation for customization of your data pipelines, allowing you to monitor, process, and visualize large-scale metrics effectively.&lt;/p&gt;

&lt;p&gt;In the next post, we will dive deeper into the detailed steps for creating dashboards, panels, and alerts in Grafana. Stay tuned!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>elasticsearch</category>
      <category>grafana</category>
      <category>cribl</category>
    </item>
  </channel>
</rss>
