Проблема с отправкой трассировок из контейнера докеров в контейнер докеров Jaeger, работающий на виртуальной машине

Я добавил функцию открывания в свое веб-приложение и использую образ докера Jaeger all-in-one в качестве сборщика. Я запускаю докер в Windows 10 (hyper-v) и использую java-клиент Jaeger. Когда я тестирую веб-приложение локально на хост-машине, оно успешно отправляет трассировки в экземпляр докера сборщика Jaeger. Однако, когда я запускаю веб-приложение в другом контейнере докеров, в пользовательском интерфейсе Jaeger не регистрируется никаких следов.

Я безуспешно пробовал оба контейнера в одной сети докеров. Веб-приложение в контейнере докеров может без проблем обращаться к другим службам в докерах, например к базе данных и серверу ETCD.

Я думал, что у меня могут быть неправильные порты, но, учитывая тот факт, что он работает в среде хоста, я предполагаю, что они правильные и что это проблема конфигурации докера. Я также установил для переменной среды JAEGER_SAMPLER_TYPE значение const, а для JAEGER_SAMPLER_PARAM - значение 1, чтобы обеспечить регистрацию всех трассировок.

Изменить. Когда я смотрю на показатели, мне кажется, что jaeger получает интервалы. Каждый вызов, который я делаю в приложение, увеличивает этот счет на единицу.

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, предложенный Юрием Шкуро на подобная проблема у кого-то была. Точно такой же результат, как указано выше. Метрики показывают полученные интервалы, но в пользовательском интерфейсе ничего не отображается. Редактировать 2. Я сузил его до виртуальной машины с Windows 10 Hyper-V.

Любая помощь будет оценена по достоинству.

Спасибо

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

Настройка Jaeger Tracer на Java

 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();
    }


person Schaffer    schedule 09.06.2020    source источник
comment
Интересно, есть ли у вас проблема с часами, когда временные метки, указанные в промежутках, отличаются от того, что пользовательский интерфейс считает текущим временем, и, следовательно, временное окно, которое пользовательский интерфейс отправляет на сервер, не соответствует данным диапазона.   -  person Yuri Shkuro    schedule 10.06.2020


Ответы (2)


Спасибо, Юрий. Да, это была проблема с часами. Хотя хост-машина (ВМ) обновляла свои часы при каждом возобновлении работы, docker для Windows этого не делал. Часовые пояса были правильными для всех контейнеров, но время у всех было на одну и ту же величину. Это должны быть внутренние часы докера, которые, кажется, обновляются только один раз при запуске, а не при запуске каждого нового контейнера. Хотя все часы контейнера были отключены на одинаковую величину, хост-машина Windows была правильной. Сообщения приходили, но время / даты находились за пределами временного интервала, отображаемого пользовательским интерфейсом. Если я установлю произвольный диапазон дат, я уверен, что они появятся. Контейнеры должны были выйти через несколько дней с постоянной остановкой и запуском, а не через несколько часов.

person Schaffer    schedule 10.06.2020

Дрейф времени в докере - известная проблема в Mac и ОС Windows.

Проверьте дату / время в контейнере докеров, используя это (заранее извиняюсь)

( ConvertFrom-Json (docker system info --format '{{json .}}') ).SystemTime

или посчитать дрейф ...

(Get-Date -DisplayHint DateTime) - [DateTime]( ConvertFrom-Json (docker system info --format '{{json .}}') ).SystemTime

К сожалению, лучшего решения, чем периодический перезапуск контейнера, нет.

person Stephen Dunne    schedule 19.02.2021