Skip to content

Duplicate auto-instrumented spans in traces #15803

Description

@serglom21

Is there an existing issue for this?

How do you use Sentry?

Sentry Saas (sentry.io)

Which SDK are you using?

@sentry/node

SDK Version

9.1.0

Framework Version

Express 4.21.2

Link to Sentry event

No response

Reproduction Example/SDK Setup

Sentry.init({
enabled: environment !== 'local' || process.env.SENTRY_ENABLED?.toLowerCase() === 'true',
environment,
dsn: process.env.SENTRY_DSN,
// Mark the release, this will help us pinpoint the source of issues
release: process.env.SHORT_SHA,
debug: process.env.SENTRY_DEBUG?.toLowerCase() === 'true',
tracesSampleRate: Number(process.env.SENTRY_TRACES_SAMPLE_RATE ?? 0.01),
profilesSampleRate: Number(process.env.SENTRY_PROFILES_SAMPLE_RATE ?? 0.01),
normalizeDepth: 10,
initialScope: {
tags: {
location: process.env.LOCATION ?? 'unknown',
container_name: process.env.CONTAINER_NAME ?? 'unknown',
},
},
integrations: [Sentry.prismaIntegration(), nodeProfilingIntegration()],
beforeBreadcrumb: (breadcrumb, _) => {
if (breadcrumb.category === 'http') {
// Ignore spans/breadcrumbs calling apm
const url = breadcrumb.data?.url;
if (url?.includes('.split.io/') || url?.includes('ingest.sentry.io/')) {
return null;
}
}
return breadcrumb;
},
beforeSendTransaction: (event, _) => {
// redact x-access-token from transactions
if (event.request?.headers && event.request?.headers['x-access-token']) {
event.request.headers['x-access-token'] = 'REDACTED';
}
return event;
},
ignoreTransactions: [/GET \/_health/, /GET \/_ready/, /GET \/_startup/, /OPTIONS \//],
});

Steps to Reproduce

  1. Capture traces with sentry.javascript.node@9.1.0.
  2. Look at thehttp.serverspans
  3. Note the presence of two spans for the same endpoint within the same trace.
  4. Compare the two spans:
    • The first span lacks child middleware spans (no expandable '+' indicator).
    • The second span includes child middleware spans.
    • The second span contains additional custom tags absent in the first span.

Expected Result

  • Each unique operation (span) should be recorded only once per trace.
  • All relevant context and middleware information should be consistently captured within a single span.

Actual Result

Duplicate spans for the same HTTP operation

More information on internal customer case

Metadata

Metadata

Assignees

No one assigned

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
     blocks
    (function() {
    function addCopyButtons() {
    document.querySelectorAll('pre code').forEach(function(codeBlock) {
    if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
    codeBlock.parentElement.setAttribute('data-copy-added', 'true');
    var btn = document.createElement('button');
    btn.textContent = 'Copy';
    btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
    btn.onmouseover = function() { this.style.opacity = '1'; };
    btn.onmouseout = function() { this.style.opacity = '0.7'; };
    btn.onclick = function() {
    navigator.clipboard.writeText(codeBlock.textContent).then(function() {
    btn.textContent = 'Copied!';
    setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
    });
    };
    codeBlock.parentElement.style.position = 'relative';
    codeBlock.parentElement.appendChild(btn);
    });
    }
    addCopyButtons();
    // Re-run on dynamic content
    var observer = new MutationObserver(addCopyButtons);
    observer.observe(document.body, { childList: true, subtree: true });
    })();
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    Duplicate auto-instrumented spans in traces · Issue #15803 · getsentry/sentry-javascript · GitHub
    Skip to content

    Duplicate auto-instrumented spans in traces #15803

    Description

    @serglom21

    Is there an existing issue for this?

    How do you use Sentry?

    Sentry Saas (sentry.io)

    Which SDK are you using?

    @sentry/node

    SDK Version

    9.1.0

    Framework Version

    Express 4.21.2

    Link to Sentry event

    No response

    Reproduction Example/SDK Setup

    Sentry.init({
    enabled: environment !== 'local' || process.env.SENTRY_ENABLED?.toLowerCase() === 'true',
    environment,
    dsn: process.env.SENTRY_DSN,
    // Mark the release, this will help us pinpoint the source of issues
    release: process.env.SHORT_SHA,
    debug: process.env.SENTRY_DEBUG?.toLowerCase() === 'true',
    tracesSampleRate: Number(process.env.SENTRY_TRACES_SAMPLE_RATE ?? 0.01),
    profilesSampleRate: Number(process.env.SENTRY_PROFILES_SAMPLE_RATE ?? 0.01),
    normalizeDepth: 10,
    initialScope: {
    tags: {
    location: process.env.LOCATION ?? 'unknown',
    container_name: process.env.CONTAINER_NAME ?? 'unknown',
    },
    },
    integrations: [Sentry.prismaIntegration(), nodeProfilingIntegration()],
    beforeBreadcrumb: (breadcrumb, _) => {
    if (breadcrumb.category === 'http') {
    // Ignore spans/breadcrumbs calling apm
    const url = breadcrumb.data?.url;
    if (url?.includes('.split.io/') || url?.includes('ingest.sentry.io/')) {
    return null;
    }
    }
    return breadcrumb;
    },
    beforeSendTransaction: (event, _) => {
    // redact x-access-token from transactions
    if (event.request?.headers && event.request?.headers['x-access-token']) {
    event.request.headers['x-access-token'] = 'REDACTED';
    }
    return event;
    },
    ignoreTransactions: [/GET \/_health/, /GET \/_ready/, /GET \/_startup/, /OPTIONS \//],
    });
    

    Steps to Reproduce

    1. Capture traces with sentry.javascript.node@9.1.0.
    2. Look at thehttp.serverspans
    3. Note the presence of two spans for the same endpoint within the same trace.
    4. Compare the two spans:
      • The first span lacks child middleware spans (no expandable '+' indicator).
      • The second span includes child middleware spans.
      • The second span contains additional custom tags absent in the first span.

    Expected Result

    • Each unique operation (span) should be recorded only once per trace.
    • All relevant context and middleware information should be consistently captured within a single span.

    Actual Result

    Duplicate spans for the same HTTP operation

    More information on internal customer case

    Metadata

    Metadata

    Assignees

    No one assigned

      Projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Duplicate auto-instrumented spans in traces · Issue #15803 · getsentry/sentry-javascript · GitHub
      Skip to content

      Duplicate auto-instrumented spans in traces #15803

      Description

      @serglom21

      Is there an existing issue for this?

      How do you use Sentry?

      Sentry Saas (sentry.io)

      Which SDK are you using?

      @sentry/node

      SDK Version

      9.1.0

      Framework Version

      Express 4.21.2

      Link to Sentry event

      No response

      Reproduction Example/SDK Setup

      Sentry.init({
      enabled: environment !== 'local' || process.env.SENTRY_ENABLED?.toLowerCase() === 'true',
      environment,
      dsn: process.env.SENTRY_DSN,
      // Mark the release, this will help us pinpoint the source of issues
      release: process.env.SHORT_SHA,
      debug: process.env.SENTRY_DEBUG?.toLowerCase() === 'true',
      tracesSampleRate: Number(process.env.SENTRY_TRACES_SAMPLE_RATE ?? 0.01),
      profilesSampleRate: Number(process.env.SENTRY_PROFILES_SAMPLE_RATE ?? 0.01),
      normalizeDepth: 10,
      initialScope: {
      tags: {
      location: process.env.LOCATION ?? 'unknown',
      container_name: process.env.CONTAINER_NAME ?? 'unknown',
      },
      },
      integrations: [Sentry.prismaIntegration(), nodeProfilingIntegration()],
      beforeBreadcrumb: (breadcrumb, _) => {
      if (breadcrumb.category === 'http') {
      // Ignore spans/breadcrumbs calling apm
      const url = breadcrumb.data?.url;
      if (url?.includes('.split.io/') || url?.includes('ingest.sentry.io/')) {
      return null;
      }
      }
      return breadcrumb;
      },
      beforeSendTransaction: (event, _) => {
      // redact x-access-token from transactions
      if (event.request?.headers && event.request?.headers['x-access-token']) {
      event.request.headers['x-access-token'] = 'REDACTED';
      }
      return event;
      },
      ignoreTransactions: [/GET \/_health/, /GET \/_ready/, /GET \/_startup/, /OPTIONS \//],
      });
      

      Steps to Reproduce

      1. Capture traces with sentry.javascript.node@9.1.0.
      2. Look at thehttp.serverspans
      3. Note the presence of two spans for the same endpoint within the same trace.
      4. Compare the two spans:
        • The first span lacks child middleware spans (no expandable '+' indicator).
        • The second span includes child middleware spans.
        • The second span contains additional custom tags absent in the first span.

      Expected Result

      • Each unique operation (span) should be recorded only once per trace.
      • All relevant context and middleware information should be consistently captured within a single span.

      Actual Result

      Duplicate spans for the same HTTP operation

      More information on internal customer case

      Metadata

      Metadata

      Assignees

      No one assigned

        Projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Duplicate auto-instrumented spans in traces · Issue #15803 · getsentry/sentry-javascript · GitHub
        Skip to content

        Duplicate auto-instrumented spans in traces #15803

        Description

        @serglom21

        Is there an existing issue for this?

        How do you use Sentry?

        Sentry Saas (sentry.io)

        Which SDK are you using?

        @sentry/node

        SDK Version

        9.1.0

        Framework Version

        Express 4.21.2

        Link to Sentry event

        No response

        Reproduction Example/SDK Setup

        Sentry.init({
        enabled: environment !== 'local' || process.env.SENTRY_ENABLED?.toLowerCase() === 'true',
        environment,
        dsn: process.env.SENTRY_DSN,
        // Mark the release, this will help us pinpoint the source of issues
        release: process.env.SHORT_SHA,
        debug: process.env.SENTRY_DEBUG?.toLowerCase() === 'true',
        tracesSampleRate: Number(process.env.SENTRY_TRACES_SAMPLE_RATE ?? 0.01),
        profilesSampleRate: Number(process.env.SENTRY_PROFILES_SAMPLE_RATE ?? 0.01),
        normalizeDepth: 10,
        initialScope: {
        tags: {
        location: process.env.LOCATION ?? 'unknown',
        container_name: process.env.CONTAINER_NAME ?? 'unknown',
        },
        },
        integrations: [Sentry.prismaIntegration(), nodeProfilingIntegration()],
        beforeBreadcrumb: (breadcrumb, _) => {
        if (breadcrumb.category === 'http') {
        // Ignore spans/breadcrumbs calling apm
        const url = breadcrumb.data?.url;
        if (url?.includes('.split.io/') || url?.includes('ingest.sentry.io/')) {
        return null;
        }
        }
        return breadcrumb;
        },
        beforeSendTransaction: (event, _) => {
        // redact x-access-token from transactions
        if (event.request?.headers && event.request?.headers['x-access-token']) {
        event.request.headers['x-access-token'] = 'REDACTED';
        }
        return event;
        },
        ignoreTransactions: [/GET \/_health/, /GET \/_ready/, /GET \/_startup/, /OPTIONS \//],
        });
        

        Steps to Reproduce

        1. Capture traces with sentry.javascript.node@9.1.0.
        2. Look at thehttp.serverspans
        3. Note the presence of two spans for the same endpoint within the same trace.
        4. Compare the two spans:
          • The first span lacks child middleware spans (no expandable '+' indicator).
          • The second span includes child middleware spans.
          • The second span contains additional custom tags absent in the first span.

        Expected Result

        • Each unique operation (span) should be recorded only once per trace.
        • All relevant context and middleware information should be consistently captured within a single span.

        Actual Result

        Duplicate spans for the same HTTP operation

        More information on internal customer case

        Metadata

        Metadata

        Assignees

        No one assigned

          Projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Duplicate auto-instrumented spans in traces · Issue #15803 · getsentry/sentry-javascript · GitHub
          Skip to content

          Duplicate auto-instrumented spans in traces #15803

          Description

          @serglom21

          Is there an existing issue for this?

          How do you use Sentry?

          Sentry Saas (sentry.io)

          Which SDK are you using?

          @sentry/node

          SDK Version

          9.1.0

          Framework Version

          Express 4.21.2

          Link to Sentry event

          No response

          Reproduction Example/SDK Setup

          Sentry.init({
          enabled: environment !== 'local' || process.env.SENTRY_ENABLED?.toLowerCase() === 'true',
          environment,
          dsn: process.env.SENTRY_DSN,
          // Mark the release, this will help us pinpoint the source of issues
          release: process.env.SHORT_SHA,
          debug: process.env.SENTRY_DEBUG?.toLowerCase() === 'true',
          tracesSampleRate: Number(process.env.SENTRY_TRACES_SAMPLE_RATE ?? 0.01),
          profilesSampleRate: Number(process.env.SENTRY_PROFILES_SAMPLE_RATE ?? 0.01),
          normalizeDepth: 10,
          initialScope: {
          tags: {
          location: process.env.LOCATION ?? 'unknown',
          container_name: process.env.CONTAINER_NAME ?? 'unknown',
          },
          },
          integrations: [Sentry.prismaIntegration(), nodeProfilingIntegration()],
          beforeBreadcrumb: (breadcrumb, _) => {
          if (breadcrumb.category === 'http') {
          // Ignore spans/breadcrumbs calling apm
          const url = breadcrumb.data?.url;
          if (url?.includes('.split.io/') || url?.includes('ingest.sentry.io/')) {
          return null;
          }
          }
          return breadcrumb;
          },
          beforeSendTransaction: (event, _) => {
          // redact x-access-token from transactions
          if (event.request?.headers && event.request?.headers['x-access-token']) {
          event.request.headers['x-access-token'] = 'REDACTED';
          }
          return event;
          },
          ignoreTransactions: [/GET \/_health/, /GET \/_ready/, /GET \/_startup/, /OPTIONS \//],
          });
          

          Steps to Reproduce

          1. Capture traces with sentry.javascript.node@9.1.0.
          2. Look at thehttp.serverspans
          3. Note the presence of two spans for the same endpoint within the same trace.
          4. Compare the two spans:
            • The first span lacks child middleware spans (no expandable '+' indicator).
            • The second span includes child middleware spans.
            • The second span contains additional custom tags absent in the first span.

          Expected Result

          • Each unique operation (span) should be recorded only once per trace.
          • All relevant context and middleware information should be consistently captured within a single span.

          Actual Result

          Duplicate spans for the same HTTP operation

          More information on internal customer case

          Metadata

          Metadata

          Assignees

          No one assigned

            Projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Duplicate auto-instrumented spans in traces · Issue #15803 · getsentry/sentry-javascript · GitHub
            Skip to content

            Duplicate auto-instrumented spans in traces #15803

            Description

            @serglom21

            Is there an existing issue for this?

            How do you use Sentry?

            Sentry Saas (sentry.io)

            Which SDK are you using?

            @sentry/node

            SDK Version

            9.1.0

            Framework Version

            Express 4.21.2

            Link to Sentry event

            No response

            Reproduction Example/SDK Setup

            Sentry.init({
            enabled: environment !== 'local' || process.env.SENTRY_ENABLED?.toLowerCase() === 'true',
            environment,
            dsn: process.env.SENTRY_DSN,
            // Mark the release, this will help us pinpoint the source of issues
            release: process.env.SHORT_SHA,
            debug: process.env.SENTRY_DEBUG?.toLowerCase() === 'true',
            tracesSampleRate: Number(process.env.SENTRY_TRACES_SAMPLE_RATE ?? 0.01),
            profilesSampleRate: Number(process.env.SENTRY_PROFILES_SAMPLE_RATE ?? 0.01),
            normalizeDepth: 10,
            initialScope: {
            tags: {
            location: process.env.LOCATION ?? 'unknown',
            container_name: process.env.CONTAINER_NAME ?? 'unknown',
            },
            },
            integrations: [Sentry.prismaIntegration(), nodeProfilingIntegration()],
            beforeBreadcrumb: (breadcrumb, _) => {
            if (breadcrumb.category === 'http') {
            // Ignore spans/breadcrumbs calling apm
            const url = breadcrumb.data?.url;
            if (url?.includes('.split.io/') || url?.includes('ingest.sentry.io/')) {
            return null;
            }
            }
            return breadcrumb;
            },
            beforeSendTransaction: (event, _) => {
            // redact x-access-token from transactions
            if (event.request?.headers && event.request?.headers['x-access-token']) {
            event.request.headers['x-access-token'] = 'REDACTED';
            }
            return event;
            },
            ignoreTransactions: [/GET \/_health/, /GET \/_ready/, /GET \/_startup/, /OPTIONS \//],
            });
            

            Steps to Reproduce

            1. Capture traces with sentry.javascript.node@9.1.0.
            2. Look at thehttp.serverspans
            3. Note the presence of two spans for the same endpoint within the same trace.
            4. Compare the two spans:
              • The first span lacks child middleware spans (no expandable '+' indicator).
              • The second span includes child middleware spans.
              • The second span contains additional custom tags absent in the first span.

            Expected Result

            • Each unique operation (span) should be recorded only once per trace.
            • All relevant context and middleware information should be consistently captured within a single span.

            Actual Result

            Duplicate spans for the same HTTP operation

            More information on internal customer case

            Metadata

            Metadata

            Assignees

            No one assigned

              Projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Duplicate auto-instrumented spans in traces · Issue #15803 · getsentry/sentry-javascript · GitHub
              Skip to content

              Duplicate auto-instrumented spans in traces #15803

              Description

              @serglom21

              Is there an existing issue for this?

              How do you use Sentry?

              Sentry Saas (sentry.io)

              Which SDK are you using?

              @sentry/node

              SDK Version

              9.1.0

              Framework Version

              Express 4.21.2

              Link to Sentry event

              No response

              Reproduction Example/SDK Setup

              Sentry.init({
              enabled: environment !== 'local' || process.env.SENTRY_ENABLED?.toLowerCase() === 'true',
              environment,
              dsn: process.env.SENTRY_DSN,
              // Mark the release, this will help us pinpoint the source of issues
              release: process.env.SHORT_SHA,
              debug: process.env.SENTRY_DEBUG?.toLowerCase() === 'true',
              tracesSampleRate: Number(process.env.SENTRY_TRACES_SAMPLE_RATE ?? 0.01),
              profilesSampleRate: Number(process.env.SENTRY_PROFILES_SAMPLE_RATE ?? 0.01),
              normalizeDepth: 10,
              initialScope: {
              tags: {
              location: process.env.LOCATION ?? 'unknown',
              container_name: process.env.CONTAINER_NAME ?? 'unknown',
              },
              },
              integrations: [Sentry.prismaIntegration(), nodeProfilingIntegration()],
              beforeBreadcrumb: (breadcrumb, _) => {
              if (breadcrumb.category === 'http') {
              // Ignore spans/breadcrumbs calling apm
              const url = breadcrumb.data?.url;
              if (url?.includes('.split.io/') || url?.includes('ingest.sentry.io/')) {
              return null;
              }
              }
              return breadcrumb;
              },
              beforeSendTransaction: (event, _) => {
              // redact x-access-token from transactions
              if (event.request?.headers && event.request?.headers['x-access-token']) {
              event.request.headers['x-access-token'] = 'REDACTED';
              }
              return event;
              },
              ignoreTransactions: [/GET \/_health/, /GET \/_ready/, /GET \/_startup/, /OPTIONS \//],
              });
              

              Steps to Reproduce

              1. Capture traces with sentry.javascript.node@9.1.0.
              2. Look at thehttp.serverspans
              3. Note the presence of two spans for the same endpoint within the same trace.
              4. Compare the two spans:
                • The first span lacks child middleware spans (no expandable '+' indicator).
                • The second span includes child middleware spans.
                • The second span contains additional custom tags absent in the first span.

              Expected Result

              • Each unique operation (span) should be recorded only once per trace.
              • All relevant context and middleware information should be consistently captured within a single span.

              Actual Result

              Duplicate spans for the same HTTP operation

              More information on internal customer case

              Metadata

              Metadata

              Assignees

              No one assigned

                Projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Duplicate auto-instrumented spans in traces · Issue #15803 · getsentry/sentry-javascript · GitHub
                Skip to content

                Duplicate auto-instrumented spans in traces #15803

                Description

                @serglom21

                Is there an existing issue for this?

                How do you use Sentry?

                Sentry Saas (sentry.io)

                Which SDK are you using?

                @sentry/node

                SDK Version

                9.1.0

                Framework Version

                Express 4.21.2

                Link to Sentry event

                No response

                Reproduction Example/SDK Setup

                Sentry.init({
                enabled: environment !== 'local' || process.env.SENTRY_ENABLED?.toLowerCase() === 'true',
                environment,
                dsn: process.env.SENTRY_DSN,
                // Mark the release, this will help us pinpoint the source of issues
                release: process.env.SHORT_SHA,
                debug: process.env.SENTRY_DEBUG?.toLowerCase() === 'true',
                tracesSampleRate: Number(process.env.SENTRY_TRACES_SAMPLE_RATE ?? 0.01),
                profilesSampleRate: Number(process.env.SENTRY_PROFILES_SAMPLE_RATE ?? 0.01),
                normalizeDepth: 10,
                initialScope: {
                tags: {
                location: process.env.LOCATION ?? 'unknown',
                container_name: process.env.CONTAINER_NAME ?? 'unknown',
                },
                },
                integrations: [Sentry.prismaIntegration(), nodeProfilingIntegration()],
                beforeBreadcrumb: (breadcrumb, _) => {
                if (breadcrumb.category === 'http') {
                // Ignore spans/breadcrumbs calling apm
                const url = breadcrumb.data?.url;
                if (url?.includes('.split.io/') || url?.includes('ingest.sentry.io/')) {
                return null;
                }
                }
                return breadcrumb;
                },
                beforeSendTransaction: (event, _) => {
                // redact x-access-token from transactions
                if (event.request?.headers && event.request?.headers['x-access-token']) {
                event.request.headers['x-access-token'] = 'REDACTED';
                }
                return event;
                },
                ignoreTransactions: [/GET \/_health/, /GET \/_ready/, /GET \/_startup/, /OPTIONS \//],
                });
                

                Steps to Reproduce

                1. Capture traces with sentry.javascript.node@9.1.0.
                2. Look at thehttp.serverspans
                3. Note the presence of two spans for the same endpoint within the same trace.
                4. Compare the two spans:
                  • The first span lacks child middleware spans (no expandable '+' indicator).
                  • The second span includes child middleware spans.
                  • The second span contains additional custom tags absent in the first span.

                Expected Result

                • Each unique operation (span) should be recorded only once per trace.
                • All relevant context and middleware information should be consistently captured within a single span.

                Actual Result

                Duplicate spans for the same HTTP operation

                More information on internal customer case

                Metadata

                Metadata

                Assignees

                No one assigned

                  Projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions