Back to Blog
When Your Observability Stack Becomes a Partner, Not Just a Dashboard
7 min readAug 7, 20265 views

When Your Observability Stack Becomes a Partner, Not Just a Dashboard

We've all been there: a production incident hits, and you're jumping between logging tools, metric dashboards, and distributed tracing UIs, trying to piece together what went wrong. Each tool has its own language, its own query syntax, and its own set of blind spots. It's an exhausting exercise in c

ObservabilityFull-StackToolingSoftware DesignDistributed Systems
Share

by Sunil Band

The Observability Disconnect

You've probably hit the point where your production incidents become a multi-tool scavenger hunt. Your logs are in CloudWatch, metrics in Prometheus with Grafana, and traces are… well, maybe you have Jaeger, maybe you don't. The data is there, scattered across different systems, each with its own UI and mental model. This fragmentation isn't just an annoyance; it actively hinders your ability to quickly diagnose and resolve issues. You spend more time connecting dots than understanding the root cause.

This isn't a new problem. The industry has been pushing for observability for years, emphasizing the need to understand the internal state of a system from its external outputs. Logs, metrics, and traces are the three pillars. But merely having them isn't enough; they need to work together seamlessly. That's where platforms built on open standards, like OpenTelemetry, start to shine.

Why OpenTelemetry Matters

Before we dive into SigNoz, let's talk about why OpenTelemetry (OTel) is such a game-changer. For too long, instrumentation was proprietary. If you started with Datadog, you were instrumenting for Datadog. If you switched to New Relic, you re-instrumented. This vendor lock-in was expensive, painful, and frankly, unnecessary.

OpenTelemetry solves this by providing a single set of APIs, SDKs, and data formats for generating and collecting telemetry data. This means you instrument your application once, and you can send that data to any OTel-compatible backend. It's the open standard we've needed for years, freeing us from vendor lock-in and allowing us to choose the best backend for our needs, or even switch later without re-writing all our code.

This is a critical shift in how we approach monitoring. Instead of tying your application's internals to a specific vendor, you're tying it to an open standard. It's about empowering developers, not just operators, with consistent and portable instrumentation.

Enter SigNoz: An OpenTelemetry-Native Platform

SigNoz is an open-source observability platform designed from the ground up to be OpenTelemetry-native. What does "OpenTelemetry-native" mean in practice? It means it expects and prefers OTel data. You send your OTel-formatted logs, metrics, and traces to SigNoz, and it seamlessly stitches them together into a unified view. This is a huge win for mental overhead.

Instead of a separate log explorer, metric dashboard, and tracing UI, SigNoz gives you a single pane of glass. When you're looking at a trace, you can see the logs generated by that specific span. When you see a metric spike, you can drill down into the traces and logs that occurred during that period. This integrated approach dramatically reduces the time it takes to go from a symptom to a root cause.

Getting Started with SigNoz

Let's walk through a quick example. I'm going to set up a simple Node.js application and instrument it with OpenTelemetry, then send that data to a local SigNoz instance. You'll see how straightforward it is to get meaningful telemetry.

First, you need SigNoz itself. The easiest way to get it running locally is with Docker Compose:

bash
git clone https://github.com/SigNoz/signoz.git
cd signoz/deploy/docker
sudo docker-compose up -d

This will pull down the necessary images and start SigNoz. You can then access the UI at http://localhost:3301. Give it a few minutes to fully initialize.

Next, let's create a small Node.js application and instrument it. We'll use Express to simulate a simple API.

typescript
// app.ts
import express from 'express';
import { trace, context } from '@opentelemetry/api';

const app = express();
const PORT = process.env.PORT || 3000;

app.get('/', (req, res) => {
  const currentSpan = trace.getActiveSpan(); // Get the current active span
  if (currentSpan) {
    currentSpan.setAttribute('http.request.id', 'abc-123'); // Add custom attributes to the span
    currentSpan.addEvent('Home page accessed'); // Add an event to the span
  }
  res.send('Hello from OTel-instrumented app!');
});

app.get('/slow', async (req, res) => {
  // Create a new span for a specific operation
  const slowOperationSpan = trace.getTracer('my-app-tracer').startSpan('slow-operation');
  context.with(trace.set  Span(context.active(), slowOperationSpan), async () => {
    console.log('Starting slow operation...');
    await new Promise(resolve => setTimeout(resolve, 500)); // Simulate delay
    console.log('Slow operation finished.');
    slowOperationSpan.end(); // End the span
    res.send('Slow operation complete!');
  });
});

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

Now, for the OpenTelemetry setup. This usually involves a separate entry point or an application_instrumentation.ts file that runs before your main app logic. This is where you configure your tracer, exporter, and any auto-instrumentation packages.

