Sentry 開發者貢獻指南 - Feature Flag

為少發表於2022-01-12

功能 flagSentry 的程式碼庫中宣告。
對於自託管使用者,這些標誌然後通過 sentry.conf.py 進行配置。
對於 SentrySaaS 部署,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的狀態。

建立新的 Feature Flag

確定功能應該具有的範圍

功能可以按 organizationproject 劃分範圍。
如果您不確定是否需要 project 功能,請建立一個 organization 級別。
在此示例中,我們將構建一個名為 test-feature 範圍在 organization 級別的功能。

將您的功能新增到 server.py

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
請在新增功能時新增第三個可選布林引數,例如:

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 程式碼中

FeatureManagerhas 方法檢查該功能是否存在。
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 中

SentryGetSentry 中使用 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

  1. 設定環境變數:export SENTRY_USE_FLAGR=true
  2. 啟動你的 devservices

您可以在 localhost:18000 找到您本地的 flagr 例項

在生產中啟用您的功能(Sentry SaaS)

功能 flagSentry 的程式碼庫中宣告。
對於自託管使用者,這些 flag 然後通過 sentry.conf.py 進行配置。
對於 SentrySaaS 部署,Flagr 用於在生產中配置 flag

如果您想為一部分生產使用者啟用您的功能,您需要在 Flagr 中設定您的功能。
如果您尚未確保在 sentry 中新增 flag 時您通過了第三個選項,以便 Flagr 知道在生產中檢查此功能。

default_manager.add("organizations:onboarding", OrganizationFeature, True)  # NOQA

更多

相關文章