This product is not supported for your selected Datadog site. ().

概要

このガイドでは、Feature Flags のロジックを Statsig から Datadog Feature Flags へ移行するプロセスについて説明します。概念的なマッピング、SDK のインストール、初期化、およびフラグの評価について説明します。

概要チェックリスト

  • @statsig/js-client を @datadog/openfeature-browser に置き換えます。
  • statsig.initialize を OpenFeature.setProviderAndWait に入れ替えます。
  • checkGate を client.getBooleanValue に変換します。
  • getDynamicConfig を client.getObjectValue または client.getStringValue に変換します。
  • getLayer を client.getObjectValue に変換し、返された JSON オブジェクトのフィールドをデリファレンスします。
  • コンテキスト内で targetingKey を使用してユーザーを識別し、パーセンテージベースのランダム化を促進します。
  • Statsig フラグを Datadog で再作成します。
  • サーバーサイドアプリの場合は、@openfeature/server-sdk を使用し、単一のグローバルコンテキストではなく、リクエストごとの評価コンテキストを渡します。

Datadog でフラグを再作成する

アプリケーションで SDK 呼び出しを切り替える前に、Statsig のゲート、動的構成、およびレイヤーを Datadog のフラグとして再作成してください。Datadog UI で、[Software Delivery] > [Feature Flags] に移動し、Statsig のキー、バリアントタイプ、ターゲティングルールと一致するフラグを作成します。

概念的なマッピング

Statsig と Datadog の主要な概念は似ていますが、用語が若干異なります。

Statsig の概念Datadog の概念備考
Feature GateFeature Flag (ブール値)基本的なオン/オフの切り替えです。
Dynamic ConfigFeature Flag (JSON/文字列バリアント)Datadog のフラグは文字列、JSON、数値を返すことができ、Statsig の Dynamic Config のユースケースをカバーします。
LayerFeature Flag (JSON バリアント)JSON 値のフラグを使用し、返されたオブジェクトからフィールドを読み取ります。これは、Statsig の Layer から値をデリファレンスするのと同様です。
ExperimentFeature Flag (ターゲティングあり)Datadog の Feature Flag は、パーセンテージベースのロールアウトと特定のターゲティングルールを設定して、Experiment を実行できます。フラグを Datadog Experiments に接続して、ユーザーの成果に与える影響を測定します。
User/StatsigUserEvaluation Contextフラグを評価するために SDK に渡されるコンテキスト (属性) です。

インストール

Datadog の Feature Flag SDK は、OpenFeature で使用するために設計されています。これにより、Datadog を基盤プロバイダーとして使用しつつ、ベンダーニュートラルな API を利用できます。

Statsig を削除します。

npm uninstall @statsig/js-client
# or
yarn remove @statsig/js-client

Datadog および OpenFeature をインストールします。

npm install @datadog/openfeature-browser @openfeature/web-sdk @openfeature/core
# or
yarn add @datadog/openfeature-browser @openfeature/web-sdk @openfeature/core

注: React アプリケーションの場合は、@openfeature/react-sdk もインストールしてください。React Feature Flags を参照してください。サーバーサイド実装の場合は、サーバーサイドおよび動的コンテキストセクション、または Server-Side Feature Flags (他の言語の場合) を参照してください。

初期化

statsig.initialize() 呼び出しを OpenFeature プロバイダーのセットアップに置き換える必要があります。登録時に評価コンテキストを setProviderAndWait に渡して、フラグが初めから正しいユーザーに対して評価されるようにします。

Statsig (旧)

import { StatsigClient } from '@statsig/js-client';

const client = new StatsigClient('client-sdk-key', { userID: 'user-123' });
await client.initializeAsync();

Datadog (新)

import { DatadogProvider } from '@datadog/openfeature-browser';
import { OpenFeature } from '@openfeature/web-sdk';
// Configure the Datadog provider
const provider = new DatadogProvider({
  clientToken: '<CLIENT_TOKEN>',
  applicationId: '<APPLICATION_ID>',
  site: 'datadoghq.com', // or datadoghq.eu, etc.
  env: 'production', // Environment from which to fetch flag configurations
});

// Set the evaluation context and register the provider together
const evaluationContext = {
  targetingKey: 'user-123', // Identifies the user and drives percentage-based randomization
  email: 'employee@company.com',
  plan: 'premium',
};

await OpenFeature.setProviderAndWait(provider, evaluationContext);
targetingKey は、パーセンテージベースのターゲティングにおけるランダム化対象として使用されます。フラグが一定の割合を対象とする場合 (例: 50%)、 targetingKey により、どのバケットにユーザーが振り分けられるかが決まります。同じ targetingKey を持つユーザーは、特定のフラグについて常に同じバリアントを受け取ります。

クライアントトークンおよびアプリケーション ID の作成に関する詳細は、API キーとアプリケーションキーを参照してください。

フラグの評価 (ゲートのチェック)

checkGate の呼び出しを OpenFeature の getBooleanValue に置き換えます。

Statsig (旧)

const isEnabled = client.checkGate('new_homepage_design');

if (isEnabled) {
  // Show new design
} else {
  // Show old design
}

Datadog (新)

const client = OpenFeature.getClient();

// The second argument is the fallback value (default) if the flag fails to fetch
const isEnabled = client.getBooleanValue('new_homepage_design', false);

if (isEnabled) {
  // Show new design
} else {
  // Show old design
}

構成の取得 (動的構成)

getDynamicConfig または getExperiment を使用して非ブール値 (文字列、JSON、数値) を取得していた場合は、OpenFeature の適切な型付きメソッドを使用します。

