Compute LRO exceptions drop structured operation error details
維護者通常 1 天內回覆
@nnicolee 已經在處理了。
開始於 2026年7月29日。
評估
這個 Issue 還沒有評估資料。
描述
Description
When a Compute Engine long-running operation completes with status: DONE and an operation-level error, the Java client exception produced by OperationFuture.get() appears to keep only httpErrorStatusCode / httpErrorMessage in the exception message. Structured details under operation.error.errors[] are not included, which can discard the actionable provider error.
Example operation payload shape:
status: DONE
error.errors[0].code: INVALID_USAGE
error.errors[0].message: No attached disk found with device name '<deviceName>'
httpErrorStatusCode: 400
httpErrorMessage: BAD REQUEST
The thrown exception message becomes similar to:
com.google.api.gax.rpc.InvalidArgumentException: Operation with name "..." failed with status = HttpJsonStatusCode{statusCode=INVALID_ARGUMENT} and message = BAD REQUEST
The important detail INVALID_USAGE: No attached disk found with device name ... is not present in the exception message.
Why this matters
For Compute operations such as InstancesClient.detachDiskAsync(...).get(), BAD REQUEST / INVALID_ARGUMENT is too generic for operators and applications to distinguish idempotent conditions from real invalid input. The structured operation error contains the actionable reason, but it is not surfaced by the default exception path.
Code path observed
Current generated Compute client code seems to build the REST LRO snapshot from only the HTTP error status/message:
InstancesClient.detachDiskAsync(...)callsdetachDiskOperationCallable().futureCall(request):
https://github.com/googleapis/google-cloud-java/blob/58e50fc35625f8364e99516235c887442f0958af/java-compute/google-cloud-compute/src/main/java/com/google/cloud/compute/v1/InstancesClient.java#L2489-L2531HttpJsonInstancesStubdetach disk operation snapshot uses onlyresponse.getHttpErrorStatusCode()andresponse.getHttpErrorMessage():
https://github.com/googleapis/google-cloud-java/blob/58e50fc35625f8364e99516235c887442f0958af/java-compute/google-cloud-compute/src/main/java/com/google/cloud/compute/v1/stub/HttpJsonInstancesStub.java#L671-L682InstancesStubSettingswires this intoProtoOperationTransformers.ResponseTransformer.create(Operation.class):
https://github.com/googleapis/google-cloud-java/blob/58e50fc35625f8364e99516235c887442f0958af/java-compute/google-cloud-compute/src/main/java/com/google/cloud/compute/v1/stub/InstancesStubSettings.java#L2294-L2305
In gax, the response transformer creates the exception message from operationSnapshot.getErrorCode() and operationSnapshot.getErrorMessage() only:
HTTP 400 is then mapped to INVALID_ARGUMENT, and ApiExceptionFactory maps that to InvalidArgumentException:
- https://github.com/googleapis/sdk-platform-java/blob/febe86f1ea4f0b5e6d8454024ed499adb7dc9328/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonStatusCode.java#L96-L103
- https://github.com/googleapis/sdk-platform-java/blob/febe86f1ea4f0b5e6d8454024ed499adb7dc9328/gax-java/gax/src/main/java/com/google/api/gax/rpc/ApiExceptionFactory.java#L44-L53
Expected behavior
When the operation response contains structured error details, the thrown exception should expose or preserve them. For example, the exception message or an accessible error detail field should include something like:
INVALID_USAGE: No attached disk found with device name '<deviceName>'
Actual behavior
The default exception message only includes:
status = HttpJsonStatusCode{statusCode=INVALID_ARGUMENT} and message = BAD REQUEST
Possible fixes
- Include
Operation.error.errors[]in the generated ComputeOperationSnapshoterror message, where available. - Or preserve the original Compute
Operationerror details in the gax exception /ErrorDetailsso callers can inspect them programmatically. - Or provide documented guidance for retrieving the full failed operation response after
OperationFuture.get()throws.
If this belongs in googleapis/sdk-platform-java instead of this generated client repo, please redirect or transfer. The generated Compute client appears to be where the Compute-specific Operation.error.errors[] data is first collapsed into generic HTTP status/message.
- 主要語言
- Java
- 星號
- 2.1k
- 分支
- 1.2k
- 平均合併
- 2 天 14 小時
- 30 天內合併 PR
- 192
環境準備
- 沒有 Dockerfile 或 Docker Compose 檔案
- 沒有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
googleapis/google-cloud-java 的其他 Issue
-
[java-core] Timestamp.of(java.sql.Timestamp) is one second late for a time less than a second before the epoch可能已有人在做 @Vcode2407 於 4 天前認領。 未關閉
難度 2/5 1-3 小時 新手友好度 78/100
googleapis/google-cloud-java#14636 ·
維護者通常 1 天內回覆
-
[java-firestore] UserDataConverter encodes a pre-epoch Date with negative nanos, so the write is refused可能已有人在做 @wu-hui 於 23 天前認領。 未關閉priority: p2 type: bug
難度 2/5 1-3 小時 新手友好度 75/100
googleapis/google-cloud-java#14635 · 已指派 1 人 ·
維護者通常 1 天內回覆
-
[java-firestore] UserDataConverter throws IndexOutOfBoundsException on an empty __binary__ value可能已有人在做 @wu-hui 於 23 天前認領。 未關閉priority: p2 type: bug
難度 2/5 1-3 小時 新手友好度 74/100
googleapis/google-cloud-java#14634 · 1 則留言 · 已指派 1 人 ·
維護者通常 1 天內回覆
-
[java-firestore] CustomClassMapper.convertBigDecimal calls .abs() on Double, unintentionally flipping negative values to positive可能重新可做 @wu-hui 於 45 天前認領,目前沒有進行中的 PR。 未關閉
難度 2/5 1-3 小時 新手友好度 85/100
googleapis/google-cloud-java#14533 · 已指派 1 人 ·
維護者通常 1 天內回覆
-
Github CI failing when trying to install xmllint可能已有人在做 @blakeli0 於 81 天前認領。 未關閉
難度 2/5 1-3 小時 新手友好度 65/100
googleapis/google-cloud-java#14132 · 1 則留言 ·
維護者通常 1 天內回覆
查看 googleapis/google-cloud-java 的全部 Issue
相似的 Issue
-
bug
難度 2/5 1-3 小時 新手友好度 72/100
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 72/100
FasterXML/jackson-databind#6443 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 80/100
finos/fluxnova-bpm-platform#387 ·
維護者通常 4 天內回覆
-
難度 1/5 1 小時以內 新手友好度 88/100
-
難度 2/5 1 小時以內 新手友好度 84/100
cpp-best-practices/project_validator#251 ·
維護者通常 1 天內回覆