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á.
Passar o contexto do segmento entre threads em um aplicativo multithreaded
Quando você cria um novo thread em seu aplicativo, o AWSXRayRecorder
não mantém uma referência à entidade do segmento atual ou subsegmento. Se você usar um cliente instrumentado no novo thread, o SDK tentará gravar em um segmento que não existe, causando uma. SegmentNotFoundException
Para evitar o lançamento de exceções durante o desenvolvimento, você pode configurar o gravador com um ContextMissingStrategyque solicita que ele registre um erro em vez disso. Você pode configurar a estratégia no código com SetContextMissingStrategy, ou configurar opções equivalentes com uma variável de ambiente ou propriedade do sistema.
Uma maneira de resolver o erro é usar um novo segmento chamando beginSegment quando iniciar o thread e endSegment quando fechá-lo. Isso funciona se você estiver instrumentando código que não seja executado em uma solicitação HTTP, como código que é executado quando seu aplicativo é iniciado.
Se usar vários threads para lidar com solicitações de entrada, você poderá passar o segmento ou subsegmento atual para o novo thread e fornecê-lo ao gravador global. Isso garante que as informações gravadas no novo thread sejam associadas ao mesmo segmento como o restante das informações gravadas sobre essa solicitação. Quando o segmento estiver disponível no novo thread, você poderá executar qualquer executável com acesso ao contexto desse segmento usando o método segment.run(() -> { ... })
.
Consulte Usar clientes instrumentais em threads de operador para ver um exemplo.
Usar o X-Ray com programação assíncrona
O X-Ray SDK for Java pode ser usado em programas Java assíncronos com. SegmentContextExecutors O SegmentContextExecutor implementa a interface do Executor, o que significa que ela pode ser passada para todas as operações assíncronas de um. CompletableFuture
exemplo Exemplo de App.java: Passando SegmentContextExecutor para CompletableFuture
DynamoDbAsyncClient client = DynamoDbAsyncClient.create();
AWSXRay.beginSegment();
// ...
client.getItem(request).thenComposeAsync(response -> {
// If we did not provide the segment context executor, this request would not be traced correctly.
return client.getItem(request2);
}, SegmentContextExecutors.newSegmentContextExecutor());