分散トレース

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

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

在 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 模块 提供

opentelemetry: opentelemetry 模块支持通过 gRPC 或 HTTP 进行 OTLP。

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

solr.xmlTracerConfigurator 的设置如下所示

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

如果 <tracerConfig> 不存在,TracerConfigurator 将尝试获取在 io.opentracing.util.GlobalTracer 中注册的 Tracer 实例。通过这种方式,某些后端会开箱即用地受到支持,例如 datadog-java-agent 使用 Javaagent 在 io.opentracing.util.GlobalTracer 中注册 Tracer

开放遥测模块

此模块为行业标准 开放遥测 (或简称“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 自動構成を参照してください。

デフォルトの構成では、トレースが gRPC 経由で OTLP を使用して localhost で実行されているコレクターに出荷され、トレース ID が W3C TraceContext を使用して伝達されます。以下が、デフォルトで有効になっている環境設定です。

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

たとえば、10% サンプリングでリモートの OTEL Collector にトレースを送信するとします。この場合は、次のような構成を使用できます。

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 を使用しています。

他のエクスポーターの使用

OTEL トレーサーは、Jaeger や Zipkin などの他のエクスポーターもサポートしています。ただし、Solr にはこれらのサードパーティライブラリは搭載されていません。そのため、必要に応じて、これらのサードパーティライブラリを Solr に自分で追加する必要があります。たとえば、Zipkin エクスポーターの JAR ファイルを「$SOLR_TIP/lib/」に追加した場合は、次のような構成を使用して、Protobuf エンコーディングで Zipkin 形式のトレースを送信するように OpenTelemetry モジュールを有効にします。

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

Jaeger Tracer モジュール

このモジュールは Solr 9.2 で非推奨になり、バージョン 10 で削除されます。ユーザーは OpenTelemetry に移行する必要があります。

モジュール「jagertracer-configurator」は、Jaeger Tracer を設定するためのデフォルト実装を提供します。システムプロパティ「-Dsolr.modules=jaegertracer-configurator」または環境変数「SOLR_MODULES=jaegertracer-configurator」のいずれかでモジュールを有効にします。

使用可能なサンプラーの詳細については、https://jaeger.dokyumento.jp/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