<?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: shahnoor mahesar</title>
    <description>The latest articles on DEV Community by shahnoor mahesar (@shahnoor_mahesar).</description>
    <link>https://dev.to/shahnoor_mahesar</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%2F4035834%2F9e38eba7-e760-4276-b1dd-48144ff4fc97.jpg</url>
      <title>DEV Community: shahnoor mahesar</title>
      <link>https://dev.to/shahnoor_mahesar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shahnoor_mahesar"/>
    <language>en</language>
    <item>
      <title>Don't Wait for Users to Report Outages: Build a Real-Time Alerting Pipeline with SigNoz</title>
      <dc:creator>shahnoor mahesar</dc:creator>
      <pubDate>Sat, 18 Jul 2026 22:53:27 +0000</pubDate>
      <link>https://dev.to/shahnoor_mahesar/dont-wait-for-users-to-report-outages-build-a-real-time-alerting-pipeline-with-signoz-8bm</link>
      <guid>https://dev.to/shahnoor_mahesar/dont-wait-for-users-to-report-outages-build-a-real-time-alerting-pipeline-with-signoz-8bm</guid>
      <description>&lt;p&gt;Your service is broken. Somewhere inside a chain of &lt;strong&gt;12 microservices&lt;/strong&gt;, one call failed silently. Your users see a blank screen. You have no idea where to start looking.&lt;/p&gt;

&lt;p&gt;This is exactly what happened when I set up the &lt;strong&gt;OpenTelemetry Astronomy Shop demo&lt;/strong&gt; and intentionally introduced a cascading failure into it. This is also how I learned to use &lt;a href="https://signoz.io/" rel="noopener noreferrer"&gt;SigNoz&lt;/a&gt;, an open-source, self-hostable &lt;strong&gt;APM tool&lt;/strong&gt;, to catch it in real time and fire a &lt;strong&gt;Slack alert&lt;/strong&gt; the moment things went wrong.&lt;/p&gt;

&lt;p&gt;This guide walks you through the full journey: running both stacks locally, connecting them over a shared &lt;strong&gt;Docker network&lt;/strong&gt;, exploring SigNoz's dashboards with live traffic, and setting up a proper &lt;strong&gt;metric-based alert&lt;/strong&gt; with a Slack webhook.&lt;/p&gt;

&lt;p&gt;By the end, you'll have a working local observability sandbox you can adapt for your own projects too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Engine 20.10+&lt;/strong&gt; with the &lt;strong&gt;Docker Compose v2&lt;/strong&gt; plugin installed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At least 6 GB of RAM&lt;/strong&gt; available for Docker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt; installed&lt;/li&gt;
&lt;li&gt;The following ports available on your machine:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;8080&lt;/strong&gt; (SigNoz UI)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4317&lt;/strong&gt; (OTLP gRPC ingestion)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4318&lt;/strong&gt; (OTLP HTTP ingestion)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If any of these ports are already in use, stop the conflicting service or update your Docker Compose configuration before proceeding.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;OpenTelemetry Demo&lt;/strong&gt; and &lt;strong&gt;SigNoz&lt;/strong&gt; run as separate Docker Compose stacks in different directories, keeping each project isolated and easy to manage.&lt;/p&gt;

&lt;p&gt;They communicate over a shared external Docker bridge network named &lt;strong&gt;&lt;code&gt;signoz-network&lt;/code&gt;&lt;/strong&gt;. The OpenTelemetry Collector exports telemetry directly to SigNoz using its container name, eliminating the need for &lt;code&gt;localhost&lt;/code&gt; or &lt;code&gt;host.docker.internal&lt;/code&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%2F9emhdidg3jmmj6vpjvr7.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%2F9emhdidg3jmmj6vpjvr7.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/q4u6elbbd1r4rj5d2n0v.png" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Running SigNoz Locally with Foundry
&lt;/h2&gt;

&lt;p&gt;The recommended way to install SigNoz on Docker is through &lt;strong&gt;Foundry&lt;/strong&gt;, which is SigNoz's own CLI tool that provisions and manages your self-hosted observability stack. No cloning repos, no copying YAML files manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install foundryctl&lt;/strong&gt;&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs the &lt;code&gt;foundryctl&lt;/code&gt; binary to your system. You can verify it worked with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;foundryctl version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Create a project directory and casting file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a new directory for your SigNoz setup:&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;mkdir &lt;/span&gt;signoz-local &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;signoz-local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside it, create a file named &lt;code&gt;casting.yaml&lt;/code&gt; with the following content:&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This declarative config tells Foundry to use Docker Compose as the deployment method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy SigNoz&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run the cast command:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Foundry validates your Docker setup, generates all the required Compose files into a &lt;code&gt;pours/deployment/&lt;/code&gt; folder, and starts the SigNoz containers automatically. You do not need to run &lt;code&gt;docker compose up&lt;/code&gt; yourself.&lt;/p&gt;

