<?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: Pranjal Verma</title>
    <description>The latest articles on DEV Community by Pranjal Verma (@pranshu_f4d1d7da207e944a1).</description>
    <link>https://dev.to/pranshu_f4d1d7da207e944a1</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%2F4048253%2F1b2c8489-9e5a-45c9-bb18-c7121b72559b.png</url>
      <title>DEV Community: Pranjal Verma</title>
      <link>https://dev.to/pranshu_f4d1d7da207e944a1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pranshu_f4d1d7da207e944a1"/>
    <language>en</language>
    <item>
      <title>From a Payment Timeout to the Root Cause: Building SentinelOps with SigNoz and OpenTelemetry</title>
      <dc:creator>Pranjal Verma</dc:creator>
      <pubDate>Sun, 26 Jul 2026 18:01:30 +0000</pubDate>
      <link>https://dev.to/pranshu_f4d1d7da207e944a1/from-a-payment-timeout-to-the-root-cause-building-sentinelops-with-signoz-and-opentelemetry-gge</link>
      <guid>https://dev.to/pranshu_f4d1d7da207e944a1/from-a-payment-timeout-to-the-root-cause-building-sentinelops-with-signoz-and-opentelemetry-gge</guid>
      <description>&lt;p&gt;Modern applications rarely fail in one obvious place. A request may enter through one service, communicate with several others, and finally fail because one downstream dependency became slow or returned an error.&lt;/p&gt;

&lt;p&gt;During the SigNoz hackathon, we wanted to explore a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can we go beyond monitoring failures and build a system that automatically turns observability data into actionable incidents?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That idea became &lt;strong&gt;SentinelOps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;SentinelOps is an intelligent observability and incident-response platform built on top of SigNoz. It uses OpenTelemetry to collect telemetry from distributed services, SigNoz to observe and query that telemetry, a rule engine to detect abnormal behavior, and SigNoz MCP for AI-assisted incident investigation.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem We Wanted to Solve
&lt;/h2&gt;

&lt;p&gt;Imagine an order request failing with a &lt;code&gt;504 Gateway Timeout&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Knowing that the request failed is useful, but as a developer, the questions that follow are more important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which service caused the failure?&lt;/li&gt;
&lt;li&gt;Was it an application error or a latency problem?&lt;/li&gt;
&lt;li&gt;Which downstream call became slow?&lt;/li&gt;
&lt;li&gt;What logs were generated around the failure?&lt;/li&gt;
&lt;li&gt;Are similar failures happening repeatedly?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Normally, answering these questions means jumping between logs, traces, metrics, dashboards, and alerts.&lt;/p&gt;

&lt;p&gt;We wanted SentinelOps to connect these pieces into one incident workflow.&lt;/p&gt;




&lt;h1&gt;
  
  
  Our Architecture
&lt;/h1&gt;

&lt;p&gt;For the demo environment, we created four Python/FastAPI microservices:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Auth Service
     │
     ▼
Order Service ─────► Product Service
     │
     ▼
Payment Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each service has a different responsibility:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auth Service&lt;/strong&gt; — authentication and JWT validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product Service&lt;/strong&gt; — product and inventory information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order Service&lt;/strong&gt; — orchestrates the complete order workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Service&lt;/strong&gt; — processes payments and simulates failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The services are instrumented using &lt;strong&gt;OpenTelemetry&lt;/strong&gt; and export telemetry to SigNoz.&lt;/p&gt;

&lt;p&gt;On top of them, SentinelOps has a &lt;strong&gt;Node.js/Express backend&lt;/strong&gt; responsible for querying observability data, evaluating monitoring rules, managing incidents, and providing data to the frontend.&lt;/p&gt;

&lt;p&gt;MongoDB stores rules, incidents, configuration, and analysis results.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overall flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    SentinelOps Dashboard
                             │
                             ▼
                    Node.js / Express
                       Backend + Rules
                         │         │
                         ▼         ▼
                      MongoDB    SigNoz
                                   ▲
                                   │ OTLP
              ┌────────────────────┼────────────────────┐
              │                    │                    │
           Auth                Product              Order
                                                     │
                                                     ▼
                                                  Payment
&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%2Fbau1g0me71veq4pytkin.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%2Fbau1g0me71veq4pytkin.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Instrumenting Our Services with OpenTelemetry
&lt;/h1&gt;

&lt;p&gt;Our first major task was getting telemetry from the Python services into SigNoz.&lt;/p&gt;

