<?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: Disha Sonowal</title>
    <description>The latest articles on DEV Community by Disha Sonowal (@dishasonowal).</description>
    <link>https://dev.to/dishasonowal</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%2F4016288%2Fcb5771cf-781d-4915-a8a9-615755dd9bc4.jpg</url>
      <title>DEV Community: Disha Sonowal</title>
      <link>https://dev.to/dishasonowal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dishasonowal"/>
    <language>en</language>
    <item>
      <title>We Traced a Fake AI Agent Before Building a Real One (Here's What Broke)</title>
      <dc:creator>Disha Sonowal</dc:creator>
      <pubDate>Sat, 11 Jul 2026 11:45:52 +0000</pubDate>
      <link>https://dev.to/dishasonowal/we-traced-a-fake-ai-agent-before-building-a-real-one-heres-what-broke-1e7d</link>
      <guid>https://dev.to/dishasonowal/we-traced-a-fake-ai-agent-before-building-a-real-one-heres-what-broke-1e7d</guid>
      <description>&lt;p&gt;Before the real hackathon starts on the 20th, there's a small warm-up task. Self-host SigNoz, send it some data, and write about a feature you liked. We could have just run the demo app SigNoz gives you and finished in ten minutes. We didn't do that. Our hackathon track is about AI agent observability, so we wanted to actually try tracing something that looks like an AI agent before the real clock starts.&lt;/p&gt;

&lt;p&gt;It took longer than we thought. Docker on Windows was the main reason.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installing SigNoz was easy. WSL was not.
&lt;/h2&gt;

&lt;p&gt;First thing to know: if you go looking for a &lt;code&gt;docker-compose.yaml&lt;/code&gt; file in the SigNoz repo like older guides say, you won't find one. SigNoz now uses a new tool called Foundry. It handles the whole install for you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://signoz.io/foundry.sh | bash
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;mkdir &lt;/span&gt;signoz-deploy &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;signoz-deploy
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; casting.yaml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
apiVersion: v1alpha1
kind: Installation
metadata:
  name: signoz
spec:
  deployment:
    flavor: compose
    mode: docker
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&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;That last command does everything. It checks if Docker is working, sets up the config in the background, pulls the images, and starts all the containers — ClickHouse, ClickHouse Keeper, Postgres, the OTel collector, and SigNoz itself.&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%2Fr4lm5uxmujm3f6ire0p1.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%2Fr4lm5uxmujm3f6ire0p1.png" alt="screenshot — foundryctl cast output, all green" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's where we lost about 40 minutes. My teammate, Sagar is on Windows using WSL2, and Docker just would not connect. Every &lt;code&gt;docker&lt;/code&gt; command failed with "command not found," even though Docker Desktop was clearly open and running.&lt;/p&gt;

&lt;p&gt;Turns out you have to manually turn on WSL Integration. It's not automatic. You go to Docker Desktop → Settings → Resources → WSL Integration, and there are two switches to turn on: one for "Enable integration with my default WSL distro," and another for the specific distro itself (Ubuntu, in our case). We only found the first switch at first, which is why nothing worked.&lt;/p&gt;

&lt;p&gt;After fixing that, we ran &lt;code&gt;docker --version&lt;/code&gt; again from Ubuntu, and it finally showed a real version number.&lt;/p&gt;

&lt;p&gt;Then we hit a new error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;permission denied while trying to connect to the docker API at unix:///var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fix was one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We ran it, tried &lt;code&gt;docker ps&lt;/code&gt; again, and it still failed. Turns out this change only works after you close the terminal and open a new one. We ran that same command three times before we figured that out.&lt;/p&gt;

&lt;p&gt;After all that, the actual SigNoz install only took about three minutes. We opened &lt;code&gt;localhost:8080&lt;/code&gt;, made an account, and landed on an empty dashboard that said "you're not sending any data yet."&lt;/p&gt;




&lt;h2&gt;
  
  
  We sent it a fake AI agent instead of the boring demo
&lt;/h2&gt;

&lt;p&gt;SigNoz comes with a sample app called HotROD — a fake ride-hailing service. We skipped it. Not because it's bad, but because it wouldn't teach us anything about the thing this hackathon actually cares about: watching an AI agent do its work.&lt;/p&gt;

&lt;p&gt;So we wrote a small Python script instead. It fakes an AI agent handling a request, making a fake LLM call, and doing a bit of post-processing. Every step is wrapped in an OpenTelemetry span so SigNoz can trace it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;opentelemetry&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;opentelemetry.sdk.trace&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TracerProvider&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;opentelemetry.sdk.trace.export&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BatchSpanProcessor&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;opentelemetry.exporter.otlp.proto.grpc.trace_exporter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OTLPSpanExporter&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;opentelemetry.sdk.resources&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Resource&lt;/span&gt;

&lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service.name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;demo-agent-service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TracerProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_span_processor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;BatchSpanProcessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OTLPSpanExporter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost:4317&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;insecure&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_tracer_provider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tracer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_tracer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fake_llm_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_as_current_span&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm_call&lt;/span&gt;&lt;span class="sh"&gt;"&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;span&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm.prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uniform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm.tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_as_current_span&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;handle_request&lt;/span&gt;&lt;span class="sh"&gt;"&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;span&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user.query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fake_llm_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_as_current_span&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;post_process&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing complicated here. &lt;code&gt;handle_request&lt;/code&gt; is the main span. &lt;code&gt;llm_call&lt;/code&gt; fakes a model call with a random delay so the numbers look real. &lt;code&gt;post_process&lt;/code&gt; doesn't do much, but we added it so we'd have three steps to look at in the trace.&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%2Fea1brnew0acec3wbtq15.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%2Fea1brnew0acec3wbtq15.png" alt="signoz-otel-script-run-output" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We ran this script 20 times with random test questions like "What's the weather?" and "Book a flight." It sent data over gRPC to port 4317, which is the default port SigNoz listens on. When we checked the Traces tab in the browser, the data was already there. That felt good after the whole WSL mess.&lt;/p&gt;




&lt;h2&gt;
  
  
  The trace waterfall is the feature that got us
&lt;/h2&gt;

&lt;p&gt;We looked at Dashboards and Alerts too, but clicking into a single trace and seeing the waterfall view is what actually made things click for us.&lt;/p&gt;

&lt;p&gt;We picked one &lt;code&gt;handle_request&lt;/code&gt; trace. It took 702ms total. Inside it, the &lt;code&gt;llm_call&lt;/code&gt; step alone took 601ms. That's about 85% of the whole request just sitting inside the fake model call. The &lt;code&gt;post_process&lt;/code&gt; step barely shows up next to it.&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%2F7ur66ulet7vrnbki7n8w.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%2F7ur66ulet7vrnbki7n8w.png" alt="screenshot — trace waterfall, handle_request 702ms / llm_call 601ms" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you click on a span, you get a side panel showing every detail we added to it, like &lt;code&gt;user.query: "Book a flight"&lt;/code&gt; and the token count. So you're not just seeing "this took 601ms." You're seeing exactly what the agent was doing during that time.&lt;/p&gt;

&lt;p&gt;If you're trying to debug a real AI agent — one that calls an LLM, maybe checks a database, maybe uses a tool — this view is exactly what you'd want to open when someone says "the agent felt slow today." Instead of guessing, you can just look and see where the time actually went.&lt;/p&gt;




&lt;h2&gt;
  
  
  We also tried dashboards and alerts
&lt;/h2&gt;

&lt;p&gt;Once tracing worked, we figured we'd try the rest too.&lt;/p&gt;

&lt;p&gt;We built one dashboard panel showing the average &lt;code&gt;llm_call&lt;/code&gt; duration over time. We used the Traces data source and filtered on &lt;code&gt;name = 'llm_call'&lt;/code&gt;. It took a couple of tries because we first left the average function empty, and SigNoz told us "function avg requires arguments" until we typed &lt;code&gt;avg(durationNano)&lt;/code&gt; correctly.&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%2F2i7qky23rss5pn7gw29l.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%2F2i7qky23rss5pn7gw29l.png" alt="screenshot — dashboard line chart, avg llm_call duration" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we set up one alert. If the p99 duration of &lt;code&gt;llm_call&lt;/code&gt; goes above 1000ms, it should send a notification. One thing that confused us: durations are stored in nanoseconds, so typing "1000ms" actually means typing &lt;code&gt;1000000000&lt;/code&gt; into a plain number box. There was no unit dropdown for this. We named the alert "Slow LLM Call," connected it to a test webhook channel, and saved it.&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%2Fu6pobrv4mguc00rqey1j.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%2Fu6pobrv4mguc00rqey1j.png" alt="screenshot — alert rule, Slow LLM Call, status OK" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Was the setup pain worth it
&lt;/h2&gt;

&lt;p&gt;Yes. The trace waterfall is the one feature we'd point someone to first. Seeing that 601 out of 702ms came from a single fake LLM call made the whole idea of "observability" make sense in a way that just reading the docs never did. It was also nice that the same filter, &lt;code&gt;name = 'llm_call'&lt;/code&gt;, worked the exact same way in the trace explorer, the dashboard, and the alert. We didn't have to rewrite it each time.&lt;/p&gt;

&lt;p&gt;For the real hackathon project next week, the plan is simple: use the same setup, but replace &lt;code&gt;time.sleep()&lt;/code&gt; with an actual LLM call, and see what the real numbers look like.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;By Disha Sonowal &amp;amp; Sagar Maurya — &lt;a href="https://www.wemakedevs.org/" rel="noopener noreferrer"&gt;WeMakeDevs&lt;/a&gt; SigNoz Hackathon&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>signoz</category>
      <category>wemakedevs</category>
      <category>agents</category>
      <category>hackathon</category>
    </item>
  </channel>
</rss>
