googleapis / googleapis/google-cloud-java

Compute LRO exceptions drop structured operation error details

未关闭
#13,369 0 条评论 0 个 reaction 已指派 1 人 已被 @nnicolee 认领 在 GitHub 查看
主要语言
Java
星标
2.1k
派生
1.2k
平均合并
1 天 23 小时
30 天内合并 PR
154

描述

### 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:

```text
status: DONE
error.errors[0].code: INVALID_USAGE
error.errors[0].message: No attached disk found with device name ''
httpErrorStatusCode: 400
httpErrorMessage: BAD REQUEST
```

The thrown exception message becomes similar to:

```text
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(...)` calls `detachDiskOperationCallable().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-L2531
- `HttpJsonInstancesStub` detach disk operation snapshot uses only `response.getHttpErrorStatusCode()` and `response.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-L682
- `InstancesStubSettings` wires this into `ProtoOperationTransformers.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:

- https://github.com/googleapis/sdk-platform-java/blob/febe86f1ea4f0b5e6d8454024ed499adb7dc9328/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/ProtoOperationTransformers.java#L52-L65

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:

```text
INVALID_USAGE: No attached disk found with device name ''
```

### Actual behavior

The default exception message only includes:

```text
status = HttpJsonStatusCode{statusCode=INVALID_ARGUMENT} and message = BAD REQUEST
```

### Possible fixes

- Include `Operation.error.errors[]` in the generated Compute `OperationSnapshot` error message, where available.
- Or preserve the original Compute `Operation` error details in the gax exception / `ErrorDetails` so 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.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。