OpenTelemetryおよびその他のトレーサの構成

Application Performance Monitoringでは、JaegerやZipkinなどのOpenTelemetryおよびオープンソースのトレース・ツールがサポートされています。

Application Performance Monitoring (APM)では、OpenTelemetry (OTLP)スパンおよびメトリック、ZipkinおよびJaegerスパンを取り込むことができます。

APMでは、APMエージェントとオープン・ソース・トレーサ間のコンテキスト伝播もサポートされています。

トレース・サンプリングの決定で、トレース・データを小さく保つためにトレースおよびスパンがサンプリングされるようにしますが、代表的な場合、APMは、オープン・ソース・トレーサによってルート・スパンが生成される場合に、オープン・ソース・トレーサによって行われたサンプリング決定に準拠します。トレースにAPMブラウザ・エージェントが含まれている場合は、ブラウザ・エージェントで発生したすべてのトレースがサンプリングされます。

既存の分散トレース・システム設定があり、Application Performance Monitoringに切り替える場合は、次のタスクを実行して、オープンソース・トレーサを使用して収集されたデータがApplication Performance Monitoringに流れるようにする必要があります:
  • コンテキスト伝播を構成して、適切な形式で伝播されたトレース・コンテキスト情報を取得し、それを1つ以上のHTTPリクエスト・ヘッダーに追加します。
  • Application Performance Monitoringに受け入れられる形式でスパンをレポートするようにオープンソース・トレーサを構成します(OpenTelemetryプロトコルおよびJSONエンコードされたZipkin v2がサポートされています)。
  • オープンソース・トレーサを構成して接続し、APMコレクタURLにトレース・データを送信します。

次の各項では、APMにデータを送信するためのオープン・ソース・データ・ソースの構成方法、適用可能な場合はコンテキスト伝播の構成方法などについて説明します。

OpenTelemetryデータ・ソースの構成

ここでは、モニタリング・データ(メトリックおよびトレース)をApplication Performance MonitoringにアップロードするためのOpenTelemetry (OTEL)データ・ソース(インストゥルメンテーション・ライブラリやOpenTelemetryコレクタなど)の構成について説明します。

OTEL互換エンドポイントの使用

OpenTelemetryを使用してデータをApplication Performance Monitoringにアップロードするには、OTELデータ・アップロード・エンドポイントとして次を指定します:

ノート

データ・ソース・タイプに応じて、OTELデータ・アップロード・エンドポイントを構成ファイル、環境変数、コードまたはユーザー・インタフェースで指定できます。
  1. トレースをApplication Performance MonitoringにアップロードするようにAPMデータ・アップロード・エンドポイントを設定します。

    トレースは、公開または非公開のデータ・キーで認証できます。

    • 公開データ・キーで認証されたトレースの場合は、次を追加します:

      https://<dataUploadEndpoint>/20200101/opentelemetry/public/v1/traces

    • プライベート・データ・キーで認証されたトレースの場合は、次を追加します:

      https://<dataUploadEndpoint>/20200101/opentelemetry/private/v1/traces

    たとえば、トレースが公開データ・キーで認証されている場合、APMデータ・アップロード・エンドポイントは次のようになります:

    https://aaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/opentelemetry/public/v1/traces

  2. 次のAPMデータ・アップロード・エンドポイントを追加して、メトリックをApplication Performance Monitoringにアップロードします:

    https://<dataUploadEndpoint>/20200101/opentelemetry/v1/metrics

    メトリックは、常にプライベート・データ・キーで認証されます。

前述のAPMデータ・アップロード・エンドポイントは、データをレポートするためのOpenTelemetry標準を提供します。これらのコールは問合せパラメータを受け入れません。データ・キーは、次のようなヘッダーとして提供されます: “Authorization”: “dataKey aaaabbbbccc”

