View a markdown version of this page

Geração de subsegmentos personalizados com o X-Ray SDK for Java - AWS X-Ray

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Geração de subsegmentos personalizados com o X-Ray SDK for Java

nota

X-Ray SDK/Daemon Aviso de manutenção — Em 25 de fevereiro de 2026, AWS X-Ray SDKs/Daemon ele entrará no modo de manutenção, onde AWS limitará os lançamentos do X-Ray SDK e do Daemon para tratar apenas de problemas de segurança. Para obter mais informações sobre a linha do tempo do suporte, consulte Cronograma de suporte do X-Ray SDK e do Daemon Support. Recomendamos migrar para o. OpenTelemetry Para obter mais informações sobre como migrar para OpenTelemetry, consulte Migração da X-Ray instrumentação para a instrumentação. OpenTelemetry

Os subsegmentos estendem o segmento de um rastreamento com detalhes sobre o trabalho realizado para atender a uma solicitação. Cada vez que você faz uma chamada com um cliente instrumentado, o X-Ray SDK registra as informações geradas em um subsegmento. Você pode criar subsegmentos adicionais para agrupar outros subsegmentos, medir o desempenho de uma seção do código ou registrar anotações e metadados.

Para gerenciar subsegmentos, use os métodos beginSubsegment e endSubsegment.

exemplo GameModel.java - subsegmento personalizado
import com.amazonaws.xray.AWSXRay; ... public void saveGame(Game game) throws SessionNotFoundException { // wrap in subsegment Subsegment subsegment = AWSXRay.beginSubsegment("Save Game"); try { // check session String sessionId = game.getSession(); if (sessionModel.loadSession(sessionId) == null ) { throw new SessionNotFoundException(sessionId); } mapper.save(game); } catch (Exception e) { subsegment.addException(e); throw e; } finally { AWSXRay.endSubsegment(); } }

Neste exemplo, o código dentro do subsegmento carrega a sessão do jogo do DynamoDB com um método no modelo de sessão e usa o mapeador do DynamoDB para AWS SDK para Java salvar o jogo. O encapsulamento desse código em um subsegmento transforma as chamadas do DynamoDB em filhas do subsegmento Save Game na visualização de rastreamento no console.

Cronograma mostrando o Scorekeep e DynamoDB as operações com durações e verificações de status.

Se o código no seu subsegmento lança exceções verificadas, encapsule-o em um bloco try e chame AWSXRay.endSubsegment() em um bloco finally para garantir que o subsegmento esteja sempre fechado. Se um subsegmento não estiver fechado, o segmento principal não poderá ser concluído e não será enviado para X-Ray.

Para código que não lança exceções verificadas, você pode transmitir o código para AWSXRay.CreateSubsegment como uma função do Lambda.

exemplo Função de subsegmento do Lambda
import com.amazonaws.xray.AWSXRay; AWSXRay.createSubsegment("getMovies", (subsegment) -> { // function code });

Quando você cria um subsegmento dentro de um segmento ou outro subsegmento, o X-Ray SDK for Java gera uma ID para ele e registra a hora de início e a hora de término.

exemplo Subsegmento com metadados
"subsegments": [{ "id": "6f1605cd8a07cb70", "start_time": 1.480305974194E9, "end_time": 1.4803059742E9, "name": "Custom subsegment for UserModel.saveUser function", "metadata": { "debug": { "test": "Metadata string from UserModel.saveUser" } },

Para programação assíncrona e multiencadeada, você deve passar manualmente o subsegmento para o endSubsegment() método para garantir que ele seja fechado corretamente, pois o X-Ray contexto pode ser modificado durante a execução assíncrona. Se um subsegmento assíncrono for fechado após o fechamento do segmento pai, esse método transmitirá automaticamente o segmento inteiro para o daemon. X-Ray

exemplo Subsegmento assíncrono
@GetMapping("/api") public ResponseEntity<?> api() { CompletableFuture.runAsync(() -> { Subsegment subsegment = AWSXRay.beginSubsegment("Async Work"); try { Thread.sleep(3000); } catch (InterruptedException e) { subsegment.addException(e); throw e; } finally { AWSXRay.endSubsegment(subsegment); } }); return ResponseEntity.ok().build(); }