Feature Flag データは、ユーザーエクスペリエンスおよびパフォーマンスモニタリングへの可視性を向上させます。これにより、特定の機能がどのユーザーに表示されているかを判断し、導入された変更がユーザーエクスペリエンスに影響を与えているか、パフォーマンスに悪影響を及ぼしているかを評価できます。

Feature Flag データで RUM データを強化することで、バグやパフォーマンス回帰を意図せず引き起こすことなく、機能が正しくリリースされることができます。この追加のインサイトにより、機能リリースとパフォーマンスを相関させ、特定のリリースに問題を絞り込み、迅速にトラブルシューティングできます。

##RUM モニタリングの設定

Feature Flag Trackingは、RUM Browser、iOS、Android、Flutter、React Native SDK で利用可能です。

Browser SDK の Feature Flag データ収集を有効にするには、以下の手順に従います。

  1. RUM Browser Monitoring を設定します。Browser RUM SDK バージョンは 4.25.0 以降である必要があります。

  2. RUM SDK を初期化し、enableExperimentalFeatures 初期化パラメーターに["feature_flags"] を設定します。

    npm
      import { datadogRum } from '@datadog/browser-rum';
    
      // Initialize Datadog Browser SDK
      datadogRum.init({
        ...
        enableExperimentalFeatures: ["feature_flags"],
        ...
    });
    
    CDN 非同期
    window.DD_RUM.onReady(function() {
        window.DD_RUM.init({
          ...
          enableExperimentalFeatures: ["feature_flags"],
          ...
        })
    })
    
    CDN 同期
    window.DD_RUM &&
        window.DD_RUM.init({
          ...
          enableExperimentalFeatures: ["feature_flags"],
          ...
        })
    

iOS アプリケーションで Feature Flag データの収集を有効にするには、以下の手順に従います。

  1. RUM iOS Monitoring を設定します。iOS RUM SDK バージョンは 1.16.0 以降である必要があります。

Android アプリケーションで Feature Flag データの収集を有効にするには、以下の手順に従います。

  1. RUM Android Monitoring を設定します。Android RUM SDK バージョンは 1.18.0 以降である必要があります。

Flutter アプリケーションで Feature Flag データの収集を有効にするには、以下の手順に従います。

  1. RUM Flutter Monitoring を設定します。Flutter プラグインのバージョンは 1.3.2 以降である必要があります。

React Native アプリケーションで Feature Flag データ収集を有効にするには、以下の手順に従います。

  1. RUM React Native Monitoring を設定します。React Native RUM SDK のバージョンは 1.7.0 以降である必要があります。

##Feature Flag インテグレーションの設定

カスタム Feature Flag 管理ソリューション を使用するか、以下に示す Datadog のインテグレーションパートナーのいずれかを使用して Feature Flag データの収集を開始できます。

注意: Feature Flag Tracking には次の特殊文字はサポートされていません: .:+、``、=&&||><!(){}[]^"~*?\。Datadog は、可能な限りこれらの文字を Feature Flag 名に使用しないことを推奨します。これらの文字のいずれかを使用する必要がある場合は、データを Datadog に送信する前にその文字を置き換えてください。たとえば、以下のとおりです。

datadogRum.addFeatureFlagEvaluation(key.replaceAll(':', '_'), value);
datadog
amplitude
custom
custom
devcycle
eppo
flagsmith
growthbook
kameleoon
launchdarkly
split
statsig

Amplitude インテグレーション

この Feature Flag インテグレーションを初期化する前に、RUM Monitoring をセットアップしてください

Amplitude の SDK を初期化し、次のコードスニペットを使用して Datadog に Feature Flag の評価を報告するエクスポージャリスナーを作成します。

Amplitude の SDK の初期化については、Amplitude の JavaScript SDK ドキュメント を参照してください。

  const experiment = Experiment.initialize("CLIENT_DEPLOYMENT_KEY", {
    exposureTrackingProvider: {
      track(exposure: Exposure)  {
        // Send the feature flag when Amplitude reports the exposure
        datadogRum.addFeatureFlagEvaluation(exposure.flag_key, exposure.variant);
      }
    }
  })

