Datadog の Feature Flags 機能を試してみた

Datadog の Feature Flags 機能を試してみた

2026.03.09

Datadog の Feature Flag 機能について

2026 年 2 月に Datadog の Feature Flags 機能が GA されました。

https://www.datadoghq.com/about/latest-news/press-releases/datadog-launches-feature-flags/

元々 Datadog は LaunchDarkly などの Feature Flag 管理ツールと連携することで、Feature Flag に関する情報を RUM (Real User Monitoring) 側に反映させて分析することができました。

https://docs.datadoghq.com/ja/integrations/launchdarkly/

今回、Datadog 側で Feature Flags 機能を提供するようになり、より簡単に APM や RUM と Feature Flag を連携できるようになりました。

やってみる

全体構成

Vite + React で簡単な SPA アプリケーションを作成して、下記構成で試してみます。

arch.png

Datadog が Feature Flag 管理と RUM の両方を提供するようになったので、登場するサービスが減ってシンプルになりましたね。

Datadog 側の設定

まず、Datadog の RUM 機能でアプリケーションを作成します。

スクリーンショット 2026-03-09 11.37.31.png

Type は React を選択します。

スクリーンショット 2026-03-09 11.40.12.png

アプリケーションを RUM と統合するためのコードが表示されます。
特に applicationId と clientToken は後で使うのでメモしておきます。

スクリーンショット 2026-03-09 11.40.52.png

Feature Flags 管理画面で Flag を作成します。

スクリーンショット 2026-03-09 15.47.50.png

Flag 名は feature1 とします。
参照元は Client を選択し、型は Boolean を選択します。

スクリーンショット 2026-03-09 15.48.53.png

通知周りはデフォルト設定とします。

スクリーンショット 2026-03-09 15.48.59.png

「Create Flag」をクリックすると、Feature Flag 機能とアプリケーションの連携方法が表示されます。

スクリーンショット 2026-03-09 15.49.08.png

各 Flag は環境ごとに管理可能であり、まずは Development 環境のみ有効にします。

スクリーンショット 2026-03-09 15.49.30.png

アプリケーション側の設定

サンプルアプリケーションとして占いアプリを作成しました。

スクリーンショット 2026-03-09 16.00.29.png

client.getBooleanValue("feature1", false); で Feature Flag の値を取得し、true の場合はボタンの色をピンクに、false の場合はボタンの色を青に変えるようにしています。

function App() {
  const [apiState, setApiState] = useState<ApiState>({ status: "idle" });
  const [fetchKey, setFetchKey] = useState(0);
  const isFeature1Enabled = client.getBooleanValue("feature1", false);
  const errorRate = isFeature1Enabled ? 0.3 : 0;

  const handleFetch = async () => {
    setFetchKey((k) => k + 1);
    setApiState({ status: "loading" });
    try {
      const data = await fetchFortune(errorRate);
      setApiState({ status: "success", data });
    } catch (e) {
      setApiState({ status: "error", error: e as Error });
    }
  };

  const buttonClass = isFeature1Enabled
    ? "cursor-pointer rounded-lg border border-transparent px-5 py-2 text-base font-medium bg-pink-400 text-white hover:bg-pink-300 transition-colors disabled:opacity-50"
    : "cursor-pointer rounded-lg border border-transparent px-5 py-2 text-base font-medium bg-blue-600 text-white hover:bg-blue-500 transition-colors disabled:opacity-50";

  return (
    <>
      <h1>占いアプリ</h1>
      <div className="card">
        <button
          className={buttonClass}
          onClick={handleFetch}
          disabled={apiState.status === "loading"}
        >
          今日の運勢を占う
        </button>
        <div className="mt-4">
          <ErrorBoundary key={fetchKey} fallback={ErrorFallback}>
            <ResultCard state={apiState} />
          </ErrorBoundary>
        </div>
      </div>
    </>
  );
}

また、feature1 が true の場合は 30% の可能性でエラーを発生させるようにしています(実際に API を叩いているわけでは無く、擬似的にエラーを発生させています)。

スクリーンショット 2026-03-09 16.03.22.png

その他、Datadog と Feature Flag を連携する部分は下記のようになります。

import { datadogRum } from "@datadog/browser-rum";
import { reactPlugin } from "@datadog/browser-rum-react";
import { DatadogProvider } from "@datadog/openfeature-browser";
import { OpenFeature } from "@openfeature/web-sdk";

