<?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: Abhishek Ugare</title>
    <description>The latest articles on DEV Community by Abhishek Ugare (@abhi-the-great).</description>
    <link>https://dev.to/abhi-the-great</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%2F4047619%2Ffb2d0905-f4ba-4db3-9bf2-688bc6e24fe7.png</url>
      <title>DEV Community: Abhishek Ugare</title>
      <link>https://dev.to/abhi-the-great</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhi-the-great"/>
    <language>en</language>
    <item>
      <title>End-to-End Observability to AI Application Using OpenTelemetry and SigNoz</title>
      <dc:creator>Abhishek Ugare</dc:creator>
      <pubDate>Sun, 26 Jul 2026 07:04:15 +0000</pubDate>
      <link>https://dev.to/abhi-the-great/end-to-end-observability-to-ai-application-using-opentelemetry-and-signoz-13h3</link>
      <guid>https://dev.to/abhi-the-great/end-to-end-observability-to-ai-application-using-opentelemetry-and-signoz-13h3</guid>
      <description>&lt;h1&gt;
  
  
  End-to-End Observability for AI Applications Using OpenTelemetry and SigNoz
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How I implemented distributed tracing, monitored an AI application end-to-end, and transformed debugging with OpenTelemetry and SigNoz.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Building an AI application is exciting. Debugging it when requests travel through multiple services is an entirely different challenge.&lt;/p&gt;

&lt;p&gt;When I started building &lt;strong&gt;Yaatra&lt;/strong&gt;, my AI-powered travel assistant, the architecture looked simple.&lt;/p&gt;

&lt;p&gt;A user would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter travel preferences.&lt;/li&gt;
&lt;li&gt;The backend would process the request.&lt;/li&gt;
&lt;li&gt;The AI engine would generate a personalized itinerary.&lt;/li&gt;
&lt;li&gt;The response would be displayed on the frontend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At least, that's how it looked on paper.&lt;/p&gt;

&lt;p&gt;Behind the scenes, a single request was traveling through multiple independent services. When something became slow—or worse, failed—I had no easy way to identify the root cause.&lt;/p&gt;

&lt;p&gt;Questions started appearing almost immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Was the backend slow?&lt;/li&gt;
&lt;li&gt;Was the AI engine taking longer than expected?&lt;/li&gt;
&lt;li&gt;Was the external LLM causing delays?&lt;/li&gt;
&lt;li&gt;Did the request even reach the AI service?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traditional logging only provided fragments of the story. I needed a complete picture.&lt;/p&gt;

&lt;p&gt;That's when I decided to implement &lt;strong&gt;end-to-end observability&lt;/strong&gt; using &lt;strong&gt;OpenTelemetry&lt;/strong&gt; and &lt;strong&gt;SigNoz&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this blog, I'll share my journey of instrumenting an AI-native application, the challenges I encountered, the lessons I learned, and how observability completely changed the way I debug distributed systems.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Problem
&lt;/h1&gt;

&lt;p&gt;Yaatra isn't a monolithic application.&lt;/p&gt;

&lt;p&gt;Although users interact with a single interface, every request passes through multiple services before a response is generated.&lt;/p&gt;

&lt;p&gt;Initially, my debugging strategy looked something like this:&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Request received&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Calling AI Engine...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response generated&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This worked during early development.&lt;/p&gt;

&lt;p&gt;As the project grew, the logs quickly became insufficient.&lt;/p&gt;

&lt;p&gt;I couldn't answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which service is responsible for high latency?&lt;/li&gt;
&lt;li&gt;How long does the AI engine spend processing?&lt;/li&gt;
&lt;li&gt;Are requests successfully reaching the AI service?&lt;/li&gt;
&lt;li&gt;Which request generated this log?&lt;/li&gt;
&lt;li&gt;How can I follow one request across multiple services?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I needed more than logs.&lt;/p&gt;

&lt;p&gt;I needed visibility into the complete lifecycle of every request.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why OpenTelemetry?
&lt;/h1&gt;

&lt;p&gt;I wanted an observability solution that wasn't tied to a single vendor.&lt;/p&gt;

&lt;p&gt;OpenTelemetry stood out because it has become the &lt;strong&gt;industry standard&lt;/strong&gt; for collecting telemetry data.&lt;/p&gt;

