分布式追踪
这是一项实验性功能,不建议在生产环境中使用。有关该功能进展的更新或如果您想留下反馈,请参阅相关的 GitHub 问题。
分布式追踪用于监控和调试分布式系统。您可以通过它跟踪请求在系统中的流动,并识别性能瓶颈和错误。*追踪(trace)* 是请求流经分布式系统时的完整端到端路径。它代表了特定操作在分布式架构中遍历各种组件和服务的整个过程。在分布式追踪中,单个追踪包含一系列带标签的时间间隔,称为 *跨度(span)*。跨度有开始和结束时间,可能还包括其他元数据,如日志或标签,以帮助分类发生了什么。
分布式追踪的用途如下
- 优化性能: 识别并解决瓶颈,减少应用程序中的延迟。
- 故障排除: 快速查明分布式系统中错误或异常行为的来源。
- 分配资源: 通过了解不同服务的使用模式来优化资源分配。
- 可视化服务依赖: 可视化服务之间的依赖关系,帮助您管理架构。
分布式追踪管道
OpenSearch 提供了一个分布式追踪管道,可用于摄取、处理和可视化追踪数据,并提供查询和警报功能。OpenTelemetry 是一个开源的可观测性框架,提供一套 API、库、代理和收集器,用于生成、捕获和导出遥测数据。分布式追踪管道包含以下组件:
- 插桩: 使用 OpenTelemetry SDK 对应用程序代码进行插桩。
- 传播: 在请求通过系统传播时,将追踪上下文注入请求中。
- 收集: 从应用程序收集追踪数据。
- 处理: 聚合来自多个源的追踪数据,并用额外的元数据丰富它。
- 导出: 将追踪数据发送到后端进行存储和分析。
OpenSearch 通常被选作存储追踪数据的接收器(sink)。
追踪分析
OpenSearch 提供一个 trace-analytics
插件,用于实时可视化追踪数据。该插件包含用于分析追踪数据的预构建仪表板,例如服务地图、延迟直方图和错误率。通过 OpenSearch 的分布式追踪管道,您可以快速识别应用程序中的瓶颈和错误。有关更多信息,请参阅 追踪分析 文档。
开始
分布式追踪功能在 OpenSearch 2.10 版本中仍是实验性的。要开始使用分布式追踪功能,您需要首先使用 opensearch.experimental.feature.telemetry.enabled
功能标志启用它,然后使用动态设置 telemetry.tracer.enabled
激活追踪器。启用此功能时务必谨慎,因为它可能会消耗系统资源。以下部分详细介绍了如何启用和配置分布式追踪,包括按需故障排除和请求采样。
使用 tarball 在节点上启用标志
启用标志通过一个新的 Java 虚拟机 (JVM) 参数进行切换,该参数可以在 OPENSEARCH_JAVA_OPTS
或 config/jvm.options
中设置。
选项 1:在 opensearch.yml
文件中启用实验性功能标志
- 进入 OpenSearch 安装的顶层目录
cd \path\to\opensearch
- 打开 OpenSearch 配置文件夹,然后使用文本编辑器打开
opensearch.yml
文件。 - 添加以下行
opensearch.experimental.feature.telemetry.enabled=true
- 保存更改并关闭文件。
选项 2:修改 jvm.options
在启动 OpenSearch 进程之前,将以下行添加到 config/jvm.options
以启用该功能及其依赖项
-Dopensearch.experimental.feature.telemetry.enabled=true
运行 OpenSearch
./bin/opensearch
选项 3:通过环境变量启用
作为直接修改 config/jvm.options
的替代方案,您可以使用环境变量定义属性。您可以在启动 OpenSearch 时通过单个命令启用此功能,或者通过设置环境变量来实现。
要在启动 OpenSearch 时内联添加这些标志,请运行以下命令
OPENSEARCH_JAVA_OPTS="-Dopensearch.experimental.feature.telemetry.enabled=true" ./opensearch-2.9.0/bin/opensearch
要在运行 OpenSearch 之前单独定义环境变量,请运行以下命令
export OPENSEARCH_JAVA_OPTS="-Dopensearch.experimental.feature.telemetry.enabled=true"
./bin/opensearch
使用 Docker 容器启用
如果您正在运行 Docker,请将以下行添加到 docker-compose.yml
的 environment
下方
OPENSEARCH_JAVA_OPTS="-Dopensearch.experimental.feature.telemetry.enabled=true"
为 OpenSearch 开发启用
要启用分布式追踪功能,您必须首先在构建 OpenSearch 之前将正确的属性添加到 run.gradle
。有关如何使用 Gradle 构建 OpenSearch 的信息,请参阅开发者指南。
将以下属性添加到 run.gradle
以启用该功能
testClusters {
runTask {
testDistribution = 'archive'
if (numZones > 1) numberOfZones = numZones
if (numNodes > 1) numberOfNodes = numNodes
systemProperty 'opensearch.experimental.feature.telemetry.enabled', 'true'
}
}
启用分布式追踪
启用功能标志后,请执行以下操作
- 通过在
opensearch.yaml
文件中添加以下设置来启用追踪框架功能
telemetry.feature.tracer.enabled=true
- 通过添加以下动态设置来启用运行中集群中的追踪器
telemetry.tracer.enabled=true
安装 OpenSearch OpenTelemetry 插件
OpenSearch 分布式追踪框架旨在通过插件支持各种遥测解决方案。OpenSearch OpenTelemetry 插件 telemetry-otel
可用,并且必须安装才能启用追踪。以下指南提供了安装说明。
导出器
目前,分布式追踪功能为 HTTP 请求和一部分传输请求生成追踪和跨度。这些追踪和跨度最初使用 OpenTelemetry BatchSpanProcessor
保留在内存中,然后根据配置设置发送到导出器。以下是关键组件:
- 跨度处理器: 当跨度在请求路径上结束时,OpenTelemetry 将它们提供给
SpanProcessor
进行处理和导出。OpenSearch 分布式追踪框架使用BatchSpanProcessor
,它在特定的可配置间隔内批量处理跨度,然后将它们发送到导出器。BatchSpanProcessor
的以下配置可用:telemetry.otel.tracer.exporter.max_queue_size
:定义最大队列大小。当队列达到此值时,它将被写入导出器。默认值为2048
。telemetry.otel.tracer.exporter.delay
:定义延迟——一个时间段,在此之后队列中的跨度将被刷新,即使没有足够的跨度来填满max_queue_size
。默认值为2 seconds
。telemetry.otel.tracer.exporter.batch_size
:配置每次导出的最大批次大小以减少输入/输出。此值应始终小于max_queue_size
。默认值为512
。
- 导出器: 导出器负责持久化数据。OpenTelemetry 提供了几种开箱即用的导出器,OpenSearch 支持以下几种:
LoggingSpanExporter
:将跨度导出到日志文件,在日志目录中生成一个单独的文件_otel_traces.log
。默认值为telemetry.otel.tracer.span.exporter.class=io.opentelemetry.exporter.logging.LoggingSpanExporter
。OtlpGrpcSpanExporter
:通过 gRPC 导出跨度。要使用此导出器,您需要在节点上安装otel-collector
。默认情况下,它写入 https://:4317/ 端点。要使用此导出器,请设置以下静态设置:telemetry.otel.tracer.span.exporter.class=io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter
。
采样
分布式追踪可能会生成大量跨度,不必要地消耗系统资源。为了减少追踪(也称为 *样本*)的数量,您可以配置不同的采样阈值。默认情况下,采样配置为仅包含所有 HTTP 请求的 1%。采样有以下类型:
- 头部采样: 采样决策在请求的根跨度启动之前做出。OpenSearch 支持两种头部采样方法:
- 概率性: 对传入请求设置一个总体限制,可通过
telemetry.tracer.sampler.probability
设置动态调整。此设置范围在 0 到 1 之间。默认值为 0.01,表示对 1% 的传入请求进行采样。 - 按需: 为了调试特定请求,您可以将
trace=true
属性作为 HTTP 请求头的一部分发送,这将导致这些请求被采样,无论概率性采样设置如何。
- 概率性: 对传入请求设置一个总体限制,可通过
- 尾部采样: 要配置尾部采样,请遵循 OpenTelemetry 尾部采样文档 中的说明。配置取决于您选择的收集器类型。
跨度收集
SpanProcessor
将跨度写入导出器,导出器的选择定义了端点,该端点可以是日志或 gRPC。要使用 gRPC 收集跨度,您需要在每个 OpenSearch 节点上将收集器配置为 sidecar 进程运行。从收集器,这些跨度可以写入您选择的接收器,例如 Jaeger、Prometheus、Grafana 或 FileStore,以进行进一步分析。