<?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: Akshay</title>
    <description>The latest articles on DEV Community by Akshay (@akshayv98).</description>
    <link>https://dev.to/akshayv98</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%2F4035077%2F4532eb91-a413-47b7-a9dd-e8417cae38d0.png</url>
      <title>DEV Community: Akshay</title>
      <link>https://dev.to/akshayv98</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akshayv98"/>
    <language>en</language>
    <item>
      <title>The Loudest Alert Was Wrong: Building RootSpan with SigNoz</title>
      <dc:creator>Akshay</dc:creator>
      <pubDate>Sun, 26 Jul 2026 15:53:54 +0000</pubDate>
      <link>https://dev.to/akshayv98/the-loudest-alert-was-wrong-building-rootspan-with-signoz-2e1o</link>
      <guid>https://dev.to/akshayv98/the-loudest-alert-was-wrong-building-rootspan-with-signoz-2e1o</guid>
      <description>&lt;p&gt;An alert can be perfectly accurate and still point at the wrong place to begin investigating.&lt;/p&gt;

&lt;p&gt;In my hackathon incident, checkout returned errors and the gateway was slow, but neither service was locally broken. Both were waiting on &lt;code&gt;inventory.reserve&lt;/code&gt;, where a scoped timeout had started. That gap—between the loudest symptom and the first broken operation—is why I built &lt;strong&gt;RootSpan&lt;/strong&gt; for the Agents of SigNoz hackathon.&lt;/p&gt;

&lt;p&gt;RootSpan is a read-only incident-correlation system. It compares matched healthy and failing telemetry cohorts, ranks the first local divergence, shows supporting and contradicting evidence, and hands the decision to a human. It never deploys, rolls back, or restarts anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The incident I wanted to solve
&lt;/h2&gt;

&lt;p&gt;I built a three-service Python lab with this request path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;traffic -&amp;gt; gateway.checkout -&amp;gt; checkout.place_order -&amp;gt; inventory.reserve
                                                    -&amp;gt; inventory.db.select
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Healthy traffic used &lt;code&gt;inventory-v1&lt;/code&gt; and a control flag. The failing cohort was deliberately narrow: &lt;code&gt;ap-south-1&lt;/code&gt;, &lt;code&gt;inventory-v2&lt;/code&gt;, and the &lt;code&gt;async-reserve&lt;/code&gt; flag. When the resettable fault switch was enabled, &lt;code&gt;inventory.reserve&lt;/code&gt; waited 350 ms and returned a timeout. Gateway and checkout then failed too.&lt;/p&gt;

&lt;p&gt;That shape matters. A naive “first red span” or “slowest service” rule can blame a parent whose duration merely includes downstream waiting. RootSpan instead asks: what changed repeatedly in failing traces, stayed normal in matched healthy traces, and consumed time locally rather than inheriting it?&lt;/p&gt;

&lt;h2&gt;
  
  
  SigNoz was the evidence plane, not a screenshot at the end
&lt;/h2&gt;

&lt;p&gt;I installed self-hosted SigNoz and its MCP server through Foundry using the committed &lt;code&gt;casting.yaml&lt;/code&gt; and generated lock file:&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;SigNoz served six distinct roles in RootSpan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It stored the lab's OpenTelemetry traces, structured logs, and custom metrics.&lt;/li&gt;
&lt;li&gt;A trace-based checkout error-rate rule detected customer-visible impact.&lt;/li&gt;
&lt;li&gt;Its Alertmanager-compatible webhook opened an idempotent RootSpan incident.&lt;/li&gt;
&lt;li&gt;The SigNoz MCP server supplied bounded trace, log, metric, and query results.&lt;/li&gt;
&lt;li&gt;Query Builder v5 produced reproducible latency and blast-radius aggregations.&lt;/li&gt;
&lt;li&gt;SigNoz observed RootSpan itself, including correlation stages and Sentinel Mesh spans.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is possible because SigNoz treats logs, metrics, and traces as connected OpenTelemetry signals, while its &lt;a href="https://signoz.io/docs/userguide/query-builder-v5/" rel="noopener noreferrer"&gt;Query Builder&lt;/a&gt; supports filtering, aggregation, percentiles, grouping, and formulas across those surfaces. OpenTelemetry &lt;a href="https://opentelemetry.io/docs/concepts/context-propagation/" rel="noopener noreferrer"&gt;context propagation&lt;/a&gt; preserved the trace relationship across the gateway, checkout, and inventory HTTP calls; trace and span IDs also made the JSON logs directly correlatable.&lt;/p&gt;

