• EnglishEspañol日本語한국어Português
  • ログイン今すぐ開始

この機械翻訳は、参考として提供されています。

In the event of any inconsistency between the English version and the translated version, the English versionwill take priority. Please visit this page for more information.

問題を作成する

OpenTelemetry チュートリアル: サンプル Java アプリを計測する

これらの Java チュートリアルを試して、New Relic プラットフォームが OTLP データで何ができるかを確認してください。選択できる 3 つのチュートリアルがあり、それぞれ同じデモ Spring アプリを使用しています。アプリはフィボナッチ数列の n 番目の数値を計算し、トレース、メトリクス、ログを生成します。

これらのチュートリアルに取り組むことで、OpenTelemetry と New Relic を使用して独自のアプリをセットアップするのに役立つスキルを習得できます。

これらのチュートリアルのいずれかを終了すると、JVM メトリックを次のようなグラフで表示できます。

要件

始めるには、次のものが揃っていることを確認してください。

チュートリアル

各チュートリアルでは同じデモ アプリを使用しますが、OpenTelemetry と New Relic に慣れるのに役立つ異なるアプローチが用意されています。

完了したいチュートリアルに応じて、下のタブをクリックしてください。

ヒント

OpenTelemetry を使用する場合、OTLP 経由でアプリケーションから New Relic にデータをエクスポートするには 2 つの選択肢があります。

  • アプリから New Relic に直接

  • アプリは OpenTelemetry Collector にデータを送信し、そこで New Relic にエクスポートされます。

    これらのチュートリアルでは、最初のオプションについて説明します。コレクター経由でデータをエクスポートする場合は、このコレクターのドキュメントで詳細を確認してください。

事前にインストルメント化されたデモ アプリを実行する

これは、New Relic にデータを送信して UI で表示することがどのようなものかをすぐに確認できるように、インストルメンテーションを当社に実行してもらいたい場合に最適なオプションです。

  1. ターミナルで次のコマンドを実行してデモ アプリのクローンを作成し、Getting Started Guides のjavaディレクトリに移動します。

    bash
    $
    git clone https://github.com/newrelic/newrelic-opentelemetry-examples.git
    $
    cd newrelic-opentelemetry-examples/getting-started-guides/java
  2. 次の 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
  3. 以下の最初の環境変数を設定してサービスに名前を付け、次に 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

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

      ヒント

      ビルドが成功すると、結果として得られるアプリケーション JAR ファイルが Uninstrumented/build/libsにあり、その名前は uninstrumented.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_VALUEINSERT_A_VALUEを 1 から 90 の値に置き換えます。エラーを生成するには、有効範囲外の整数を挿入します。

  7. New Relic にデータを送信したので、UI でデータを表示する手順を参照してください。

  8. UI でデータを見終わったら、両方のターミナル セッションで CONTROL+C を押してアプリケーションをシャットダウンします。

デモアプリを手動でセットアップする

前のチュートリアルは、OpenTelemetry Java エージェントを使用した自動インストゥルメンテーションを探索するのに役立ちました。 このチュートリアルでは、カスタムインストゥルメンテーションを使用して、収集したテレメトリーをより詳細に制御する方法を説明します。 インストゥルメンテーションをデモアプリに手動で挿入してテレメトリーをキャプチャし、そのデータを 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に関連するビルド エラー メッセージが表示されなくなります。

autoconfigure 拡張機能を使用して 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を設定すると、ここで autoconfigure を使用して構成された Log 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 によって集計され、アウト オブ プロセスでエクスポートされる測定値を記録する多数の計測器を定義します。器具には次の 2 種類があります。

  • 同期: これらの計測器は、発生時に測定値を記録します。

  • 非同期: これらの計測器はコールバックを登録します。これはコレクションごとに 1 回だけ呼び出され、関連付けられたコンテキストはありません。

    ヒント

    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ライブラリからのものです。Logger は OpenTelemetry コンポーネントではありませんが、アプリケーションは Log4j ログを OpenTelemetry Log SDK に送信するように構成されています。

