Introduction to New Relic for Java
1. 개요
뉴렐릭의 애플리케이션 성능 모니터링(APM)은 우리의 애플리케이션과 마이크로서비스의 성능을 한 곳에서 모니터링하고 분석할 수 있도록 도와줍니다. 이는 서로 다른 시스템 구성 요소를 추적하기 위한 별도의 도구가 필요 없게 하여 성능 관리를 더 쉽게 만들어 줍니다.
뉴렐릭 자바 에이전트는 애플리케이션의 성능 문제와 오류를 지속적으로 모니터링합니다. 이 에이전트는 정기적으로 뉴렐릭 대시보드에 메트릭 및 이벤트 데이터를 전송하며, 이를 통해 우리는 애플리케이션 성능을 검토하고 개선할 수 있습니다.
이 튜토리얼에서는 애플리케이션을 관찰하고 최적화하는 능력을 향상시키는 트레이스, 사용자 정의 계측 및 경고와 같은 뉴렐릭 자바 에이전트의 몇 가지 기능에 대해 논의할 것입니다.
2. 설정
우리는 통화 환율 API를 쿼리하고 결과를 Redis에 캐시하는 CurrencyConverterService라는 예제를 사용하여 뉴렐릭 자바 에이전트에서 제공하는 기능을 보여줄 것입니다. 먼저 뉴렐릭 계정을 설정합시다.
가입 페이지에서 우리 회사 이메일 주소를 사용하거나 제공되는 타사 인증 제공자를 선택할 수 있습니다. 가입 후, 자바 에이전트를 설정할 것입니다. 뉴렐릭은 UI 가이드를 통한 런처 또는 수동 설치 두 가지 옵션을 제공합니다. 이 예제에서는 수동 설치 방법으로 진행할 것입니다.
Apache Maven을 사용하여 모든 자바 에이전트 구성 요소가 포함된 newrelic-java.zip 파일을 다운로드합니다. 다음으로 이 종속성을 우리의 POM 파일에 추가합시다:
<dependency>
<groupId>com.newrelic.agent.java</groupId>
<artifactId>newrelic-java</artifactId>
<version>8.17.0</version>
<scope>provided</scope>
<type>zip</type>
</dependency>
그 다음, POM 플러그인을 업데이트하여 자바 에이전트를 타겟 디렉토리에 추출하는 지침을 추가합니다:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>unpack-newrelic</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<includeGroupIds>com.newrelic.agent.java</includeGroupIds>
<includeArtifactIds>newrelic-java</includeArtifactIds>
<excludes>**/newrelic.yml</excludes>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
이 플러그인은 에이전트의 구성 요소를 프로젝트의 루트 디렉토리에 있는 newrelic 폴더로 추출합니다. 우리는 Maven이 에이전트를 다시 추출할 때 newrelic.yml 파일이 덮어쓰여지지 않도록 플러그인을 구성합니다.
다음으로, 뉴렐릭 에이전트에 대한 사용자 정의 설정으로 newrelic.yml 파일을 구성합니다. 이를 위해 파일의 템플릿을 다운로드하고 우리의 구성으로 편집합시다:
curl -L -o /path/to/extracted/agent/newrelic/newrelic.yml https://download.newrelic.com/newrelic/java-agent/newrelic-agent/8.17.0/newrelic.yml
권장 사항에 따라, 기본 newrelic.yml 권한을 변경하여 애플리케이션 프로세스 소유자만 읽기 및 쓰기 권한을 갖도록 합니다. 리눅스 시스템에서 우리는 다음 명령을 사용합니다:
chmod 600 newrelic.yml
다음으로, 구성 값을 편집합시다:
common: &default_settings
license_key: <LICENSE_KEY>
agent_enabled: true
app_name: Currency Converter
#...
development:
<<: *default_settings
app_name: Currency Converter (Development)
test:
<<: *default_settings
app_name: Currency Converter (Test)
production:
<<: *default_settings
staging:
<<: *default_settings
app_name: Currency Converter (Staging)
우리의 license_key는 뉴렐릭 계정을 만들 때 발급되었습니다. 다음으로 애플리케이션을 시작하여 우리의 설정을 테스트합시다:
java -javaagent:/path/to/newrelic.jar -jar /path/to/currency-converter-0.0.1.jar
잠시 후, 우리는 one.newrelic.com -> APM & Services 아래에 우리의 서비스가 나열되는 것을 볼 수 있어야 합니다.
3. 요청 추적
다른 APM(애플리케이션 성능 모니터링) 도구와 마찬가지로 뉴렐릭은 요청의 여정을 시각적으로 추적할 수 있게 해줍니다. 이 기능을 확인하기 위해 우리 서비스에 요청을 발행합시다:
curl --request GET \
--url 'http://localhost:8080/api/currency/convert?targetCurrency=GBP&amount=100'
그 후, 뉴렐릭 관리 포털로 이동하여 트레이스를 선택하고 목록에서 우리의 트레이스를 선택합니다. 우리는 아래 스크린샷과 유사한 흐름을 볼 수 있어야 합니다:
우리의 요청은 Redis 캐시를 조회하고, 캐시 미스를 기록한 후, 통화 환율 API를 호출하고, 결과를 Redis 캐시에 저장했습니다.
4. 사용자 정의 계측 구현
자바 에이전트는 유용한 성능 데이터를 자동으로 생성하지만, 자바 에이전트 API를 통해 트랜잭션 트레이스에 더 많은 세부 정보를 추가할 수도 있습니다. 이를 우리의 프로젝트에 종속성으로 추가합시다:
<dependency>
<groupId>com.newrelic.agent.java</groupId>
<artifactId>newrelic-api</artifactId>
<version>8.17.0</version>
<scope>runtime</scope>
</dependency>
그 후, 서비스 코드를 수정하여 에이전트 API를 사용합시다:
@Service
public class CurrencyConverterService {
//...
@Value("${openexchangerates.base_currency}")
public String baseCurrency;
@Trace(metricName="CurrencyConversionCalc")
public double getConvertedAmount(String targetCurrency, double amount) {
String cacheKey = baseCurrency + "-" + targetCurrency;
//...
String eTagHeaderField = response.header("ETag");
NewRelic.addCustomParameter(cacheKey, eTagHeaderField);
//...
}
}
@Trace 어노테이션은 자바 에이전트에게 getConvertedAmount() 메서드를 측정하도록 지시하며, metricName 속성은 트랜잭션 트레이스에서 메서드에 대한 메트릭 이름을 할당합니다. 우리는 통화 환율 API 호출로부터 반환된 헤더를 사용자 정의 매개변수로 수동으로 캡처할 수 있습니다.
다음으로, newrelic.yml 파일에서 사용자 정의 추적을 활성화합시다:
common: &default_settings
#...
enable_custom_tracing: true
애플리케이션을 다시 실행하면 추가 정보를 확인할 수 있습니다:
우리는 특정 쿼리를 데이터에서 실행하고자 할 때 사용자 정의 속성을 사용합니다. 방금 생성한 매개변수를 예로 사용하는 쿼리를 작성해봅시다:
SELECT count(`USD-AUD`) FROM `Transaction` SINCE 24 hours ago UNTIL now TIMESERIES
이 쿼리는 아래와 유사한 시간 시리즈를 생성합니다:
[
{
"metadata": {
"timeSeries": {
"messages": [],
"contents": [
{
"function": "count",
"attribute": "USD-AUD",
"simple": true
}
]
},
"eventTypes": [
"Transaction"
],
"eventType": "Transaction",
"messages": [],
"rawSince": "24 HOURS AGO",
"rawUntil": "NOW",
"rawCompareWith": ""
},
"total": {
"results": [
{
"count": 1
}
],
"beginTimeSeconds": 1736759267,
"endTimeSeconds": 1736845667
}
}
]
시간 시리즈에서, 우리는 24시간 조회 기간 동안 우리의 서비스가 단 한 번 호출되었음을 알 수 있습니다.
5. 경고 구성
뉴렐릭의 또 다른 유용한 기능은 경고로, 애플리케이션의 성능이나 활동 중 발생하는 문제나 이상 징후를 통지하는 조기 경고를 구성할 수 있게 해줍니다. 우리는 다양한 메트릭을 사용하는 경고를 뉴렐릭 관리 포털에서 구성합니다. 우리의 경고 조건으로 사용할 사용자 지정 메트릭을 설정합시다:
//...
Double cachedRate = redisTemplate.opsForValue().get(cacheKey);
if (cachedRate != null) {
logger.info("Cache hit for key: {}", cacheKey);
return amount * cachedRate;
} else {
logger.info("Cache miss for key: {}, fetching from API", cacheKey);
NewRelic.incrementCounter("Custom/CacheMisses");
}
//...
캐시 미스를 만날 때마다, 우리는 제공된 metricTimesliceName과 관련된 메트릭 카운터를 증가시킵니다. 그런 다음 이 메트릭을 모니터링하기 위한 조건을 구성합니다.
뉴렐릭 관리 포털로 이동하여 Alerts -> Alert Conditions를 선택하고 ‘New alert condition‘을 선택합니다. 여기서, 우리는 권장된 가이드 모드를 사용하여 조건을 생성합니다. 우리의 metricTimesliceName은 자바 에이전트가 실행 중인 애플리케이션에서 메트릭을 수집한 후에만 Services – APM -> ENTITY_NAME -> Other Metrics 아래에 나타날 것입니다.
우리는 가이드 모드를 사용하여 Alert Policy를 생성하며, 여기서 경고 조건을 그룹화하고 사용자 지정 경고 알림이 있는 워크플로와 연결합니다. 애플리케이션에서 이 조건을 트리거하는 요청을 몇 차례 진행한 후, Alert Policy가 경고를 트리거하고 관련 워크플로가 발동될 것입니다:
6. 결론
이번 기사에서는 뉴렐릭 자바 에이전트의 기능과 그것이 우리의 애플리케이션 가시성을 어떻게 향상시킬 수 있는지를 살펴보았습니다. 우리는 트레이스가 시스템 내 요청을 추적하는 데 어떻게 도움이 되는지를 보았고, 사용자 정의 계측으로 텔레메트리를 풍부하게 하는 방법과 조기 경고 알림 구성을 알아보았습니다.
항상 그렇듯이, 코드는 GitHub에서 확인할 수 있습니다.