Просмотр исходного кода

feat(perf-issues): prepare Render Blocking Asset detector for release (#43624)

* Update the display name to match mocks ("Large Render Blocking Asset")
* Add a sample event to `bin/load-mocks`
* Add all necessary feature flags for rollout
Matt Quinn 2 лет назад
Родитель
Сommit
0c6ddf9c16

+ 35 - 0
bin/load-mocks

@@ -1127,6 +1127,39 @@ def create_mock_transactions(
                 spans=[parent_span] + spans,
             )
 
+        def load_render_blocking_asset_issue():
+            transaction_user = generate_user()
+            trace_id = uuid4().hex
+            parent_span_id = uuid4().hex[:16]
+
+            spans = [
+                {
+                    "timestamp": (timestamp + timedelta(milliseconds=1300)).timestamp(),
+                    "start_timestamp": (timestamp + timedelta(milliseconds=300)).timestamp(),
+                    "description": "https://example.com/asset.js",
+                    "op": "resource.script",
+                    "parent_span_id": parent_span_id,
+                    "span_id": uuid4().hex[:16],
+                    "hash": "858fea692d4d93e8",
+                }
+            ]
+
+            create_sample_event(
+                project=frontend_project,
+                platform="transaction",
+                transaction="/render-blocking-asset/",
+                event_id=uuid4().hex,
+                user=transaction_user,
+                timestamp=timestamp + timedelta(milliseconds=300),
+                start_timestamp=timestamp,
+                trace=trace_id,
+                parent_span_id=parent_span_id,
+                spans=spans,
+                measurements={
+                    "fcp": {"value": 2500.0},
+                },
+            )
+
         def load_performance_issues():
             print(f"    > Loading performance issues data")  # NOQA
             print(f"    > Loading n plus one issue")  # NOQA
@@ -1135,6 +1168,8 @@ def create_mock_transactions(
             load_consecutive_db_issue()
             print(f"    > Loading uncompressed asset issue")  # NOQA
             load_uncompressed_asset_issue()
+            print(f"    > Loading render blocking asset issue")  # NOQA
+            load_render_blocking_asset_issue()
 
         load_performance_issues()
 

+ 2 - 0
src/sentry/conf/server.py

@@ -1157,6 +1157,8 @@ SENTRY_FEATURES = {
     "organizations:performance-n-plus-one-api-calls-detector": False,
     # Enable compressed assets performance issue type
     "organizations:performance-issues-compressed-assets-detector": False,
+    # Enable render blocking assets performance issue type
+    "organizations:performance-issues-render-blocking-assets-detector": False,
     # Enable the new Related Events feature
     "organizations:related-events": False,
     # Enable populating suggested assignees with release committers

+ 1 - 0
src/sentry/features/__init__.py

@@ -116,6 +116,7 @@ default_manager.add("organizations:performance-chart-interpolation", Organizatio
 default_manager.add("organizations:performance-consecutive-db-issue", OrganizationFeature)
 default_manager.add("organizations:performance-n-plus-one-api-calls-detector", OrganizationFeature)
 default_manager.add("organizations:performance-issues-compressed-assets-detector", OrganizationFeature)
+default_manager.add("organizations:performance-issues-render-blocking-assets-detector", OrganizationFeature)
 default_manager.add("organizations:performance-issues-dev", OrganizationFeature, True)
 default_manager.add("organizations:performance-issues-all-events-tab", OrganizationFeature, True)
 default_manager.add("organizations:performance-file-io-main-thread-detector", OrganizationFeature)

+ 1 - 1
src/sentry/models/group.py

@@ -440,7 +440,7 @@ class Group(Model):
             (GroupType.PERFORMANCE_SLOW_DB_QUERY.value, _("Slow DB Query")),
             (
                 GroupType.PERFORMANCE_RENDER_BLOCKING_ASSET_SPAN.value,
-                _("Render Blocking Asset Span"),
+                _("Large Render Blocking Asset"),
             ),
             (
                 GroupType.PERFORMANCE_N_PLUS_ONE_API_CALLS.value,

+ 4 - 0
src/sentry/options/defaults.py

@@ -580,6 +580,10 @@ register("performance.issues.slow_db_query.problem-creation", default=0.0)
 register("performance.issues.slow_db_query.la-rollout", default=0.0)
 register("performance.issues.slow_db_query.ea-rollout", default=0.0)
 register("performance.issues.slow_db_query.ga-rollout", default=0.0)
+register("performance.issues.render_blocking_assets.problem-creation", default=0.0)
+register("performance.issues.render_blocking_assets.la-rollout", default=0.0)
+register("performance.issues.render_blocking_assets.ea-rollout", default=0.0)
+register("performance.issues.render_blocking_assets.ga-rollout", default=0.0)
 
 
 # System-wide options for default performance detection settings for any org opted into the performance-issues-ingest feature. Meant for rollout.

+ 1 - 1
src/sentry/types/issues.py

@@ -45,7 +45,7 @@ GROUP_TYPE_TO_TEXT = {
     GroupType.ERROR: "Error",
     GroupType.PERFORMANCE_CONSECUTIVE_DB_QUERIES: "Consecutive DB Queries",
     GroupType.PERFORMANCE_SLOW_DB_QUERY: "Slow DB Query",
-    GroupType.PERFORMANCE_RENDER_BLOCKING_ASSET_SPAN: "Render Blocking Asset Span",
+    GroupType.PERFORMANCE_RENDER_BLOCKING_ASSET_SPAN: "Large Render Blocking Asset",
     GroupType.PERFORMANCE_N_PLUS_ONE_DB_QUERIES: "N+1 Query",
     GroupType.PERFORMANCE_FILE_IO_MAIN_THREAD: "File IO on Main Thread",
     GroupType.PERFORMANCE_N_PLUS_ONE_API_CALLS: "N+1 API Call",

+ 11 - 0
src/sentry/utils/performance_issues/performance_detection.py

@@ -108,6 +108,7 @@ DETECTOR_TYPE_ISSUE_CREATION_TO_SYSTEM_OPTION = {
     DetectorType.FILE_IO_MAIN_THREAD: "performance.issues.file_io_main_thread.problem-creation",
     DetectorType.UNCOMPRESSED_ASSETS: "performance.issues.compressed_assets.problem-creation",
     DetectorType.SLOW_DB_QUERY: "performance.issues.slow_db_query.problem-creation",
+    DetectorType.RENDER_BLOCKING_ASSET_SPAN: "performance.issues.render_blocking_assets.problem-creation",
 }
 
 
@@ -636,6 +637,16 @@ class RenderBlockingAssetSpanDetector(PerformanceDetector):
             if fcp >= fcp_minimum_threshold and fcp < fcp_maximum_threshold:
                 self.fcp = fcp
 
+    def is_creation_allowed_for_organization(self, organization: Optional[Organization]) -> bool:
+        return features.has(
+            "organizations:performance-issues-render-blocking-assets-detector",
+            organization,
+            actor=None,
+        )
+
+    def is_creation_allowed_for_project(self, project: Project) -> bool:
+        return True  # Detection always allowed by project for now
+
     def visit_span(self, span: Span):
         if not self.fcp:
             return