Link Search Menu Expand Document Documentation Menu

分布式追踪

这是一项实验性功能,不建议在生产环境中使用。有关该功能进展的更新或如果您想留下反馈,请参阅相关的 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_OPTSconfig/jvm.options 中设置。

选项 1:在 opensearch.yml 文件中启用实验性功能标志

  1. 进入 OpenSearch 安装的顶层目录
cd \path\to\opensearch
  1. 打开 OpenSearch 配置文件夹,然后使用文本编辑器打开 opensearch.yml 文件。
  2. 添加以下行
opensearch.experimental.feature.telemetry.enabled=true

  1. 保存更改并关闭文件。

选项 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.ymlenvironment 下方

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'
    }
 }

启用分布式追踪

启用功能标志后,请执行以下操作

  1. 通过在 opensearch.yaml 文件中添加以下设置来启用追踪框架功能
telemetry.feature.tracer.enabled=true

  1. 通过添加以下动态设置来启用运行中集群中的追踪器
telemetry.tracer.enabled=true

安装 OpenSearch OpenTelemetry 插件

OpenSearch 分布式追踪框架旨在通过插件支持各种遥测解决方案。OpenSearch OpenTelemetry 插件 telemetry-otel 可用,并且必须安装才能启用追踪。以下指南提供了安装说明。

导出器

目前,分布式追踪功能为 HTTP 请求和一部分传输请求生成追踪和跨度。这些追踪和跨度最初使用 OpenTelemetry BatchSpanProcessor 保留在内存中,然后根据配置设置发送到导出器。以下是关键组件:

  1. 跨度处理器: 当跨度在请求路径上结束时,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
  2. 导出器: 导出器负责持久化数据。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%。采样有以下类型:

  1. 头部采样: 采样决策在请求的根跨度启动之前做出。OpenSearch 支持两种头部采样方法:
    • 概率性: 对传入请求设置一个总体限制,可通过 telemetry.tracer.sampler.probability 设置动态调整。此设置范围在 0 到 1 之间。默认值为 0.01,表示对 1% 的传入请求进行采样。
    • 按需: 为了调试特定请求,您可以将 trace=true 属性作为 HTTP 请求头的一部分发送,这将导致这些请求被采样,无论概率性采样设置如何。
  2. 尾部采样: 要配置尾部采样,请遵循 OpenTelemetry 尾部采样文档 中的说明。配置取决于您选择的收集器类型。

跨度收集

SpanProcessor 将跨度写入导出器,导出器的选择定义了端点,该端点可以是日志或 gRPC。要使用 gRPC 收集跨度,您需要在每个 OpenSearch 节点上将收集器配置为 sidecar 进程运行。从收集器,这些跨度可以写入您选择的接收器,例如 Jaeger、Prometheus、Grafana 或 FileStore,以进行进一步分析。