• English日本語한국어
  • 로그인지금 시작하기

사용자의 편의를 위해 제공되는 기계 번역입니다.

영문본과 번역본이 일치하지 않는 경우 영문본이 우선합니다. 보다 자세한 내용은 이 페이지를 방문하십시오.

문제 신고

OpenTelemetry 튜토리얼: 샘플 Java 앱 계측

New Relic 플랫폼이 OTLP 데이터로 무엇을 할 수 있는지 알아보려면 다음 Java 튜토리얼을 사용해 보세요. 선택할 수 있는 세 가지 튜토리얼이 있으며 각 튜토리얼은 동일한 데모 Spring 앱을 사용합니다. 앱은 피보나치 수열의 n번째 숫자를 계산하고 추적, 측정항목 및 로그를 생성합니다.

이 자습서를 통해 작업하면 OpenTelemetry 및 New Relic을 사용하여 자신의 앱을 설정하는 데 도움이 되는 기술을 배울 수 있습니다.

이러한 자습서를 마치면 다음과 같은 차트에서 JVM 메트릭을 볼 수 있습니다.

요구 사항

시작하려면 다음 사항이 있는지 확인하세요.

튜토리얼

각 자습서에서는 동일한 데모 앱을 사용하지만 OpenTelemetry 및 New Relic에 익숙해지는 데 도움이 되는 다양한 접근 방식이 있습니다.

  • Pre-instrumented app [사전 계측된 앱]: UI에서 데이터를 빠르게 확인하려면 사전 계측된 데모 앱을 실행하세요.
  • OpenTelemetry Java agent [OpenTelemetry Java 에이전트]: OpenTelemetry Java 에이전트를 사용하여 데모 앱을 모니터링합니다.
  • Manual setup [수동 설정]: 데모 앱을 수동으로 계측합니다.

완료하려는 튜토리얼에 대해 아래 탭을 클릭하세요.

OpenTelemetry를 사용할 때 OTLP를 통해 애플리케이션에서 New Relic으로 데이터를 내보내는 두 가지 선택 사항이 있습니다.

  • 앱에서 New Relic으로 직접

  • 앱이 OpenTelemetry Collector로 데이터를 보낸 다음 New Relic으로 내보냅니다.

    이 튜토리얼에서는 첫 번째 옵션을 다룹니다. 수집기를 통해 데이터를 내보내려면 이 수집기 설명서에서 자세한 내용을 확인하세요.

사전 계측된 데모 앱 실행