&lt;p&gt;Wait about 1-2 minutes for ClickHouse and the query service to finish initializing.&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%2Fnepjs885riksmsocn9uv.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%2Fnepjs885riksmsocn9uv.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/of5hamiw8d1tc2vdfvma.png" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open SigNoz and create your account&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open your browser and go to &lt;code&gt;http://localhost:8080&lt;/code&gt;. You'll see the SigNoz onboarding screen. Create your admin account and log in.&lt;/p&gt;

&lt;p&gt;Once you're in, your SigNoz instance is ready to receive telemetry data on port &lt;code&gt;4317&lt;/code&gt; (gRPC) and &lt;code&gt;4318&lt;/code&gt; (HTTP).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Running the OpenTelemetry Demo App
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/open-telemetry/opentelemetry-demo" rel="noopener noreferrer"&gt;OpenTelemetry Demo&lt;/a&gt; is a realistic microservices app, the "Astronomy Shop," built by the OpenTelemetry community. It comes pre-instrumented with OpenTelemetry SDKs across 20+ services written in Go, Java, Python, .NET, and more. It also ships with a built-in load generator (Locust) that automatically simulates user traffic, so you don't have to do anything to generate telemetry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clone the repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a separate terminal (not inside the signoz-local folder), clone and enter the demo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/open-telemetry/opentelemetry-demo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;opentelemetry-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix the port conflict before starting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both SigNoz and the OTel Demo want port &lt;code&gt;8080&lt;/code&gt;. SigNoz uses it for its web UI. The OTel Demo's Envoy front-end proxy also binds to &lt;code&gt;8080&lt;/code&gt; by default. If you start both without changing anything, the second one to start will fail with a port allocation error.&lt;/p&gt;

&lt;p&gt;The fix is to move the OTel Demo off port &lt;code&gt;8080&lt;/code&gt;. Open the &lt;code&gt;.env&lt;/code&gt; file in the root of &lt;code&gt;opentelemetry-demo/&lt;/code&gt; and change these two lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Before
FRONTEND_PORT=8080
ENVOY_PORT=8080

# After
FRONTEND_PORT=3000
ENVOY_PORT=3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the Astronomy Shop will run on &lt;code&gt;http://localhost:3000&lt;/code&gt; and SigNoz stays on &lt;code&gt;http://localhost:8080&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect the OTel Demo to SigNoz via a shared network&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The OTel Demo's collector needs to send traces and metrics to SigNoz. Since they run in separate Docker Compose stacks, the containers don't share a network by default. Using &lt;code&gt;host.docker.internal&lt;/code&gt; is fragile and inconsistent across environments. The clean solution is to join the OTel Demo's collector to SigNoz's existing Docker bridge network.&lt;/p&gt;

&lt;p&gt;Open &lt;code&gt;compose.yaml&lt;/code&gt; in &lt;code&gt;opentelemetry-demo/&lt;/code&gt;. The &lt;code&gt;networks:&lt;/code&gt; block already exists at the top of the file. You only need to add the &lt;code&gt;signoz-network&lt;/code&gt; entry to it:&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;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&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;opentelemetry-demo&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
  &lt;span class="c1"&gt;# Add this block to join the SigNoz Docker network&lt;/span&gt;
  &lt;span class="na"&gt;signoz-network&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-network&lt;/span&gt;
    &lt;span class="na"&gt;external&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;Then, find the &lt;code&gt;otel-collector&lt;/code&gt; service definition in the same file and attach it to both networks:&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;otel-collector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;signoz-network&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Point the OTel Collector exporter to SigNoz&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open &lt;code&gt;src/otel-collector/otelcol-config-extras.yml&lt;/code&gt;. This file overrides the default collector config. Add the OTLP exporter pointing to SigNoz by its internal container name:&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;exporters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;otlp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;signoz-otel-collector:4317"&lt;/span&gt;
    &lt;span class="na"&gt;tls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;insecure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pipelines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;traces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exporters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;spanmetrics&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;otlp&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exporters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;otlp&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;logs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exporters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;otlp&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The exact container name for the SigNoz collector may vary. Check the names of running SigNoz containers with &lt;code&gt;docker ps&lt;/code&gt; to confirm. Look for a container with &lt;code&gt;collector&lt;/code&gt; or &lt;code&gt;ingester&lt;/code&gt; in its name.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Start the OTel Demo&lt;/strong&gt;&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;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All services will start. The built-in Locust load generator starts automatically and begins sending simulated traffic to the store. Open &lt;code&gt;http://localhost:3000&lt;/code&gt; to see the Astronomy Shop running.&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%2Fyyr1p2skco77xhpvvwhi.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%2Fyyr1p2skco77xhpvvwhi.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/2xl0hrirjq5m0j3cja9p.png" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Exploring SigNoz with Live Traffic
