統合エラーのトラブルシューティング

クラウド間    Matter

Google Cloud は、Google Cloud Monitoring を使用してプロジェクトの信頼性をモニタリングし、Google Cloud Logging エラーログを使用して問題をデバッグするためのツールを提供します。ユーザー インテントのフルフィルメントに失敗すると、Google Home アナリティクスのパイプラインがその失敗を指標に記録し、プロジェクト ログにエラーログを公開します。

エラーのトラブルシューティングは、次の 2 つの手順で行います。

  1. スマートホームの指標でプロジェクトの状態をモニタリングする。
  2. エラーログでエラーの詳しい説明を確認して問題を調査する。

Local Home SDK を使用したローカル統合の場合も手順は同様です。トラブルシューティングの手順を習得することで、指標とログを交互に見ながらエラーを簡単に分析できるようになります。

必要に応じて、他のユーザーと共有することでアクションをテストできます。エラーと例外の処理を適切に行えるようにします。

エラーをモニタリングする

Google Cloud Monitoring dashboard を使用して、プロジェクトの指標にアクセスできます。品質のモニタリングとデバッグにおいて、特に役に立つグラフをいくつか紹介します。

  • 成功率のグラフは、プロジェクトの信頼性をモニタリングする際にまず確認すべきグラフです。このグラフが急激に低下している場合、ユーザーベースの一部または全体が停止している可能性があります。このグラフを慎重にチェックし、プロジェクトに変更や更新を加えた後に異常が発生していないかを確認します。
  • 95 パーセンタイルのレイテンシのグラフは、Cloud-to-cloud インテグレーションのパフォーマンスに関する重要な指標です。このグラフが突然変動した場合、システムによるリクエストの処理が追いついていない可能性があります。予期しない動作が発生しないように、このグラフを定期的に確認することをおすすめします。
  • エラーの内訳のグラフは、統合のトラブルシューティングにおいて特に役立ちます。成功率グラフでハイライト表示されたすべてのエラーについて、その内訳とエラーコードを確認できます。Google Home platform から報告されたエラーとそのトラブルシューティングの方法については、次の表をご覧ください。

一般的なプラットフォーム エラーコード

Google Home platform によって検出された問題を特定するために、プロジェクト ログに表示される一般的なエラーコードを以下に示します。トラブルシューティング情報については、次の表をご覧ください。エラーコードの全リストについては、エラーと例外をご覧ください。

エラーコード 説明 Partner Actionable(パートナーが対応可能)
ACTION_NOT_AVAILABLE コマンドがデバイスの現在の状態に対して無効です(デバイスがオフのときに「温度を設定」するなど)。

フルフィルメントでデバイスの特性と現在の状態のロジックを確認します。
はい
AGENT_ISSUE パートナーのクラウド エージェントで一般的な問題が発生しました。

フルフィルメント ログで未処理の例外やクラッシュがないか確認します。
はい
AGENT_UNAVAILABLE_ERROR Google がパートナーのフルフィルメント URL にアクセスできませんでした。

サーバーがオンラインであること、ファイアウォールで Google がブロックされていないこと、URL が正しいことを確認します。
はい
APP_LAUNCH_FAILED ターゲット デバイスでサードパーティ製アプリを起動できませんでした。

appId と、アプリが対象のハードウェアでサポートされていることを確認します。
はい
AUTH_EXPIRED OAuth アクセス トークンの有効期限が切れており、更新できません。

更新トークンのローテーションを確認し、ユーザーがアクセスを取り消していないことを確認します。
はい
BACKEND_FAILURE_URL_TIMEOUT Google のリクエストがサービスにアクセスしようとしたときにタイムアウトしました。

サービスがオンラインで、接続を受け入れており、容量を超えていないことを確認します。また、ターゲット デバイスの電源がオンになっていて、オンラインで同期されていることを確認します。
BACKEND_FAILURE_URL_UNREACHABLE Google は、お客様のサービスから HTTP 5xx エラーコードを受け取りました。

Google Cloud Logging の requestId を使用して、スマートホーム サービスのログを確認します。
CHANNEL_SWITCH_FAILED デバイスがリクエストされたメディア チャンネルに切り替えられませんでした。

お客様のチャンネル名/番号と定期購入のステータスを確認します。
はい
CHARGER_ISSUE デバイスが充電システムのハードウェアの問題を報告します。