계측을 수행하여 New Relic에 데이터를 보내고 UI에서 보는 것이 어떤 것인지 빠르게 확인할 수 있도록 하려면 이는 훌륭한 옵션입니다.

  1. 터미널에서 다음을 실행하여 데모 앱을 복제하고 시작 안내서의 java 디렉토리로 이동합니다.

    bash
    $
    git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git
    $
    cd newrelic-opentelemetry-examples/getting-started-guides/java
  2. 다음 두 환경 변수를 설정하여 New Relic 계정으로 데이터를 보내십시오.

    • 당신의 .

    • New Relic 데이터 센터 지역이 US가 아닌 EU인 경우 끝점을 다음으로 설정합니다. 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
  3. 아래의 첫 번째 환경 변수를 설정하여 서비스 이름을 지정하고, 두 번째 환경 변수를 서비스 인스턴스 ID로 설정하여 특정 플랫폼 기능을 활성화합니다. 마지막으로 로깅은 기본적으로 꺼져 있으므로 로그를 활성화합니다.

    • OTEL_SERVICE_NAME=getting-started-java

    • OTEL_RESOURCE_ATTRIBUTES=service.instance.id=INSERT_YOUR_ID_HERE

      • INSERT_YOUR_OWN_ID_HERE 고유한 인스턴스 ID로 바꿉니다. 예를 들어 1234를 사용할 수 있습니다.
    • OTEL_LOGS_EXPORTER=otlp

  4. 동일한 getting-started-guides/java 디렉토리에서 애플리케이션을 빌드하고 실행합니다.

    • 맥 OS:

      bash
      $
      ./gradlew bootRun
    • 파워셸:

      bash
      $
      .\gradlew.bat build
  5. 새 터미널 탭을 열고 getting-started-guides/java/Instrumented 디렉터리로 전환한 후 다음 명령을 실행하여 애플리케이션에 대한 일부 트래픽을 생성합니다.

    • 맥 OS:

      bash
      $
      ./load-generator.sh
    • 파워셸:

      bash
      $
      .\load-generator.ps1

    또는 다음 URL에서 브라우저의 엔드포인트에 도달할 수 있습니다: http://localhost:8080/fibonacci?n=INSERT_A_VALUE . INSERT_A_VALUE 을 1에서 90 사이의 값으로 바꿉니다. 오류를 생성하려면 유효한 범위 밖의 정수를 삽입하십시오.

  6. one.newrelic.com > All capabilities > APM & services 로 이동합니다.

  7. getting-started-java 라는 새 항목(서비스)을 클릭하고 UI를 탐색합니다. UI에서 무엇을 찾아야 하는지에 대한 추가 팁은 New Relic에서 데이터 보기 를 참조하십시오.

  8. UI에서 데이터 보기를 마쳤으면 두 터미널 세션 모두에서 CONTROL+C를 눌러 애플리케이션을 종료합니다.

OpenTelemetry Java 에이전트로 데모 앱 모니터링

다음은 동일한 데모 앱을 사용하는 다른 튜토리얼입니다. 이 경우 OpenTelemetry Java 에이전트를 사용하여 데모 앱을 자동으로 모니터링합니다. Java 소스 코드를 수정할 필요가 없습니다. 에이전트를 사용하면 샘플 데이터를 New Relic으로 내보내기를 빠르게 시작할 수 있습니다.

자동 계측 에이전트는 널리 사용되는 라이브러리 및 프레임워크에서 원격 분석을 캡처하기 위해 바이트 코드를 동적으로 삽입하는 JAR 파일입니다. 인바운드 요청, 아웃바운드 HTTP 호출 및 데이터베이스 호출과 같은 데이터를 캡처하는 데 사용할 수도 있습니다. 모든 Java 8+ 애플리케이션에 연결할 수 있습니다.

추가 구성 옵션은 공식 Java 에이전트 설명서 를 참조하십시오.

OpenTelemetry Java 에이전트로 데모 앱을 모니터링하려면:

  1. 에이전트 및 계측 라이브러리가 포함된 에이전트 JAR 파일 을 다운로드합니다. 원하는 디렉터리에 저장하고 나중에 사용할 경로를 기록해 둡니다.

  2. 아직 수행하지 않은 경우 데모 애플리케이션 리포지토리를 다운로드하고 다음 디렉터리로 전환합니다.

    bash
    $
    git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git
    $
    cd newrelic-opentelemetry-examples/getting-started-guides/java
  3. 다음 명령을 사용하여 데모 앱을 빌드합니다.

    • 맥 OS:

      bash
      $
      ./gradlew build
    • 파워셸:

      bash
      $
      .\gradlew.bat build

      빌드에 성공하면 Uninstrumented/build/libs 에서 uninstrumented.jar 이라는 결과 애플리케이션 JAR 파일을 찾을 수 있습니다.

  4. 아래의 환경 변수 참조 섹션 으로 이동하여 내보내야 하는 변수를 확인한 다음 이 단계로 돌아갑니다.

  5. 앱으로 에이전트를 시작하려면 getting-started-guides/java/Uninstrumented 에서 계속합니다.

    중요

    path/to 를 이전에 다운로드한 JAR 파일의 위치로 바꿉니다.

    bash
    $
    java -javaagent:path/to/opentelemetry-javaagent.jar \
    >
    -jar ./build/libs/uninstrumented.jar
  6. getting-started-guides/java/Uninstrumented 디렉터리에서 새 터미널을 열고 부하 생성기를 실행하여 애플리케이션에 대한 트래픽을 생성합니다.

    • 맥 OS:

      bash
      $
      ./load-generator.sh
    • 파워셸:

      bash
      $
      .\load-generator.ps1

    또는 다음 URL에서 브라우저의 엔드포인트에 도달할 수 있습니다: http://localhost:8080/fibonacci?n=INSERT_A_VALUE . INSERT_A_VALUE 을 1에서 90 사이의 값으로 바꿉니다. 오류를 생성하려면 유효한 범위 밖의 정수를 삽입하십시오.

  7. 일부 데이터를 New Relic에 전송했으므로 이제 UI에서 데이터 보기에 대한 지침을 참조하십시오.

  8. UI에서 데이터 보기를 마쳤으면 두 터미널 세션 모두에서 CONTROL+C를 눌러 애플리케이션을 종료합니다.