export async function initDatadog() {
  datadogRum.init({
    applicationId: import.meta.env.VITE_DATADOG_APPLICATION_ID,
    clientToken: import.meta.env.VITE_DATADOG_CLIENT_TOKEN,
    site: import.meta.env.VITE_DATADOG_SITE ?? "datadoghq.com",
    service: "datadog-feature-flag",
    env: import.meta.env.VITE_DATADOG_ENV ?? "dev",
    trackUserInteractions: true,
    trackResources: true,
    trackLongTasks: true,
    plugins: [reactPlugin],
  });

  const provider = new DatadogProvider({
    clientToken: import.meta.env.VITE_DATADOG_CLIENT_TOKEN,
    applicationId: import.meta.env.VITE_DATADOG_APPLICATION_ID,
    site: import.meta.env.VITE_DATADOG_SITE ?? "datadoghq.com",
    service: "datadog-feature-flag",
    env: import.meta.env.VITE_DATADOG_ENV ?? "dev",
    enableFlagEvaluationTracking: true,
    enableExposureLogging: true,
  });

  await OpenFeature.setProviderAndWait(provider);
}

RUM との連携は下記ドキュメントを参考にしました。

https://docs.datadoghq.com/ja/integrations/rum-react/

Feature Flags 機能との連携は下記ドキュメントを参考にしました。

https://docs.datadoghq.com/ja/feature_flags/client/react/?tab=npm

applicationId と clientToken は Datadog RUM のアプリケーション作成時に取得したものを Amplify の環境変数に設定しています。

スクリーンショット 2026-03-09 16.13.40.png

使用したコード類は下記リポジトリで公開しているので、もし興味があればご確認下さい。

https://github.com/masutaro99/datadog-feature-flag

今回はせっかくなので Amplify にデプロイしてみましたが、ローカル環境で実行しても全く同じようにテストすることが可能です。

動作確認

Feature Flags 機能を利用できるようにはなっていますが、現時点では全てのトラフィックにおいて false が返ってくる状態です。

スクリーンショット 2026-03-09 15.49.39.png

ボタンも青色で、エラーも発生しません。

スクリーンショット 2026-03-09 16.59.06.png

「Edit Targeting Rules」をクリックして、ルールを追加します。

スクリーンショット 2026-03-09 17.01.01.png

「+」をクリックします。

スクリーンショット 2026-03-09 17.02.00.png

「Add Rollouts Steps」をクリックします。
こちらの機能を利用することで、まず一定割合のトラフィックを新しいバージョンに流しつつ、一定の期間経過後に残りのトラフィックを新しいバージョンに切り替えるようなことができます。

スクリーンショット 2026-03-09 17.02.14.png

今回はまず 50% のトラフィックを新しいバージョンに流しつつ、10 分後に残りのトラフィックを新しいバージョンに切り替えるようにします。

スクリーンショット 2026-03-09 17.02.29.png

「Save Changes」をクリックします。

スクリーンショット 2026-03-09 17.02.41.png

50% の確率で新しいバージョンにトラフィックが流れ始め、ピンク色のボタンやエラーを確認できるようになりました。

スクリーンショット 2026-03-09 17.20.04.png

Datadog のコンソールから、Feature Flag ごとのエラー率や、レイテンシも良い感じに見れます。

スクリーンショット 2026-03-09 17.19.28.png

また、RUM の Feature Flag Tracking 機能を利用することで、より詳細な分析も可能です。

スクリーンショット 2026-03-09 17.39.57.png

個別の RUM イベントも確認してみます。

スクリーンショット 2026-03-09 17.40.03.png

今回は Chrome からのアクセスのみで面白みが無いですが、調査が捗りそうです。

スクリーンショット 2026-03-09 17.40.18.png

こんな感じのビューも見れます。

スクリーンショット 2026-03-09 17.40.29.png

Error Tracking 機能と Feature Flag も関連付けて分析できます。

スクリーンショット 2026-03-09 17.44.37.png

エラーの詳細画面です。

スクリーンショット 2026-03-09 17.44.51.png

今回は特にパフォーマンス面の変化は無いですが、パフォーマンス面の分析を行うための良い感じのビューも見れます。

スクリーンショット 2026-03-09 17.47.01.png

RUM の情報を見て問題があれば、Feature Flags 側のコンソールからロールバックすれば元の状態に切り戻せます。

スクリーンショット 2026-03-09 17.50.58.png

最後に

Datadog の Feature Flags 機能 を試してみました。
RUM と Feature Flag を簡単に連携できて、ロールバックも同じコンソールから実行できるのは非常に良さそうです。
Feature Flag 管理ツールを検討している方や Datadog RUM を利用している方は是非試してみて下さい!

この記事をシェアする

FacebookHatena blogX

関連記事