パートナーは、ハードウェア レベルのテレメトリーとバッテリーの健全性を調査する必要があります。
はい
CHECK_PARTNER_APP このエラーを解決するには、パートナーのアプリを開く必要があります。

複雑な UI 操作(ファームウェアの更新など)が必要なエラーには、このコードを使用します。
はい
COMMAND_FAILED コマンドの実行中に一般的なエラーが発生しました。

フルフィルメント ログで特定の requestId を確認し、根本原因を特定します。
はい
COMMAND_INSERT_FAILED Google は、デバイスのコマンドをキューに登録または処理できませんでした。

データベースの書き込みパフォーマンスまたは内部コマンド キューイング ロジックを調査します。
はい
DEVICE_NOT_FOUND リクエストのデバイス ID がパートナー側に存在しません。

ユーザーがデバイスを追加または削除したときに、クラウドが requestSync をトリガーするようにします。
はい
ERROR_STATUS レスポンスに、コードのない「ERROR」という特定できないステータスが示されました。

ユーザーの TTS とダッシュボードのデータを改善するため、常に特定の errorCode 文字列を含めます。
はい
EXECUTION_BACKEND_FAILURE_URL_ERROR Google は、フルフィルメントから HTTP 4xx エラー(401 以外)を受け取りました。

ウェブサーバーのログで 403、404、400 のレスポンスを確認します。
はい
EXECUTION_BACKEND_FAILURE_URL_ROBOTED フルフィルメント URL が robots.txt またはセキュリティ フィルタによってブロックされています。

フルフィルメント エンドポイントが Google のクローラー/サービスからアクセス可能であることを確認します。
はい
EXECUTION_BACKEND_FAILURE_URL_UNREACHABLE Google は、フルフィルメント サービスから HTTP 5xx エラーを受け取りました。

サーバーのクラッシュ、タイムアウト、502/503 ゲートウェイ エラーを調査します。
はい
EXECUTION_BAILOUT_INVALID_RESPONSE JSON レスポンスの形式が不正であるため、処理が中止されました。

JSON バリデータを使用して、レスポンスがインテント スキーマに厳密に準拠していることを確認します。
はい
EXECUTION_GAL_BAD_3P_RESPONSE トークン レスポンスの形式が無効なため、アカウントのリンクに失敗しました。

OAuth サーバーのレスポンス形式が Google の要件と一致していることを確認します。
はい
EXECUTION_GAL_INSUFFICIENT_CAPABILITIES この操作に必要な権限がユーザーのアカウントにありません。

OAuth 中にリクエストされたスコープを確認し、必要な特性と一致していることを確認します。
はい
EXECUTION_GAL_MAYBE_UNLINKED_BY_3P パートナー クラウドは、ユーザーがアカウントのリンクを解除したことを示します。

agentUserId マッピングが安定しており、パージされていないことを確認します。
はい
EXECUTION_GAL_READ_ONLY_MODE_FOR_3P 統合がパートナー側で読み取り専用状態になっています。

お客様のアカウントが停止されているか、メンテナンス モード(読み取り専用)になっているかを確認します。
はい
EXECUTION_GAL_UNLINKED_BY_3P サードパーティ サービスによってアカウントのリンクが解除された。

お客様の接続が切断された理由(セキュリティ リセットなど)を調査します。
はい
EXECUTION_INVALID_JSON JSON レスポンス ペイロードを Google が解析できませんでした。

レスポンスに構文エラー、角かっこの欠落、無効な文字がないか確認します。
はい
FAULTY_BATTERY デバイスのハードウェアが、バッテリーの故障または消耗を報告している。

TTS またはアプリを使用して、物理バッテリーを交換するようお客様に指示します。
はい
FUNCTION_NOT_SUPPORTED リクエストされたモードまたは機能はデバイスでサポートされていません。

SYNC レスポンスがデバイスの機能を正確に反映していることを確認します。
はい
HARD_ERROR 手動で介入しないと解決しない非一時的な障害。

ハードウェアの永続的な障害や、復元できないアカウントの状態の場合に使用します。
はい
INVALID_AUTH_TOKEN Google は、お客様のサービスから HTTP 401 エラーコードを受け取りました。

アクセス トークンの有効期限は切れていませんが、サービスによって無効になっています。Google Cloud Logging の requestId を使用して、スマートホーム サービスのログを確認します。
INVALID_JSON レスポンスの構造が無効です(必須フィールドがないなど)。

