จะส่งข้อมูลการติดตามไปยัง Jaeger ผ่าน OpenTelemetry ในแอปส่วนหน้าได้อย่างไร

Aug 17 2020

พื้นหลัง

ฉันพยายามติดตามในแอปส่วนหน้า

ผมไม่สามารถที่จะใช้@ opentelemetry / ส่งออก Jaegerตั้งแต่ผมเชื่อว่ามันเป็น Node.js แอปด้านหลังเท่านั้น

ดังนั้นฉันพยายามที่จะใช้@ opentelemetry / ส่งออกสะสม

1. พิมพ์ในคอนโซลของเบราว์เซอร์สำเร็จ

ก่อนอื่นฉันพยายามพิมพ์ข้อมูลการติดตามในคอนโซลของเบราว์เซอร์ และรหัสด้านล่างจะพิมพ์ข้อมูลการติดตามสำเร็จ

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. ส่งต่อไปยัง Jaeger ไม่สำเร็จ

ตอนนี้ฉันต้องการส่งต่อให้ Jaeger

ฉันใช้งานJaeger all-in-oneโดย

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

จากเอกสารพอร์ต Jaegerฉันอาจจะใช้สองพอร์ตนี้ได้ (ถ้าพอร์ตอื่นใช้งานได้ก็จะดีเช่นกัน!):

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

จากนั้นฉันพบข้อมูลเพิ่มเติมเกี่ยวกับพอร์ตนี้ :

รูปแบบ Zipkin (เสถียร)

Jaeger Collector ยังสามารถรับสแปนในรูปแบบข้อมูล Zipkin ได้หลายรูปแบบเช่น JSON v1 / v2 และ Thrift ต้องกำหนดค่า Collector เพื่อเปิดใช้งานเซิร์ฟเวอร์ Zipkin HTTP เช่นบนพอร์ต 9411 ที่ใช้โดย Zipkin Collector เซิร์ฟเวอร์เปิดใช้งานปลายทางสองจุดที่คาดหวังการร้องขอ 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.

ฉันอัปเดตรหัสของฉันเป็น

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

อย่างไรก็ตามฉันได้รับคำขอที่ไม่ถูกต้องสำหรับทั้งจุดสิ้นสุด v1 และ v2 โดยไม่มีการตอบสนองใด ๆ กลับมา

โพสต์ http: // localhost: 9411 / api / v1 / ครอบคลุม 400 (คำขอไม่ถูกต้อง)

โพสต์ http: // localhost: 9411 / api / v2 / ครอบคลุม 400 (คำขอไม่ถูกต้อง)

ฉันจะทำให้รูปแบบคำขอถูกต้องได้อย่างไร ขอบคุณ

อัพเดท (19/8/2020)

ฉันคิดว่าแอนดรูพูดถูกที่ควรใช้ OpenTelemetry Collector ฉันยังได้รับความช่วยเหลือจาก Valentin Marchaud และ Deniz Gurkaynak ที่ Gitter เพียงเพิ่มลิงค์ที่นี่สำหรับผู้ที่พบปัญหาเดียวกัน:https://gitter.im/open-telemetry/opentelemetry-node?at=5f3aa9481226fc21335ce61a

โซลูชันการทำงานขั้นสุดท้ายของฉันโพสต์ที่ https://stackoverflow.com/a/63489195/2000548

คำตอบ

Andrew Aug 18 2020 at 00:36

สิ่งนี้คือคุณควรใช้ตัวรวบรวม opentelemetry ถ้าคุณใช้ตัวส่งออก opentelemetry

โปรดดูสคีมาในไฟล์แนบ

นอกจากนี้ฉันได้สร้างส่วนสำคัญซึ่งจะช่วยคุณในการตั้งค่าโปรดดู

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

(เพียงแค่ปรับแต่งค่าส่งออกไปยัง jaeger-all-in-one แทนการแยก + Cassandra ฯลฯ )