Amplitude の SDK を初期化し、以下に示すコードスニペットを使用して、インスペクターで Feature Flag の評価を Datadog にレポートする機能を作成します。

Amplitude の SDK の初期化については、Amplitude の iOS SDK ドキュメント を参照してください。

  class DatadogExposureTrackingProvider : ExposureTrackingProvider {
    func track(exposure: Exposure) {
      // Send the feature flag when Amplitude reports the exposure
      if let variant = exposure.variant {
        RUMMonitor.shared().addFeatureFlagEvaluation(name: exposure.flagKey, value: variant)
      }
    }
  }

  // In initialization:
  ExperimentConfig config = ExperimentConfigBuilder()
    .exposureTrackingProvider(DatadogExposureTrackingProvider(analytics))
    .build()

Amplitude の SDK を初期化し、以下に示すコードスニペットを使用して、インスペクターで Feature Flag の評価を Datadog にレポートする機能を作成します。

Amplitude の SDK の初期化については、Amplitude の Android SDK ドキュメント を参照してください。

internal class DatadogExposureTrackingProvider : ExposureTrackingProvider {
  override fun track(exposure: Exposure) {
      // Send the feature flag when Amplitude reports the exposure
      GlobalRumMonitor.get().addFeatureFlagEvaluation(
          exposure.flagKey,
          exposure.variant.orEmpty()
      )
  }
}

// In initialization:
val config = ExperimentConfig.Builder()
    .exposureTrackingProvider(DatadogExposureTrackingProvider())
    .build()

Amplitude はこのインテグレーションをサポートしていません。Amplitude にチケットを作成して、この機能をリクエストしてください。

###ConfigCat インテグレーション

この Feature Flag インテグレーションを初期化する前に、RUM Monitoring をセットアップしてください

ConfigCat JavaScript SDK を初期化する際は、flagEvaluated イベントにサブスクライブし、Datadog に Feature Flag の評価を報告してください。

const configCatClient = configcat.getClient(
  '#YOUR-SDK-KEY#',
  configcat.PollingMode.AutoPoll,
  {
    setupHooks: (hooks) =>
      hooks.on('flagEvaluated', (details) => {
        datadogRum.addFeatureFlagEvaluation(details.key, details.value);
      })
  }
);

ConfigCat JavaScript SDK の初期化については、ConfigCat の JavaScript SDK ドキュメント を参照してください。

ConfigCat Swift iOS SDK を初期化する際は、flagEvaluated イベントにサブスクライブし、Datadog に Feature Flag の評価を報告してください。

  let client = ConfigCatClient.get(sdkKey: "#YOUR-SDK-KEY#") { options in
    options.hooks.addOnFlagEvaluated { details in
        RUMMonitor.shared().addFeatureFlagEvaluation(featureFlag: details.key, variation: details.value)
    }
  }

ConfigCat Swift (iOS) SDK の初期化については、ConfigCat の Swift iOS SDK ドキュメント を参照してください。

ConfigCat Android SDK を初期化する際は、flagEvaluated イベントにサブスクライブし、Datadog に Feature Flag の評価を報告してください。

ConfigCatClient client = ConfigCatClient.get("#YOUR-SDK-KEY#", options -> {
  options.hooks().addOnFlagEvaluated(details -> {
      GlobalRumMonitor.get().addFeatureFlagEvaluation(details.key, details.value);
  });
});

ConfigCat Android SDK の初期化については、ConfigCat の Android SDK ドキュメント を参照してください。

ConfigCat Dart SDK を初期化する際は、flagEvaluated イベントにサブスクライブし、Datadog に Feature Flag の評価を報告してください。

  final client = ConfigCatClient.get(
    sdkKey: '#YOUR-SDK-KEY#',
    options: ConfigCatOptions(
        pollingMode: PollingMode.autoPoll(),
        hooks: Hooks(
            onFlagEvaluated: (details) => {
              DatadogSdk.instance.rum?.addFeatureFlagEvaluation(details.key, details.value);
            }
        )
    )
  );

ConfigCat Dart (Flutter) SDK の初期化については、ConfigCat の Dart SDK ドキュメント を参照してください。