&lt;p&gt;We configured each service with OpenTelemetry environment variables.&lt;/p&gt;

&lt;p&gt;For example:&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;export &lt;/span&gt;&lt;span class="nv"&gt;OTEL_RESOURCE_ATTRIBUTES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"service.name=auth-service,deployment.environment=hackathon"&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://&amp;lt;SIGNOZ_HOST&amp;gt;:4318"&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OTEL_EXPORTER_OTLP_PROTOCOL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http/protobuf"&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OTEL_TRACES_EXPORTER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"otlp"&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OTEL_LOGS_EXPORTER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"otlp"&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OTEL_METRICS_EXPORTER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"otlp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The applications were then started through OpenTelemetry instrumentation.&lt;/p&gt;

&lt;p&gt;For FastAPI/Uvicorn, this looked like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opentelemetry-instrument uvicorn main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We repeated the setup for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;auth-service
product-service
order-service
payment-service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gave SigNoz visibility across the complete request chain.&lt;/p&gt;




&lt;h1&gt;
  
  
  Our First Problem: Nothing Was Reaching SigNoz
&lt;/h1&gt;

&lt;p&gt;One of the most useful parts of the hackathon was that the setup didn't work immediately.&lt;/p&gt;

&lt;p&gt;Initially, we tried reaching the OTLP HTTP receiver:&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;--connect-timeout&lt;/span&gt; 5 &lt;span class="nt"&gt;-v&lt;/span&gt; http://&amp;lt;SIGNOZ_HOST&amp;gt;:4318/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of connecting, we received:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;connect to &amp;lt;SIGNOZ_HOST&amp;gt; port 4318 failed:
Connection timed out

curl: (28) Connection timeout after 5001 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our application configuration was correct, but the OpenTelemetry receiver wasn't externally reachable.&lt;/p&gt;

&lt;p&gt;After allowing access to port &lt;strong&gt;4318&lt;/strong&gt;, we tested again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connected to &amp;lt;SIGNOZ_HOST&amp;gt; port 4318

HTTP/1.1 404 Not Found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first, a &lt;code&gt;404&lt;/code&gt; might look like another error.&lt;/p&gt;

&lt;p&gt;In this case, however, it was actually good news.&lt;/p&gt;

&lt;p&gt;We were making a normal &lt;code&gt;GET /&lt;/code&gt; request against an OTLP receiver, so we didn't expect a web page there. The important part was that the TCP connection succeeded.&lt;/p&gt;

&lt;p&gt;Once the instrumented applications started sending actual OTLP requests, telemetry began appearing in SigNoz.&lt;/p&gt;

&lt;p&gt;This debugging experience reinforced something important: &lt;strong&gt;observability infrastructure itself needs to be debugged systematically.&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%2F2jxkiqpwmpwtxm9wm198.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%2F2jxkiqpwmpwtxm9wm198.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Creating a Real Distributed Trace
&lt;/h1&gt;

&lt;p&gt;Once telemetry started flowing, we tested the complete application.&lt;/p&gt;

&lt;p&gt;A normal order request follows approximately this path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /orders
      │
      ├── GET /validate
      │      └── Auth Service
      │
      ├── GET /products/{id}
      │      └── Product Service
      │
      └── POST /pay
             └── Payment Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SigNoz allowed us to see this entire request as a distributed trace rather than four disconnected API calls.&lt;/p&gt;

&lt;p&gt;That immediately made the relationship between services much easier to understand.&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%2Fr5c4dwa1xfkqcsl19ng8.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%2Fr5c4dwa1xfkqcsl19ng8.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Intentionally Breaking the Application
&lt;/h1&gt;

&lt;p&gt;A monitoring demo isn't very interesting if everything stays healthy.&lt;/p&gt;

&lt;p&gt;So we designed the Payment Service with multiple simulation modes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;normal
slow
fail
timeout
random
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A normal payment returns immediately.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;slow&lt;/code&gt; mode intentionally waits:&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="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="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;fail&lt;/code&gt; mode generates an HTTP 500 error.&lt;/p&gt;

&lt;p&gt;The most interesting scenario was &lt;code&gt;timeout&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The Payment Service waits for &lt;strong&gt;15 seconds&lt;/strong&gt;, while the Order Service only waits &lt;strong&gt;10 seconds&lt;/strong&gt; for the response.&lt;/p&gt;

&lt;p&gt;That creates a realistic downstream timeout.&lt;/p&gt;

