OTel Collector 経由で Claude Code のテレメトリを Google Cloud に送ったら一部ログが破棄された件

事象

  • ローカルの Claude Code → GLB → Cloud Run 上の OTel Collector → telemetry.googleapis.com の構成でテレメトリ送信を試した。
  • Collector のログに以下のエラーが継続的に出て、ログが破棄されていた。
    • code = InvalidArgument
    • desc = Failed to parse attribute value to int64: ... string_value: "connected" / "failed"

原因

  • Google Cloud Telemetry API は、OTLP ログの属性キー status を LogEntry.httpRequest.status(数値)にマップする予約キーとして扱う。
  • Claude Code の claude_code.mcp_server_connection イベントは仕様上 status 属性に "connected" / "failed" / "disconnected" の文字列を入れる。
  • 両者の命名が衝突し、GCP 側で数値パースに失敗 → 該当リクエストのログが丸ごと破棄されていた。

対処

  • Collector の logs パイプラインに transform プロセッサを追加し、エクスポート前に status 属性を mcp.connection.status にリネームして GCP のマッピング対象から外す。
  • 値そのものは文字列として保持されるため、Cloud Logging でも引き続き参照可能。

学び・今後の注意

  • OTel の attribute キーは自由に命名できるが、GCP Telemetry API 側に予約キー(status, latency, http.response.status_code, code.function.number など)が存在し、型解釈の衝突が起きうる。
  • OTel ドキュメントの「承認済みのタイプ: 文字列、整数」は「任意の文字列 OR 整数」ではなく「数字を表す文字列 OR 整数」の意味だった。
  • 計装側(Claude Code など)を直せない場合は、中継する Collector 側で吸収するのが現実解。
  • 新たに Failed to parse attribute value to int64 を観測したら、衝突キーを特定して同じ要領でリネームルールを追加していく。

参考