Pruebe estos tutoriales de Java para ver qué puede hacer la plataforma New Relic con sus datos OTLP. Tenemos tres tutoriales entre los que puede elegir, cada uno de los cuales utiliza la misma aplicación de demostración Spring. La aplicación calculará el enésimo número de la secuencia de Fibonacci y generará traza, métrica y log.
Al seguir estos tutoriales, puede aprender habilidades que le ayudarán a configurar su propia aplicación con OpenTelemetry y New Relic.
Después de terminar cualquiera de estos tutoriales, podrá ver JVM métrica en gráficos como estos.
Requisitos
Para comenzar, asegúrese de tener lo siguiente:
- Una cuenta New Relic: Regístrese para obtener una cuenta gratuita si aún no tiene una.
- Java 17 o superior: si aún no lo tienes, consulta estas opciones de descarga.
Tutoriales
Aunque cada tutorial utiliza la misma aplicación de demostración, tienen diferentes enfoques para ayudarlo a familiarizarse con OpenTelemetry y New Relic.
- Aplicación pre-instrumentada: ejecute nuestra aplicación de demostración pre-instrumentada para ver rápidamente los datos en nuestra UI.
- OpenTelemetry agente de Java: monitor nuestra aplicación de demostración con el agente de Java OpenTelemetry.
- Configuración manual: instrumente nuestra aplicación de demostración manualmente.
Haga clic en la pestaña a continuación para ver el tutorial que desea completar.
Sugerencia
Cuando utilice OpenTelemetry, tendrá dos opciones para exportar datos desde su aplicación a New Relic a través de OTLP:
Directamente desde tu aplicación a New Relic
Su aplicación envía datos a un recopilador OpenTelemetry donde luego se exporta a New Relic
Estos tutoriales cubren la primera opción. Si desea exportar sus datos a través de un recopilador, consulte esta documentación del recopilador para obtener más detalles.
Ejecute la aplicación de demostración pre-instrumentada
Esta es una excelente opción si desea que hagamos la instrumentación para que pueda ver rápidamente cómo es enviar datos a New Relic y verlos en nuestra UI.
En su terminal, ejecute lo siguiente para clonar la aplicación de demostración y navegue hasta el directorio
java
de las Guías de introducción.bash$git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git$cd newrelic-opentelemetry-examples/getting-started-guides/javaConfigure estas dos variables de entorno para enviar datos a su cuenta New Relic:
Asegúrate de utilizar tu .
Si la región de su centro de datos New Relic es la UE y no los EE. UU., configure el extremo en:
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
Configure la primera variable de entorno a continuación para nombrar el servicio, luego configure la segunda para el ID del servicio de la instancia, que activa cierta característica de la plataforma. Finalmente, habilite el log ya que el logging está desactivado de forma predeterminada:
OTEL_SERVICE_NAME=getting-started-java
OTEL_RESOURCE_ATTRIBUTES=service.instance.id=INSERT_YOUR_ID_HERE
- Reemplace
INSERT_YOUR_OWN_ID_HERE
con un ID único de la instancia. Por ejemplo, podrías usar 1234.
- Reemplace
OTEL_LOGS_EXPORTER=otlp
En el mismo directorio
getting-started-guides/java
, cree y ejecute la aplicación:Mac OS:
bash$./gradlew bootRunPotencia Shell:
bash$.\gradlew.bat build
Abra una nueva pestaña de terminal, cambie al directorio
getting-started-guides/java/Instrumented
y ejecute el siguiente comando para generar algo de tráfico a la aplicación:Mac OS:
bash$./load-generator.shPotencia Shell:
bash$.\load-generator.ps1
Sugerencia
Alternativamente, puede llegar al extremo en el browser en esta URL:
http://localhost:8080/fibonacci?n=INSERT_A_VALUE
. ReemplaceINSERT_A_VALUE
con un valor de 1 a 90. Para generar un error, inserte un número entero fuera del rango válido.Vaya a one.newrelic.com > All capabilities > APM & services.
Haga clic en su nueva entidad (servicio) llamada
getting-started-java
y explore la UI. Para obtener más consejos sobre qué buscar en la UI, consulte Ver sus datos en New Relic.Cuando haya terminado de ver sus datos en la UI, cierre la aplicación presionando CONTROL+C en ambas sesiones de terminal.
monitor la aplicación de demostración con el agente de Java OpenTelemetry
Aquí hay un tutorial diferente que también utiliza la misma aplicación de demostración. En este caso, utilizará el agente de Java OpenTelemetry para monitor automáticamente la aplicación de demostración. No es necesario modificar el código fuente de Java. Al utilizar el agente, puede comenzar rápidamente a exportar datos de muestra a New Relic.
El agente de instrumentación automática es un archivo JAR que inyecta dinámicamente código de bytes para capturar telemetría de bibliotecas y marcos populares. También puede usarlo para capturar datos como solicitudes entrantes, llamadas HTTP salientes y llamadas de base de datos. Se puede adjuntar a cualquier aplicación Java 8+.
Sugerencia
Consulte la documentación oficial del agente de Java para obtener opciones de configuración adicionales.
Para monitor nuestra aplicación de demostración con el agente de Java OpenTelemetry:
Descargue el archivo JAR del agente, que contiene la biblioteca del agente y la instrumentación. Colóquelo en su directorio preferido y anote la ruta que utilizará más adelante.
Si aún no lo ha hecho, descargue el repositorio de la aplicación de demostración y cambie al siguiente directorio:
bash$git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git$cd newrelic-opentelemetry-examples/getting-started-guides/javaCree la aplicación de demostración con este comando:
Mac OS:
bash$./gradlew buildPotencia Shell:
bash$.\gradlew.bat buildSugerencia
Después de una compilación exitosa, encontrará el archivo JAR de la aplicación resultante en
Uninstrumented/build/libs
, llamadouninstrumented.jar
.
Vaya a nuestra sección de referencia de variables de entorno a continuación para ver qué variables necesita exportar y luego volver a estos pasos.
Continúe en
getting-started-guides/java/Uninstrumented
para lanzar el agente con la aplicación:Importante
Reemplace
path/to
con la ubicación del archivo JAR que descargó anteriormente.bash$java -javaagent:path/to/opentelemetry-javaagent.jar \>-jar ./build/libs/uninstrumented.jarGenere tráfico a la aplicación abriendo una nueva terminal en el directorio
getting-started-guides/java/Uninstrumented
y ejecutando el generador de carga:Mac OS:
bash$./load-generator.shPotencia Shell:
bash$.\load-generator.ps1
Sugerencia
Alternativamente, puede llegar al extremo en el browser en esta URL:
http://localhost:8080/fibonacci?n=INSERT_A_VALUE
. ReemplaceINSERT_A_VALUE
con un valor de 1 a 90. Para generar un error, inserte un número entero fuera del rango válido.Ahora que ha enviado algunos datos a New Relic, consulte nuestras instrucciones sobre cómo ver los datos en la UI.
Cuando haya terminado de ver sus datos en la UI, cierre la aplicación presionando CONTROL+C en ambas sesiones de terminal.
Configure la aplicación de demostración manualmente
El tutorial anterior le ayudó a explorar la instrumentación automática con el agente de Java OpenTelemetry. Este tutorial le mostrará cómo utilizar instrumentación personalizada para tener más control sobre la telemetría que recopila. Insertará manualmente la instrumentación en nuestra aplicación de demostración para capturar la telemetría y luego configurará el SDK para exportar esos datos a New Relic.
Sugerencia
Si bien puede configurar manualmente el SDK, le mostraremos cómo configurar el SDK usando la opción de configuración automática, que simplifica el proceso mediante el uso de variables de entorno y propiedades del sistema.
Descargue la aplicación de demostración
Si aún no ha descargado nuestra aplicación de demostración, ejecute lo siguiente:
$git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git
Instalar dependencia
Para agregar dependencia:
Vaya al directorio de la aplicación.
bash$cd newrelic-opentelemetry-examples/getting-started-guides/java/uninstrumentedAbra
build.gradle
.Agregue los siguientes elementos resaltados al bloque
dependencies
(es posible que deba desplazarse hacia abajo dentro del bloque 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:
- La dependencia
bom
(lista de materiales) se utiliza para sincronizar versiones de dependencia para un ecosistema en particular. Dado que OpenTelemetry publica muchos componentes Java, estos ayudan a garantizar que todas las versiones estén sincronizadas, ya sea que use solo unas pocas o muchas. - Las dependencias restantes brindan acceso al SDK, API, exportador OTLP y biblioteca de instrumentación.
- Hay una configuración adicional para excluir el módulo spring-boot-starter-logging. Esto evita un mensaje de error de compilación relacionado con
log4j-slf4j-impl cannot be present with log4j-to-slf4j
.
Configure el SDK con la extensión de configuración automática
Si bien puede configurar el SDK manualmente, le recomendamos utilizar la extensión de configuración automática, ya que agiliza el proceso.
Vaya al directorio del código fuente de la aplicación:
bash$cd newrelic-opentelemetry-examples/getting-started-guides/java/uninstrumented/src/main/java/com/example/demoAbra
Application.java
.Inserte las líneas resaltadas:
@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;}}Vaya a nuestra sección de referencia de variables de entorno a continuación para ver qué variables necesita exportar y luego volver a estos pasos.
Añadir instrumentación biblioteca: traza
En Application.java
, agregue la instrumentación resaltada para Spring Web MVC registrando un filtro de seguimiento:
@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(); }}
Agregar biblioteca de instrumentación: métrica
Genere y recopile métricas sobre su tiempo de ejecución de Java registrando lo siguiente en el archivo Application.java
. Inserte las líneas resaltadas a continuación:
@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(); }}
Agregar biblioteca de instrumentación: log
Esta aplicación de demostración está configurada para usar OpenTelemetryAppender
(a través de log4j.xml
), que usa GlobalLoggerProvider
. La configuración de GlobalLoggerProvider
conecta el OpenTelemetryAppender
al SDK log que se configura mediante la configuración automática aquí:
Abra
Application.java
.Inserte las siguientes líneas resaltadas.
@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();}}Cree un directorio llamado
resources
enUninstrumented/src/main
.En este nuevo directorio, cree un archivo llamado
log4j2.xml
con el siguiente contenido:<?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>Sugerencia
La sección
packages=...
de esta línea permite a Log4J encontrar y configurar elOpenTelemetryAppender
. El código fuente está en el repositorio de OpenTelemetry y se agregó como una dependencia a través deio.opentelemetry.instrumentation:opentelemetry-log4j-appender-2.17
)
Instrumentación de traza personalizada: Crear constantes de atributo span
Cada traza se compone de tramos, que representan una unidad de trabajo lógica o una operación dentro de una solicitud particular. El siguiente código lo demuestra:
Constantes estáticas para contener claves de atributos que se pueden usar para proporcionar Insights a nivel de solicitud en sus intervalos.
Cómo inicializar un rastreador, que crea tramos
Inserte las siguientes líneas resaltadas en
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"). . .}
Traza instrumentación personalizada: Crear un tramo personalizado
Puede crear los intervalos que desee y depende de usted anotar sus intervalos con atributos en operaciones específicas. El atributo que establezca proporcionará contexto adicional sobre la operación específica que está rastreando, como resultados o propiedades de la operación.
En
Controller.java
, inserte estas líneas resaltadas para iniciar un nuevo intervalo llamadofibonacci
que hace lo siguiente:- Captura datos sobre la ejecución de este método.
- Establece un atributo que almacena el valor de n de la solicitud del usuario.
private long fibonacci(long n) {// Start a new span and set your first attributevar span = tracer.spanBuilder("fibonacci").setAttribute(ATTR_N, n).startSpan();. . .}Agregue detalles granulares a su código agregando un atributo a su intervalo para almacenar información sobre solicitudes exitosas:
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;}}
Instrumentación de traza personalizada: Registrar una excepción
Es posible que desee registrar las excepciones a medida que ocurren. Le recomendamos hacer esto junto con la configuración del estado del intervalo. Primero, establezca su intervalo como el intervalo actual, establezca el código de estado en error en caso de una excepción y luego finalice el 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 genera un IllegalArgumentException
si un usuario proporciona una entrada no válida. Cuando esto sucede, la excepción se registra como un evento en el intervalo y el estado del intervalo se establecerá en ERROR
. El mensaje de excepción se captura como descripción del estado. La excepción se registrará como un evento en el lapso donde ocurra.
Finalmente, en handleException()
en la clase ErrorHandler
, establezca el estado del intervalo en ERROR
con estas líneas resaltadas:
@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 en el paso anterior, esto establece el código de estado del intervalo si el usuario ingresa un número no válido. Sin embargo, debido a que esto sucede en el controlador de excepciones, en lugar de en fibonacci()
, el intervalo actual es el principal de intervalo de la solicitud. Este tramo principal proviene de la instrumentación Spring Web MVC agregada mediante el filtro en la clase de aplicación. Ahora, cuando el extremo de su aplicación genere una excepción, tanto el tramo principal como el tramo secundario tendrán un estado de tramo de ERROR
.
Instrumentación métrica personalizada: Añadir un contador métrica personalizada
Las métricas son un tipo telemetry data que son realmente útiles porque combinan mediciones individuales en agregaciones y producen datos que son constantes en función de la carga del sistema. Puede utilizar estos datos junto con intervalos para ayudar a detectar tendencias y proporcionar telemetría en tiempo de ejecución de la aplicación. También puede anotar cualquier métrica con un atributo para ayudar a describir qué subdivisión de las medidas representa la métrica.
La API de OpenTelemetry métrica define una serie de instrumentados, que registran mediciones que son agregadas por el SDK de métrica y exportadas fuera de proceso. Hay dos tipos de instrumentado:
Síncrono: Estos instrumentados registran las mediciones a medida que ocurren.
Asincrónico: Estos instrumentados registran un callback, el cual se invoca solo una vez por colección y no tiene contexto asociado
Sugerencia
Si tiene alguna pregunta sobre el estado de la métrica en el proyecto OpenTelemetry, consulte los estados de las señales.
Complete lo siguiente para agregar un contador personalizado:
Cree una instancia de un atributo booleano para su métrica personalizada e inicialice una métrica instrumentada.
Sugerencia
En este caso, estamos usando un LongCounter, que registra solo valores positivos y es útil para contar cosas, como la cantidad de bytes enviados a través de una red. De forma predeterminada, las medidas de los contadores se agregan a sumas monótonas (siempre crecientes).@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();}. . .}Inserte las siguientes líneas resaltadas para que su contador personalizado pueda capturar entradas válidas e inválidas, así como la cantidad de veces que ocurre cada una.
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();}}
Instrumentación log personalizados
El estado de la señal de log en OpenTelemetry Java es actualmente experimental. Los mensajes de log son administrados por el controlador raíz de su aplicación, que enviará logs de nivel INFO
y superiores a la consola de forma predeterminada. Sin embargo, puede modificar el comportamiento logger cambiando el nivel de logging, incluso para clases específicas, o instalando un controlador o filtro personalizado.
Inicializar el logger
Como se indicó anteriormente, esto es de la biblioteca java.util.logging
. El logger no es un componente de OpenTelemetry, pero la aplicación se ha configurado para enviar el log de Log4j al SDK log 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"); . . .}
Agregar mensaje de log personalizado [#cust-log-messages]
Una vez que haya inicializado el logger, puede utilizarlo para logger :
- El resultado de una entrada válida, junto con el valor de ese resultado.
- Cuando no se registró ninguna salida
Inserte las siguientes líneas resaltadas:
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(); }}
Ejercite la aplicación para generar algo de tráfico.
¡Estás listo para enviar algunos datos a New Relic!
Vaya al directorio
getting-started-guides/java
y cree y ejecute la aplicación con este comando:Mac OS:
bash$./gradlew bootRunPotencia Shell:
bash$.\gradlew.bat buildSugerencia
Si su terminal muestra Spring ASCII, significa que su aplicación se ha creado correctamente y se está ejecutando:
Genere tráfico desde la aplicación abriendo una nueva terminal en el directorio
getting-started-guides/java/Uninstrumented
y ejecutando el generador de carga:Mac OS:
bash$./load-generator.shPotencia Shell:
bash$.\load-generator.ps1
Sugerencia
Alternativamente, puede llegar al extremo en el browser en esta URL:
http://localhost:8080/fibonacci?n=INSERT_A_VALUE
. ReemplaceINSERT_A_VALUE
con un valor de 1 a 90. Para generar un error, inserte un número entero fuera del rango válido.Ahora que ha enviado algunos datos a New Relic, consulte nuestras instrucciones sobre cómo ver los datos en la UI.
Vea los datos de su demostración en New Relic
No importa qué tutorial haya completado, puede seguir los consejos a continuación para encontrar sus datos en la UI de New Relic.
Vaya a
one.newrelic.com > All capabilities > APM & services
.
Haga clic en su nueva entidad (servicio) llamada
getting-started-java
(o cualquier nombre que haya proporcionado).Consulte los detalles en las secciones para cada tipo de datos.
Sugerencia
Si está utilizando Windows y no ve datos en su cuenta de New Relic, verifique que haya permitido el tráfico a través del firewall.
Traza
Una vez que hayas llegado a la entidad getting-started-java
en New Relic:
En la sección
Monitor
del panel izquierdo, haga clic en
Distributed tracing
y luego haga clic en el grupo de trazas
Fibonacci
.
Desde allí, busca una traza con un error y haz clic para abrirla.
Sugerencia
Con el agente de Java OpenTelemetry , es posible que vea resultados diferentes a los que vería con el agente de Java New Relic APM . Esto se debe a que existe una diferencia en el manejo de errores entre los dos tipos de agente. Para obtener más información, consulte Manejo de tasas de errores en OpenTelemetry y New Relic.
Una vez que tenga la traza abierta, haga clic en
Show in-process spans
y luego haga clic en el tramo resultante, lo que abrirá un panel de detalles a la derecha. Para ver la excepción que registró cuando la entrada de un usuario no es válida, haga clic enView span events
:
Si completó el tutorial de instrumentación manual, así es como se verá la excepción que registró como un lapso en New Relic:
Para ver detalles adicionales que configuró, como el atributo de intervalo, el nombre del intervalo y el código de estado, haga clic en la pestaña Attributes . En este panel también puede ver metadatos adicionales que recopila automáticamente la biblioteca de instrumentación que utilizó en esta guía, así como los metadatos adjuntos de New Relic:
Para obtener más detalles sobre cómo ver sus datos, consulte OpenTelemetry en la UI de New Relic
Métrica
Una vez que haya llegado a la entidad getting-started-java
en New Relic, podrá ver una lista de todas las métricas recopiladas, como las métricas de tiempo de ejecución (JVM) y su atributo de contador personalizado.
Explorador métrico
Esta es una herramienta que te permite ver una lista de tus métricas.
En el panel izquierdo, seleccione Data > Metrics explorer y luego seleccione
fibonacci.invocations
.En Dimensions, vea el atributo que recopiló junto con su métrica personalizada y luego haga clic en fibonacci.valid.n.
Conozca más en nuestra documentación sobre la vista del explorador métrica.
JVM
También puede ver visualizaciones de su métrica de tiempo de ejecución de Java, incluido el rendimiento, el uso de memoria y el tiempo de recolección de basura por minuto, dirigiéndose a la página de JVM:
Puede ver la métrica de una sola instancia o seleccionar varias instancias para compararlas:
Esto es lo que verá después de seleccionar sus instancias y hacer clic en Compare, donde cada instancia está codificada por colores para una fácil identificación:
Para obtener más información, consulte nuestra documentación sobre la vista JVM.
Logs
Aquí es donde acceder a su log:
También verás iniciar sesión en tu terminal:
De vuelta en su vista de log, seleccione un log y verá un panel abierto con el mensaje de log y los atributos adicionales que se recopilaron, como el intervalo asociado y los identificadores de traza, así como los metadatos inyectados por New Relic:
Puedes navegar al rastreo distribuido correlacionado haciendo clic en este pequeño icono azul:
Esto abrirá un panel que muestra la traza correlacionada, donde podrá ver más detalles sobre la traza. Para obtener más información sobre esta página, consulte OpenTelemetry en la UI: página de rastreo distribuido y Comprender y utilizar la UI de rastreo distribuido:
También puede encontrar el log correlacionado desde la vista de rastreo distribuido. Cuando selecciones una traza que tenga su correspondiente log, lo verás indicado como una pestaña, y podrás visualizar el log directamente desde la traza sin tener que cambiar de vista:
Obtenga más información sobre la vista de log aquí.
Referencia: variables de entorno
Esta es una lista de las variables de entorno que debes exportar si estás realizando el tutorial 2 o 3. Una vez que termine de exportar las variables, regrese a los tutoriales utilizando los enlaces que siguen a la lista de variables:
Una vez que haya creado las variables de entorno enumeradas en el colapsador anterior, regrese al tutorial y complete la configuración:
- Tutorial 2 (monitor la aplicación demo con el agente de Java OpenTelemetry)
- Tutorial 3 (Configurar la aplicación de demostración manualmente)
¿Que sigue?
Ahora que ha experimentado con la instrumentación de OpenTelemetry y la configuración del SDK, puede aplicar lo que ha aprendido para configurar su propia aplicación o servicio con OpenTelemetry y New Relic. Para obtener más información, consulte Configure su propia aplicación o servicio con OpenTelemetry.