&lt;p&gt;The application exported all three signals through OTLP. The two custom counters were intentionally boring: &lt;code&gt;rootspan.lab.requests&lt;/code&gt; and &lt;code&gt;rootspan.lab.failures&lt;/code&gt;. Their job was to answer a decision, not decorate a dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Querying SigNoz without putting an LLM in the data path
&lt;/h2&gt;

&lt;p&gt;The most important architecture decision was to use the &lt;a href="https://signoz.io/docs/ai/signoz-mcp-server/" rel="noopener noreferrer"&gt;SigNoz MCP server&lt;/a&gt; as a normal programmatic client. A model was not required to decide what evidence existed.&lt;/p&gt;

&lt;p&gt;For each incident, RootSpan used typed, bounded calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;signoz_search_traces          -&amp;gt; healthy and failing trace IDs
signoz_get_trace_details      -&amp;gt; complete bounded trace trees
signoz_search_logs            -&amp;gt; timeout fingerprints and trace-linked examples
signoz_execute_builder_query  -&amp;gt; latency comparison and blast-radius groups
signoz_query_metrics          -&amp;gt; metric corroboration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every call stored its tool name, typed arguments, time range, response hash, duration, status, and SigNoz deep link. The correlation core depended on a &lt;code&gt;TelemetryGateway&lt;/code&gt; contract, so replay fixtures and live MCP results returned the same domain types. That kept the algorithm testable when the live stack was offline without creating a second definition of evidence.&lt;/p&gt;

&lt;p&gt;Runtime credentials were Viewer-only. Bootstrap credentials could create the alert, dashboard, webhook channel, and service account, but the running investigator could only read. That separation made the human-approval boundary enforceable rather than aspirational.&lt;/p&gt;

&lt;h2&gt;
  
  
  How first-divergence ranking works
&lt;/h2&gt;

&lt;p&gt;RootSpan aligns the same operations across healthy and failing traces and calculates both inclusive duration and exclusive, or self, duration. For each operation it records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prevalence in failing versus healthy traces;&lt;/li&gt;
&lt;li&gt;local error-rate lift;&lt;/li&gt;
&lt;li&gt;inclusive and exclusive duration ratios;&lt;/li&gt;
&lt;li&gt;the fraction of the total shift attributable to local work;&lt;/li&gt;
&lt;li&gt;independent signal support;&lt;/li&gt;
&lt;li&gt;contradiction and cohort-coverage penalties.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key lesson was that inclusive latency alone is misleading. In the golden incident, the gateway and checkout spans became slow because their child call was slow. Their self-duration stayed near baseline. &lt;code&gt;inventory.reserve&lt;/code&gt; showed the large local shift and the timeout, so it ranked first.&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%2Fnyw5ov5tz1j6161afvdu.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%2Fnyw5ov5tz1j6161afvdu.png" alt=" " width="800" height="964"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The score remains inspectable, and RootSpan calls the result a ranked hypothesis—not proven causality. If either cohort is missing, has fewer than two usable traces, falls below 50% requested coverage, or no operation crosses the evidence threshold, the incident becomes INSUFFICIENT_EVIDENCE. Returning no diagnosis is a feature.&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%2F0sw9ndmxeljvpbg6ybvh.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%2F0sw9ndmxeljvpbg6ybvh.png" alt=" " width="800" height="1159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Sentinel Mesh: parallel observation with deterministic authority
&lt;/h2&gt;

