将跟踪从 docker 容器发送到 VM 中的 Jaeger docker 容器 运行
Issue sending traces from a docker container to a Jaeger docker container running in a VM
我已将 opentracing 添加到我的网络应用程序中,并使用 Jaeger 一体化 docker 图像作为收集器。
我在 运行ning docker windows 10 (hyper-v) 上使用 Jaeger java 客户端。
当我在主机本地测试 Web 应用程序时,它成功地将跟踪发送到 Jaeger 收集器 docker 实例。
但是,当我 运行 另一个 docker 容器中的 Web 应用程序时,在 Jaeger UI.
中没有注册任何痕迹
我在同一个 docker 网络上尝试了两个容器,但没有成功。
docker 容器中的 Web 应用程序可以毫无问题地访问 docker 中的其他服务,例如数据库和 ETCD 服务器。
我以为我的端口可能有误,但考虑到它在主机环境中工作的事实,我假设这些端口是正确的,这是一个 docker 配置问题。
我还将 JAEGER_SAMPLER_TYPE 环境变量设置为 const,将 JAEGER_SAMPLER_PARAM 设置为 1 以确保记录所有痕迹。
Edit - 当我查看指标时,jaeger 似乎正在接收跨度。我对应用程序进行的每次调用都会将此计数递增 1。
jaeger_spans_received_total{debug="false",format="proto",svc="datastore",transport="grpc"} 35
jaeger_spans_saved_by_svc_total{debug="false",result="ok",svc="datastore"} 35
jaeger_traces_received_total{debug="false",format="proto",sampler_type="const",svc="datastore",transport="grpc"} 35
jaeger_traces_saved_by_svc_total{debug="false",result="ok",sampler_type="const",svc="datastore"} 35
我还尝试了示例项目 Hotrod,正如 Yuri Shkuro 在某人遇到的类似问题上所建议的那样。与上面完全相同的结果。指标显示正在接收跨度,但 UI 中未显示任何内容。
编辑 2 - 我已将其缩小到在 hyper-v windows 10 VM 中发生。
如有任何帮助,我们将不胜感激。
谢谢
192.168.0.15 是主机
# deployment of jaeger
docker run --name jaeger-collector -d -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 --network mynetwork jaegertracing/all-in-one:latest
# deployment of app
docker run --add-host etcd-01:192.168.0.15 --name datastore -d -it --rm -p 8030:8080 --network mynetwork datastore:latest
在 Java
中设置 Jaeger 跟踪器
private static io.opentracing.Tracer getJaegerTracer() {
Configuration.SamplerConfiguration samplerConfig = Configuration.SamplerConfiguration.fromEnv().withType("const").withParam(1);
Configuration.SenderConfiguration senderConfig = Configuration.SenderConfiguration.fromEnv()
.withAgentHost("192.168.0.15")
.withAgentPort(6831);
Configuration.ReporterConfiguration reporterConfig = Configuration.ReporterConfiguration.fromEnv().withLogSpans(true).withSender(senderConfig);
Configuration config = new Configuration(DatastoreConstants.SERVICE_NAME).withSampler(samplerConfig).withReporter(reporterConfig);
return config.getTracer();
}
谢谢尤里。是的,这是一个时钟问题。
尽管主机 (VM) 在每次取消暂停时都会更新其时钟,但 docker for windows 却没有。所有容器的时区都是正确的,但时间都完全相同。这一定是 docker 内部时钟,它似乎只在启动时更新一次,而不是在每个新容器启动时更新。尽管所有容器时钟都出现了相同数量的错误,但 windows 主机是正确的。
消息已到达,但 times/dates 超出了 window UI 显示的时间范围。如果我设置自定义日期范围,我确定它们会出现。容器必须在几天前连续停止和启动而不是几个小时。
docker 中的时间漂移是 Mac 和 Windows OS 上的一个已知问题。
使用这个检查 docker 容器中的 date/time(提前致歉)
( ConvertFrom-Json (docker system info --format '{{json .}}') ).SystemTime
或者计算漂移...
(Get-Date -DisplayHint DateTime) - [DateTime]( ConvertFrom-Json (docker system info --format '{{json .}}') ).SystemTime
不幸的是,似乎没有比偶尔重启容器更好的解决方案了。
我已将 opentracing 添加到我的网络应用程序中,并使用 Jaeger 一体化 docker 图像作为收集器。 我在 运行ning docker windows 10 (hyper-v) 上使用 Jaeger java 客户端。 当我在主机本地测试 Web 应用程序时,它成功地将跟踪发送到 Jaeger 收集器 docker 实例。 但是,当我 运行 另一个 docker 容器中的 Web 应用程序时,在 Jaeger UI.
中没有注册任何痕迹我在同一个 docker 网络上尝试了两个容器,但没有成功。 docker 容器中的 Web 应用程序可以毫无问题地访问 docker 中的其他服务,例如数据库和 ETCD 服务器。
我以为我的端口可能有误,但考虑到它在主机环境中工作的事实,我假设这些端口是正确的,这是一个 docker 配置问题。 我还将 JAEGER_SAMPLER_TYPE 环境变量设置为 const,将 JAEGER_SAMPLER_PARAM 设置为 1 以确保记录所有痕迹。
Edit - 当我查看指标时,jaeger 似乎正在接收跨度。我对应用程序进行的每次调用都会将此计数递增 1。
jaeger_spans_received_total{debug="false",format="proto",svc="datastore",transport="grpc"} 35
jaeger_spans_saved_by_svc_total{debug="false",result="ok",svc="datastore"} 35
jaeger_traces_received_total{debug="false",format="proto",sampler_type="const",svc="datastore",transport="grpc"} 35
jaeger_traces_saved_by_svc_total{debug="false",result="ok",sampler_type="const",svc="datastore"} 35
我还尝试了示例项目 Hotrod,正如 Yuri Shkuro 在某人遇到的类似问题上所建议的那样。与上面完全相同的结果。指标显示正在接收跨度,但 UI 中未显示任何内容。 编辑 2 - 我已将其缩小到在 hyper-v windows 10 VM 中发生。
如有任何帮助,我们将不胜感激。
谢谢
192.168.0.15 是主机
# deployment of jaeger
docker run --name jaeger-collector -d -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 --network mynetwork jaegertracing/all-in-one:latest
# deployment of app
docker run --add-host etcd-01:192.168.0.15 --name datastore -d -it --rm -p 8030:8080 --network mynetwork datastore:latest
在 Java
中设置 Jaeger 跟踪器 private static io.opentracing.Tracer getJaegerTracer() {
Configuration.SamplerConfiguration samplerConfig = Configuration.SamplerConfiguration.fromEnv().withType("const").withParam(1);
Configuration.SenderConfiguration senderConfig = Configuration.SenderConfiguration.fromEnv()
.withAgentHost("192.168.0.15")
.withAgentPort(6831);
Configuration.ReporterConfiguration reporterConfig = Configuration.ReporterConfiguration.fromEnv().withLogSpans(true).withSender(senderConfig);
Configuration config = new Configuration(DatastoreConstants.SERVICE_NAME).withSampler(samplerConfig).withReporter(reporterConfig);
return config.getTracer();
}
谢谢尤里。是的,这是一个时钟问题。 尽管主机 (VM) 在每次取消暂停时都会更新其时钟,但 docker for windows 却没有。所有容器的时区都是正确的,但时间都完全相同。这一定是 docker 内部时钟,它似乎只在启动时更新一次,而不是在每个新容器启动时更新。尽管所有容器时钟都出现了相同数量的错误,但 windows 主机是正确的。 消息已到达,但 times/dates 超出了 window UI 显示的时间范围。如果我设置自定义日期范围,我确定它们会出现。容器必须在几天前连续停止和启动而不是几个小时。
docker 中的时间漂移是 Mac 和 Windows OS 上的一个已知问题。
使用这个检查 docker 容器中的 date/time(提前致歉)
( ConvertFrom-Json (docker system info --format '{{json .}}') ).SystemTime
或者计算漂移...
(Get-Date -DisplayHint DateTime) - [DateTime]( ConvertFrom-Json (docker system info --format '{{json .}}') ).SystemTime
不幸的是,似乎没有比偶尔重启容器更好的解决方案了。