&lt;p&gt;From the user's perspective, the order fails.&lt;/p&gt;

&lt;p&gt;From an observability perspective, however, something much more interesting happens.&lt;/p&gt;




&lt;h1&gt;
  
  
  Following a Timeout Through SigNoz
&lt;/h1&gt;

&lt;p&gt;When we triggered the timeout scenario, SigNoz showed the Order Service request taking roughly &lt;strong&gt;10 seconds&lt;/strong&gt; before returning a &lt;code&gt;504&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The trace made the cause immediately visible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order Service
POST /orders
      │
      └── Payment Service
          POST /pay
          ~15 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of simply knowing that &lt;code&gt;POST /orders&lt;/code&gt; failed, we could see that the Order Service was waiting for the Payment Service.&lt;/p&gt;

&lt;p&gt;The trace contained the HTTP spans and exception information surrounding the timeout.&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%2F9cd03s0hfpvrd4sb3ycj.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%2F9cd03s0hfpvrd4sb3ycj.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also tested explicit payment failures.&lt;/p&gt;

&lt;p&gt;Those produced traces where the Order Service returned an error while the Payment Service showed the downstream 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%2Fneefk053i5kmkp42k2d4.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%2Fneefk053i5kmkp42k2d4.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was where distributed tracing became particularly valuable to us. The error appeared at one API boundary, but the actual cause originated deeper inside the request chain.&lt;/p&gt;




&lt;h1&gt;
  
  
  Correlating Logs with Traces
&lt;/h1&gt;

&lt;p&gt;Traces tell us &lt;strong&gt;where&lt;/strong&gt; a request spent its time.&lt;/p&gt;

&lt;p&gt;Logs help explain &lt;strong&gt;what the application was doing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We added structured application logging to the Payment Service.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment request received
Payment successful
Slow payment detected
Payment failed
Simulating payment timeout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These logs were exported into SigNoz as well.&lt;/p&gt;

&lt;p&gt;When testing different scenarios, we could see entries such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment request received | mode=normal
Payment successful

Payment request received | mode=slow
Slow payment detected

Payment request received | mode=fail
Payment failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we weren't looking at traces and logs as separate debugging systems. They represented different views of the same application behavior.&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%2F7404k1yj76wtk13e26r0.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%2F7404k1yj76wtk13e26r0.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Metrics and Service Health
&lt;/h1&gt;

&lt;p&gt;OpenTelemetry instrumentation also gave us HTTP metrics.&lt;/p&gt;

&lt;p&gt;Inside SigNoz we could inspect metrics such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http.server.duration
http.client.duration
http.server.active_requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The APM view provided an even clearer picture.&lt;/p&gt;

&lt;p&gt;During normal requests, latency remained low and error rates stayed around zero.&lt;/p&gt;

&lt;p&gt;After triggering slow and timeout scenarios, latency increased sharply and the error percentage changed accordingly.&lt;/p&gt;

&lt;p&gt;This allowed us to move from investigating individual requests to understanding the overall health of a 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%2F8bic5gyl3om179zlo1va.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%2F8bic5gyl3om179zlo1va.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Detecting Problems with Alerts
&lt;/h1&gt;

&lt;p&gt;The next step was making the system react automatically.&lt;/p&gt;

&lt;p&gt;We experimented with both &lt;strong&gt;log-based and trace-based alerts&lt;/strong&gt; in SigNoz.&lt;/p&gt;

&lt;p&gt;For example, a log-based rule can monitor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service.name = 'payment-service'
AND
severity_text = 'ERROR'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows failures from the Payment Service to trigger an alert instead of requiring someone to continuously watch the Logs Explorer.&lt;/p&gt;

&lt;p&gt;We also created trace-based conditions for abnormal latency.&lt;/p&gt;

&lt;p&gt;For example, if a relevant request crosses a latency threshold, the system can identify it as a critical condition.&lt;/p&gt;

&lt;p&gt;This is where the project started moving from observability toward incident response.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building SentinelOps on Top of SigNoz
&lt;/h1&gt;

&lt;p&gt;We didn't want to rebuild an observability platform.&lt;/p&gt;

&lt;p&gt;SigNoz already handles telemetry collection, storage, querying, visualization, tracing, metrics, logs, and alerts.&lt;/p&gt;

&lt;p&gt;Instead, SentinelOps adds an &lt;strong&gt;automation and incident-management layer&lt;/strong&gt; on top.&lt;/p&gt;