&lt;/h2&gt;

&lt;p&gt;Within a minute of the OTel Demo starting, telemetry data will begin flowing into SigNoz. Let's see what we have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Services Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open SigNoz at &lt;code&gt;http://localhost:8080&lt;/code&gt; and click on &lt;strong&gt;Services&lt;/strong&gt; in the left sidebar. You will see every instrumented service from the Astronomy Shop listed here, each showing its live error rate, latency (P50/P99), and request throughput.&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%2Fhtqbed9tza3a2spvoujt.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%2Fhtqbed9tza3a2spvoujt.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/ssyd6jhw5ereyozsvemi.png" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traces Explorer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;strong&gt;Traces&lt;/strong&gt; in the sidebar. SigNoz shows you every distributed trace passing through the system. Click on any individual trace to open the flamegraph, a detailed waterfall chart showing how long each service call took and where latency or errors occurred.&lt;/p&gt;

&lt;p&gt;This is where SigNoz really shines. Instead of reading logs line by line, you can visually see the entire request lifecycle from the frontend all the way down to the database layer.&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%2Fscbbiwpq17oisbmi5osa.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%2Fscbbiwpq17oisbmi5osa.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/pkknbb98dnj2804fc6kb.png" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking into any trace opens the full flamegraph, showing every service call, its duration, and the exact span attributes collected by OpenTelemetry. You can see the complete request chain from the frontend down to the individual database calls in one view.&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%2F7ksp6h9nqd5muqi2lqth.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%2F7ksp6h9nqd5muqi2lqth.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/hpyqcndlhl0ugtlv4q8g.png" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Simulating a Cascading Failure
&lt;/h2&gt;

&lt;p&gt;Watching everything work normally is satisfying, but observability earns its value when things break. The OTel Demo has a built-in feature flag system for exactly this purpose.&lt;/p&gt;

&lt;p&gt;Open &lt;code&gt;http://localhost:3000/feature&lt;/code&gt; in your browser. You'll see a list of flags you can toggle to inject failures. Turn on &lt;strong&gt;&lt;code&gt;productCatalogFailure&lt;/code&gt;&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%2Fg2qtdc420et5yhtu61bl.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%2Fg2qtdc420et5yhtu61bl.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/yqwjgowi03t0b49qyh9d.png" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens and why it's interesting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go back to SigNoz and open the &lt;strong&gt;Traces&lt;/strong&gt; tab. Filter by &lt;code&gt;error.type = '500'&lt;/code&gt; and you will immediately see which API endpoints are failing. In this case, &lt;code&gt;GET /api/recommendations&lt;/code&gt; and &lt;code&gt;GET /api/products/[productId]/index&lt;/code&gt; are both returning &lt;strong&gt;500 responses&lt;/strong&gt; from the &lt;code&gt;frontend&lt;/code&gt; service.&lt;/p&gt;

&lt;p&gt;This is where SigNoz goes beyond basic log monitoring. Click into any of these failing traces and the flamegraph shows you exactly why the 500 happened: the frontend's API handler called &lt;code&gt;oteldemo.ProductCatalogService/GetProduct&lt;/code&gt; internally, and that gRPC call threw an error with the message &lt;code&gt;Error: Product Catalog Fail Feature Flag Enabled&lt;/code&gt;. One broken downstream service caused two different API endpoints to fail simultaneously.&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%2Fr1lzb3murffw2sl3vejl.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%2Fr1lzb3murffw2sl3vejl.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/10a1n1lp1vmapvhpt3id.png" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cascade&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because Recommendation Service depends on Product Catalog to fetch product data, it starts failing too. In the error rate chart on the Services dashboard, you'll see multiple services' error rates climb together. A textbook cascading dependency failure, captured and visualized automatically by SigNoz without writing a single additional line of code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Setting Up Slack Alerts
&lt;/h2&gt;

&lt;p&gt;Watching dashboards is not a sustainable on-call strategy. Let's configure SigNoz to automatically alert you in Slack when the error rate crosses a threshold.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Slack Incoming Webhook&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Slack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Your workspace&lt;/strong&gt; &amp;gt; &lt;strong&gt;Apps&lt;/strong&gt; &amp;gt; search for &lt;strong&gt;Incoming Webhooks&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add to Slack&lt;/strong&gt; and choose a channel (e.g. &lt;code&gt;#alerts&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Copy the generated Webhook URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Add the Slack channel in SigNoz&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In SigNoz, go to &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Alert Channels&lt;/strong&gt; &amp;gt; &lt;strong&gt;New Alert Channel&lt;/strong&gt;. Select &lt;strong&gt;Slack&lt;/strong&gt;, paste the webhook URL, name the channel, and save.&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%2Ffhzhigva1i55u2mswegu.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%2Ffhzhigva1i55u2mswegu.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/n06bi9kn9diwbvrcv0lr.png" width="799" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Test the connection using the "Test" button to confirm a message arrives in your Slack channel.&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%2Fayqwfog4gh5kk8e3uu49.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%2Fayqwfog4gh5kk8e3uu49.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/jd1erq30rjx86po22gas.png" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a metric-based alert rule&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;Alerts&lt;/strong&gt; &amp;gt; &lt;strong&gt;Alert Rules&lt;/strong&gt; &amp;gt; &lt;strong&gt;New Alert Rule&lt;/strong&gt; &amp;gt; &lt;strong&gt;Metric based Alert&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Configure the query as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Metric&lt;/strong&gt;: &lt;code&gt;signoz_calls_total&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter&lt;/strong&gt;: &lt;code&gt;service.name = 'frontend' AND status.code = 'STATUS_CODE_ERROR'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggregate within time series&lt;/strong&gt;: &lt;code&gt;Rate&lt;/code&gt;, every &lt;code&gt;60 Seconds&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggregate across time series&lt;/strong&gt;: &lt;code&gt;Sum&lt;/code&gt;, grouped &lt;strong&gt;by&lt;/strong&gt; &lt;code&gt;service.name&lt;/code&gt; and &lt;code&gt;operation&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grouping by &lt;code&gt;service.name&lt;/code&gt; and &lt;code&gt;operation&lt;/code&gt; is critical. Without it, SigNoz collapses all the data into a single number and drops the label context, which means your alert message will show up with blank service and endpoint fields.&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%2Fj47e6pusk69r314x32kg.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%2Fj47e6pusk69r314x32kg.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/q0lk3qj1f5wlyqp5ht74.png" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set up the query as shown in the screenshot below:&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%2F8oq9tyad49484r4hwo0s.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%2F8oq9tyad49484r4hwo0s.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/m13junzb3j9eqzigl072.png" width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set the alert condition&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Scroll down to &lt;strong&gt;Set Alert Conditions&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Condition: &lt;strong&gt;Above (&amp;gt;)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Threshold: &lt;code&gt;0.1&lt;/code&gt; (requests/sec)&lt;/li&gt;
&lt;li&gt;Evaluation window: &lt;strong&gt;Last 5 minutes&lt;/strong&gt;, &lt;strong&gt;Rolling&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Send to: select your Slack channel&lt;/li&gt;
&lt;/ul&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%2Fyxqr33c9w24ae4ayf6sk.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%2Fyxqr33c9w24ae4ayf6sk.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/ajqadzookhujvnimm477.png" width="800" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customize the alert message&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Scroll down to &lt;strong&gt;Add Details&lt;/strong&gt;. Give the rule a name (e.g. &lt;code&gt;Frontend Endpoint Error Spike&lt;/code&gt;) and paste this into the Description field to get a clean, readable Slack notification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔴 *Severity:* {{ $labels.severity }}
📦 *Service:* `{{ $labels.service_name }}`
⚡ *Endpoint:* `{{ $labels.operation }}`
📈 *Current Error Rate:* `{{ $value }} req/s` (Threshold: `{{ $threshold }} req/s`)

The error rate has exceeded the alert threshold. Review active traces in SigNoz to identify the root cause.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the rule. Within 1-2 minutes of &lt;code&gt;productCatalogFailure&lt;/code&gt; being enabled, the error rate on the frontend crosses &lt;code&gt;0.1 req/s&lt;/code&gt;, and a fully populated alert fires into your Slack channel.&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%2Fmsmsrw9ul769obaqa0bd.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%2Fmsmsrw9ul769obaqa0bd.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/wu1stp0o1zj34itym533.png" width="799" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alerts are being fired for the error spikes:&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%2Fl4xkdlnw9ko3y7iv33sa.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%2Fl4xkdlnw9ko3y7iv33sa.png" alt="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/qhvi9hzfuti5vtwuiz7q.png" width="799" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;What we built here: decoupled stacks, shared Docker networking, trace-level failure investigation, and a Slack-integrated alert rule. This is how real production observability setups work, just on a laptop. The tools are open source, self-hostable, and free to try.&lt;/p&gt;

&lt;p&gt;If you want to go further, SigNoz also has anomaly detection alerts, SLO/SLA tracking, and infrastructure metrics dashboards. Start with the &lt;a href="https://signoz.io/docs/" rel="noopener noreferrer"&gt;SigNoz docs&lt;/a&gt; and the &lt;a href="https://github.com/open-telemetry/opentelemetry-demo" rel="noopener noreferrer"&gt;OpenTelemetry Demo repo&lt;/a&gt; if you want to explore from here.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>learning</category>
      <category>signoz</category>
      <category>opentelemetry</category>
    </item>
  </channel>
</rss>