&lt;p&gt;Instead of manually adding monitoring logic throughout my codebase, OpenTelemetry automatically instruments supported libraries and exports telemetry to any compatible backend.&lt;/p&gt;

&lt;p&gt;For visualization, I chose &lt;strong&gt;SigNoz&lt;/strong&gt;, an open-source observability platform that supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distributed Traces&lt;/li&gt;
&lt;li&gt;Metrics&lt;/li&gt;
&lt;li&gt;Logs&lt;/li&gt;
&lt;li&gt;Dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, they provided everything I needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distributed tracing&lt;/li&gt;
&lt;li&gt;Automatic instrumentation&lt;/li&gt;
&lt;li&gt;Performance monitoring&lt;/li&gt;
&lt;li&gt;Request latency analysis&lt;/li&gt;
&lt;li&gt;Error tracking&lt;/li&gt;
&lt;li&gt;Custom dashboards&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  My Tech Stack
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Gateway Service
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Express.js&lt;/li&gt;
&lt;li&gt;OpenTelemetry SDK&lt;/li&gt;
&lt;li&gt;OTLP Exporter&lt;/li&gt;
&lt;li&gt;HTTP Instrumentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI Engine
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI&lt;/li&gt;
&lt;li&gt;Groq LLM&lt;/li&gt;
&lt;li&gt;Python OpenTelemetry SDK&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Observability Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OpenTelemetry&lt;/li&gt;
&lt;li&gt;SigNoz&lt;/li&gt;
&lt;li&gt;OTLP Protocol&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Understanding Distributed Tracing
&lt;/h1&gt;

&lt;p&gt;Before implementing observability, I had heard about &lt;strong&gt;distributed tracing&lt;/strong&gt;, but never fully understood its value.&lt;/p&gt;

&lt;p&gt;Once I started using it, everything clicked.&lt;/p&gt;

&lt;p&gt;Every incoming request creates a &lt;strong&gt;Trace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every operation performed while processing that request becomes a &lt;strong&gt;Span&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of viewing every service independently, I could now follow a request throughout its entire journey.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend
    │
    ▼
Gateway Service
    │
    ▼
AI Engine
    │
    ▼
LLM (Groq)
    │
    ▼
Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step became visible.&lt;/p&gt;

&lt;p&gt;This was probably the biggest mindset shift during the project.&lt;/p&gt;




&lt;h1&gt;
  
  
  Instrumenting the Gateway
&lt;/h1&gt;

&lt;p&gt;The gateway receives requests from the frontend and forwards them to the AI engine.&lt;/p&gt;

&lt;p&gt;To instrument it, I added the OpenTelemetry SDK to my Node.js application.&lt;/p&gt;

&lt;p&gt;The SDK included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node SDK&lt;/li&gt;
&lt;li&gt;OTLP Trace Exporter&lt;/li&gt;
&lt;li&gt;HTTP Instrumentation&lt;/li&gt;
&lt;li&gt;Resource Configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One issue confused me for quite some time.&lt;/p&gt;

&lt;p&gt;No traces were appearing inside SigNoz.&lt;/p&gt;

&lt;p&gt;After debugging, I discovered that &lt;strong&gt;OpenTelemetry must be initialized before importing Express.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Changing the initialization order immediately solved the issue.&lt;/p&gt;

&lt;p&gt;A tiny implementation detail—but one that consumed several hours.&lt;/p&gt;




&lt;h1&gt;
  
  
  Instrumenting the AI Engine
&lt;/h1&gt;

&lt;p&gt;The AI engine is built using &lt;strong&gt;FastAPI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Unlike Node.js, it required the Python OpenTelemetry SDK.&lt;/p&gt;

&lt;p&gt;I instrumented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI&lt;/li&gt;
&lt;li&gt;Requests library&lt;/li&gt;
&lt;li&gt;OTLP Exporter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once configured, every request reaching the AI engine automatically became a &lt;strong&gt;child span&lt;/strong&gt; of the gateway request.&lt;/p&gt;

&lt;p&gt;This was the moment distributed tracing finally made sense.&lt;/p&gt;

&lt;p&gt;Instead of seeing unrelated requests, SigNoz displayed a complete waterfall showing the entire request journey.&lt;/p&gt;




&lt;h1&gt;
  
  
  Context Propagation Was the Missing Piece
