Sentry 開發者貢獻指南-Feature Flag
本文轉載自微信公眾號「黑客下午茶」,作者為少。轉載本文請聯系黑客下午茶公眾號。
功能 flag 在 Sentry 的代碼庫中聲明。對于自托管用戶,這些標志然后通過 sentry.conf.py 進行配置。對于 Sentry 的 SaaS 部署,Flagr 用于在生產中配置標志。
您可以通過查看 sentry/features/__init__.py 找到可用的功能列表。它們在 FeatureManager 上聲明如下:
- # Don't set entity_feature, or set it to False if you don't plan to use Flagr
- default_manager.add("organizations:onboarding", OrganizationFeature, entity_feature=True)
該功能可以在你的 sentry.conf.py 中使用以下內容啟用,通常位于 ~/.sentry/:
- SENTRY_FEATURES["organizations:onboarding"] = True
您可以使用 context manager 修改測試中功能 flag的狀態。
- https://develop.sentry.dev/testing/#setting-options-and-feature-flags
創建新的 Feature Flag
確定功能應該具有的范圍
功能可以按 organization 和 project 劃分范圍。如果您不確定是否需要 project 功能,請創建一個 organization 級別。在此示例中,我們將構建一個名為 test-feature 范圍在 organization 級別的功能。
將您的功能添加到 server.py
conf/server.py 包含應用程序中的許多默認設置。在這里,您將添加您的功能,并決定它應該保持什么默認值,除非用戶指定。
- https://github.com/getsentry/sentry/blob/master/src/sentry/conf/server.py
SENTRY_FEATURES 字典包含應用程序中的所有功能及其相應的范圍。默認情況下,您的功能應處于禁用狀態:
- SENTRY_FEATURES = {
- 'organizations:test-feature': False,
- 'auth:register': True,
- # ...
- 'projects:minidump': False,
- }
將您的功能添加到 FeatureManager
FeatureManager 處理應用程序功能。我們將所有功能添加到 FeatureManager, 包括我們要添加到文件 /src/sentry/features/__init__.py 中的功能類型。
如果您計劃在生產中使用 flagr, 請在添加功能時添加第三個可選布爾參數,例如:
- https://develop.sentry.dev/feature-flags/#enabling-your-feature-in-production
- default_manager.add('organizations:test-feature', OrganizationFeature, True)
如果您不打算使用 flagr,請不要傳遞這第三個參數,例如:
- default_manager.add('organizations:test-feature', OrganizationFeature)
將其添加到 Organization Model Serializer
Organization model serializer (src/sentry/api/serializers/models/organization.py) 構建了一個名為 feature_list 的列表,供前端使用。默認情況下,檢查所有功能,并將存在的功能添加到列表中。如果您的功能需要額外的自定義邏輯,則必須更新 organization serializer
使用 Model Flag(不太常見)
有時 model 上的 flag 用于指示 feature flag,如下所示。除非有特定原因需要更改 model,否則不建議這樣做。例如,require_2fa flag 會影響后端的行為以強制執行 two-factor 身份驗證。
- feature_list = []
- if getattr(obj.flags, 'allow_joinleave'):
- feature_list.append('open-membership')
- if not getattr(obj.flags, 'disable_shared_issues'):
- feature_list.append('shared-issues')
- if getattr(obj.flags, 'require_2fa'):
- feature_list.append('require-2fa')
檢查您的功能
在 Python 代碼中
FeatureManager 的 has 方法檢查該功能是否存在。 has 方法接收該功能的名稱,即與該功能范圍對應的對象 (即組織級別功能的組織或項目級別功能的項目) 和 actor(又名 user)。在我們的例子中,該功能將添加如下:
- if features.has('organizations:test-feature', obj, actor=user):
- feature_list.append('test-feature')
如果為 organization 和給定的 user 類型啟用了該功能, 則只會將該 feature 添加到 feature_list 中。請注意,當我們將 feature 提供給前端時,我們刪除了 scope 前綴, 我們的 'organizations:test-feature' 變成了 'test-feature'。
在 JavaScript 中
在 Sentry 和 GetSentry 中使用 flag 是有區別的。在這個階段,您還沒有準備好在 GetSentry 中使用您的 feature flag,但您可以在 Sentry 中使用它。
帶有 Feature 組件的聲明性功能
React 使用聲明式編程范式。因此,我們有一個 utility 組件,用于根據 organization/project 可用的 feature 標志隱藏組件
- import Feature from 'app/components/acl/feature';
- const toRender = (
- <Feature features={['test-feature']}>
- <MyComponentToFlag />
- </Feature>
- );
命令式功能 flag 檢查
強制生成 React 組件時有一些例外(例如表的標題/列)。在這樣的情況下,Organization / Project 對象有一個 feature flag 數組, 您可以通過以下方式使用它們:
- const {organization} = this.props;
- // Method 2
- organization.features.includes('test-feature'); // evals to True/False
在開發中啟用功能
在 Sentry 中,您可以運行 sentry devserver 來查看您在開發模式下的更改。如果您想查看 feature flag 背后的更改,則需要在本地計算機上打開文件 ~/.sentry/sentry.config.py。此文件包含 sentry 應用程序的本地設置,可以查看和編輯。如果您想打開或關閉 flag,請將其添加到您的配置文件中:
- SENTRY_FEATURES['organizations:test-feature'] = True
其中,SENTRY_FEATURES 將對應于 step 2 中的 SENTRY_FEATURES。如果您希望該功能可用,請將其設置為 True,否則設置為 False。
開發中的 Flagr(Sentry SaaS)
通常,您不需要在開發中運行 flagr 來測試您的功能標記。如果您確實想運行 flagr,則需要運行 getsentry:
- 設置環境變量:export SENTRY_USE_FLAGR=true
- 啟動你的 devservices
您可以在 localhost:18000 找到您本地的 flagr 實例
- https://develop.sentry.dev/sentry-vs-getsentry/
- https://develop.sentry.dev/services/devservices/
在生產中啟用您的功能(Sentry SaaS)
功能 flag 在 Sentry 的代碼庫中聲明。對于自托管用戶,這些 flag 然后通過 sentry.conf.py 進行配置。對于 Sentry 的 SaaS 部署,Flagr 用于在生產中配置 flag。
如果您想為一部分生產用戶啟用您的功能,您需要在 Flagr 中設置您的功能。如果您尚未確保在 sentry 中添加 flag 時您通過了第三個選項,以便 Flagr 知道在生產中檢查此功能。
- default_manager.add("organizations:onboarding", OrganizationFeature, True) # NOQA