&lt;p&gt;Our Node.js/Express backend communicates with SigNoz and provides normalized data to the SentinelOps frontend.&lt;/p&gt;

&lt;p&gt;The rule engine evaluates configured conditions periodically.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SigNoz telemetry
       │
       ▼
SentinelOps Rule Engine
       │
       ├── Healthy → continue monitoring
       │
       └── Threshold breached
                 │
                 ▼
             Incident
                 │
                 ▼
          Investigation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An incident can contain information such as the affected service, severity, detected condition, timestamp, telemetry evidence, status, and root-cause analysis.&lt;/p&gt;

&lt;p&gt;The frontend then allows users to &lt;strong&gt;acknowledge, investigate, and resolve&lt;/strong&gt; those incidents.&lt;/p&gt;




&lt;h1&gt;
  
  
  Using SigNoz MCP for Root-Cause Investigation
&lt;/h1&gt;

&lt;p&gt;One of the most interesting parts of SentinelOps is the integration with the &lt;strong&gt;SigNoz MCP server&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Detecting that something went wrong is only the beginning.&lt;/p&gt;

&lt;p&gt;Once an incident exists, we want the system to investigate the telemetry surrounding it.&lt;/p&gt;

&lt;p&gt;Instead of manually inspecting several screens, SentinelOps can use SigNoz MCP as the observability interface for an AI-assisted investigation.&lt;/p&gt;

&lt;p&gt;The workflow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Incident detected
       ↓
Identify service + incident time
       ↓
Query relevant SigNoz telemetry
       ↓
Inspect metrics + traces + logs
       ↓
Correlate evidence
       ↓
Generate root-cause analysis
       ↓
Attach analysis to incident
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For our timeout scenario, for example, the investigation should be able to connect the high Order Service latency with the slow downstream Payment Service request and the corresponding timeout/error evidence.&lt;/p&gt;

&lt;p&gt;This allows AI to work with &lt;strong&gt;real observability context&lt;/strong&gt; rather than guessing from a single error message.&lt;/p&gt;




&lt;h1&gt;
  
  
  Making the Environment Reproducible
&lt;/h1&gt;

&lt;p&gt;We also containerized the project using Docker Compose.&lt;/p&gt;

&lt;p&gt;Instead of manually launching every service in a different terminal, the complete demo environment can be started together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The environment contains our application services, SentinelOps backend, frontend dependencies, and MongoDB, while the instrumented services export telemetry to the configured SigNoz instance.&lt;/p&gt;

&lt;p&gt;This makes it significantly easier for another developer—or a hackathon judge—to reproduce the application behavior.&lt;/p&gt;




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

&lt;p&gt;The biggest lesson from building SentinelOps was that &lt;strong&gt;collecting telemetry is only the first step&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Metrics are excellent for recognizing that system behavior has changed.&lt;/p&gt;

&lt;p&gt;Traces show how a request moved through distributed services.&lt;/p&gt;

&lt;p&gt;Logs provide detailed application context.&lt;/p&gt;

&lt;p&gt;Alerts help ensure that important conditions aren't missed.&lt;/p&gt;

&lt;p&gt;But the real value appears when these signals are connected.&lt;/p&gt;

&lt;p&gt;Our Payment Service timeout demonstrated this clearly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Metric:
Latency increased

Trace:
Order → Payment became slow

Log:
Payment timeout simulation occurred

Alert:
Abnormal condition detected

SentinelOps:
Incident created and investigated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of treating observability as a collection of dashboards, SentinelOps treats telemetry as evidence that can drive an incident-response workflow.&lt;/p&gt;




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

&lt;p&gt;Building SentinelOps gave us practical experience with &lt;strong&gt;OpenTelemetry instrumentation, distributed tracing, metrics, centralized logging, alerting, Dockerized microservices, and SigNoz&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;More importantly, it changed how we thought about observability.&lt;/p&gt;

&lt;p&gt;The goal isn't simply to collect more data.&lt;/p&gt;

&lt;p&gt;The goal is to make that data useful when something actually breaks.&lt;/p&gt;

&lt;p&gt;With SigNoz providing the observability foundation and SentinelOps adding automated detection, incident management, and AI-assisted investigation, we're working toward a workflow where developers can move from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Something is broken."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"This service is failing, this downstream operation caused it, and here is the telemetry evidence."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;much faster.&lt;/p&gt;

&lt;p&gt;That's what we built &lt;strong&gt;SentinelOps&lt;/strong&gt; to do.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
