New Relic for Java 簡介
1. 概述
New Relic的應用程式效能監控 (APM) 幫助我們在一個地方監控和分析我們的應用程式和微服務的效能。它消除了使用單獨的工具來追蹤不同系統組件的需要,從而使效能管理變得更加容易。
New Relic Java 代理程式不斷監控我們的應用程式是否有效能問題和錯誤。它定期將指標和事件數據發送到 New Relic 儀表板,我們可以在那裡審查和改進應用程式的效能。
在本教程中,我們將討論 New Relic Java 代理程式的幾個功能,包括追蹤、自訂檢測和警報,這些功能可以提高我們觀察和優化應用程式的能力。
2. 設定
我們將展示 New Relic Java 代理程式提供的一些功能,使用CurrencyConverterService
查詢貨幣匯率 API 並將結果緩存在 Redis 中。首先,讓我們建立一個 New Relic 帳號。
在註冊頁面,我們可以使用公司電子郵件地址,也可以從可用的第三方授權提供者中進行選擇。註冊後,我們將設定Java代理。 New Relic 提供兩種選項:UI 開機啟動器或手動安裝。對於此範例,我們繼續手動安裝。
我們將使用 Apache Maven 下載newrelic-java.zip
文件,其中包含所有Java 代理程式元件。讓我們將此依賴項新增到我們的 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 插件,並按照說明將 Java 代理程式提取到目標目錄中:
<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
資料夾中。我們配置插件以排除newrelic.yml
文件,以防止每次 Maven 重新提取代理時它都被覆蓋。
接下來,我們使用自訂設定來配置 New Relic 代理程式的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
權限,以僅允許應用程式進程的擁有者俱有讀寫存取權限。在Linux系統上,我們使用以下命令:
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
是在我們建立 New Relic 帳戶時頒發的。接下來,讓我們透過啟動應用程式來測試我們的設定:
java -javaagent:/path/to/newrelic.jar -jar /path/to/currency-converter-0.0.1.jar
過一會兒,我們就會看到我們的服務列在[one.newrelic.com](https://one.newrelic.com) -> APM & Services
下。
3. 追蹤請求
與其他 APM(應用程式效能監控)工具一樣,New Relic 讓我們可以直觀地追蹤請求的旅程。讓我們向我們的服務發出一個請求來看看此功能的實際效果:
curl --request GET \
--url 'http://localhost:8080/api/currency/convert?targetCurrency=GBP&amount=100'
接下來,讓我們導航到 New Relic 管理入口網站 -> Traces
並從清單中選擇我們的追蹤。我們應該看到類似以下螢幕截圖的流程:
我們的請求查找了 Redis 緩存,遇到緩存未命中,調用貨幣匯率 API,並將結果儲存在 Redis 快取中。
4. 實作自訂儀表
雖然 Java 代理程式會自動產生有用的效能數據,但它還允許我們透過Java 代理 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
註解指示 Java 代理程式測量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. 配置警報
New Relic 的另一個實用功能是它的警報,它讓我們配置早期警告,以通知我們應用程式效能或活動中的問題或異常。我們使用一系列可用指標在 New Relic 管理入口網站中配置這些警報。讓我們配置自己的指標以用於警報條件:
//...
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
關聯的指標計數器。接下來,我們配置一個條件來監控這個指標。
讓我們導航到 New Relic 管理入口網站-> Alerts -> Alert Conditions
並選擇「 New alert condition
」。從那裡,我們將使用建議的引導模式來創建我們的條件。只有當 Java 代理從我們正在運行的應用程式收集指標後,我們的metricTimesliceName
才會出現在Services – APM -> ENTITY_NAME -> Other Metrics
下。
我們將使用引導模式建立**Alert Policy
,該策略將警報條件分組並將它們連結到具有自訂警報通知的工作流程**。在我們的應用程式上發出一些觸發條件的請求後, Alert Policy
將觸發警報和相關的工作流程:
6. 結論
在本文中,我們探討了 New Relic Java 代理功能以及它們如何增強我們應用程式的可觀察性。我們了解了追蹤如何幫助追蹤系統中的請求、如何使用自訂儀器豐富我們的遙測數據以及如何配置預警通知。
與往常一樣,程式碼可在 GitHub 上取得。