¿Cómo enviar datos de seguimiento a Jaeger a través de OpenTelemetry en la aplicación frontal?
Antecedentes
Estoy tratando de rastrear en una aplicación de interfaz.
No estoy poder utilizar @ opentelemetry / exportador-Jaeger ya que creo que es de aplicación back-end Node.js única .
Entonces estoy tratando de usar @ opentelemetry / exporter-collector .
1. Lograr imprimir en la consola del navegador
Primero intenté imprimir los datos de seguimiento en la consola del navegador. Y el siguiente código imprime correctamente los datos de seguimiento.
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. No se pudo reenviar a Jaeger
Ahora quiero reenviarlos a Jaeger.
Estoy ejecutando Jaeger todo en uno por
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
Según el documento de puerto de Jaeger , es posible que pueda usar estos dos puertos (si otros puertos funcionan, ¡eso también será genial!):
14250 HTTP collector accept model.proto
9411 HTTP collector Zipkin compatible endpoint (optional)
Luego encontré más información sobre este puerto :
Formatos Zipkin (estable)
Jaeger Collector también puede aceptar tramos en varios formatos de datos Zipkin, a saber, JSON v1 / v2 y Thrift. El recopilador debe configurarse para habilitar el servidor HTTP Zipkin, por ejemplo, en el puerto 9411 utilizado por los recopiladores Zipkin. El servidor habilita dos puntos finales que esperan solicitudes POST:
/api/v1/spans for submitting spans in Zipkin JSON v1 or Zipkin Thrift format. /api/v2/spans for submitting spans in Zipkin JSON v2.
Actualicé mis códigos a
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();
Sin embargo, recibí una solicitud incorrecta para los puntos finales v1 y v2 sin que se devolviera ningún cuerpo de respuesta
POST http: // localhost: 9411 / api / v1 / spans 400 (solicitud incorrecta)
POST http: // localhost: 9411 / api / v2 / spans 400 (solicitud incorrecta)
¿Alguna idea de cómo puedo corregir el formato de la solicitud? Gracias
ACTUALIZACIÓN (19/8/2020)
Creo que Andrew tiene razón en que debería usar el colector OpenTelemetry. También recibí ayuda de Valentin Marchaud y Deniz Gurkaynak en Gitter. Simplemente agregue el enlace aquí para más personas que tienen el mismo problema:https://gitter.im/open-telemetry/opentelemetry-node?at=5f3aa9481226fc21335ce61a
Mi solución de trabajo final publicada en https://stackoverflow.com/a/63489195/2000548
Respuestas
La cuestión es que debe usar el recopilador de opentelemetría si usa el exportador de opentelemetría.
Consulte el esquema en el archivo adjunto.

También creé una esencia, que te ayudará a configurar, por favor mira
https://gist.github.com/AndrewGrachov/11a18bc7268e43f1a36960d630a0838f
(simplemente ajuste los valores, exporte a jaeger-all-in-one en lugar de separar + cassandra, etc.)