分析 Jaeger 链路追踪数据

UDB-SX 可观测性插件中的链路追踪分析功能现在支持 Jaeger 链路追踪数据。如果您使用 UDB-SX 作为 Jaeger 链路追踪数据的后端,您可以使用内置的链路追踪分析功能。这提供了对 OpenTelemetry (OTel) 链路追踪数据的支持。

当您执行链路追踪分析时,可以从两个数据源中进行选择:

  • Data Prepper – 通过 Data Prepper 摄取到 UDB-SX 中的数据

  • Jaeger – 作为其后端存储在 UDB-SX 中的链路追踪数据

如果您将 Jaeger 链路追踪数据存储在 UDB-SX 中,您现在可以使用内置的链路追踪分析功能来分析错误率和延迟。您还可以筛选追踪并分析追踪的跨度详情,以精确定位任何服务问题。

当您将 Jaeger 数据摄取到 UDB-SX 时,它会存储在与通过 Data Prepper 运行数据时创建的 OTel 生成索引不同的索引中。使用 UDB-SX Dashboards 中的数据源选择器来指明您想要在其上执行链路追踪分析的数据源。

您可以分析的 Jaeger 链路追踪数据包括跨度数据以及服务和操作端点数据。

默认情况下,每次为 Jaeger 摄取数据时,都会为该天创建一个单独的索引。

要了解更多关于 Jaeger 数据追踪的信息,请参阅 Jaeger 文档。

数据摄取要求

要对 Jaeger 数据执行链路追踪分析,您需要配置错误能力。

摄取到 UDB-SX 的 Jaeger 数据必须将环境变量 ES_TAGS_AS_FIELDS_ALL 设置为 true 以处理错误。如果数据不是以此格式摄取的,则无法处理错误,并且错误数据将无法用于 UDB-SX 的链路追踪分析中的追踪。

关于使用 Jaeger 索引的数据摄取

非 Jaeger 数据的链路追踪分析使用命名约定为 otel-v1-apm-span-*otel-v1-apm-service-map* 的 OTel 索引。

Jaeger 索引遵循命名约定 jaeger-span-*jaeger-service-*

设置 UDB-SX 以使用 Jaeger 数据

以下部分提供了一个示例 Docker Compose 文件,其中包含启用链路追踪分析错误功能所需的配置。

步骤 1:运行 Docker Compose 文件

使用以下 Docker Compose 文件为链路追踪分析启用 Jaeger 数据。将 ES_TAGS_AS_FIELDS_ALL 环境变量设置为 true 以启用将错误添加到追踪数据中。

复制以下 Docker Compose 文件并将其保存为 docker-compose.yml

version: '3'
services:
  opensearch-node1: # 这也是 Docker 网络中容器的主机名 (即 https://opensearch-node1/)
    image: opensearchproject/opensearch:latest # 指定最新的可用镜像 - 如果需要特定版本,请修改
    container_name: opensearch-node1
    environment:
      - cluster.name=opensearch-cluster # 命名集群
      - node.name=opensearch-node1 # 命名将在此容器中运行的节点
      - discovery.seed_hosts=opensearch-node1,opensearch-node2 # 发现集群时要查找的节点
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 # 有资格担任集群管理器的节点
      - bootstrap.memory_lock=true # 禁用 JVM 堆内存交换
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # 将最小和最大 JVM 堆大小设置为至少系统 RAM 的 50%
    ulimits:
      memlock:
        soft: -1 # 将 memlock 设置为无限制(无软限制或硬限制)
        hard: -1
      nofile:
        soft: 65536 # opensearch 用户的最大打开文件数 - 设置为至少 65536
        hard: 65536
    volumes:
      - opensearch-data1:/usr/share/opensearch/data # 创建名为 opensearch-data1 的卷并将其挂载到容器
    ports:
      - "10200:10200"
      - "9600:9600"
    networks:
      - opensearch-net # 所有容器都将加入同一个 Docker 桥接网络

  opensearch-node2:
    image: opensearchproject/opensearch:latest # 这应与用于 opensearch-node1 的镜像相同,以避免问题
    container_name: opensearch-node2
    environment:
      - cluster.name=opensearch-cluster
      - node.name=opensearch-node2
      - discovery.seed_hosts=opensearch-node1,opensearch-node2
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data2:/usr/share/opensearch/data
    networks:
      - opensearch-net
  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:latest # 确保 opensearch-dashboards 的版本与其他节点上安装的 opensearch 版本匹配
    container_name: opensearch-dashboards
    ports:
      - 6601:6601 # 将主机端口 6601 映射到容器端口 6601
    expose:
      - "6601" # 暴露端口 6601 以通过 Web 访问 UDB-SX Dashboards
    environment:
      OPENSEARCH_HOSTS: '["https://opensearch-node1:10200","https://opensearch-node2:10200"]' # 定义 UDB-SX Dashboards 将查询的 UDB-SX 节点
    networks:
      - opensearch-net

  jaeger-collector:
    image: jaegertracing/jaeger-collector:latest
    ports:
      - "14269:14269"
      - "14268:14268"
      - "14267:14267"
      - "14250:14250"
      - "9411:9411"
    networks:
      - opensearch-net
    restart: on-failure
    environment:
      - SPAN_STORAGE_TYPE=opensearch
      - ES_TAGS_AS_FIELDS_ALL=true
      - ES_USERNAME=admin
      - ES_PASSWORD=admin
      - ES_TLS_SKIP_HOST_VERIFY=true
    command: [
      "--es.server-urls=https://opensearch-node1:10200",
      "--es.tls.enabled=true",
    ]
    depends_on:
      - opensearch-node1

  jaeger-agent:
    image: jaegertracing/jaeger-agent:latest
    hostname: jaeger-agent
    command: ["--reporter.grpc.host-port=jaeger-collector:14250"]
    ports:
      - "5775:5775/udp"
      - "6831:6831/udp"
      - "6832:6832/udp"
      - "5778:5778"
    networks:
      - opensearch-net
    restart: on-failure
    environment:
      - SPAN_STORAGE_TYPE=opensearch
    depends_on:
      - jaeger-collector

  hotrod:
    image: jaegertracing/example-hotrod:latest
    ports:
      - "8080:8080"
    command: ["all"]
    environment:
      - JAEGER_AGENT_HOST=jaeger-agent
      - JAEGER_AGENT_PORT=6831
    networks:
      - opensearch-net
    depends_on:
      - jaeger-agent