@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_VALUEINSERT_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. そこから、エラーのあるトレースを探し、クリックして開きます。

    ヒント

    OpenTelemetry Java エージェントでは、 New Relic APM Java エージェントとは異なる結果が表示される場合があります。これは、2 つのエージェント タイプ間でエラー処理に違いがあるためです。詳細については、 OpenTelemetryおよびNew Relicでのエラー率の処理」を参照してください。

  3. トレースを開いたら、 Show in-process spansクリックし、結果のスパンをクリックすると、右側に詳細パネルが開きます。 ユーザー入力が無効な場合に記録した例外を表示するには、 View span eventsをクリックします。

手動インストルメンテーション チュートリアルを完了した場合、スパンとして記録した例外が New Relic でどのように表示されるかを以下に示します。

スパン属性、スパン名、ステータス コードなど、設定した追加の詳細を表示するには、 Attributesタブをクリックします。 このペインには、このガイドで使用したインストゥルメンテーション ライブラリによって自動的に収集された追加のメタデータや、New Relic によって添付されたメタデータも表示できます。

データの表示の詳細については、New Relic UI の OpenTelemetry を参照してください。

指標

New Relic のgetting-started-javaエンティティに到達すると、ランタイム メトリック (JVM) やカスタム カウンター属性など、収集されたすべてのメトリックのリストが表示されます。

メトリクスエクスプローラー

これは、メトリックのリストを表示できるツールです。

  1. 左側のペインで、 Data > Metrics explorerを選択し、次にfibonacci.invocationsを選択します。

  2. Dimensionsで、収集した属性とカスタムメトリックを表示し、 fibonacci.valid.nをクリックします。

詳しくは、 メトリクス エクスプローラー ビューに関するドキュメントをご覧ください。

JVM

また、JVM ページに移動して、スループット、メモリ使用量、1 分あたりのガベージ コレクション時間など、Java ランタイム メトリックの視覚化を表示することもできます。

単一のインスタンスのメトリックを表示するか、複数のインスタンスを選択して比較できます。

インスタンスを選択してCompareをクリックすると、次のような内容が表示されます。各インスタンスは簡単に識別できるように色分けされています。

詳細については、 JVM ビューに関するドキュメントを参照してください。

ログ

ログにアクセスする場所は次のとおりです。

ターミナルにもログが表示されます。

ログ ビューに戻り、ログを選択すると、ログ メッセージと、関連するスパンやトレース ID などの収集された追加の属性、および New Relic によって挿入されたメタデータが表示されたペインが開きます。

この小さな青いアイコンをクリックすると、相関分散トレースに移動できます。

これにより、相関トレースを表示するペインが開き、トレースに関する詳細を表示できます。このページの詳細については、UI の OpenTelemetry: 分散トレース ページおよび分散トレース UI の理解と使用を参照してください。

分散トレース ビューから相関ログを見つけることもできます。対応するログを持つトレースを選択すると、それがタブとして示され、ビューを切り替えることなくトレースから直接ログを表示できます。

ログ ビューの詳細については、 こちらをご覧ください。

参考:環境変数

これは、チュートリアル 2 または 3 を実行している場合にエクスポートする必要がある環境変数のリストです。変数のエクスポートが完了したら、変数リストに続くリンクを使用してチュートリアルに戻ります。

上記のコラプスにリストされている環境変数を作成したら、チュートリアルに戻ってセットアップを完了します。

次は何ですか?

OpenTelemetry インストルメンテーションと SDK 構成を試したので、学んだことを適用して、OpenTelemetry と New Relic を使用して独自のアプリまたはサービスをセットアップできます。詳細については、OpenTelemetry を使用して独自のアプリまたはサービスをセットアップするを参照してください。

Copyright © 2024 New Relic株式会社。

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