<?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: hussain jamal</title>
    <description>The latest articles on DEV Community by hussain jamal (@hussain_jamal_).</description>
    <link>https://dev.to/hussain_jamal_</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%2F4047608%2Ffc74e63d-0bf7-4ea0-8a7b-576919476a51.jpg</url>
      <title>DEV Community: hussain jamal</title>
      <link>https://dev.to/hussain_jamal_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hussain_jamal_"/>
    <language>en</language>
    <item>
      <title>We Built a Flight Recorder for AI Coding Agents: Here's What SigNoz Taught Us About Watching Them Think</title>
      <dc:creator>hussain jamal</dc:creator>
      <pubDate>Sun, 26 Jul 2026 07:15:43 +0000</pubDate>
      <link>https://dev.to/hussain_jamal_/we-built-a-flight-recorder-for-ai-coding-agents-heres-what-signoz-taught-us-about-watching-them-28mc</link>
      <guid>https://dev.to/hussain_jamal_/we-built-a-flight-recorder-for-ai-coding-agents-heres-what-signoz-taught-us-about-watching-them-28mc</guid>
      <description>&lt;h2&gt;
  
  
  We Built an AI Agent... Then Realized We Had No Idea What It Was Doing
&lt;/h2&gt;

&lt;p&gt;Our AI agent was writing code, running tests, and opening pull requests, but I had absolutely no idea &lt;strong&gt;why some runs took 8 seconds while others took 45&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Was the LLM thinking too long?&lt;/p&gt;

&lt;p&gt;Was it stuck retrying a failing shell command?&lt;/p&gt;

&lt;p&gt;Was Docker slow?&lt;/p&gt;

&lt;p&gt;I couldn't tell.&lt;/p&gt;

&lt;p&gt;All I had was a loading spinner and a final result.&lt;/p&gt;

&lt;p&gt;That gap between knowing an agent is &lt;em&gt;doing something&lt;/em&gt; and actually knowing &lt;strong&gt;what&lt;/strong&gt; it's doing is exactly why we built &lt;strong&gt;AXRAY&lt;/strong&gt;, using &lt;strong&gt;SigNoz&lt;/strong&gt; as our observability backbone.&lt;/p&gt;

&lt;p&gt;This is the story of building it, the architecture behind it, and the deployment pitfalls that nearly broke everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛑 Why This Needed Solving
&lt;/h2&gt;

&lt;p&gt;Autonomous coding agents don't behave like traditional microservices.&lt;/p&gt;

&lt;p&gt;A single agent turn might involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; An LLM generating a multi-step plan&lt;/li&gt;
&lt;li&gt; Searching the codebase&lt;/li&gt;
&lt;li&gt; Reading files&lt;/li&gt;
&lt;li&gt; Writing code&lt;/li&gt;
&lt;li&gt; Running commands inside Docker&lt;/li&gt;
&lt;li&gt; Executing tests&lt;/li&gt;
&lt;li&gt; Creating Git commits&lt;/li&gt;
&lt;li&gt; Opening pull requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of those actions has its own latency.&lt;/p&gt;

&lt;p&gt;Every one can fail independently.&lt;/p&gt;

&lt;p&gt;Traditional application logs flatten all of this into an unreadable wall of text.&lt;/p&gt;

&lt;p&gt;You can't tell whether the agent was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thinking&lt;/li&gt;
&lt;li&gt;Waiting&lt;/li&gt;
&lt;li&gt;Retrying&lt;/li&gt;
&lt;li&gt;Actually executing code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;If latency comes from the LLM generating thousands of reasoning tokens, the solution is prompt optimization.&lt;/p&gt;

&lt;p&gt;If latency comes from a hanging shell command, the solution is a timeout or sandbox fix.&lt;/p&gt;

