Tracing Troubleshooting for Express

Learn how to troubleshoot your tracing setup.

If you need help managing transactions or spans, start with this page. If you need additional help, you can ask on GitHub. Customers on a paid plan may also contact support.

The SDK groups spans by service span. Integrations usually name these spans automatically. To change a service span's name before it is sent, use beforeSendSpan and check is_segment:

Copied
Sentry.init({
  beforeSendSpan(span) {
    if (
      span.is_segment &&
      span.attributes["http.route"] === "/users/:id"
    ) {
      span.name = "GET /users/:id";
    }
    return span;
  },
});

Event processors do not apply to streamed spans. In transaction mode, use beforeSendTransaction to change event.transaction. See Transaction Name for other ways to set names.

Currently, every tag has a maximum character limit of 200 characters. Tags over the 200 character limit will become truncated, losing potentially important information. To retain this data, you can split data over several tags instead.

For example, a 200+ character tag like this:

https://empowerplant.io/api/0/projects/ep/setup_form/?user_id=314159265358979323846264338327&tracking_id=EasyAsABC123OrSimpleAsDoReMi&product_name=PlantToHumanTranslator&product_id=161803398874989484820458683436563811772030917980576

...will become truncated to:

https://empowerplant.io/api/0/projects/ep/setup_form/?user_id=314159265358979323846264338327&tracking_id=EasyAsABC123OrSimpleAsDoReMi&product_name=PlantToHumanTranslator&product_id=1618033988749894848

Instead of using tags, it is recommended to add data to spans as attributes. Using span.setAttribute() allows to add data with arbitrary length to a span. You can add as many attributes to your span as you want.

Copied
const baseUrl = "https://empowerplant.io";
const endpoint = "/api/0/projects/ep/setup_form";
const parameters = {
  user_id: 314159265358979323846264338327,
  tracking_id: "EasyAsABC123OrSimpleAsDoReMi",
  product_name: PlantToHumanTranslator,
  product_id: 161803398874989484820458683436563811772030917980576,
};

startSpan(
  {
    op: "http.client",
    name: "setup form",
    // you can add attributes when starting the span
    attributes: {
      baseUrl,
      endpoint,
    },
  },
  (span) => {
    // or you can add attributes to an existing span
    for (const key of parameters) {
      span.setAttribute(`parameters.${key}`, parameters[key]);
    }

    // do something to be measured
  },
);

With traceLifecycle: 'static', the SDK holds spans in memory until the root span ends. This can cause high memory usage, hit the 1,000-span limit, or lose spans if the process crashes. Use the default traceLifecycle: 'stream' to send spans in batches as they finish. In stream mode, pass beforeSendSpan directly without a withStaticSpan wrapper.

See Streamed Spans for more information.

The SDK evaluates ignoreSpans when a span starts. Names and attributes added or updated later do not affect matching. Make sure your rules match values available when the span is created.

If you're auto-instrumenting and don't know what the initial name of a span is when it starts, enable SDK debug logging during development by setting debug: true when initializing the SDK.

Use the object form of ignoreSpans to match both name and operation when you need to distinguish service spans from child spans with the same name.

Was this helpful?
Help improve this content
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").