ノート

  • 一部のOpenTelemetryクライアントは、/v1/tracesまたは/v1/metrics接尾辞を自動的に追加しますが、それ以外は追加しません。サフィクスを追加しない場合は、構成内のURLの一部として指定する必要があります。APMは、JSONおよびプロトコル・バッファ(protobuf)でエンコードされたデータをサポートしています。これらはContent-Typeヘッダーに明示的に指定する必要がありますが、通常、これはOTELライブラリ/コレクタによって自動的に実行されます。
  • スパン・リンクはサポートされていません。

Node.jsの例

Node.jsのOpenTelemetryコードの例を次に示します。boldのAPMデータ・アップロード・エンドポイントの変更を参照してください:
const opentelemetry = require("@opentelemetry/sdk-node");
const {
 getNodeAutoInstrumentations,
} = require("@opentelemetry/auto-instrumentations-node");
const {
 OTLPTraceExporter,
} = require("@opentelemetry/exporter-trace-otlp-http");

  const sdk = new opentelemetry.NodeSDK({
traceExporter: new OTLPTraceExporter({
  url: "https://aaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/opentelemetry/private/v1/traces",
  headers: {"Authorization": "dataKey AAAAABBBBBCCCC"},
 }),

  instrumentations: [getNodeAutoInstrumentations()]
});

 sdk.start()
(base) [ssirajud@ssirajud node_with_opentelemetry]$

Javaエージェントの例

JavaエージェントのOpenTelemetryコードの例を次に示します。boldのAPMデータ・アップロード・エンドポイントの変更を参照してください:
export OTEL_TRACES_EXPORTER=otlp
export OTEL_SERVICE_NAME=my-service
export OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_TRACES_HEADERS="authorization=dataKey 1111aaaabbbccc"
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://aaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/opentelemetry/private/v1/traces/
export OTEL_METRICS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=https://aaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/opentelemetry/v1/metrics
export OTEL_EXPORTER_OTLP_METRICS_HEADERS="authorization=dataKey 1111aaaabbbccc"
export OTEL_EXPORTER_OTLP_METRICS_PROTOCOL=http/protobuf

Jaegerデータ・ソースの設定

ここでは、分散トレースにJaegerクライアントを使用するJavaアプリケーションのコードに対して行う必要のある変更について説明します。これを使用して、トレースをApplication Performance Monitoringにアップロードします。

Jaegerトレーサを使用してJavaアプリケーションからApplication Performance Monitoringにトレースをアップロードするには、Jaeger JavaクライアントをZipkin互換(Zipkin v2形式のレポート)用に構成し、Application Performance MonitoringコレクタURLを追加する必要があります。これを行うには、サービスのコードを次のように変更する必要があります:

  1. 必要なJaegerクライアント依存関係とともに、pom.xmlファイルに次の依存関係を追加します。
    <dependency>
        <groupId>io.zipkin.reporter2</groupId>
        <artifactId>zipkin-sender-urlconnection</artifactId>
        <version>2.15.0</version>
    </dependency>
    <dependency>
        <groupId>io.jaegertracing</groupId>
        <artifactId>jaeger-zipkin</artifactId>
        <version>1.3.2</version>
    </dependency>
  2. ZipkinV2Reporterを使用して、Zipkin 2レポータをJaegerレポータ・インタフェースに適応させ、JaegerスパンをJSONエンコードされたZipkin v2フォーマットに変換します。スパンをApplication Performance MonitoringにアップロードするためのApplication Performance MonitoringコレクタURLと、サービスまたはアプリケーションの名前を指定したことを確認します。
    import io.jaegertracing.Configuration;
    import io.jaegertracing.zipkin.ZipkinV2Reporter;
    import zipkin2.reporter.AsyncReporter;
    import zipkin2.reporter.urlconnection.URLConnectionSender;
     
    /* .... */
     
    ZipkinV2Reporter reporter = new ZipkinV2Reporter(AsyncReporter.create(URLConnectionSender.create("<Application Performance Monitoring collector URL>")));
    JaegerTracer tracer = Configuration
        .fromEnv("<service-name>")
        .getTracerBuilder()
        .withReporter(reporter)
        .withSampler(new ConstSampler(true))
        .build();
     
    /* .... */
  3. B3伝播(b3ヘッダーの仕様)を使用するために、B3TextMapCodecを登録します。これらのヘッダーは、サービス境界をまたぐトレース・コンテキスト伝播に使用されます。
    import io.jaegertracing.Configuration;
    import io.jaegertracing.internal.propagation.B3TextMapCodec;
    import io.opentracing.propagation.Format;
     
    /* .... */
     
    B3TextMapCodec b3Codec = new B3TextMapCodec.Builder().build();       
    JaegerTracer tracer = Configuration
        .fromEnv("<service-name>")
        .getTracerBuilder()
        .registerInjector(Format.Builtin.HTTP_HEADERS, b3Codec)
        .registerExtractor(Format.Builtin.HTTP_HEADERS, b3Codec)
        .build();
     
    /* .... */

    環境構成(Configuration.fromEnv())を使用してJaegerトレーサを作成する場合、JAEGER_PROPAGATION環境変数をb3cに設定すると、コードの変更なしでZipkin(B3)コンテキスト伝播モードが設定されることに注意してください。