&lt;/h1&gt;

&lt;p&gt;One concept that initially confused me was &lt;strong&gt;context propagation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Generating spans alone isn't enough.&lt;/p&gt;

&lt;p&gt;The trace context must travel alongside every request.&lt;/p&gt;

&lt;p&gt;Without context propagation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gateway creates one trace&lt;/li&gt;
&lt;li&gt;AI Engine creates another trace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no relationship between them.&lt;/p&gt;

&lt;p&gt;With propagation enabled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Single Trace

Gateway
   │
   ├── AI Engine
   │      │
   │      └── LLM Request
   │
   └── Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything belongs to one trace.&lt;/p&gt;

&lt;p&gt;This became one of the most valuable lessons from the entire implementation.&lt;/p&gt;




&lt;h1&gt;
  
  
  Sending Telemetry to SigNoz
&lt;/h1&gt;

&lt;p&gt;Both services exported telemetry using the &lt;strong&gt;OTLP protocol&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once telemetry reached SigNoz, I could immediately visualize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active services&lt;/li&gt;
&lt;li&gt;Incoming requests&lt;/li&gt;
&lt;li&gt;Distributed traces&lt;/li&gt;
&lt;li&gt;Span duration&lt;/li&gt;
&lt;li&gt;Service dependencies&lt;/li&gt;
&lt;li&gt;Errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of scrolling through thousands of log lines, I could simply click a trace and inspect the complete execution path.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building Meaningful Dashboards
&lt;/h1&gt;

&lt;p&gt;Collecting traces wasn't my end goal.&lt;/p&gt;

&lt;p&gt;I wanted dashboards that answered real operational questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Request Count
&lt;/h2&gt;

&lt;p&gt;Tracks incoming requests over time.&lt;/p&gt;

&lt;p&gt;Useful for identifying traffic spikes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Average Request Latency
&lt;/h2&gt;

&lt;p&gt;Measures response times.&lt;/p&gt;

&lt;p&gt;Latency increases become immediately visible.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Processing Time
&lt;/h2&gt;

&lt;p&gt;A custom metric showing how much time the AI engine spends generating responses.&lt;/p&gt;




&lt;h2&gt;
  
  
  Request Volume
&lt;/h2&gt;

&lt;p&gt;A bar chart comparing request activity across different time periods.&lt;/p&gt;




&lt;h2&gt;
  
  
  Error Monitoring
&lt;/h2&gt;

&lt;p&gt;Displays failed requests and helps identify problems before users report them.&lt;/p&gt;




&lt;h1&gt;
  
  
  Challenges I Faced
&lt;/h1&gt;

&lt;p&gt;Not everything worked on the first attempt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Missing Traces
&lt;/h2&gt;

&lt;p&gt;Initially, no traces appeared.&lt;/p&gt;

&lt;p&gt;The problem turned out to be the SDK initialization order.&lt;/p&gt;




&lt;h2&gt;
  
  
  Broken Context Propagation
&lt;/h2&gt;

&lt;p&gt;The gateway and AI engine were generating completely independent traces.&lt;/p&gt;

&lt;p&gt;Proper propagation fixed the issue.&lt;/p&gt;




&lt;h2&gt;
  
  
  Force Flush Issues
&lt;/h2&gt;

&lt;p&gt;During development, telemetry wasn't always exported immediately.&lt;/p&gt;

&lt;p&gt;Understanding how and when telemetry is flushed made debugging much easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dashboard Design
&lt;/h2&gt;

&lt;p&gt;Creating dashboards is easy.&lt;/p&gt;

&lt;p&gt;Creating useful dashboards is much harder.&lt;/p&gt;

&lt;p&gt;I realized dashboards should answer questions—not simply display numbers.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I Learned
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Logs Are Not Enough
&lt;/h2&gt;

&lt;p&gt;Logs tell you &lt;strong&gt;what happened&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Traces tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where it happened&lt;/li&gt;
&lt;li&gt;How long it took&lt;/li&gt;
&lt;li&gt;What happened before&lt;/li&gt;
&lt;li&gt;What happened after&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Observability Should Be Added Early
&lt;/h2&gt;

&lt;p&gt;Adding instrumentation later is possible.&lt;/p&gt;