Statsig (旧)

const config = client.getDynamicConfig('banner_config');
const title = config.get('title', 'Welcome');

Datadog (新)

const client = OpenFeature.getClient();

// Assuming your Datadog flag 'banner_config' returns a JSON object variant
const bannerConfig = client.getObjectValue<{ title: string }>('banner_config', { title: 'Welcome' });
const title = bannerConfig.title;

レイヤーを JSON オブジェクトフラグにマッピング

Statsig のレイヤーは、関連するパラメーターを 1 つの評価にまとめます。Datadog では、JSON 値のフラグを使用し、返されたオブジェクトから必要なフィールドを読み取ります。

Statsig (旧)

const layer = client.getLayer('user_promo_experiments');
const promoTitle = layer.get('title', 'Welcome to Statsig!');
const discount = layer.get('discount', 0.1);

Datadog (新)

const client = OpenFeature.getClient();

const promoConfig = client.getObjectValue<{ title: string; discount: number }>('user_promo_experiments', {
  title: 'Welcome!',
  discount: 0.1,
});
const promoTitle = promoConfig.title;
const discount = promoConfig.discount;

ログイン後にユーザーコンテキストを更新

Statsig は updateUser を使用してユーザーコンテキストを更新します。OpenFeature と Datadog では、ユーザーのログイン後など、初期化後にコンテキストを更新するには OpenFeature.setContext() を使用します。

Statsig (旧)

await client.updateUserAsync({
  userID: 'user-456',
  email: 'employee@company.com',
  custom: { plan: 'premium' },
});

Datadog (新)

// Update the context for all future flag evaluations
await OpenFeature.setContext({
  targetingKey: 'user-456', // Identifies the user and drives percentage-based randomization
  email: 'employee@company.com',
  plan: 'premium',
});

追跡とエクスポージャー

Statsig では、ゲートを確認すると自動的にエクスポージャーがログに記録されます。

Datadog では、フラグテレメトリは次の 2 つのカテゴリに分類されます。

エクスポージャーログは、対象が特定のフラグバリアントを受け取ったことを記録します。各エクスポージャーイベントには、フラグキー、提供されたバリアント、および評価コンテキストが含まれます。エクスポージャーデータを使用して、実験結果と機能の採用状況を分析します。

評価ログは、各バリアントが返された頻度を記録します。クライアント SDK は、デフォルトで集計された評価カウントを送信します。サーバー SDK は、評価ログを有効にしないと feature_flag.evaluations メトリクスを出力しません。

  1. クライアント SDK: エクスポージャーログはデフォルトで有効になっています。SDK はエクスポージャーイベントをエクスポージャーインテークに送信します。これらは [Feature Flags] リストで確認できます。エクスポージャー追跡が不要な場合は、DatadogProvider 設定で enableExposureLogging: false を設定してください。
enableRumFeatureFlagTracking を true に設定すると、RUM イベントにフラグ評価が追加されるため、RUM コストに影響を与える可能性があります。クライアント SDK では enableExposureLogging と enableRumFeatureFlagTracking の両方がデフォルトでオンになっています。
  1. サーバー SDK: エクスポージャーログはデフォルトでオンになっています。評価ログはデフォルトでオフになっています。サーバー SDK から評価メトリクスを送信するには、OpenTelemetry メトリクスを有効にし (例: DD_METRICS_OTEL_ENABLED=true)、Server-Side Feature Flags の言語固有のガイダンスに従ってください。

サーバーサイドおよび動的コンテキスト

前のセクションでは、ブラウザおよびクライアントサイドの移行について説明しましたが、このケースでは、評価コンテキストがユーザーのセッション期間中静的であるのが一般的です。サーバーサイドアプリケーションでは、異なる SDK を使用し、クライアントトークンの代わりに Datadog API キーで認証します。また、通常は受信リクエストごとに新しい評価コンテキストを構築します。

サーバー SDK を初期化する前に、必要な環境変数を設定してください。

DD_API_KEY=<DATADOG_API_KEY>
DD_SITE=<DATADOG_SITE>
DD_ENV=<ENVIRONMENT_NAME>

Agent およびアプリケーションの設定オプションの全リストについては、Server-Side Feature Flags を参照してください。

サーバーサイド SDK をインストールします。この例では、Node.js Feature Flags SDK を使用します。

npm install dd-trace @openfeature/server-sdk

Datadog トレーサーを通じてプロバイダーを登録します。

import tracer from 'dd-trace';
import { OpenFeature } from '@openfeature/server-sdk';

tracer.init();

await OpenFeature.setProviderAndWait(tracer.openfeature);

Statsig (旧)

// The Statsig server SDK takes the user in each call
const isEnabled = statsig.checkGate(user, 'new_homepage_design');

Datadog (新)

const client = OpenFeature.getClient();

app.get('/my-endpoint', async (req, res) => {
  const evaluationContext = {
    targetingKey: req.session?.userID ?? 'unknown',
  };

  const isEnabled = await client.getBooleanValue('new_homepage_design', false, evaluationContext);
  res.send(isEnabled ? 'New design' : 'Old design');
});

ブラウザ SDK は、設定された評価コンテキストをすべてのフラグ評価に対して使用します。ユーザーがログインしたときや属性が変更されたときに、OpenFeature.setContext() を使用してそのコンテキストを更新できます。サーバー SDK では、1 つのプロセスが多くの異なるユーザーを処理するため、フラグ評価呼び出しごとに新しい評価コンテキストを渡します。

その他のサーバー言語については、Server-Side Feature Flags を参照してください。