ConfigCat React SDK を初期化する際は、flagEvaluated イベントに登録し、Feature Flag の評価を Datadog に報告してください。

<ConfigCatProvider
  sdkKey="YOUR_SDK_KEY"
  pollingMode={PollingMode.AutoPoll}
  options={{
    setupHooks: (hooks) =>
      hooks.on('flagEvaluated', (details) => {
        DdRum.addFeatureFlagEvaluation(details.key, details.value);
      }),
  }}
>
  ...
</ConfigCatProvider>

ConfigCat React SDK の初期化についての詳細は、ConfigCat の React SDK ドキュメント を参照してください。

###カスタム Feature Flag 管理

カスタム Feature Flag インテグレーションを初期化する前に、RUM Monitoring をセットアップしてください

Feature Flag が評価されるたびに、以下の関数を追加して、Feature Flag の情報を RUM に送信します。

datadogRum.addFeatureFlagEvaluation(key, value);

Feature Flag が評価されるたびに、以下の関数を追加して、Feature Flag の情報を RUM に送信します。

RUMMonitor.shared().addFeatureFlagEvaluation(key, value);

Feature Flag が評価されるたびに、以下の関数を追加して、Feature Flag の情報を RUM に送信します。

GlobalRumMonitor.get().addFeatureFlagEvaluation(key, value);

Feature Flag が評価されるたびに、以下の関数を追加して、Feature Flag の情報を RUM に送信します。

DatadogSdk.instance.rum?.addFeatureFlagEvaluation(key, value);

Feature Flag が評価されるたびに、以下の関数を追加して、Feature Flag の情報を RUM に送信します。

DdRum.addFeatureFlagEvaluation(key, value);

DevCycle インテグレーション

この Feature Flag インテグレーションを初期化する前に、RUM Monitoring をセットアップしてください

DevCycle の SDK を初期化し、variableEvaluated イベントに登録します。すべての変数評価 variableEvaluated:* に登録することも、特定の変数評価 variableEvaluated:myvariablekey に登録することもできます。

DevCycle の SDK の初期化についての詳細は、DevCycle の JavaScript SDK ドキュメント を参照し、DevCycle のイベントシステムについての詳細は、DevCycle の SDK イベントドキュメント を参照してください。

const user = { user_id: "<USER_ID>" };
const dvcOptions = { ... };
const dvcClient = initialize("<DVC_CLIENT_SDK_KEY>", user, dvcOptions);
...
dvcClient.subscribe(
    "variableEvaluated:*",
    (key, variable) => {
        // track all variable evaluations
        datadogRum.addFeatureFlagEvaluation(key, variable.value);
    }
)
...
dvcClient.subscribe(
    "variableEvaluated:my-variable-key",
    (key, variable) => {
        // track a particular variable evaluation
        datadogRum.addFeatureFlagEvaluation(key, variable.value);
    }
)

DevCycle はこのインテグレーションをサポートしていません。この機能をリクエストするために、DevCycle にチケットを作成してください。

DevCycle はこのインテグレーションをサポートしていません。この機能をリクエストするために、DevCycle にチケットを作成してください。

DevCycle はこのインテグレーションをサポートしていません。この機能をリクエストするために、DevCycle にチケットを作成してください。

DevCycle はこのインテグレーションをサポートしていません。この機能をリクエストするために、DevCycle にチケットを作成してください。

Eppo インテグレーション

この Feature Flag インテグレーションを初期化する前に、RUM Monitoring をセットアップしてください

Eppo の SDK を初期化し、以下に示すコードスニペットを使用して、Feature Flag の評価を Datadog に報告する追加のアサインメントロガーを作成します。

Eppo の SDK の初期化についての詳細は、Eppo の JavaScript SDK ドキュメント を参照してください。

const assignmentLogger: IAssignmentLogger = {
  logAssignment(assignment) {
    datadogRum.addFeatureFlagEvaluation(assignment.featureFlag, assignment.variation);
  },
};

await eppoInit({
  apiKey: "<API_KEY>",
  assignmentLogger,
});

