OpenTelemetry分布式链路追踪服务器集群完整部署

OpenTelemetry分布式链路追踪服务器集群部署实操指南

不少朋友在搭建微服务或分布式应用时,想用 OpenTelemetry 做链路追踪,但卡在集群部署这一步。
本文从零开始,按实际环境讲解如何在一组服务器上完整跑通 OpenTelemetry Collector + Jaeger 后端,并验证追踪数据是否正常。

一、部署前必须搞清楚的3件事

  1. 理解角色:OpenTelemetry 是一套规范和 SDK,真正存储展示数据的后端需要自己选,比如 Jaeger、Zipkin、SkyWalking。新手推荐 Jaeger,社区成熟,配置简单。
  2. 网络规划:Collector 负责接收应用发出的追踪数据,需要开放 gRPC/HTTP 端口;Jaeger 后端一般和 Collector 部署在同一内网,减少延迟。
  3. 资源评估:单机 2C4G 可以跑通 demo,生产集群建议 Collector 和 Jaeger 分开部署,且 Collector 可水平扩展。

二、用 Docker Compose 一键拉起集群组件

假设你有两台服务器:一台跑 Collector,一台跑 Jaeger。
下面步骤统一采用容器方式,降低依赖冲突。

1. 在 Collector 服务器上编写 docker-compose.yml

version: '3.8'
services:
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.103.0
    container_name: otel-collector
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    command: ["--config=/etc/otel-collector-config.yaml"]
    ports:
      - "4317:4317"   # gRPC
      - "4318:4318"   # HTTP
    restart: unless-stopped

2. 创建 Collector 配置 otel-collector-config.yaml

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

exporters:
  otlp:
    endpoint: "jaeger-server-ip:4317"   # 换成你的 Jaeger 服务器内网IP
    tls:
      insecure: true

service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [otlp]

3. 在 Jaeger 服务器上部署后端

同样使用 Docker Compose,文件内容如下:

version: '3.8'
services:
  jaeger:
    image: jaegertracing/all-in-one:1.57
    container_name: jaeger
    environment:
      - COLLECTOR_OTLP_ENABLED=true
    ports:
      - "16686:16686"   # UI
      - "4317:4317"     # 接收 Collector 数据
    restart: unless-stopped

然后分别在两台服务器执行 docker compose up -d 启动服务。

三、让应用把追踪数据发给 Collector

这里以 Python Flask 应用为例,展示如何集成 OpenTelemetry SDK。

1. 安装依赖

pip install opentelemetry-distro opentelemetry-exporter-otlp

2. 在应用启动时初始化

from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

tracer_provider = TracerProvider()
span_processor = BatchSpanProcessor(
    OTLPSpanExporter(endpoint="http://collector-server-ip:4317", insecure=True)
)
tracer_provider.add_span_processor(span_processor)
trace.set_tracer_provider(tracer_provider)

重启应用后,只要代码中有被 OpenTelemetry 自动埋点的请求(比如 Flask 路由),就会产生追踪数据。

四、这两步帮你避开 80% 的坑

  • 端口不通:如果数据没出现在 Jaeger UI,先用 telnet collector-ip 4317telnet jaeger-ip 4317 检查网络连通性。集群环境注意防火墙和安全组规则。
  • 版本不一致:Collector、Exporter、Jaeger 三者版本尽量对齐,推荐使用最新的稳定版。跨大版本可能因协议变更导致数据丢失。
  • 采样率过高:生产环境默认配置会采样 100% 的请求,容易撑爆后端。建议在 Collector 配置中加 `processors:

batch:
memory_limiter:tail_sampling` 处理器。

五、验证你的链路追踪数据

  1. 打开浏览器访问 http://jaeger-server-ip:16686,进入 Jaeger UI。
  2. 在 Service 下拉框中选择你应用的服务名(默认是 unknown_service,可以在 SDK 初始化时设置)。
  3. 点击 Find Traces,如果看到 span 记录,说明整个链路已经跑通。

如果完全没有数据,优先检查 Collector 日志(docker logs otel-collector),看是否有连接拒绝或配置错误。

六、常见问题 FAQ

Q:Collector 必须单独一台机器吗?
A:不一定,新手测试时可以和 Jaeger 部署在同一台。但生产建议分开,方便扩容。

Q:一定要用 Jaeger 吗?
A:推荐 Jaeger 因为它原生支持 OTLP 协议,开箱即用。如果你熟悉 Prometheus + Grafana,也可以改用 Tempo。

Q:应用代码没有改动,能接入追踪吗?
A:部分框架支持自动插桩(如 Flask、Spring Boot),只安装 SDK 并配置环境变量即可,不需要改业务代码。

如果你正在处理 OpenTelemetry 分布式链路追踪服务器集群完整部署,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
宝塔面板对接企业微信钉钉实时推送故障告警脚本
下一篇
RabbitMQ消息队列异步分流AI中转接口请求实操
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意