>我已经将开放跟踪添加到我的 Web 应用程序中,并使用 Jaeger 多合一 docker 映像作为收集器。 我在Windows 10(hyper-v(上运行Docker,并且正在使用Jaeger java客户端。 当我在主机上本地测试 Web 应用程序时,它会成功将跟踪发送到 Jaeger 收集器 docker 实例。 但是,当我在另一个 docker 容器中运行 Web 应用程序时,Jaeger UI 中没有注册任何跟踪。
我已经在同一个 docker 网络上尝试了这两个容器,但没有成功。 docker 容器中的 Web 应用程序可以访问 docker 中包含的其他服务,例如数据库和 ETCD 服务器,而不会出现问题。
我以为我可能有错误的端口,但鉴于它在主机环境中工作的事实,我假设这些是正确的,并且这是一个 docker 配置问题。 我还JAEGER_SAMPLER_TYPE环境变量设置为 const,将 JAEGER_SAMPLER_PARAM 设置为 1,以确保记录所有跟踪。
编辑- 当我查看指标时,似乎 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
我还按照尤里·什库罗(Yuri Shkuro(的建议,尝试了示例项目Hotrod,以解决某人遇到的类似问题。结果与上述完全相同。指标显示正在接收的跨度,但 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 tracer
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 主机是正确的。 消息已到达,但时间/日期在 UI 显示的时间范围范围之外。如果我设置自定义日期范围,我相信它们会出现。集装箱必须已经出去几天了,不断停止和启动,而不仅仅是几个小时。
docker 中的时间漂移是 Mac 和 Windows 操作系统上的已知问题。
使用它检查 docker 容器中的日期/时间(提前道歉(
( ConvertFrom-Json (docker system info --format '{{json .}}') ).SystemTime
或计算漂移...
(Get-Date -DisplayHint DateTime) - [DateTime]( ConvertFrom-Json (docker system info --format '{{json .}}') ).SystemTime
不幸的是,似乎没有比偶尔重新启动容器更好的解决方案了。