Eppo の SDK を初期化し、以下に示すコードスニペットを使用して、Feature Flag の評価を Datadog に報告する追加のアサインメントロガーを作成します。

Eppo の SDK の初期化についての詳細は、Eppo の iOS SDK ドキュメント を参照してください。

func IAssignmentLogger(assignment: Assignment) {
  RUMMonitor.shared().addFeatureFlagEvaluation(featureFlag: assignment.featureFlag, variation: assignment.variation)
}

let eppoClient = EppoClient(apiKey: "mock-api-key", assignmentLogger: IAssignmentLogger)

Eppo の SDK を初期化し、以下に示すコードスニペットを使用して、Feature Flag の評価を Datadog に報告する追加のアサインメントロガーを作成します。

Eppo の SDK の初期化についての詳細は、Eppo の Android SDK ドキュメント を参照してください。

AssignmentLogger logger = new AssignmentLogger() {
    @Override
    public void logAssignment(Assignment assignment) {
      GlobalRumMonitor.get().addFeatureFlagEvaluation(assignment.getFeatureFlag(), assignment.getVariation());
    }
};

EppoClient eppoClient = new EppoClient.Builder()
    .apiKey("YOUR_API_KEY")
    .assignmentLogger(logger)
    .application(application)
    .buildAndInit();

Eppo はこのインテグレーションをサポートしていません。この機能をリクエストするには、Eppo にお問い合わせください

Eppo の SDK を初期化し、以下に示すコードスニペットを使用して、Feature Flag の評価を Datadog に報告する追加のアサインメントロガーを作成します。

Eppo の SDK の初期化については、Eppo の React Native SDK ドキュメント を参照してください。

const assignmentLogger: IAssignmentLogger = {
  logAssignment(assignment) {
    DdRum.addFeatureFlagEvaluation(assignment.featureFlag, assignment.variation);
  },
};

await eppoInit({
  apiKey: "<API_KEY>",
  assignmentLogger,
});

###Flagsmith インテグレーション

この Feature Flag インテグレーションを初期化する前に、RUM Monitoring をセットアップしてください

Flagsmith の SDK に datadogRum オプションを付けて初期化すると、以下に示すコードのスニペットを使用して Datadog に Feature Flag の評価を報告することができるようになります。

必要に応じて、Flagsmith の特性を datadogRum.setUser() を使って Datadog に送信するようにクライアントを構成できます。Flagsmith の SDK の初期化については、Flagsmith の JavaScript SDK ドキュメント をご確認ください。

 // Initialize the Flagsmith SDK
 flagsmith.init({
     datadogRum: {
         client: datadogRum,
         trackTraits: true,
     },
     ...
 })

Flagsmith はこのインテグレーションをサポートしていません。Flagsmith にチケットを作成してこの機能をリクエストしてください。

Flagsmith はこのインテグレーションをサポートしていません。Flagsmith にチケットを作成してこの機能をリクエストしてください。

Flagsmith はこのインテグレーションをサポートしていません。Flagsmith にチケットを作成してこの機能をリクエストしてください。

Flagsmith は現在このインテグレーションをサポートしていません。Flagsmith にチケットを作成してこの機能をリクエストしてください。

###GrowthBook インテグレーション

GrowthBook SDK を初期化する際には、onFeatureUsage コールバックを使用して Datadog に Feature Flag の評価を報告します。

GrowthBook の SDK の初期化については、GrowthBook の JavaScript SDK ドキュメント を参照してください。

const gb = new GrowthBook({
  ...,
  onFeatureUsage: (featureKey, result) => {
    datadogRum.addFeatureFlagEvaluation(featureKey, result.value);
  },
});

gb.init();

GrowthBook はこのインテグレーションをサポートしていません。この機能をリクエストするには、GrowthBook にお問い合わせください。

GrowthBook SDK を初期化する際は、setFeatureUsageCallback を呼び出して、Datadog に Feature Flag の評価を報告してください。

GrowthBook の SDK の初期化については、GrowthBook の Android SDK ドキュメント を参照してください。

val gbBuilder = GBSDKBuilder(...)

gbBuilder.setFeatureUsageCallback { featureKey, result ->
  GlobalRumMonitor.get().addFeatureFlagEvaluation(featureKey, result.value);
}

