[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-sentry-sentry-span-streaming-dart":3,"mdc-af5w72-key":39,"related-repo-sentry-sentry-span-streaming-dart":3519,"related-org-sentry-sentry-span-streaming-dart":3629},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":27,"repoUrl":28,"updatedAt":29,"license":30,"forks":31,"topics":32,"repo":34,"sourceUrl":37,"mdContent":38},"sentry-span-streaming-dart","migrate Dart and Flutter SDK to span streaming","Migrate Dart\u002FFlutter SDK to Sentry span streaming (span-first trace lifecycle). Use when asked to \"enable span streaming\", \"migrate to span streaming\", \"use traceLifecycle stream\", \"use Sentry.startSpan\", or switch from transaction-based to streamed span delivery in a Dart or Flutter project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"sentry","Sentry","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fsentry.png","getsentry",[13,17,20,23,26],{"name":14,"slug":15,"type":16},"Observability","observability","tag",{"name":18,"slug":19,"type":16},"Flutter","flutter",{"name":21,"slug":22,"type":16},"Migration","migration",{"name":24,"slug":25,"type":16},"Dart","dart",{"name":9,"slug":8,"type":16},237,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fsentry-for-ai","2026-07-11T05:53:03.391285","Apache-2.0",30,[33],"tag-production",{"repoUrl":28,"stars":27,"forks":31,"topics":35,"description":36},[33],"Teach your AI coding assistant how to use Sentry - setup, debugging, alerts, and more","https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fsentry-for-ai\u002Ftree\u002FHEAD\u002Fskills-legacy\u002Fsentry-span-streaming-dart","---\nname: sentry-span-streaming-dart\ndescription: Migrate Dart\u002FFlutter SDK to Sentry span streaming (span-first trace lifecycle). Use when asked to \"enable span streaming\", \"migrate to span streaming\", \"use traceLifecycle stream\", \"use Sentry.startSpan\", or switch from transaction-based to streamed span delivery in a Dart or Flutter project.\nlicense: Apache-2.0\ncategory: feature-setup\nparent: sentry-feature-setup\ndisable-model-invocation: true\nallowed-tools: Bash, Read, Edit, Write, Grep, Glob\n---\n\n> [All Skills](..\u002F..\u002FSKILL_TREE.md) > [Feature Setup](..\u002Fsentry-feature-setup\u002FSKILL.md) > Span Streaming (Dart)\n\n# Sentry Span Streaming Migration (Dart\u002FFlutter)\n\nMigrate from the default transaction-based trace lifecycle (`SentryTraceLifecycle.static`) to span streaming (`SentryTraceLifecycle.stream`), where spans are sent individually as they complete instead of being batched into a transaction at the end.\n\nThis skill covers the Dart and Flutter SDKs (`sentry`, `sentry_flutter`, and integration packages such as `sentry_dio`, `sentry_sqflite`, `sentry_drift`). For JavaScript, see [Span Streaming (JavaScript)](..\u002Fsentry-span-streaming-js\u002FSKILL.md). For Python, see [Span Streaming (Python)](..\u002Fsentry-span-streaming-python\u002FSKILL.md).\n\n## Invoke This Skill When\n\n- User asks to \"enable span streaming\" or \"migrate to span streaming\" in a Dart or Flutter project\n- User wants to switch from transaction-based to streamed span delivery\n- User mentions `traceLifecycle`, `SentryTraceLifecycle.stream`, `Sentry.startSpan`, or `SentrySpanV2`\n- User wants lower latency span delivery or per-span processing\n\n---\n\n## Phase 1: Detect\n\n### 1.1 Detect SDK and Version\n\n```bash\n# Which Sentry packages does the project use?\ngrep -n \"sentry\" pubspec.yaml 2>\u002Fdev\u002Fnull\n\n# Resolved versions — span streaming requires >= 9.19.0\ngrep -A8 '^  sentry:' pubspec.lock 2>\u002Fdev\u002Fnull | grep -m1 version\ngrep -A8 '^  sentry_flutter:' pubspec.lock 2>\u002Fdev\u002Fnull | grep -m1 version\n```\n\nSpan streaming requires `sentry` \u002F `sentry_flutter` `>=9.19.0`.\n\n### 1.2 Find Existing Sentry Config and Tracing Usage\n\n```bash\n# Find init calls\ngrep -rn \"SentryFlutter\\.init\\|Sentry\\.init\" lib\u002F bin\u002F test\u002F --include=\"*.dart\" 2>\u002Fdev\u002Fnull | head -10\n\n# Find old transaction API usage (these become no-ops in streaming mode)\ngrep -rn \"startTransaction\\|\\.startChild(\" lib\u002F bin\u002F test\u002F --include=\"*.dart\" 2>\u002Fdev\u002Fnull | head -20\n\n# Find callbacks affected by the migration\ngrep -rn \"beforeSendTransaction\\|beforeSendSpan\\|ignoreSpans\" lib\u002F bin\u002F test\u002F --include=\"*.dart\" 2>\u002Fdev\u002Fnull\n\n# Find untyped span data\u002Ftag usage on transactions\ngrep -rn \"\\.setData(\\|\\.setTag(\" lib\u002F bin\u002F test\u002F --include=\"*.dart\" 2>\u002Fdev\u002Fnull | head -20\n```\n\n### 1.3 Classify the Migration Work\n\n| Finding | Migration Work |\n|---|---|\n| `Sentry.startTransaction(...)` calls | Replace with `Sentry.startSpan` \u002F `Sentry.startSpanSync` \u002F `Sentry.startInactiveSpan` |\n| `span.startChild(...)` calls | Replace with nested `Sentry.startSpan` calls — parenting is automatic via zones |\n| `setData` \u002F `setTag` on spans | Replace with typed `span.setAttribute(...)` \u002F `SentryAttribute` |\n| `beforeSendTransaction` callback | Never called in streaming mode — migrate logic to `beforeSendSpan` or `ignoreSpans` |\n| Existing `beforeSendSpan` \u002F `ignoreSpans` usage | Review against streaming semantics — `beforeSendSpan` is mutation-only, `ignoreSpans` matches names only (see 2.5\u002F2.6) |\n| Only auto-instrumentation (no manual spans) | Just enable the option — integrations switch automatically |\n\n---\n\n## Phase 2: Migrate\n\n**Prerequisites:** `sentry` \u002F `sentry_flutter` `>=9.19.0` with tracing enabled (`tracesSampleRate` or `tracesSampler` configured).\n\n### 2.1 Enable Span Streaming\n\nSet `traceLifecycle` in the init options. This is the only required config change.\n\n```dart\n\u002F\u002F Flutter\nawait SentryFlutter.init((options) {\n  options.dsn = '__DSN__';\n  options.tracesSampleRate = 1.0;\n  options.traceLifecycle = SentryTraceLifecycle.stream;\n}, appRunner: () => runApp(const MyApp()));\n\n\u002F\u002F Plain Dart\nawait Sentry.init((options) {\n  options.dsn = '__DSN__';\n  options.tracesSampleRate = 1.0;\n  options.traceLifecycle = SentryTraceLifecycle.stream;\n});\n```\n\nYou can only use one tracing system at a time:\n\n- In `stream` mode, the transaction APIs (`Sentry.startTransaction`, `ISentrySpan.startChild`) do nothing and log a warning.\n- In `static` mode (the default), the new span APIs (`Sentry.startSpan`) do nothing.\n- Auto-instrumentations automatically switch to the correct API based on this setting.\n\n### 2.2 Replace Transactions with Spans\n\n`Sentry.startSpan` runs an async callback and ends the span when the returned future completes. Nested calls auto-parent through zones — there is no `startChild` equivalent to migrate to; just nest.\n\n```dart\n\u002F\u002F Before (static mode)\nfinal transaction = Sentry.startTransaction('checkout', 'task');\ntry {\n  final child = transaction.startChild('db.query', description: 'load cart');\n  final cart = await loadCart();\n  await child.finish();\n  transaction.setData('cart.item_count', cart.items.length);\n  transaction.status = const SpanStatus.ok();\n} catch (exception) {\n  transaction.status = const SpanStatus.internalError(); \u002F\u002F -> span.status (see below)\n  rethrow;\n} finally {\n  await transaction.finish();\n}\n\n\u002F\u002F After (streaming mode)\nawait Sentry.startSpan('checkout', (span) async {\n  final cart = await Sentry.startSpan('load cart', (_) => loadCart());\n  span.setAttribute('cart.item_count', SentryAttribute.int(cart.items.length));\n});\n```\n\nError handling is automatic: if the callback throws (or the future errors), the span status is set to `SentrySpanStatusV2.error` before the span ends, and the error is rethrown. Otherwise the status defaults to `ok`.\n\nYou can also set the status manually via the `status` setter:\n\n```dart\nspan.status = SentrySpanStatusV2.error;\n```\n\nThere is no untyped `SpanStatus` string equivalent. Explicit statuses from the old API (e.g. `transaction.status = const SpanStatus.internalError()`) migrate to `span.status = SentrySpanStatusV2.error` — though `error` is set automatically on throw and `ok` automatically otherwise, so manual assignment is only needed to override the default.\n\nFor synchronous work, use `Sentry.startSpanSync`:\n\n```dart\nfinal config = Sentry.startSpanSync('parse-config', (_) {\n  return Config.parse(raw);\n});\n```\n\nBoth variants can be freely nested — parent-child relationships resolve correctly across sync\u002Fasync boundaries. If a span is not sampled, the callback still runs and receives a no-op span, so all span operations are safe.\n\n### 2.3 Spans That Outlive a Callback\n\nUse `Sentry.startInactiveSpan` when the work cannot be wrapped in a single callback — widget lifecycles, stream subscriptions, platform channel round-trips. You must call `end()` manually, and other spans do **not** automatically become its children.\n\n```dart\nfinal paymentSpan = Sentry.startInactiveSpan('payment',\n    attributes: {'payment.provider': SentryAttribute.string('stripe')});\n\n\u002F\u002F ...later, from a different entry point\nvoid onDeepLink(Uri uri) {\n  paymentSpan.end();\n}\n```\n\n**Parenting.** `parentSpan` defaults to an internal *unset* sentinel (`const UnsetSentrySpanV2()`), which means \"inherit the currently active span.\" This is explicitly distinct from passing `parentSpan: null`, which forces a root span with no parent. Pass an explicit `SentrySpanV2` to parent under a specific span. (The same default applies to `startSpan` \u002F `startSpanSync`.)\n\n**Retroactive timing.** `startSpan` and `startSpanSync` accept an optional `startTimestamp`, and `span.end(endTimestamp: ...)` accepts an explicit end time. Use these when the real start or end of the work happened before you could create or end the span — for example, a duration measured by a platform channel:\n\n```dart\nfinal paymentSpan = Sentry.startInactiveSpan('payment');\n\u002F\u002F ...native reports it started at `nativeStart` and ended at `nativeEnd`\npaymentSpan.end(endTimestamp: nativeEnd);\n\n\u002F\u002F startTimestamp is available on the callback variants:\nSentry.startSpanSync('replay-import', (_) => importRows(),\n    startTimestamp: measuredStart);\n```\n\n### 2.4 Migrate `setData` \u002F `setTag` to Typed Attributes\n\nStreamed spans use typed attributes instead of untyped data and tags:\n\n```dart\n\u002F\u002F Before\ntransaction.setData('retry_count', 3);\ntransaction.setTag('payment.provider', 'stripe');\n\n\u002F\u002F After\nspan.setAttribute('retry_count', SentryAttribute.int(3));\nspan.setAttributes({\n  'payment.provider': SentryAttribute.string('stripe'),\n  'cache.hit': SentryAttribute.bool(true),\n  'response_time_ms': SentryAttribute.double(12.5),\n});\nspan.removeAttribute('old_key');\n```\n\n| Factory | Dart Type |\n|---|---|\n| `SentryAttribute.string(v)` | `String` |\n| `SentryAttribute.int(v)` | `int` |\n| `SentryAttribute.bool(v)` | `bool` |\n| `SentryAttribute.double(v)` | `double` |\n\n### 2.5 Migrate `beforeSendTransaction`\n\n`beforeSendTransaction` has **no effect** in streaming mode — transactions are never created, so the callback is never invoked. Migrate its logic:\n\n| Use Case | Streaming Replacement |\n|---|---|\n| Drop spans by name | `ignoreSpans` with `IgnoreSpanRule` |\n| Scrub sensitive data \u002F PII | `beforeSendSpan` |\n| Modify span data before send | `beforeSendSpan` |\n\n`beforeSendSpan` receives each `SentrySpanV2` before it is sent. Unlike other `beforeSend` callbacks, it **cannot drop spans** — it is mutation-only (`FutureOr\u003Cvoid>` return). Use `ignoreSpans` to drop.\n\n```dart\nawait Sentry.init((options) {\n  options.traceLifecycle = SentryTraceLifecycle.stream;\n  options.beforeSendSpan = (span) {\n    span.removeAttribute('http.request.body');\n  };\n});\n```\n\nRemove the `beforeSendTransaction` option after migrating its logic.\n\n### 2.6 Configure `ignoreSpans` (Optional)\n\n`ignoreSpans` drops spans by name before sampling. Matching is name-only (attribute matching is not yet supported in the Dart SDK).\n\n```dart\noptions.ignoreSpans = [\n  IgnoreSpanRule.nameEquals('health-check'),\n  IgnoreSpanRule.nameStartsWith('internal.'),\n  IgnoreSpanRule.nameContains('metrics'),\n  IgnoreSpanRule.nameEndsWith('.bg'),\n];\n```\n\n| Factory | Matches |\n|---|---|\n| `IgnoreSpanRule.nameEquals(String)` | Exact span name |\n| `IgnoreSpanRule.nameStartsWith(Pattern)` | Name prefix (String or RegExp) |\n| `IgnoreSpanRule.nameContains(Pattern)` | Name substring (String or RegExp) |\n| `IgnoreSpanRule.nameEndsWith(String)` | Name suffix |\n\nWhen an ignored span has children, the children are re-parented to the nearest recording ancestor rather than dropped.\n\n### 2.7 Flutter Auto-Instrumentation\n\nNo code changes needed: frames tracking, app start, TTID\u002FTTFD, navigation, user interaction, HTTP, database, and GraphQL instrumentations all switch to the streaming API automatically when `traceLifecycle` is `stream`.\n\n### 2.8 Sampling\n\n`tracesSampleRate` and `tracesSampler` work unchanged. Only **root spans** are sampled; child spans inherit the root's decision. When a root span is not sampled, the callback still executes with a no-op span.\n\n---\n\n## Phase 3: Verify\n\n### 3.1 Static Check\n\n```bash\ndart analyze 2>&1 | head -30\n# or for Flutter projects\nflutter analyze 2>&1 | head -30\n```\n\nExpect no new analyzer errors from the migration.\n\n### 3.2 Runtime Verification\n\nInstruct the user to verify with `options.debug = true` or network inspection:\n\n1. **Envelope content type**: span envelopes are sent with content type `application\u002Fvnd.sentry.items.span.v2+json` instead of transaction envelopes. Spans are buffered briefly and flushed in batches, so expect a short delay before envelopes appear.\n2. **Sentry dashboard**: spans appear in the Traces view shortly after each span completes, without waiting for a whole transaction to finish.\n3. **No-op warnings**: a log line `startTransaction is not supported when traceLifecycle is 'stream'` means old transaction API calls remain — find and migrate them.\n\n### 3.3 Common Issues\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| Log: `startTransaction is not supported when traceLifecycle is 'stream'` | Old transaction API still called in streaming mode | Replace with `Sentry.startSpan` \u002F `startSpanSync` |\n| `Sentry.startSpan` produces no spans | `traceLifecycle` still `static` (the default), or tracing disabled | Set `options.traceLifecycle = SentryTraceLifecycle.stream` and a `tracesSampleRate` |\n| `beforeSendTransaction` never called | Expected in streaming mode | Migrate logic to `beforeSendSpan` or `ignoreSpans`, then remove it |\n| Returning a value from `beforeSendSpan` to drop a span does nothing | `beforeSendSpan` is mutation-only (`FutureOr\u003Cvoid>` return) | Use `ignoreSpans` to drop spans |\n| Compile error: `startSpan` callback type mismatch | Callback must return `Future\u003CT>` for `startSpan` | Use `startSpanSync` for synchronous work |\n\n---\n\n## Quick Reference\n\n### Minimal Flutter Setup\n\n```dart\nimport 'package:flutter\u002Fwidgets.dart';\nimport 'package:sentry_flutter\u002Fsentry_flutter.dart';\n\nFuture\u003Cvoid> main() async {\n  await SentryFlutter.init((options) {\n    options.dsn = '__DSN__';\n    options.tracesSampleRate = 1.0;\n    options.traceLifecycle = SentryTraceLifecycle.stream;\n  }, appRunner: () => runApp(const MyApp()));\n\n  await Sentry.startSpan('load-config', (span) async {\n    span.setAttribute('source', SentryAttribute.string('remote'));\n    await loadConfig();\n  });\n}\n```\n\n### Minimal Dart Setup\n\n```dart\nimport 'package:sentry\u002Fsentry.dart';\n\nFuture\u003Cvoid> main() async {\n  await Sentry.init((options) {\n    options.dsn = '__DSN__';\n    options.tracesSampleRate = 1.0;\n    options.traceLifecycle = SentryTraceLifecycle.stream;\n  });\n\n  await Sentry.startSpan('main-task', (span) async {\n    span.setAttribute('job.id', SentryAttribute.string('42'));\n    await doWork();\n  });\n}\n```\n\n### Span Control Reference\n\n```dart\n\u002F\u002F Status (auto-set to error on throw, ok otherwise)\nspan.status = SentrySpanStatusV2.error; \u002F\u002F error | ok\n\n\u002F\u002F Retroactive timing\nSentry.startSpanSync('task', (_) => work(), startTimestamp: start); \u002F\u002F also on startSpan\nspan.end(endTimestamp: end);                                        \u002F\u002F on any span\n\n\u002F\u002F Parenting (startSpan \u002F startSpanSync \u002F startInactiveSpan)\n\u002F\u002F default: inherit active span | parentSpan: someSpan -> explicit parent | parentSpan: null -> root\n```\n\n### Full Migration Checklist\n\n- [ ] SDK version is `>=9.19.0` (`sentry` \u002F `sentry_flutter`)\n- [ ] `options.traceLifecycle = SentryTraceLifecycle.stream` set in every init call\n- [ ] All `Sentry.startTransaction` calls replaced with `Sentry.startSpan` \u002F `startSpanSync` \u002F `startInactiveSpan`\n- [ ] All `startChild` calls replaced with nested `Sentry.startSpan` calls\n- [ ] `setData` \u002F `setTag` on spans replaced with typed `setAttribute` \u002F `SentryAttribute`\n- [ ] `beforeSendTransaction` logic migrated to `beforeSendSpan` or `ignoreSpans`, option removed\n- [ ] `startInactiveSpan` spans have a guaranteed `end()` call path\n- [ ] `dart analyze` \u002F `flutter analyze` passes\n- [ ] Spans visible in Sentry Traces view\n",{"data":40,"body":45},{"name":4,"description":6,"license":30,"category":41,"parent":42,"disable-model-invocation":43,"allowed-tools":44},"feature-setup","sentry-feature-setup",true,"Bash, Read, Edit, Write, Grep, Glob",{"type":46,"children":47},"root",[48,75,82,104,162,169,221,225,231,238,440,466,472,822,828,1044,1047,1053,1097,1103,1115,1225,1230,1285,1291,1309,1481,1501,1514,1528,1572,1584,1614,1619,1625,1652,1713,1776,1815,1877,1896,1901,2002,2108,2119,2136,2214,2261,2313,2325,2338,2348,2403,2492,2497,2503,2521,2527,2550,2553,2559,2565,2637,2642,2648,2661,2711,2717,2947,2950,2956,2962,3086,3092,3202,3208,3285,3291,3513],{"type":49,"tag":50,"props":51,"children":52},"element","blockquote",{},[53],{"type":49,"tag":54,"props":55,"children":56},"p",{},[57,65,67,73],{"type":49,"tag":58,"props":59,"children":61},"a",{"href":60},"..\u002F..\u002FSKILL_TREE.md",[62],{"type":63,"value":64},"text","All Skills",{"type":63,"value":66}," > ",{"type":49,"tag":58,"props":68,"children":70},{"href":69},"..\u002Fsentry-feature-setup\u002FSKILL.md",[71],{"type":63,"value":72},"Feature Setup",{"type":63,"value":74}," > Span Streaming (Dart)",{"type":49,"tag":76,"props":77,"children":79},"h1",{"id":78},"sentry-span-streaming-migration-dartflutter",[80],{"type":63,"value":81},"Sentry Span Streaming Migration (Dart\u002FFlutter)",{"type":49,"tag":54,"props":83,"children":84},{},[85,87,94,96,102],{"type":63,"value":86},"Migrate from the default transaction-based trace lifecycle (",{"type":49,"tag":88,"props":89,"children":91},"code",{"className":90},[],[92],{"type":63,"value":93},"SentryTraceLifecycle.static",{"type":63,"value":95},") to span streaming (",{"type":49,"tag":88,"props":97,"children":99},{"className":98},[],[100],{"type":63,"value":101},"SentryTraceLifecycle.stream",{"type":63,"value":103},"), where spans are sent individually as they complete instead of being batched into a transaction at the end.",{"type":49,"tag":54,"props":105,"children":106},{},[107,109,114,116,122,124,130,131,137,138,144,146,152,154,160],{"type":63,"value":108},"This skill covers the Dart and Flutter SDKs (",{"type":49,"tag":88,"props":110,"children":112},{"className":111},[],[113],{"type":63,"value":8},{"type":63,"value":115},", ",{"type":49,"tag":88,"props":117,"children":119},{"className":118},[],[120],{"type":63,"value":121},"sentry_flutter",{"type":63,"value":123},", and integration packages such as ",{"type":49,"tag":88,"props":125,"children":127},{"className":126},[],[128],{"type":63,"value":129},"sentry_dio",{"type":63,"value":115},{"type":49,"tag":88,"props":132,"children":134},{"className":133},[],[135],{"type":63,"value":136},"sentry_sqflite",{"type":63,"value":115},{"type":49,"tag":88,"props":139,"children":141},{"className":140},[],[142],{"type":63,"value":143},"sentry_drift",{"type":63,"value":145},"). For JavaScript, see ",{"type":49,"tag":58,"props":147,"children":149},{"href":148},"..\u002Fsentry-span-streaming-js\u002FSKILL.md",[150],{"type":63,"value":151},"Span Streaming (JavaScript)",{"type":63,"value":153},". For Python, see ",{"type":49,"tag":58,"props":155,"children":157},{"href":156},"..\u002Fsentry-span-streaming-python\u002FSKILL.md",[158],{"type":63,"value":159},"Span Streaming (Python)",{"type":63,"value":161},".",{"type":49,"tag":163,"props":164,"children":166},"h2",{"id":165},"invoke-this-skill-when",[167],{"type":63,"value":168},"Invoke This Skill When",{"type":49,"tag":170,"props":171,"children":172},"ul",{},[173,179,184,216],{"type":49,"tag":174,"props":175,"children":176},"li",{},[177],{"type":63,"value":178},"User asks to \"enable span streaming\" or \"migrate to span streaming\" in a Dart or Flutter project",{"type":49,"tag":174,"props":180,"children":181},{},[182],{"type":63,"value":183},"User wants to switch from transaction-based to streamed span delivery",{"type":49,"tag":174,"props":185,"children":186},{},[187,189,195,196,201,202,208,210],{"type":63,"value":188},"User mentions ",{"type":49,"tag":88,"props":190,"children":192},{"className":191},[],[193],{"type":63,"value":194},"traceLifecycle",{"type":63,"value":115},{"type":49,"tag":88,"props":197,"children":199},{"className":198},[],[200],{"type":63,"value":101},{"type":63,"value":115},{"type":49,"tag":88,"props":203,"children":205},{"className":204},[],[206],{"type":63,"value":207},"Sentry.startSpan",{"type":63,"value":209},", or ",{"type":49,"tag":88,"props":211,"children":213},{"className":212},[],[214],{"type":63,"value":215},"SentrySpanV2",{"type":49,"tag":174,"props":217,"children":218},{},[219],{"type":63,"value":220},"User wants lower latency span delivery or per-span processing",{"type":49,"tag":222,"props":223,"children":224},"hr",{},[],{"type":49,"tag":163,"props":226,"children":228},{"id":227},"phase-1-detect",[229],{"type":63,"value":230},"Phase 1: Detect",{"type":49,"tag":232,"props":233,"children":235},"h3",{"id":234},"_11-detect-sdk-and-version",[236],{"type":63,"value":237},"1.1 Detect SDK and Version",{"type":49,"tag":239,"props":240,"children":245},"pre",{"className":241,"code":242,"language":243,"meta":244,"style":244},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Which Sentry packages does the project use?\ngrep -n \"sentry\" pubspec.yaml 2>\u002Fdev\u002Fnull\n\n# Resolved versions — span streaming requires >= 9.19.0\ngrep -A8 '^  sentry:' pubspec.lock 2>\u002Fdev\u002Fnull | grep -m1 version\ngrep -A8 '^  sentry_flutter:' pubspec.lock 2>\u002Fdev\u002Fnull | grep -m1 version\n","bash","",[246],{"type":49,"tag":88,"props":247,"children":248},{"__ignoreMap":244},[249,261,307,316,325,387],{"type":49,"tag":250,"props":251,"children":254},"span",{"class":252,"line":253},"line",1,[255],{"type":49,"tag":250,"props":256,"children":258},{"style":257},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[259],{"type":63,"value":260},"# Which Sentry packages does the project use?\n",{"type":49,"tag":250,"props":262,"children":264},{"class":252,"line":263},2,[265,271,277,283,287,292,297,302],{"type":49,"tag":250,"props":266,"children":268},{"style":267},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[269],{"type":63,"value":270},"grep",{"type":49,"tag":250,"props":272,"children":274},{"style":273},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[275],{"type":63,"value":276}," -n",{"type":49,"tag":250,"props":278,"children":280},{"style":279},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[281],{"type":63,"value":282}," \"",{"type":49,"tag":250,"props":284,"children":285},{"style":273},[286],{"type":63,"value":8},{"type":49,"tag":250,"props":288,"children":289},{"style":279},[290],{"type":63,"value":291},"\"",{"type":49,"tag":250,"props":293,"children":294},{"style":273},[295],{"type":63,"value":296}," pubspec.yaml",{"type":49,"tag":250,"props":298,"children":299},{"style":279},[300],{"type":63,"value":301}," 2>",{"type":49,"tag":250,"props":303,"children":304},{"style":273},[305],{"type":63,"value":306},"\u002Fdev\u002Fnull\n",{"type":49,"tag":250,"props":308,"children":310},{"class":252,"line":309},3,[311],{"type":49,"tag":250,"props":312,"children":313},{"emptyLinePlaceholder":43},[314],{"type":63,"value":315},"\n",{"type":49,"tag":250,"props":317,"children":319},{"class":252,"line":318},4,[320],{"type":49,"tag":250,"props":321,"children":322},{"style":257},[323],{"type":63,"value":324},"# Resolved versions — span streaming requires >= 9.19.0\n",{"type":49,"tag":250,"props":326,"children":328},{"class":252,"line":327},5,[329,333,338,343,348,353,358,362,367,372,377,382],{"type":49,"tag":250,"props":330,"children":331},{"style":267},[332],{"type":63,"value":270},{"type":49,"tag":250,"props":334,"children":335},{"style":273},[336],{"type":63,"value":337}," -A8",{"type":49,"tag":250,"props":339,"children":340},{"style":279},[341],{"type":63,"value":342}," '",{"type":49,"tag":250,"props":344,"children":345},{"style":273},[346],{"type":63,"value":347},"^  sentry:",{"type":49,"tag":250,"props":349,"children":350},{"style":279},[351],{"type":63,"value":352},"'",{"type":49,"tag":250,"props":354,"children":355},{"style":273},[356],{"type":63,"value":357}," pubspec.lock",{"type":49,"tag":250,"props":359,"children":360},{"style":279},[361],{"type":63,"value":301},{"type":49,"tag":250,"props":363,"children":364},{"style":273},[365],{"type":63,"value":366},"\u002Fdev\u002Fnull",{"type":49,"tag":250,"props":368,"children":369},{"style":279},[370],{"type":63,"value":371}," |",{"type":49,"tag":250,"props":373,"children":374},{"style":267},[375],{"type":63,"value":376}," grep",{"type":49,"tag":250,"props":378,"children":379},{"style":273},[380],{"type":63,"value":381}," -m1",{"type":49,"tag":250,"props":383,"children":384},{"style":273},[385],{"type":63,"value":386}," version\n",{"type":49,"tag":250,"props":388,"children":390},{"class":252,"line":389},6,[391,395,399,403,408,412,416,420,424,428,432,436],{"type":49,"tag":250,"props":392,"children":393},{"style":267},[394],{"type":63,"value":270},{"type":49,"tag":250,"props":396,"children":397},{"style":273},[398],{"type":63,"value":337},{"type":49,"tag":250,"props":400,"children":401},{"style":279},[402],{"type":63,"value":342},{"type":49,"tag":250,"props":404,"children":405},{"style":273},[406],{"type":63,"value":407},"^  sentry_flutter:",{"type":49,"tag":250,"props":409,"children":410},{"style":279},[411],{"type":63,"value":352},{"type":49,"tag":250,"props":413,"children":414},{"style":273},[415],{"type":63,"value":357},{"type":49,"tag":250,"props":417,"children":418},{"style":279},[419],{"type":63,"value":301},{"type":49,"tag":250,"props":421,"children":422},{"style":273},[423],{"type":63,"value":366},{"type":49,"tag":250,"props":425,"children":426},{"style":279},[427],{"type":63,"value":371},{"type":49,"tag":250,"props":429,"children":430},{"style":267},[431],{"type":63,"value":376},{"type":49,"tag":250,"props":433,"children":434},{"style":273},[435],{"type":63,"value":381},{"type":49,"tag":250,"props":437,"children":438},{"style":273},[439],{"type":63,"value":386},{"type":49,"tag":54,"props":441,"children":442},{},[443,445,450,452,457,459,465],{"type":63,"value":444},"Span streaming requires ",{"type":49,"tag":88,"props":446,"children":448},{"className":447},[],[449],{"type":63,"value":8},{"type":63,"value":451}," \u002F ",{"type":49,"tag":88,"props":453,"children":455},{"className":454},[],[456],{"type":63,"value":121},{"type":63,"value":458}," ",{"type":49,"tag":88,"props":460,"children":462},{"className":461},[],[463],{"type":63,"value":464},">=9.19.0",{"type":63,"value":161},{"type":49,"tag":232,"props":467,"children":469},{"id":468},"_12-find-existing-sentry-config-and-tracing-usage",[470],{"type":63,"value":471},"1.2 Find Existing Sentry Config and Tracing Usage",{"type":49,"tag":239,"props":473,"children":475},{"className":241,"code":474,"language":243,"meta":244,"style":244},"# Find init calls\ngrep -rn \"SentryFlutter\\.init\\|Sentry\\.init\" lib\u002F bin\u002F test\u002F --include=\"*.dart\" 2>\u002Fdev\u002Fnull | head -10\n\n# Find old transaction API usage (these become no-ops in streaming mode)\ngrep -rn \"startTransaction\\|\\.startChild(\" lib\u002F bin\u002F test\u002F --include=\"*.dart\" 2>\u002Fdev\u002Fnull | head -20\n\n# Find callbacks affected by the migration\ngrep -rn \"beforeSendTransaction\\|beforeSendSpan\\|ignoreSpans\" lib\u002F bin\u002F test\u002F --include=\"*.dart\" 2>\u002Fdev\u002Fnull\n\n# Find untyped span data\u002Ftag usage on transactions\ngrep -rn \"\\.setData(\\|\\.setTag(\" lib\u002F bin\u002F test\u002F --include=\"*.dart\" 2>\u002Fdev\u002Fnull | head -20\n",[476],{"type":49,"tag":88,"props":477,"children":478},{"__ignoreMap":244},[479,487,567,574,582,655,662,671,732,740,749],{"type":49,"tag":250,"props":480,"children":481},{"class":252,"line":253},[482],{"type":49,"tag":250,"props":483,"children":484},{"style":257},[485],{"type":63,"value":486},"# Find init calls\n",{"type":49,"tag":250,"props":488,"children":489},{"class":252,"line":263},[490,494,499,503,508,512,517,522,527,532,536,541,545,549,553,557,562],{"type":49,"tag":250,"props":491,"children":492},{"style":267},[493],{"type":63,"value":270},{"type":49,"tag":250,"props":495,"children":496},{"style":273},[497],{"type":63,"value":498}," -rn",{"type":49,"tag":250,"props":500,"children":501},{"style":279},[502],{"type":63,"value":282},{"type":49,"tag":250,"props":504,"children":505},{"style":273},[506],{"type":63,"value":507},"SentryFlutter\\.init\\|Sentry\\.init",{"type":49,"tag":250,"props":509,"children":510},{"style":279},[511],{"type":63,"value":291},{"type":49,"tag":250,"props":513,"children":514},{"style":273},[515],{"type":63,"value":516}," lib\u002F",{"type":49,"tag":250,"props":518,"children":519},{"style":273},[520],{"type":63,"value":521}," bin\u002F",{"type":49,"tag":250,"props":523,"children":524},{"style":273},[525],{"type":63,"value":526}," test\u002F",{"type":49,"tag":250,"props":528,"children":529},{"style":273},[530],{"type":63,"value":531}," --include=",{"type":49,"tag":250,"props":533,"children":534},{"style":279},[535],{"type":63,"value":291},{"type":49,"tag":250,"props":537,"children":538},{"style":273},[539],{"type":63,"value":540},"*.dart",{"type":49,"tag":250,"props":542,"children":543},{"style":279},[544],{"type":63,"value":291},{"type":49,"tag":250,"props":546,"children":547},{"style":279},[548],{"type":63,"value":301},{"type":49,"tag":250,"props":550,"children":551},{"style":273},[552],{"type":63,"value":366},{"type":49,"tag":250,"props":554,"children":555},{"style":279},[556],{"type":63,"value":371},{"type":49,"tag":250,"props":558,"children":559},{"style":267},[560],{"type":63,"value":561}," head",{"type":49,"tag":250,"props":563,"children":564},{"style":273},[565],{"type":63,"value":566}," -10\n",{"type":49,"tag":250,"props":568,"children":569},{"class":252,"line":309},[570],{"type":49,"tag":250,"props":571,"children":572},{"emptyLinePlaceholder":43},[573],{"type":63,"value":315},{"type":49,"tag":250,"props":575,"children":576},{"class":252,"line":318},[577],{"type":49,"tag":250,"props":578,"children":579},{"style":257},[580],{"type":63,"value":581},"# Find old transaction API usage (these become no-ops in streaming mode)\n",{"type":49,"tag":250,"props":583,"children":584},{"class":252,"line":327},[585,589,593,597,602,606,610,614,618,622,626,630,634,638,642,646,650],{"type":49,"tag":250,"props":586,"children":587},{"style":267},[588],{"type":63,"value":270},{"type":49,"tag":250,"props":590,"children":591},{"style":273},[592],{"type":63,"value":498},{"type":49,"tag":250,"props":594,"children":595},{"style":279},[596],{"type":63,"value":282},{"type":49,"tag":250,"props":598,"children":599},{"style":273},[600],{"type":63,"value":601},"startTransaction\\|\\.startChild(",{"type":49,"tag":250,"props":603,"children":604},{"style":279},[605],{"type":63,"value":291},{"type":49,"tag":250,"props":607,"children":608},{"style":273},[609],{"type":63,"value":516},{"type":49,"tag":250,"props":611,"children":612},{"style":273},[613],{"type":63,"value":521},{"type":49,"tag":250,"props":615,"children":616},{"style":273},[617],{"type":63,"value":526},{"type":49,"tag":250,"props":619,"children":620},{"style":273},[621],{"type":63,"value":531},{"type":49,"tag":250,"props":623,"children":624},{"style":279},[625],{"type":63,"value":291},{"type":49,"tag":250,"props":627,"children":628},{"style":273},[629],{"type":63,"value":540},{"type":49,"tag":250,"props":631,"children":632},{"style":279},[633],{"type":63,"value":291},{"type":49,"tag":250,"props":635,"children":636},{"style":279},[637],{"type":63,"value":301},{"type":49,"tag":250,"props":639,"children":640},{"style":273},[641],{"type":63,"value":366},{"type":49,"tag":250,"props":643,"children":644},{"style":279},[645],{"type":63,"value":371},{"type":49,"tag":250,"props":647,"children":648},{"style":267},[649],{"type":63,"value":561},{"type":49,"tag":250,"props":651,"children":652},{"style":273},[653],{"type":63,"value":654}," -20\n",{"type":49,"tag":250,"props":656,"children":657},{"class":252,"line":389},[658],{"type":49,"tag":250,"props":659,"children":660},{"emptyLinePlaceholder":43},[661],{"type":63,"value":315},{"type":49,"tag":250,"props":663,"children":665},{"class":252,"line":664},7,[666],{"type":49,"tag":250,"props":667,"children":668},{"style":257},[669],{"type":63,"value":670},"# Find callbacks affected by the migration\n",{"type":49,"tag":250,"props":672,"children":674},{"class":252,"line":673},8,[675,679,683,687,692,696,700,704,708,712,716,720,724,728],{"type":49,"tag":250,"props":676,"children":677},{"style":267},[678],{"type":63,"value":270},{"type":49,"tag":250,"props":680,"children":681},{"style":273},[682],{"type":63,"value":498},{"type":49,"tag":250,"props":684,"children":685},{"style":279},[686],{"type":63,"value":282},{"type":49,"tag":250,"props":688,"children":689},{"style":273},[690],{"type":63,"value":691},"beforeSendTransaction\\|beforeSendSpan\\|ignoreSpans",{"type":49,"tag":250,"props":693,"children":694},{"style":279},[695],{"type":63,"value":291},{"type":49,"tag":250,"props":697,"children":698},{"style":273},[699],{"type":63,"value":516},{"type":49,"tag":250,"props":701,"children":702},{"style":273},[703],{"type":63,"value":521},{"type":49,"tag":250,"props":705,"children":706},{"style":273},[707],{"type":63,"value":526},{"type":49,"tag":250,"props":709,"children":710},{"style":273},[711],{"type":63,"value":531},{"type":49,"tag":250,"props":713,"children":714},{"style":279},[715],{"type":63,"value":291},{"type":49,"tag":250,"props":717,"children":718},{"style":273},[719],{"type":63,"value":540},{"type":49,"tag":250,"props":721,"children":722},{"style":279},[723],{"type":63,"value":291},{"type":49,"tag":250,"props":725,"children":726},{"style":279},[727],{"type":63,"value":301},{"type":49,"tag":250,"props":729,"children":730},{"style":273},[731],{"type":63,"value":306},{"type":49,"tag":250,"props":733,"children":735},{"class":252,"line":734},9,[736],{"type":49,"tag":250,"props":737,"children":738},{"emptyLinePlaceholder":43},[739],{"type":63,"value":315},{"type":49,"tag":250,"props":741,"children":743},{"class":252,"line":742},10,[744],{"type":49,"tag":250,"props":745,"children":746},{"style":257},[747],{"type":63,"value":748},"# Find untyped span data\u002Ftag usage on transactions\n",{"type":49,"tag":250,"props":750,"children":752},{"class":252,"line":751},11,[753,757,761,765,770,774,778,782,786,790,794,798,802,806,810,814,818],{"type":49,"tag":250,"props":754,"children":755},{"style":267},[756],{"type":63,"value":270},{"type":49,"tag":250,"props":758,"children":759},{"style":273},[760],{"type":63,"value":498},{"type":49,"tag":250,"props":762,"children":763},{"style":279},[764],{"type":63,"value":282},{"type":49,"tag":250,"props":766,"children":767},{"style":273},[768],{"type":63,"value":769},"\\.setData(\\|\\.setTag(",{"type":49,"tag":250,"props":771,"children":772},{"style":279},[773],{"type":63,"value":291},{"type":49,"tag":250,"props":775,"children":776},{"style":273},[777],{"type":63,"value":516},{"type":49,"tag":250,"props":779,"children":780},{"style":273},[781],{"type":63,"value":521},{"type":49,"tag":250,"props":783,"children":784},{"style":273},[785],{"type":63,"value":526},{"type":49,"tag":250,"props":787,"children":788},{"style":273},[789],{"type":63,"value":531},{"type":49,"tag":250,"props":791,"children":792},{"style":279},[793],{"type":63,"value":291},{"type":49,"tag":250,"props":795,"children":796},{"style":273},[797],{"type":63,"value":540},{"type":49,"tag":250,"props":799,"children":800},{"style":279},[801],{"type":63,"value":291},{"type":49,"tag":250,"props":803,"children":804},{"style":279},[805],{"type":63,"value":301},{"type":49,"tag":250,"props":807,"children":808},{"style":273},[809],{"type":63,"value":366},{"type":49,"tag":250,"props":811,"children":812},{"style":279},[813],{"type":63,"value":371},{"type":49,"tag":250,"props":815,"children":816},{"style":267},[817],{"type":63,"value":561},{"type":49,"tag":250,"props":819,"children":820},{"style":273},[821],{"type":63,"value":654},{"type":49,"tag":232,"props":823,"children":825},{"id":824},"_13-classify-the-migration-work",[826],{"type":63,"value":827},"1.3 Classify the Migration Work",{"type":49,"tag":829,"props":830,"children":831},"table",{},[832,851],{"type":49,"tag":833,"props":834,"children":835},"thead",{},[836],{"type":49,"tag":837,"props":838,"children":839},"tr",{},[840,846],{"type":49,"tag":841,"props":842,"children":843},"th",{},[844],{"type":63,"value":845},"Finding",{"type":49,"tag":841,"props":847,"children":848},{},[849],{"type":63,"value":850},"Migration Work",{"type":49,"tag":852,"props":853,"children":854},"tbody",{},[855,894,919,958,991,1031],{"type":49,"tag":837,"props":856,"children":857},{},[858,870],{"type":49,"tag":859,"props":860,"children":861},"td",{},[862,868],{"type":49,"tag":88,"props":863,"children":865},{"className":864},[],[866],{"type":63,"value":867},"Sentry.startTransaction(...)",{"type":63,"value":869}," calls",{"type":49,"tag":859,"props":871,"children":872},{},[873,875,880,881,887,888],{"type":63,"value":874},"Replace with ",{"type":49,"tag":88,"props":876,"children":878},{"className":877},[],[879],{"type":63,"value":207},{"type":63,"value":451},{"type":49,"tag":88,"props":882,"children":884},{"className":883},[],[885],{"type":63,"value":886},"Sentry.startSpanSync",{"type":63,"value":451},{"type":49,"tag":88,"props":889,"children":891},{"className":890},[],[892],{"type":63,"value":893},"Sentry.startInactiveSpan",{"type":49,"tag":837,"props":895,"children":896},{},[897,907],{"type":49,"tag":859,"props":898,"children":899},{},[900,906],{"type":49,"tag":88,"props":901,"children":903},{"className":902},[],[904],{"type":63,"value":905},"span.startChild(...)",{"type":63,"value":869},{"type":49,"tag":859,"props":908,"children":909},{},[910,912,917],{"type":63,"value":911},"Replace with nested ",{"type":49,"tag":88,"props":913,"children":915},{"className":914},[],[916],{"type":63,"value":207},{"type":63,"value":918}," calls — parenting is automatic via zones",{"type":49,"tag":837,"props":920,"children":921},{},[922,940],{"type":49,"tag":859,"props":923,"children":924},{},[925,931,932,938],{"type":49,"tag":88,"props":926,"children":928},{"className":927},[],[929],{"type":63,"value":930},"setData",{"type":63,"value":451},{"type":49,"tag":88,"props":933,"children":935},{"className":934},[],[936],{"type":63,"value":937},"setTag",{"type":63,"value":939}," on spans",{"type":49,"tag":859,"props":941,"children":942},{},[943,945,951,952],{"type":63,"value":944},"Replace with typed ",{"type":49,"tag":88,"props":946,"children":948},{"className":947},[],[949],{"type":63,"value":950},"span.setAttribute(...)",{"type":63,"value":451},{"type":49,"tag":88,"props":953,"children":955},{"className":954},[],[956],{"type":63,"value":957},"SentryAttribute",{"type":49,"tag":837,"props":959,"children":960},{},[961,972],{"type":49,"tag":859,"props":962,"children":963},{},[964,970],{"type":49,"tag":88,"props":965,"children":967},{"className":966},[],[968],{"type":63,"value":969},"beforeSendTransaction",{"type":63,"value":971}," callback",{"type":49,"tag":859,"props":973,"children":974},{},[975,977,983,985],{"type":63,"value":976},"Never called in streaming mode — migrate logic to ",{"type":49,"tag":88,"props":978,"children":980},{"className":979},[],[981],{"type":63,"value":982},"beforeSendSpan",{"type":63,"value":984}," or ",{"type":49,"tag":88,"props":986,"children":988},{"className":987},[],[989],{"type":63,"value":990},"ignoreSpans",{"type":49,"tag":837,"props":992,"children":993},{},[994,1012],{"type":49,"tag":859,"props":995,"children":996},{},[997,999,1004,1005,1010],{"type":63,"value":998},"Existing ",{"type":49,"tag":88,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":63,"value":982},{"type":63,"value":451},{"type":49,"tag":88,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":63,"value":990},{"type":63,"value":1011}," usage",{"type":49,"tag":859,"props":1013,"children":1014},{},[1015,1017,1022,1024,1029],{"type":63,"value":1016},"Review against streaming semantics — ",{"type":49,"tag":88,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":63,"value":982},{"type":63,"value":1023}," is mutation-only, ",{"type":49,"tag":88,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":63,"value":990},{"type":63,"value":1030}," matches names only (see 2.5\u002F2.6)",{"type":49,"tag":837,"props":1032,"children":1033},{},[1034,1039],{"type":49,"tag":859,"props":1035,"children":1036},{},[1037],{"type":63,"value":1038},"Only auto-instrumentation (no manual spans)",{"type":49,"tag":859,"props":1040,"children":1041},{},[1042],{"type":63,"value":1043},"Just enable the option — integrations switch automatically",{"type":49,"tag":222,"props":1045,"children":1046},{},[],{"type":49,"tag":163,"props":1048,"children":1050},{"id":1049},"phase-2-migrate",[1051],{"type":63,"value":1052},"Phase 2: Migrate",{"type":49,"tag":54,"props":1054,"children":1055},{},[1056,1062,1063,1068,1069,1074,1075,1080,1082,1088,1089,1095],{"type":49,"tag":1057,"props":1058,"children":1059},"strong",{},[1060],{"type":63,"value":1061},"Prerequisites:",{"type":63,"value":458},{"type":49,"tag":88,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":63,"value":8},{"type":63,"value":451},{"type":49,"tag":88,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":63,"value":121},{"type":63,"value":458},{"type":49,"tag":88,"props":1076,"children":1078},{"className":1077},[],[1079],{"type":63,"value":464},{"type":63,"value":1081}," with tracing enabled (",{"type":49,"tag":88,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":63,"value":1087},"tracesSampleRate",{"type":63,"value":984},{"type":49,"tag":88,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":63,"value":1094},"tracesSampler",{"type":63,"value":1096}," configured).",{"type":49,"tag":232,"props":1098,"children":1100},{"id":1099},"_21-enable-span-streaming",[1101],{"type":63,"value":1102},"2.1 Enable Span Streaming",{"type":49,"tag":54,"props":1104,"children":1105},{},[1106,1108,1113],{"type":63,"value":1107},"Set ",{"type":49,"tag":88,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":63,"value":194},{"type":63,"value":1114}," in the init options. This is the only required config change.",{"type":49,"tag":239,"props":1116,"children":1119},{"className":1117,"code":1118,"language":25,"meta":244,"style":244},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Flutter\nawait SentryFlutter.init((options) {\n  options.dsn = '__DSN__';\n  options.tracesSampleRate = 1.0;\n  options.traceLifecycle = SentryTraceLifecycle.stream;\n}, appRunner: () => runApp(const MyApp()));\n\n\u002F\u002F Plain Dart\nawait Sentry.init((options) {\n  options.dsn = '__DSN__';\n  options.tracesSampleRate = 1.0;\n  options.traceLifecycle = SentryTraceLifecycle.stream;\n});\n",[1120],{"type":49,"tag":88,"props":1121,"children":1122},{"__ignoreMap":244},[1123,1131,1139,1147,1155,1163,1171,1178,1186,1194,1201,1208,1216],{"type":49,"tag":250,"props":1124,"children":1125},{"class":252,"line":253},[1126],{"type":49,"tag":250,"props":1127,"children":1128},{},[1129],{"type":63,"value":1130},"\u002F\u002F Flutter\n",{"type":49,"tag":250,"props":1132,"children":1133},{"class":252,"line":263},[1134],{"type":49,"tag":250,"props":1135,"children":1136},{},[1137],{"type":63,"value":1138},"await SentryFlutter.init((options) {\n",{"type":49,"tag":250,"props":1140,"children":1141},{"class":252,"line":309},[1142],{"type":49,"tag":250,"props":1143,"children":1144},{},[1145],{"type":63,"value":1146},"  options.dsn = '__DSN__';\n",{"type":49,"tag":250,"props":1148,"children":1149},{"class":252,"line":318},[1150],{"type":49,"tag":250,"props":1151,"children":1152},{},[1153],{"type":63,"value":1154},"  options.tracesSampleRate = 1.0;\n",{"type":49,"tag":250,"props":1156,"children":1157},{"class":252,"line":327},[1158],{"type":49,"tag":250,"props":1159,"children":1160},{},[1161],{"type":63,"value":1162},"  options.traceLifecycle = SentryTraceLifecycle.stream;\n",{"type":49,"tag":250,"props":1164,"children":1165},{"class":252,"line":389},[1166],{"type":49,"tag":250,"props":1167,"children":1168},{},[1169],{"type":63,"value":1170},"}, appRunner: () => runApp(const MyApp()));\n",{"type":49,"tag":250,"props":1172,"children":1173},{"class":252,"line":664},[1174],{"type":49,"tag":250,"props":1175,"children":1176},{"emptyLinePlaceholder":43},[1177],{"type":63,"value":315},{"type":49,"tag":250,"props":1179,"children":1180},{"class":252,"line":673},[1181],{"type":49,"tag":250,"props":1182,"children":1183},{},[1184],{"type":63,"value":1185},"\u002F\u002F Plain Dart\n",{"type":49,"tag":250,"props":1187,"children":1188},{"class":252,"line":734},[1189],{"type":49,"tag":250,"props":1190,"children":1191},{},[1192],{"type":63,"value":1193},"await Sentry.init((options) {\n",{"type":49,"tag":250,"props":1195,"children":1196},{"class":252,"line":742},[1197],{"type":49,"tag":250,"props":1198,"children":1199},{},[1200],{"type":63,"value":1146},{"type":49,"tag":250,"props":1202,"children":1203},{"class":252,"line":751},[1204],{"type":49,"tag":250,"props":1205,"children":1206},{},[1207],{"type":63,"value":1154},{"type":49,"tag":250,"props":1209,"children":1211},{"class":252,"line":1210},12,[1212],{"type":49,"tag":250,"props":1213,"children":1214},{},[1215],{"type":63,"value":1162},{"type":49,"tag":250,"props":1217,"children":1219},{"class":252,"line":1218},13,[1220],{"type":49,"tag":250,"props":1221,"children":1222},{},[1223],{"type":63,"value":1224},"});\n",{"type":49,"tag":54,"props":1226,"children":1227},{},[1228],{"type":63,"value":1229},"You can only use one tracing system at a time:",{"type":49,"tag":170,"props":1231,"children":1232},{},[1233,1261,1280],{"type":49,"tag":174,"props":1234,"children":1235},{},[1236,1238,1244,1246,1252,1253,1259],{"type":63,"value":1237},"In ",{"type":49,"tag":88,"props":1239,"children":1241},{"className":1240},[],[1242],{"type":63,"value":1243},"stream",{"type":63,"value":1245}," mode, the transaction APIs (",{"type":49,"tag":88,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":63,"value":1251},"Sentry.startTransaction",{"type":63,"value":115},{"type":49,"tag":88,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":63,"value":1258},"ISentrySpan.startChild",{"type":63,"value":1260},") do nothing and log a warning.",{"type":49,"tag":174,"props":1262,"children":1263},{},[1264,1265,1271,1273,1278],{"type":63,"value":1237},{"type":49,"tag":88,"props":1266,"children":1268},{"className":1267},[],[1269],{"type":63,"value":1270},"static",{"type":63,"value":1272}," mode (the default), the new span APIs (",{"type":49,"tag":88,"props":1274,"children":1276},{"className":1275},[],[1277],{"type":63,"value":207},{"type":63,"value":1279},") do nothing.",{"type":49,"tag":174,"props":1281,"children":1282},{},[1283],{"type":63,"value":1284},"Auto-instrumentations automatically switch to the correct API based on this setting.",{"type":49,"tag":232,"props":1286,"children":1288},{"id":1287},"_22-replace-transactions-with-spans",[1289],{"type":63,"value":1290},"2.2 Replace Transactions with Spans",{"type":49,"tag":54,"props":1292,"children":1293},{},[1294,1299,1301,1307],{"type":49,"tag":88,"props":1295,"children":1297},{"className":1296},[],[1298],{"type":63,"value":207},{"type":63,"value":1300}," runs an async callback and ends the span when the returned future completes. Nested calls auto-parent through zones — there is no ",{"type":49,"tag":88,"props":1302,"children":1304},{"className":1303},[],[1305],{"type":63,"value":1306},"startChild",{"type":63,"value":1308}," equivalent to migrate to; just nest.",{"type":49,"tag":239,"props":1310,"children":1312},{"className":1117,"code":1311,"language":25,"meta":244,"style":244},"\u002F\u002F Before (static mode)\nfinal transaction = Sentry.startTransaction('checkout', 'task');\ntry {\n  final child = transaction.startChild('db.query', description: 'load cart');\n  final cart = await loadCart();\n  await child.finish();\n  transaction.setData('cart.item_count', cart.items.length);\n  transaction.status = const SpanStatus.ok();\n} catch (exception) {\n  transaction.status = const SpanStatus.internalError(); \u002F\u002F -> span.status (see below)\n  rethrow;\n} finally {\n  await transaction.finish();\n}\n\n\u002F\u002F After (streaming mode)\nawait Sentry.startSpan('checkout', (span) async {\n  final cart = await Sentry.startSpan('load cart', (_) => loadCart());\n  span.setAttribute('cart.item_count', SentryAttribute.int(cart.items.length));\n});\n",[1313],{"type":49,"tag":88,"props":1314,"children":1315},{"__ignoreMap":244},[1316,1324,1332,1340,1348,1356,1364,1372,1380,1388,1396,1404,1412,1420,1429,1437,1446,1455,1464,1473],{"type":49,"tag":250,"props":1317,"children":1318},{"class":252,"line":253},[1319],{"type":49,"tag":250,"props":1320,"children":1321},{},[1322],{"type":63,"value":1323},"\u002F\u002F Before (static mode)\n",{"type":49,"tag":250,"props":1325,"children":1326},{"class":252,"line":263},[1327],{"type":49,"tag":250,"props":1328,"children":1329},{},[1330],{"type":63,"value":1331},"final transaction = Sentry.startTransaction('checkout', 'task');\n",{"type":49,"tag":250,"props":1333,"children":1334},{"class":252,"line":309},[1335],{"type":49,"tag":250,"props":1336,"children":1337},{},[1338],{"type":63,"value":1339},"try {\n",{"type":49,"tag":250,"props":1341,"children":1342},{"class":252,"line":318},[1343],{"type":49,"tag":250,"props":1344,"children":1345},{},[1346],{"type":63,"value":1347},"  final child = transaction.startChild('db.query', description: 'load cart');\n",{"type":49,"tag":250,"props":1349,"children":1350},{"class":252,"line":327},[1351],{"type":49,"tag":250,"props":1352,"children":1353},{},[1354],{"type":63,"value":1355},"  final cart = await loadCart();\n",{"type":49,"tag":250,"props":1357,"children":1358},{"class":252,"line":389},[1359],{"type":49,"tag":250,"props":1360,"children":1361},{},[1362],{"type":63,"value":1363},"  await child.finish();\n",{"type":49,"tag":250,"props":1365,"children":1366},{"class":252,"line":664},[1367],{"type":49,"tag":250,"props":1368,"children":1369},{},[1370],{"type":63,"value":1371},"  transaction.setData('cart.item_count', cart.items.length);\n",{"type":49,"tag":250,"props":1373,"children":1374},{"class":252,"line":673},[1375],{"type":49,"tag":250,"props":1376,"children":1377},{},[1378],{"type":63,"value":1379},"  transaction.status = const SpanStatus.ok();\n",{"type":49,"tag":250,"props":1381,"children":1382},{"class":252,"line":734},[1383],{"type":49,"tag":250,"props":1384,"children":1385},{},[1386],{"type":63,"value":1387},"} catch (exception) {\n",{"type":49,"tag":250,"props":1389,"children":1390},{"class":252,"line":742},[1391],{"type":49,"tag":250,"props":1392,"children":1393},{},[1394],{"type":63,"value":1395},"  transaction.status = const SpanStatus.internalError(); \u002F\u002F -> span.status (see below)\n",{"type":49,"tag":250,"props":1397,"children":1398},{"class":252,"line":751},[1399],{"type":49,"tag":250,"props":1400,"children":1401},{},[1402],{"type":63,"value":1403},"  rethrow;\n",{"type":49,"tag":250,"props":1405,"children":1406},{"class":252,"line":1210},[1407],{"type":49,"tag":250,"props":1408,"children":1409},{},[1410],{"type":63,"value":1411},"} finally {\n",{"type":49,"tag":250,"props":1413,"children":1414},{"class":252,"line":1218},[1415],{"type":49,"tag":250,"props":1416,"children":1417},{},[1418],{"type":63,"value":1419},"  await transaction.finish();\n",{"type":49,"tag":250,"props":1421,"children":1423},{"class":252,"line":1422},14,[1424],{"type":49,"tag":250,"props":1425,"children":1426},{},[1427],{"type":63,"value":1428},"}\n",{"type":49,"tag":250,"props":1430,"children":1432},{"class":252,"line":1431},15,[1433],{"type":49,"tag":250,"props":1434,"children":1435},{"emptyLinePlaceholder":43},[1436],{"type":63,"value":315},{"type":49,"tag":250,"props":1438,"children":1440},{"class":252,"line":1439},16,[1441],{"type":49,"tag":250,"props":1442,"children":1443},{},[1444],{"type":63,"value":1445},"\u002F\u002F After (streaming mode)\n",{"type":49,"tag":250,"props":1447,"children":1449},{"class":252,"line":1448},17,[1450],{"type":49,"tag":250,"props":1451,"children":1452},{},[1453],{"type":63,"value":1454},"await Sentry.startSpan('checkout', (span) async {\n",{"type":49,"tag":250,"props":1456,"children":1458},{"class":252,"line":1457},18,[1459],{"type":49,"tag":250,"props":1460,"children":1461},{},[1462],{"type":63,"value":1463},"  final cart = await Sentry.startSpan('load cart', (_) => loadCart());\n",{"type":49,"tag":250,"props":1465,"children":1467},{"class":252,"line":1466},19,[1468],{"type":49,"tag":250,"props":1469,"children":1470},{},[1471],{"type":63,"value":1472},"  span.setAttribute('cart.item_count', SentryAttribute.int(cart.items.length));\n",{"type":49,"tag":250,"props":1474,"children":1476},{"class":252,"line":1475},20,[1477],{"type":49,"tag":250,"props":1478,"children":1479},{},[1480],{"type":63,"value":1224},{"type":49,"tag":54,"props":1482,"children":1483},{},[1484,1486,1492,1494,1500],{"type":63,"value":1485},"Error handling is automatic: if the callback throws (or the future errors), the span status is set to ",{"type":49,"tag":88,"props":1487,"children":1489},{"className":1488},[],[1490],{"type":63,"value":1491},"SentrySpanStatusV2.error",{"type":63,"value":1493}," before the span ends, and the error is rethrown. Otherwise the status defaults to ",{"type":49,"tag":88,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":63,"value":1499},"ok",{"type":63,"value":161},{"type":49,"tag":54,"props":1502,"children":1503},{},[1504,1506,1512],{"type":63,"value":1505},"You can also set the status manually via the ",{"type":49,"tag":88,"props":1507,"children":1509},{"className":1508},[],[1510],{"type":63,"value":1511},"status",{"type":63,"value":1513}," setter:",{"type":49,"tag":239,"props":1515,"children":1517},{"className":1117,"code":1516,"language":25,"meta":244,"style":244},"span.status = SentrySpanStatusV2.error;\n",[1518],{"type":49,"tag":88,"props":1519,"children":1520},{"__ignoreMap":244},[1521],{"type":49,"tag":250,"props":1522,"children":1523},{"class":252,"line":253},[1524],{"type":49,"tag":250,"props":1525,"children":1526},{},[1527],{"type":63,"value":1516},{"type":49,"tag":54,"props":1529,"children":1530},{},[1531,1533,1539,1541,1547,1549,1555,1557,1563,1565,1570],{"type":63,"value":1532},"There is no untyped ",{"type":49,"tag":88,"props":1534,"children":1536},{"className":1535},[],[1537],{"type":63,"value":1538},"SpanStatus",{"type":63,"value":1540}," string equivalent. Explicit statuses from the old API (e.g. ",{"type":49,"tag":88,"props":1542,"children":1544},{"className":1543},[],[1545],{"type":63,"value":1546},"transaction.status = const SpanStatus.internalError()",{"type":63,"value":1548},") migrate to ",{"type":49,"tag":88,"props":1550,"children":1552},{"className":1551},[],[1553],{"type":63,"value":1554},"span.status = SentrySpanStatusV2.error",{"type":63,"value":1556}," — though ",{"type":49,"tag":88,"props":1558,"children":1560},{"className":1559},[],[1561],{"type":63,"value":1562},"error",{"type":63,"value":1564}," is set automatically on throw and ",{"type":49,"tag":88,"props":1566,"children":1568},{"className":1567},[],[1569],{"type":63,"value":1499},{"type":63,"value":1571}," automatically otherwise, so manual assignment is only needed to override the default.",{"type":49,"tag":54,"props":1573,"children":1574},{},[1575,1577,1582],{"type":63,"value":1576},"For synchronous work, use ",{"type":49,"tag":88,"props":1578,"children":1580},{"className":1579},[],[1581],{"type":63,"value":886},{"type":63,"value":1583},":",{"type":49,"tag":239,"props":1585,"children":1587},{"className":1117,"code":1586,"language":25,"meta":244,"style":244},"final config = Sentry.startSpanSync('parse-config', (_) {\n  return Config.parse(raw);\n});\n",[1588],{"type":49,"tag":88,"props":1589,"children":1590},{"__ignoreMap":244},[1591,1599,1607],{"type":49,"tag":250,"props":1592,"children":1593},{"class":252,"line":253},[1594],{"type":49,"tag":250,"props":1595,"children":1596},{},[1597],{"type":63,"value":1598},"final config = Sentry.startSpanSync('parse-config', (_) {\n",{"type":49,"tag":250,"props":1600,"children":1601},{"class":252,"line":263},[1602],{"type":49,"tag":250,"props":1603,"children":1604},{},[1605],{"type":63,"value":1606},"  return Config.parse(raw);\n",{"type":49,"tag":250,"props":1608,"children":1609},{"class":252,"line":309},[1610],{"type":49,"tag":250,"props":1611,"children":1612},{},[1613],{"type":63,"value":1224},{"type":49,"tag":54,"props":1615,"children":1616},{},[1617],{"type":63,"value":1618},"Both variants can be freely nested — parent-child relationships resolve correctly across sync\u002Fasync boundaries. If a span is not sampled, the callback still runs and receives a no-op span, so all span operations are safe.",{"type":49,"tag":232,"props":1620,"children":1622},{"id":1621},"_23-spans-that-outlive-a-callback",[1623],{"type":63,"value":1624},"2.3 Spans That Outlive a Callback",{"type":49,"tag":54,"props":1626,"children":1627},{},[1628,1630,1635,1637,1643,1645,1650],{"type":63,"value":1629},"Use ",{"type":49,"tag":88,"props":1631,"children":1633},{"className":1632},[],[1634],{"type":63,"value":893},{"type":63,"value":1636}," when the work cannot be wrapped in a single callback — widget lifecycles, stream subscriptions, platform channel round-trips. You must call ",{"type":49,"tag":88,"props":1638,"children":1640},{"className":1639},[],[1641],{"type":63,"value":1642},"end()",{"type":63,"value":1644}," manually, and other spans do ",{"type":49,"tag":1057,"props":1646,"children":1647},{},[1648],{"type":63,"value":1649},"not",{"type":63,"value":1651}," automatically become its children.",{"type":49,"tag":239,"props":1653,"children":1655},{"className":1117,"code":1654,"language":25,"meta":244,"style":244},"final paymentSpan = Sentry.startInactiveSpan('payment',\n    attributes: {'payment.provider': SentryAttribute.string('stripe')});\n\n\u002F\u002F ...later, from a different entry point\nvoid onDeepLink(Uri uri) {\n  paymentSpan.end();\n}\n",[1656],{"type":49,"tag":88,"props":1657,"children":1658},{"__ignoreMap":244},[1659,1667,1675,1682,1690,1698,1706],{"type":49,"tag":250,"props":1660,"children":1661},{"class":252,"line":253},[1662],{"type":49,"tag":250,"props":1663,"children":1664},{},[1665],{"type":63,"value":1666},"final paymentSpan = Sentry.startInactiveSpan('payment',\n",{"type":49,"tag":250,"props":1668,"children":1669},{"class":252,"line":263},[1670],{"type":49,"tag":250,"props":1671,"children":1672},{},[1673],{"type":63,"value":1674},"    attributes: {'payment.provider': SentryAttribute.string('stripe')});\n",{"type":49,"tag":250,"props":1676,"children":1677},{"class":252,"line":309},[1678],{"type":49,"tag":250,"props":1679,"children":1680},{"emptyLinePlaceholder":43},[1681],{"type":63,"value":315},{"type":49,"tag":250,"props":1683,"children":1684},{"class":252,"line":318},[1685],{"type":49,"tag":250,"props":1686,"children":1687},{},[1688],{"type":63,"value":1689},"\u002F\u002F ...later, from a different entry point\n",{"type":49,"tag":250,"props":1691,"children":1692},{"class":252,"line":327},[1693],{"type":49,"tag":250,"props":1694,"children":1695},{},[1696],{"type":63,"value":1697},"void onDeepLink(Uri uri) {\n",{"type":49,"tag":250,"props":1699,"children":1700},{"class":252,"line":389},[1701],{"type":49,"tag":250,"props":1702,"children":1703},{},[1704],{"type":63,"value":1705},"  paymentSpan.end();\n",{"type":49,"tag":250,"props":1707,"children":1708},{"class":252,"line":664},[1709],{"type":49,"tag":250,"props":1710,"children":1711},{},[1712],{"type":63,"value":1428},{"type":49,"tag":54,"props":1714,"children":1715},{},[1716,1721,1722,1728,1730,1736,1738,1744,1746,1752,1754,1759,1761,1767,1768,1774],{"type":49,"tag":1057,"props":1717,"children":1718},{},[1719],{"type":63,"value":1720},"Parenting.",{"type":63,"value":458},{"type":49,"tag":88,"props":1723,"children":1725},{"className":1724},[],[1726],{"type":63,"value":1727},"parentSpan",{"type":63,"value":1729}," defaults to an internal ",{"type":49,"tag":1731,"props":1732,"children":1733},"em",{},[1734],{"type":63,"value":1735},"unset",{"type":63,"value":1737}," sentinel (",{"type":49,"tag":88,"props":1739,"children":1741},{"className":1740},[],[1742],{"type":63,"value":1743},"const UnsetSentrySpanV2()",{"type":63,"value":1745},"), which means \"inherit the currently active span.\" This is explicitly distinct from passing ",{"type":49,"tag":88,"props":1747,"children":1749},{"className":1748},[],[1750],{"type":63,"value":1751},"parentSpan: null",{"type":63,"value":1753},", which forces a root span with no parent. Pass an explicit ",{"type":49,"tag":88,"props":1755,"children":1757},{"className":1756},[],[1758],{"type":63,"value":215},{"type":63,"value":1760}," to parent under a specific span. (The same default applies to ",{"type":49,"tag":88,"props":1762,"children":1764},{"className":1763},[],[1765],{"type":63,"value":1766},"startSpan",{"type":63,"value":451},{"type":49,"tag":88,"props":1769,"children":1771},{"className":1770},[],[1772],{"type":63,"value":1773},"startSpanSync",{"type":63,"value":1775},".)",{"type":49,"tag":54,"props":1777,"children":1778},{},[1779,1784,1785,1790,1792,1797,1799,1805,1807,1813],{"type":49,"tag":1057,"props":1780,"children":1781},{},[1782],{"type":63,"value":1783},"Retroactive timing.",{"type":63,"value":458},{"type":49,"tag":88,"props":1786,"children":1788},{"className":1787},[],[1789],{"type":63,"value":1766},{"type":63,"value":1791}," and ",{"type":49,"tag":88,"props":1793,"children":1795},{"className":1794},[],[1796],{"type":63,"value":1773},{"type":63,"value":1798}," accept an optional ",{"type":49,"tag":88,"props":1800,"children":1802},{"className":1801},[],[1803],{"type":63,"value":1804},"startTimestamp",{"type":63,"value":1806},", and ",{"type":49,"tag":88,"props":1808,"children":1810},{"className":1809},[],[1811],{"type":63,"value":1812},"span.end(endTimestamp: ...)",{"type":63,"value":1814}," accepts an explicit end time. Use these when the real start or end of the work happened before you could create or end the span — for example, a duration measured by a platform channel:",{"type":49,"tag":239,"props":1816,"children":1818},{"className":1117,"code":1817,"language":25,"meta":244,"style":244},"final paymentSpan = Sentry.startInactiveSpan('payment');\n\u002F\u002F ...native reports it started at `nativeStart` and ended at `nativeEnd`\npaymentSpan.end(endTimestamp: nativeEnd);\n\n\u002F\u002F startTimestamp is available on the callback variants:\nSentry.startSpanSync('replay-import', (_) => importRows(),\n    startTimestamp: measuredStart);\n",[1819],{"type":49,"tag":88,"props":1820,"children":1821},{"__ignoreMap":244},[1822,1830,1838,1846,1853,1861,1869],{"type":49,"tag":250,"props":1823,"children":1824},{"class":252,"line":253},[1825],{"type":49,"tag":250,"props":1826,"children":1827},{},[1828],{"type":63,"value":1829},"final paymentSpan = Sentry.startInactiveSpan('payment');\n",{"type":49,"tag":250,"props":1831,"children":1832},{"class":252,"line":263},[1833],{"type":49,"tag":250,"props":1834,"children":1835},{},[1836],{"type":63,"value":1837},"\u002F\u002F ...native reports it started at `nativeStart` and ended at `nativeEnd`\n",{"type":49,"tag":250,"props":1839,"children":1840},{"class":252,"line":309},[1841],{"type":49,"tag":250,"props":1842,"children":1843},{},[1844],{"type":63,"value":1845},"paymentSpan.end(endTimestamp: nativeEnd);\n",{"type":49,"tag":250,"props":1847,"children":1848},{"class":252,"line":318},[1849],{"type":49,"tag":250,"props":1850,"children":1851},{"emptyLinePlaceholder":43},[1852],{"type":63,"value":315},{"type":49,"tag":250,"props":1854,"children":1855},{"class":252,"line":327},[1856],{"type":49,"tag":250,"props":1857,"children":1858},{},[1859],{"type":63,"value":1860},"\u002F\u002F startTimestamp is available on the callback variants:\n",{"type":49,"tag":250,"props":1862,"children":1863},{"class":252,"line":389},[1864],{"type":49,"tag":250,"props":1865,"children":1866},{},[1867],{"type":63,"value":1868},"Sentry.startSpanSync('replay-import', (_) => importRows(),\n",{"type":49,"tag":250,"props":1870,"children":1871},{"class":252,"line":664},[1872],{"type":49,"tag":250,"props":1873,"children":1874},{},[1875],{"type":63,"value":1876},"    startTimestamp: measuredStart);\n",{"type":49,"tag":232,"props":1878,"children":1880},{"id":1879},"_24-migrate-setdata-settag-to-typed-attributes",[1881,1883,1888,1889,1894],{"type":63,"value":1882},"2.4 Migrate ",{"type":49,"tag":88,"props":1884,"children":1886},{"className":1885},[],[1887],{"type":63,"value":930},{"type":63,"value":451},{"type":49,"tag":88,"props":1890,"children":1892},{"className":1891},[],[1893],{"type":63,"value":937},{"type":63,"value":1895}," to Typed Attributes",{"type":49,"tag":54,"props":1897,"children":1898},{},[1899],{"type":63,"value":1900},"Streamed spans use typed attributes instead of untyped data and tags:",{"type":49,"tag":239,"props":1902,"children":1904},{"className":1117,"code":1903,"language":25,"meta":244,"style":244},"\u002F\u002F Before\ntransaction.setData('retry_count', 3);\ntransaction.setTag('payment.provider', 'stripe');\n\n\u002F\u002F After\nspan.setAttribute('retry_count', SentryAttribute.int(3));\nspan.setAttributes({\n  'payment.provider': SentryAttribute.string('stripe'),\n  'cache.hit': SentryAttribute.bool(true),\n  'response_time_ms': SentryAttribute.double(12.5),\n});\nspan.removeAttribute('old_key');\n",[1905],{"type":49,"tag":88,"props":1906,"children":1907},{"__ignoreMap":244},[1908,1916,1924,1932,1939,1947,1955,1963,1971,1979,1987,1994],{"type":49,"tag":250,"props":1909,"children":1910},{"class":252,"line":253},[1911],{"type":49,"tag":250,"props":1912,"children":1913},{},[1914],{"type":63,"value":1915},"\u002F\u002F Before\n",{"type":49,"tag":250,"props":1917,"children":1918},{"class":252,"line":263},[1919],{"type":49,"tag":250,"props":1920,"children":1921},{},[1922],{"type":63,"value":1923},"transaction.setData('retry_count', 3);\n",{"type":49,"tag":250,"props":1925,"children":1926},{"class":252,"line":309},[1927],{"type":49,"tag":250,"props":1928,"children":1929},{},[1930],{"type":63,"value":1931},"transaction.setTag('payment.provider', 'stripe');\n",{"type":49,"tag":250,"props":1933,"children":1934},{"class":252,"line":318},[1935],{"type":49,"tag":250,"props":1936,"children":1937},{"emptyLinePlaceholder":43},[1938],{"type":63,"value":315},{"type":49,"tag":250,"props":1940,"children":1941},{"class":252,"line":327},[1942],{"type":49,"tag":250,"props":1943,"children":1944},{},[1945],{"type":63,"value":1946},"\u002F\u002F After\n",{"type":49,"tag":250,"props":1948,"children":1949},{"class":252,"line":389},[1950],{"type":49,"tag":250,"props":1951,"children":1952},{},[1953],{"type":63,"value":1954},"span.setAttribute('retry_count', SentryAttribute.int(3));\n",{"type":49,"tag":250,"props":1956,"children":1957},{"class":252,"line":664},[1958],{"type":49,"tag":250,"props":1959,"children":1960},{},[1961],{"type":63,"value":1962},"span.setAttributes({\n",{"type":49,"tag":250,"props":1964,"children":1965},{"class":252,"line":673},[1966],{"type":49,"tag":250,"props":1967,"children":1968},{},[1969],{"type":63,"value":1970},"  'payment.provider': SentryAttribute.string('stripe'),\n",{"type":49,"tag":250,"props":1972,"children":1973},{"class":252,"line":734},[1974],{"type":49,"tag":250,"props":1975,"children":1976},{},[1977],{"type":63,"value":1978},"  'cache.hit': SentryAttribute.bool(true),\n",{"type":49,"tag":250,"props":1980,"children":1981},{"class":252,"line":742},[1982],{"type":49,"tag":250,"props":1983,"children":1984},{},[1985],{"type":63,"value":1986},"  'response_time_ms': SentryAttribute.double(12.5),\n",{"type":49,"tag":250,"props":1988,"children":1989},{"class":252,"line":751},[1990],{"type":49,"tag":250,"props":1991,"children":1992},{},[1993],{"type":63,"value":1224},{"type":49,"tag":250,"props":1995,"children":1996},{"class":252,"line":1210},[1997],{"type":49,"tag":250,"props":1998,"children":1999},{},[2000],{"type":63,"value":2001},"span.removeAttribute('old_key');\n",{"type":49,"tag":829,"props":2003,"children":2004},{},[2005,2021],{"type":49,"tag":833,"props":2006,"children":2007},{},[2008],{"type":49,"tag":837,"props":2009,"children":2010},{},[2011,2016],{"type":49,"tag":841,"props":2012,"children":2013},{},[2014],{"type":63,"value":2015},"Factory",{"type":49,"tag":841,"props":2017,"children":2018},{},[2019],{"type":63,"value":2020},"Dart Type",{"type":49,"tag":852,"props":2022,"children":2023},{},[2024,2045,2066,2087],{"type":49,"tag":837,"props":2025,"children":2026},{},[2027,2036],{"type":49,"tag":859,"props":2028,"children":2029},{},[2030],{"type":49,"tag":88,"props":2031,"children":2033},{"className":2032},[],[2034],{"type":63,"value":2035},"SentryAttribute.string(v)",{"type":49,"tag":859,"props":2037,"children":2038},{},[2039],{"type":49,"tag":88,"props":2040,"children":2042},{"className":2041},[],[2043],{"type":63,"value":2044},"String",{"type":49,"tag":837,"props":2046,"children":2047},{},[2048,2057],{"type":49,"tag":859,"props":2049,"children":2050},{},[2051],{"type":49,"tag":88,"props":2052,"children":2054},{"className":2053},[],[2055],{"type":63,"value":2056},"SentryAttribute.int(v)",{"type":49,"tag":859,"props":2058,"children":2059},{},[2060],{"type":49,"tag":88,"props":2061,"children":2063},{"className":2062},[],[2064],{"type":63,"value":2065},"int",{"type":49,"tag":837,"props":2067,"children":2068},{},[2069,2078],{"type":49,"tag":859,"props":2070,"children":2071},{},[2072],{"type":49,"tag":88,"props":2073,"children":2075},{"className":2074},[],[2076],{"type":63,"value":2077},"SentryAttribute.bool(v)",{"type":49,"tag":859,"props":2079,"children":2080},{},[2081],{"type":49,"tag":88,"props":2082,"children":2084},{"className":2083},[],[2085],{"type":63,"value":2086},"bool",{"type":49,"tag":837,"props":2088,"children":2089},{},[2090,2099],{"type":49,"tag":859,"props":2091,"children":2092},{},[2093],{"type":49,"tag":88,"props":2094,"children":2096},{"className":2095},[],[2097],{"type":63,"value":2098},"SentryAttribute.double(v)",{"type":49,"tag":859,"props":2100,"children":2101},{},[2102],{"type":49,"tag":88,"props":2103,"children":2105},{"className":2104},[],[2106],{"type":63,"value":2107},"double",{"type":49,"tag":232,"props":2109,"children":2111},{"id":2110},"_25-migrate-beforesendtransaction",[2112,2114],{"type":63,"value":2113},"2.5 Migrate ",{"type":49,"tag":88,"props":2115,"children":2117},{"className":2116},[],[2118],{"type":63,"value":969},{"type":49,"tag":54,"props":2120,"children":2121},{},[2122,2127,2129,2134],{"type":49,"tag":88,"props":2123,"children":2125},{"className":2124},[],[2126],{"type":63,"value":969},{"type":63,"value":2128}," has ",{"type":49,"tag":1057,"props":2130,"children":2131},{},[2132],{"type":63,"value":2133},"no effect",{"type":63,"value":2135}," in streaming mode — transactions are never created, so the callback is never invoked. Migrate its logic:",{"type":49,"tag":829,"props":2137,"children":2138},{},[2139,2155],{"type":49,"tag":833,"props":2140,"children":2141},{},[2142],{"type":49,"tag":837,"props":2143,"children":2144},{},[2145,2150],{"type":49,"tag":841,"props":2146,"children":2147},{},[2148],{"type":63,"value":2149},"Use Case",{"type":49,"tag":841,"props":2151,"children":2152},{},[2153],{"type":63,"value":2154},"Streaming Replacement",{"type":49,"tag":852,"props":2156,"children":2157},{},[2158,2182,2198],{"type":49,"tag":837,"props":2159,"children":2160},{},[2161,2166],{"type":49,"tag":859,"props":2162,"children":2163},{},[2164],{"type":63,"value":2165},"Drop spans by name",{"type":49,"tag":859,"props":2167,"children":2168},{},[2169,2174,2176],{"type":49,"tag":88,"props":2170,"children":2172},{"className":2171},[],[2173],{"type":63,"value":990},{"type":63,"value":2175}," with ",{"type":49,"tag":88,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":63,"value":2181},"IgnoreSpanRule",{"type":49,"tag":837,"props":2183,"children":2184},{},[2185,2190],{"type":49,"tag":859,"props":2186,"children":2187},{},[2188],{"type":63,"value":2189},"Scrub sensitive data \u002F PII",{"type":49,"tag":859,"props":2191,"children":2192},{},[2193],{"type":49,"tag":88,"props":2194,"children":2196},{"className":2195},[],[2197],{"type":63,"value":982},{"type":49,"tag":837,"props":2199,"children":2200},{},[2201,2206],{"type":49,"tag":859,"props":2202,"children":2203},{},[2204],{"type":63,"value":2205},"Modify span data before send",{"type":49,"tag":859,"props":2207,"children":2208},{},[2209],{"type":49,"tag":88,"props":2210,"children":2212},{"className":2211},[],[2213],{"type":63,"value":982},{"type":49,"tag":54,"props":2215,"children":2216},{},[2217,2222,2224,2229,2231,2237,2239,2244,2246,2252,2254,2259],{"type":49,"tag":88,"props":2218,"children":2220},{"className":2219},[],[2221],{"type":63,"value":982},{"type":63,"value":2223}," receives each ",{"type":49,"tag":88,"props":2225,"children":2227},{"className":2226},[],[2228],{"type":63,"value":215},{"type":63,"value":2230}," before it is sent. Unlike other ",{"type":49,"tag":88,"props":2232,"children":2234},{"className":2233},[],[2235],{"type":63,"value":2236},"beforeSend",{"type":63,"value":2238}," callbacks, it ",{"type":49,"tag":1057,"props":2240,"children":2241},{},[2242],{"type":63,"value":2243},"cannot drop spans",{"type":63,"value":2245}," — it is mutation-only (",{"type":49,"tag":88,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":63,"value":2251},"FutureOr\u003Cvoid>",{"type":63,"value":2253}," return). Use ",{"type":49,"tag":88,"props":2255,"children":2257},{"className":2256},[],[2258],{"type":63,"value":990},{"type":63,"value":2260}," to drop.",{"type":49,"tag":239,"props":2262,"children":2264},{"className":1117,"code":2263,"language":25,"meta":244,"style":244},"await Sentry.init((options) {\n  options.traceLifecycle = SentryTraceLifecycle.stream;\n  options.beforeSendSpan = (span) {\n    span.removeAttribute('http.request.body');\n  };\n});\n",[2265],{"type":49,"tag":88,"props":2266,"children":2267},{"__ignoreMap":244},[2268,2275,2282,2290,2298,2306],{"type":49,"tag":250,"props":2269,"children":2270},{"class":252,"line":253},[2271],{"type":49,"tag":250,"props":2272,"children":2273},{},[2274],{"type":63,"value":1193},{"type":49,"tag":250,"props":2276,"children":2277},{"class":252,"line":263},[2278],{"type":49,"tag":250,"props":2279,"children":2280},{},[2281],{"type":63,"value":1162},{"type":49,"tag":250,"props":2283,"children":2284},{"class":252,"line":309},[2285],{"type":49,"tag":250,"props":2286,"children":2287},{},[2288],{"type":63,"value":2289},"  options.beforeSendSpan = (span) {\n",{"type":49,"tag":250,"props":2291,"children":2292},{"class":252,"line":318},[2293],{"type":49,"tag":250,"props":2294,"children":2295},{},[2296],{"type":63,"value":2297},"    span.removeAttribute('http.request.body');\n",{"type":49,"tag":250,"props":2299,"children":2300},{"class":252,"line":327},[2301],{"type":49,"tag":250,"props":2302,"children":2303},{},[2304],{"type":63,"value":2305},"  };\n",{"type":49,"tag":250,"props":2307,"children":2308},{"class":252,"line":389},[2309],{"type":49,"tag":250,"props":2310,"children":2311},{},[2312],{"type":63,"value":1224},{"type":49,"tag":54,"props":2314,"children":2315},{},[2316,2318,2323],{"type":63,"value":2317},"Remove the ",{"type":49,"tag":88,"props":2319,"children":2321},{"className":2320},[],[2322],{"type":63,"value":969},{"type":63,"value":2324}," option after migrating its logic.",{"type":49,"tag":232,"props":2326,"children":2328},{"id":2327},"_26-configure-ignorespans-optional",[2329,2331,2336],{"type":63,"value":2330},"2.6 Configure ",{"type":49,"tag":88,"props":2332,"children":2334},{"className":2333},[],[2335],{"type":63,"value":990},{"type":63,"value":2337}," (Optional)",{"type":49,"tag":54,"props":2339,"children":2340},{},[2341,2346],{"type":49,"tag":88,"props":2342,"children":2344},{"className":2343},[],[2345],{"type":63,"value":990},{"type":63,"value":2347}," drops spans by name before sampling. Matching is name-only (attribute matching is not yet supported in the Dart SDK).",{"type":49,"tag":239,"props":2349,"children":2351},{"className":1117,"code":2350,"language":25,"meta":244,"style":244},"options.ignoreSpans = [\n  IgnoreSpanRule.nameEquals('health-check'),\n  IgnoreSpanRule.nameStartsWith('internal.'),\n  IgnoreSpanRule.nameContains('metrics'),\n  IgnoreSpanRule.nameEndsWith('.bg'),\n];\n",[2352],{"type":49,"tag":88,"props":2353,"children":2354},{"__ignoreMap":244},[2355,2363,2371,2379,2387,2395],{"type":49,"tag":250,"props":2356,"children":2357},{"class":252,"line":253},[2358],{"type":49,"tag":250,"props":2359,"children":2360},{},[2361],{"type":63,"value":2362},"options.ignoreSpans = [\n",{"type":49,"tag":250,"props":2364,"children":2365},{"class":252,"line":263},[2366],{"type":49,"tag":250,"props":2367,"children":2368},{},[2369],{"type":63,"value":2370},"  IgnoreSpanRule.nameEquals('health-check'),\n",{"type":49,"tag":250,"props":2372,"children":2373},{"class":252,"line":309},[2374],{"type":49,"tag":250,"props":2375,"children":2376},{},[2377],{"type":63,"value":2378},"  IgnoreSpanRule.nameStartsWith('internal.'),\n",{"type":49,"tag":250,"props":2380,"children":2381},{"class":252,"line":318},[2382],{"type":49,"tag":250,"props":2383,"children":2384},{},[2385],{"type":63,"value":2386},"  IgnoreSpanRule.nameContains('metrics'),\n",{"type":49,"tag":250,"props":2388,"children":2389},{"class":252,"line":327},[2390],{"type":49,"tag":250,"props":2391,"children":2392},{},[2393],{"type":63,"value":2394},"  IgnoreSpanRule.nameEndsWith('.bg'),\n",{"type":49,"tag":250,"props":2396,"children":2397},{"class":252,"line":389},[2398],{"type":49,"tag":250,"props":2399,"children":2400},{},[2401],{"type":63,"value":2402},"];\n",{"type":49,"tag":829,"props":2404,"children":2405},{},[2406,2421],{"type":49,"tag":833,"props":2407,"children":2408},{},[2409],{"type":49,"tag":837,"props":2410,"children":2411},{},[2412,2416],{"type":49,"tag":841,"props":2413,"children":2414},{},[2415],{"type":63,"value":2015},{"type":49,"tag":841,"props":2417,"children":2418},{},[2419],{"type":63,"value":2420},"Matches",{"type":49,"tag":852,"props":2422,"children":2423},{},[2424,2441,2458,2475],{"type":49,"tag":837,"props":2425,"children":2426},{},[2427,2436],{"type":49,"tag":859,"props":2428,"children":2429},{},[2430],{"type":49,"tag":88,"props":2431,"children":2433},{"className":2432},[],[2434],{"type":63,"value":2435},"IgnoreSpanRule.nameEquals(String)",{"type":49,"tag":859,"props":2437,"children":2438},{},[2439],{"type":63,"value":2440},"Exact span name",{"type":49,"tag":837,"props":2442,"children":2443},{},[2444,2453],{"type":49,"tag":859,"props":2445,"children":2446},{},[2447],{"type":49,"tag":88,"props":2448,"children":2450},{"className":2449},[],[2451],{"type":63,"value":2452},"IgnoreSpanRule.nameStartsWith(Pattern)",{"type":49,"tag":859,"props":2454,"children":2455},{},[2456],{"type":63,"value":2457},"Name prefix (String or RegExp)",{"type":49,"tag":837,"props":2459,"children":2460},{},[2461,2470],{"type":49,"tag":859,"props":2462,"children":2463},{},[2464],{"type":49,"tag":88,"props":2465,"children":2467},{"className":2466},[],[2468],{"type":63,"value":2469},"IgnoreSpanRule.nameContains(Pattern)",{"type":49,"tag":859,"props":2471,"children":2472},{},[2473],{"type":63,"value":2474},"Name substring (String or RegExp)",{"type":49,"tag":837,"props":2476,"children":2477},{},[2478,2487],{"type":49,"tag":859,"props":2479,"children":2480},{},[2481],{"type":49,"tag":88,"props":2482,"children":2484},{"className":2483},[],[2485],{"type":63,"value":2486},"IgnoreSpanRule.nameEndsWith(String)",{"type":49,"tag":859,"props":2488,"children":2489},{},[2490],{"type":63,"value":2491},"Name suffix",{"type":49,"tag":54,"props":2493,"children":2494},{},[2495],{"type":63,"value":2496},"When an ignored span has children, the children are re-parented to the nearest recording ancestor rather than dropped.",{"type":49,"tag":232,"props":2498,"children":2500},{"id":2499},"_27-flutter-auto-instrumentation",[2501],{"type":63,"value":2502},"2.7 Flutter Auto-Instrumentation",{"type":49,"tag":54,"props":2504,"children":2505},{},[2506,2508,2513,2515,2520],{"type":63,"value":2507},"No code changes needed: frames tracking, app start, TTID\u002FTTFD, navigation, user interaction, HTTP, database, and GraphQL instrumentations all switch to the streaming API automatically when ",{"type":49,"tag":88,"props":2509,"children":2511},{"className":2510},[],[2512],{"type":63,"value":194},{"type":63,"value":2514}," is ",{"type":49,"tag":88,"props":2516,"children":2518},{"className":2517},[],[2519],{"type":63,"value":1243},{"type":63,"value":161},{"type":49,"tag":232,"props":2522,"children":2524},{"id":2523},"_28-sampling",[2525],{"type":63,"value":2526},"2.8 Sampling",{"type":49,"tag":54,"props":2528,"children":2529},{},[2530,2535,2536,2541,2543,2548],{"type":49,"tag":88,"props":2531,"children":2533},{"className":2532},[],[2534],{"type":63,"value":1087},{"type":63,"value":1791},{"type":49,"tag":88,"props":2537,"children":2539},{"className":2538},[],[2540],{"type":63,"value":1094},{"type":63,"value":2542}," work unchanged. Only ",{"type":49,"tag":1057,"props":2544,"children":2545},{},[2546],{"type":63,"value":2547},"root spans",{"type":63,"value":2549}," are sampled; child spans inherit the root's decision. When a root span is not sampled, the callback still executes with a no-op span.",{"type":49,"tag":222,"props":2551,"children":2552},{},[],{"type":49,"tag":163,"props":2554,"children":2556},{"id":2555},"phase-3-verify",[2557],{"type":63,"value":2558},"Phase 3: Verify",{"type":49,"tag":232,"props":2560,"children":2562},{"id":2561},"_31-static-check",[2563],{"type":63,"value":2564},"3.1 Static Check",{"type":49,"tag":239,"props":2566,"children":2568},{"className":241,"code":2567,"language":243,"meta":244,"style":244},"dart analyze 2>&1 | head -30\n# or for Flutter projects\nflutter analyze 2>&1 | head -30\n",[2569],{"type":49,"tag":88,"props":2570,"children":2571},{"__ignoreMap":244},[2572,2602,2610],{"type":49,"tag":250,"props":2573,"children":2574},{"class":252,"line":253},[2575,2579,2584,2589,2593,2597],{"type":49,"tag":250,"props":2576,"children":2577},{"style":267},[2578],{"type":63,"value":25},{"type":49,"tag":250,"props":2580,"children":2581},{"style":273},[2582],{"type":63,"value":2583}," analyze",{"type":49,"tag":250,"props":2585,"children":2586},{"style":279},[2587],{"type":63,"value":2588}," 2>&1",{"type":49,"tag":250,"props":2590,"children":2591},{"style":279},[2592],{"type":63,"value":371},{"type":49,"tag":250,"props":2594,"children":2595},{"style":267},[2596],{"type":63,"value":561},{"type":49,"tag":250,"props":2598,"children":2599},{"style":273},[2600],{"type":63,"value":2601}," -30\n",{"type":49,"tag":250,"props":2603,"children":2604},{"class":252,"line":263},[2605],{"type":49,"tag":250,"props":2606,"children":2607},{"style":257},[2608],{"type":63,"value":2609},"# or for Flutter projects\n",{"type":49,"tag":250,"props":2611,"children":2612},{"class":252,"line":309},[2613,2617,2621,2625,2629,2633],{"type":49,"tag":250,"props":2614,"children":2615},{"style":267},[2616],{"type":63,"value":19},{"type":49,"tag":250,"props":2618,"children":2619},{"style":273},[2620],{"type":63,"value":2583},{"type":49,"tag":250,"props":2622,"children":2623},{"style":279},[2624],{"type":63,"value":2588},{"type":49,"tag":250,"props":2626,"children":2627},{"style":279},[2628],{"type":63,"value":371},{"type":49,"tag":250,"props":2630,"children":2631},{"style":267},[2632],{"type":63,"value":561},{"type":49,"tag":250,"props":2634,"children":2635},{"style":273},[2636],{"type":63,"value":2601},{"type":49,"tag":54,"props":2638,"children":2639},{},[2640],{"type":63,"value":2641},"Expect no new analyzer errors from the migration.",{"type":49,"tag":232,"props":2643,"children":2645},{"id":2644},"_32-runtime-verification",[2646],{"type":63,"value":2647},"3.2 Runtime Verification",{"type":49,"tag":54,"props":2649,"children":2650},{},[2651,2653,2659],{"type":63,"value":2652},"Instruct the user to verify with ",{"type":49,"tag":88,"props":2654,"children":2656},{"className":2655},[],[2657],{"type":63,"value":2658},"options.debug = true",{"type":63,"value":2660}," or network inspection:",{"type":49,"tag":2662,"props":2663,"children":2664},"ol",{},[2665,2683,2693],{"type":49,"tag":174,"props":2666,"children":2667},{},[2668,2673,2675,2681],{"type":49,"tag":1057,"props":2669,"children":2670},{},[2671],{"type":63,"value":2672},"Envelope content type",{"type":63,"value":2674},": span envelopes are sent with content type ",{"type":49,"tag":88,"props":2676,"children":2678},{"className":2677},[],[2679],{"type":63,"value":2680},"application\u002Fvnd.sentry.items.span.v2+json",{"type":63,"value":2682}," instead of transaction envelopes. Spans are buffered briefly and flushed in batches, so expect a short delay before envelopes appear.",{"type":49,"tag":174,"props":2684,"children":2685},{},[2686,2691],{"type":49,"tag":1057,"props":2687,"children":2688},{},[2689],{"type":63,"value":2690},"Sentry dashboard",{"type":63,"value":2692},": spans appear in the Traces view shortly after each span completes, without waiting for a whole transaction to finish.",{"type":49,"tag":174,"props":2694,"children":2695},{},[2696,2701,2703,2709],{"type":49,"tag":1057,"props":2697,"children":2698},{},[2699],{"type":63,"value":2700},"No-op warnings",{"type":63,"value":2702},": a log line ",{"type":49,"tag":88,"props":2704,"children":2706},{"className":2705},[],[2707],{"type":63,"value":2708},"startTransaction is not supported when traceLifecycle is 'stream'",{"type":63,"value":2710}," means old transaction API calls remain — find and migrate them.",{"type":49,"tag":232,"props":2712,"children":2714},{"id":2713},"_33-common-issues",[2715],{"type":63,"value":2716},"3.3 Common Issues",{"type":49,"tag":829,"props":2718,"children":2719},{},[2720,2741],{"type":49,"tag":833,"props":2721,"children":2722},{},[2723],{"type":49,"tag":837,"props":2724,"children":2725},{},[2726,2731,2736],{"type":49,"tag":841,"props":2727,"children":2728},{},[2729],{"type":63,"value":2730},"Symptom",{"type":49,"tag":841,"props":2732,"children":2733},{},[2734],{"type":63,"value":2735},"Cause",{"type":49,"tag":841,"props":2737,"children":2738},{},[2739],{"type":63,"value":2740},"Fix",{"type":49,"tag":852,"props":2742,"children":2743},{},[2744,2777,2824,2860,2903],{"type":49,"tag":837,"props":2745,"children":2746},{},[2747,2757,2762],{"type":49,"tag":859,"props":2748,"children":2749},{},[2750,2752],{"type":63,"value":2751},"Log: ",{"type":49,"tag":88,"props":2753,"children":2755},{"className":2754},[],[2756],{"type":63,"value":2708},{"type":49,"tag":859,"props":2758,"children":2759},{},[2760],{"type":63,"value":2761},"Old transaction API still called in streaming mode",{"type":49,"tag":859,"props":2763,"children":2764},{},[2765,2766,2771,2772],{"type":63,"value":874},{"type":49,"tag":88,"props":2767,"children":2769},{"className":2768},[],[2770],{"type":63,"value":207},{"type":63,"value":451},{"type":49,"tag":88,"props":2773,"children":2775},{"className":2774},[],[2776],{"type":63,"value":1773},{"type":49,"tag":837,"props":2778,"children":2779},{},[2780,2790,2807],{"type":49,"tag":859,"props":2781,"children":2782},{},[2783,2788],{"type":49,"tag":88,"props":2784,"children":2786},{"className":2785},[],[2787],{"type":63,"value":207},{"type":63,"value":2789}," produces no spans",{"type":49,"tag":859,"props":2791,"children":2792},{},[2793,2798,2800,2805],{"type":49,"tag":88,"props":2794,"children":2796},{"className":2795},[],[2797],{"type":63,"value":194},{"type":63,"value":2799}," still ",{"type":49,"tag":88,"props":2801,"children":2803},{"className":2802},[],[2804],{"type":63,"value":1270},{"type":63,"value":2806}," (the default), or tracing disabled",{"type":49,"tag":859,"props":2808,"children":2809},{},[2810,2811,2817,2819],{"type":63,"value":1107},{"type":49,"tag":88,"props":2812,"children":2814},{"className":2813},[],[2815],{"type":63,"value":2816},"options.traceLifecycle = SentryTraceLifecycle.stream",{"type":63,"value":2818}," and a ",{"type":49,"tag":88,"props":2820,"children":2822},{"className":2821},[],[2823],{"type":63,"value":1087},{"type":49,"tag":837,"props":2825,"children":2826},{},[2827,2837,2842],{"type":49,"tag":859,"props":2828,"children":2829},{},[2830,2835],{"type":49,"tag":88,"props":2831,"children":2833},{"className":2832},[],[2834],{"type":63,"value":969},{"type":63,"value":2836}," never called",{"type":49,"tag":859,"props":2838,"children":2839},{},[2840],{"type":63,"value":2841},"Expected in streaming mode",{"type":49,"tag":859,"props":2843,"children":2844},{},[2845,2847,2852,2853,2858],{"type":63,"value":2846},"Migrate logic to ",{"type":49,"tag":88,"props":2848,"children":2850},{"className":2849},[],[2851],{"type":63,"value":982},{"type":63,"value":984},{"type":49,"tag":88,"props":2854,"children":2856},{"className":2855},[],[2857],{"type":63,"value":990},{"type":63,"value":2859},", then remove it",{"type":49,"tag":837,"props":2861,"children":2862},{},[2863,2875,2892],{"type":49,"tag":859,"props":2864,"children":2865},{},[2866,2868,2873],{"type":63,"value":2867},"Returning a value from ",{"type":49,"tag":88,"props":2869,"children":2871},{"className":2870},[],[2872],{"type":63,"value":982},{"type":63,"value":2874}," to drop a span does nothing",{"type":49,"tag":859,"props":2876,"children":2877},{},[2878,2883,2885,2890],{"type":49,"tag":88,"props":2879,"children":2881},{"className":2880},[],[2882],{"type":63,"value":982},{"type":63,"value":2884}," is mutation-only (",{"type":49,"tag":88,"props":2886,"children":2888},{"className":2887},[],[2889],{"type":63,"value":2251},{"type":63,"value":2891}," return)",{"type":49,"tag":859,"props":2893,"children":2894},{},[2895,2896,2901],{"type":63,"value":1629},{"type":49,"tag":88,"props":2897,"children":2899},{"className":2898},[],[2900],{"type":63,"value":990},{"type":63,"value":2902}," to drop spans",{"type":49,"tag":837,"props":2904,"children":2905},{},[2906,2918,2936],{"type":49,"tag":859,"props":2907,"children":2908},{},[2909,2911,2916],{"type":63,"value":2910},"Compile error: ",{"type":49,"tag":88,"props":2912,"children":2914},{"className":2913},[],[2915],{"type":63,"value":1766},{"type":63,"value":2917}," callback type mismatch",{"type":49,"tag":859,"props":2919,"children":2920},{},[2921,2923,2929,2931],{"type":63,"value":2922},"Callback must return ",{"type":49,"tag":88,"props":2924,"children":2926},{"className":2925},[],[2927],{"type":63,"value":2928},"Future\u003CT>",{"type":63,"value":2930}," for ",{"type":49,"tag":88,"props":2932,"children":2934},{"className":2933},[],[2935],{"type":63,"value":1766},{"type":49,"tag":859,"props":2937,"children":2938},{},[2939,2940,2945],{"type":63,"value":1629},{"type":49,"tag":88,"props":2941,"children":2943},{"className":2942},[],[2944],{"type":63,"value":1773},{"type":63,"value":2946}," for synchronous work",{"type":49,"tag":222,"props":2948,"children":2949},{},[],{"type":49,"tag":163,"props":2951,"children":2953},{"id":2952},"quick-reference",[2954],{"type":63,"value":2955},"Quick Reference",{"type":49,"tag":232,"props":2957,"children":2959},{"id":2958},"minimal-flutter-setup",[2960],{"type":63,"value":2961},"Minimal Flutter Setup",{"type":49,"tag":239,"props":2963,"children":2965},{"className":1117,"code":2964,"language":25,"meta":244,"style":244},"import 'package:flutter\u002Fwidgets.dart';\nimport 'package:sentry_flutter\u002Fsentry_flutter.dart';\n\nFuture\u003Cvoid> main() async {\n  await SentryFlutter.init((options) {\n    options.dsn = '__DSN__';\n    options.tracesSampleRate = 1.0;\n    options.traceLifecycle = SentryTraceLifecycle.stream;\n  }, appRunner: () => runApp(const MyApp()));\n\n  await Sentry.startSpan('load-config', (span) async {\n    span.setAttribute('source', SentryAttribute.string('remote'));\n    await loadConfig();\n  });\n}\n",[2966],{"type":49,"tag":88,"props":2967,"children":2968},{"__ignoreMap":244},[2969,2977,2985,2992,3000,3008,3016,3024,3032,3040,3047,3055,3063,3071,3079],{"type":49,"tag":250,"props":2970,"children":2971},{"class":252,"line":253},[2972],{"type":49,"tag":250,"props":2973,"children":2974},{},[2975],{"type":63,"value":2976},"import 'package:flutter\u002Fwidgets.dart';\n",{"type":49,"tag":250,"props":2978,"children":2979},{"class":252,"line":263},[2980],{"type":49,"tag":250,"props":2981,"children":2982},{},[2983],{"type":63,"value":2984},"import 'package:sentry_flutter\u002Fsentry_flutter.dart';\n",{"type":49,"tag":250,"props":2986,"children":2987},{"class":252,"line":309},[2988],{"type":49,"tag":250,"props":2989,"children":2990},{"emptyLinePlaceholder":43},[2991],{"type":63,"value":315},{"type":49,"tag":250,"props":2993,"children":2994},{"class":252,"line":318},[2995],{"type":49,"tag":250,"props":2996,"children":2997},{},[2998],{"type":63,"value":2999},"Future\u003Cvoid> main() async {\n",{"type":49,"tag":250,"props":3001,"children":3002},{"class":252,"line":327},[3003],{"type":49,"tag":250,"props":3004,"children":3005},{},[3006],{"type":63,"value":3007},"  await SentryFlutter.init((options) {\n",{"type":49,"tag":250,"props":3009,"children":3010},{"class":252,"line":389},[3011],{"type":49,"tag":250,"props":3012,"children":3013},{},[3014],{"type":63,"value":3015},"    options.dsn = '__DSN__';\n",{"type":49,"tag":250,"props":3017,"children":3018},{"class":252,"line":664},[3019],{"type":49,"tag":250,"props":3020,"children":3021},{},[3022],{"type":63,"value":3023},"    options.tracesSampleRate = 1.0;\n",{"type":49,"tag":250,"props":3025,"children":3026},{"class":252,"line":673},[3027],{"type":49,"tag":250,"props":3028,"children":3029},{},[3030],{"type":63,"value":3031},"    options.traceLifecycle = SentryTraceLifecycle.stream;\n",{"type":49,"tag":250,"props":3033,"children":3034},{"class":252,"line":734},[3035],{"type":49,"tag":250,"props":3036,"children":3037},{},[3038],{"type":63,"value":3039},"  }, appRunner: () => runApp(const MyApp()));\n",{"type":49,"tag":250,"props":3041,"children":3042},{"class":252,"line":742},[3043],{"type":49,"tag":250,"props":3044,"children":3045},{"emptyLinePlaceholder":43},[3046],{"type":63,"value":315},{"type":49,"tag":250,"props":3048,"children":3049},{"class":252,"line":751},[3050],{"type":49,"tag":250,"props":3051,"children":3052},{},[3053],{"type":63,"value":3054},"  await Sentry.startSpan('load-config', (span) async {\n",{"type":49,"tag":250,"props":3056,"children":3057},{"class":252,"line":1210},[3058],{"type":49,"tag":250,"props":3059,"children":3060},{},[3061],{"type":63,"value":3062},"    span.setAttribute('source', SentryAttribute.string('remote'));\n",{"type":49,"tag":250,"props":3064,"children":3065},{"class":252,"line":1218},[3066],{"type":49,"tag":250,"props":3067,"children":3068},{},[3069],{"type":63,"value":3070},"    await loadConfig();\n",{"type":49,"tag":250,"props":3072,"children":3073},{"class":252,"line":1422},[3074],{"type":49,"tag":250,"props":3075,"children":3076},{},[3077],{"type":63,"value":3078},"  });\n",{"type":49,"tag":250,"props":3080,"children":3081},{"class":252,"line":1431},[3082],{"type":49,"tag":250,"props":3083,"children":3084},{},[3085],{"type":63,"value":1428},{"type":49,"tag":232,"props":3087,"children":3089},{"id":3088},"minimal-dart-setup",[3090],{"type":63,"value":3091},"Minimal Dart Setup",{"type":49,"tag":239,"props":3093,"children":3095},{"className":1117,"code":3094,"language":25,"meta":244,"style":244},"import 'package:sentry\u002Fsentry.dart';\n\nFuture\u003Cvoid> main() async {\n  await Sentry.init((options) {\n    options.dsn = '__DSN__';\n    options.tracesSampleRate = 1.0;\n    options.traceLifecycle = SentryTraceLifecycle.stream;\n  });\n\n  await Sentry.startSpan('main-task', (span) async {\n    span.setAttribute('job.id', SentryAttribute.string('42'));\n    await doWork();\n  });\n}\n",[3096],{"type":49,"tag":88,"props":3097,"children":3098},{"__ignoreMap":244},[3099,3107,3114,3121,3129,3136,3143,3150,3157,3164,3172,3180,3188,3195],{"type":49,"tag":250,"props":3100,"children":3101},{"class":252,"line":253},[3102],{"type":49,"tag":250,"props":3103,"children":3104},{},[3105],{"type":63,"value":3106},"import 'package:sentry\u002Fsentry.dart';\n",{"type":49,"tag":250,"props":3108,"children":3109},{"class":252,"line":263},[3110],{"type":49,"tag":250,"props":3111,"children":3112},{"emptyLinePlaceholder":43},[3113],{"type":63,"value":315},{"type":49,"tag":250,"props":3115,"children":3116},{"class":252,"line":309},[3117],{"type":49,"tag":250,"props":3118,"children":3119},{},[3120],{"type":63,"value":2999},{"type":49,"tag":250,"props":3122,"children":3123},{"class":252,"line":318},[3124],{"type":49,"tag":250,"props":3125,"children":3126},{},[3127],{"type":63,"value":3128},"  await Sentry.init((options) {\n",{"type":49,"tag":250,"props":3130,"children":3131},{"class":252,"line":327},[3132],{"type":49,"tag":250,"props":3133,"children":3134},{},[3135],{"type":63,"value":3015},{"type":49,"tag":250,"props":3137,"children":3138},{"class":252,"line":389},[3139],{"type":49,"tag":250,"props":3140,"children":3141},{},[3142],{"type":63,"value":3023},{"type":49,"tag":250,"props":3144,"children":3145},{"class":252,"line":664},[3146],{"type":49,"tag":250,"props":3147,"children":3148},{},[3149],{"type":63,"value":3031},{"type":49,"tag":250,"props":3151,"children":3152},{"class":252,"line":673},[3153],{"type":49,"tag":250,"props":3154,"children":3155},{},[3156],{"type":63,"value":3078},{"type":49,"tag":250,"props":3158,"children":3159},{"class":252,"line":734},[3160],{"type":49,"tag":250,"props":3161,"children":3162},{"emptyLinePlaceholder":43},[3163],{"type":63,"value":315},{"type":49,"tag":250,"props":3165,"children":3166},{"class":252,"line":742},[3167],{"type":49,"tag":250,"props":3168,"children":3169},{},[3170],{"type":63,"value":3171},"  await Sentry.startSpan('main-task', (span) async {\n",{"type":49,"tag":250,"props":3173,"children":3174},{"class":252,"line":751},[3175],{"type":49,"tag":250,"props":3176,"children":3177},{},[3178],{"type":63,"value":3179},"    span.setAttribute('job.id', SentryAttribute.string('42'));\n",{"type":49,"tag":250,"props":3181,"children":3182},{"class":252,"line":1210},[3183],{"type":49,"tag":250,"props":3184,"children":3185},{},[3186],{"type":63,"value":3187},"    await doWork();\n",{"type":49,"tag":250,"props":3189,"children":3190},{"class":252,"line":1218},[3191],{"type":49,"tag":250,"props":3192,"children":3193},{},[3194],{"type":63,"value":3078},{"type":49,"tag":250,"props":3196,"children":3197},{"class":252,"line":1422},[3198],{"type":49,"tag":250,"props":3199,"children":3200},{},[3201],{"type":63,"value":1428},{"type":49,"tag":232,"props":3203,"children":3205},{"id":3204},"span-control-reference",[3206],{"type":63,"value":3207},"Span Control Reference",{"type":49,"tag":239,"props":3209,"children":3211},{"className":1117,"code":3210,"language":25,"meta":244,"style":244},"\u002F\u002F Status (auto-set to error on throw, ok otherwise)\nspan.status = SentrySpanStatusV2.error; \u002F\u002F error | ok\n\n\u002F\u002F Retroactive timing\nSentry.startSpanSync('task', (_) => work(), startTimestamp: start); \u002F\u002F also on startSpan\nspan.end(endTimestamp: end);                                        \u002F\u002F on any span\n\n\u002F\u002F Parenting (startSpan \u002F startSpanSync \u002F startInactiveSpan)\n\u002F\u002F default: inherit active span | parentSpan: someSpan -> explicit parent | parentSpan: null -> root\n",[3212],{"type":49,"tag":88,"props":3213,"children":3214},{"__ignoreMap":244},[3215,3223,3231,3238,3246,3254,3262,3269,3277],{"type":49,"tag":250,"props":3216,"children":3217},{"class":252,"line":253},[3218],{"type":49,"tag":250,"props":3219,"children":3220},{},[3221],{"type":63,"value":3222},"\u002F\u002F Status (auto-set to error on throw, ok otherwise)\n",{"type":49,"tag":250,"props":3224,"children":3225},{"class":252,"line":263},[3226],{"type":49,"tag":250,"props":3227,"children":3228},{},[3229],{"type":63,"value":3230},"span.status = SentrySpanStatusV2.error; \u002F\u002F error | ok\n",{"type":49,"tag":250,"props":3232,"children":3233},{"class":252,"line":309},[3234],{"type":49,"tag":250,"props":3235,"children":3236},{"emptyLinePlaceholder":43},[3237],{"type":63,"value":315},{"type":49,"tag":250,"props":3239,"children":3240},{"class":252,"line":318},[3241],{"type":49,"tag":250,"props":3242,"children":3243},{},[3244],{"type":63,"value":3245},"\u002F\u002F Retroactive timing\n",{"type":49,"tag":250,"props":3247,"children":3248},{"class":252,"line":327},[3249],{"type":49,"tag":250,"props":3250,"children":3251},{},[3252],{"type":63,"value":3253},"Sentry.startSpanSync('task', (_) => work(), startTimestamp: start); \u002F\u002F also on startSpan\n",{"type":49,"tag":250,"props":3255,"children":3256},{"class":252,"line":389},[3257],{"type":49,"tag":250,"props":3258,"children":3259},{},[3260],{"type":63,"value":3261},"span.end(endTimestamp: end);                                        \u002F\u002F on any span\n",{"type":49,"tag":250,"props":3263,"children":3264},{"class":252,"line":664},[3265],{"type":49,"tag":250,"props":3266,"children":3267},{"emptyLinePlaceholder":43},[3268],{"type":63,"value":315},{"type":49,"tag":250,"props":3270,"children":3271},{"class":252,"line":673},[3272],{"type":49,"tag":250,"props":3273,"children":3274},{},[3275],{"type":63,"value":3276},"\u002F\u002F Parenting (startSpan \u002F startSpanSync \u002F startInactiveSpan)\n",{"type":49,"tag":250,"props":3278,"children":3279},{"class":252,"line":734},[3280],{"type":49,"tag":250,"props":3281,"children":3282},{},[3283],{"type":63,"value":3284},"\u002F\u002F default: inherit active span | parentSpan: someSpan -> explicit parent | parentSpan: null -> root\n",{"type":49,"tag":232,"props":3286,"children":3288},{"id":3287},"full-migration-checklist",[3289],{"type":63,"value":3290},"Full Migration Checklist",{"type":49,"tag":170,"props":3292,"children":3295},{"className":3293},[3294],"contains-task-list",[3296,3328,3343,3377,3398,3431,3459,3481,3504],{"type":49,"tag":174,"props":3297,"children":3300},{"className":3298},[3299],"task-list-item",[3301,3306,3308,3313,3315,3320,3321,3326],{"type":49,"tag":3302,"props":3303,"children":3305},"input",{"disabled":43,"type":3304},"checkbox",[],{"type":63,"value":3307}," SDK version is ",{"type":49,"tag":88,"props":3309,"children":3311},{"className":3310},[],[3312],{"type":63,"value":464},{"type":63,"value":3314}," (",{"type":49,"tag":88,"props":3316,"children":3318},{"className":3317},[],[3319],{"type":63,"value":8},{"type":63,"value":451},{"type":49,"tag":88,"props":3322,"children":3324},{"className":3323},[],[3325],{"type":63,"value":121},{"type":63,"value":3327},")",{"type":49,"tag":174,"props":3329,"children":3331},{"className":3330},[3299],[3332,3335,3336,3341],{"type":49,"tag":3302,"props":3333,"children":3334},{"disabled":43,"type":3304},[],{"type":63,"value":458},{"type":49,"tag":88,"props":3337,"children":3339},{"className":3338},[],[3340],{"type":63,"value":2816},{"type":63,"value":3342}," set in every init call",{"type":49,"tag":174,"props":3344,"children":3346},{"className":3345},[3299],[3347,3350,3352,3357,3359,3364,3365,3370,3371],{"type":49,"tag":3302,"props":3348,"children":3349},{"disabled":43,"type":3304},[],{"type":63,"value":3351}," All ",{"type":49,"tag":88,"props":3353,"children":3355},{"className":3354},[],[3356],{"type":63,"value":1251},{"type":63,"value":3358}," calls replaced with ",{"type":49,"tag":88,"props":3360,"children":3362},{"className":3361},[],[3363],{"type":63,"value":207},{"type":63,"value":451},{"type":49,"tag":88,"props":3366,"children":3368},{"className":3367},[],[3369],{"type":63,"value":1773},{"type":63,"value":451},{"type":49,"tag":88,"props":3372,"children":3374},{"className":3373},[],[3375],{"type":63,"value":3376},"startInactiveSpan",{"type":49,"tag":174,"props":3378,"children":3380},{"className":3379},[3299],[3381,3384,3385,3390,3392,3397],{"type":49,"tag":3302,"props":3382,"children":3383},{"disabled":43,"type":3304},[],{"type":63,"value":3351},{"type":49,"tag":88,"props":3386,"children":3388},{"className":3387},[],[3389],{"type":63,"value":1306},{"type":63,"value":3391}," calls replaced with nested ",{"type":49,"tag":88,"props":3393,"children":3395},{"className":3394},[],[3396],{"type":63,"value":207},{"type":63,"value":869},{"type":49,"tag":174,"props":3399,"children":3401},{"className":3400},[3299],[3402,3405,3406,3411,3412,3417,3419,3425,3426],{"type":49,"tag":3302,"props":3403,"children":3404},{"disabled":43,"type":3304},[],{"type":63,"value":458},{"type":49,"tag":88,"props":3407,"children":3409},{"className":3408},[],[3410],{"type":63,"value":930},{"type":63,"value":451},{"type":49,"tag":88,"props":3413,"children":3415},{"className":3414},[],[3416],{"type":63,"value":937},{"type":63,"value":3418}," on spans replaced with typed ",{"type":49,"tag":88,"props":3420,"children":3422},{"className":3421},[],[3423],{"type":63,"value":3424},"setAttribute",{"type":63,"value":451},{"type":49,"tag":88,"props":3427,"children":3429},{"className":3428},[],[3430],{"type":63,"value":957},{"type":49,"tag":174,"props":3432,"children":3434},{"className":3433},[3299],[3435,3438,3439,3444,3446,3451,3452,3457],{"type":49,"tag":3302,"props":3436,"children":3437},{"disabled":43,"type":3304},[],{"type":63,"value":458},{"type":49,"tag":88,"props":3440,"children":3442},{"className":3441},[],[3443],{"type":63,"value":969},{"type":63,"value":3445}," logic migrated to ",{"type":49,"tag":88,"props":3447,"children":3449},{"className":3448},[],[3450],{"type":63,"value":982},{"type":63,"value":984},{"type":49,"tag":88,"props":3453,"children":3455},{"className":3454},[],[3456],{"type":63,"value":990},{"type":63,"value":3458},", option removed",{"type":49,"tag":174,"props":3460,"children":3462},{"className":3461},[3299],[3463,3466,3467,3472,3474,3479],{"type":49,"tag":3302,"props":3464,"children":3465},{"disabled":43,"type":3304},[],{"type":63,"value":458},{"type":49,"tag":88,"props":3468,"children":3470},{"className":3469},[],[3471],{"type":63,"value":3376},{"type":63,"value":3473}," spans have a guaranteed ",{"type":49,"tag":88,"props":3475,"children":3477},{"className":3476},[],[3478],{"type":63,"value":1642},{"type":63,"value":3480}," call path",{"type":49,"tag":174,"props":3482,"children":3484},{"className":3483},[3299],[3485,3488,3489,3495,3496,3502],{"type":49,"tag":3302,"props":3486,"children":3487},{"disabled":43,"type":3304},[],{"type":63,"value":458},{"type":49,"tag":88,"props":3490,"children":3492},{"className":3491},[],[3493],{"type":63,"value":3494},"dart analyze",{"type":63,"value":451},{"type":49,"tag":88,"props":3497,"children":3499},{"className":3498},[],[3500],{"type":63,"value":3501},"flutter analyze",{"type":63,"value":3503}," passes",{"type":49,"tag":174,"props":3505,"children":3507},{"className":3506},[3299],[3508,3511],{"type":49,"tag":3302,"props":3509,"children":3510},{"disabled":43,"type":3304},[],{"type":63,"value":3512}," Spans visible in Sentry Traces view",{"type":49,"tag":3514,"props":3515,"children":3516},"style",{},[3517],{"type":63,"value":3518},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3520,"total":3628},[3521,3539,3554,3570,3586,3600,3615],{"slug":3522,"name":3522,"fn":3523,"description":3524,"org":3525,"tags":3526,"stars":27,"repoUrl":28,"updatedAt":3538},"sentry-android-sdk","setup Sentry SDK for Android","Full Sentry SDK setup for Android. Use when asked to \"add Sentry to Android\", \"install sentry-android\", \"setup Sentry in Android\", or configure error monitoring, tracing, profiling, session replay, or logging for Android applications. Supports Kotlin and Java codebases.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3527,3530,3533,3534,3537],{"name":3528,"slug":3529,"type":16},"Android","android",{"name":3531,"slug":3532,"type":16},"Debugging","debugging",{"name":14,"slug":15,"type":16},{"name":3535,"slug":3536,"type":16},"SDK","sdk",{"name":9,"slug":8,"type":16},"2026-07-12T06:08:32.396344",{"slug":3540,"name":3540,"fn":3541,"description":3542,"org":3543,"tags":3544,"stars":27,"repoUrl":28,"updatedAt":3553},"sentry-browser-sdk","setup Sentry error monitoring for browser applications","Full Sentry SDK setup for browser JavaScript. Use when asked to \"add Sentry to a website\", \"install @sentry\u002Fbrowser\", or configure error monitoring, tracing, session replay, or logging for vanilla JavaScript, jQuery, static sites, or WordPress.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3545,3546,3549,3552],{"name":3531,"slug":3532,"type":16},{"name":3547,"slug":3548,"type":16},"JavaScript","javascript",{"name":3550,"slug":3551,"type":16},"Monitoring","monitoring",{"name":9,"slug":8,"type":16},"2026-07-18T05:47:44.437436",{"slug":3555,"name":3555,"fn":3556,"description":3557,"org":3558,"tags":3559,"stars":27,"repoUrl":28,"updatedAt":3569},"sentry-cloudflare-sdk","setup Sentry monitoring for Cloudflare","Full Sentry SDK setup for Cloudflare Workers and Pages. Use when asked to \"add Sentry to Cloudflare Workers\", \"install @sentry\u002Fcloudflare\", or configure error monitoring, tracing, logging, crons, or AI monitoring for Cloudflare Workers, Pages, Durable Objects, Queues, Workflows, or Hono on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3560,3563,3566,3567,3568],{"name":3561,"slug":3562,"type":16},"Cloudflare","cloudflare",{"name":3564,"slug":3565,"type":16},"Edge Functions","edge-functions",{"name":3550,"slug":3551,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-11T05:53:25.361175",{"slug":3571,"name":3571,"fn":3572,"description":3573,"org":3574,"tags":3575,"stars":27,"repoUrl":28,"updatedAt":3585},"sentry-cocoa-sdk","integrate Sentry SDK into Apple applications","Full Sentry SDK setup for Apple platforms (iOS, macOS, tvOS, watchOS, visionOS). Use when asked to \"add Sentry to iOS\", \"add Sentry to Swift\", \"install sentry-cocoa\", or configure error monitoring, tracing, profiling, session replay, logging, or metrics for Apple applications. Supports SwiftUI and UIKit.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3576,3579,3582,3583,3584],{"name":3577,"slug":3578,"type":16},"iOS","ios",{"name":3580,"slug":3581,"type":16},"macOS","macos",{"name":3550,"slug":3551,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-11T05:52:57.042493",{"slug":3587,"name":3587,"fn":3588,"description":3589,"org":3590,"tags":3591,"stars":27,"repoUrl":28,"updatedAt":3599},"sentry-dotnet-sdk","setup Sentry SDK for .NET","Full Sentry SDK setup for .NET. Use when asked to \"add Sentry to .NET\", \"install Sentry for C#\", or configure error monitoring, tracing, profiling, logging, or crons for ASP.NET Core, MAUI, WPF, WinForms, Blazor, Azure Functions, or any other .NET application.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3592,3595,3596,3597,3598],{"name":3593,"slug":3594,"type":16},".NET","net",{"name":3531,"slug":3532,"type":16},{"name":14,"slug":15,"type":16},{"name":3535,"slug":3536,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T06:08:33.793148",{"slug":3601,"name":3601,"fn":3602,"description":3603,"org":3604,"tags":3605,"stars":27,"repoUrl":28,"updatedAt":3614},"sentry-elixir-sdk","setup Sentry SDK for Elixir","Full Sentry SDK setup for Elixir. Use when asked to \"add Sentry to Elixir\", \"install sentry for Elixir\", or configure error monitoring, tracing, logging, or crons for Elixir, Phoenix, or Plug applications. Supports Phoenix, Plug, LiveView, Oban, and Quantum.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3606,3609,3612,3613],{"name":3607,"slug":3608,"type":16},"Backend","backend",{"name":3610,"slug":3611,"type":16},"Elixir","elixir",{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-11T05:53:11.69581",{"slug":3616,"name":3616,"fn":3617,"description":3618,"org":3619,"tags":3620,"stars":27,"repoUrl":28,"updatedAt":3627},"sentry-fix-issues","fix production issues with Sentry","Find and fix issues from Sentry using MCP. Use when asked to fix Sentry errors, debug production issues, investigate exceptions, or resolve bugs reported in Sentry. Methodically analyzes stack traces, breadcrumbs, traces, and context to identify root causes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3621,3622,3625,3626],{"name":3531,"slug":3532,"type":16},{"name":3623,"slug":3624,"type":16},"Incident Response","incident-response",{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T06:08:35.550824",27,{"items":3630,"total":3802},[3631,3650,3664,3679,3693,3710,3726,3740,3750,3761,3771,3789],{"slug":3632,"name":3632,"fn":3633,"description":3634,"org":3635,"tags":3636,"stars":3647,"repoUrl":3648,"updatedAt":3649},"xcodebuildmcp","build and test Apple apps with XcodeBuildMCP","Official skill for XcodeBuildMCP. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3637,3638,3639,3640,3641,3644],{"name":3531,"slug":3532,"type":16},{"name":3577,"slug":3578,"type":16},{"name":3580,"slug":3581,"type":16},{"name":9,"slug":8,"type":16},{"name":3642,"slug":3643,"type":16},"Testing","testing",{"name":3645,"slug":3646,"type":16},"Xcode","xcode",6176,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002FXcodeBuildMCP","2026-04-06T18:13:34.8719",{"slug":3651,"name":3651,"fn":3652,"description":3653,"org":3654,"tags":3655,"stars":3647,"repoUrl":3648,"updatedAt":3663},"xcodebuildmcp-cli","build and test Apple apps via CLI","Official skill for the XcodeBuildMCP CLI. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3656,3659,3660,3661,3662],{"name":3657,"slug":3658,"type":16},"CLI","cli",{"name":3577,"slug":3578,"type":16},{"name":3580,"slug":3581,"type":16},{"name":3642,"slug":3643,"type":16},{"name":3645,"slug":3646,"type":16},"2026-04-06T18:13:36.13414",{"slug":3665,"name":3665,"fn":3666,"description":3667,"org":3668,"tags":3669,"stars":3676,"repoUrl":3677,"updatedAt":3678},"agents-md","maintain project instruction files","Creates and maintains concise AGENTS.md and CLAUDE.md project instruction files. Use when asked to create AGENTS.md, update AGENTS.md, maintain agent docs, set up CLAUDE.md, document repository agent conventions, or keep coding-agent instructions minimal and reference-backed.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3670,3673],{"name":3671,"slug":3672,"type":16},"Documentation","documentation",{"name":3674,"slug":3675,"type":16},"Engineering","engineering",861,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fskills","2026-05-15T06:16:29.695991",{"slug":3680,"name":3680,"fn":3681,"description":3682,"org":3683,"tags":3684,"stars":3676,"repoUrl":3677,"updatedAt":3692},"blog-writing-guide","write and review engineering blog posts","Write, review, and improve blog posts for the Sentry engineering blog following Sentry's specific writing standards, voice, and quality bar. Use this skill whenever someone asks to write a blog post, draft a technical article, review blog content, improve a draft, write a product announcement, create an engineering deep-dive, or produce any written content destined for the Sentry blog or developer audience. Also trigger when the user mentions \"blog post,\" \"blog draft,\" \"write-up,\" \"announcement post,\" \"engineering post,\" \"deep dive,\" \"postmortem,\" or asks for help with technical writing for Sentry. Even if the user just says \"help me write about [feature\u002Ftopic]\" — if it sounds like it could become a Sentry blog post, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3685,3688,3689],{"name":3686,"slug":3687,"type":16},"Communications","communications",{"name":9,"slug":8,"type":16},{"name":3690,"slug":3691,"type":16},"Technical Writing","technical-writing","2026-05-15T06:16:33.38217",{"slug":3694,"name":3694,"fn":3695,"description":3696,"org":3697,"tags":3698,"stars":3676,"repoUrl":3677,"updatedAt":3709},"brand-guidelines","write copy following Sentry brand guidelines","Write copy following Sentry brand guidelines. Use when writing UI text, error messages, empty states, onboarding flows, 404 pages, documentation, marketing copy, or any user-facing content. Covers both Plain Speech (default) and Sentry Voice tones.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3699,3702,3705,3706],{"name":3700,"slug":3701,"type":16},"Branding","branding",{"name":3703,"slug":3704,"type":16},"Content Creation","content-creation",{"name":9,"slug":8,"type":16},{"name":3707,"slug":3708,"type":16},"UX Copy","ux-copy","2026-05-15T06:16:22.395707",{"slug":3711,"name":3711,"fn":3712,"description":3713,"org":3714,"tags":3715,"stars":3676,"repoUrl":3677,"updatedAt":3725},"claude-settings-audit","generate Claude Code settings permissions","Analyze a repository to generate recommended Claude Code settings.json permissions. Use when setting up a new project, auditing existing settings, or determining which read-only bash commands to allow. Detects tech stack, build tools, and monorepo structure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3716,3719,3722],{"name":3717,"slug":3718,"type":16},"Claude Code","claude-code",{"name":3720,"slug":3721,"type":16},"Configuration","configuration",{"name":3723,"slug":3724,"type":16},"Security","security","2026-05-15T06:16:44.335977",{"slug":3727,"name":3727,"fn":3728,"description":3729,"org":3730,"tags":3731,"stars":3676,"repoUrl":3677,"updatedAt":3739},"code-review","perform code reviews for Sentry projects","Perform code reviews following Sentry engineering practices. Use when reviewing pull requests, examining code changes, or providing feedback on code quality. Covers security, performance, testing, and design review.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3732,3734,3735,3738],{"name":3733,"slug":3727,"type":16},"Code Review",{"name":3674,"slug":3675,"type":16},{"name":3736,"slug":3737,"type":16},"Performance","performance",{"name":3723,"slug":3724,"type":16},"2026-05-15T06:16:35.824864",{"slug":3741,"name":3741,"fn":3742,"description":3743,"org":3744,"tags":3745,"stars":3676,"repoUrl":3677,"updatedAt":3749},"code-simplifier","simplify and refine source code","Simplifies and refines code for clarity, consistency, and maintainability while preserving all functionality. Use when asked to \"simplify code\", \"clean up code\", \"refactor for clarity\", \"improve readability\", or review recently modified code for elegance. Focuses on project-specific best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3746],{"name":3747,"slug":3748,"type":16},"Code Analysis","code-analysis","2026-05-15T06:16:32.127981",{"slug":3751,"name":3751,"fn":3752,"description":3753,"org":3754,"tags":3755,"stars":3676,"repoUrl":3677,"updatedAt":3760},"commit","create commits with Sentry conventions","Use for every request to commit changes or draft a commit message. Creates Sentry-style conventional commits with issue references.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3756,3759],{"name":3757,"slug":3758,"type":16},"Git","git",{"name":9,"slug":8,"type":16},"2026-07-18T05:15:10.723937",{"slug":3762,"name":3762,"fn":3763,"description":3764,"org":3765,"tags":3766,"stars":3676,"repoUrl":3677,"updatedAt":3770},"create-branch","create git branches for Sentry workflows","Create a git branch following Sentry naming conventions. Use when asked to \"create a branch\", \"new branch\", \"start a branch\", \"make a branch\", \"switch to a new branch\", or when starting new work on the default branch.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3767,3768,3769],{"name":3674,"slug":3675,"type":16},{"name":3757,"slug":3758,"type":16},{"name":9,"slug":8,"type":16},"2026-05-15T06:16:39.458431",{"slug":3772,"name":3772,"fn":3773,"description":3774,"org":3775,"tags":3776,"stars":3676,"repoUrl":3677,"updatedAt":3788},"django-access-review","review Django access control and IDOR","Django access control and IDOR security review. Use when reviewing Django views, DRF viewsets, ORM queries, or any Python\u002FDjango code handling user authorization. Trigger keywords: \"IDOR\", \"access control\", \"authorization\", \"Django permissions\", \"object permissions\", \"tenant isolation\", \"broken access\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3777,3780,3781,3784,3787],{"name":3778,"slug":3779,"type":16},"Access Control","access-control",{"name":3747,"slug":3748,"type":16},{"name":3782,"slug":3783,"type":16},"Django","django",{"name":3785,"slug":3786,"type":16},"Python","python",{"name":3723,"slug":3724,"type":16},"2026-05-15T06:16:43.098698",{"slug":3790,"name":3790,"fn":3791,"description":3792,"org":3793,"tags":3794,"stars":3676,"repoUrl":3677,"updatedAt":3801},"django-perf-review","review and optimize Django performance","Django performance code review. Use when asked to \"review Django performance\", \"find N+1 queries\", \"optimize Django\", \"check queryset performance\", \"database performance\", \"Django ORM issues\", or audit Django code for performance problems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3795,3796,3799,3800],{"name":3733,"slug":3727,"type":16},{"name":3797,"slug":3798,"type":16},"Database","database",{"name":3782,"slug":3783,"type":16},{"name":3736,"slug":3737,"type":16},"2026-05-15T06:16:24.832813",88]