&lt;p&gt;Adding it early makes development and debugging significantly easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Distributed Systems Need Distributed Tracing
&lt;/h2&gt;

&lt;p&gt;As applications become more service-oriented, console logs become increasingly difficult to manage.&lt;/p&gt;

&lt;p&gt;Distributed tracing provides context that logs alone cannot.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dashboards Save Time
&lt;/h2&gt;

&lt;p&gt;Instead of manually inspecting logs, dashboards immediately reveal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased latency&lt;/li&gt;
&lt;li&gt;Higher request volume&lt;/li&gt;
&lt;li&gt;Failed requests&lt;/li&gt;
&lt;li&gt;Slow downstream services&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Architecture Overview
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;               Frontend
                   │
                   ▼
        Gateway Service (Node.js)
                   │
         OpenTelemetry SDK
                   │
          OTLP Trace Exporter
                   │
                   ▼
          AI Engine (FastAPI)
                   │
         OpenTelemetry SDK
                   │
                   ▼
              Groq LLM
                   │
                   ▼
          Response to Client

────────────────────────────────

Telemetry Flow

Gateway
      ─────────►
                OTLP
      ◄─────────

AI Engine
      ─────────►

                ▼

             SigNoz
      (Traces • Metrics • Logs)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Screenshots
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Dashboard Overview
&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%2Fg8c2jwrsgt0tumtgct09.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%2Fg8c2jwrsgt0tumtgct09.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker Containers
&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%2Fesxjevmif3kdfj73klc2.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%2Fesxjevmif3kdfj73klc2.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Yaatra System Architecture
&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%2Fdp7ra382wqg36c82x9t8.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%2Fdp7ra382wqg36c82x9t8.png" alt=" " width="799" height="292"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  SigNoz Deployment
&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%2F00cqfernv345voq0a1u6.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%2F00cqfernv345voq0a1u6.png" alt=" " width="799" height="177"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  OpenTelemetry Implementation
&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%2Fddpoq7f7rxx31c5hszpw.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%2Fddpoq7f7rxx31c5hszpw.png" alt=" " width="800" height="206"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  What I'd Improve Next
&lt;/h1&gt;

&lt;p&gt;Now that end-to-end observability is working, there are several improvements I'd like to make.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instrument the React frontend for browser tracing.&lt;/li&gt;
&lt;li&gt;Add structured logging alongside traces.&lt;/li&gt;
&lt;li&gt;Configure alerts for high latency and increased error rates.&lt;/li&gt;
&lt;li&gt;Track business metrics such as itinerary generation time.&lt;/li&gt;
&lt;li&gt;Monitor AI token usage.&lt;/li&gt;
&lt;li&gt;Measure user experience from browser interaction to AI response.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Before this project, I believed observability was primarily a production concern.&lt;/p&gt;

&lt;p&gt;After implementing OpenTelemetry and SigNoz, I realized it's equally valuable during development.&lt;/p&gt;

&lt;p&gt;Instead of relying on scattered console logs, I can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Follow every request across the application.&lt;/li&gt;
&lt;li&gt;Identify bottlenecks within seconds.&lt;/li&gt;
&lt;li&gt;Understand how each service contributes to response time.&lt;/li&gt;
&lt;li&gt;Debug distributed systems with confidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest takeaway wasn't learning another tool.&lt;/p&gt;

&lt;p&gt;It was learning a completely new way to think about debugging.&lt;/p&gt;

&lt;p&gt;Modern applications are distributed.&lt;/p&gt;

&lt;p&gt;Our debugging approach should be distributed too.&lt;/p&gt;

&lt;p&gt;If you're building AI applications, microservices, or any system where requests travel across multiple components, I highly recommend investing in observability early.&lt;/p&gt;

&lt;p&gt;It will save countless hours of debugging and provide confidence that every request tells a complete story.&lt;/p&gt;

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




&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;OpenTelemetry Documentation&lt;/li&gt;
&lt;li&gt;SigNoz Documentation&lt;/li&gt;
&lt;li&gt;YouTube Tutorials&lt;/li&gt;
&lt;li&gt;ChatGPT (for brainstorming, explanations, and documentation assistance)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opentelemetry</category>
      <category>signoz</category>
      <category>kaayaa</category>
      <category>yaatra</category>
    </item>
  </channel>
</rss>
