DEV Community

Alex Spinov
Alex Spinov

Posted on

OpenTelemetry Has a Free API: Unified Observability for Traces, Metrics, and Logs

Why OpenTelemetry

OpenTelemetry (OTel) is the CNCF standard for observability. One SDK for traces, metrics, and logs — send to Jaeger, Prometheus, Grafana, Datadog, or any backend. No vendor lock-in.

Install SDK (Node.js)

npm install @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-http
Enter fullscreen mode Exit fullscreen mode

Auto-Instrumentation

import { NodeSDK } from '@opentelemetry/sdk-node';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';

const sdk = new NodeSDK({
  traceExporter: new OTLPTraceExporter({
    url: 'http://localhost:4318/v1/traces',
  }),
  instrumentations: [getNodeAutoInstrumentations()],
});

sdk.start();
Enter fullscreen mode Exit fullscreen mode

Express, HTTP, database calls — all automatically traced.

Custom Spans

import { trace } from '@opentelemetry/api';

const tracer = trace.getTracer('my-service');

async function processOrder(orderId: string) {
  return tracer.startActiveSpan('process-order', async (span) => {
    span.setAttribute('order.id', orderId);

    await validateOrder(orderId);
    await chargePayment(orderId);
    await sendConfirmation(orderId);

    span.setStatus({ code: SpanStatusCode.OK });
    span.end();
  });
}
Enter fullscreen mode Exit fullscreen mode

Metrics

import { metrics } from '@opentelemetry/api';

const meter = metrics.getMeter('my-service');
const requestCounter = meter.createCounter('http.requests');
const latencyHistogram = meter.createHistogram('http.latency');

app.use((req, res, next) => {
  const start = Date.now();
  res.on('finish', () => {
    requestCounter.add(1, { method: req.method, status: res.statusCode });
    latencyHistogram.record(Date.now() - start, { endpoint: req.path });
  });
  next();
});
Enter fullscreen mode Exit fullscreen mode

OTel Collector

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
    timeout: 5s

exporters:
  prometheus:
    endpoint: 0.0.0.0:8889
  otlp/jaeger:
    endpoint: jaeger:4317

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp/jaeger]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [prometheus]
Enter fullscreen mode Exit fullscreen mode

Key Features

  • Unified — traces, metrics, logs in one SDK
  • Vendor neutral — export to any backend
  • Auto-instrumentation — HTTP, DB, gRPC, messaging
  • Collector — receive, process, export telemetry
  • CNCF Incubating — industry standard

Resources


Need to extract observability data, trace metrics, or monitoring configs? Check out my Apify tools or email spinov001@gmail.com for custom solutions.

Top comments (0)