&lt;p&gt;Because the hackathon focused on agents, I wanted more than a single process with an “AI” label. Each live incident creates a logical Sentinel Mesh: gateway, checkout, inventory, and database observers run bounded read-only work concurrently.&lt;/p&gt;

&lt;p&gt;One leader is elected through an atomic SQLite lease. Leadership is not decided by a model or a vote. If the leader fails, the lease generation advances and a healthy follower takes over. A failed follower remains visible as degraded coverage; it cannot erase evidence from the others. The deterministic ranker—not the sentinels—owns scoring and abstention.&lt;/p&gt;

&lt;p&gt;SigNoz made that workflow observable through spans such as &lt;code&gt;sentinel.leader.elect&lt;/code&gt;, &lt;code&gt;sentinel.delegate&lt;/code&gt;, &lt;code&gt;sentinel.observe&lt;/code&gt;, and &lt;code&gt;sentinel.leader.failover&lt;/code&gt;, alongside &lt;code&gt;cohort.select&lt;/code&gt;, &lt;code&gt;trace.align&lt;/code&gt;, &lt;code&gt;divergence.rank&lt;/code&gt;, and &lt;code&gt;brief.compile&lt;/code&gt;. The investigation system therefore had to meet the same observability standard as the system it inspected.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup problem I did not expect
&lt;/h2&gt;

&lt;p&gt;The hardest integration issue was telemetry ingestion, not ranking. In my local Foundry cast, the OpAMP-managed ingester could receive a pre-onboarding configuration with &lt;code&gt;nop&lt;/code&gt; receivers and exporters. Containers appeared healthy while OTLP ports refused connections.&lt;/p&gt;

&lt;p&gt;I solved this with a small application-owned OpenTelemetry Collector bridge. It accepted OTLP from RootSpan and the lab, then used SigNoz's native ClickHouse exporters against the same Foundry telemetry store. This was deployment scaffolding, not a second product database. More importantly, I added &lt;code&gt;make telemetry-check&lt;/code&gt; assertions for complete three-service traces, both custom metrics, timeout logs, all six correlation-stage span names, and sentinel observation spans. A green container was no longer accepted as proof that telemetry worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the measurements actually say
&lt;/h2&gt;

&lt;p&gt;I evaluated correctness separately from execution speed. The deterministic suite contains 14 labeled simulations, including local failures at four operations, partial prevalence, shuffled input order, missing or undersized cohorts, and normal telemetry that should trigger abstention.&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;make evaluate&lt;/code&gt; produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100% top-1 localization and 1.0 mean reciprocal rank;&lt;/li&gt;
&lt;li&gt;100% abstention recall and 0% false diagnoses;&lt;/li&gt;
&lt;li&gt;100% citation integrity, deep-link coverage, and query provenance;&lt;/li&gt;
&lt;li&gt;stable ranking across 280 seeded reorder trials;&lt;/li&gt;
&lt;li&gt;2.557 ms p95 for the core at 50 healthy plus 50 failing traces on this run.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final deployed &lt;code&gt;make live-verify&lt;/code&gt; gate measured a different boundary: five complete MCP/SigNoz investigations. It ranked &lt;code&gt;inventory.reserve&lt;/code&gt; first in 5/5 runs with 1002.8 ms request-to-ready p50 and 1283.3 ms p95. Those numbers describe one controlled local scenario, not production root-cause accuracy or an SLA improvement.&lt;/p&gt;

&lt;p&gt;To reproduce the path after provisioning Foundry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make bootstrap-signoz
make app-up
make live-verify
make evaluate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I would tell my past self
&lt;/h2&gt;

&lt;p&gt;Match cohorts before writing a clever scorer. Separate local work from inherited latency. Store contradictions with the supporting evidence. Test abstention as seriously as success. And instrument the investigator early—otherwise “the agent is slow” becomes another incident with no trace.&lt;/p&gt;

