使用Jaeger跟踪在Docker容器中执行的Instrument Spring-Boot应用程序

时间:2018-05-01 14:20:35

标签: spring docker spring-boot opentracing jaeger

我正在Docker容器中运行Spring-Boot应用程序,并希望使用Uber的Jaeger客户端使用OpenTracing进行检测。

对于检测,我将OpenTracing Spring Web库与Jaeger客户端结合使用。

以下代码段配置应用程序中的跟踪器:

@Bean
public io.opentracing.Tracer jaegerTracer() {
    return new Configuration("hello_service", new Configuration.SamplerConfiguration(ProbabilisticSampler.TYPE, 1),
            new Configuration.ReporterConfiguration())
            .getTracer();
}

我在运行应用程序时(不在Docker容器内)可以看到跟踪,并使用以下命令启动Jaeger:

docker run -d -e
COLLECTOR_ZIPKIN_HTTP_PORT=9411
-p 5775:5775/udp
-p 6831:6831/udp
-p 6832:6832/udp
-p 5778:5778
-p 16686:16686
-p 14268:14268
-p 9411:9411
jaegertracing/all-in-one:latest

但是当我使用以下docker-compose文件将Spring-Boot应用程序包装在Docker容器中并再次启动Jaeger客户端时,我看不到任何痕迹。

version: '2'

services:
        demo:
                build: opentracing_demo/.
                ports: 
                        - "8080:8080"

之后,我尝试在同一个docker-compose文件中声明Jaeger docker容器,并添加了demo服务到jaeger服务的链接:

version: '2'

services:
    demo:
            build: opentracing_demo/.
            ports: 
                    - "8080:8080"
            links:
                    - jaeger
    jaeger: 
            image: jaegertracing/all-in-one:latest
            ports:
                    - "5775:5775/udp"
                    - "6831:6831/udp"
                    - "6832:6832/udp"
                    - "5778:5778"
                    - "16686:16686"
                    - "14268:14268"
                    - "9411:9411"

但我仍然看不到Jaeger客户的任何痕迹。

几个小时我尝试了不同的方法,但到目前为止没有取得任何进展,如果有人能帮助我,我会非常感激!

您可以在GitHub上找到我的演示项目。

1 个答案:

答案 0 :(得分:1)

  

但是当我将Spring-Boot应用程序包装到带有以下docker-compose文件的Docker容器中并再次启动Jaeger客户端时,我看不到任何痕迹

这是因为Jaeger客户端默认情况下将通过UDP将跨度发送到位于localhost的代理。当您的应用程序在Docker容器中运行时,您的localhost存在容器本身,因此跨度会丢失。

在将Jaeger容器与应用程序链接时,您可能希望通过将环境变量JAEGER_AGENT_HOST导出到jaeger来解决该问题。