Amazon Web Services ブログ
Amazon Chime SDK ミーティングイベントでのモニタリングとトラブルシューティング
ミーティングイベントを利用することでAmazon Chime SDKで構築されたオーディオ、ビデオ、および画面共有アプリケーションからクライアントのメトリクスデータを収集できます。さらにミーティングイベントをAmazon CloudWatchと統合することで、重要な情報のスナップショットをAmazon CloudWatchダッシュボードで見ることができます。例えば、ユーザーがミーティングに参加中に障害が発生した場合、ダッシュボードでAmazon Chime SDKのミーティングステータスコードとエラーメッセージの確認ができます。このデータを使用してクライアントログを提供するような追加作業をユーザーに要求することなく、障害の理由を特定することができます。また接続の問題がユーザーの通話品質に影響するかどうかを判断するためのレイテンシーメトリクスもあります。
この記事では、以下の方法を学びます。
- アプリケーションからAmazon CloudWatchにミーティングイベントをアップロードする
- ユーザーが接続に失敗する原因を調査する
- 音声品質問題のトラブルシューティング
- マイクとカメラのセットアップの失敗を監視する
前提条件
開始する前に以下の前提条件の準備をお願いします。
- AWSサービスにアクセスするためのAWSアカウント
- Amazon Chime SDKを利用したアプリケーション。まだ作成していない場合は以下のGitHubリポジトリの指示に従ってアプリケーションを作成してください。
- (オプション)Amazon Chime SDKのデモアプリケーションは以下より簡単にデプロイできます。このデモアプリケーションではどのようにミーティングイベントを処理するかを学ぶことができます。以下のリンクよりデモセクションの手順に従ってください。デモアプリケーションをデプロイすると、AWS アカウントに追加料金が発生する場合がありますのでご注意ください。
ソリューション概要
Amazon Chime SDKを利用したWebアプリケーションやモバイルアプリケーションでは、イベントオブザーバーを追加してセッション中のミーティングイベントを収集することができます。この記事ではミーティングが終了したりエラーで停止したりしたときにミーティングイベントをAWS Lambda関数にアップロードするためのPOSTリクエストを作成する方法を学びます。セッションが実行されているときにミーティングイベントを送信することはできますが、パフォーマンスやミーティングの品質に影響を与える可能性があります。
Lambda関数ではAmazon CloudWatch Logs Insightsで検索および分析するために、ミーティングイベントをAmazon CloudWatchログストリームにアップロードします。またこの関数はレイテンシーメトリクスをAmazon CloudWatch Metricsにパブリッシュし統計情報として表示します。これらの2つのソースを使用して、アプリケーションのインシデントのために選択したグラフとログを表示するAmazon CloudWatchダッシュボードを作成します。ダッシュボードはユーザーの固有の問題をトラブルシューティングするための出発点となります。
この記事ではAmazon CloudWatchを例として使用していますがミーティングイベントを他の分析および視覚化サービスと統合することも可能です。
ソリューションをデプロイする
前節で説明したソリューションをプロビジョニングするためのAWS CloudFormationテンプレートを “Amazon Chime SDK Samples” レポジトリ以下に用意しました。リソースをプロビジョニングするには以下の手順に従ってください。このスタックによってデプロイされた一部のリソースは使用時にコストが発生します。
- GitHubからAWS CloudFormationテンプレートをコピーし、
meeting-events-blog-template.yaml
という名前の新しいファイルとして保存します。 - AWS CloudFormationコンソールを開き、[Create stack]を選択します。
- 「Upload a template file」を選択し、
meeting-events-blog-template.yaml
ファイルを参照します。 - Stack nameに
amazon-chime-sdk-meeting-events-demo
と入力し、「Next」を選択します。 - 「Specify stack details」を確認し「Next」をクリック。デフォルト値のまま利用するか、ご希望のスタック名とパラメータを入力してください。
- 「Configure stack options」を確認し「Next」をクリック。 タグやパーミッション情報をスタックへアップデートできます。
- スタック詳細を確認し「I acknowledge that AWS CloudFormation might create IAM resources」をチェック、「Create stack」を選択します。
デプロイが完了するとミーティングイベントをアップロードするためのAmazon API Gatewayエンドポイントと選択したメトリクスとログを表示するためのAmazon CloudWatchダッシュボードへのリンクを取得できます。
- AWS CloudFormationコンソールで、「Outputs」を選択し、「MeetingEventApiEndpoint」の値をメモします。
- 「MeetingEventDashboard」のリンクを選択して、Amazon CloudWatchダッシュボードを開きます。ダッシュボードは最初は空のままです。次のセクションでミーティングイベントをAmazon API Gatewayのエンドポイントに送信すると、以下の画像のようなデータが表示されます。
- ダッシュボードには、特定のインシデントのレイテンシーグラフやmeeting eventも表示されます。
MeetingSession
オブジェクトを作成したら、イベントオブザーバーを追加してミーティングイベントを受信することができます。この記事ではaudioInputFailed
、videoInputFailed
、meetStartFailed
、meetingFailed
の各エラーイベントに対してのみ、meetingHistory
属性の最後の5分間を送信する例を紹介しています。Webアプリケーションでミーティングイベントを受信するには、eventDidReceive
メソッドを実装したオーディオ・ビデオオブザーバーを追加します。利用可能なイベントと属性の詳細については、「ミーティングイベントのガイド」を参照してください。let meetingEvents = []; meetingSession.audioVideo.addObserver({ eventDidReceive: (name, attributes) => { const { meetingHistory, ...otherAttributes } = attributes; switch (name) { case 'audioInputFailed': case 'videoInputFailed': case 'meetingStartFailed': case 'meetingFailed': meetingEvents.push({ name, attributes: { ...otherAttributes, meetingHistory: meetingHistory.filter(({ timestampMs }) => { return Date.now() - timestampMs < 5 * 60 * 1000; }), }, }); break; default: meetingEvents.push({ name, attributes: otherAttributes, }); break; } } });
ミーティングが終了すると作成したエンドポイントにミーティングイベントをアップロードするためのPOSTリクエストを行います。これを行うにはAWS CloudFormationコンソールのOutputsタブからMeetingEventApiEndpointの値にエンドポイントを設定します。
const API_ENDPOINT_URL = /* MeetingEventApiEndpoint from the preceding section */;
meetingSession.audioVideo.addObserver({
audioVideoDidStop: () => {
setTimeout(() => {
if (meetingEvents.length > 0) {
fetch(API_ENDPOINT_URL, {
method: 'POST',
body: JSON.stringify(meetingEvents)
});
meetingEvents = [];
}
}, 0);
},
});
ユーザーがアプリケーションを早期に終了したりインターネットの接続状態が悪くてミーティングが終了したりする場合アプリケーションがミーティングイベントの送信に失敗することがあります。このような場合にはブラウザのローカルストレージなどの永続的なストレージにミーティングイベントを保存しておき、次に利用可能なセッションが終了したときに送信することができます。
ミーティングイベントを収集する
これで、アプリケーションがミーティングイベントをAmazon CloudWatchにアップロードできるようになりました。アプリケーションで、いくつかのAmazon Chime SDKミーティングを実行して、ダッシュボードに次の画像のようなデータが表示されることを確認します。ダッシュボードにミーティングイベントが表示されるまで数分かかることがあります。
ダッシュボードが期待通りに動作することを確認したらユーザーのミーティングイベントの収集を開始します。500 internal server errorsが発生した場合は、AWS Lambda関数のログを確認し、Amazon CloudWatch APIリクエストがスロットルされていないことを確認します。Amazon CloudWatchクオータの詳細については、Amazon CloudWatchクオータおよびAmazon CloudWatch Logsクオータを参照してください。
ミーティング参加に失敗した原因を調査する
ユーザーがミーティングへの参加に失敗するとアプリケーションはAmazon Chime SDKからmeetingStartFailed
イベントを受け取り、このイベントをAmazon CloudWatchに送ります。このミーティングイベントは、Amazon CloudWatchダッシュボードのMeeting join failuresウィジェットで確認できます。
- Amazon CloudWatchダッシュボードを開くには、AWS CloudFormationコンソールの「Outputs」タブにある「MeetingEventDashboard」リンクを選択します。
- ユーザーのレポートに基づいて、ダッシュボードの時間範囲を変更します。
- Meeting join failuresウィジェットは時間範囲内の1つまたは複数の失敗イベントを表示します。
- 行を展開するとイベント発生時にAmazon Chime SDKが記録されたすべての属性が表示されます。
attributes.attendeeId
とattributes.externalUserId
がユーザーの情報と一致していることを確認します。
特定のインシデントのミーティングイベントを見つけたらまず、ユーザーがサポートされているブラウザとオペレーティングシステムを使ってミーティングに参加しようとしたことを確認する必要があります。Amazon Chime SDKのシステム要件を参照してください。
インシデントの詳細を調査するには以下の 2 つの属性を確認します。
- attributes.meetingStatus – ユーザーがミーティングに参加できなかったときのAmazon Chime SDKのステータスです。この属性は
MeetingSessionStatusCode
で定義されたステータスコードを示します。例えば、MeetingEnded
というステータスが表示された場合、ユーザーは既に終了したミーティングに参加しようとした可能性があります。
⠀
Amazon Chime SDK for JavaScriptでは、TaskFailed
は、接続に失敗したりタイムアウトしたりしたときに発生する一般的なエラーコードです。詳細については、次のステップのattributes.meetingErrorMessage
を確認してください。
⠀
ステータスコードの詳細については、GitHub リポジトリ内の以下のファイルを参照してください。- Amazon Chime SDK for JavaScriptのMeetingSessionStatusCode
- Amazon Chime SDK for Android内のMeetingSessionStatusCode
- iOS用Amazon Chime SDKのMeetingSessionStatusCode
- attributes.meetingErrorMessage – ミーティングが失敗した理由を説明する完全なエラーメッセージ。この属性は、Amazon Chime SDKがアプリケーションで出力するのと同じエラーメッセージを含みます。例えば、ユーザーがタイムアウトエラーに遭遇した場合、Amazon Chime SDK for JavaScriptは、どのタスクが完了に失敗したかをウェブコンソールに記録します。
音質不良のトラブルシューティング
まずオーディオ不良のあるユーザーのmeetingFailed
またはmeetingEnded
イベントを見つける必要があります。前のセクションの手順に従って、Amazon CloudWatch ダッシュボードの Dropped attendees ウィジェットで meetingFailed
イベントのリストを検索します。Amazon Chime SDKは、ユーザーがエラーでミーティングから切断されたときにmeetingFailed
イベントをトリガーします。
ユーザーがエラーなくミーティングを終了した場合、以下の手順でmeetingEnded
イベントを見つけます。
- Dropped attendeesの上にカーソルを置き、メニューのView in CloudWatch Logs Insightsを選択します。
- ユーザーのレポートに基づいて、Amazon CloudWatch Logs Insightsの時間範囲を変更します。
- クエリエディタで、1行目を以下のコマンドで置き換えます。
attributes.attendeeId
にユーザーの出席者IDが割り当てられていることを確認します。
filter name = "meetingEnded" and attributes.attendeeId = "attendee-id"
- クエリを実行して、ユーザーのアプリケーションから発行された
meetingEnded
イベントを見つけます。
特定のミーティングイベントが見つかったら、以下のメトリック属性を確認して、ユーザーに接続の問題があったかどうかをチェックします。
- attributes.meetingStartDurationMs (Amazon Chime SDK for JavaScript のみ) – これは、
meetingStartRequested
イベントとmeetingStartSucceeded
イベントの間に経過した時間です。この属性は、参加者がミーティングに参加するまでの時間を示します。
⠀
この値を、ダッシュボードのMeeting start durationウィジェットと比較してください。
- attributes.poorConnectionCountおよびattributes.retryCount – これらの2つのメトリクスを使用して、ユーザーがミーティング中にオーディオまたはビデオの品質低下を経験した頻度を判断することができます。
また音声品質の問題をトラブルシューティングするためにミーティング履歴属性を使用することができます。
- attributes.meetingHistory –
MeetingSession
オブジェクトが作成されてからのユーザーのアクションとイベントのリストです。この記事ではミーティング履歴の最後の5分をアップロードしています。Amazon Chime SDKミーティングの接続に関連するこれらのミーティング履歴の状態を見てみましょう。
⠀
履歴のmeetingReconnected
状態はAmazon Chime SDKが接続問題のためにミーティングを再起動したことを伝えています。ネットワーク接続が悪いと通話中のオーディオ品質に影響を与える可能性があります。
⠀
Amazon Chime SDK for JavaScriptはオーディオパケットが多くドロップした場合にも、ミーティング履歴のreceivingAudioDropped
状態を発します。過度のパケットロスはオーディオ品質を低下させます。シグナリング接続が信頼できない場合は、ミーティング履歴でsignalingDropped
状態を確認できます。
マイクとカメラのセットアップの失敗を監視する
特定のユーザーからの音声が他のミーティングユーザーに聞こえない場合、次のような改善策を検討します。まずそのユーザーが音声入力をミュートにしていないことを確認します。次にアプリケーションがユーザーのローカルマシンで利用可能なマイクを選択しているかどうかを確認します。なおAmazon Chime SDK for JavaScriptでは、参加者が音声入力なしでもミーティングに参加できるようになっています。
ユーザーがまだオーディオの問題を抱えている場合は、Amazon CloudWatchダッシュボードのAudio and video input failuresウィジェットでaudioInputFailed
イベントを検索します。特定のattendee IDでaudioInputFailed
イベントをフィルタリングできます。
オーディオの問題のトラブルシューティングに使用したプロセスと同様に、videoInputFailedイベントを検査してカメラのセットアップの失敗を調べます。audioInputFailed
イベントとvideoInputFailed
イベントでは、以下の2つの属性がデバイスのエラーを特定するのに役立ちます。
- attributes.audioInputErrorMessage および attributes.videoInputErrorMessage – これらの属性を使用して、マイクやカメラの選択に失敗したときにユーザーのクライアントログに記録されるエラーメッセージを特定できます。Amazon Chime SDK for JavaScriptでは、このエラーメッセージはgetUserMedia APIエラーに記載されています。例えば、Firefoxで
NotAllowedError
が表示された場合、ユーザーがマイクの許可を拒否していることになります。NotReadableError
は、他のアプリケーションやブラウザタブが既にカメラを使用している可能性を意味します。
クリーンアップ
意図しない課金が発生しないよう作成したAWS CloudFormationスタックを削除します。
Amazon CloudWatchはメトリックの削除をサポートしていませんが、リテンション・スケジュールに基づいて削除されます。メトリクスは従量課金となるため、メトリクスの作成では課金されません。詳細についてはAmazon CloudWatch FAQを参照してください。
まとめ
この記事ではアプリケーションからAmazon CloudWatchにミーティングイベントを公開する方法を説明しました。またユーザーがセッションの失敗、音質、デバイスのセットアップの問題をトラブルシューティングする方法についても学びました。Amazon Chime SDKクライアントログと組み合わせて使用することでアプリケーションの健全性とパフォーマンスをより完全に把握することができます。
次のステップとして本記事に記載されていないミーティングイベントと属性を利用して、Amazon CloudWatchダッシュボードをカスタマイズすることをお勧めします。利用可能なイベントや属性の詳細については、以下のリンクのミーティングガイドを参照してください:Amazon Chime SDK for JavaScript、Amazon Chime SDK for Android、Amazon Chime SDK for iOS
-
AWS Media & Entertainment 参考コンテンツ
AWSのメディアチームの問い合わせ先: awsmedia@amazon.co.jp
※毎月のメルマガをはじめました。最新のニュースやイベント情報を発信していきます。購読希望は上記宛先にご連絡ください。
本ブログは、SA小林、BD山口が担当しました。原文はこちらをご覧ください。