¿Cómo enviar datos de seguimiento a Jaeger a través de OpenTelemetry en la aplicación frontal?

Aug 17 2020

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

Andrew Aug 18 2020 at 00:36

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.)