Experimente estes tutoriais Java para ver o que a plataforma New Relic pode fazer com seus dados OTLP. Temos três tutoriais para você escolher, cada um usando o mesmo aplicativo Spring de demonstração. O aplicativo irá calcular o enésimo número na sequência de Fibonacci e gerar rastreamento, métrica e log.
Ao trabalhar com esses tutoriais, você pode aprender habilidades para ajudá-lo a configurar seu próprio aplicativo com OpenTelemetry e New Relic.
Depois de concluir qualquer um desses tutoriais, você poderá visualizar as métricas da JVM em gráficos como estes.
Requisitos
Para começar, certifique-se de ter o seguinte:
- Uma conta New Relic: Cadastre-se para obter uma conta gratuita se ainda não tiver uma.
- Java 17 ou superior: se você ainda não o possui, consulte estas opções de download.
Tutoriais
Embora cada tutorial use o mesmo aplicativo de demonstração, eles têm abordagens diferentes para ajudá-lo a se familiarizar com o OpenTelemetry e o New Relic.
- Aplicativo de pré-instrumento: Execute nosso aplicativo de demonstração de pré-instrumento para ver rapidamente os dados em nossa interface.
- OpenTelemetry agente Java: monitor nosso aplicativo de demonstração com o agente OpenTelemetry Java.
- Configuração manual: instrumento nosso aplicativo de demonstração manualmente.
Clique na guia abaixo do tutorial que deseja concluir.
Dica
Ao usar o OpenTelemetry, você terá duas opções para exportar dados do seu aplicativo para o New Relic via OTLP:
Diretamente do seu aplicativo para o New Relic
Seu aplicativo envia dados para um coletor OpenTelemetry, onde são exportados para o New Relic
Esses tutoriais cobrem a primeira opção. Se você deseja exportar seus dados por meio de um coletor, consulte a documentação do coletor para obter detalhes.
Execute o aplicativo de demonstração pré-instrumento
Esta é uma ótima opção se você deseja que façamos a instrumentação para que possa ver rapidamente como é enviar dados para o New Relic e visualizá-los em nossa interface.
Em seu terminal, execute o seguinte para clonar o aplicativo de demonstração e navegue até o diretório
java
dos Guias de primeiros passos.bash$git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git$cd newrelic-opentelemetry-examples/getting-started-guides/javaDefina estas duas variáveis de ambiente para enviar dados para sua conta New Relic:
Certifique-se de usar seu .
Se a região do seu data center New Relic for a UE e não os EUA, defina o endpoint como:
https://otlp.eu01.nr-data.net
OTEL_EXPORTER_OTLP_HEADERS=api-key=INSERT_YOUR_NEW_RELIC_LICENSE_KEY
OTEL_EXPORTER_OTLP_ENDPOINT=https://otlp.nr-data.net
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
Defina a primeira variável de ambiente abaixo para nomear o serviço, depois defina a segunda para o ID da instância do serviço, que ativa determinado recurso da plataforma. Por fim, habilite os logs, já que o log está desativado por padrão:
OTEL_SERVICE_NAME=getting-started-java
OTEL_RESOURCE_ATTRIBUTES=service.instance.id=INSERT_YOUR_ID_HERE
- Substitua
INSERT_YOUR_OWN_ID_HERE
por um ID de instância exclusivo. Por exemplo, você poderia usar 1234.
- Substitua
OTEL_LOGS_EXPORTER=otlp
No mesmo diretório
getting-started-guides/java
, crie e execute o aplicativo:Mac OS:
bash$./gradlew bootRunPowerShell:
bash$.\gradlew.bat build
Abra uma nova guia do terminal, alterne para o diretório
getting-started-guides/java/Instrumented
e execute o seguinte comando para gerar tráfego para o aplicativo:Mac OS:
bash$./load-generator.shPowerShell:
bash$.\load-generator.ps1
Dica
Alternativamente, você pode acessar o endpoint no browser neste URL:
http://localhost:8080/fibonacci?n=INSERT_A_VALUE
. SubstituaINSERT_A_VALUE
por um valor de 1 a 90. Para gerar um erro, insira um número inteiro fora do intervalo válido.Vá para one.newrelic.com > All capabilities > APM & services.
Clique na sua nova entidade (serviço) chamada
getting-started-java
e explore a interface. Para obter mais dicas sobre o que procurar na interface, consulte Visualizar seus dados no New Relic.Quando terminar de visualizar seus dados na interface, encerre o aplicativo pressionando CONTROL+C em ambas as sessões do terminal.
Monitor o aplicativo de demonstração com o agente OpenTelemetry Java
Aqui está um tutorial diferente que também usa o mesmo aplicativo de demonstração. Nesse caso, você usará o agente OpenTelemetry Java para monitor automaticamente o aplicativo de demonstração. Você não precisa modificar o código-fonte Java. Ao usar o agente, você pode começar rapidamente a exportar dados de amostra para o New Relic.
O agente de instrumentação automática é um arquivo JAR que injeta bytecode dinamicamente para capturar telemetria de bibliotecas e estruturas populares. Você também pode usá-lo para capturar dados como solicitações de entrada, chamadas HTTP de saída e chamadas de banco de dados. Ele pode ser anexado a qualquer aplicativo Java 8+.
Dica
Consulte a documentação oficial do agente Java para opções de configuração adicionais.
Para monitor nosso aplicativo de demonstração com o agente OpenTelemetry Java:
Faça download do arquivo JAR do agente, que contém a biblioteca de agente e instrumentação. Coloque-o no diretório de sua preferência e anote o caminho que você usará posteriormente.
Caso ainda não tenha feito isso, baixe o repositório do aplicativo de demonstração e mude para o seguinte diretório:
bash$git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git$cd newrelic-opentelemetry-examples/getting-started-guides/javaCrie o aplicativo de demonstração com este comando:
Mac OS:
bash$./gradlew buildPowerShell:
bash$.\gradlew.bat buildDica
Após uma compilação bem-sucedida, você encontrará o arquivo JAR do aplicativo resultante em
Uninstrumented/build/libs
, chamadouninstrumented.jar
.
Vá para nossa seção de referência de variáveis de ambiente abaixo para ver quais variáveis você precisa exportar e depois retorne a estas etapas.
Continue em
getting-started-guides/java/Uninstrumented
para lançar o agente com o aplicativo:Importante
Substitua
path/to
pelo local do arquivo JAR que você baixou anteriormente.bash$java -javaagent:path/to/opentelemetry-javaagent.jar \>-jar ./build/libs/uninstrumented.jarGere tráfego para o aplicativo abrindo um novo terminal no diretório
getting-started-guides/java/Uninstrumented
e executando o gerador de carga:Mac OS:
bash$./load-generator.shPowerShell:
bash$.\load-generator.ps1
Dica
Alternativamente, você pode acessar o endpoint no browser neste URL:
http://localhost:8080/fibonacci?n=INSERT_A_VALUE
. SubstituaINSERT_A_VALUE
por um valor de 1 a 90. Para gerar um erro, insira um número inteiro fora do intervalo válido.Agora que você enviou alguns dados para o New Relic, veja nossas instruções sobre como visualizar os dados na interface.
Quando terminar de visualizar seus dados na interface, encerre o aplicativo pressionando CONTROL+C em ambas as sessões do terminal.
Configure o aplicativo de demonstração manualmente
O tutorial anterior ajudou você a explorar a instrumentação automática com o agente OpenTelemetry Java. Este tutorial mostrará como usar instrumentação personalizada para ter mais controle sobre a telemetria coletada. Você inserirá manualmente a instrumentação em nosso aplicativo de demonstração para capturar telemetria e, em seguida, configurará o SDK para exportar esses dados para o New Relic.
Dica
Embora você possa configurar manualmente o SDK, mostraremos como configurá-lo usando a opção autoconfigure, que simplifica o processo usando variáveis de ambiente e propriedades do sistema.
Baixe o aplicativo de demonstração
Se você ainda não baixou nosso aplicativo de demonstração, execute o seguinte:
$git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git
Instalar dependência
Para adicionar dependência:
Vá para o diretório do aplicativo.
bash$cd newrelic-opentelemetry-examples/getting-started-guides/java/uninstrumentedAbra
build.gradle
.Adicione os seguintes itens destacados ao bloco
dependencies
(talvez seja necessário rolar para baixo dentro do bloco de código):plugins {id 'org.springframework.boot' version '2.7.5'id 'io.spring.dependency-management' version '1.1.0'id 'java'}java {toolchain {languageVersion = JavaLanguageVersion.of(17)}}repositories {mavenCentral()}bootRun {mainClass.set 'com.example.demo.Application'}configurations.all {exclude module: 'spring-boot-starter-logging'}dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'implementation 'org.springframework.boot:spring-boot-starter-log4j2'// OpenTelemetry coreimplementation platform('io.opentelemetry:opentelemetry-bom:1.22.0')implementation platform('io.opentelemetry:opentelemetry-bom-alpha:1.22.0-alpha')implementation 'io.opentelemetry:opentelemetry-api'implementation 'io.opentelemetry:opentelemetry-sdk'implementation 'io.opentelemetry:opentelemetry-exporter-otlp'implementation 'io.opentelemetry:opentelemetry-exporter-otlp-logs'implementation 'io.opentelemetry:opentelemetry-sdk-extension-autoconfigure'// OpenTelemetry instrumentationimplementation platform('io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:1.22.1-alpha')implementation 'io.opentelemetry.instrumentation:opentelemetry-runtime-metrics'implementation 'io.opentelemetry.instrumentation:opentelemetry-log4j-appender-2.17'implementation 'io.opentelemetry.instrumentation:opentelemetry-spring-webmvc-6.0'}Notas:
- A dependência
bom
(lista de materiais) é usada para sincronizar versões de dependência para um ecossistema específico. Como o OpenTelemetry publica muitos componentes Java, eles ajudam a garantir que todas as versões sejam sincronizadas, quer você use apenas algumas ou muitas delas. - As dependências restantes fornecem acesso ao SDK, API, exportador OTLP e biblioteca de instrumentação.
- Há uma configuração adicional para excluir o módulo spring-boot-starter-logging. Isso evita uma mensagem de erro de compilação relacionada a
log4j-slf4j-impl cannot be present with log4j-to-slf4j
.
Configure o SDK com a extensão autoconfigure
Embora você possa configurar o SDK manualmente, recomendamos usar a extensão autoconfigure, pois ela agiliza o processo.
Vá para o diretório do código-fonte do aplicativo:
bash$cd newrelic-opentelemetry-examples/getting-started-guides/java/uninstrumented/src/main/java/com/example/demoAbra
Application.java
.Insira as linhas destacadas:
@SpringBootApplicationpublic class Application {private static volatile OpenTelemetry openTelemetry = OpenTelemetry.noop();public static void main(String[] args) {// Build the SDK auto-configuration extension moduleOpenTelemetrySdk openTelemetrySdk = AutoConfiguredOpenTelemetrySdk.builder().setResultAsGlobal(false).build().getOpenTelemetrySdk();Application.openTelemetry = openTelemetrySdk;SpringApplication.run(Application.class, args);}@Beanpublic OpenTelemetry openTelemetry() {return openTelemetry;}}Vá para nossa seção de referência de variáveis de ambiente abaixo para ver quais variáveis você precisa exportar e depois retorne a estas etapas.
Adicionar biblioteca de instrumentação: trace
Em Application.java
, adicione a instrumentação destacada para Spring Web MVC registrando um filtro de rastreamento:
@SpringBootApplicationpublic class Application {
private static volatile OpenTelemetry openTelemetry = OpenTelemetry.noop();
public static void main(String[] args) { // Build the SDK auto-configuration extension module OpenTelemetrySdk openTelemetrySdk = AutoConfiguredOpenTelemetrySdk.builder() .setResultAsGlobal(false) .build() .getOpenTelemetrySdk(); Application.openTelemetry = openTelemetrySdk;
SpringApplication.run(Application.class, args); }
@Bean public OpenTelemetry openTelemetry() { return openTelemetry; }
// Add Spring WebMVC instrumentation by registering a tracing filter @Bean public Filter webMvcTracingFilter(OpenTelemetry openTelemetry) { return SpringWebMvcTelemetry.create(openTelemetry).createServletFilter(); }}
Adicionar biblioteca de instrumentação: métrica
Gere e colete métricas sobre seu tempo de execução Java registrando o seguinte no arquivo Application.java
. Insira as linhas destacadas abaixo:
@SpringBootApplicationpublic class Application {
private static volatile OpenTelemetry openTelemetry = OpenTelemetry.noop();
public static void main(String[] args) { // Build the SDK auto-configuration extension module OpenTelemetrySdk openTelemetrySdk = AutoConfiguredOpenTelemetrySdk.builder() .setResultAsGlobal(false) .build() .getOpenTelemetrySdk(); Application.openTelemetry = openTelemetrySdk;
// Register runtime metrics instrumentation BufferPools.registerObservers(openTelemetrySdk); Classes.registerObservers(openTelemetrySdk); Cpu.registerObservers(openTelemetrySdk); GarbageCollector.registerObservers(openTelemetrySdk); MemoryPools.registerObservers(openTelemetrySdk); Threads.registerObservers(openTelemetrySdk);
SpringApplication.run(Application.class, args); }
@Bean public OpenTelemetry openTelemetry() { return openTelemetry; }
// Add Spring WebMVC instrumentation by registering a tracing filter @Bean public Filter webMvcTracingFilter(OpenTelemetry openTelemetry) { return SpringWebMvcTelemetry.create(openTelemetry).createServletFilter(); }}
Adicionar biblioteca de instrumentação: log
Este aplicativo de demonstração está configurado para usar o OpenTelemetryAppender
(via log4j.xml
), que usa GlobalLoggerProvider
. A configuração de GlobalLoggerProvider
conecta o OpenTelemetryAppender
ao SDK log que é configurado usando autoconfigure aqui:
Abra
Application.java
.Insira as seguintes linhas destacadas.
@SpringBootApplicationpublic class Application {private static volatile OpenTelemetry openTelemetry = OpenTelemetry.noop();public static void main(String[] args) {// Build the SDK auto-configuration extension moduleOpenTelemetrySdk openTelemetrySdk = AutoConfiguredOpenTelemetrySdk.builder().setResultAsGlobal(false).build().getOpenTelemetrySdk();Application.openTelemetry = openTelemetrySdk;// Set GlobalLoggerProvider, which is used by Log4j2 appenderGlobalLoggerProvider.set(openTelemetrySdk.getSdkLoggerProvider());// Register runtime metrics instrumentationBufferPools.registerObservers(openTelemetrySdk);Classes.registerObservers(openTelemetrySdk);Cpu.registerObservers(openTelemetrySdk);GarbageCollector.registerObservers(openTelemetrySdk);MemoryPools.registerObservers(openTelemetrySdk);Threads.registerObservers(openTelemetrySdk);SpringApplication.run(Application.class, args);}@Beanpublic OpenTelemetry openTelemetry() {return openTelemetry;}// Add Spring WebMVC instrumentation by registering a tracing filter@Beanpublic Filter webMvcTracingFilter(OpenTelemetry openTelemetry) {return SpringWebMvcTelemetry.create(openTelemetry).createServletFilter();}}Crie um diretório chamado
resources
emUninstrumented/src/main
.Neste novo diretório, crie um arquivo chamado
log4j2.xml
com o seguinte conteúdo:<?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN" packages="io.opentelemetry.instrumentation.log4j.appender.v2_17"><Appenders><Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true"><PatternLayout pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><OpenTelemetry name="OpenTelemetryAppender" /></Appenders><Loggers><Root level="info"><AppenderRef ref="OpenTelemetryAppender" /><AppenderRef ref="ConsoleAppender" /></Root></Loggers></Configuration>Dica
A seção
packages=...
desta linha permite que o Log4J encontre e configure oOpenTelemetryAppender
. O código-fonte está no repositório OpenTelemetry e foi adicionado como uma dependência viaio.opentelemetry.instrumentation:opentelemetry-log4j-appender-2.17
)
Instrumentação trace customizada: Criar constantes de atributo de span
Cada trace é composto por spans, que representam uma unidade lógica de trabalho ou uma operação dentro de uma solicitação específica. O código abaixo demonstra:
Constantes estáticas para armazenar chaves de atributo que podem ser usadas para fornecer insights em nível de solicitação em seus períodos
Como inicializar um Tracer, que cria spans
Insira as seguintes linhas destacadas em
Controller.java
:@RestControllerpublic class Controller {// Attribute constantsprivate static final AttributeKey<Long> ATTR_N = AttributeKey.longKey("fibonacci.n");private static final AttributeKey<Long> ATTR_RESULT = AttributeKey.longKey("fibonacci.result");private final Tracer tracer;@AutowiredController(OpenTelemetry openTelemetry) {// Initialize tracertracer = openTelemetry.getTracer(Controller.class.getName());}@GetMapping(value = "/fibonacci"). . .}
Instrumentação trace customizada: Crie um intervalo customizado
Você pode criar os spans que desejar e cabe a você anotar seus spans com atributos em operações específicas. O atributo definido fornecerá contexto adicional sobre a operação específica que você está acompanhando, como resultados ou propriedades da operação.
Em
Controller.java
, insira essas linhas destacadas para iniciar um novo intervalo chamadofibonacci
que faz o seguinte:- Captura dados sobre a execução deste método
- Define um atributo que armazena o valor de n da solicitação do usuário
private long fibonacci(long n) {// Start a new span and set your first attributevar span = tracer.spanBuilder("fibonacci").setAttribute(ATTR_N, n).startSpan();. . .}Adicione detalhes granulares ao seu código adicionando um atributo ao seu intervalo para armazenar informações sobre solicitações bem-sucedidas:
private long fibonacci(long n) {// Start a new span and set your first attributevar span = tracer.spanBuilder("fibonacci").setAttribute(ATTR_N, n).startSpan();try {if (n < 1 || n > 90) {throw new IllegalArgumentException("n must be 1 <= n <= 90.");}long result = 1;if (n > 2) {long a = 0;long b = 1;for (long i = 1; i < n; i++) {result = a + b;a = b;b = result;}// Set a span attribute to capture information about successful requestsspan.setAttribute(ATTR_RESULT, last);return last;} catch (IllegalArgumentException e) {throw e;}}
Instrumentação trace customizada: Registrar uma exceção
Você pode querer registrar as exceções à medida que elas acontecem. Recomendamos que você faça isso em conjunto com a configuração do status do intervalo. Primeiro, defina seu intervalo como o intervalo atual, defina o código de status como erro no caso de uma exceção e, em seguida, encerre o intervalo:
private long fibonacci(long n) { // Start a new span and set your first attribute var span = tracer.spanBuilder("fibonacci").setAttribute(ATTR_N, n).startSpan();
// Set the span as the current span try (var scope = span.makeCurrent()) { if (n < 1 || n > 90) { throw new IllegalArgumentException("n must be 1 <= n <= 90."); }
long result = 1; if (n > 2) { long a = 0; long b = 1;
for (long i = 1; i < n; i++) { result = a + b; a = b; b = result; } } // Set a span attribute to capture information about successful requests span.setAttribute(ATTR_RESULT, result); return result; } catch (IllegalArgumentException e) { // Record the exception and set the span status span.recordException(e).setStatus(StatusCode.ERROR, e.getMessage()); throw e; } finally { // End the span span.end(); }}
Este método gera um IllegalArgumentException
se um usuário fornecer uma entrada inválida. Quando isso acontece, a exceção é registrada como um evento no intervalo e o status do intervalo será definido como ERROR
. A mensagem de exceção é capturada como a descrição do status. A exceção será registrada como um evento no intervalo onde ocorre.
Por fim, em handleException()
na classe ErrorHandler
, defina o status do intervalo como ERROR
com estas linhas destacadas:
@ControllerAdviceprivate static class ErrorHandler {
@ExceptionHandler({ IllegalArgumentException.class, MissingServletRequestParameterException.class, HttpRequestMethodNotSupportedException.class }) public ResponseEntity<Object> handleException(Exception e) { // Set the span status and description Span.current().setStatus(StatusCode.ERROR, e.getMessage()); return new ResponseEntity<>(Map.of("message", e.getMessage()), HttpStatus.BAD_REQUEST); }}
Como na etapa anterior, isso define o código de status do intervalo se o usuário inserir um número inválido. No entanto, como isso acontece no manipulador de exceções, e não em fibonacci()
, o intervalo atual é o intervalo pai da solicitação. Esse span pai vem da instrumentação Spring Web MVC adicionada por meio do filtro na classe aplicativo. Agora, quando o endpoint do seu aplicativo gerar uma exceção, tanto o span pai quanto o span filho terão um status de span de ERROR
.
Instrumentação métrica personalizada: Adicionar um contador de métrica personalizado
Métricas são um tipo de dados de telemetria realmente úteis porque combinam medições individuais em agregações e produzem dados constantes em função da carga do sistema. Você pode usar esses dados em conjunto com períodos para ajudar a identificar tendências e fornecer telemetria de tempo de execução do aplicativo. Você também pode anotar qualquer métrica com um atributo para ajudar a descrever qual subdivisão das medidas a métrica representa.
A API OpenTelemetry métrica define uma série de instrumentos, que registram medidas que são agregadas pelo SDK métrica e exportadas fora do processo. Existem dois tipos de instrumento:
Síncrono: Este instrumento registra as medições à medida que ocorrem
Assíncrono: Este instrumento registra um retorno de chamada, que é invocado apenas uma vez por coleta e não possui contexto associado
Dica
Se você tiver alguma dúvida sobre o status da métrica no projeto OpenTelemetry, consulte os status do sinal.
Conclua o seguinte para adicionar um contador personalizado:
Instancie um atributo booleano para sua métrica personalizada e inicialize um instrumento métrico.
Dica
Nesse caso, estamos usando um LongCounter, que registra apenas valores positivos e é útil para contar coisas, como o número de bytes enviados por uma rede. Por padrão, as medidas do contador são agregadas em somas monotônicas (sempre crescentes).@RestControllerpublic class Controller {// Attribute constantsprivate static final AttributeKey<Long> ATTR_N = AttributeKey.longKey("fibonacci.n");private static final AttributeKey<Long> ATTR_RESULT = AttributeKey.longKey("fibonacci.result");private static final AttributeKey<Boolean> ATTR_VALID_N = AttributeKey.booleanKey("fibonacci.valid.n");private final Tracer tracer;private final LongCounter fibonacciInvocations;@AutowiredController(OpenTelemetry openTelemetry) {// Initialize tracertracer = openTelemetry.getTracer(Controller.class.getName());// Initialize instrumentMeter meter = openTelemetry.getMeter(Controller.class.getName());fibonacciInvocations = meter.counterBuilder("fibonacci.invocations").setDescription("Measures the number of times the fibonacci method is invoked.").build();}. . .}Insira as seguintes linhas destacadas para que seu contador personalizado possa capturar entradas válidas e inválidas, bem como o número de vezes que cada uma ocorre.
private long fibonacci(long n) {// Start a new span and set your first attributevar span = tracer.spanBuilder("fibonacci").setAttribute(ATTR_N, n).startSpan();// Set the span as the current spantry (var scope = span.makeCurrent()) {if (n < 1 || n > 90) {throw new IllegalArgumentException("n must be 1 <= n <= 90.");}long result = 1;if (n > 2) {long a = 0;long b = 1;for (long i = 1; i < n; i++) {result = a + b;a = b;b = result;}}// Set a span attribute to capture information about successful requestsspan.setAttribute(ATTR_RESULT, result);// Counter to increment the number of times a valid input is recordedfibonacciInvocations.add(1, Attributes.of(ATTR_VALID_N, true));return result;} catch (IllegalArgumentException e) {// Record the exception and set the span statusspan.recordException(e).setStatus(StatusCode.ERROR, e.getMessage());// Counter to increment the number of times an invalid input is recordedfibonacciInvocations.add(1, Attributes.of(ATTR_VALID_N, false));throw e;} finally {// End the spanspan.end();}}
Instrumentação de log customizada
O status do sinal de log no OpenTelemetry Java é atualmente experimental. mensagem do log são gerenciados pelo manipulador raiz em seu aplicativo, que enviará log de nível INFO
e superior para o console por padrão. No entanto, você pode modificar o comportamento do agente alterando o nível de log, inclusive para classes específicas, ou instalando um manipulador ou filtro customizado.
Inicialize o agente
Conforme afirmado anteriormente, isso é da biblioteca java.util.logging
. O agente não é um componente do OpenTelemetry, mas o aplicativo foi configurado para enviar o Log4j para o SDK log do OpenTelemetry:
@RestControllerpublic class Controller {
// Logger (note that this is not an OTel component) private static final Logger LOGGER = LogManager.getLogger(Controller.class);
// Attribute constants private static final AttributeKey<Long> ATTR_N = AttributeKey.longKey("fibonacci.n"); private static final AttributeKey<Long> ATTR_RESULT = AttributeKey.longKey("fibonacci.result"); private static final AttributeKey<Boolean> ATTR_VALID_N = AttributeKey.booleanKey("fibonacci.valid.n"); . . .}
Adicionar mensagem personalizada do log [#cust-log-messages]
Depois de inicializar o agente, você poderá usá-lo para registrar:
- O resultado de uma entrada válida, juntamente com o valor desse resultado
- Quando nenhuma saída foi gravada
Insira as seguintes linhas destacadas:
private long fibonacci(long n) { // Start a new span and set your first attribute var span = tracer.spanBuilder("fibonacci").setAttribute(ATTR_N, n).startSpan();
// Set the span as the current span try (var scope = span.makeCurrent()) { if (n < 1 || n > 90) { throw new IllegalArgumentException("n must be 1 <= n <= 90."); }
long result = 1; if (n > 2) { long a = 0; long b = 1;
for (long i = 1; i < n; i++) { result = a + b; a = b; b = result; } } // Set a span attribute to capture information about successful requests span.setAttribute(ATTR_RESULT, result); // Counter to increment the number of times a valid input is recorded fibonacciInvocations.add(1, Attributes.of(ATTR_VALID_N, true)); // Log the result of a valid input LOGGER.info("Compute fibonacci(" + n + ") = " + result); return result; } catch (IllegalArgumentException e) { // Record the exception and set the span status span.recordException(e).setStatus(StatusCode.ERROR, e.getMessage()); // Counter to increment the number of times an invalid input is recorded fibonacciInvocations.add(1, Attributes.of(ATTR_VALID_N, false)); // Log when no output was recorded LOGGER.info("Failed to compute fibonacci(" + n + ")"); throw e; } finally { // End the span span.end(); }}
Exercite o aplicativo para gerar algum tráfego
Você está pronto para enviar alguns dados para a New Relic!
Vá para o diretório
getting-started-guides/java
e crie e execute o aplicativo com este comando:Mac OS:
bash$./gradlew bootRunPowerShell:
bash$.\gradlew.bat buildDica
Se o seu terminal exibir o Spring ASCII, significa que seu aplicativo foi compilado com sucesso e está em execução:
Gere tráfego do aplicativo abrindo um novo terminal no diretório
getting-started-guides/java/Uninstrumented
e executando o gerador de carga:Mac OS:
bash$./load-generator.shPowerShell:
bash$.\load-generator.ps1
Dica
Alternativamente, você pode acessar o endpoint no browser neste URL:
http://localhost:8080/fibonacci?n=INSERT_A_VALUE
. SubstituaINSERT_A_VALUE
por um valor de 1 a 90. Para gerar um erro, insira um número inteiro fora do intervalo válido.Agora que você enviou alguns dados para o New Relic, veja nossas instruções sobre como visualizar os dados na interface.
Veja seus dados de demonstração no New Relic
Não importa qual tutorial você concluiu, você pode seguir as dicas abaixo para encontrar seus dados na interface do New Relic.
Vá para
one.newrelic.com > All capabilities > APM & services
.
Clique na sua nova entidade (serviço) chamada
getting-started-java
(ou qualquer nome que você forneceu).Confira os detalhes nas seções de cada tipo de dados.
Dica
Se você estiver usando o Windows e não vir os dados em sua conta New Relic, verifique se permitiu o tráfego através do firewall.
Traces
Depois de chegar à entidade getting-started-java
no New Relic:
Na seção
Monitor
do painel esquerdo, clique em
Distributed tracing
e depois clique no grupo trace
Fibonacci
.
A partir daí, encontre um trace com erro e clique para abri-lo.
Dica
Com o agente Java OpenTelemetry , você poderá ver resultados diferentes dos que veria com o agente Java New Relic APM . Isso ocorre porque há uma diferença no tratamento de erros entre os dois tipos de agentes. Para obter mais informações, consulte Tratamento de taxa de erros no OpenTelemetry e New Relic.
Depois de abrir o trace , clique em
Show in-process spans
e, em seguida, clique no intervalo resultante, o que abrirá um painel de detalhes à direita. Para ver a exceção que você registrou quando uma entrada do usuário é inválida, clique emView span events
:
Se você concluiu o tutorial de instrumentação manual, veja como será a aparência da exceção registrada como um intervalo no New Relic:
Para visualizar detalhes adicionais definidos, como o atributo do intervalo, o nome do intervalo e o código de status, clique na guia Attributes . Este painel também é onde você pode visualizar metadados adicionais que são coletados automaticamente pela biblioteca de instrumentação usada neste guia, bem como metadados anexados pela New Relic:
Para obter mais detalhes sobre como visualizar seus dados, consulte OpenTelemetry na interface do New Relic
Métrica
Depois de chegar à entidade getting-started-java
no New Relic, você poderá ver uma lista de todas as métricas coletadas, como métricas de tempo de execução (JVMs) e seu atributo de contador personalizado.
Explorador de métricas
Esta é uma ferramenta que permite ver uma lista das suas métricas.
No painel esquerdo, selecione Data > Metrics explorer e selecione
fibonacci.invocations
.Em Dimensions, visualize o atributo que você coletou junto com sua métrica personalizada e clique em fibonacci.valid.n.
Saiba mais em nossa documentação sobre a visualização do explorador métrico.
JVMs
Você também pode visualizar visualizações de suas métricas de tempo de execução Java, incluindo taxas de transferência, uso de memória e tempo de coleta de lixo por minuto, acessando a página da JVM:
Você pode visualizar a métrica para uma única instância ou selecionar múltiplas instâncias para compará-las:
Aqui está o que você verá após selecionar suas instâncias e clicar em Compare, onde cada instância é codificada por cores para facilitar a identificação:
Para saber mais, consulte nossa documentação sobre a visualização de JVMs.
Registro
Aqui é onde acessar seu log:
Você também verá o login em seu terminal:
De volta à sua visualização de logs, selecione um log e você verá um painel aberto com a mensagem do log e atributos adicionais que foram coletados, como os span e trace ids associados, bem como os metadados injetados pelo New Relic:
Você pode navegar até o distributed trace correlacionado clicando neste pequeno ícone azul:
Isso abrirá um painel que exibe o trace correlacionado, onde você poderá visualizar mais detalhes sobre o trace. Para obter mais informações sobre esta página, consulte OpenTelemetry na interface: página distributed tracing e Compreenda e use a interface distributed tracing :
Você também pode localizar o log correlacionado na visualização de rastreio distribuído. Ao selecionar um trace que possui um log correspondente, você o verá indicado como uma guia e poderá visualizar o log diretamente do trace sem precisar alternar as visualizações:
Saiba mais sobre a visualização de log aqui.
Referência: Variáveis de ambiente
Esta é uma lista de variáveis de ambiente que você deve exportar se estiver fazendo o tutorial 2 ou 3. Após terminar de exportar as variáveis, retorne aos tutoriais usando os links que seguem a lista de variáveis:
Depois de criar as variáveis de ambiente listadas no recolhido acima, retorne ao tutorial e conclua a configuração:
- Tutorial 2 (monitor o aplicativo de demonstração com o agente OpenTelemetry Java)
- Tutorial 3 (Configurar o aplicativo de demonstração manualmente)
Qual é o próximo?
Agora que você experimentou a instrumentação do OpenTelemetry e a configuração do SDK, você pode aplicar o que aprendeu para configurar seu próprio aplicativo ou serviço com o OpenTelemetry e o New Relic. Para saber mais, consulte Configurar seu próprio aplicativo ou serviço com OpenTelemetry.