Your API is slow, but you cannot explain why. Your APM shows request time, but you need to break it into DNS resolution, TCP connect, TLS handshake, and downstream call durations. The diagnostics_channel module gives you this data with zero application code changes and zero overhead when nobody is listening.
Your pager goes off at 2 a.m. Postgres CPU is pegged, queries are timing out, and you have no idea where to look. Here are the eight SQL queries that should be in every production runbook, with the exact thresholds that tell you it is time to act.
Logs show one request. Traces show a path. Metrics show the shape of the whole system. Here is the prom-client setup that turns your Node.js service from a black box into a dashboard you can read at 2 a.m., with the four metric types, the Express middleware, and the PromQL queries that actually predict failures.
Stop drilling requestId and logger objects through twelve layers of function signatures. Here is how to use Node.js AsyncLocalStorage to attach context to the async chain itself, with working Express middleware, auto-enriched logging, and the three pitfalls that break context in production.
When a customer reports a 500 at 3 a.m., your logs decide whether you fix it in ten minutes or two hours. Here is the Pino + correlation-id setup that turns Node.js logs from a wall of text into a searchable timeline, with the queries that actually find bugs in production.
The "logs, metrics, traces" framework gets repeated everywhere and obscures what observability is actually about: asking new questions of your system. Here is the alternative framing, high-cardinality events, and the practical setup that gets you the actual capability.
Distributed tracing only earns its keep at 3 a.m., when one slow request is hiding in a microservice call graph. Here is the OpenTelemetry setup for Node.js that auto-instruments the boring stuff, lets you add the span attributes that matter, and connects to any backend you point it at.