&lt;p&gt;Most importantly, an LLM does not need to own the evidence pipeline for a project to be agentic. RootSpan's useful autonomy is bounded: coordinate observers, gather verified telemetry, and prepare the next human decision. Deterministic code decides what the data supports; a future model can explain that packet, but it cannot manufacture evidence or acquire production authority.&lt;/p&gt;

&lt;p&gt;RootSpan did not fix the inventory timeout. It did something I trust more: it turned an upstream checkout alert into a cited, reproducible explanation of the first local divergence—and then stopped at the human handoff.&lt;/p&gt;

&lt;p&gt;Project links: &lt;a href="https://github.com/Akshay-Verma-CS/rootspan" rel="noopener noreferrer"&gt;source code&lt;/a&gt;, &lt;a href="https://akshay-verma-cs.github.io/rootspan/" rel="noopener noreferrer"&gt;architecture and evaluation&lt;/a&gt;, and the official &lt;a href="https://signoz.io/docs/what-is-signoz/" rel="noopener noreferrer"&gt;SigNoz overview&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>signoz</category>
      <category>opentelemetry</category>
      <category>observability</category>
    </item>
    <item>
      <title>Before the Agent Acts: Designing Evidence-First Incident Triage with SigNoz</title>
      <dc:creator>Akshay</dc:creator>
      <pubDate>Sun, 19 Jul 2026 18:29:24 +0000</pubDate>
      <link>https://dev.to/akshayv98/before-the-agent-acts-designing-evidence-first-incident-triage-with-signoz-4ep3</link>
      <guid>https://dev.to/akshayv98/before-the-agent-acts-designing-evidence-first-incident-triage-with-signoz-4ep3</guid>
      <description>&lt;h2&gt;
  
  
  An alert tells me where a system is hurting. It does not always tell me where the failure began.
&lt;/h2&gt;

&lt;p&gt;That difference is expensive during an incident. The loudest signal may come from an API gateway or checkout service, while the first locally abnormal operation sits several calls downstream. Engineers lose time moving between trace search, log search, metric charts, deployment context, and Slack—then reconstructing the same evidence for the next responder.&lt;/p&gt;

&lt;p&gt;For the Agents of SigNoz hackathon, I want to build RootSpan: a read-only incident correlation agent that shortens that path. It will not patch code, restart production, or claim certainty it cannot prove. Its job is to find the first meaningful divergence between healthy and failing traffic, measure the blast radius, and give a human an evidence-linked handoff.&lt;/p&gt;

&lt;p&gt;Before writing the agent, I built a local SigNoz lab and investigated a real failure manually. That gives the project a test oracle: if the agent cannot reproduce a careful human investigation, it should not recommend an action.&lt;/p&gt;

&lt;h2&gt;
  
  
  The investigation contract
&lt;/h2&gt;

&lt;p&gt;RootSpan should answer six questions in order:&lt;/p&gt;

&lt;p&gt;Which service, operation, and time window are affected?&lt;br&gt;
What do failing traces share that healthy traces do not?&lt;br&gt;
Where does the error first appear with local evidence?&lt;br&gt;
Which logs corroborate or contradict that trace-level hypothesis?&lt;br&gt;
Is this one unusual request or a population-level incident?&lt;br&gt;
What raw SigNoz evidence should the responder open next?&lt;br&gt;
This is investigation, not autonomous remediation. A human remains responsible for deciding whether to roll back, change configuration, contact an owner, or continue observing.&lt;/p&gt;
&lt;h2&gt;
  
  
  Building the local lab with Foundry
&lt;/h2&gt;

&lt;p&gt;The hackathon requires SigNoz to be installed through Foundry. Foundry represents the deployment with casting.yaml and generates casting.yaml.lock, which makes the environment reproducible.&lt;/p&gt;

&lt;p&gt;I used foundryctl v0.2.14 and this local Docker configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1alpha1
kind: Installation
metadata:
  name: signoz-warmup
spec:
  deployment:
    flavor: compose
    mode: docker
  mcp:
    spec:
      enabled: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I ran:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The cold image download was the slow part. Once the images were cached, the successful cast completed in about 15 seconds. The stack exposed the SigNoz UI on localhost:8080, OTLP ingestion on 4317 and 4318, and the MCP endpoint on localhost:8000/mcp.&lt;/p&gt;

