Приложение Instrument Spring-Boot, которое выполняется в контейнере Docker с трассировкой Jaeger

Я запускаю приложение Spring-Boot внутри контейнера докеров и хочу оснастить его OpenTracing с помощью клиента Jaeger от Uber.

В качестве инструментов я использую 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

Но когда я помещаю приложение Spring-Boot в контейнер Docker со следующим файлом docker-compose и снова запускаю клиент Jaeger, я не вижу никаких следов.

version: '2'

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

После этого я попытался объявить контейнер докеров Jaeger в том же файле docker-compose и добавил ссылку из службы 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.


person TheManawaha    schedule 01.05.2018    source источник


Ответы (1)


Но когда я оборачиваю приложение Spring-Boot в контейнер Docker со следующим файлом docker-compose и снова запускаю клиент Jaeger, я не вижу никаких следов.

Это потому, что клиент Jaeger по умолчанию отправляет интервалы через UDP агенту по адресу localhost. Когда ваше приложение работает в контейнере Docker, ваше localhost там является самим контейнером, так что промежутки теряются.

Поскольку вы связываете контейнер Jaeger со своим приложением, вы можете решить эту проблему, экспортировав env var JAEGER_AGENT_HOST в jaeger.

person jpkrohling    schedule 15.10.2018
comment
Спасибо за ответ, вот как я в итоге решил проблему! - person TheManawaha; 22.10.2018