OpenTelemetryおよびその他のトレーサの構成
Application Performance Monitoringでは、OpenTelemetryおよびJaegerやZipkinなどのオープンソースのトレース・ツールがサポートされています。
Application Performance Monitoring (APM)は、OpenTelemetry (OTLP)スパンとメトリック、およびZipkinとJaegerスパンを取り込むことができます。
APMでは、APMエージェントとオープン・ソース・トレーサ間のコンテキスト伝播もサポートされています。
トレース・サンプリングの決定で、トレース・データを小さく保つためにトレースおよびスパンがサンプリングされるようにしますが、代表的な場合、APMは、オープン・ソース・トレーサによってルート・スパンが生成される場合に、オープン・ソース・トレーサによって行われたサンプリング決定に準拠します。トレースにAPMブラウザ・エージェントが含まれている場合は、ブラウザ・エージェントで発生したすべてのトレースがサンプリングされます。
- コンテキスト伝播を構成して、適切な形式で伝播されたトレース・コンテキスト情報を取得し、それを1つ以上のHTTPリクエスト・ヘッダーに追加します。
- Application Performance Monitoringに受け入れられるフォーマットでスパンをレポートするようにオープンソース・トレーサを構成します(OpenTelemetryプロトコルおよびJSONエンコードのZipkin v2がサポートされています)。
- オープンソース・トレーサを構成して接続し、APMコレクタURLにトレース・データを送信します。
次の各項では、APMにデータを送信するためのオープン・ソース・データ・ソースの構成方法、適用可能な場合はコンテキスト伝播の構成方法などについて説明します。
OpenTelemetryデータ・ソースの構成 🔗
モニタリング・データ(メトリックおよびトレース)をApplication Performance MonitoringにアップロードするためのOpenTelemetry (ホテル)データ・ソース(インストゥルメンテーション・ライブラリやOpenTelemetryコレクタなど)の構成について説明します。
OTEL互換エンドポイントの使用
OpenTelemetryを使用してApplication Performance Monitoringにデータをアップロードするには、OTELデータ・アップロード・エンドポイントとして次を指定します:
データ・ソース・タイプに応じて、OTELデータ・アップロード・エンドポイントを構成ファイル、環境変数、コードまたはユーザー・インタフェースで指定できます。
-
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
- 公開データ・キーで認証されたトレースの場合は、次を追加します:
-
次の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の例
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エージェントの例
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を追加する必要があります。これを行うには、サービスのコードを次のように変更する必要があります:
- 必要な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>
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(); /* .... */
- 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トレーサ初期化コードを次のように変更します:
- JSONエンコードされたZipkin v2フォーマットでスパンをレポートするために必要な変更を加えたことを確認します。
Zipkinのv2形式の詳細は、Zipkin 2を参照してください。
- スパンをApplication Performance MonitoringにアップロードするためのApplication Performance MonitoringコレクタURLと、サービスまたはアプリケーションの名前を追加します。
- 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バージョン番号。 |
|
<observationType> | 取得する監視のタイプ。 |
公開データ・キーでスパンを送信する場合は 秘密データ・キーを使用してスパンを送信する場合は メトリックの送信時に |
<dataFormat> | 監視のデータ・フォーマット。 |
|
<dataFormatVersion> | 監視のデータ・フォーマット・バージョン。
Zipkin V2、otlp-metricおよびotlp-span形式がサポートされています。 |
otlp-metricおよびotlp-spanの場合は Zipkinv V2の場合は |
<dataKey> | 監視のデータ・キー。
この値はAPMドメインの詳細ページから取得できます。 |
文字列値。
例: 1111OLQSUZ5Q7IGN |
Zipkinの例
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の例
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-span
、private-span
またはmetric
を指定できます。dataFormat
パラメータは、データに応じてotlp-metric
またはotlp-span
である必要があります。dataFormatVersion
パラメータは1
である必要があります。
APMとオープン・ソースの相互運用性 🔗
コンテキスト伝播を構成して、適切な形式で伝播されたトレース・コンテキスト情報を取得し、それを1つ以上のHTTPリクエスト・ヘッダーに追加します。トレース・コンテキストを使用すると、異なるマイクロサービスから発生するが同じトランザクション(トレース)に属し、共通のトレースIDで識別されるスパンを相関させることができます。
APMエージェント/トレーサ
完全なトレースを作成するために、APM Javaエージェント/トレーサを他のOpenTracingトレーサ(JaegerやZipkinなど)と連携するように構成できます。
HTTPコールが発生すると、APM Javaエージェント/トレーサはHTTPヘッダーをそのコールに追加しようとします。反対側の端でこれが読み取られると、スパン同士を結合するのに役立ちます。
この形式は、oracle-apm-agent\config
ディレクトリにあるAgentConfig.properties
ファイルのcom.oracle.apm.agent.tracer.propagation.type
プロパティを使用して変更できます。
プロパティを名前に設定することで、次の伝播タイプを利用できます:
- B3 : デフォルトではこれが使用されます。Zipkinのデフォルト・ヘッダー・フォーマット。詳細は、https://github.com/openzipkin/b3-propagationを参照してください。
- B3単一ヘッダー: B3ヘッダー形式の単一ヘッダー・バージョン。詳細は、https://github.com/openzipkin/b3-propagationを参照してください。
- Jaeger: Jaegerのデフォルト・ヘッダー・フォーマット。詳細は、https://www.jaegertracing.io/docs/1.21/client-libraries/#propagation-formatを参照してください。
- W3C: W3Cのトレース・コンテキスト・ヘッダー・フォーマット。詳細は、https://www.w3.org/TR/trace-context/を参照してください。
各種のトレーサが連携して完全なトレースを形成できるように、適切な伝播タイプを設定します。
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を構成できます。