Come inviare i dati di traccia a Jaeger tramite OpenTelemetry nell'app front-end?

Aug 17 2020

sfondo

Sto cercando di tracciare in un'app front-end.

Io non sono in grado di utilizzare @ opentelemetry / esportatore-Jaeger poiché credo che sia per Node.js unica applicazione di back-end .

Quindi sto cercando di usare @ opentelemetry / exporter-collector .

1. Procedere alla stampa nella console del browser

Per prima cosa ho provato a stampare i dati di traccia nella console del browser. E il codice seguente riesce a stampare i dati di traccia.

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. Inoltro a Jaeger non riuscito

Ora voglio inoltrarli a Jaeger.

Gestisco Jaeger all-in-one di

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

Sulla base del documento del port Jaeger , potrei essere in grado di usare queste due porte (se altre porte funzionano, anche questo sarà fantastico!):

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

Quindi ho trovato ulteriori informazioni su questa porta :

Formati Zipkin (stabile)

Jaeger Collector può anche accettare intervalli in diversi formati di dati Zipkin, ovvero JSON v1 / v2 e Thrift. Il servizio di raccolta deve essere configurato per abilitare il server HTTP Zipkin, ad esempio sulla porta 9411 utilizzata dai raccoglitori Zipkin. Il server abilita due endpoint che prevedono richieste 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.

Ho aggiornato i miei codici 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();

Tuttavia, ho ricevuto una cattiva richiesta per entrambi gli endpoint v1 e v2 senza che sia stato restituito alcun corpo di risposta

POST http: // localhost: 9411 / api / v1 / spans 400 (richiesta non valida)

POST http: // localhost: 9411 / api / v2 / spans 400 (richiesta non valida)

Qualche idea su come posso rendere corretto il formato della richiesta? Grazie

AGGIORNAMENTO (19/8/2020)

Penso che Andrew abbia ragione nel dire che dovrei usare OpenTelemetry collector. Ho anche ricevuto aiuto da Valentin Marchaud e Deniz Gurkaynak di Gitter. Aggiungi semplicemente il link qui per altre persone che incontrano lo stesso problema:https://gitter.im/open-telemetry/opentelemetry-node?at=5f3aa9481226fc21335ce61a

La mia soluzione di lavoro finale pubblicata su https://stackoverflow.com/a/63489195/2000548

Risposte

Andrew Aug 18 2020 at 00:36

Il fatto è che dovresti usare opentelemetry collector se usi opentelemetry exporter.

Si prega di vedere lo schema in allegato

Inoltre ho creato una sintesi, che ti aiuterà a configurare, per favore

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

(regola i valori, esporta in jaeger-all-in-one invece che separato + cassandra, ecc.)