これらの Java チュートリアルを試して、New Relic プラットフォームが OTLP データで何ができるかを確認してください。選択できる 3 つのチュートリアルがあり、それぞれ同じデモ Spring アプリを使用しています。アプリはフィボナッチ数列の n 番目の数値を計算し、トレース、メトリクス、ログを生成します。
これらのチュートリアルに取り組むことで、OpenTelemetry と New Relic を使用して独自のアプリをセットアップするのに役立つスキルを習得できます。
これらのチュートリアルのいずれかを終了すると、JVM メトリックを次のようなグラフで表示できます。
要件
始めるには、次のものが揃っていることを確認してください。
- New Relic アカウント:無料アカウントをまだお持ちでない場合は、サインアップしてください。
- Java 17 以降: まだお持ちでない場合は、こちらのダウンロード オプションを参照してください。
チュートリアル
各チュートリアルでは同じデモ アプリを使用しますが、OpenTelemetry と New Relic に慣れるのに役立つ異なるアプローチが用意されています。
- プレインストゥルメント化されたアプリ: プレインストゥルメント化されたデモ アプリを実行すると、UI でデータを簡単に確認できます。
- OpenTelemetry Java エージェント: OpenTelemetry Java エージェントを使用してデモ アプリを監視します。
- 手動セットアップ: デモアプリを手動でインストルメントしました。
完了したいチュートリアルに応じて、下のタブをクリックしてください。
ヒント
OpenTelemetry を使用する場合、OTLP 経由でアプリケーションから New Relic にデータをエクスポートするには 2 つの選択肢があります。
アプリから New Relic に直接
アプリは OpenTelemetry Collector にデータを送信し、そこで New Relic にエクスポートされます。
これらのチュートリアルでは、最初のオプションについて説明します。コレクター経由でデータをエクスポートする場合は、このコレクターのドキュメントで詳細を確認してください。
事前にインストルメント化されたデモ アプリを実行する
これは、New Relic にデータを送信して UI で表示することがどのようなものかをすぐに確認できるように、インストルメンテーションを当社に実行してもらいたい場合に最適なオプションです。
ターミナルで次のコマンドを実行してデモ アプリのクローンを作成し、Getting Started Guides の
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 データセンターのリージョンが EU で US ではない場合、エンドポイントを次のように設定します。
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
以下の最初の環境変数を設定してサービスに名前を付け、次に 2 番目の環境変数をサービス インスタンス 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
同じ
getting-started-guides/java
ディレクトリで、アプリケーションをビルドして実行します。マックOS:
bash$./gradlew bootRunパワーシェル:
bash$.\gradlew.bat build
新しいターミナル タブを開き、
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 の値に置き換えます。エラーを生成するには、有効範囲外の整数を挿入します。one.newrelic.com > All capabilities > APM & servicesに移動します。
getting-started-java
という新しいエンティティ (サービス) をクリックして、UI を調べます。UI で何を探すべきかについてのその他のヒントについては、New Relic でデータを表示するを参照してください。UI でデータを見終わったら、両方のターミナル セッションで CONTROL+C を押してアプリケーションをシャットダウンします。
OpenTelemetry Java エージェントを使用してデモ アプリを監視する
これは、同じデモ アプリを使用する別のチュートリアルです。この場合、OpenTelemetry Java エージェントを使用して、デモ アプリを自動的に監視します。Java ソース コードを変更する必要はありません。エージェントを使用すると、New Relic へのサンプル データのエクスポートをすぐに開始できます。
自動インスツルメンテーション エージェントは、バイトコードを動的に挿入して一般的なライブラリやフレームワークからテレメトリを取得する JAR ファイルです。また、インバウンド要求、アウトバウンド HTTP 呼び出し、およびデータベース呼び出しなどのデータをキャプチャするためにも使用できます。任意の Java 8+ アプリケーションにアタッチできます。
ヒント
追加の構成オプションについては、 Java エージェントの公式ドキュメントを参照してください。
OpenTelemetry Java エージェントを使用してデモ アプリを監視するには:
エージェントとインストルメンテーション ライブラリを含むエージェント JAR ファイルをダウンロードします。好みのディレクトリに配置し、後で使用するパスを書き留めます。
まだ行っていない場合は、デモ アプリケーション リポジトリをダウンロードして、次のディレクトリに切り替えます。
bash$git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git$cd newrelic-opentelemetry-examples/getting-started-guides/java次のコマンドでデモ アプリをビルドします。
マックOS:
bash$./gradlew buildパワーシェル:
bash$.\gradlew.bat buildヒント
ビルドが成功すると、結果として得られるアプリケーション JAR ファイルが
Uninstrumented/build/libs
にあり、その名前はuninstrumented.jar
になります。
以下の環境変数の参照セクションに移動して、エクスポートする必要がある変数を確認してから、これらの手順に戻ります。
getting-started-guides/java/Uninstrumented
に進み、アプリでエージェントを起動します。重要
path/to
を、以前にダウンロードした JAR ファイルの場所に置き換えます。bash$java -javaagent:path/to/opentelemetry-javaagent.jar \>-jar ./build/libs/uninstrumented.jargetting-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 の値に置き換えます。エラーを生成するには、有効範囲外の整数を挿入します。New Relic にデータを送信したので、UI でデータを表示する手順を参照してください。
UI でデータを見終わったら、両方のターミナル セッションで CONTROL+C を押してアプリケーションをシャットダウンします。
デモアプリを手動でセットアップする
前のチュートリアルは、OpenTelemetry Java エージェントを使用した自動インストゥルメンテーションを探索するのに役立ちました。 このチュートリアルでは、カスタムインストゥルメンテーションを使用して、収集したテレメトリーをより詳細に制御する方法を説明します。 インストゥルメンテーションをデモアプリに手動で挿入してテレメトリーをキャプチャし、そのデータを New Relic にエクスポートするように SDK を設定します。
ヒント
SDK を手動で構成することもできますが、 自動構成オプションを使用して SDK を構成する方法を紹介します。これにより、環境変数とシステム プロパティを使用してプロセスが簡素化されます。
デモアプリケーションをダウンロードする
デモ アプリをまだダウンロードしていない場合は、次を実行します。
$git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git
依存関係のインストール
依存関係を追加するには:
アプリケーション ディレクトリに移動します。
bash$cd newrelic-opentelemetry-examples/getting-started-guides/java/uninstrumentedbuild.gradle
を開きます。次の強調表示された項目を
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 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'}メモ:
bom
(部品表) 依存関係は、特定のエコシステムの依存関係のバージョンを同期するために使用されます。OpenTelemetry は多数の Java コンポーネントを公開しているため、使用するコンポーネントが少数であろうと多数であろうと、これらはすべてのバージョンが確実に同期されるようにするのに役立ちます。- 残りの依存関係は、SDK、API、OTLP エクスポーター、および計測ライブラリへのアクセスを提供します。
- spring-boot-starter-logging モジュールを除外する追加の構成があります。これにより、
log4j-slf4j-impl cannot be present with log4j-to-slf4j
に関連するビルド エラー メッセージが表示されなくなります。
autoconfigure 拡張機能を使用して SDK を構成する
SDK を手動で構成することもできますが、プロセスが合理化されるため、自動構成拡張機能を使用することをお勧めします。
アプリのソース コード ディレクトリに移動します。
bash$cd newrelic-opentelemetry-examples/getting-started-guides/java/uninstrumented/src/main/java/com/example/demoApplication.java
を開きます。強調表示された行を挿入します。
@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;}}以下の環境変数の参照セクションに移動して、エクスポートする必要がある変数を確認してから、これらの手順に戻ります。
インストルメンテーション ライブラリの追加: トレース
Application.java
で、トレース フィルタを登録して、強調表示されている Spring Web MVC のインストルメンテーションを追加します。
@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(); }}
インストルメンテーション ライブラリの追加: メトリクス
Application.java
ファイルに以下を登録して、Java ランタイムに関する指標を生成および収集します。以下の強調表示された行を挿入します。
@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(); }}
インストルメンテーション ライブラリの追加: ログ
このデモ アプリケーションは、 GlobalLoggerProvider
を使用するOpenTelemetryAppender
を( log4j.xml
経由で) 使用するように構成されています。GlobalLoggerProvider
を設定すると、ここで autoconfigure を使用して構成された Log SDK にOpenTelemetryAppender
が接続されます。
Application.java
を開きます。次の強調表示された行を挿入します。
@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();}}Uninstrumented/src/main
にresources
というディレクトリを作成します。この新しいディレクトリに、次の内容の
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
に挿入します。@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"). . .}
カスタム トレース インストルメンテーション: カスタム スパンの作成
必要なスパンを作成できます。特定の操作に関する属性でスパンに注釈を付けるのはあなた次第です。設定した属性は、結果や操作のプロパティなど、追跡している特定の操作に関する追加のコンテキストを提供します。
Controller.java
で、これらの強調表示された行を挿入して、fibonacci
という名前の新しいスパンを開始します。これは次のことを行います:- このメソッドの実行に関するデータをキャプチャします
- ユーザーのリクエストから n の値を格納する属性を設定します
private long fibonacci(long n) {// Start a new span and set your first attributevar span = tracer.spanBuilder("fibonacci").setAttribute(ATTR_N, n).startSpan();. . .}成功したリクエストに関する情報を保存する属性をスパンに追加して、コードに詳細を追加します。
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;}}
カスタム トレース インストルメンテーション: 例外を記録する
発生した例外を記録したい場合があります。これは、スパン ステータスの設定と併せて行うことをお勧めします。まず、スパンを現在のスパンとして設定し、例外が発生した場合にステータス コードをエラーに設定してから、スパンを終了します。
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
に設定します。
@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); }}
前の手順と同様に、これにより、ユーザーが無効な数値を入力した場合にスパンのステータス コードが設定されます。ただし、これはfibonacci()
ではなく例外ハンドラで発生するため、現在のスパンがリクエストの親スパンになります。この親スパンは、Application クラスのフィルターを介して追加された Spring Web MVC インストルメンテーションから取得されます。これで、アプリケーション エンドポイントが例外を発生させると、親スパンと子スパンの両方のスパン ステータスがERROR
になります。
カスタム メトリック インストルメンテーション: カスタム メトリック カウンターを追加します。
メトリックは、個々の測定値を集計に結合し、システム負荷の関数として一定のデータを生成するため、非常に役立つテレメトリ データ タイプです。このデータをスパンと組み合わせて使用すると、傾向を特定し、アプリケーションのランタイム テレメトリを提供できます。また、メトリクスが表す測定値の下位区分を説明するのに役立つ属性でメトリクスに注釈を付けることもできます。
OpenTelemetry メトリクス API は、メトリクス SDK によって集計され、アウト オブ プロセスでエクスポートされる測定値を記録する多数の計測器を定義します。器具には次の 2 種類があります。
同期: これらの計測器は、発生時に測定値を記録します。
非同期: これらの計測器はコールバックを登録します。これはコレクションごとに 1 回だけ呼び出され、関連付けられたコンテキストはありません。
ヒント
OpenTelemetry プロジェクトのメトリックのステータスについて質問がある場合は、シグナル ステータスを参照してください。
カスタム カウンターを追加するには、次の手順を実行します。
カスタム メトリックのブール属性をインスタンス化し、メトリック インストルメントを初期化します。
ヒント
この場合、 LongCounterを使用しています。これは正の値のみを記録し、ネットワーク経由で送信されたバイト数などをカウントするのに役立ちます。デフォルトでは、カウンタ測定値は単調 (常に増加) 合計に集計されます。@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();}. . .}次の強調表示された行を挿入して、カスタム カウンターが有効な入力と無効な入力、およびそれぞれの発生回数をキャプチャできるようにします。
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();}}
カスタムログ計測
OpenTelemetry Java のログ シグナルのステータスは、現在実験段階です。ログ メッセージはアプリのルート ハンドラによって管理され、デフォルトでINFO
レベル以上のログがコンソールに送信されます。ただし、特定のクラスを含めてロギング レベルを変更するか、カスタム ハンドラまたはフィルタをインストールすることで、ロガーの動作を変更できます。
ロガーを初期化する
前述のとおり、これはjava.util.logging
ライブラリからのものです。Logger は OpenTelemetry コンポーネントではありませんが、アプリケーションは Log4j ログを OpenTelemetry Log SDK に送信するように構成されています。
@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"); . . .}
カスタム ログ メッセージを追加する [#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 にデータを送信する準備ができました!
ディレクトリ
getting-started-guides/java
に移動し、次のコマンドでアプリをビルドして実行します:マックOS:
bash$./gradlew bootRunパワーシェル:
bash$.\gradlew.bat buildヒント
端末に Spring ASCII が表示された場合は、アプリが正常にビルドされ、実行されていることを意味します。
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 の値に置き換えます。エラーを生成するには、有効範囲外の整数を挿入します。New Relic にデータを送信したので、UI でデータを表示する手順を参照してください。
New Relic でデモ データを表示する
どのチュートリアルを完了しても、New Relic UI でデータを見つけるための以下のヒントに従うことができます。
one.newrelic.com > All capabilities > APM & services
に移動します。
getting-started-java
という名前の新しいエンティティ (サービス) (または任意の名前) をクリックします。各データ型のセクションで詳細を確認してください。
ヒント
Windows を使用していて、New Relic アカウントにデータが表示されない場合は、ファイアウォールを通過するトラフィックが許可されていることを確認してください。
トレース
New Relic でgetting-started-java
エンティティに到達したら:
左側のペインの
Monitor
セクションで、
Distributed tracing
をクリックし、[
Fibonacci
トレース グループをクリックします。
そこから、エラーのあるトレースを見つけてクリックして開きます。
トレースを開いたら、
Show in-process spans
をクリックし、結果のスパンをクリックすると、右側に詳細パネルが開きます。 ユーザー入力が無効な場合に記録した例外を確認するには、View span events
をクリックします。
手動インストルメンテーション チュートリアルを完了した場合、スパンとして記録した例外が New Relic でどのように表示されるかを以下に示します。
スパン属性、スパン名、ステータス コードなど、設定した追加の詳細を表示するには、 Attributesタブをクリックします。 このペインには、このガイドで使用したインストゥルメンテーション ライブラリによって自動的に収集された追加のメタデータや、New Relic によって添付されたメタデータも表示できます。
データの表示の詳細については、New Relic UI の OpenTelemetry を参照してください。
指標
New Relic のgetting-started-java
エンティティに到達すると、ランタイム メトリック (JVM) やカスタム カウンター属性など、収集されたすべてのメトリックのリストが表示されます。
メトリクスエクスプローラー
これは、メトリックのリストを表示できるツールです。
左側のペインで、 Data > Metrics explorerを選択し、次に
fibonacci.invocations
を選択します。Dimensionsで、収集した属性とカスタムメトリックを表示し、 fibonacci.valid.nをクリックします。
詳しくは、 メトリクス エクスプローラー ビューに関するドキュメントをご覧ください。
JVM
また、JVM ページに移動して、スループット、メモリ使用量、1 分あたりのガベージ コレクション時間など、Java ランタイム メトリックの視覚化を表示することもできます。
単一のインスタンスのメトリックを表示するか、複数のインスタンスを選択して比較できます。
インスタンスを選択してCompareをクリックすると、次のような内容が表示されます。各インスタンスは簡単に識別できるように色分けされています。
詳細については、 JVM ビューに関するドキュメントを参照してください。
ログ
ログにアクセスする場所は次のとおりです。
ターミナルにもログが表示されます。
ログ ビューに戻り、ログを選択すると、ログ メッセージと、関連するスパンやトレース ID などの収集された追加の属性、および New Relic によって挿入されたメタデータが表示されたペインが開きます。
この小さな青いアイコンをクリックすると、相関分散トレースに移動できます。
これにより、相関トレースを表示するペインが開き、トレースに関する詳細を表示できます。このページの詳細については、UI の OpenTelemetry: 分散トレース ページおよび分散トレース UI の理解と使用を参照してください。
分散トレース ビューから相関ログを見つけることもできます。対応するログを持つトレースを選択すると、それがタブとして示され、ビューを切り替えることなくトレースから直接ログを表示できます。
ログ ビューの詳細については、 こちらをご覧ください。
参考:環境変数
これは、チュートリアル 2 または 3 を実行している場合にエクスポートする必要がある環境変数のリストです。変数のエクスポートが完了したら、変数リストに続くリンクを使用してチュートリアルに戻ります。
上記のコラプスにリストされている環境変数を作成したら、チュートリアルに戻ってセットアップを完了します。
次は何ですか?
OpenTelemetry インストルメンテーションと SDK 構成を試したので、学んだことを適用して、OpenTelemetry と New Relic を使用して独自のアプリまたはサービスをセットアップできます。詳細については、OpenTelemetry を使用して独自のアプリまたはサービスをセットアップするを参照してください。