分布式追踪

Solr 包含一个基于 OpenTracing 的通用追踪框架,可用于追踪请求的生命周期以进行性能监控。

可以配置追踪数据以发送到各种后端,可以直接发送或通过代理发送。Solr 可以直接以 OTLP/gRPC 和 Jaeger/Thrift 格式发送追踪。您可以通过在每个节点上安装代理并将追踪发送到 localhost 来支持许多其他目标和云提供商。

在 Jaeger UI 中显示的采样分布式追踪查询请求如下所示

query request tracing
图 1. Solr 查询的追踪

始终开启的追踪 ID 生成

Solr 包含一个始终开启的追踪 ID 生成器。这将为每个 Solr 请求注入追踪 ID 标头,传播客户端提供的值或根据需要生成新的 ID,并替换现有的 rid 机制。

它用于传播的标头名称是 X-Trace-Id,可以通过更新系统属性 solr.traceIdHeader 来更改此名称。

如果通过 Solr 配置设置了其他追踪机制,则此插件将不会启用。可以通过将系统属性 solr.alwaysOnTraceId 设置为 false 来禁用此插件。

模块和配置

TracerConfigurator 是一个用于基于 solr.xml 中的配置提供 io.opentracing.Tracer 实例的类。这些是可插拔的,每个插件都作为 Solr 模块发布。

opentelemetryopentelemetry 模块支持通过 gRPC 或 HTTP 的 OTLP。

jaegertracer-configuratorjaegertracer-configurator 模块支持通过 Thrift 传输的 Jaeger 格式。

solr.xmlTracerConfigurator 的设置如下所示

<solr>
  <tracerConfig name="tracerConfig" class="org.apache.solr.opentelemetry.OtelTracerConfigurator" />
</solr>

如果缺少 <tracerConfig>,则 TracerConfigurator 将尝试获取在 io.opentracing.util.GlobalTracer 中注册的 Tracer 实例。通过这样做,一些后端(如 DataDog)开箱即用,因为 datadog-java-agent 使用 Javaagent 在 io.opentracing.util.GlobalTracer 中注册 Tracer

Open Telemetry 模块

此模块支持行业标准 OpenTelemetry(简称“OTEL”)追踪,并公开一个可在 solr.xml<tracerConfig> 标记中启用的追踪器配置器,如下所示

<tracerConfig name="tracerConfig" class="org.apache.solr.opentelemetry.OtelTracerConfigurator"/>

作为更改 solr.xml 文件的替代方法,如果存在系统属性 otel.service.name 或环境变量 OTEL_SERVICE_NAME,则将启用 OTEL 追踪器。仍然需要启用 opentelemetry 模块才能使追踪器工作。

使用系统属性 -Dsolr.modules=opentelemetry 或环境变量 SOLR_MODULES=opentelemetry 启用该模块。

配置

可以通过环境变量或 Java 系统属性配置追踪器,请参阅 OTEL SDK 环境变量Java SDK Autoconfigure

默认配置会将追踪数据发送到本地主机上运行的收集器,使用基于 gRPCOTLP 协议,并使用 W3C TraceContext 传播追踪 ID。以下是默认启用的环境设置

OTEL_SDK_DISABLED=false
OTEL_SERVICE_NAME=solr
OTEL_TRACES_EXPORTER=otlp
OTEL_EXPORTER_OTLP_PROTOCOL=grpc
OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317
OTEL_TRACES_SAMPLER=parentbased_always_on
OTEL_PROPAGATORS=tracecontext,baggage

假设您想将追踪数据发送到远程的 OTEL 收集器,并使用 10% 的采样率。可以使用以下配置完成

OTEL_EXPORTER_OTLP_ENDPOINT=my-remote-collector:4317
OTEL_TRACES_SAMPLER=parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG=0.1

使用系统属性的等效配置如下

SOLR_OPTS=-Dotel.exporter.otlp.endpoint=my-remote-collector:4317 -Dotel.traces.sampler=parentbased_traceidratio -Dotel.traces.sampler.arg=0.1

要将自定义标签添加到追踪,请使用 OTEL_RESOURCE_ATTRIBUTES

OTEL_RESOURCE_ATTRIBUTES="application=OnlineBanking,exampleKey=exampleValue"

有关所有配置选项的详细信息,请参阅 OTEL 文档。此版本的 Solr 使用 OpenTelemetry SDK v1.40.0

使用其他导出器

OTEL 追踪器还支持其他导出器,如 Jaeger 和 Zipkin。但是,Solr 不会附带这些第三方库,因此如果需要,您需要自己将它们添加到 Solr 中。假设您将 Zipkin 导出器 jar 文件添加到 $SOLR_TIP/lib/,然后您可以使用以下配置启用 OpenTelemetry 模块以使用 Protobuf 编码以 Zipkin 格式发送追踪数据

OTEL_TRACES_EXPORTER=zipkin
OTEL_EXPORTER_ZIPKIN_ENDPOINT=https://127.0.0.1:9411/api/v2/spans

Jaeger 追踪器模块

此模块自 Solr 9.2 起已弃用,并将在版本 10 中删除。用户应迁移到 OpenTelemetry。

模块 jagertracer-configurator 提供了一个设置 Jaeger 追踪器的默认实现。使用系统属性 -Dsolr.modules=jaegertracer-configurator 或环境变量 SOLR_MODULES=jaegertracer-configurator 启用该模块。

https://jaeger.golang.ac.cn/docs/sampling/#client-sampling-configuration 了解有关可用采样器的更多信息。

然后,在 solr.xml 中配置 Jaeger 追踪器,如下所示

<tracerConfig name="tracerConfig" class="org.apache.solr.jaeger.JaegerTracerConfigurator" />

XML 中没有配置元素;相反,这个第三方系统是使用系统属性或环境变量配置的。完整列表请参见 Jaeger-README

例如,要使用概率采样器,您可以设置此环境变量

export JAEGER_SAMPLER_TYPE=probabilistic

或系统属性

bin/solr start -DJAEGER_SAMPLER_TYPE=probabilistic