&lt;p&gt;Without separating those two, you're simply guessing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;AXRAY instruments every agent turn using &lt;strong&gt;OpenTelemetry&lt;/strong&gt;, following the official &lt;strong&gt;GenAI Semantic Conventions&lt;/strong&gt; instead of inventing our own telemetry schema.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gen_ai.request.model&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gen_ai.usage.input_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gen_ai.usage.output_tokens&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every span is tagged with a simple phase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;llm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tool&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From that we calculate two metrics for every agent turn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time-in-Brain
&lt;/h2&gt;

&lt;p&gt;How long the LLM spent thinking, reasoning, and generating tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time-in-Environment
&lt;/h2&gt;

&lt;p&gt;How long Docker actually spent executing commands.&lt;/p&gt;

&lt;p&gt;Those two numbers unlock almost everything.&lt;/p&gt;

&lt;p&gt;We also compute an overall execution efficiency score:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;efficiencyScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.35&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;brainPercent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;envPercent&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first time I watched a real execution session, I noticed something surprising.&lt;/p&gt;

&lt;p&gt;Almost &lt;strong&gt;78% of the latency&lt;/strong&gt; was inside the LLM.&lt;/p&gt;

&lt;p&gt;Our Docker sandbox wasn't slow.&lt;/p&gt;

&lt;p&gt;Our shell commands weren't slow.&lt;/p&gt;

&lt;p&gt;The context window was simply too large.&lt;/p&gt;

&lt;p&gt;That wasn't speculation.&lt;/p&gt;

&lt;p&gt;It came directly from a SigNoz trace query against:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;signoz_traces.signoz_index_v3&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Where SigNoz Did the Heavy Lifting
&lt;/h2&gt;

&lt;p&gt;SigNoz ended up powering three completely different layers of AXRAY.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ OTLP Export for Raw Instrumentation
&lt;/h2&gt;