데모 앱을 수동으로 설정

이 트랙에서는 소매를 걷어붙이고 자동차 엔진을 만지작거리게 됩니다. 이는 보고되는 원격 분석을 최대한 제어하고 수행 방법에 대한 세부 정보를 확인하려는 경우 취하는 접근 방식입니다.

원격 측정을 캡처하기 위해 데모 앱에 계측을 수동으로 삽입하고 해당 데이터를 New Relic으로 내보내도록 SDK를 구성합니다.

SDK를 수동으로 구성할 수 있지만 환경 변수 및 시스템 속성을 사용하여 프로세스를 단순화하는 자동 구성 옵션 을 사용하여 SDK를 구성하는 방법을 보여줍니다.

데모 애플리케이션 다운로드

데모 앱을 아직 다운로드하지 않은 경우 다음을 실행하십시오.

bash
$
git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git

종속성 설치

종속성을 추가하려면:

  1. 애플리케이션 디렉토리로 이동합니다.

    bash
    $
    cd newrelic-opentelemetry-examples/getting-started-guides/java/uninstrumented
  2. build.gradle 을(를) 엽니다.

  3. 다음 강조 표시된 항목을 dependencies 블록에 추가합니다(코드 블록 내에서 아래로 스크롤해야 할 수 있음).

    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 core
    implementation 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 instrumentation
    implementation 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'
    }

    메모:

  • bom (재료 명세서) 종속성은 특정 생태계에 대한 종속성 버전을 동기화하는 데 사용됩니다. OpenTelemetry는 많은 Java 구성 요소를 게시하므로 이러한 구성 요소를 사용하는 경우 몇 개만 사용하든 많이 사용하든 모든 버전을 동기화하는 데 도움이 됩니다.
  • 나머지 종속성은 SDK, API, OTLP 내보내기 및 계측 라이브러리에 대한 액세스를 제공합니다.
  • spring-boot-starter-logging 모듈을 제외하기 위한 추가 설정이 있습니다. 이것은 log4j-slf4j-impl cannot be present with log4j-to-slf4j 와 관련된 빌드 오류 메시지를 방지합니다.

자동 구성 확장을 사용하여 SDK 구성

SDK를 수동으로 구성할 수 있지만 프로세스를 간소화하는 자동 구성 확장을 사용하는 것이 좋습니다.

  1. 앱의 소스 코드 디렉터리로 이동합니다.

    bash
    $
    cd newrelic-opentelemetry-examples/getting-started-guides/java/uninstrumented/src/main/java/com/example/demo
  2. Application.java 을(를) 엽니다.

  3. 강조 표시된 줄을 삽입합니다.

    @SpringBootApplication
    public 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;
    }
    }
  4. 아래의 환경 변수 참조 섹션 으로 이동하여 내보내야 하는 변수를 확인한 다음 이 단계로 돌아갑니다.

계측 라이브러리 추가: 추적

