07/Documentation
durable agentのトラブルシューティング
durable agentが表示されない、またはUnreachableと表示される場合: 初動の確認事項、各原因と解決策、doctor行、発生する主なケース
実験的。 通信プロトコル、SDK、およびこのページは、今後のマイナーリリースで変更されるか、機能自体が削除される可能性があります。機能が存続するかどうかの判断基準についてはdurable agentを参照してください。
durable agentが表示されない、Unreachableと表示される、またはタップに応答しない場合、3つのコマンドで原因を特定し、原因一覧表と事例リストで解決策を確認できます。Collie全体についてはトラブルシューティングで扱っています。
最初の確認
次の3つをこの順序で実行します:
collie durable list
collie doctor
collie logs| コマンド | durable agentについて表示される内容 |
|---|---|
collie durable list | sources.jsonのエントリごとに1行ずつ、実行中のbridgeが割り当てた状態(loaded、not loaded (restart to apply)、refused (<status>)、またはbridge not answering)とともに表示されます。loadedはbridgeがエントリを読み込んだことを意味します。durable agentが応答することを意味するわけではありません。bridgeがその名前に対してHTTP 400を返す場合もnot loadedが表示されます |
collie doctor | durable agent自体に問い合わせます。durable agent向けのDoctor行の行を出力し、失敗したチェック項目と修正方法を示します |
collie logs | 各durable agentの起動行、[bridge] program "desk": durable, private socket /run/user/1000/desk/app.sock、および設定がルールに違反している場合の原因です。不正なsources.jsonの場合は[bridge] FATAL:が出力されます。読み取りに失敗した場合は、停止1回につき[state] poll failed, marking disconnected: <reason>が1回出力されます。[durable]で始まる行は、バージョンの拒絶、古いlead、破棄されたアイテム、および削除されたログを示します |
スマートフォン側の表示はより簡潔です。durable agentの行にはStartingまたはUnreachableと表示され、理由は示されません。プロトコルバージョンの拒絶には固有の表記(Version mismatch)があり、durable agentのホームに警告ボックスが表示されます。拒否されたトークンには接続バーに独自の文言が表示されます。その他のあらゆる理由はcollie doctorとcollie logsに示されます。
原因一覧
Collieがdurable agentに接続できない場合でも、Collieの他の部分はそのまま起動し、durable agentは1つの理由とともに到達不能として表示されます。
durable agentがsources.jsonのエントリである場合でも、原因には環境変数名が表示されます。COLLIE_DURABLE_SOCKETはエントリのsocket、COLLIE_DURABLE_URLはそのurl、COLLIE_DURABLE_TOKENはそのtokenと読み替えてください。エントリの修正はsources.jsonで行います。durable単体形式の修正は.envで行い、その後にcollie restartを実行します。
設定がルールに違反しています
Collieはdurable agentへ接続を試みることなくこれらを報告します。sources.jsonエントリに存在するルール違反も、ブリッジの開始時に拒否されます(sources.jsonの入力ミス)。
| 理由 | 意味と修正方法 |
|---|---|
COLLIE_DURABLE_SOCKET is not set | durable単体形式にソケットパスがありません。ソケットパスを設定するか、URLとトークンを設定してください |
COLLIE_DURABLE_SOCKET must be an absolute path | /で始まる完全なパスを指定してください |
COLLIE_DURABLE_SOCKET is longer than 103 bytes | パスを短縮してください。$XDG_RUNTIME_DIR文字未満に抑えてください |
the private socket transport is not available on Windows; set COLLIE_DURABLE_URL and COLLIE_DURABLE_TOKEN instead | Windowsはソケットトランスポートに対応していません。URLとトークンを使用してください |
COLLIE_DURABLE_SOCKET and COLLIE_DURABLE_URL are both set; set the socket, or the URL with its token, not both | durable単体形式に両方が指定されました。どちらか一方のトランスポートのみを残してください |
COLLIE_DURABLE_URL is set without COLLIE_DURABLE_TOKEN; the durable agent refuses a caller with no token | durable単体形式にURLが指定されましたが、トークンがありません。トークンを設定してください |
COLLIE_DURABLE_TOKEN is set without COLLIE_DURABLE_URL; a token is only sent to a URL | durable単体形式にトークンが指定されましたが、URLがありません。URLを設定するか、トークンを削除してください |
COLLIE_DURABLE_URL is longer than 2048 bytes | URLをdurable agentのベースアドレスに短縮してください |
COLLIE_DURABLE_URL is not a URL | https://hostの形式で記述してください |
COLLIE_DURABLE_URL must start with https:// | https://以外のスキームは拒否されます。暗号化なしのhttp://については下の別の行を参照してください |
COLLIE_DURABLE_URL uses plain http to <host>, so the token would cross the network unencrypted; use https://, or http://127.0.0.1:<port> for wrangler dev | https://を使用してください。暗号化なしのhttpはポート番号付きの127.0.0.1またはlocalhost専用です |
COLLIE_DURABLE_URL uses plain http on loopback without a port; name the port, for example http://127.0.0.1:8801 | ポート番号を追加してください |
COLLIE_DURABLE_URL must not carry a user name or password; the token goes in COLLIE_DURABLE_TOKEN | URLからユーザー名とパスワードを削除してください |
COLLIE_DURABLE_URL must not carry a query or a fragment | URLから?部分と#部分を削除してください |
COLLIE_DURABLE_URL names the durable agent's base only; leave out /session/v1, the adapter adds it | パスから/session/v1を削除してください |
COLLIE_DURABLE_TOKEN is <n> bytes; it must be at least 32 bytes, for example 64 hex characters from openssl rand -hex 32 | トークンをより長くし、durable agentにも同じトークンを設定してください |
COLLIE_DURABLE_TOKEN must be printable ASCII with no spaces | トークンから空白やその他の文字を削除してください |
COLLIE_DURABLE_TOKEN is longer than 4096 bytes | ヘッダーが長すぎます。設定ミスです。より短いトークンを使用してください |
durable agentが応答しないか、誤った応答を返します
| 理由 | 意味と修正方法 |
|---|---|
no socket at <path> | 指定されたパスに何も存在しません。durable agentを起動するか、パスを修正してください |
cannot check <path>: <message> | Collieがパスを読み取れませんでした。現在のユーザーから読み取り可能にしてください |
socket-not-private: <check> | パスの解決に失敗しました。コロン以降のテキストが該当部分を示しています。一般的な原因はプライバシーチェックに失敗しましたに記載されています |
connection refused | リッスンしているプロセスがありません。クラッシュした durable agent がソケットファイル(古いソケットファイル)を残している可能性があります。https の場合、その URL でリッスンしているプロセスがありません |
no answer within <n>ms | durable agent がハングしているか、コールド状態です。Collie はソケットで 1000 ms、https で 5000 ms 待機します |
tls refused: <message> | URL の証明書が拒否されました。Collie にはこのチェックをスキップするオプションがありません |
the host name does not resolve | URL のホスト名が間違っているか、ネットワークから到達できません |
token-refused: the durable agent answered 401 または 403 | durable agent がトークンを拒否しました。durable agent がトークンを拒否しました |
too-large | durable agent が Collie の読み取り上限を超えるデータを返しました: hello は 16 KiB、スナップショットは 4 MiB。応答サイズを小さくしてください |
incompatible: the durable agent speaks 2..3, this Collie speaks 1..1 | バージョンの対応範囲が一致しません。古い側を更新してください。collie doctor に両方の範囲が表示され、ログに範囲ごとに 1 行出力されます |
incompatible: not a durable agent | そのパスまたは URL で別のプロセスが応答しています。エントリが durable agent を指すようにしてください |
incompatible: the durable agent asks for a token | ソケット経由の durable agent がトークンを要求していますが、ソケットではトークンを渡せません。古い側を更新するか、トークンを指定して URL 経由でアクセスしてください |
unreadable hello: <detail> または unreadable snapshot: <detail> | durable agent がプロトコル上許可されていないドキュメントを送信しました。durable agent 側のログを確認してください |
the durable agent answered <status> または the durable agent answered 409 <code> | durable agent がプロトコルで想定されていないステータスを返しました。durable agent 側のログを確認してください |
starting | durable agent は稼働していますが、準備未完了を報告しているか、503 を返しています。Collie は次回のポーリングで再試行します |
durable agent向けのDoctor行
collie doctor は、bridge と同じ順序で、bridge と同じ問い合わせを各 durable agent に対して実行します。送信するのは hello のみです。
sources.json の各エントリには 6 行のブロックが 1 つ割り当てられ、desk という名前の durable agent には durable-socket:desk と出力されます。ブロックの前にある sources 行でファイルをチェックし、後ろに durable-lead 行が 1 行続きます。durable 専用の Collie は接尾辞なしで同じ 6 行を出力し、mux 行には durable, see the durable-* lines と表示されます。
| 行 | 緑 | 警告または赤 |
|---|---|---|
sources | 2 durable agents in <path>, mode 0600 | ファイルを解析できない場合は赤になります。その対処方法として、誤りを修正するまで bridge が起動しない旨が表示されます。エントリにトークンが含まれる可能性があるため、group や others による読み取りが可能な場合も赤になり、対処方法として chmod 600 が表示されます |
durable-env | パス付きの transport: private socket、または transport: https with a bearer token | 設定が 理由の一覧テーブル の規則に違反している場合は赤になります |
durable-socket | パスは自身が所有するモード 0600 のソケットであり、自身が所有するモード 0700 のフォルダ内に存在し、途中にリンクはありません | 赤になり、失敗したチェック内容(存在しない、読み取り不可、ソケットではない、シンボリックリンク、フォルダではない、別の所有者のフォルダ、誤ったモードのフォルダ、others による書き込みが可能な上位フォルダ、別の所有者のソケット、開放されたモードのソケット)が該当行に表示されます。https 経由の durable agent ではスキップされます |
durable-url | アドレス(https またはループバック http)とそのバイト長 | URL が規則に違反している場合は赤になります。ソケットの場合はスキップされます |
durable-token | set, <n> bytes。Collie が値を出力することはありません | トークンが規則に違反している場合は赤になります。ソケットの場合はスキップされます |
durable-hello | durable agent が応答しました。両方の範囲と合意したバージョン | 原因とともに赤色で表示されます。トークンの拒否、応答なし、durable agent以外からの応答、durable agentによるソケット上でのトークン要求、読み取り不能なhello、範囲の不一致などが原因です。範囲が一致しない場合は両方の範囲が表示されます。 |
durable-ready | ready、durable agentのホスト名、およびそのエポック | durable agentがまだ準備完了でないことを示す警告 |
durable-lead | リードが十分に新しいため、質問カードを表示できます | crew内を参照してください |
1つの行が失敗すると、それ以降の行は停止します。それらは理由fix the row above firstとともにスキップとして出力されます。Collieは、プライバシーチェックに失敗したソケット経由や、ルールに違反するトークンを使ってdurable agentに問い合わせることはないためです。スキップされた行は障害ではありません。
ケース一覧
各ケースでは、発生する事象、原因、解決方法を説明します。
sources.jsonの入力ミス
1つのdurable agentだけでなく、Collie自体が停止してスマートフォンから接続できなくなります。collie logsの末尾に[bridge] FATAL:、ファイルパス、エントリ、フィールドが出力されます。
bridgeは起動時にsources.jsonを読み込み、不明なフィールド、durableではないkind、ルールに違反する名前、重複した名前、socketとurlの同時指定、どちらも指定されていない構成、tokenのないurl、socketのあるtokenを検出すると停止します。ファイルを修正し、collie restartを実行してください。collie doctorのsources行にも同じメッセージが表示されます。
bridgeがエントリ名を特定できない場合(オブジェクトではない、不明なフィールドがある、または名前がルールに違反している場合)、0からカウントし、2番目のエントリにはentry 1と出力します。collie durable attachは1からカウントし、同じエントリにentry 2と出力します。どちらも対象フィールドを示します。名前が有効になると、bridgeはその名前(entry "desk")を出力します。
attachおよびdetachは、読み取れないファイルへの書き込みを行いません。入力ミスによって他のエントリが失われるのを防ぐためです。これらは終了コード1で停止します。
attach後にdurable agentが表示されない
スマートフォン上にdurable agentが表示されず、collie durable listにnot loaded (restart to apply)と表示されます。
attachとdetachはsources.jsonへの書き込みのみを行います。bridgeはこれを起動時に読み込みます。collie restartを実行するか、次回からコマンドに--restartを追加してください。再起動後もnot loadedが残る場合は、collie logsを確認してください。listでは、bridgeからのHTTP 400が404と同じ文面で表示されます。
プライバシーチェックに失敗しました
socket-not-private: the socket's folder /tmp/hello has mode 0755, not 0700が表示され、doctorの行durable-socketが赤くなります。
Collieは、パス全体がプライベートな場合にのみソケットに接続します。主な原因は、モードが0755のフォルダ、/tmpなどの共有フォルダ直下にあるソケット、パス内のシンボリックリンクです。シンボリックリンクは見落としがちです。多くのLinux環境で/var/runは/runにリンクしているため、/var/run/で始まるパスは/var/run is a symlinkで失敗します。実パスを使用してください。
ソケットが存在するフォルダに対してchmod 700を実行するか、ソケットを$XDG_RUNTIME_DIR以下に移動してください。ルールはdurable agentのセキュリティに記載されています。SDKで作成されたdurable agentは、モードが0700ではない既存フォルダでは起動を拒否し、その旨を自身で出力します。
古いソケットファイル
ソケット上にconnection refusedと表示され、ファイルは存在しています。
クラッシュしたdurable agentはソケットファイルを残しますが、そのソケットをリッスンするプロセスはありません。durable agentを再起動してください。SDKはリッスンを開始する前に不要なソケットファイルを削除し、ソケットが稼働中の場合はanother instance is already listeningで停止します。durable agentがファイルを削除しない場合にのみ、手動でファイルを削除してください。
ターミナルセッションと重複する名前
bridgeが起動時にthe name is the terminal session's own; pick anotherで停止するか、スマートフォン上にターミナルセッションが表示されません。
durable agentには、Collieの実行元ターミナルと同じ名前を付けることはできません。多くのインストール環境でその名前はdefaultであり、durable専用のCollieではdefaultがそのdurable agentの名前になります。bridgeは起動時に停止し、該当エントリ名を出力します。Herdrセッションがdurable agentと同じ名前を持つ場合も同様です。durable agentがその名前を保持し、スマートフォンには該当セッションが表示されず、ログに一度出力されます。どちらかの名前を変更してください。
durable-readyの警告が消えない
collie doctorを実行するたびにdurable-readyが警告として表示されます。
durable agentがhelloと応答し、ready: falseと出力します。スマートフォン上では「Starting」と表示されます。durable agentは、会話を展開し、未解決の質問を再提示した後にのみ準備完了状態になります。何が待機されているかについては、durable agent自身のログを確認してください。
子孫プロセスのチェックでdurable agentが起動時に停止する
durable agentが起動時にthe descendant check needs Bun on Linux to read the peer of a socket; pass callerCheck: "off" to run without itで停止します。
このチェックにはLinux上のBunが必要です。macOSではNodeでdurable agentを実行するか、openCollieにcallerCheck: "off"を渡して事前にこのチェックが保護する対象を確認してください。このエラーはdurable agent側から発生しており、Collieは関与していません。
再起動後に質問が再度表示される
durable agentの再起動後に同じ質問が再度表示されるか、すでに回答済みと書かれたカードが表示されます。
再起動前の質問に対する回答は too-late を受け取り、カードはその旨を表示して消えます。ツール呼び出しから質問IDを生成するdurable agentは同じ質問を再提示するため、再起動を挟んで送信された回答が適用され、ツールが1回実行されます。毎回新しいIDを生成するdurable agentは、同じツール呼び出しに対して新しい質問を作成します。カードにはそれが表示され、プッシュガードがツール呼び出しをキーとするため、Collieは2回目のプッシュを送信しません。このガードはまた、会話ごとに毎分3回、ホストごとに毎分10回、ホストごとに毎時30回のプッシュを許可します。1時間の中で31回目となるプッシュはそのホストへの1件の要約プッシュとなり、そのホストはその後1時間が経過するまでプッシュを送信しません。カードは常に表示されます。
403 caller-refused
回答またはメッセージが拒否されたと電話機に表示され、durable agentの理由は 403 caller-refused です。
durable agentの子孫プロセス確認により呼び出し元が拒否されました。この確認は、durable agent自体、durable agentが起動したプロセス、およびそれらと区別できない呼び出し元を拒否します。durable agentまたはそれが実行したツールがCollieプロセスを起動し、そのプロセスがまだ子プロセスである場合、Collieはdurable agent側とみなされます。durable agentの外部からCollieを起動してから、やり直してください。
「やり直す」、および適用された可能性がある回答
「回答が届いたか不明です」と「やり直す」ボタンが表示され、タップ後に「すでに適用されている可能性があります。チャットを確認してください。」と表示されます。
回答送信後のタイムアウト、接続切断、または5xxエラーは、回答が届いた可能性があることを意味します。「やり直す」は同じリクエストIDを送信するため、durable agentは replayed と応答し、質問を2回解決することはありません。質問がすでに閉じられている場合、最初の試行で閉じられた可能性があるため、電話機にはチャットを確認するよう表示されます。送信、停止、ボタンタップもそれぞれの文言で同様のことを示します。
durable agent がトークンを拒否しました
接続バーに「durable agentがトークンを拒否しました。このピアのCOLLIE_DURABLE_TOKENを確認してください。」と表示され、理由は token-refused です。
durable agentがトークンに対して401または403を返しました。最も一般的な原因は、一方のトークンが先に変更されたローテーションです。電話機の文言は sources.json のエントリであっても COLLIE_DURABLE_TOKEN と表記します。そのエントリの token と読み替えてください。Collieを再起動する前に、新しいトークンをdurable agentに渡してください。トークン にローテーションの手順があります。403は、durable agentの前面にあるアクセスプロキシが原因である場合もあります。
2回の読み取りを経てUnreachableへ切り替わる
durable agentの読み取りが1回失敗してもReadyのまま維持され、その後Unreachableに切り替わります。
成功した読み取りの後に1回失敗した場合、そのポーリングでは直前のレイアウトが維持されます。2回連続で失敗すると、durable agentが切り替わります。拒否されたトークンも同じルールに従います。プライバシーチェックに失敗したソケットパスが唯一の例外で、即座に表示されます。
https経由では、ダウンしているかトークンを拒否したdurable agentへの問い合わせは最大で10秒に1回です。各試行が課金対象のリクエストとなるためです。ソケット経由では、ダウンしているdurable agentの2回の読み取り間の最小間隔は250ミリ秒です。
crew内
crewのメンバー上のdurable agentはリードの電話機に表示されるため、リードはdurable agentが何であるかを認識している必要があります。
1.21.0より前のリードは、質問カードなしでdurable agentの会話を一覧表示し、そのTerminalタブはターミナルのない会話をポーリングします。メンバー側ではこれを修正できません。メンバー自身がその旨を示します。collie doctor が durable-lead 内で警告し、ログには検出したリリースごとに1行、[durable] the lead is 1.20.1; it shows durable panes without the question card and its Terminal tab polls; update the lead が記録されます。リードを更新してください。
durable-lead | 表示内容 |
|---|---|
| スキップ、crewなし | このマシンはcrewに含まれていないため、リードは存在しません |
| スキップ、リード | このマシンはリードであり、自身のペインを表示します |
| スキップ、リリースなし | リードがリリースを明示しませんでした: 開発ビルド、更新の処理中、またはブリッジ起動後に呼び出しがありません |
| 警告 | リードは1.21.0未満のリリースを実行しています |
| 緑 | リードは1.21.0以降です |
リードより古いメンバーには逆の問題があります。電話機に「このマシンは古いCollieを実行しているため、ここでは回答を受け取れません。更新するか、durable agent内で回答してください。」と表示されます。そのメンバーを更新してください。