Bot Framework Composer でボット開発 : その 13 開発時のデータベース利用


前回 はチャンネル固有の機能について見ていきましたが、今回はローカル開発時のデータベースについて説明します。

ボットの公開でも説明した通り、公開されたボットはバックエンドデータベースとして 3 種類のストレージを使用します。

  • Application Insights: ボットの利用状況やリソースをモニタリング
  • Azure Cosmos DB: ボットのメモリオブジェクト保存用
  • ストレージアカウント: ボットとユーザーのやり取り保存用

開発時にはメモリオブジェクトを使うため、ボットを再起動するたびにデータが失われるため、以下の点に注意が必要です。

  • エミュレーターからの接続方法で新規ユーザーを使うのか、既存ユーザーを使うか
  • 実際に Cosmos DB やストレージアカウントに保存される内容が公開するまで不明

開発時のデータベース利用設定

Composer の設定より各種接続文字列を反映すれば開発中でも Cosmos DB などを利用することができます。

1. プロジェクトの保存フォルダにある BotProject.sln を開く。既定で <ユーザードキュメント>\Composer。

2. appsettings.Deployment.json より blobStorage, comosDb, applicationInsights をコピー。

3. Composer より設定を開き、コピーした内容を張り付け。

Composer の設定ファイルの扱い

Composer 内で設定した内容は ComposerDialogs/settings フォルダに保存され、Program.cs によって読み込まれる。そのため開発中、本番関係なく設定が有効になるため、テスト用の値を入れた場合、発行前に明示的に取り除く必要があります。

Cosmos DB

エミュレーターで何度か新規ユーザー ID を使って、プロファイル登録処理を行います。

その後 Cosmos DB に格納されたデータを確認します。

1. Azure ポータル へ接続し、Cosmos DB を選択。

2.「Data Explorer」を選択し、コレクションを確認。appsettings.json で指定した botstate-db の botstate-collection を選択。

3. items より users*2f を選択。ドキュメントに user 記憶域のデータがあることを確認。

4. conversations アイテムも確認。こちらは conversation 記憶域のデータが保存されている。

5. エミュレーターでも最後の Bot State にある conversation を確認。

つまり Cosmos DB は BotBuilder で利用する BotState がすべて入っているため、これまでに会話したユーザーの総数や、ユーザーごとの会話の数、最後の会話などを取得できます。

ストレージアカウント

同様にストレージアカウントも確認します。

1. Azure ポータル より、ストレージアカウントを選択。

2. コンテナーを選択。

3. transcripts フォルダにチャンネルごとにフォルダがある。今回は emulator を選択。

4. Conersation ID 後とのフォルダがあるため、任意のものを選択。今回は最後にエミュレータで会話したものを選択。エミュレーターで Conversation ID を確認。

5. コンテナーも同じ ID を選択。

6. 一番最後のデータをダウンロードして開く。エミューレーターで得られるデータがそのまま保存されていることを確認。

Application Insights

Application Insights は既定でテンプレートに入っていないため、手動で追加する必要があります。
様々な方法で追加できますが、詳細は以下記事を参考にしてください。

Bot Builder v4 : Application Insights を駆使した利用状況分析

そのほかにも、App Service またはボットチャンネル登録でも個別に Application Insights を設定でき、それぞれ違う種類のデータが取得可能です。

Transcript を停止する

本番でも会話の詳細を記録したくない場合、blobStorage の設定をすべての構成ファイルから削除してください。Transcript は専用のミドルウェアで記録されますが、接続文字列が無い場合は動作しません。

startup.cs
if (!string.IsNullOrEmpty(settings.BlobStorage.ConnectionString) && !string.IsNullOrEmpty(settings.BlobStorage.Container))
{
    adapter.Use(new TranscriptLoggerMiddleware(new AzureBlobTranscriptStore(settings.BlobStorage.ConnectionString, settings.BlobStorage.Container)));
}
else
{
    Console.WriteLine("The settings of TranscriptLoggerMiddleware is incomplete, please check following settings: settings.BlobStorage.ConnectionString, settings.BlobStorage.Container");
}

まとめ

今回はデータベースにどのような値が格納されるか見ていきました。また開発中でもデータベースを利用する方法も紹介しました。是非お試しください。

目次へ戻る