Application.java 에서 추적 필터를 등록하여 Spring Web MVC에 대해 강조 표시된 계측을 추가합니다.

@SpringBootApplication
public 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();
}
}

계측 라이브러리 추가: 측정항목

Application.java 파일에 다음을 등록하여 Java 런타임에 대한 측정항목을 생성하고 수집합니다. 아래에 강조표시된 줄을 삽입합니다.

@SpringBootApplication
public 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();
}
}

계측 라이브러리 추가: 로그

이 데모 애플리케이션은 GlobalLoggerProvider 를 사용하는 OpenTelemetryAppender ( log4j.xml 을 통해)를 사용하도록 구성됩니다. GlobalLoggerProvider 설정은 여기에서 자동 구성을 사용하여 구성된 로그 SDK에 OpenTelemetryAppender 를 연결합니다.

  1. Application.java 을(를) 엽니다.

  2. 다음 강조 표시된 줄을 삽입합니다.

    @SpringBootApplication
    public 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;
    // Set GlobalLoggerProvider, which is used by Log4j2 appender
    GlobalLoggerProvider.set(openTelemetrySdk.getSdkLoggerProvider());
    // 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();
    }
    }
  3. Uninstrumented/src/mainresources 라는 디렉터리를 만듭니다.

  4. 이 새 디렉터리에서 다음 콘텐츠가 포함된 log4j2.xml 라는 파일을 만듭니다.

    <?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>

    이 줄의 packages=... 섹션을 통해 Log4J는 OpenTelemetryAppender 을 찾고 구성할 수 있습니다. 소스 코드는 OpenTelemetry 저장소에 있으며 io.opentelemetry.instrumentation:opentelemetry-log4j-appender-2.17 를 통해 종속성으로 추가되었습니다.)

사용자 정의 추적 계측: 범위 특성 상수 만들기

각 추적은 논리적 작업 단위 또는 특정 요청 내의 작업을 나타내는 범위로 구성됩니다. 아래 코드는 다음을 보여줍니다.

  • 스팬에서 요청 수준 통찰력을 제공하는 데 사용할 수 있는 속성 키를 보유하는 정적 상수

  • 범위를 생성하는 Tracer 를 초기화하는 방법

    다음 강조 표시된 줄을 Controller.java 에 삽입합니다.

    @RestController
    public class Controller {
    // 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 final Tracer tracer;
    @Autowired
    Controller(OpenTelemetry openTelemetry) {
    // Initialize tracer
    tracer = openTelemetry.getTracer(Controller.class.getName());
    }
    @GetMapping(value = "/fibonacci")
    . . .
    }

커스텀 추적 계측: 커스텀 범위 만들기

원하는 스팬은 무엇이든 만들 수 있으며 특정 작업에 대한 속성으로 스팬에 주석을 추가하는 것은 사용자의 몫입니다. 설정한 속성은 결과 또는 작업 속성과 같이 추적 중인 특정 작업에 대한 추가 컨텍스트를 제공합니다.

  1. Controller.java 에서 강조 표시된 줄을 삽입하여 다음을 수행하는 fibonacci 라는 새 범위를 시작합니다.

    • 이 메서드의 실행에 대한 데이터를 캡처합니다.
    • 사용자 요청에서 n 값을 저장하는 속성을 설정합니다.
    private long fibonacci(long n) {
    // Start a new span and set your first attribute
    var span = tracer.spanBuilder("fibonacci").setAttribute(ATTR_N, n).startSpan();
    . . .
    }
  2. 성공적인 요청에 대한 정보를 저장하기 위해 스팬에 속성을 추가하여 코드에 세분화된 세부 정보를 추가합니다.

    private long fibonacci(long n) {
    // Start a new span and set your first attribute
    var 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 requests
    span.setAttribute(ATTR_RESULT, last);
    return last;
    } catch (IllegalArgumentException e) {
    throw e;
    }
    }