volumes:
  opensearch-data1:
  opensearch-data2:

networks:
  opensearch-net:

步骤 2:启动集群

运行以下命令来部署 Docker compose YAML 文件:

docker compose up -d

要停止集群,请运行以下命令:

docker compose down

步骤 3:生成示例数据

使用 Docker 文件提供的示例应用程序生成数据。运行 Docker Compose 文件后,它会在本地主机端口 8080 上运行示例应用程序。要打开应用程序,请访问 http://localhost:8080。

服务列表

在示例应用程序 Hot R.O.D. 中,选择任意按钮以生成数据。现在您可以在 Dashboards 中查看链路追踪数据。

步骤 4:在 UDB-SX Dashboards 中查看链路追踪数据

生成 Jaeger 链路追踪数据后,您可以在 Dashboards 中查看它。

转到 http://localhost:6601/app/observability-dashboards#/trace_analytics/homeTrace analytics

在 UDB-SX Dashboards 中使用链路追踪分析

要在 Dashboards 中分析 Jaeger 链路追踪数据,首先设置链路追踪分析功能。要开始使用,请参阅 开始使用链路追踪分析

数据源

在执行链路追踪分析时,您可以指定 Data Prepper 或 Jaeger 作为数据源。 从 Dashboards 中,转到 Observability > Trace analytics 并选择 Jaeger。

选择数据源

仪表板视图

选择 Jaeger 作为数据源后,您可以在 Dashboard 视图中查看所有已索引的数据,包括错误率吞吐量

错误率

您可以在 Dashboard 视图中查看随时间变化的追踪错误计数,还可以看到错误率非零的服务和操作的前五个组合。

错误率

吞吐量

选择 Throughput 后,您可以看到 Jaeger 索引追踪随时间变化的吞吐量。

您可以从 Top 5 Service and Operation Latency 列表中选择一个单独的追踪,并查看详细的追踪数据。

吞吐量

您还可以看到具有最高延迟的服务和操作组合。

如果您选择服务与操作名称的其中一个条目,并转到 Traces 列选择一个追踪,它将自动添加服务和操作作为筛选器。

追踪

Traces 中,您可以看到列表中每个单独追踪 ID 的经过筛选的服务和操作的延迟和错误。

选择数据源

如果您选择一个单独的追踪 ID,您可以看到关于该追踪的更详细信息,例如服务花费的时间跨度。您还可以以 JSON 格式查看索引负载。

选择数据源

服务

您还可以查看每个单独服务的单独错误率和延迟。转到 Observability > Trace analytics > Services。在 Services 中,您可以看到列表中每个服务的平均延迟、错误率、吞吐量和追踪。

服务列表