&lt;p&gt;One setup detail was easy to miss: before the first workspace was registered, the collector accepted a placeholder configuration. Registration triggered an OpAMP configuration update that activated the real trace, metric, and log pipelines. If OTLP appears reachable but no data arrives, finish the workspace setup and inspect the collector configuration rather than immediately blaming the application instrumentation.&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%2Feahi1acygan76kbb4e2x.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%2Feahi1acygan76kbb4e2x.png" alt=" " width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sending telemetry worth correlating
&lt;/h2&gt;

&lt;p&gt;For the warm-up I used the official OpenTelemetry Demo Lite, configured for two requests per second. It produces traces, metrics, and logs from 14 services across Go, JavaScript, and Python:&lt;/p&gt;

&lt;p&gt;accounting, ad, browser-frontend, cart, checkout, currency, email, fraud-detection, frontend, payment, product-catalog, quote-python, recommendation, and shipping.&lt;/p&gt;

&lt;p&gt;The demo also generates controlled failures. The payment service rejects about 5% of calls, while the email service simulates an SMTP failure on about 2%. That is useful for correlation because successful and failing cohorts exist at the same time under the same deployment.&lt;/p&gt;

&lt;p&gt;This reinforced a basic observability lesson: an agent cannot recover structure the telemetry never recorded. Stable service.name and operation names, propagated trace context, error status, and trace-aware logs are more valuable than clever prompting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Following a failure through the trace
&lt;/h2&gt;

&lt;p&gt;I filtered for traces containing errors and selected a representative trace:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;It crossed all 14 services and contained 94 spans. The visible transaction lasted about 16 ms, so this was not primarily a latency investigation.&lt;/p&gt;

&lt;p&gt;The waterfall showed two red spans around order confirmation. The email service's server span, sendOrderConfirmation, carried the first clear local evidence:&lt;/p&gt;

&lt;p&gt;status: Error;&lt;br&gt;
message: SMTP connection failed;&lt;br&gt;
exception event recorded on the email span;&lt;br&gt;
a second email_failed event with smtp_error as the failure reason.&lt;br&gt;
Its checkout ancestor also returned an error, but the email span contained the local exception. That distinction is exactly what RootSpan must preserve: an upstream error is not automatically the origin of the failure.&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%2Fmusluu3qmkgu1nag1l0t.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%2Fmusluu3qmkgu1nag1l0t.png" alt=" " width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would describe this as the first locally evidenced failure, not an absolute root cause. The SMTP dependency itself is not instrumented, so the trace cannot prove why the connection failed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Correlating the logs without a time-window guessing game
&lt;/h2&gt;

&lt;p&gt;The selected email span did not have a log record attached directly to its span ID. SigNoz still let me pivot from the trace to all logs carrying the same trace ID.&lt;/p&gt;

&lt;p&gt;That view showed the sequence clearly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SendOrderConfirmation
SendOrderConfirmation failed
Email failed
PublishToKafka
Order placed successfully
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more informative than searching globally for “SMTP”. The error is real, but the order workflow continued. Accounting and fraud-detection consumed the order, and checkout logged Order placed successfully.&lt;/p&gt;

&lt;p&gt;That evidence changes the incident classification. The likely customer impact is a missing confirmation email, not a failed order. A responder might contact the email-service owner or inspect the SMTP dependency instead of rolling back the entire checkout service.&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%2Fztw7yffaxmvb51s4psoe.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%2Fztw7yffaxmvb51s4psoe.png" alt=" " width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is also a useful contradiction here: the failing trace contains a successful business outcome. RootSpan should include contradictory evidence in its handoff rather than hiding it to make a cleaner story.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking population-level impact
&lt;/h2&gt;

&lt;p&gt;One trace is evidence; it is not an incident by itself.&lt;/p&gt;

