銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

OpenFeature .NET SDKを試してみた(2) 名前付きクライアント

前回の記事のにコメントをいただいたので名前付きクライアントを試してみました。

tech.tanaka733.net

プロバイダーは一度に1つ登録できるのですが、名前を付けることで複数登録してクライアント取得時に分けることができます。前回の記事では前半だけ書いていたので不正確になっていました。

openfeature.dev

github.com

openfeature.dev

名前付きクライアントを利用するサンプルコードとしては引用したドキュメントの通りなのですが、実際に試すためにflagdのJSONファイルを変えて複数起動し、別々のプロバイダーとして登録しました。

以下をdemo1.jsonとして保存し、

{
  "flags": {
    "myStringFlag": {
      "state": "ENABLED",
      "variants": {
        "key1": "val1",
        "key2": "val2",
        "key3": "val3"
      },
      "defaultVariant": "key1"
    }
  }
}

defaultVariantだけ変えたこれをdemo2.jsonとして保存し、

{
  "flags": {
    "myStringFlag": {
      "state": "ENABLED",
      "variants": {
        "key1": "val1",
        "key2": "val2",
        "key3": "val3"
      },
      "defaultVariant": "key2"
    }
  }
}

コンテナを分けて起動します。

docker run --rm -it --name flagd1 -p 8013:8013 -v ${PWD}:/etc/flagd ghcr.io/open-feature/flagd:latest start --uri file:./etc/flagd/demo1.json
docker run --rm -it --name flagd2 -p 8014:8013 -v ${PWD}:/etc/flagd ghcr.io/open-feature/flagd:latest start --uri file:./etc/flagd/demo2.json

そして、C#コードでは別のProviderとして作成します。

var flagdProvider1 = new FlagdProvider(new Uri("http://localhost:8013"));
var flagdProvider2 = new FlagdProvider(new Uri("http://localhost:8014"));

そしていくつかのパターンで試してみました。

//名前を指定しないとデフォルトのプロバイダーが使われる
var client = Api.Instance.GetClient();
var val = await client.GetStringValue("myStringFlag", "null");
Console.WriteLine(val); //val1

//名前を指定すると指定した名前で登録されたプロバイダーが使われる
client = Api.Instance.GetClient("provider2");
val = await client.GetStringValue("myStringFlag", "null");
Console.WriteLine(val); //val2

//指定した名前が存在しないとデフォルトのプロバイダーが使われる
client = Api.Instance.GetClient("provider3");
val = await client.GetStringValue("myStringFlag", "null");
Console.WriteLine(val); //val1

//同じ名前で別のプロバイダーを登録すると上書きされる
Api.Instance.SetProvider("provider2", flagdProvider1);
client = Api.Instance.GetClient("provider2");
val = await client.GetStringValue("myStringFlag", "null");
Console.WriteLine(val); //val1

GetClient メソッドの引数に指定した名前で登録されたプロバイダーがあれば、それが使われます。指定した名前がない場合はデフォルトのプロバイダーが登録されます。.NET SDKには説明が見つからなかったのですが、OpenFeatureが定めている仕様にはこの動作が書かれており、期待される通りの挙動です。

openfeature.dev

前回はbool型の値、今回はstring型の値を使ったので、次回はOpenFeatureではどんな型とその値を取得するどんな評価APIが用意されているかを確認します。