사용자 정의 추적 계측: 예외 기록

예외가 발생하면 기록할 수 있습니다. 스팬 상태 설정과 함께 이 작업을 수행하는 것이 좋습니다. 먼저 스팬을 현재 스팬으로 설정하고 예외 발생 시 상태 코드를 오류로 설정한 다음 스팬을 종료합니다.

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

이 메서드는 사용자가 잘못된 입력을 제공하는 경우 IllegalArgumentException 를 발생시킵니다. 이 경우 예외가 스팬에 이벤트로 기록되고 스팬의 상태가 ERROR 로 설정됩니다. 예외 메시지는 상태 설명으로 캡처됩니다. 예외는 발생하는 범위에서 이벤트로 기록됩니다.

마지막으로 ErrorHandler 클래스의 handleException() 에서 다음 강조표시된 줄을 사용하여 스팬의 상태를 ERROR 로 설정합니다.

@ControllerAdvice
private 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);
}
}

이전 단계에서와 같이 사용자가 잘못된 숫자를 입력하면 스팬의 상태 코드를 설정합니다. 그러나 이것은 fibonacci() 가 아닌 예외 핸들러에서 발생하기 때문에 현재 스팬은 요청의 상위 스팬입니다. 이 상위 범위는 Application 클래스의 필터를 통해 추가된 Spring Web MVC 계측에서 가져옵니다. 이제 애플리케이션 엔드포인트에서 예외가 발생하면 상위 스팬과 하위 스팬 모두 스팬 상태가 ERROR 입니다.

사용자 정의 메트릭 계측: 사용자 정의 메트릭 카운터 추가

메트릭은 개별 측정을 집계로 결합하고 시스템 부하의 함수로 일정한 데이터를 생성하기 때문에 정말 유용한 원격 분석 데이터 유형입니다. 이 데이터를 스팬과 함께 사용하여 추세를 파악하고 애플리케이션 런타임 원격 분석을 제공할 수 있습니다. 메트릭이 나타내는 측정의 하위 구분을 설명하는 데 도움이 되는 속성으로 메트릭에 주석을 달 수도 있습니다.

OpenTelemetry 메트릭 API는 메트릭 SDK에서 집계하고 외부 프로세스로 내보낸 측정값을 기록하는 여러 계측기를 정의합니다. 악기에는 두 가지 유형이 있습니다.

  • 동기식: 이 계측기는 측정이 발생하는 대로 기록합니다.

  • 비동기식: 이러한 도구는 컬렉션당 한 번만 호출되고 관련 컨텍스트가 없는 콜백을 등록합니다.

    OpenTelemetry 프로젝트의 메트릭 상태에 대한 질문이 있는 경우 신호 상태 를 참조하십시오.

    사용자 정의 카운터를 추가하려면 다음을 완료하십시오.

  1. 사용자 정의 메트릭에 대한 부울 속성을 인스턴스화하고 메트릭 도구를 초기화합니다.

    이 경우에는 양수 값만 기록하고 네트워크를 통해 전송된 바이트 수와 같은 항목을 계산하는 데 유용한 LongCounter 를 사용하고 있습니다. 기본적으로 카운터 측정값은 단조로운(항상 증가하는) 합계로 집계됩니다.

    @RestController
    public class Controller {
    // 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");
    private final Tracer tracer;
    private final LongCounter fibonacciInvocations;
    @Autowired
    Controller(OpenTelemetry openTelemetry) {
    // Initialize tracer
    tracer = openTelemetry.getTracer(Controller.class.getName());
    // Initialize instrument
    Meter meter = openTelemetry.getMeter(Controller.class.getName());
    fibonacciInvocations = meter
    .counterBuilder("fibonacci.invocations")
    .setDescription("Measures the number of times the fibonacci method is invoked.")
    .build();
    }
    . . .
    }
  2. 사용자 정의 카운터가 유효한 입력과 유효하지 않은 입력 및 각각의 발생 횟수를 캡처할 수 있도록 다음 강조 표시된 줄을 삽입하십시오.

    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));
    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));
    throw e;
    } finally {
    // End the span
    span.end();
    }
    }

