分布式追踪
可以配置追踪数据发送到各种后端,直接或通过代理。Solr 可以直接以 OTLP/gRPC 和 Jaeger/Thrift 格式发送追踪。
通过在每个节点上安装代理并将追踪发送到 localhost,可以支持许多其他目标和云提供商。
在 Jaeger UI 中显示的采样分布式追踪查询请求如下所示
始终开启的追踪 ID 生成
Solr 包含一个始终开启的追踪 ID 生成器。这将为每个 Solr 请求注入追踪 ID 标头,传播客户端提供的 value 或根据需要生成新的 ID,并替换现有的 rid
机制。
它用于传播的标头名称是 X-Trace-Id
,可以通过更新系统属性 solr.traceIdHeader
来更改此名称。
如果通过 Solr 配置设置了其他追踪机制,则此插件将不会启用。可以通过将系统属性 solr.alwaysOnTraceId
设置为 false
来禁用此插件。
模块和配置
TracerConfigurator
是一个类,用于根据 solr.xml
中的配置提供 io.opentracing.Tracer
的实例。这些是可插拔的,每个插件都作为 Solr 模块 发布。
opentelemetry:opentelemetry
模块支持通过 gRPC 或 HTTP 的 OTLP。
jaegertracer-configurator:jaegertracer-configurator
模块支持通过 Thrift 传输的 Jaeger 格式。
在 solr.xml
中设置 TracerConfigurator
如下所示
<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 自动配置。
默认配置将通过 OTLP 在 gRPC 上将跟踪发送到运行在本地主机的收集器,并将使用 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.31.0。
Jaeger 跟踪器模块
从 Solr 9.2 开始,此模块已弃用,并将从版本 10 中删除。用户应迁移到 OpenTelemetry。 |
模块 jagertracer-configurator
提供了用于设置 Jaeger 跟踪器的默认实现。使用系统属性 -Dsolr.modules=jaegertracer-configurator
或环境变量 SOLR_MODULES=jaegertracer-configurator
启用该模块。
了解有关可用采样器的更多信息,请访问 https://www.jaegertracing.io/docs/sampling/#client-sampling-configuration。
然后,Jaeger 跟踪器在 solr.xml
中配置如下
<tracerConfig name="tracerConfig" class="org.apache.solr.jaeger.JaegerTracerConfigurator" />
XML 中没有配置元素;相反,此第三方系统是使用系统属性或环境变量配置的。完整列表在 Jaeger-README 中列出。
例如,要使用概率采样器,您可以设置以下环境变量
export JAEGER_SAMPLER_TYPE=probabilistic
或系统属性
bin/solr start -DJAEGER_SAMPLER_TYPE=probabilistic