Instrumentar código de inicialização
O X-Ray SDK para Java cria segmentos para solicitações de entrada automaticamente. Desde que uma solicitação esteja dentro do escopo, você pode usar clientes instrumentados e gravar subsegmentos sem problema. Se tentar usar um cliente instrumentado no código de inicialização, você obterá um SegmentNotFoundException.
O código de inicialização é executado fora do fluxo de solicitação/resposta padrão de um aplicativo web, portanto, você precisa criar segmentos manualmente para instrumentá-lo. O Scorekeep mostra a instrumentação do código de inicialização em seus arquivos WebConfig
. O Scorekeep chama um banco de dados SQL e o Amazon SNS durante a inicialização.
A classe WebConfig
padrão cria uma assinatura do Amazon SNS para notificações. Para fornecer um segmento para o X-Ray SDK gravar quando o cliente do Amazon SNS for usado, o Scorekeep chama beginSegment
e endSegment
no gravador global.
exemplo src/main/java/scorekeep/WebConfig.java
: cliente de SDK da AWS instrumentado no código de inicialização
AWSXRay.beginSegment("Scorekeep-init");
if ( System.getenv("NOTIFICATION_EMAIL") != null ){
try { Sns.createSubscription(); }
catch (Exception e ) {
logger.warn("Failed to create subscription for email "+ System.getenv("NOTIFICATION_EMAIL"));
}
}
AWSXRay.endSegment();
Em RdsWebConfig
, que é usada pelo Scorekeep quando um banco de dados do Amazon RDS está conectado, a configuração também cria um segmento para o cliente SQL que o Hibernate usa ao aplicar o esquema do banco de dados durante a inicialização.
exemplo src/main/java/scorekeep/RdsWebConfig.java
: cliente de banco de dados SQL instrumentado no código de inicialização
@PostConstruct
public void schemaExport() {
EntityManagerFactoryImpl entityManagerFactoryImpl = (EntityManagerFactoryImpl) localContainerEntityManagerFactoryBean.getNativeEntityManagerFactory();
SessionFactoryImplementor sessionFactoryImplementor = entityManagerFactoryImpl.getSessionFactory();
StandardServiceRegistry standardServiceRegistry = sessionFactoryImplementor.getSessionFactoryOptions().getServiceRegistry();
MetadataSources metadataSources = new MetadataSources(new BootstrapServiceRegistryBuilder().build());
metadataSources.addAnnotatedClass(GameHistory.class);
MetadataImplementor metadataImplementor = (MetadataImplementor) metadataSources.buildMetadata(standardServiceRegistry);
SchemaExport schemaExport = new SchemaExport(standardServiceRegistry, metadataImplementor);
AWSXRay.beginSegment("Scorekeep-init");
schemaExport.create(true, true);
AWSXRay.endSegment();
}
SchemaExport
é executado automaticamente e usa um cliente SQL. Uma vez que o cliente é instrumentado, o Scorekeep deve substituir a implementação padrão e fornecer um segmento para o SDK usar quando o cliente for invocado.