&lt;p&gt;Every LLM request and every tool invocation exports spans through OTLP (&lt;code&gt;:4318&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Once we mapped our attributes onto the official GenAI semantic conventions, everything started fitting naturally into the existing observability ecosystem.&lt;/p&gt;

&lt;p&gt;No custom telemetry format required.&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ Direct ClickHouse Queries
&lt;/h2&gt;

&lt;p&gt;We wanted sub-turn latency breakdowns that standard dashboards don't expose directly.&lt;/p&gt;

&lt;p&gt;Because SigNoz stores traces inside ClickHouse, we could run custom SQL like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;attributes_string&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'tool.name'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;toolName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;durationNano&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avgDurationNano&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;executionCount&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;signoz_traces&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signoz_index_v3&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'tool.call'&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;attributes_string&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'axray.session.id'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'sess_42'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;toolName&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;avgDurationNano&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That query instantly showed which tools consumed the most execution time across an entire session.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ SigNoz MCP Server
&lt;/h2&gt;

&lt;p&gt;One feature we really wanted was live alert visibility inside AXRAY itself.&lt;/p&gt;

&lt;p&gt;Instead of rebuilding an alerting system, we connected directly to SigNoz's MCP server.&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;through &lt;code&gt;StreamableHTTPClientTransport&lt;/code&gt; gave us structured JSON containing active alert rules.&lt;/p&gt;

&lt;p&gt;This meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;token spikes&lt;/li&gt;
&lt;li&gt;cost anomalies&lt;/li&gt;
&lt;li&gt;latency alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;could appear directly inside AXRAY's UI without duplicating any of SigNoz's alerting logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part That Broke
&lt;/h2&gt;

&lt;p&gt;Here's the part I wish someone had warned me about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outdated Deployment Tutorials
&lt;/h2&gt;

&lt;p&gt;Most tutorials still describe the classic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;docker-compose&lt;/li&gt;
&lt;li&gt;install.sh&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;installation flow.&lt;/p&gt;

&lt;p&gt;That isn't the recommended deployment anymore.&lt;/p&gt;

&lt;p&gt;SigNoz has moved to &lt;strong&gt;Foundry&lt;/strong&gt;, driven by an extremely small YAML manifest.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Installation&lt;/span&gt;

&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;signoz&lt;/span&gt;

&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deployment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;flavor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;compose&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;

  &lt;span class="na"&gt;mcp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deployment becomes a single command:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Foundry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validates prerequisites&lt;/li&gt;
&lt;li&gt;generates Docker Compose&lt;/li&gt;
&lt;li&gt;starts the platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's actually simpler than the old approach.&lt;/p&gt;

&lt;p&gt;I just lost an afternoon following outdated tutorials before discovering it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hardcoded UUIDs
&lt;/h2&gt;

&lt;p&gt;The second bug was much sneakier.&lt;/p&gt;

&lt;p&gt;I wrote a script that automatically imported dashboards and alert rules into SigNoz's Postgres metadata database.&lt;/p&gt;

&lt;p&gt;Everything worked perfectly.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;my machine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because I had accidentally hardcoded my own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;org_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every fresh SigNoz installation generates completely different UUIDs.&lt;/p&gt;

&lt;p&gt;That meant my setup script silently failed on a clean installation.&lt;/p&gt;

&lt;p&gt;The fix was querying them dynamically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getOrgAndUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;orgId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;runSql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SELECT id FROM organizations LIMIT 1;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;runSql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SELECT id FROM users LIMIT 1;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;orgId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tiny change.&lt;/p&gt;

&lt;p&gt;Huge difference.&lt;/p&gt;

&lt;p&gt;It's exactly the kind of bug that only appears when someone else runs your project.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Tell My Past Self
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Test every setup script on a completely fresh machine.&lt;/li&gt;
&lt;li&gt;Never hardcode IDs that can be generated dynamically.&lt;/li&gt;
&lt;li&gt;Instrument "thinking" separately from "doing."&lt;/li&gt;
&lt;li&gt;Use standard OpenTelemetry conventions whenever possible.&lt;/li&gt;
&lt;li&gt;Production AI systems deserve production-grade observability.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;AXRAY started with one simple idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Let's add some logging to our AI agent."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It ended up becoming something much bigger.&lt;/p&gt;

&lt;p&gt;A strong argument that AI agents should be treated exactly like any production backend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trace everything.&lt;/li&gt;
&lt;li&gt;Measure everything.&lt;/li&gt;
&lt;li&gt;Alert on everything.&lt;/li&gt;
&lt;li&gt;Never trust a black box.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using SigNoz's OpenTelemetry-native architecture meant we didn't have to invent our own telemetry format, and that decision paid off far more than we expected.&lt;/p&gt;

&lt;p&gt;If you're building AI agents that combine LLM reasoning with real system execution, the very first metric I'd instrument is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Time-in-Brain vs Time-in-Environment&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's inexpensive to add.&lt;/p&gt;

&lt;p&gt;And it immediately answers the only question that matters when an agent feels slow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was it thinking… or was it stuck?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Built for
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://wemakedevs.org/" rel="noopener noreferrer"&gt;WeMakeDevs&lt;/a&gt; × &lt;a href="https://signoz.io/" rel="noopener noreferrer"&gt;SigNoz&lt;/a&gt; — &lt;a href="https://wemakedevs.org/events/agents-of-signoz" rel="noopener noreferrer"&gt;Agents of SigNoz Hackathon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you found this interesting, I'd love your feedback!&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/hussainjamal760/axray-signoz" rel="noopener noreferrer"&gt;https://github.com/hussainjamal760/axray-signoz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://axray-signoz-web.vercel.app/" rel="noopener noreferrer"&gt;https://axray-signoz-web.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*Thanks for reading! *&lt;/p&gt;

</description>
      <category>signoz</category>
      <category>opentelemetry</category>
      <category>ai</category>
      <category>wemakedevs</category>
    </item>
  </channel>
</rss>
