Skip to main content
版本:v1.10.0

分布式追踪

OpenTelemetry 概述

OpenTelemetry 是一组 API 和 SDK 的工具,您可以使用它来仪器化、生成、收集和导出遥测数据(指标、日志和追踪),以便进行分析,以了解您的软件性能和行为。

需求

  • 设置追踪器
  • 不同的导出器
  • 在服务器中开始和结束跨度

设计细节

  • 跨度处理器:BatchSpanProcessor

  • 导出器:默认为日志,可以从属性中更改

// Configure the batch spans processor. This span processor exports span in batches.
BatchSpanProcessor batchSpansProcessor =
BatchSpanProcessor.builder(exporter)
.setMaxExportBatchSize(512) // set the maximum batch size to use
.setMaxQueueSize(2048) // set the queue size. This must be >= the export batch size
.setExporterTimeout(
30, TimeUnit.SECONDS) // set the max amount of time an export can run before getting
// interrupted
.setScheduleDelay(5, TimeUnit.SECONDS) // set time between two different exports
.build();
OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder().addSpanProcessor(batchSpansProcessor).build())
.build();
  1. 当使用EventMeshHTTPServer类的init()方法时,类AbstractHTTPServer将获取跟踪器。
super.openTelemetryTraceFactory = new OpenTelemetryTraceFactory(eventMeshHttpConfiguration);
super.tracer = openTelemetryTraceFactory.getTracer(this.getClass().toString());
super.textMapPropagator = openTelemetryTraceFactory.getTextMapPropagator();
  1. 然后,在类AbstractHTTPServer中的跟踪将起作用。

问题

如何在类“OpenTelemetryTraceFactory”中设置不同的导出器?(已解决)

在从属性中获取导出器类型之后,如何处理它。

logExporter只需要创建新实例即可。

但是,“zipkinExporter”需要新建并使用“getZipkinExporter()”方法。

解决方案

不同导出器的解决方案

使用反射获取导出器。

首先,不同的导出器必须实现接口“EventMeshExporter”。

然后,我们从配置中获取导出器名称,并反射到该类。

//different spanExporter
String exporterName = configuration.eventMeshTraceExporterType;
//use reflection to get spanExporter
String className = String.format("org.apache.eventmesh.runtime.exporter.%sExporter",exporterName);
EventMeshExporter eventMeshExporter = (EventMeshExporter) Class.forName(className).newInstance();
spanExporter = eventMeshExporter.getSpanExporter(configuration);

另外,这将包含 try catch。如果无法成功获取指定的导出器,则将使用默认的日志导出器。

不同导出器的改进

SPI(待完成)

附录

参考资料