分散式追蹤

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

開放遙測模組

此模組支援業界標準的 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 自動設定

預設設定會使用 gRPC 將追蹤傳送到在 localhost 上執行的收集器,並使用 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 模組,以 Zipkin 格式透過 Protobuf 編碼傳送追蹤:

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.dev.org.tw/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