Compute LRO exceptions drop structured operation error details
Los mantenedores suelen responder en 1 día
@nnicolee ya está trabajando en esto.
Desde el 29/7/2026.
Evaluación
Este issue todavía no se ha evaluado.
Descripción
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.
- Lenguaje dominante
- Java
- Estrellas
- 2.1k
- Forks
- 1.2k
- Merge medio
- 2 d 14 h
- PR fusionados (30 d)
- 192
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de googleapis/google-cloud-java
-
[java-core] Timestamp.of(java.sql.Timestamp) is one second late for a time less than a second before the epochPosiblemente ocupada @Vcode2407 la tomó hace 4 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
googleapis/google-cloud-java#14636 ·
Los mantenedores suelen responder en 1 día
-
[java-firestore] UserDataConverter encodes a pre-epoch Date with negative nanos, so the write is refusedPosiblemente ocupada @wu-hui la tomó hace 23 días. Abiertopriority: p2 type: bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
googleapis/google-cloud-java#14635 · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
[java-firestore] UserDataConverter throws IndexOutOfBoundsException on an empty __binary__ valuePosiblemente ocupada @wu-hui la tomó hace 23 días. Abiertopriority: p2 type: bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
googleapis/google-cloud-java#14634 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
[java-firestore] CustomClassMapper.convertBigDecimal calls .abs() on Double, unintentionally flipping negative values to positiveQuizá libre de nuevo @wu-hui la tomó hace 45 días y no hay ningún pull request abierto. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
googleapis/google-cloud-java#14533 · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
Github CI failing when trying to install xmllintPosiblemente ocupada @blakeli0 la tomó hace 81 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
googleapis/google-cloud-java#14132 · 1 comentario ·
Los mantenedores suelen responder en 1 día
Todos los issues de googleapis/google-cloud-java
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
-
Dificultad 2/5 Menos de una hora Aptitud para principiantes 84/100
cpp-best-practices/project_validator#251 ·
Los mantenedores suelen responder en 1 día
-
backend enhancement
Dificultad 2/5 Medio día Aptitud para principiantes 70/100
damodharg6/payledger#16 ·
-
[Bug]: An initiative list with no current entry logs an error on every changePosiblemente ocupada @dwizard0 la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
Los mantenedores suelen responder en 1 día