インテント JSON スキーマに対してレスポンスを検証します。
はい
LOCK_FAILURE スマートロックがリクエストされた状態に移行できませんでした。

ロック ハードウェアの物理的な詰まり、電力不足、モーターの故障を調査します。
はい
MALFORMED_JSON JSON 構造が壊れている(文字列やオブジェクトが閉じられていないなど)。

フルフィルメントで標準の JSON ライブラリを使用してレスポンスをシリアル化するようにします。
はい
MISSING_STATE QUERY レスポンスにリクエストされたデバイスの状態が含まれていませんでした。

SYNC で定義されているすべての特性が、すべての QUERY レスポンスで考慮されていることを確認します。
はい
NETWORK_PROFILE_NOT_RECOGNIZED リクエストされたネットワーク プロファイルがデバイスに認識されていません。

プロファイル名の文字列が SYNC レスポンスでサポートされているプロファイルと一致していることを確認します。
はい
NOT_IMPLEMENTED リクエストされたインテントまたはトレイトがパートナーによって実装されていません。

完全に実装したトレイトのみを SYNC レスポンスに含めます。
はい
OAUTH_RECONNECT_CALL_TO_ACTION ユーザーにアカウントの再リンクを求める通知をトリガーします。

ユーザーのセッションが無効になり、OAuth の手動再認証が必要な場合に使用します。
はい
OPEN_AUTH_FAILURE ユーザーのアクセス トークンの有効期限が切れていて、Google が更新できない場合、または Google がサービスから HTTP 401 エラーコードを受け取った場合。

このコードのレートが増加している場合は、スマートホーム インテントまたは更新トークン リクエストに関連するエラーのレートも増加しているかどうかを確認します。
PARTNER_RESPONSE_INVALID_ERROR_CODE 返された errorCode 文字列が、Google のサポート対象リストに含まれていません。

内部エラーを公式エラーリストにマッピングします。
はい
PARTNER_RESPONSE_INVALID_PAYLOAD レスポンスの payload フィールドが有効な JSON オブジェクトではありません。

フルフィルメント レスポンスのルート構造を確認します。
はい
PARTNER_RESPONSE_INVALID_STATUS レスポンス status が SUCCESS、ERROR、OFFLINE のいずれでもありませんでした。

レスポンス内のすべてのデバイス結果に有効なステータス文字列が含まれていることを確認します。
はい
PARTNER_RESPONSE_MISSING_COMMANDS_AND_DEVICES レスポンスに、リクエストされたすべてのコマンド/デバイスの結果が含まれていませんでした。

リクエストの commands 配列内のすべてのアイテムには、対応するレスポンス エントリが必要です。
はい
PARTNER_RESPONSE_MISSING_DEVICE Google がリクエストした特定のデバイスがレスポンスから除外されました。

レスポンスに、リクエスト ペイロードで提供されたすべての ID が含まれていることを確認します。
はい
PARTNER_RESPONSE_MISSING_PAYLOAD レスポンスに必須の payload フィールドがありません。

トップレベルの JSON オブジェクトに payload キーが含まれていることを確認します。
はい
PARTNER_RESPONSE_NOT_OBJECT レスポンス全体を JSON オブジェクトとして解析できませんでした。

HTTP レスポンスの本文に末尾の文字や JSON 以外のコンテンツがないか確認します。
はい
PROTOCOL_ERROR 基盤となる通信プロトコルでエラーが発生しました。

HTTP ヘッダーの問題または SSL/TLS handshake の失敗を調査します。
はい
RELINK_REQUIRED 統合を継続して使用するには、アカウントを再度リンクする必要があります。

更新トークンが完全に無効になったときに、サーバーがこのコードを返すようにします。
はい
REQUEST_ID_NOT_FOUND Google は、リクエストの内部トラッキング ID を検出できませんでした。

通常は内部プラットフォーム エラーです。スパイクをモニタリングし、サポートにお問い合わせください。
はい
RESOURCE_UNAVAILABLE リクエストされたリソース(デバイスまたはトレイト)は利用できません。

デバイスが「ビジー」状態であるか、一時的に無効になっているかを確認します。
はい
RESPONSE_TIMEOUT フルフィルメント サービスが 9 秒以内に応答しませんでした。

バックエンド レイテンシを最適化します。低速の DB クエリまたはリージョン ネットワークの遅延を確認します。
はい
RESPONSE_UNAVAILABLE パートナーのフルフィルメント URL から応答がありませんでした。

