{
  "id": 3772870,
  "title": ".NET 10 ActivitySamplingResult PropagationData: Why Recorded Turns False",
  "url": "https://urgent.news/2026/08/27/net-10-activitysamplingresult-propagationdata-why-recorded-turns-false",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-08-27T16:21:09.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/ssukhpinder/net-10-activitysamplingresult-propagationdata-why-recorded-turns-false-d1g"
  },
  "original_language": "en",
  "account": ".NET 10 introduced a change to the ActivitySamplingResult PropagationData rule that may lead to custom samplers being invalidated. When an activity is started, ActivitySource.StartActivity now only creates an activity if a registered listener asks for it. The sampling decision made by the listener is respected over any inherited recorded flag from the parent activity. This means a child activity will not automatically be marked as recorded just because its parent was recorded. The trace identity still flows, but the local sampling decision now takes precedence. A collector is not obligated to replicate this behavior, and an exporter could potentially hide the important details behind additional configuration. The ActivityContext, a single ActivityListener, and a few assertions are sufficient to verify the behavior. The main change is that a PropagationData child activity now has both Recorded set to false and IsAllDataRequested set to false, even if it originates from a parent that was previously recorded. This distinction is crucial for custom listeners as it clarifies the difference between controlling the W3C recorded bit downstream and requesting detailed data to be attached. The ActivitySamplingResult API documentation provides a concise reference for the four possible choices: None, PropagationData, AllData, and AllDataAndRecorded. By explicitly setting the sampling result, developers can ensure the desired behavior without relying on pre-.NET 10 default settings. This change is targeted at code that directly implements ActivityListener.Sample and returns PropagationData. The default OpenTelemetry .NET parent-based sampler remains unaffected. It is important to note that this behavior only covers in-process testing and does not account for exporter batching, collector sampling, backend retention, or billing behavior, which are dependent on the specific telemetry stack being used. Custom samplers should thoroughly test this boundary to avoid unexpected changes in telemetry generation.",
  "summary": ".NET 10 changed a small tracing rule that can quietly invalidate a custom sampler. With .NET 10 ActivitySamplingResult PropagationData , a child activity no longer becomes Recorded just because its parent carries the recorded flag. The trace identity still flows, but the local sampling decision now wins. I treat that decision as a contract worth testing. A collector is not required to reproduce…",
  "key_points": [
    ".NET 10 altered ActivitySamplingResult PropagationData behavior",
    "Child activities now default to Recorded set to false",
    "IsAllDataRequested also set to false for child activities"
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}