フロントエンドアプリのOpenTelemetryを介してトレースデータをJaegerに送信するにはどうすればよいですか?

Aug 17 2020

バックグラウンド

フロントエンドアプリでトレースしようとしています。

Node.jsバックエンドアプリ専用だと思うので、@ opentelemetry / exporter-jaegerを使用できません。

だから私は@opentelemetry / exporter-collectorを使おうとしています。

1.ブラウザコンソールでの印刷に成功します

まず、ブラウザコンソールでトレースデータを印刷してみました。そして、以下のコードはトレースデータの印刷に成功します。

import { CollectorTraceExporter } from '@opentelemetry/exporter-collector';
import { DocumentLoad } from '@opentelemetry/plugin-document-load';
import { SimpleSpanProcessor, ConsoleSpanExporter } from '@opentelemetry/tracing';
import { WebTracerProvider } from '@opentelemetry/web';

const provider = new WebTracerProvider({ plugins: [new DocumentLoad()] });
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
provider.register();

2.イエーガーへの転送に失敗しました

今、私はそれらをイエーガーに転送したいと思います。

Jaegerをオールインワンで実行しています

docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14268:14268 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.18

Jaegerポートのドキュメントに基づいて、これら2つのポートを使用できる可能性があります(他のポートが機能する場合は、それも素晴らしいでしょう!):

14250   HTTP    collector   accept model.proto
9411    HTTP    collector   Zipkin compatible endpoint (optional)

それから私はさらにこのポートについてのより多くの情報を見つけました:

Zipkinフォーマット(安定)

Jaeger Collectorは、JSON v1 / v2やThriftなどのいくつかのZipkinデータ形式のスパンも受け入れることができます。コレクターは、Zipkin HTTPサーバーを有効にするように構成する必要があります(例:Zipkinコレクターが使用するポート9411)。サーバーは、POST要求を予期する2つのエンドポイントを有効にします。

/api/v1/spans for submitting spans in Zipkin JSON v1 or Zipkin Thrift format.
/api/v2/spans for submitting spans in Zipkin JSON v2.

コードを次のように更新しました

import { CollectorTraceExporter, CollectorProtocolNode } from '@opentelemetry/exporter-collector';
import { DocumentLoad } from '@opentelemetry/plugin-document-load';
import { SimpleSpanProcessor } from '@opentelemetry/tracing';
import { WebTracerProvider } from '@opentelemetry/web';

const provider = new WebTracerProvider({ plugins: [new DocumentLoad()] });

// The config below currently has issue
const exporter = new CollectorTraceExporter({
    serviceName: 'my-service',
    protocolNode: CollectorProtocolNode.HTTP_JSON,
    url: 'http://localhost:9411/api/v1/spans', // Also tried v2
});

provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.register();

ただし、応答本文が返されないまま、v1エンドポイントとv2エンドポイントの両方に対して不正な要求がありました

POST http:// localhost:9411 / api / v1 / spans 400(不正なリクエスト)

POST http:// localhost:9411 / api / v2 / spans 400(不正なリクエスト)

リクエスト形式を正しくするにはどうすればよいですか?ありがとう

更新(2020年8月19日)

Andrewは、OpenTelemetryコレクターを使用する必要があるのは正しいと思います。また、GitterのValentinMarchaudとDenizGurkaynakからも助けを得ました。同じ問題に遭遇する他の人々のために、ここにリンクを追加するだけです:https://gitter.im/open-telemetry/opentelemetry-node?at=5f3aa9481226fc21335ce61a

私の最終的な実用的なソリューションはに投稿されました https://stackoverflow.com/a/63489195/2000548

回答

Andrew Aug 18 2020 at 00:36

つまり、opentelemetryエクスポーターを使用する場合は、opentelemetryコレクターを使用する必要があります。

plsは添付ファイルのスキーマを参照してください

また、私は要点を作成しました。これは、plsの設定に役立ちます。

https://gist.github.com/AndrewGrachov/11a18bc7268e43f1a36960d630a0838f

(値を調整し、個別の+ cassandraではなくjaeger-all-in-oneにエクスポートするなど)