Zipkinデータ・ソースの設定

ここでは、分散トレースにZipkinクライアントを使用するNode.jsアプリケーションのコードに対して行う必要のある変更について説明します。これを使用してトレースをApplication Performance Monitoringにアップロードします。

これを行うには、Zipkinトレーサ初期化コードを次のように変更します:

  1. JSONエンコードされたZipkin v2フォーマットでスパンをレポートするために必要な変更を加えたことを確認します。

    Zipkinのv2形式の詳細は、Zipkin 2を参照してください。

  2. スパンをApplication Performance MonitoringにアップロードするためのApplication Performance MonitoringコレクタURLと、サービスまたはアプリケーションの名前を追加します。
  3. Zipkinのスパン結合機能が有効になっている場合は、無効にします。OpenTracing仕様では、同じトレース内の異なるスパン間でスパンIDを共有できないため、この機能は無効にする必要があります。

Node.jsの例

ここでは、Zipkinトレーサ初期化コードのサンプルを示します。手順で説明されている変更部分は太字になっています。

const {
  Tracer,
  BatchRecorder,
  jsonEncoder: {JSON_V2}
} = require('zipkin');
 
const CLSContext = require('zipkin-context-cls');
const {HttpLogger} = require('zipkin-transport-http');
 
// Setup the tracer
const tracer = new Tracer({
  ctxImpl: new CLSContext('zipkin'), // implicit in-process context
  recorder: new BatchRecorder({
    logger: new HttpLogger({
      endpoint: '<Application Performance Monitoring collector URL>', //Span collection endpoint URL setting
      jsonEncoder: JSON_V2 //Span format and encoding setting
    })
  }), // batched http recorder
  localServiceName: '<service-name>', // name of the application/service
  supportsJoin: false //Span join disable setting
});

APMコレクタURLフォーマット

Application Performance Monitoringサービスと通信するようにオープンソース・トレーサを構成する際には、Application Performance MonitoringコレクタURLが必要です。このトピックでは、APMコレクタURLフォーマットの詳細を示します。

Application Performance MonitoringコレクタURLのフォーマットは次のとおりです:

<dataUploadEndpoint>/<API version>/observations/<observationType>?dataFormat=<dataFormat>&dataFormatVersion=<dataFormatVersion>&dataKey=<dataKey>

APMドメインの詳細ページから<dataUploadEndpoint>値を取得します。

パラメータ 説明 使用可能な値

<dataUploadEndpoint>

これは、APMドメインのdataUploadEndpointの値と同じ値です。ユーザーは、この値をAPMドメインの詳細ページから取得できます。 文字列値。

例: https://aaaabbbb.apm-agt.us-ashburn-1.oci.oraclecloud.com

<API version> APIバージョン番号。

20200101

<observationType> 取得する監視のタイプ。

公開データ・キーでスパンを送信する場合はpublic-span

