DatadogとLaunchDarklyでフィーチャーフラグを活用

# はじめに
本投稿は、[Datadog アドベントカレンダー 2023](https://qiita.com/advent-calendar/2023/datadog)の12/12の記事になります。

今回は、DatadogとLaunchDarklyを連携して、フィーチャーフラグ（機能フラグ）を活用した、アプリのローリングアップデートについて、そのやり方を解説します。

# LaunchDarklyとは
みなさんは、[LaunchDarkly](https://launchdarkly.com/)をご存知でしょうか？
LaunchDarkly（ランチダークリー）は、アプリ開発者がフィーチャーフラグやフィーチャートグル、設定などをリアルタイムで制御できるソフトウェアプラットフォームです。

具体的には、LaunchDarklyは以下のような機能を提供します：

#### Feature Flags（機能フラグ）: 
開発者はコード内にフラグを埋め込み、それに基づいてアプリケーションの特定の機能を有効または無効にすることができます。これにより、新しい機能を段階的に導入したり、緊急の問題が発生した場合に機能をオフにすることが容易になります。

#### Feature Rollouts（機能の段階的リリース）: 
新しい機能を一部のユーザーセグメントに対して段階的にリリースすることができます。これにより、機能の効果やパフォーマンスを検証し、リリース全体に展開する前に問題を修正することができます。

#### A/B Testing（A/B テスト）: 
異なるバージョンの機能やデザインを複数のユーザーグループに提供し、どちらがより効果的かを評価するための実験を実施できます。

#### Operational Feature Toggles（運用の機能トグル）: 
プロダクション環境でのトラブルシューティングや緊急の変更に対応するために、ランタイムでフラグを切り替えることが可能です。

これらの機能は、アジャイル開発のプロセスやDevOpsの領域で、アプリの開発とデプロイのスピードアップに役立ちます。 LaunchDarklyを使うことで、コードの変更を柔軟に管理し、Developer Experienceの向上につながると思います。

# 実装
## LaunchDarklyをアプリに仕込む
まずは、対象のアプリケーションにフラグを仕込みます。
これは、アプリケーションにライブラリをインポートして、フラグを効かせたいコードに対してフラグを参照する、といった形になります。
実装方法は、[LaunchDarklyの公式サイトに言語ごとにまとまってます](https://docs.launchdarkly.com/sdk/client-side)ので、こちらをご参照ください。

今回、私がこのシナリオ用に使ったのはこちらのアプリケーションになります。
[Datadog Ecommerce Workshop](https://github.com/DataDog/ecommerce-workshop)

実際のアプリの画面はこんな感じです。
![Screenshot 2023-12-21 at 15.52.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/1c349a8f-2607-c5d1-ff97-9e1cafb70c02.png)

このアプリは、Kubernetes上で動いているコンテナアプリケーションです。マイクロサービスなアーキテクチャで作られており、アプリ本体と、画面上に見えている「Ad 1.1」と書かれた広告バナー（広告に見えませんがｗ）、それから左上に表示されているおすすめ文言みたいな部分が、それぞれ疎結合な形で作られています。

今回、アプリを動かすKubernetesはローカル環境に作成しました。Mac上のDocker Desktopに、[kind](https://kind.sigs.k8s.io/)を使ってKubernetes環境をデプロイしています。
![Screenshot 2023-12-21 at 15.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/27446da4-9a31-c57c-a040-0a2e65e4e6bd.png)

## Datadogとのインテグレーション
LaunchDarklyのフィーチャーフラグのトラッキングは、RUM Browser SDKを使います。詳細なセットアップ手順については、[こちらのガイド](https://docs.datadoghq.com/ja/real_user_monitoring/guide/setup-feature-flag-data-collection/)をご覧ください。

対象のアプリに関しては、通常のAPMを使えるようにしておきます。
実際にトレース情報やサービスマップを見ると、このサンプルアプリの構造がよくわかりますね。
![Screenshot 2023-12-21 at 15.54.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/daa44bda-8716-b68f-a546-a57c07ba6298.png)

![Screenshot 2023-12-21 at 15.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/2f14fae9-5059-016a-8c4f-e38965898a42.png)

![Screenshot 2023-12-21 at 15.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/8869c25e-f778-2d8a-78b2-a0993c5265c2.png)

![Screenshot 2023-12-21 at 15.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/c1e9ab7d-3cb0-421b-bcad-fcb38f70c88e.png)


## フィーチャーフラグを操作してみる
今回、フィーチャーフラグを仕込んだのは、Eコマースアプリの画面中央にある広告部分です。フラグをON/OFF切り替えることによって広告のバージョンが変わる、といったものになります。

まず、フィーチャーフラグを実装したコードをKubernetesへapplyします。
![Screenshot 2023-12-21 at 15.59.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/bda19f2c-c211-0b40-d52e-23616cf0b378.png)

advertisements-XXXXXといったPodが実行されたのが見えます。
![Screenshot 2023-12-21 at 15.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/34339595-1a56-1e5e-4163-3c81e9d8597a.png)

次にLaunchDarklyのダッシュボードへ移動します。
すでに作成してある「New Ad Engine」のフラグを有効にします。
![Screenshot 2023-12-21 at 16.00.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/bcdf675a-2939-8e48-39f6-f1751a15ae9f.png)
![Screenshot 2023-12-21 at 16.00.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/c6601fbe-1397-8c12-1e17-1bcc4f53ada9.png)
![Screenshot 2023-12-21 at 16.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/29a9523b-8c1b-4f2f-3129-0fed0938a007.png)

本来であれば、このような作業はチームで行うので、実行者と承認者が別になりますが、ここでは自分自身をReviewerとして設定しています。
![Screenshot 2023-12-21 at 16.01.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/b68206b4-beb2-eb02-5d3a-206f39ef4ed7.png)

そうすると、自分自身からレビューのリクエストが届きますｗ
![Screenshot 2023-12-21 at 16.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/0fe7e627-de6a-3fc3-cb5f-c981b77d0fe2.png)

変更を承認します。
![Screenshot 2023-12-21 at 16.02.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/65986982-374a-6e8f-b438-b637efe17e8e.png)

![Screenshot 2023-12-21 at 16.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/de699d73-43d5-24a4-7e39-d8657372894d.png)

Eコマースアプリの画面に戻り、リロードしてみると、無事新しいバージョンの広告バナーが表示されました。色が青から赤に変わり、表示文言が「Ad 1.x」から「Ad 2.x」へ変更されたことが確認できます。
![Screenshot 2023-12-21 at 16.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/e9313bcf-37c4-6654-2795-fc7900d9ee47.png)

## Datadogのダッシュボードを見てみる
フィーチャーフラグを使って、マイクロサービスの機能をON/OFFするだけであればDatadogとインテグレーションする必要はありません。
ここでは、実際にフィーチャーフラグを操作した際のパフォーマンスをDatadogで観測することが可能です。フラグを操作し、有効にしたタイミングでスパイクが発生しているのが見てわかります。
![Screenshot 2023-12-21 at 16.04.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/79fc7bc0-27d4-42ec-9518-4103f0b7e09f.png)

![Screenshot 2023-12-21 at 16.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/d557a926-8627-a526-ad00-833ba5183b15.png)

## 再度フィーチャーフラグを操作
今度は、もうイチ段階新しい機能を実装したモジュールをApplyしてみます。これは、Eコマースアプリの登録ユーザーに対して、パーソナライズされた広告表示を実現するためのものになります。
![Screenshot 2023-12-21 at 16.05.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/d27e0d72-4efc-4e26-80ca-43248d4caba2.png)

先程「New Ad Engine」のフィーチャーフラグはONにしていますが、新しいモジュールに差し替えても画面は変わらないようです。
![Screenshot 2023-12-21 at 16.06.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/38888b0d-3be7-2867-a399-151c19e954fa.png)

今回Applyした機能では、別のフィーチャーフラグを作成しています。LaunchDarklyのダッシュボードを確認してみましょう。作成した置いた「Discount Ads」というフラグが確認できます。
![Screenshot 2023-12-21 at 16.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/a1ddb5fe-87d1-1a3b-5e65-5f7cf6d30467.png)

こちらのフラグをONにします。先程と同じ手順で承認まで進めます。
![Screenshot 2023-12-21 at 16.06.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/89ab3766-20e5-3c37-a746-d0eecf721347.png)

フラグがONになったことが確認できました。
![Screenshot 2023-12-21 at 16.07.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/b4ab9209-1c2d-5959-48be-66d0cf2b60da.png)

Eコマースアプリの画面をリロードしてみますが、広告は変更されていないようです。
![Screenshot 2023-12-21 at 16.07.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/f3ffd2a6-3ae9-862b-7e78-f45e8d1a81f5.png)

そうです、今回はパーソナライズされた広告機能なので、このEコマースサイトへログインして初めてその広告が表示されるのです。
ログインしてみると、無事ディスカウント広告が表示されました。
![Screenshot 2023-12-21 at 16.08.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/61287ded-076d-edb6-3ac8-3143aa734f4c.png)

ログイン状態のまま対象のフィーチャーフラグをOFFにしてみると、ログイン状態でも広告が「Ad 2.x」と、パーソナライズされていない広告に戻っていることが確認できます。
これは、フィーチャーフラグが正しく機能していることを示していますね。
![Screenshot 2023-12-21 at 16.09.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/4014e6a1-4a2d-bbd4-0d1d-007734cde763.png)

![Screenshot 2023-12-21 at 16.09.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/0435c629-4228-632c-ae56-f85dc8d8f2c4.png)

## DatadogダッシュボードからLaunchDarklyダッシュボードへ
せっかくインテグレーションしているのですから、Datadogで検知したLaunchDarklyのイベントに対して、シームレスにオペレーションしたいですよね。
Datadogのダッシュボードに表示している発生済みイベントには、対象のフィーチャーフラグの画面へのURLがりんくされてますので、それをクリックすることで直接当該ページへ飛ぶことができます。
![Screenshot 2023-12-21 at 16.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/1c2ea99c-f19b-9e33-71d6-24c88fe5403d.png)

# まとめ
いかがでしたでしょうか？
フィーチャーフラグ自体は、利用している方もそれなりにいると思いますが、Datadogと連携させることで、より便利にスムーズにアプリデプロイのオペレーションを回すことができるのでは無いでしょうか。
ではでは 👋