fix(telemetry): route every error report through one reporter that reaches both sinks - #15346
Conversation
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 24 minutes Limit details: You’ve used all 2 included reviews currently available. Your 84 included PR review attempts over the past 7 days set your current allowance at 2 reviews per hour. Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits within each organization. For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (16)
Comment |
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ✅ 1828 passed, 0 failed · 3 flaky📊 Browser Reports
📦 Bundle: 8.86 MB gzip 🔴 +1.43 kBDetailsSummary
Category Glance App Entry Points — 3.71 kB (baseline 3.71 kB) • 🔴 +2 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.37 MB (baseline 1.37 MB) • 🔴 +17 BGraph editor runtime, canvas, workflow orchestration
Status: 2 added / 2 removed / 1 unchanged Views & Navigation — 124 kB (baseline 124 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 13 added / 13 removed / 4 unchanged Panels & Settings — 566 kB (baseline 566 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 10 added / 10 removed / 16 unchanged User & Accounts — 27.5 kB (baseline 27.7 kB) • 🟢 -231 BAuthentication, profile, and account management bundles
Status: 6 added / 6 removed / 5 unchanged Editors & Dialogs — 125 kB (baseline 125 kB) • 🔴 +2 BModals, dialogs, drawers, and in-app editors
Status: 7 added / 7 removed / 1 unchanged UI Components — 67.1 kB (baseline 67.1 kB) • ⚪ 0 BReusable component library chunks
Status: 6 added / 6 removed / 8 unchanged Data & Services — 3.52 MB (baseline 3.52 MB) • 🔴 +102 BStores, services, APIs, and repositories
Status: 14 added / 14 removed / 3 unchanged Utilities & Hooks — 549 kB (baseline 550 kB) • 🟢 -1.27 kBHelpers, composables, and utility bundles
Status: 18 added / 19 removed / 19 unchanged Vendor & Third-Party — 16.8 MB (baseline 16.8 MB) • 🔴 +197 BExternal libraries and shared vendor chunks
Status: 1 added / 1 removed / 17 unchanged Other — 14.2 MB (baseline 14.2 MB) • 🔴 +4.25 kBBundles that do not match a named category
Status: 69 added / 68 removed / 217 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-08-18T20:54:19.822Z",
"gitSha": "ef72bd8f2656e40e6ddc839e4233cdc8b3c7e211",
"branch": "fix/unified-report-error",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2137.587999999994,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.478999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 583.635,
"heapDeltaBytes": 9872488,
"heapUsedBytes": 70354196,
"domNodes": -283,
"jsHeapTotalBytes": 5234688,
"scriptDurationMs": 7.184999999999999,
"eventListeners": -181,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-idle",
"durationMs": 2036.4980000000514,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.239000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 481.54100000000005,
"heapDeltaBytes": -5832316,
"heapUsedBytes": 55354180,
"domNodes": -282,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 6.380999999999999,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1857.4700000000348,
"styleRecalcs": 74,
"styleRecalcDurationMs": 37.004,
"layouts": 12,
"layoutDurationMs": 3.6130000000000004,
"taskDurationMs": 882.8209999999999,
"heapDeltaBytes": 3224212,
"heapUsedBytes": 63941232,
"domNodes": -279,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 117.92699999999999,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1835.3020000000697,
"styleRecalcs": 72,
"styleRecalcDurationMs": 32.766000000000005,
"layouts": 12,
"layoutDurationMs": 3.5329999999999995,
"taskDurationMs": 837.9340000000001,
"heapDeltaBytes": 2508160,
"heapUsedBytes": 62851364,
"domNodes": -282,
"jsHeapTotalBytes": 4710400,
"scriptDurationMs": 107.766,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1733.7949999999864,
"styleRecalcs": 30,
"styleRecalcDurationMs": 17.616,
"layouts": 6,
"layoutDurationMs": 0.722,
"taskDurationMs": 345.702,
"heapDeltaBytes": 2786984,
"heapUsedBytes": 63162500,
"domNodes": 76,
"jsHeapTotalBytes": 4980736,
"scriptDurationMs": 9.174999999999999,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1711.8480000000318,
"styleRecalcs": 31,
"styleRecalcDurationMs": 15.654000000000002,
"layouts": 6,
"layoutDurationMs": 0.5840000000000001,
"taskDurationMs": 340.776,
"heapDeltaBytes": 2777724,
"heapUsedBytes": 63241200,
"domNodes": 75,
"jsHeapTotalBytes": 4980736,
"scriptDurationMs": 9.154,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "dom-widget-clipping",
"durationMs": 585.1620000000253,
"styleRecalcs": 11,
"styleRecalcDurationMs": 10.493999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 372.572,
"heapDeltaBytes": 10758524,
"heapUsedBytes": 71179252,
"domNodes": 18,
"jsHeapTotalBytes": 5242880,
"scriptDurationMs": 55.44800000000001,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "dom-widget-clipping",
"durationMs": 571.843000000058,
"styleRecalcs": 11,
"styleRecalcDurationMs": 8.002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 346.986,
"heapDeltaBytes": 10413204,
"heapUsedBytes": 70915104,
"domNodes": 18,
"jsHeapTotalBytes": 5242880,
"scriptDurationMs": 54.54800000000001,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2037.8029999999967,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.808,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 584.6139999999999,
"heapDeltaBytes": 2467860,
"heapUsedBytes": 76568004,
"domNodes": -258,
"jsHeapTotalBytes": -1576960,
"scriptDurationMs": 13.560999999999996,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2062.3509999999214,
"styleRecalcs": 8,
"styleRecalcDurationMs": 16.591,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 613.656,
"heapDeltaBytes": 2343008,
"heapUsedBytes": 76457584,
"domNodes": -263,
"jsHeapTotalBytes": -1839104,
"scriptDurationMs": 15.118,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-pan",
"durationMs": 2141.6659999999865,
"styleRecalcs": 69,
"styleRecalcDurationMs": 13.921999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1158.229,
"heapDeltaBytes": 13974628,
"heapUsedBytes": 88048284,
"domNodes": -282,
"jsHeapTotalBytes": 4677632,
"scriptDurationMs": 327.73,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2139.454999999998,
"styleRecalcs": 69,
"styleRecalcDurationMs": 12.891000000000004,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1191.4,
"heapDeltaBytes": 1178792,
"heapUsedBytes": 76207656,
"domNodes": -267,
"jsHeapTotalBytes": -1875968,
"scriptDurationMs": 336.84600000000006,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3183.2319999999754,
"styleRecalcs": 62,
"styleRecalcDurationMs": 11.668000000000001,
"layouts": 60,
"layoutDurationMs": 6.801,
"taskDurationMs": 1308.441,
"heapDeltaBytes": 15839904,
"heapUsedBytes": 77979156,
"domNodes": 6,
"jsHeapTotalBytes": 0,
"scriptDurationMs": 377.532,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-zoom",
"durationMs": 3124.1110000000845,
"styleRecalcs": 63,
"styleRecalcDurationMs": 11.431999999999999,
"layouts": 60,
"layoutDurationMs": 6.8950000000000005,
"taskDurationMs": 1291.4569999999999,
"heapDeltaBytes": 15356996,
"heapUsedBytes": 77429724,
"domNodes": 6,
"jsHeapTotalBytes": 0,
"scriptDurationMs": 380.142,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "legacy-node-drag",
"durationMs": 2358.748999999989,
"styleRecalcs": 47,
"styleRecalcDurationMs": 10.848,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1394.051,
"heapDeltaBytes": 12077660,
"heapUsedBytes": 94754068,
"domNodes": 14,
"jsHeapTotalBytes": 7602176,
"scriptDurationMs": 458.772,
"eventListeners": 186,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "legacy-node-drag",
"durationMs": 2121.3599999999815,
"styleRecalcs": 45,
"styleRecalcDurationMs": 7.977000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1411.7700000000002,
"heapDeltaBytes": -19437132,
"heapUsedBytes": 63243884,
"domNodes": -276,
"jsHeapTotalBytes": 7929856,
"scriptDurationMs": 444.157,
"eventListeners": 31,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2050.1539999999636,
"styleRecalcs": 9,
"styleRecalcDurationMs": 11.560999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 600.9209999999999,
"heapDeltaBytes": -5341396,
"heapUsedBytes": 75225032,
"domNodes": -264,
"jsHeapTotalBytes": 4784128,
"scriptDurationMs": 13.653999999999996,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "minimap-idle",
"durationMs": 2056.67799999992,
"styleRecalcs": 9,
"styleRecalcDurationMs": 11.401000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 596.817,
"heapDeltaBytes": -6995572,
"heapUsedBytes": 73735892,
"domNodes": -270,
"jsHeapTotalBytes": 3403776,
"scriptDurationMs": 15.045999999999998,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 562.8240000000346,
"styleRecalcs": 47,
"styleRecalcDurationMs": 10.492,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 380.664,
"heapDeltaBytes": 11375848,
"heapUsedBytes": 71651452,
"domNodes": 20,
"jsHeapTotalBytes": 5505024,
"scriptDurationMs": 114.984,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 588.9640000000327,
"styleRecalcs": 46,
"styleRecalcDurationMs": 9.774000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 396.529,
"heapDeltaBytes": 11066936,
"heapUsedBytes": 71955128,
"domNodes": 18,
"jsHeapTotalBytes": 5767168,
"scriptDurationMs": 123.73500000000001,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 1991.4859999999521,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.297,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 470.1289999999999,
"heapDeltaBytes": -223300,
"heapUsedBytes": 60409516,
"domNodes": -282,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 5.72,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 1997.5110000000313,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.910999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 470.576,
"heapDeltaBytes": 773788,
"heapUsedBytes": 60955180,
"domNodes": -282,
"jsHeapTotalBytes": 4186112,
"scriptDurationMs": 5.849999999999998,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1767.7229999999895,
"styleRecalcs": 76,
"styleRecalcDurationMs": 39.436,
"layouts": 16,
"layoutDurationMs": 4.432,
"taskDurationMs": 817.231,
"heapDeltaBytes": -1688860,
"heapUsedBytes": 59099316,
"domNodes": -280,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 87.642,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1759.539000000018,
"styleRecalcs": 75,
"styleRecalcDurationMs": 36.878,
"layouts": 16,
"layoutDurationMs": 4.767,
"taskDurationMs": 818.014,
"heapDeltaBytes": 12633776,
"heapUsedBytes": 73602756,
"domNodes": -281,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 84.43900000000001,
"eventListeners": -183,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-transition-enter",
"durationMs": 1417.293000000086,
"styleRecalcs": 18,
"styleRecalcDurationMs": 30.744000000000007,
"layouts": 13,
"layoutDurationMs": 14.325999999999999,
"taskDurationMs": 900.609,
"heapDeltaBytes": 22204716,
"heapUsedBytes": 103317228,
"domNodes": 13673,
"jsHeapTotalBytes": 11010048,
"scriptDurationMs": 16.108000000000004,
"eventListeners": 2375,
"totalBlockingTimeMs": 142,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8254.161000000011,
"styleRecalcs": 248,
"styleRecalcDurationMs": 34.906000000000006,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4039.446,
"heapDeltaBytes": 9779112,
"heapUsedBytes": 83808124,
"domNodes": -268,
"jsHeapTotalBytes": -827392,
"scriptDurationMs": 1026.5849999999998,
"eventListeners": -131,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8202.079000000027,
"styleRecalcs": 251,
"styleRecalcDurationMs": 36.367999999999995,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4068.9529999999995,
"heapDeltaBytes": 9342416,
"heapUsedBytes": 83211696,
"domNodes": -260,
"jsHeapTotalBytes": -1089536,
"scriptDurationMs": 1013.941,
"eventListeners": -135,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 16812.028999999995,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16217.61,
"heapDeltaBytes": -47358404,
"heapUsedBytes": 173433088,
"domNodes": -8312,
"jsHeapTotalBytes": -15667200,
"scriptDurationMs": 113.211,
"eventListeners": -16387,
"totalBlockingTimeMs": 0,
"frameDurationMs": 18.333333333333332,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 17208.63899999995,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16541.666,
"heapDeltaBytes": -26224828,
"heapUsedBytes": 179004424,
"domNodes": -8312,
"jsHeapTotalBytes": -15360000,
"scriptDurationMs": 110.68500000000002,
"eventListeners": -16391,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 20503.629000000044,
"styleRecalcs": 172,
"styleRecalcDurationMs": 17.369000000000025,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 20000.472,
"heapDeltaBytes": -47818916,
"heapUsedBytes": 170842700,
"domNodes": -8312,
"jsHeapTotalBytes": -11165696,
"scriptDurationMs": 402.365,
"eventListeners": -16382,
"totalBlockingTimeMs": 73,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 20540.069000000018,
"styleRecalcs": 168,
"styleRecalcDurationMs": 16.737999999999975,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 19896.797999999995,
"heapDeltaBytes": -15502240,
"heapUsedBytes": 190583520,
"domNodes": -8312,
"jsHeapTotalBytes": -13856768,
"scriptDurationMs": 390.989,
"eventListeners": -16385,
"totalBlockingTimeMs": 32,
"frameDurationMs": 17.77333333333336,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 140.80599999999777,
"styleRecalcs": 8,
"styleRecalcDurationMs": 17.707,
"layouts": 3,
"layoutDurationMs": 1.2389999999999999,
"taskDurationMs": 89.09100000000002,
"heapDeltaBytes": 3187788,
"heapUsedBytes": 63735548,
"domNodes": 137,
"jsHeapTotalBytes": 0,
"scriptDurationMs": 8.288000000000002,
"eventListeners": 49,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "workflow-execution",
"durationMs": 489.76700000002893,
"styleRecalcs": 12,
"styleRecalcDurationMs": 23.002,
"layouts": 4,
"layoutDurationMs": 1.3359999999999999,
"taskDurationMs": 110.348,
"heapDeltaBytes": 4946552,
"heapUsedBytes": 65031632,
"domNodes": 119,
"jsHeapTotalBytes": 0,
"scriptDurationMs": 7.465000000000001,
"eventListeners": 99,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
}
]
} |
Codecov Report❌ Patch coverage is
@@ Coverage Diff @@
## main #15346 +/- ##
==========================================
+ Coverage 78.98% 81.39% +2.41%
==========================================
Files 2209 1883 -326
Lines 119645 114770 -4875
Branches 36919 35757 -1162
==========================================
- Hits 94496 93418 -1078
+ Misses 24615 20919 -3696
+ Partials 534 433 -101
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 335 files with indirect coverage changes 🚀 New features to boost your workflow:
|
…aches both sinks
`captureException` reaches Sentry only. That is how
`workspace_auth_gate_initialization_failure` — one of the two error types
IR-105 is tracked by — fired in production while reading as zero on every
Datadog dashboard. Only `bootstrap_auth_wait_timeout` dual-wrote, and it did
so by hand at the call site.
Adds `reportError(cause, { errorType, tags, context, level })` and migrates
all seven call sites onto it. `error_type` lands as a Sentry tag and a RUM
context field under the same name, so one query works against either console.
Two further ways a report could go nowhere, both fixed here:
- `Sentry.init({ enabled: __SENTRY_ENABLED__ })` baked the flag from the
*build machine's* `SENTRY_DSN`, but cloud resolves its DSN at runtime from
remote config. A cloud build without the env var left every capture in the
app inert no matter how valid the runtime DSN was. `enabled` now derives
from the resolved DSN. The dead define is removed rather than left to rot.
- Datadog RUM initializes behind `initDatadogRum()`'s dynamic import while
Sentry initializes in `main.ts`, so early-boot failures could be raised
before either sink existed and were dropped silently — precisely the
failures that leave a user on the splash screen. Reports raised before a
sink is live are now buffered (bounded at 25) and flushed once one comes up.
`reportError` never throws: a failing error reporter must not become a second
failure.
Self-review catch. `reportError` guarded its dispatch but `flushErrorReports` did not, and that one is called directly from `main.ts` and `bootstrap.ts`. A sink that threw during the flush would have taken the whole app down instead of the single report it failed to deliver — the exact failure the module exists to prevent. Also stops forwarding an explicit `level: undefined` into the RUM context when no level was given. Test verified red-green: it fails with the guard removed.
5d67212 to
a3be8f2
Compare
|
@coderabbitai review |
|
|
@coderabbitai full review |
|
|
@huang47 assigning you — you reviewed #15063, which introduced CI is fully green (54 checks, 0 failures). CodeRabbit has not reviewed this one — the org is rate-limited (4 included reviews/hour, 64 used in the past 7 days) and three trigger attempts all came back limited, so this has had no bot pass. Self-review found and fixed two real defects, both in a follow-up commit:
The one line most worth your eye is the |
|
I can be wrong, I suppose datadog automatically capturing console.error, or do we explicitly disable it? |
|
Also maybe worth putting the guidance somewhere given that we advocate |
…aches both sinks (#15346) ## Summary `captureException` reaches Sentry only. That is how `workspace_auth_gate_initialization_failure` — one of the two `error_type` values IR-105 is tracked by — fired in production while reading as **zero** on every Datadog dashboard. Only `bootstrap_auth_wait_timeout` dual-wrote, and it did so by hand at the call site. Adds `reportError(cause, { errorType, tags, context, level })` and migrates all seven call sites onto it. `error_type` lands as a Sentry tag and a RUM context field under the same name, so one query works against either console. ## Two further ways a report could go nowhere **Build-time flag defeated the runtime DSN.** `Sentry.init({ enabled: __SENTRY_ENABLED__ })` baked the flag from the *build machine's* `SENTRY_DSN`, but cloud resolves its DSN at runtime from remote config (`sentry_dsn`). A cloud build without the env var left every capture in the app inert no matter how valid the runtime DSN turned out to be. `enabled` now derives from the resolved DSN; the dead define is removed rather than left to rot. **Early-boot reports were dropped.** Datadog RUM initializes behind `initDatadogRum()`'s fire-and-forget dynamic import in `bootstrap.ts` while Sentry initializes in `main.ts`, so a failure raised before either sink existed went nowhere — precisely the failures that leave a user on the splash screen. Reports raised before a sink is live are now buffered (bounded at 25) and flushed once one comes up. `reportError` never throws: a failing error reporter must not become a second failure. ## Verification - `src/platform/telemetry/reportError.test.ts` — 8 cases: both-sink fan-out, degraded single-sink, buffer-then-flush, no double-replay, bounded buffer, non-`Error` normalization, `undefined` tag stripping, sink-throws containment. - Existing suites migrated off the `@sentry/vue` mock onto the `reportError` mock: `bootstrapStore`, `WorkspaceAuthGate`, `useWorkspaceBilling`. - `pnpm vitest run src/platform/telemetry/ src/platform/cloud/onboarding/auth.test.ts` — 391 passed. - `pnpm lint`, `pnpm typecheck`, `pnpm knip` clean. ## Regression risk Low-to-moderate. No behavior change at any call site beyond reaching a second sink. The `enabled` change means Sentry now activates in any non-dev build with a resolvable DSN — which is the intent, but it is the one line worth a close look. ## Follow-ups (not in this PR) - Boot chunks that 404 never execute JS at all, so no in-app reporter can see them. Needs an inline sentinel in `index.html`. - The `/` -> `/cloud/login` -> `/cloud/user-check` redirect loop emits neither `error_type` because auth succeeds on every lap. Needs its own instrumentation.
|
@huang47 both good questions — answering the first one properly because you were right and it changes what I claimed. Yes, Datadog auto-captures
So Which means my "invisible on every Datadog dashboard" line was too strong, and I should correct it. What was actually missing was the tag, not the event. Untagged, it is a substring match inside 617k console errors — not queryable by Worth noting for anyone reading later: I first ran this query as On the deploy: it is live but barely sampled yet. Second question — agreed, and docs alone would not have held it. The convention regressed within a day of this PR merging:
Assigning that one to you since it is your question. |
|
@christian-byrne Successfully backported to #15464 |
|
@christian-byrne Successfully backported to #15465 |
Summary
captureExceptionreaches Sentry only. That is howworkspace_auth_gate_initialization_failure— one of the twoerror_typevalues IR-105 is tracked by — fired in production while reading as zero on every Datadog dashboard. Onlybootstrap_auth_wait_timeoutdual-wrote, and it did so by hand at the call site.Adds
reportError(cause, { errorType, tags, context, level })and migrates all seven call sites onto it.error_typelands as a Sentry tag and a RUM context field under the same name, so one query works against either console.Two further ways a report could go nowhere
Build-time flag defeated the runtime DSN.
Sentry.init({ enabled: __SENTRY_ENABLED__ })baked the flag from the build machine'sSENTRY_DSN, but cloud resolves its DSN at runtime from remote config (sentry_dsn). A cloud build without the env var left every capture in the app inert no matter how valid the runtime DSN turned out to be.enablednow derives from the resolved DSN; the dead define is removed rather than left to rot.Early-boot reports were dropped. Datadog RUM initializes behind
initDatadogRum()'s fire-and-forget dynamic import inbootstrap.tswhile Sentry initializes inmain.ts, so a failure raised before either sink existed went nowhere — precisely the failures that leave a user on the splash screen. Reports raised before a sink is live are now buffered (bounded at 25) and flushed once one comes up.reportErrornever throws: a failing error reporter must not become a second failure.Verification
src/platform/telemetry/reportError.test.ts— 8 cases: both-sink fan-out, degraded single-sink, buffer-then-flush, no double-replay, bounded buffer, non-Errornormalization,undefinedtag stripping, sink-throws containment.@sentry/vuemock onto thereportErrormock:bootstrapStore,WorkspaceAuthGate,useWorkspaceBilling.pnpm vitest run src/platform/telemetry/ src/platform/cloud/onboarding/auth.test.ts— 391 passed.pnpm lint,pnpm typecheck,pnpm knipclean.Regression risk
Low-to-moderate. No behavior change at any call site beyond reaching a second sink. The
enabledchange means Sentry now activates in any non-dev build with a resolvable DSN — which is the intent, but it is the one line worth a close look.Follow-ups (not in this PR)
index.html./->/cloud/login->/cloud/user-checkredirect loop emits neithererror_typebecause auth succeeds on every lap. Needs its own instrumentation.