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