サービスが実行中で、エンドポイントがクラッシュしていないことを確認します。
はい
SCENE_CANNOT_BE_APPLIED リクエストされたシーンを有効にできませんでした(デバイスが見つからないなど)。

パートナー クラウドでユーザーのシーンの内部健全性を確認します。
はい
STREAM_UNPLAYABLE カメラ ストリームを開始できなかったか、失敗しました。

WebRTC/HLS シグナリングを確認し、ストリーム URL が有効であることを確認します。
はい
TIMEOUT インテントの処理中に一般的なタイムアウトが発生しました。

クラウドとデバイスハブ間の内部サービス タイムアウトのログを確認します。
はい
TRANSIENT_ERROR 一時的なエラーは、自動的に解決されるエラーです。

通常、これらのエラーはデバイスまたはサービスへの接続が切断されたときに発生します。サーバーへの新しい接続を開けない場合も同様です。
UNABLE_TO_LOCATE_DEVICE Locator トレイトを使用してデバイスが見つかりませんでした(ping が失敗したなど)。

デバイスのローカル接続(Wi-Fi/Bluetooth)を確認します。
はい
UNABLE_TO_RING_DEVICE デバイスにアクセスできましたが、着信音/アラート機能をトリガーできませんでした。

ハードウェアのアラート/スピーカーの状態と音量レベルを確認します。
はい
UNABLE_TO_SILENCE_DEVICE デバイスでアクティブなアラート/着信音を停止できませんでした。

クラウドと物理デバイス間の通信エラーを調査します。
はい
UNEXPECTED_ERROR_CHECK_DEVICE_APP 予期しないエラーが発生しました。パートナー アプリを確認してください。

Google がサポートする同等のエラーがない場合に、エラーの包括的なキャッチオールとして使用します。
はい
UNKNOWN_ERROR 追加の詳細情報が提供されていない一般的なエラー。

トラブルシューティングを改善するため、より具体的なエラーコードに置き換えることを目指します。
はい
UNLOCK_FAILURE スマートロックが「ロック解除」状態に到達できませんでした。

ハードウェアの詰まり、バッテリー残量の低下、無効な PIN の入力について調査します。
はい

検索ログ

指標を使用して統合をモニタリングできるようになったら、次は Cloud Logging を使用してエラーのトラブルシューティングを行います。エラーログには、時間、エラーコード、スマートホーム インテントの詳細などの有用な情報が、JSON によく似た形式で記録されています。

Google Cloud 内の複数のシステムから、常にプロジェクトにログが送信されます。目的のログを探すには、ログをフィルタするクエリを記述する必要があります。クエリを作成するには、「期間」、「リソース」、ログの「重大度」を指定するか、カスタム エントリを記述します。

Cloud ログをクエリする

クエリボタンを使用すると、カスタムフィルタの作成に役立ちます。

Cloud ログクエリをビルドする

「期間」を指定するには、期間選択ボタン をクリックして、いずれかのオプションを選択します。ログがフィルタされ、選択した期間に発生したログのみが表示されます。

「リソース」を指定する場合は、[リソース] プルダウンをクリックし、[Google アシスタント アクション プロジェクト] を選択します。クエリにフィルタが追加され、プロジェクトからのログのみが表示されます。

[重大度] ボタンを使用して、[緊急]、[情報]、[デバッグ] などの重大度ログレベルでフィルタします。

Logs Explorer の [クエリ] フィールドを使用してカスタム エントリを記述することもできます。このフィールドで使用するクエリエンジンは、文字列一致などの基本的なクエリと、コンパレータ(<, >=, !=)やブール演算子(AND, OR, NOT)のような高度なクエリの両方をサポートしています。

たとえば次のカスタム エントリは、LIGHT デバイスタイプで発生したエラーのみを返します。

resource.type = "assistant_action_project" AND severity = ERROR AND jsonPayload.executionLog.executionResults.actionResults.device.deviceType = "LIGHT"

ログを効果的にクエリするその他の例については、クエリ ライブラリをご覧ください。

修正をテストする

エラーを特定し、修正するアップデートを適用したら、Google Home Test Suite を使用して修正を徹底的にテストすることをおすすめします。修正のテストを効果的に行う方法については、Test Suite のユーザーガイドで詳しく説明しています。

学習用リソース

このドキュメントでは、スマートホーム アクションのエラーをトラブルシューティングする手順について説明します。デバッグの詳細については、以下の Codelab も参考にしてください。