[Breaking change]: Activity.Recorded behavior change for PropagationData sampling result with Recorded parent #44282

Description

@CodeBlanch

Description

The ActivitySource.CreateActivity and ActivitySource.StartActivity APIs only return an Activity when there is a registered listener which decides the instance should be created. This is generally known as sampling.

The ActivitySamplingResultenum defines the possible sampling decisions.

When creating an Activity without a parent, ActivitySamplingResult drives whether the Activity is created and then how the Recorded and IsAllDataRequested properties are set:

ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
NoneNo
PropagationDataYesFalseFalse
AllDataYesFalseTrue
AllDataAndRecordedYesTrueTrue

It is also possible to create an Activity with a parent. The parent could be in the same process, or it could be a remote parent propagated to the current process.

An issue was discovered where if the parent has Recorded=true AND the ActivitySamplingResult is PropagationData then the created Activity has a Recorded value which breaks with the above:

ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
PropagationDataYesTrueFalse

This may cause issues for users:

  • OpenTelemetry .NET, for example, will capture/export any Activity with Recorded=true. An Activity sampled as PropagationData should not be recorded by definition.

  • When performing external operations (such as HTTP calls) the current Activity is propagated to downstream systems. A PropagationDataActivity should be propagated, but the current design causes it to be propagated as Recorded which may lead downstream systems to treat the trace as sampled.

dotnet/runtime#111289 adjusts the logic as such:

ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
PropagationDataYesFalseFalse

This is a breaking change but one that corrects the behavior following the OpenTelemetry Specification.

Version

.NET 10 Preview 1

Previous behavior

When creating an Activity as PropagationData with a parent marked as Recorded:

ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
PropagationDataYesTrueFalse

New behavior

When creating an Activity as PropagationData with a parent marked as Recorded:

ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
PropagationDataYesFalseFalse

Type of breaking change

  • Binary incompatible: Existing binaries might encounter a breaking change in behavior, such as failure to load or execute, and if so, require recompilation.
  • Source incompatible: When recompiled using the new SDK or component or to target the new runtime, existing source code might require source changes to compile successfully.
  • Behavioral change: Existing binaries might behave differently at run time.

Reason for change

The existing behavior does not follow the OpenTelemetry Specification.

Recommended action

Users who have implemented ActivityListener.Sample directly AND use ActivitySamplingResult.PropagationData should verify they are not reliant on the flawed behavior. Activity.ActivityTraceFlags may be set to Recorded after the CreateActivity or StartActivity call to restore the previous behavior.

Users using OpenTelemetry .NET should verify their sampler configuration. The default OpenTelemetry .NET configuration uses a parent-based algorithm which is not impacted. Only users who have customized the sampler should verify the behavior.

Feature area

Other (please put exact area in description textbox)

Affected APIs

  • ActivitySource.CreateActivity
  • ActivitySource.StartActivity

Associated WorkItem - 367791

Metadata

Metadata

Assignees

Labels

🏁 Release: .NET 10Work items for the .NET 10 release📌 seQUESTeredIdentifies that an issue has been imported into Quest.breaking-changeIndicates a .NET Core breaking changein-prThis issue will be closed (fixed) by an active pull request.

Type