typescript
// instrument.ts
import { NodeSDK } from '@opentelemetry/sdk-node';
import { ConsoleSpanExporter } from '@opentelemetry/sdk-trace-node';
import { Resource } from '@opentelemetry/resources';
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto';
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';
import { LoggerProvider, SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs';
import { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';

// Optional: Set log level for OTel internal diagnostics
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);

const sdk = new NodeSDK({
  resource: new Resource({
    [SemanticResourceAttributes.SERVICE_NAME]: 'my-node-app',
    [SemanticResourceAttributes.SERVICE_VERSION]: '1.0.0',
  }),
  traceExporter: new OTLPTraceExporter({
    url: 'http://localhost:4318/v1/traces', // SigNoz OTLP HTTP endpoint for traces
  }),
  metricReader: new PeriodicExportingMetricReader({
    exporter: new OTLPMetricExporter({
      url: 'http://localhost:4318/v1/metrics', // SigNoz OTLP HTTP endpoint for metrics
    }),
    exportIntervalMillis: 5000,
  }),
  logRecordProcessor: new SimpleLogRecordProcessor(new OTLPLogExporter({
    url: 'http://localhost:4318/v1/logs', // SigNoz OTLP HTTP endpoint for logs
  })),
});

// Initialize the logger provider and register it globally
const loggerProvider = new LoggerProvider({
  resource: new Resource({
    [SemanticResourceAttributes.SERVICE_NAME]: 'my-node-app',
  }),
});
loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new OTLPLogExporter({
  url: 'http://localhost:4318/v1/logs',
})));


sdk.start();

console.log('OpenTelemetry SDK initialized and running.');

process.on('SIGTERM', () => {
  sdk.shutdown()
    .then(() => console.log('Tracing terminated'))
    .catch((error) => console.log('Error terminating tracing', error))
    .finally(() => process.exit(0));
});

You'll need to install a few packages:

bash
npm install express @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/sdk-trace-node @opentelemetry/resources @opentelemetry/semantic-conventions @opentelemetry/exporter-trace-otlp-proto @opentelemetry/sdk-metrics @opentelemetry/exporter-metrics-otlp-proto @opentelemetry/sdk-logs @opentelemetry/exporter-logs-otlp-proto

To run this, you'd typically use ts-node or compile it first. For a quick test:

bash
NODE_OPTIONS="-r ./instrument.ts" ts-node app.ts

Now, hit your endpoints: http://localhost:3000/ and http://localhost:3000/slow. Go to the SigNoz UI at http://localhost:3301, and you'll immediately see your my-node-app service appear under the 'Services' section. Navigate to 'Traces' or 'Metrics', and you'll see the data flowing in. The slow-operation span will be visible, and you can click into it to see its duration, attributes, and any associated events.

The AI Angle

SigNoz has been making strides in integrating AI capabilities, both within its cloud offering and, increasingly, in the open-source core. The idea here is not just to collect data, but to make sense of it automatically. Imagine an AI agent proactively highlighting anomalies, correlating disparate events, or even suggesting root causes based on historical data patterns. This moves observability beyond passive monitoring to active, intelligent assistance.

While the deepest AI features are often in their managed cloud offering (like the native AI teammate), the open-source project lays the groundwork for leveraging machine learning on your telemetry data. This means faster incident response and less manual toil for engineers.

Trade-offs and Considerations

No tool is a silver bullet, and SigNoz, like any observability platform, comes with its own considerations.

Resource Consumption: Running a full-featured observability platform, especially one that collects high-cardinality data like traces and logs, requires significant resources. SigNoz, particularly with its ClickHouse backend, can be memory and CPU intensive, especially at scale. You need to plan for this in your infrastructure.

Learning Curve for OpenTelemetry: While OTel is a standard, getting your head around its concepts (tracers, spans, contexts, exporters, resource attributes) does take time. The initial instrumentation phase can feel complex, especially if you're coming from a world of simple console.log statements. However, this upfront investment pays dividends in the long run due to portability.

Maturity of OpenTelemetry Ecosystem: OpenTelemetry is still evolving. While core tracing and metrics are quite stable, logging support has matured more recently. Auto-instrumentation libraries are excellent for many frameworks but might have gaps for highly custom setups. You might find yourself writing custom instrumentation more often than you'd like in niche cases.

Community and Support: As an open-source project, SigNoz relies on its community. While active, it's not the same as having dedicated enterprise support teams that commercial vendors offer. For critical production systems, evaluate your comfort level with community-driven support or consider their cloud offering.

Wrapping up

SigNoz offers a compelling solution for the fragmented observability landscape. By embracing OpenTelemetry as its native data format, it provides a unified view of your application's health, combining logs, metrics, and traces in a way that truly accelerates debugging. The shift from proprietary agents to open standards like OTel is a fundamental change, empowering developers with choice and portability.

If you're tired of context switching between disparate monitoring tools, give SigNoz a try. Clone their GitHub repo, run docker-compose up -d, and instrument a small service using OpenTelemetry. See for yourself how a truly integrated view changes your debugging workflow. It might just be the partner your observability stack needs.

More from the blog
Available for projectsReady to make something fun 🎈

Ready to build the next system?Wanna build something awesome together?

Currently accepting high-impact opportunities in frontend engineering and scalable web applications.Got a cool idea rattling around? Let's grab a virtual coffee and turn it into something people love. ☕