Comment envoyer des données de trace à Jaeger via OpenTelemetry dans l'application frontale?

Aug 17 2020

Contexte

J'essaie de tracer dans une application frontale.

Je ne suis pas en mesure d'utiliser @ opentelemetry / exportateur jaeger depuis que je crois qu'il est pour l' application de la fin de l' arrière Node.js seulement .

J'essaye donc d'utiliser @ opentelemetry / exporter-collector .

1. Réussir à imprimer dans la console du navigateur

J'ai d'abord essayé d'imprimer les données de trace dans la console du navigateur. Et le code ci-dessous réussit à imprimer les données de trace.

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. Échec de la transmission à Jaeger

Maintenant, je veux les transmettre à Jaeger.

Je lance Jaeger tout-en-un par

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

Sur la base du document de port Jaeger , je pourrais peut-être utiliser ces deux ports (si d'autres ports fonctionnent, ce sera bien aussi!):

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

Ensuite, j'ai trouvé plus d'informations sur ce port :

Formats Zipkin (stables)

Jaeger Collector peut également accepter des spans dans plusieurs formats de données Zipkin, à savoir JSON v1 / v2 et Thrift. Le collecteur doit être configuré pour activer le serveur HTTP Zipkin, par exemple sur le port 9411 utilisé par les collecteurs Zipkin. Le serveur active deux points de terminaison qui attendent des requêtes 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.

J'ai mis à jour mes codes pour

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

Cependant, j'ai reçu une mauvaise demande pour les points de terminaison v1 et v2 sans aucun corps de réponse renvoyé

POST http: // localhost: 9411 / api / v1 / spans 400 (demande incorrecte)

POST http: // localhost: 9411 / api / v2 / spans 400 (demande incorrecte)

Une idée comment puis-je rendre le format de la demande correct? Merci

MISE À JOUR (19/08/2020)

Je pense qu'Andrew a raison de dire que je devrais utiliser le collecteur OpenTelemetry. J'ai également obtenu de l'aide de Valentin Marchaud et Deniz Gurkaynak à Gitter. Ajoutez simplement le lien ici pour d'autres personnes qui rencontrent le même problème:https://gitter.im/open-telemetry/opentelemetry-node?at=5f3aa9481226fc21335ce61a

Ma solution de travail finale publiée sur https://stackoverflow.com/a/63489195/2000548

Réponses

Andrew Aug 18 2020 at 00:36

Le fait est que vous devez utiliser le collecteur opentelemetry si vous utilisez un exportateur opentelemetry.

Pls voir le schéma en pièce jointe

J'ai également créé un résumé, qui vous aidera à configurer les pls voir

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

(juste régler les valeurs, exporter vers jaeger-all-in-one au lieu de separé + cassandra, etc.)