秘密データ・キーを使用してスパンを送信する場合はprivate-span

メトリックの送信時にmetric

<dataFormat> 監視のデータ・フォーマット。

zipkin

otlp-metric

otlp-span

<dataFormatVersion> 監視のデータ・フォーマット・バージョン。

Zipkin V2、otlp-metricおよびotlp-span形式がサポートされています。

otlp-metricおよびotlp-spanの場合は1

Zipkinv V2の場合は2

<dataKey> 監視のデータ・キー。

この値はAPMドメインの詳細ページから取得できます。

文字列値。

例: 1111OLQSUZ5Q7IGN

Zipkinの例

次のAPMコレクタURLでは、監視タイプpublic-span、データ・フォーマットzipkin、データ・フォーマット・バージョン2およびデータ・キー11115Q7IGNを使用しています:
https://aaaabbbb.example.us-ashburn-1.oci.oraclecloud.com/20200101/observations/public-span?dataFormat=zipkin&dataFormatVersion=2&dataKey=11115Q7IGN
ノート

場合によっては、Zipkin構成URLをベースURLおよび相対パスに分割する必要があります。たとえば、Spring Sleuthを使用するアプリケーションでは、前述のURLを次のように設定する必要があります。
spring.zipkin.baseUrl =  https://aaaabbbb.example.us-ashburn-1.oci.oraclecloud.com
spring.zipkin.apiPath = /20200101/observations/public-span?dataFormat=zipkin&dataFormatVersion=2&dataKey=11115Q7IGN

OpenTelemetryの例

次のAPMコレクタURLは、監視タイプprivate-span、データ形式otlp-span、データ形式バージョン1およびデータ・キー11112222UZ5を使用します:
https://aaaabbbb.example.us-phoenix-1.oci.oraclecloud.com/20200101/observations/private-span?dataFormat=otlp-span&dataFormatVersion=1&dataKey=11112222UZ5

OpenTelemetry考慮事項

  • observationTypeには、public-spanprivate-spanまたはmetricを指定できます。
  • dataFormatパラメータは、データに応じてotlp-metricまたはotlp-spanである必要があります。
  • dataFormatVersionパラメータは1である必要があります。

APMとオープン・ソースの相互運用性

コンテキスト伝播を構成して、適切な形式で伝播されたトレース・コンテキスト情報を取得し、それを1つ以上のHTTPリクエスト・ヘッダーに追加します。トレース・コンテキストを使用すると、異なるマイクロサービスから発生するが同じトランザクション(トレース)に属し、共通のトレースIDで識別されるスパンを相関させることができます。

APMエージェント/トレーサ

完全なトレースを作成するために、APM Javaエージェント/トレーサを他のOpenTracingトレーサ(JaegerやZipkinなど)と連携するように構成できます。

HTTPコールが発生すると、APM Javaエージェント/トレーサはHTTPヘッダーをそのコールに追加しようとします。反対側の端でこれが読み取られると、スパン同士を結合するのに役立ちます。

このフォーマットは、エージェントの構成ディレクトリのAgentConfig.propertiesファイルにあるcom.oracle.apm.agent.tracer.propagation.typeプロパティを介して変更できます。

プロパティを名前に設定することで、次の伝播タイプを利用できます:

各種のトレーサが連携して完全なトレースを形成できるように、適切な伝播タイプを設定します。

OpenTelemetry、Zipkin & Jaeger

  • OpenTelemetry: OpenTelemetryは、W3CおよびB3コンテキスト伝播をサポートしています。詳細は、「コンテキスト・プロパゲータ分布」を参照してください。

  • Zipkin: APMはZipkin形式(B3)を使用してトレース・コンテキストを伝播するため、Zipkinトレーサに追加の構成は必要ありません。

  • Jaeger: Zipkin形式(B3)でトレース・コンテキストを消費および伝播するようにJaegerを構成するか、com.oracle.APM.tracer.propagation.typeプロパティを設定してJaeger伝播コンテキストを使用するようにAPM Java Agentを構成できます。