Docs · SDK · Node.js

Node SDK.

@coderadar/sdk. ESM + CJS dual build. Auto-instruments Express, Hono, Next.js, Fastify, Koa. Tested on Node 20, 22, 24.

Install

pnpm add @coderadar/sdk
# package.json
"@coderadar/sdk": "^0.4"

Init

import { init } from "@coderadar/sdk";

init({
  dsn:              process.env.CODERADAR_DSN,
  project:          "truecom",
  environment:      process.env.NODE_ENV,
  release:          process.env.RELEASE_SHA,
  sampleRate:       1.0,        // errors — keep at 1.0
  tracesSampleRate: 0.2,        // 20% of traces
  debug:            false,      // SDK self-logging to stderr
  beforeSend:       (ev) => ev, // optional event mutator
});

Init options

OptionDefaultNotes
dsnRequired. Falls back to CODERADAR_DSN.
projectProject slug. Required if not in DSN.
environment"production"Free-form. Convention: dev / staging / production / preview-*.
releaseSHA or semver. Used for grouping + regression detection.
sampleRate1.0Errors. Keep at 1.0 unless you really need to drop.
tracesSampleRate0.00 = no traces. 1.0 = every trace.
debugfalseSDK self-logging.
beforeSendMutator. Return null to drop. Strip PII here.
integrationsautoOverride the auto-instrumentation list.
maxBreadcrumbs100Per-event buffer.
tagsDefault tags applied to every event.

Express

import express from "express";
import { errorHandler, requestHandler } from "@coderadar/sdk/express";

const app = express();
app.use(requestHandler()); // adds trace context, user context
// ... your routes
app.use(errorHandler());   // captures unhandled errors

Hono

import { Hono } from "hono";
import { honoMiddleware } from "@coderadar/sdk/hono";

const app = new Hono();
app.use("*", honoMiddleware({ project: "relayone" }));

Next.js (App Router)

// instrumentation.ts
export async function register() {
  if (process.env.NEXT_RUNTIME === "nodejs") {
    const { init } = await import("@coderadar/sdk");
    init({
      dsn:     process.env.CODERADAR_DSN,
      project: "truecom",
      release: process.env.VERCEL_GIT_COMMIT_SHA,
    });
  }
  if (process.env.NEXT_RUNTIME === "edge") {
    // edge-runtime build is leaner; only error capture, no traces
    const { initEdge } = await import("@coderadar/sdk/edge");
    initEdge({ dsn: process.env.CODERADAR_DSN, project: "truecom" });
  }
}

// app/global-error.tsx
"use client";
import { captureException } from "@coderadar/sdk";
export default function GlobalError({ error }) {
  captureException(error);
  return <html>...</html>;
}

Manual capture

import {
  captureException, captureMessage,
  setUser, setTag, addBreadcrumb,
  withScope,
} from "@coderadar/sdk";

setUser({ id: user.id, segment: user.tier });
setTag("region", "us-central1");
addBreadcrumb({ category: "checkout", message: "opened cart" });

try {
  await finalizeCheckout(cart);
} catch (err) {
  captureException(err, { tags: { stage: "checkout" } });
  throw err;
}

withScope((scope) => {
  scope.setTag("cron_job", "drift_scan");
  captureMessage("Drift scan started", "info");
});

Pino / Winston transports

import pino from "pino";
import { pinoTransport } from "@coderadar/sdk/transports";

const logger = pino({
  transport: { target: pinoTransport, options: { level: "error" } },
});

Buffering and shutdown

The SDK buffers events in memory (1 MB by default) and flushes every 5 seconds or when the buffer fills. On graceful shutdown, call await flush(2000) with a timeout in milliseconds. close() is the synchronous variant; use it inside process.on("beforeExit") when you can't await.

Sampling

Errors default to sampleRate: 1.0 — capture everything. Traces default to tracesSampleRate: 0.0; set it explicitly. Adaptive sampling kicks in if the project is over its quota; the SDK respects the server's X-CodeRadar-Sample-Rate response header.

PII scrubbing

The default beforeSend strips fields named authorization, cookie, password, token, api_key, creditCard. Override or extend by passing your own beforeSend in the init options.