&lt;p&gt;In the 30-minute service view captured below, SigNoz showed all 14 applications with latency, error-rate, and throughput columns. Email had a 2.12% error rate with 0.80 ms p99 latency. Payment showed a 4.71% error rate with 0.74 ms p99 latency. The rates matched the demo's controlled failure behavior closely enough to confirm that the trace was part of a recurring population, not a single corrupt sample.&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%2F19r6sgqj2u5e80n3823d.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%2F19r6sgqj2u5e80n3823d.png" alt=" " width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is still not a healthy-versus-incident comparison. A production-quality agent must compare explicit cohorts and retain counts as well as percentages. A 5% error rate across 20 requests is not equivalent to 5% across 20 million.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the agent should automate
&lt;/h2&gt;

&lt;p&gt;The manual warm-up exposed the mechanical work that an MCP-driven agent can remove:&lt;/p&gt;

&lt;p&gt;query a bounded set of failing and healthy traces;&lt;br&gt;
group failures by service and operation;&lt;br&gt;
reconstruct the full parent-child trace rather than stopping at the matching span;&lt;br&gt;
rank the first locally abnormal spans;&lt;br&gt;
fetch logs by trace and span context;&lt;br&gt;
check service-level error, latency, and throughput signals;&lt;br&gt;
return direct evidence links, timestamps, query arguments, and confidence reasons.&lt;br&gt;
The agent's output should look less like a chatbot answer and more like an incident handoff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hypothesis: email confirmation is degraded after checkout succeeds
First local evidence: email/sendOrderConfirmation
Trace evidence: SMTP exception; checkout ancestor propagated the error
Corroborating logs: SendOrderConfirmation failed; Email failed
Contradictory evidence: order published and placed successfully
Observed impact: recurring email failures; order path continues
Next human checks: SMTP dependency health, email service changes, affected users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every line should be clickable back to SigNoz or reproducible from a stored query. If the agent cannot show its evidence, it should lower its confidence instead of becoming more persuasive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I am not starting with auto-remediation
&lt;/h2&gt;

&lt;p&gt;Most teams will not allow a new AI agent to edit code or restart production during a live incident—and they should not have to.&lt;/p&gt;

&lt;p&gt;The first valuable product is smaller and safer: reduce the time between alert and the first correct human decision. A read-only correlator has a realistic adoption path because responders can verify every claim, learn where the model is weak, and measure whether it actually reduces triage time.&lt;/p&gt;

&lt;p&gt;Telemetry correlation is also not causality. A span may wait on an uninstrumented dependency. A deployment may be near an alert but unrelated. A “healthy” baseline may contain a different traffic mix. Human judgment is still required to test the hypothesis and choose a production action.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I will build during the hackathon
&lt;/h2&gt;

&lt;p&gt;The implementation will be intentionally narrow:&lt;/p&gt;

&lt;p&gt;A Python correlation engine that queries SigNoz through MCP and compares healthy and failing trace cohorts.&lt;br&gt;
A deterministic scoring layer for local errors, cohort specificity, corroborating logs, blast radius, and contradictory evidence.&lt;br&gt;
A small React investigation console that presents hypotheses and deep links, not a fake autonomous command center.&lt;br&gt;
A Go incident lab that produces one repeatable multi-service failure for the demo.&lt;br&gt;
An evidence ledger in SQLite so every conclusion records the query, time window, and source IDs that produced it.&lt;br&gt;
The success metric is not “the model fixed production.” It is whether another engineer can reach and verify the right next action faster.&lt;/p&gt;

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

&lt;p&gt;The warm-up trace already demonstrated why correlation matters. A red checkout span suggested a failed purchase. The deeper email exception and trace-linked logs showed a narrower reality: confirmation failed, while the order continued successfully.&lt;/p&gt;

&lt;p&gt;That is the kind of distinction I want RootSpan to surface consistently. SigNoz already holds the evidence across traces, logs, and service metrics. The agent's job is to assemble it into a bounded, honest handoff—then let the human decide what to do.&lt;/p&gt;

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