前回 はチャンネル固有の機能について見ていきましたが、今回はローカル開発時のデータベースについて説明します。
ボットの公開でも説明した通り、公開されたボットはバックエンドデータベースとして 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 ポータル より、ストレージアカウントを選択。
3. transcripts フォルダにチャンネルごとにフォルダがある。今回は emulator を選択。
4. Conersation ID 後とのフォルダがあるため、任意のものを選択。今回は最後にエミュレータで会話したものを選択。エミュレーターで Conversation ID を確認。
6. 一番最後のデータをダウンロードして開く。エミューレーターで得られるデータがそのまま保存されていることを確認。
Application Insights
Application Insights は既定でテンプレートに入っていないため、手動で追加する必要があります。
様々な方法で追加できますが、詳細は以下記事を参考にしてください。
Bot Builder v4 : Application Insights を駆使した利用状況分析
そのほかにも、App Service またはボットチャンネル登録でも個別に Application Insights を設定でき、それぞれ違う種類のデータが取得可能です。
Transcript を停止する
本番でも会話の詳細を記録したくない場合、blobStorage の設定をすべての構成ファイルから削除してください。Transcript は専用のミドルウェアで記録されますが、接続文字列が無い場合は動作しません。
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");
}
まとめ
今回はデータベースにどのような値が格納されるか見ていきました。また開発中でもデータベースを利用する方法も紹介しました。是非お試しください。