Sentry 開發者貢獻指南 – Feature Flag

  • 2022 年 1 月 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

更多