No type

Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    [Breaking change]: Activity.Recorded behavior change for PropagationData sampling result with Recorded parent #44282

    Description

    @CodeBlanch

    Description

    The ActivitySource.CreateActivity and ActivitySource.StartActivity APIs only return an Activity when there is a registered listener which decides the instance should be created. This is generally known as sampling.

    The ActivitySamplingResultenum defines the possible sampling decisions.

    When creating an Activity without a parent, ActivitySamplingResult drives whether the Activity is created and then how the Recorded and IsAllDataRequested properties are set:

    ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
    NoneNo
    PropagationDataYesFalseFalse
    AllDataYesFalseTrue
    AllDataAndRecordedYesTrueTrue

    It is also possible to create an Activity with a parent. The parent could be in the same process, or it could be a remote parent propagated to the current process.

    An issue was discovered where if the parent has Recorded=true AND the ActivitySamplingResult is PropagationData then the created Activity has a Recorded value which breaks with the above:

    ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
    PropagationDataYesTrueFalse

    This may cause issues for users:

    • OpenTelemetry .NET, for example, will capture/export any Activity with Recorded=true. An Activity sampled as PropagationData should not be recorded by definition.

    • When performing external operations (such as HTTP calls) the current Activity is propagated to downstream systems. A PropagationDataActivity should be propagated, but the current design causes it to be propagated as Recorded which may lead downstream systems to treat the trace as sampled.

    dotnet/runtime#111289 adjusts the logic as such:

    ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
    PropagationDataYesFalseFalse

    This is a breaking change but one that corrects the behavior following the OpenTelemetry Specification.

    Version

    .NET 10 Preview 1

    Previous behavior

    When creating an Activity as PropagationData with a parent marked as Recorded:

    ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
    PropagationDataYesTrueFalse

    New behavior

    When creating an Activity as PropagationData with a parent marked as Recorded:

    ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
    PropagationDataYesFalseFalse

    Type of breaking change

    • Binary incompatible: Existing binaries might encounter a breaking change in behavior, such as failure to load or execute, and if so, require recompilation.
    • Source incompatible: When recompiled using the new SDK or component or to target the new runtime, existing source code might require source changes to compile successfully.
    • Behavioral change: Existing binaries might behave differently at run time.

    Reason for change

    The existing behavior does not follow the OpenTelemetry Specification.

    Recommended action

    Users who have implemented ActivityListener.Sample directly AND use ActivitySamplingResult.PropagationData should verify they are not reliant on the flawed behavior. Activity.ActivityTraceFlags may be set to Recorded after the CreateActivity or StartActivity call to restore the previous behavior.

    Users using OpenTelemetry .NET should verify their sampler configuration. The default OpenTelemetry .NET configuration uses a parent-based algorithm which is not impacted. Only users who have customized the sampler should verify the behavior.

    Feature area

    Other (please put exact area in description textbox)

    Affected APIs

    • ActivitySource.CreateActivity
    • ActivitySource.StartActivity

    Associated WorkItem - 367791

    Metadata

    Metadata

    Assignees

    Labels

    🏁 Release: .NET 10Work items for the .NET 10 release📌 seQUESTeredIdentifies that an issue has been imported into Quest.breaking-changeIndicates a .NET Core breaking changein-prThis issue will be closed (fixed) by an active pull request.

    Type

    No type

    Projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

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

      [Breaking change]: Activity.Recorded behavior change for PropagationData sampling result with Recorded parent #44282

      Description

      @CodeBlanch

      Description

      The ActivitySource.CreateActivity and ActivitySource.StartActivity APIs only return an Activity when there is a registered listener which decides the instance should be created. This is generally known as sampling.

      The ActivitySamplingResultenum defines the possible sampling decisions.

      When creating an Activity without a parent, ActivitySamplingResult drives whether the Activity is created and then how the Recorded and IsAllDataRequested properties are set:

      ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
      NoneNo
      PropagationDataYesFalseFalse
      AllDataYesFalseTrue
      AllDataAndRecordedYesTrueTrue

      It is also possible to create an Activity with a parent. The parent could be in the same process, or it could be a remote parent propagated to the current process.

      An issue was discovered where if the parent has Recorded=true AND the ActivitySamplingResult is PropagationData then the created Activity has a Recorded value which breaks with the above:

      ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
      PropagationDataYesTrueFalse

      This may cause issues for users:

      • OpenTelemetry .NET, for example, will capture/export any Activity with Recorded=true. An Activity sampled as PropagationData should not be recorded by definition.

      • When performing external operations (such as HTTP calls) the current Activity is propagated to downstream systems. A PropagationDataActivity should be propagated, but the current design causes it to be propagated as Recorded which may lead downstream systems to treat the trace as sampled.

      dotnet/runtime#111289 adjusts the logic as such:

      ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
      PropagationDataYesFalseFalse

      This is a breaking change but one that corrects the behavior following the OpenTelemetry Specification.

      Version

      .NET 10 Preview 1

      Previous behavior

      When creating an Activity as PropagationData with a parent marked as Recorded:

      ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
      PropagationDataYesTrueFalse

      New behavior

      When creating an Activity as PropagationData with a parent marked as Recorded:

      ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
      PropagationDataYesFalseFalse

      Type of breaking change

      • Binary incompatible: Existing binaries might encounter a breaking change in behavior, such as failure to load or execute, and if so, require recompilation.
      • Source incompatible: When recompiled using the new SDK or component or to target the new runtime, existing source code might require source changes to compile successfully.
      • Behavioral change: Existing binaries might behave differently at run time.

      Reason for change

      The existing behavior does not follow the OpenTelemetry Specification.

      Recommended action

      Users who have implemented ActivityListener.Sample directly AND use ActivitySamplingResult.PropagationData should verify they are not reliant on the flawed behavior. Activity.ActivityTraceFlags may be set to Recorded after the CreateActivity or StartActivity call to restore the previous behavior.

      Users using OpenTelemetry .NET should verify their sampler configuration. The default OpenTelemetry .NET configuration uses a parent-based algorithm which is not impacted. Only users who have customized the sampler should verify the behavior.

      Feature area

      Other (please put exact area in description textbox)

      Affected APIs

      • ActivitySource.CreateActivity
      • ActivitySource.StartActivity

      Associated WorkItem - 367791

      Metadata

      Metadata

      Assignees

      Labels

      🏁 Release: .NET 10Work items for the .NET 10 release📌 seQUESTeredIdentifies that an issue has been imported into Quest.breaking-changeIndicates a .NET Core breaking changein-prThis issue will be closed (fixed) by an active pull request.

      Type

      No type

      Projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

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

        [Breaking change]: Activity.Recorded behavior change for PropagationData sampling result with Recorded parent #44282

        Description

        @CodeBlanch

        Description

        The ActivitySource.CreateActivity and ActivitySource.StartActivity APIs only return an Activity when there is a registered listener which decides the instance should be created. This is generally known as sampling.

        The ActivitySamplingResultenum defines the possible sampling decisions.

        When creating an Activity without a parent, ActivitySamplingResult drives whether the Activity is created and then how the Recorded and IsAllDataRequested properties are set:

        ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
        NoneNo
        PropagationDataYesFalseFalse
        AllDataYesFalseTrue
        AllDataAndRecordedYesTrueTrue

        It is also possible to create an Activity with a parent. The parent could be in the same process, or it could be a remote parent propagated to the current process.

        An issue was discovered where if the parent has Recorded=true AND the ActivitySamplingResult is PropagationData then the created Activity has a Recorded value which breaks with the above:

        ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
        PropagationDataYesTrueFalse

        This may cause issues for users:

        • OpenTelemetry .NET, for example, will capture/export any Activity with Recorded=true. An Activity sampled as PropagationData should not be recorded by definition.

        • When performing external operations (such as HTTP calls) the current Activity is propagated to downstream systems. A PropagationDataActivity should be propagated, but the current design causes it to be propagated as Recorded which may lead downstream systems to treat the trace as sampled.

        dotnet/runtime#111289 adjusts the logic as such:

        ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
        PropagationDataYesFalseFalse

        This is a breaking change but one that corrects the behavior following the OpenTelemetry Specification.

        Version

        .NET 10 Preview 1

        Previous behavior

        When creating an Activity as PropagationData with a parent marked as Recorded:

        ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
        PropagationDataYesTrueFalse

        New behavior

        When creating an Activity as PropagationData with a parent marked as Recorded:

        ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
        PropagationDataYesFalseFalse

        Type of breaking change

        • Binary incompatible: Existing binaries might encounter a breaking change in behavior, such as failure to load or execute, and if so, require recompilation.
        • Source incompatible: When recompiled using the new SDK or component or to target the new runtime, existing source code might require source changes to compile successfully.
        • Behavioral change: Existing binaries might behave differently at run time.

        Reason for change

        The existing behavior does not follow the OpenTelemetry Specification.

        Recommended action

        Users who have implemented ActivityListener.Sample directly AND use ActivitySamplingResult.PropagationData should verify they are not reliant on the flawed behavior. Activity.ActivityTraceFlags may be set to Recorded after the CreateActivity or StartActivity call to restore the previous behavior.

        Users using OpenTelemetry .NET should verify their sampler configuration. The default OpenTelemetry .NET configuration uses a parent-based algorithm which is not impacted. Only users who have customized the sampler should verify the behavior.

        Feature area

        Other (please put exact area in description textbox)

        Affected APIs

        • ActivitySource.CreateActivity
        • ActivitySource.StartActivity

        Associated WorkItem - 367791

        Metadata

        Metadata

        Assignees

        Labels

        🏁 Release: .NET 10Work items for the .NET 10 release📌 seQUESTeredIdentifies that an issue has been imported into Quest.breaking-changeIndicates a .NET Core breaking changein-prThis issue will be closed (fixed) by an active pull request.

        Type

        No type

        Projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

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

          [Breaking change]: Activity.Recorded behavior change for PropagationData sampling result with Recorded parent #44282

          Description

          @CodeBlanch

          Description

          The ActivitySource.CreateActivity and ActivitySource.StartActivity APIs only return an Activity when there is a registered listener which decides the instance should be created. This is generally known as sampling.

          The ActivitySamplingResultenum defines the possible sampling decisions.

          When creating an Activity without a parent, ActivitySamplingResult drives whether the Activity is created and then how the Recorded and IsAllDataRequested properties are set:

          ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
          NoneNo
          PropagationDataYesFalseFalse
          AllDataYesFalseTrue
          AllDataAndRecordedYesTrueTrue

          It is also possible to create an Activity with a parent. The parent could be in the same process, or it could be a remote parent propagated to the current process.

          An issue was discovered where if the parent has Recorded=true AND the ActivitySamplingResult is PropagationData then the created Activity has a Recorded value which breaks with the above:

          ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
          PropagationDataYesTrueFalse

          This may cause issues for users:

          • OpenTelemetry .NET, for example, will capture/export any Activity with Recorded=true. An Activity sampled as PropagationData should not be recorded by definition.

          • When performing external operations (such as HTTP calls) the current Activity is propagated to downstream systems. A PropagationDataActivity should be propagated, but the current design causes it to be propagated as Recorded which may lead downstream systems to treat the trace as sampled.

          dotnet/runtime#111289 adjusts the logic as such:

          ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
          PropagationDataYesFalseFalse

          This is a breaking change but one that corrects the behavior following the OpenTelemetry Specification.

          Version

          .NET 10 Preview 1

          Previous behavior

          When creating an Activity as PropagationData with a parent marked as Recorded:

          ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
          PropagationDataYesTrueFalse

          New behavior

          When creating an Activity as PropagationData with a parent marked as Recorded:

          ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
          PropagationDataYesFalseFalse

          Type of breaking change

          • Binary incompatible: Existing binaries might encounter a breaking change in behavior, such as failure to load or execute, and if so, require recompilation.
          • Source incompatible: When recompiled using the new SDK or component or to target the new runtime, existing source code might require source changes to compile successfully.
          • Behavioral change: Existing binaries might behave differently at run time.

          Reason for change

          The existing behavior does not follow the OpenTelemetry Specification.

          Recommended action

          Users who have implemented ActivityListener.Sample directly AND use ActivitySamplingResult.PropagationData should verify they are not reliant on the flawed behavior. Activity.ActivityTraceFlags may be set to Recorded after the CreateActivity or StartActivity call to restore the previous behavior.

          Users using OpenTelemetry .NET should verify their sampler configuration. The default OpenTelemetry .NET configuration uses a parent-based algorithm which is not impacted. Only users who have customized the sampler should verify the behavior.

          Feature area

          Other (please put exact area in description textbox)

          Affected APIs

          • ActivitySource.CreateActivity
          • ActivitySource.StartActivity

          Associated WorkItem - 367791

          Metadata

          Metadata

          Assignees

          Labels

          🏁 Release: .NET 10Work items for the .NET 10 release📌 seQUESTeredIdentifies that an issue has been imported into Quest.breaking-changeIndicates a .NET Core breaking changein-prThis issue will be closed (fixed) by an active pull request.

          Type

          No type

          Projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

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

            [Breaking change]: Activity.Recorded behavior change for PropagationData sampling result with Recorded parent #44282

            Description

            @CodeBlanch

            Description

            The ActivitySource.CreateActivity and ActivitySource.StartActivity APIs only return an Activity when there is a registered listener which decides the instance should be created. This is generally known as sampling.

            The ActivitySamplingResultenum defines the possible sampling decisions.

            When creating an Activity without a parent, ActivitySamplingResult drives whether the Activity is created and then how the Recorded and IsAllDataRequested properties are set:

            ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
            NoneNo
            PropagationDataYesFalseFalse
            AllDataYesFalseTrue
            AllDataAndRecordedYesTrueTrue

            It is also possible to create an Activity with a parent. The parent could be in the same process, or it could be a remote parent propagated to the current process.

            An issue was discovered where if the parent has Recorded=true AND the ActivitySamplingResult is PropagationData then the created Activity has a Recorded value which breaks with the above:

            ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
            PropagationDataYesTrueFalse

            This may cause issues for users:

            • OpenTelemetry .NET, for example, will capture/export any Activity with Recorded=true. An Activity sampled as PropagationData should not be recorded by definition.

            • When performing external operations (such as HTTP calls) the current Activity is propagated to downstream systems. A PropagationDataActivity should be propagated, but the current design causes it to be propagated as Recorded which may lead downstream systems to treat the trace as sampled.

            dotnet/runtime#111289 adjusts the logic as such:

            ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
            PropagationDataYesFalseFalse

            This is a breaking change but one that corrects the behavior following the OpenTelemetry Specification.

            Version

            .NET 10 Preview 1

            Previous behavior

            When creating an Activity as PropagationData with a parent marked as Recorded:

            ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
            PropagationDataYesTrueFalse

            New behavior

            When creating an Activity as PropagationData with a parent marked as Recorded:

            ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
            PropagationDataYesFalseFalse

            Type of breaking change

            • Binary incompatible: Existing binaries might encounter a breaking change in behavior, such as failure to load or execute, and if so, require recompilation.
            • Source incompatible: When recompiled using the new SDK or component or to target the new runtime, existing source code might require source changes to compile successfully.
            • Behavioral change: Existing binaries might behave differently at run time.

            Reason for change

            The existing behavior does not follow the OpenTelemetry Specification.

            Recommended action

            Users who have implemented ActivityListener.Sample directly AND use ActivitySamplingResult.PropagationData should verify they are not reliant on the flawed behavior. Activity.ActivityTraceFlags may be set to Recorded after the CreateActivity or StartActivity call to restore the previous behavior.

            Users using OpenTelemetry .NET should verify their sampler configuration. The default OpenTelemetry .NET configuration uses a parent-based algorithm which is not impacted. Only users who have customized the sampler should verify the behavior.

            Feature area

            Other (please put exact area in description textbox)

            Affected APIs

            • ActivitySource.CreateActivity
            • ActivitySource.StartActivity

            Associated WorkItem - 367791

            Metadata

            Metadata

            Assignees

            Labels

            🏁 Release: .NET 10Work items for the .NET 10 release📌 seQUESTeredIdentifies that an issue has been imported into Quest.breaking-changeIndicates a .NET Core breaking changein-prThis issue will be closed (fixed) by an active pull request.

            Type

            No type

            Projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

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

              [Breaking change]: Activity.Recorded behavior change for PropagationData sampling result with Recorded parent #44282

              Description

              @CodeBlanch

              Description

              The ActivitySource.CreateActivity and ActivitySource.StartActivity APIs only return an Activity when there is a registered listener which decides the instance should be created. This is generally known as sampling.

              The ActivitySamplingResultenum defines the possible sampling decisions.

              When creating an Activity without a parent, ActivitySamplingResult drives whether the Activity is created and then how the Recorded and IsAllDataRequested properties are set:

              ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
              NoneNo
              PropagationDataYesFalseFalse
              AllDataYesFalseTrue
              AllDataAndRecordedYesTrueTrue

              It is also possible to create an Activity with a parent. The parent could be in the same process, or it could be a remote parent propagated to the current process.

              An issue was discovered where if the parent has Recorded=true AND the ActivitySamplingResult is PropagationData then the created Activity has a Recorded value which breaks with the above:

              ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
              PropagationDataYesTrueFalse

              This may cause issues for users:

              • OpenTelemetry .NET, for example, will capture/export any Activity with Recorded=true. An Activity sampled as PropagationData should not be recorded by definition.

              • When performing external operations (such as HTTP calls) the current Activity is propagated to downstream systems. A PropagationDataActivity should be propagated, but the current design causes it to be propagated as Recorded which may lead downstream systems to treat the trace as sampled.

              dotnet/runtime#111289 adjusts the logic as such:

              ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
              PropagationDataYesFalseFalse

              This is a breaking change but one that corrects the behavior following the OpenTelemetry Specification.

              Version

              .NET 10 Preview 1

              Previous behavior

              When creating an Activity as PropagationData with a parent marked as Recorded:

              ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
              PropagationDataYesTrueFalse

              New behavior

              When creating an Activity as PropagationData with a parent marked as Recorded:

              ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
              PropagationDataYesFalseFalse

              Type of breaking change

              • Binary incompatible: Existing binaries might encounter a breaking change in behavior, such as failure to load or execute, and if so, require recompilation.
              • Source incompatible: When recompiled using the new SDK or component or to target the new runtime, existing source code might require source changes to compile successfully.
              • Behavioral change: Existing binaries might behave differently at run time.

              Reason for change

              The existing behavior does not follow the OpenTelemetry Specification.

              Recommended action

              Users who have implemented ActivityListener.Sample directly AND use ActivitySamplingResult.PropagationData should verify they are not reliant on the flawed behavior. Activity.ActivityTraceFlags may be set to Recorded after the CreateActivity or StartActivity call to restore the previous behavior.

              Users using OpenTelemetry .NET should verify their sampler configuration. The default OpenTelemetry .NET configuration uses a parent-based algorithm which is not impacted. Only users who have customized the sampler should verify the behavior.

              Feature area

              Other (please put exact area in description textbox)

              Affected APIs

              • ActivitySource.CreateActivity
              • ActivitySource.StartActivity

              Associated WorkItem - 367791

              Metadata

              Metadata

              Assignees

              Labels

              🏁 Release: .NET 10Work items for the .NET 10 release📌 seQUESTeredIdentifies that an issue has been imported into Quest.breaking-changeIndicates a .NET Core breaking changein-prThis issue will be closed (fixed) by an active pull request.

              Type

              No type

              Projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

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

                [Breaking change]: Activity.Recorded behavior change for PropagationData sampling result with Recorded parent #44282

                Description

                @CodeBlanch

                Description

                The ActivitySource.CreateActivity and ActivitySource.StartActivity APIs only return an Activity when there is a registered listener which decides the instance should be created. This is generally known as sampling.

                The ActivitySamplingResultenum defines the possible sampling decisions.

                When creating an Activity without a parent, ActivitySamplingResult drives whether the Activity is created and then how the Recorded and IsAllDataRequested properties are set:

                ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
                NoneNo
                PropagationDataYesFalseFalse
                AllDataYesFalseTrue
                AllDataAndRecordedYesTrueTrue

                It is also possible to create an Activity with a parent. The parent could be in the same process, or it could be a remote parent propagated to the current process.

                An issue was discovered where if the parent has Recorded=true AND the ActivitySamplingResult is PropagationData then the created Activity has a Recorded value which breaks with the above:

                ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
                PropagationDataYesTrueFalse

                This may cause issues for users:

                • OpenTelemetry .NET, for example, will capture/export any Activity with Recorded=true. An Activity sampled as PropagationData should not be recorded by definition.

                • When performing external operations (such as HTTP calls) the current Activity is propagated to downstream systems. A PropagationDataActivity should be propagated, but the current design causes it to be propagated as Recorded which may lead downstream systems to treat the trace as sampled.

                dotnet/runtime#111289 adjusts the logic as such:

                ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
                PropagationDataYesFalseFalse

                This is a breaking change but one that corrects the behavior following the OpenTelemetry Specification.

                Version

                .NET 10 Preview 1

                Previous behavior

                When creating an Activity as PropagationData with a parent marked as Recorded:

                ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
                PropagationDataYesTrueFalse

                New behavior

                When creating an Activity as PropagationData with a parent marked as Recorded:

                ActivitySamplingResultActivity createdActivity.RecordedActivity.IsAllDataRequested
                PropagationDataYesFalseFalse

                Type of breaking change

                • Binary incompatible: Existing binaries might encounter a breaking change in behavior, such as failure to load or execute, and if so, require recompilation.
                • Source incompatible: When recompiled using the new SDK or component or to target the new runtime, existing source code might require source changes to compile successfully.
                • Behavioral change: Existing binaries might behave differently at run time.

                Reason for change

                The existing behavior does not follow the OpenTelemetry Specification.

                Recommended action

                Users who have implemented ActivityListener.Sample directly AND use ActivitySamplingResult.PropagationData should verify they are not reliant on the flawed behavior. Activity.ActivityTraceFlags may be set to Recorded after the CreateActivity or StartActivity call to restore the previous behavior.

                Users using OpenTelemetry .NET should verify their sampler configuration. The default OpenTelemetry .NET configuration uses a parent-based algorithm which is not impacted. Only users who have customized the sampler should verify the behavior.

                Feature area

                Other (please put exact area in description textbox)

                Affected APIs

                • ActivitySource.CreateActivity
                • ActivitySource.StartActivity

                Associated WorkItem - 367791

                Metadata

                Metadata

                Assignees

                Labels

                🏁 Release: .NET 10Work items for the .NET 10 release📌 seQUESTeredIdentifies that an issue has been imported into Quest.breaking-changeIndicates a .NET Core breaking changein-prThis issue will be closed (fixed) by an active pull request.

                Type

                No type

                Projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions