Como enviar dados de rastreamento para Jaeger por meio de OpenTelemetry no aplicativo front end?

Aug 17 2020

fundo

Estou tentando rastrear em um aplicativo de front-end.

Não estou ser capaz de usar @ opentelemetry / exportador-Jaeger desde que eu acredito que é para Node.js único app back-end .

Estou tentando usar @opentelemetry / exporter-collector .

1. Impressão bem-sucedida no console do navegador

Primeiro tentei imprimir os dados de rastreamento no console do navegador. E o código abaixo consegue imprimir os dados de rastreamento.

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. Falha ao encaminhar para Jaeger

Agora eu quero encaminhá-los para Jaeger.

Estou gerenciando Jaeger all-in-one 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

Com base no documento da porta Jaeger , talvez eu consiga usar essas duas portas (se outras portas funcionarem, isso também será ótimo!):

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

Depois, encontrei mais informações sobre esta porta :

Formatos Zipkin (estável)

O Jaeger Collector também pode aceitar extensões em vários formatos de dados Zipkin, nomeadamente JSON v1 / v2 e Thrift. O coletor precisa ser configurado para habilitar o servidor Zipkin HTTP, por exemplo, na porta 9411 usada por coletores Zipkin. O servidor ativa dois endpoints que esperam solicitações 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.

Eu atualizei meus códigos para

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

No entanto, recebi uma solicitação incorreta para os endpoints v1 e v2 sem nenhum corpo de resposta retornado

POST http: // localhost: 9411 / api / v1 / spans 400 (Solicitação inválida)

POST http: // localhost: 9411 / api / v2 / spans 400 (Solicitação inválida)

Alguma ideia de como posso fazer o formato do pedido correto? obrigado

ATUALIZAÇÃO (19/08/2020)

Acho que Andrew está certo ao dizer que devo usar o coletor OpenTelemetry. Também recebi ajuda de Valentin Marchaud e Deniz Gurkaynak da Gitter. Basta adicionar o link aqui para outras pessoas que enfrentam o mesmo problema:https://gitter.im/open-telemetry/opentelemetry-node?at=5f3aa9481226fc21335ce61a

Minha solução final de trabalho postada em https://stackoverflow.com/a/63489195/2000548

Respostas

Andrew Aug 18 2020 at 00:36

O fato é que você deve usar o coletor de opentelemetria se usar o exportador de opentelemetria.

Por favor, veja o esquema em anexo

Também criei uma essência, que irá ajudá-lo a configurar, por favor, veja

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

(apenas ajuste os valores, exporte para jaeger-all-in-one em vez de separado + cassandra, etc)