Passar o contexto do segmento entre threads em um aplicativo multithreaded - 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á.

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 Isso garante que todas as operações assíncronas sejam executadas com o segmento correto no respectivo contexto.

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());