分布式追踪

OpenTelemetry概述

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

需求

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

设计细节

  • 跨度处理器:BatchSpanProcessor

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

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

问题

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

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

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

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

解决方案

不同导出器的解决方案

使用反射获取导出器。

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

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

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

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

不同导出器的改进

SPI(待完成)

附录

参考资料