使用 CEL 设置目标标志

通用表达式语言 (CEL) 为复杂的基于规则的标志评估提供逻辑。借助它,您可以使用逻辑运算符组合多个用户或请求属性,从而创建精准的定位规则。

本指南介绍了如何使用 CEL 规则定义标志,以及如何更新评估规范。

前提条件

开始之前,请确保您满足以下方面的要求:

  1. 已完成部署功能标志快速入门
  2. 配置为管理 App Lifecycle Manager 资源的 gcloud 环境。

逻辑运算符和语法

CEL 支持使用标准逻辑运算符来构建复杂的条件:

  • && 逻辑 AND
  • || 逻辑或
  • ! 逻辑 NOT
  • in 检查某个值是否存在于列表中

定义属性

CEL 属性是特定的数据点,例如 source.ip、请求标头或路径,用于布尔表达式中以定义安全政策或路由政策。

CEL 条件中使用的任何属性都必须在 EvaluationSpec 的属性数组中明确定义和列出。如果某个属性在条件中使用,但列表中缺少该属性,API 将拒绝相应请求。

创建属性

您可以使用 App Lifecycle Manager 创建 CEL 属性。

如需创建方案属性,请运行以下命令:

gcloud beta app-lifecycle-manager flags attributes create "plan-attr" \
    --key="plan" \
    --attribute-value-type="STRING" \
    --location=global

如需创建国家/地区属性,请运行以下命令:

gcloud beta app-lifecycle-manager flags attributes create "country-attr" \
    --key="country" \
    --attribute-value-type="STRING" \
    --location=global

如需创建平台属性,请运行以下命令:

gcloud beta app-lifecycle-manager flags attributes create "platform-attr" \
    --key="platform" \
    --attribute-value-type="STRING" \
    --location=global

使用 CEL 规则配置标志

创建或更新标志时,请在 evaluation-spec 中定义评估逻辑。

例如,以下代码段可为德国境内使用移动应用的付费客户启用某项功能。

gcloud beta app-lifecycle-manager flags create "advanced-reporting-flag" \
    --key="advanced-reporting-flag" \
    --flag-value-type=BOOL \
    --unit-kind="UNIT_KIND_NAME" \
    --location=global \
    --evaluation-spec='{
      "rules": [{
        "id": "premium_mobile_users_in_germany",
        "condition": "plan == \"premium\" && country == \"DE\" && platform == \"mobile\"",
        "target": "enabled"
      }],
      "defaultTarget": "disabled",
      "attributes": [
        "projects/PROJECT_ID/locations/global/flagAttributes/plan-attr",
        "projects/PROJECT_ID/locations/global/flagAttributes/country-attr",
        "projects/PROJECT_ID/locations/global/flagAttributes/platform-attr"
      ]
    }'

PROJECT_IDUNIT_KIND_NAME 替换为您的值。

应用集成

您的应用必须在运行时将属性注入到评估上下文中。

Python 示例:

from openfeature.evaluation_context import EvaluationContext

eval_ctx = EvaluationContext(
    targeting_key=user_id,
    attributes={
        "plan": "premium",
        "country": "DE",
        "platform": "mobile"
    }
)

is_enabled = client.get_boolean_value("advanced-reporting-flag", False, eval_ctx)

最佳做法

  • 评估顺序:系统会按顺序评估规则。计算结果为 true 的第一个规则将决定标志的值。
  • 安全默认值:如果用户情境缺少条件所需的属性,评估引擎将跳过该特定规则。
  • 字符数限制:CEL 表达式的大小不得超过 4,096 字节 (4kB)。

后续步骤