跨主机运行服务的Jaeger后端配置及教程适配设置问题
刚好处理过不少跨主机部署Jaeger的场景,来给你详细解答这两个问题:
1. 跨主机场景下的Jaeger后端配置
要让不同主机上的服务都能把追踪数据发到同一Jaeger后端,核心是解决网络连通和客户端配置两个问题:
- 先搞定网络可达性:
确保Jaeger后端所在主机的防火墙/安全组开放了必要端口:- Collector的HTTP端口:14268(默认)
- Collector的gRPC端口:14250(默认)
- 如果用Jaeger Agent转发,还要开放Agent的UDP端口:6831/6832(默认)
可以在服务主机上用curl http://<jaeger主机IP>:14268测试是否能连通。
- 选择合适的部署模式:
- 直接发送到Collector:适合服务数量不多、网络稳定的场景。只需要在每个服务的Jaeger客户端里,把数据发送地址配置成Jaeger主机的IP/域名+Collector端口,比如HTTP地址就是
http://<jaeger主机IP>:14268/api/traces。 - 通过Agent转发:适合服务数量多或者网络波动大的场景。在每个服务所在的主机上部署一个轻量的Jaeger Agent(守护进程),服务客户端只需要把数据发给本地Agent(默认是
localhost:6831),再让Agent批量转发到远端的Collector。启动Agent的时候指定Collector地址就行,比如:jaeger-agent --reporter.grpc.host-port=<jaeger主机IP>:14250
- 直接发送到Collector:适合服务数量不多、网络稳定的场景。只需要在每个服务的Jaeger客户端里,把数据发送地址配置成Jaeger主机的IP/域名+Collector端口,比如HTTP地址就是
2. 针对你提到的Java教程的具体设置
那个教程里的示例是多服务的分布式追踪场景,要让不同主机上的服务都发数据到同一Jaeger后端,这么改就行:
- 方法一:修改代码配置
教程里创建Tracer的代码大概是用JaegerTracer.Builder,你需要给Reporter指定远端Collector的地址,比如:
每个服务都要对应修改自己的服务名称和Collector地址。JaegerTracer tracer = new JaegerTracer.Builder("你的服务名称") .withReporter(new RemoteReporter.Builder() .withSender(new HttpSender("http://<jaeger主机IP>:14268/api/traces")) .build()) .withSampler(new ConstSampler(true)) .build(); - 方法二:用环境变量(更方便,不用改代码)
运行每个服务的时候,先设置环境变量指定Jaeger的Endpoint:- Linux/macOS终端:
export JAEGER_ENDPOINT=http://<jaeger主机IP>:14268/api/traces # 然后启动你的Java服务,比如 java -jar your-service.jar - Windows命令行:
set JAEGER_ENDPOINT=http://<jaeger主机IP>:14268/api/traces # 再启动Java服务
- Linux/macOS终端:
- 要是你想用Agent模式,就在每个服务主机上先启动Jaeger Agent(命令参考上面第一部分),然后服务的客户端保持默认的本地Agent配置就行,不用改代码或者环境变量。
内容的提问来源于stack exchange,提问作者user1532146
相关产品推荐
相关产品推荐