val gb = gbBuilder.initialize()

GrowthBook SDK を初期化する際は、setFeatureUsageCallback を呼び出して、Datadog に Feature Flag の評価を報告してください。

GrowthBook の SDK の初期化については、GrowthBook の Flutter SDK ドキュメント を参照してください。

final gbBuilder = GBSDKBuilderApp(...);
gbBuilder.setFeatureUsageCallback((featureKey, result) {
  DatadogSdk.instance.rum?.addFeatureFlagEvaluation(featureKey, result.value);
});
final gb = await gbBuilder.initialize();

GrowthBook SDK を初期化する際には、onFeatureUsage コールバックを使用して Datadog に Feature Flag の評価を報告します。

GrowthBook の SDK の初期化については、GrowthBook の React Native SDK ドキュメント を参照してください。

const gb = new GrowthBook({
  ...,
  onFeatureUsage: (featureKey, result) => {
    datadogRum.addFeatureFlagEvaluation(featureKey, result.value);
  },
});

gb.init();

###Kameleoon インテグレーション

この Feature Flag インテグレーションを初期化する前に、RUM Monitoring をセットアップしてください

Kameleoon SDK を作成して初期化した後、Evaluation イベントに onEvent ハンドラーを使用してサブスクライブしてください。

SDK に関する詳細は、Kameleoon JavaScript SDK ドキュメント を参照してください。

client.onEvent(EventType.Evaluation, ({ featureKey, variation }) => {
  datadogRum.addFeatureFlagEvaluation(featureKey, variation.key);
});

Kameleoon はこのインテグレーションをサポートしていません。product@kameleoon.com に連絡して、この機能をリクエストしてください。

Kameleoon はこのインテグレーションをサポートしていません。product@kameleoon.com に連絡して、この機能をリクエストしてください。

Kameleoon はこのインテグレーションをサポートしていません。product@kameleoon.com に連絡して、この機能をリクエストしてください。

Kameleoon SDK を作成して初期化した後、Evaluation イベントに onEvent ハンドラーを使用してサブスクライブしてください。

Kameleoon React Native SDK ドキュメント に SDK の初期化の詳細が書かれています。

const { onEvent } = useInitialize();

onEvent(EventType.Evaluation, ({ featureKey, variation }) => {
  datadogRum.addFeatureFlagEvaluation(featureKey, variation.key);
});

###LaunchDarkly インテグレーション

この Feature Flag インテグレーションを初期化する前に、RUM Monitoring をセットアップしてください

LaunchDarkly の SDK を初期化し、以下に示すコードスニペットを使用して、Datadog に Feature Flag の評価を報告するインスペクターを作成します。

LaunchDarkly の SDK の初期化については、LaunchDarkly の JavaScript SDK ドキュメント を参照してください。

const client = LDClient.initialize("<CLIENT_SIDE_ID>", "<CONTEXT>", {
  inspectors: [
    {
      type: "flag-used",
      name: "dd-inspector",
      method: (key: string, detail: LDClient.LDEvaluationDetail) => {
        datadogRum.addFeatureFlagEvaluation(key, detail.value);
      },
    },
  ],
});

LaunchDarkly はこのインテグレーションをサポートしていません。LaunchDarkly にチケットを作成して、この機能をリクエストしてください。

LaunchDarkly はこのインテグレーションをサポートしていません。LaunchDarkly にチケットを作成して、この機能をリクエストしてください。

LaunchDarkly はこのインテグレーションをサポートしていません。LaunchDarkly にチケットを作成して、この機能をリクエストしてください。

LaunchDarkly は現在このインテグレーションをサポートしていません。LaunchDarkly にチケットを作成して、この機能をリクエストしてください。

###Split インテグレーション

この Feature Flag インテグレーションを初期化する前に、RUM Monitoring をセットアップしてください

Split の SDK を初期化し、以下のコードスニペットを使用して、Feature Flag の評価を Datadog に報告するインプレッションリスナーを作成します。

Split の SDK の初期化については、Split の JavaScript SDK ドキュメント を参照してください。