사용자 정의 로그 계측

OpenTelemetry Java의 로그 신호 상태는 현재 실험적 입니다. 로그 메시지는 기본적으로 콘솔에 INFO 수준 이상의 로그를 보내는 앱의 루트 핸들러에서 관리합니다. 그러나 특정 클래스를 포함하여 로깅 수준을 변경하거나 사용자 지정 처리기 또는 필터를 설치하여 로거 동작을 수정할 수 있습니다.

로거 초기화

이전에 언급했듯이 이것은 java.util.logging 라이브러리에서 가져온 것입니다. 로거는 OpenTelemetry 구성 요소가 아니지만 애플리케이션은 OpenTelemetry Log SDK에 Log4j 로그를 보내도록 구성되었습니다.

@RestController
public 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");
. . .
}
사용자 지정 로그 메시지 추가 [#cust-log-messages]

로거를 초기화하면 로거를 사용하여 다음을 기록할 수 있습니다.

  • 해당 결과의 값과 함께 유효한 입력의 결과
  • 출력이 기록되지 않은 경우

다음 강조 표시된 줄을 삽입합니다.

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

앱을 실행하여 트래픽을 생성하세요.

New Relic에 일부 데이터를 보낼 준비가 되었습니다!

  1. getting-started-guides/java 디렉터리로 이동하고 다음 명령을 사용하여 앱을 빌드하고 실행합니다.

    • 맥 OS:

      bash
      $
      ./gradlew bootRun
    • 파워셸:

      bash
      $
      .\gradlew.bat build

      터미널에 Spring ASCII가 표시되면 앱이 성공적으로 빌드되었고 실행 중임을 의미합니다.

  2. getting-started-guides/java/Uninstrumented 디렉터리에서 새 터미널을 열고 부하 생성기를 실행하여 애플리케이션에서 트래픽을 생성합니다.

    • 맥 OS:

      bash
      $
      ./load-generator.sh
    • 파워셸:

      bash
      $
      .\load-generator.ps1

    또는 다음 URL에서 브라우저의 엔드포인트에 도달할 수 있습니다: http://localhost:8080/fibonacci?n=INSERT_A_VALUE . INSERT_A_VALUE 을 1에서 90 사이의 값으로 바꿉니다. 오류를 생성하려면 유효한 범위 밖의 정수를 삽입하십시오.

  3. 일부 데이터를 New Relic에 전송했으므로 이제 UI에서 데이터 보기에 대한 지침을 참조하십시오.

New Relic에서 데모 데이터 보기

어떤 튜토리얼을 완료했는지에 관계없이 New Relic UI에서 데이터를 찾기 위한 아래 팁을 따를 수 있습니다.

  1. one.newrelic.com > All capabilities > APM & services 로 이동합니다.
  2. getting-started-java (또는 제공한 이름)라는 새 항목(서비스)을 클릭합니다.
  3. 각 데이터 유형에 대한 섹션에서 세부 정보를 확인하십시오.

Windows를 사용 중이고 New Relic 계정에 데이터가 표시되지 않는 경우 방화벽을 통해 트래픽을 허용했는지 확인하십시오.

트레이스

New Relic에서 getting-started-java 엔티티에 도달하면:

  1. 왼쪽 창의 Monitor [모니터] 섹션에서 Distributed tracing [분산 추적을] 클릭한 다음 Fibonacci 추적 그룹을 클릭합니다.

  2. 거기에서 오류가 있는 트레이스를 찾아 클릭하여 엽니다.

  3. 트레이스가 열려 있으면 Show in-process spans 클릭한 다음 결과 범위를 클릭하면 오른쪽에 세부정보 패널이 열립니다. 사용자 입력이 유효하지 않을 때 기록한 예외를 보려면 View span events 클릭하십시오.

수동 계측 자습서를 완료한 경우 범위로 기록한 예외가 New Relic에서 다음과 같이 표시됩니다.

스팬 속성, 스팬 이름 및 상태 코드와 같이 설정한 추가 세부 정보를 보려면 속성 탭을 클릭하십시오. 또한 이 창에서는 이 가이드에서 사용한 계측 라이브러리에서 자동으로 수집한 추가 메타데이터와 New Relic에서 첨부한 메타데이터를 볼 수 있습니다.

데이터 보기에 대한 자세한 내용은 New Relic UI의 OpenTelemetry를 참조하십시오.

메트릭

New Relic에서 getting-started-java 엔티티에 도달하면 런타임 지표(JVM) 및 사용자 정의 카운터 속성과 같은 수집된 모든 지표 목록을 볼 수 있습니다.

측정항목 탐색기

메트릭 목록을 볼 수 있는 도구입니다.

  1. 왼쪽 창에서 Data > Metrics explorer 를 선택한 다음 fibonacci.invocations 를 선택합니다.

  2. 차원 아래에서 사용자 정의 메트릭과 함께 수집한 속성을 확인한 다음 fibonacci.valid.n 을 클릭하십시오.

메트릭 탐색기 보기 에 대한 설명서에서 자세히 알아보세요.

JVM

JVM 페이지로 이동하여 처리량, 메모리 사용량 및 분당 가비지 수집 시간을 포함하여 Java 런타임 메트릭의 시각화를 볼 수도 있습니다.

단일 인스턴스에 대한 지표를 보거나 여러 인스턴스를 선택하여 비교할 수 있습니다.

다음은 인스턴스를 선택하고 비교 를 클릭한 후 표시되는 내용입니다. 여기에서 각 인스턴스는 쉽게 식별할 수 있도록 색상으로 구분되어 있습니다.

자세한 내용은 JVM 보기 에 대한 설명서를 참조하십시오.

로그

로그에 액세스할 수 있는 위치는 다음과 같습니다.

또한 터미널에 로그가 표시됩니다.

로그 보기로 돌아가서 로그를 선택하면 로그 메시지와 수집된 추가 속성(예: 관련 스팬 및 트레이스 ID, New Relic에서 삽입한 메타데이터)이 있는 창이 열립니다.

이 작은 파란색 아이콘을 클릭하여 상관 분산 추적으로 이동할 수 있습니다.

그러면 추적에 대한 자세한 정보를 볼 수 있는 상관 추적을 표시하는 창이 열립니다. 이 페이지에 대한 자세한 내용 은 UI의 OpenTelemetry: 분산 추적 페이지분산 추적 UI 이해 및 사용 을 참조하세요.

분산 추적 보기에서 상관 로그를 찾을 수도 있습니다. 해당 로그가 있는 추적을 선택하면 해당 로그가 탭으로 표시되며 보기를 전환하지 않고도 추적에서 직접 로그를 볼 수 있습니다.

여기 에서 로그 보기에 대해 자세히 알아보세요.

참조: 환경 변수

튜토리얼 2 또는 3을 수행하는 경우 내보내야 하는 환경 변수 목록입니다. 변수 내보내기를 완료한 후 변수 목록 다음에 오는 링크를 사용하여 자습서로 돌아갑니다.

위 축소기에 나열된 환경 변수를 생성한 후 자습서로 돌아가서 설정을 완료합니다.

다음은 뭐지?

이제 OpenTelemetry 계측 및 SDK 구성을 실험했으므로 배운 내용을 적용하여 OpenTelemetry 및 New Relic을 사용하여 자체 앱 또는 서비스를 설정할 수 있습니다. 자세한 내용 은 OpenTelemetry로 자체 앱 또는 서비스 설정을 참조하십시오.

Copyright © 2024 New Relic Inc.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.