googleapis / googleapis/google-cloud-java

Compute LRO exceptions drop structured operation error details

オープン
#13,369 コメント 0 件 リアクション 0 件 担当者 1 名 @nnicolee が担当を希望しています GitHub で見る
主要言語
Java
スター
2.1k
フォーク
1.2k
平均マージ
1日 23時間
マージ済み PR(30日)
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 を短くまとめたダイジェスト。