Performance Monitoring

By default, Sentry error events will not get trace context unless you configure the scope with the transaction, as illustrated in the example below.

Copied
const Sentry = require("@sentry/node");
const Tracing = require("@sentry/tracing");
// Note: You MUST import the package for tracing to work

const http = require("http");

Sentry.init({
  dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
  integrations: [
    // enable HTTP calls tracing
    new Sentry.Integrations.Http({ tracing: true }),
  ],

  // We recommend adjusting this value in production, or using tracesSampler
  // for finer control
  tracesSampleRate: 1.0,
});

const transaction = Sentry.startTransaction({
  op: "transaction",
  name: "My Transaction",
});

// Note that we set the transaction as the span on the scope.
// This step makes sure that if an error happens during the lifetime of the transaction
// the transaction context will be attached to the error event
Sentry.configureScope(scope => {
  scope.setSpan(transaction);
});

let request;

try {
  // this should generate an http span
  request = http.get("http://sentry.io", res => {
    console.log(`STATUS: ${res.statusCode}`);
    console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
  });

  // this error event should have trace context
  foo();
} catch (err) {
  Sentry.captureException(err);
}

request.on("close", () => {
  transaction.finish();
});

Custom Instrumentation

To instrument a specific region of your code, you can create a transaction to capture it.

The following example creates a transaction for a part of the code that contains an expensive operation (for example, processItem), and sends the result to Sentry:

Copied
app.use(function processItems(req, res, next) {
  const item = getFromQueue();
  const transaction = Sentry.startTransaction({
    op: "task",
    name: item.getTransaction(),
  });

  // processItem may create more spans internally (see next examples)
  processItem(item, transaction).then(() => {
    transaction.finish();
    next();
  });
});

Retrieving a Transaction

In cases where you want to attach Spans to an already ongoing Transaction you can use Sentry.getCurrentHub().getScope().getTransaction(). This function will return a Transaction in case there is a running Transaction otherwise it returns undefined. If you are using our Express integration by default we attach the Transaction to the Scope. So you could do something like this:

Copied
app.get("/success", function successHandler(req, res) {
  const transaction = Sentry.getCurrentHub()
    .getScope()
    .getTransaction();

  if (transaction) {
    let span = transaction.startChild({
      op: "encode",
      description: "parseAvatarImages",
    });
    // Do something
    span.finish();
  }
  res.status(200).end();
});

Connecting Services

If you are also using Performance Monitoring for JavaScript, depending on where your request originates, you can connect traces:

  1. For requests that start in your backend, by adding a meta tag in your HTML template that contains tracing information.
  2. For requests that start in JavaScript, by the SDK setting a header on requests to your backend.

Otherwise, backend services with Performance Monitoring connect automatically.