const factory = SplitFactory({
    core: {
      authorizationKey: "<APP_KEY>",
      key: "<USER_ID>",
    },
    impressionListener: {
      logImpression(impressionData) {
          datadogRum
              .addFeatureFlagEvaluation(
                  impressionData.impression.feature,
                  impressionData.impression.treatment
              );
    },
  },
});

const client = factory.client();

Split の SDK を初期化し、以下に示すコードスニペットを使用して、Datadog に Feature Flag の評価を報告するインスペクターを作成します。

Split の SDK の初期化については、Split の iOS SDK ドキュメント を参照してください。

  let config = SplitClientConfig()
  // Send the feature flag when Split reports the impression
  config.impressionListener = { impression in
      if let feature = impression.feature,
          let treatment = impression.treatment {
          RUMMonitor.shared().addFeatureFlagEvaluation(name: feature, value: treatment)
      }
  }

Split の SDK を初期化し、以下に示すコードスニペットを使用して、Datadog に Feature Flag の評価を報告するインスペクターを作成します。

Split の SDK の初期化については、Split の Android SDK ドキュメント を参照してください。

internal class DatadogSplitImpressionListener : ImpressionListener {
  override fun log(impression: Impression) {
      // Send the feature flag when Split reports the impression
      GlobalRumMonitor.get().addFeatureFlagEvaluation(
          impression.split(),
          impression.treatment()
      )
  }
  override fun close() {
  }
}

// In initialization:
val apikey = BuildConfig.SPLIT_API_KEY
val config = SplitClientConfig.builder()
    .impressionListener(DatadogSplitImpressionListener())
    .build()

Split の SDK を初期化し、以下に示すコードスニペットを使用して、Datadog に Feature Flag の評価を報告するインスペクターを作成します。

Split の SDK の初期化については、Split の Flutter プラグインドキュメント を参照してください。

  StreamSubscription<Impression> impressionsStream = _split.impressionsStream().listen((impression) {
    // Send the feature flag when Split reports the impression
    final split = impression.split;
    final treatment = impression.treatment;
    if (split != null && treatment != null) {
      DatadogSdk.instance.rum?.addFeatureFlagEvaluation(split, treatment);
    }
  });

Split の SDK を初期化し、以下のコードスニペットを使用して、Feature Flag の評価を Datadog に報告するインプレッションリスナーを作成します。

Split の SDK の初期化については、Split の React Native SDK ドキュメント を参照してください。

const factory = SplitFactory({
    core: {
      authorizationKey: "<APP_KEY>",
      key: "<USER_ID>",
    },
    impressionListener: {
      logImpression(impressionData) {
          DdRum
              .addFeatureFlagEvaluation(
                  impressionData.impression.feature,
                  impressionData.impression.treatment
              );
    },
  },
});

const client = factory.client();

###Statsig インテグレーション

この Feature Flag インテグレーションを初期化する前に、RUM Monitoring をセットアップしてください

Statsig の SDK を statsig.initialize で初期化します。

  1. ブラウザ RUM SDK バージョン 4.25.0 以降に更新します。

  2. RUM SDK を初期化し、enableExperimentalFeatures 初期化パラメーターを ["feature_flags"] で構成します。

  3. Statsig の SDK (v4.34.0 以降) を初期化し、以下のように gateEvaluationCallback オプションを実装します。

     await statsig.initialize('client-<STATSIG CLIENT KEY>',
     {userID: '<USER ID>'},
     {
         gateEvaluationCallback: (key, value) => {
             datadogRum.addFeatureFlagEvaluation(key, value);
         }
     }
     );
    

Statsig はこのインテグレーションをサポートしていません。support@statsig.com に連絡してこの機能をリクエストしてください。

Statsig はこのインテグレーションをサポートしていません。support@statsig.com に連絡してこの機能をリクエストしてください。

Statsig はこのインテグレーションをサポートしていません。support@statsig.com に連絡してこの機能をリクエストしてください。

Statsig は現在このインテグレーションをサポートしていません。support@statsig.com に連絡してこの機能をリクエストしてください。

###次のステップ

Feature Flag の 表示と分析

##参考資料