Wie sende ich Trace-Daten über OpenTelemetry in der Front-End-App an Jaeger?

Aug 17 2020

Hintergrund

Ich versuche, in einer Front-End-App zu verfolgen.

Ich kann @ opentelemetry / exporter-jaeger nicht verwenden, da ich glaube, dass dies nur für die Backend-App von Node.j gilt .

Also versuche ich @ opentelemetry / exporter-collector zu verwenden .

1. Fahren Sie mit dem Drucken in der Browserkonsole fort

Zuerst habe ich versucht, die Trace-Daten in der Browserkonsole zu drucken. Der folgende Code druckt die Trace-Daten erfolgreich.

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. Fehler beim Weiterleiten an Jaeger

Jetzt möchte ich sie an Jaeger weiterleiten.

Ich leite Jaeger All-in-One von

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

Basierend auf dem Jaeger-Portdokument kann ich möglicherweise diese beiden Ports verwenden (wenn andere Ports funktionieren, ist das auch großartig!):

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

Dann habe ich weitere Infos zu diesem Port gefunden :

Zipkin-Formate (stabil)

Jaeger Collector kann auch Bereiche in verschiedenen Zipkin-Datenformaten akzeptieren, nämlich JSON v1 / v2 und Thrift. Der Collector muss so konfiguriert sein, dass der Zipkin-HTTP-Server aktiviert wird, z. B. an Port 9411, der von Zipkin-Collectors verwendet wird. Der Server aktiviert zwei Endpunkte, die POST-Anforderungen erwarten:

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

Ich habe meine Codes auf aktualisiert

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();

Ich habe jedoch eine schlechte Anfrage für die Endpunkte v1 und v2 erhalten, ohne dass ein Antworttext zurückgegeben wurde

POST http: // localhost: 9411 / api / v1 / spans 400 (Bad Request)

POST http: // localhost: 9411 / api / v2 / spans 400 (fehlerhafte Anfrage)

Irgendeine Idee, wie ich das Anforderungsformat korrigieren kann? Vielen Dank

UPDATE (19.08.2020)

Ich denke, Andrew hat Recht, dass ich OpenTelemetry Collector verwenden sollte. Ich habe auch Hilfe von Valentin Marchaud und Deniz Gurkaynak von Gitter bekommen. Fügen Sie hier einfach den Link für weitere Personen hinzu, die das gleiche Problem haben:https://gitter.im/open-telemetry/opentelemetry-node?at=5f3aa9481226fc21335ce61a

Meine endgültige Arbeitslösung finden Sie unter https://stackoverflow.com/a/63489195/2000548

Antworten

Andrew Aug 18 2020 at 00:36

Wenn Sie den Opentelemetrie-Exporter verwenden, sollten Sie den Opentelemetrie-Kollektor verwenden.

Bitte sehen Sie das Schema im Anhang

Außerdem habe ich eine Übersicht erstellt, die Ihnen beim Einrichten von pls see helfen wird

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

(Stimmen Sie einfach die Werte ab, exportieren Sie nach Jaeger-All-in-One anstelle von Separate + Cassandra usw.)