Browse Source

feat(features): Remove the need to update getsentry (#25868) + ref(vis): Add upcoming feature flags (#25879)

* feat(features): Remove the need to update getsentry
- We currently have to update getsentry whenever we want to use flagr
  our entity handler
- this adds a third parameter to `add` that determines whether the
  feature should be handled by the entity handler

* ref(vis): Add upcoming feature flags (#25879)
Adding flags I'm guessing we'll need ahead of time, figured I'd add the rest of the ones I know about too.

Co-authored-by: k-fish <kevan.fisher@sentry.io>
William Mak 3 years ago
parent
commit
2d57328c6b
2 changed files with 29 additions and 20 deletions
  1. 25 19
      src/sentry/features/__init__.py
  2. 4 1
      src/sentry/features/manager.py

+ 25 - 19
src/sentry/features/__init__.py

@@ -52,17 +52,17 @@ default_manager.add("organizations:create")
 
 # Organization scoped features
 default_manager.add("organizations:advanced-search", OrganizationFeature)  # NOQA
-default_manager.add("organizations:alert-details-redesign", OrganizationFeature)  # NOQA
+default_manager.add("organizations:alert-details-redesign", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:alert-filters", OrganizationFeature)  # NOQA
-default_manager.add("organizations:alert-wizard", OrganizationFeature)  # NOQA
+default_manager.add("organizations:alert-wizard", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:api-keys", OrganizationFeature)  # NOQA
 default_manager.add("organizations:boolean-search", OrganizationFeature)  # NOQA
-default_manager.add("organizations:chart-unfurls", OrganizationFeature)  # NOQA
+default_manager.add("organizations:chart-unfurls", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:custom-event-title", OrganizationFeature)  # NOQA
 default_manager.add("organizations:custom-symbol-sources", OrganizationFeature)  # NOQA
 default_manager.add("organizations:dashboards-basic", OrganizationFeature)  # NOQA
 default_manager.add("organizations:dashboards-edit", OrganizationFeature)  # NOQA
-default_manager.add("organizations:dashboards-manage", OrganizationFeature)  # NOQA
+default_manager.add("organizations:dashboards-manage", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:data-forwarding", OrganizationFeature)  # NOQA
 default_manager.add("organizations:discover", OrganizationFeature)  # NOQA
 default_manager.add("organizations:discover-basic", OrganizationFeature)  # NOQA
@@ -71,12 +71,12 @@ default_manager.add("organizations:enterprise-perf", OrganizationFeature)  # NOQ
 default_manager.add("organizations:event-attachments", OrganizationFeature)  # NOQA
 default_manager.add("organizations:event-attachments-viewer", OrganizationFeature)  # NOQA
 default_manager.add("organizations:events", OrganizationFeature)  # NOQA
-default_manager.add("organizations:filters-and-sampling", OrganizationFeature)  # NOQA
+default_manager.add("organizations:filters-and-sampling", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:global-views", OrganizationFeature)  # NOQA
-default_manager.add("organizations:grouping-tree-ui", OrganizationFeature)  # NOQA
+default_manager.add("organizations:grouping-tree-ui", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:images-loaded-v2", OrganizationFeature)  # NOQA
-default_manager.add("organizations:import-codeowners", OrganizationFeature)  # NOQA
-default_manager.add("organizations:inbox", OrganizationFeature)  # NOQA
+default_manager.add("organizations:import-codeowners", OrganizationFeature, True)  # NOQA
+default_manager.add("organizations:inbox", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:incidents", OrganizationFeature)  # NOQA
 default_manager.add("organizations:integrations-alert-rule", OrganizationFeature)  # NOQA
 default_manager.add("organizations:integrations-chat-unfurl", OrganizationFeature)  # NOQA
@@ -85,44 +85,49 @@ default_manager.add("organizations:integrations-incident-management", Organizati
 default_manager.add("organizations:integrations-issue-basic", OrganizationFeature)  # NOQA
 default_manager.add("organizations:integrations-issue-sync", OrganizationFeature)  # NOQA
 default_manager.add("organizations:integrations-stacktrace-link", OrganizationFeature)  # NOQA
-default_manager.add("organizations:integrations-ticket-rules", OrganizationFeature)  # NOQA
+default_manager.add("organizations:integrations-ticket-rules", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:integrations-vsts-limited-scopes", OrganizationFeature)  # NOQA
 default_manager.add("organizations:internal-catchall", OrganizationFeature)  # NOQA
 default_manager.add("organizations:invite-members", OrganizationFeature)  # NOQA
 default_manager.add("organizations:invite-members-rate-limits", OrganizationFeature)  # NOQA
-default_manager.add("organizations:issue-list-trend-sort", OrganizationFeature)  # NOQA
+default_manager.add("organizations:issue-list-trend-sort", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:large-debug-files", OrganizationFeature)  # NOQA
 default_manager.add("organizations:metric-alert-builder-aggregate", OrganizationFeature)  # NOQA
-default_manager.add("organizations:metrics", OrganizationFeature)  # NOQA
+default_manager.add("organizations:metrics", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:metrics-extraction", OrganizationFeature)  # NOQA
 default_manager.add("organizations:minute-resolution-sessions", OrganizationFeature)  # NOQA
 default_manager.add("organizations:monitors", OrganizationFeature)  # NOQA
-default_manager.add("organizations:notification-platform", OrganizationFeature)  # NOQA
+default_manager.add("organizations:notification-platform", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:onboarding", OrganizationFeature)  # NOQA
 default_manager.add("organizations:org-saved-searches", OrganizationFeature)  # NOQA
 default_manager.add("organizations:org-subdomains", OrganizationFeature)  # NOQA
 default_manager.add("organizations:performance-ops-breakdown", OrganizationFeature)  # NOQA
-default_manager.add("organizations:performance-tag-explorer", OrganizationFeature)  # NOQA
+default_manager.add("organizations:performance-tag-explorer", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:performance-view", OrganizationFeature)  # NOQA
 default_manager.add("organizations:related-events", OrganizationFeature)  # NOQA
 default_manager.add("organizations:relay", OrganizationFeature)  # NOQA
 default_manager.add("organizations:reprocessing-v2", OrganizationFeature)  # NOQA
 default_manager.add("organizations:rule-page", OrganizationFeature)  # NOQA
 default_manager.add("organizations:set-grouping-config", OrganizationFeature)  # NOQA
-default_manager.add("organizations:slack-allow-workspace", OrganizationFeature)  # NOQA
 default_manager.add("organizations:slack-migration", OrganizationFeature)  # NOQA
 default_manager.add("organizations:sso-basic", OrganizationFeature)  # NOQA
 default_manager.add("organizations:sso-migration", OrganizationFeature)  # NOQA
 default_manager.add("organizations:sso-rippling", OrganizationFeature)  # NOQA
 default_manager.add("organizations:sso-saml2", OrganizationFeature)  # NOQA
 default_manager.add("organizations:symbol-sources", OrganizationFeature)  # NOQA
-default_manager.add("organizations:team-alerts-ownership", OrganizationFeature)  # NOQA
-default_manager.add("organizations:trace-view-quick", OrganizationFeature)  # NOQA
-default_manager.add("organizations:trace-view-summary", OrganizationFeature)  # NOQA
-default_manager.add("organizations:transaction-comparison", OrganizationFeature)  # NOQA
+default_manager.add("organizations:team-alerts-ownership", OrganizationFeature, True)  # NOQA
+default_manager.add("organizations:trace-view-quick", OrganizationFeature, True)  # NOQA
+default_manager.add("organizations:trace-view-summary", OrganizationFeature, True)  # NOQA
+default_manager.add("organizations:transaction-comparison", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:unhandled-issue-flag", OrganizationFeature)  # NOQA
-default_manager.add("organizations:usage-stats-graph", OrganizationFeature)  # NOQA
+default_manager.add("organizations:usage-stats-graph", OrganizationFeature, True)  # NOQA
 default_manager.add("organizations:prompt-dashboards", OrganizationFeature)  # NOQA
+default_manager.add("organizations:performance-tag-page", OrganizationFeature, True)  # NOQA
+default_manager.add("organizations:performance-mobile-vitals", OrganizationFeature, True)  # NOQA
+default_manager.add("organizations:discover-arithmetic", OrganizationFeature, True)  # NOQA
+default_manager.add("organizations:transaction-events", OrganizationFeature, True)  # NOQA
+default_manager.add("organizations:unified-span-view", OrganizationFeature, True)  # NOQA
+default_manager.add("organizations:team-key-transactions", OrganizationFeature, True)  # NOQA
 # NOTE: Don't add features down here! Add them to their specific group and sort
 #       them alphabetically! The order features are registered is not important.
 
@@ -159,6 +164,7 @@ requires_snuba = (
 
 # expose public api
 add = default_manager.add
+entity_features = default_manager.entity_features
 get = default_manager.get
 has = default_manager.has
 batch_has = default_manager.batch_has

+ 4 - 1
src/sentry/features/manager.py

@@ -98,6 +98,7 @@ class FeatureManager(RegisteredFeatureManager):
     def __init__(self):
         super().__init__()
         self._feature_registry = {}
+        self.entity_features = set()
         self._entity_handler = None
 
     def all(self, feature_type=Feature):
@@ -107,7 +108,7 @@ class FeatureManager(RegisteredFeatureManager):
         """
         return {k: v for k, v in self._feature_registry.items() if v == feature_type}
 
-    def add(self, name, cls=Feature):
+    def add(self, name, cls=Feature, entity_feature=False):
         """
         Register a feature.
 
@@ -116,6 +117,8 @@ class FeatureManager(RegisteredFeatureManager):
 
         >>> FeatureManager.has('my:feature', actor=request.user)
         """
+        if entity_feature:
+            self.entity_features.add(name)
         self._feature_registry[name] = cls
 
     def _get_feature_class(self, name):