Агент Datadog раскрутился в выходных данных контейнера Docker Ошибка соединения RMI JMX

Я получаю отказ в соединении от моего datadog-агента, который пытается собрать метрики JMX (через RMI) из собственного приложения, которое существует в его собственном док-контейнере. Однако jconsole может собирать метрики из приложения, которое существует в его собственном док-контейнере. Агент данных существует в собственном контейнере. Оба контейнера существуют в одной сети на одном хосте. Есть идеи? Я посмотрел на другие вопросы переполнения стека.

  • IP-адрес 0.0.0.0, а также определенный адрес хоста были опробованы в пользовательском файле jmx.yaml /etc/dd-agent/conf.d/jmx.yaml.

Контейнер Docker 0:
* Запускает my_streams_app, который выводит метрики потоков kafka
* Выполнено через:

`docker run -d --name my_streams_app  
      -v /var/run/docker.sock:/var/run/docker.sock:ro  
      -v /proc/:/host/proc/:ro  
      -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro  
      -e API_KEY=someapikeyhere  
      -e SD_JMX_ENABLE=yes -p 9998:9998 --network=my_streams_default quay.io/temp/my_streams`
  • jconsole умеет подбирать испускаемые метрики.

Докер Контейнер 1:
* Запускает datadog-agent в контейнере. * Datadog-agent использует JMX по умолчанию (RMI) для получения метрик из my_streams_app, который существует в контейнере 0, выше.
* оба контейнера работают в одной сети на одном хосте (мой ноутбук MAC OSX)
* возможность netcat из datadog-agent в контейнере Docker в ip my_streams_app и порт в другом контейнере. Используя 0.0.0.0 и 9998, также можно использовать определенные IP-адреса
* команда для запуска агента datadog из контейнера

docker run -v /var/run/docker.sock:/var/run/docker.sock:ro  -v /proc/:/host/proc/:ro -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro -e LOG_LEVEL=DEBUG -e SD_BACKEND=docker --network=mystreams_default 4b1488e74733
  • Конфигурация jmx для сбора метрик с помощью datadog jmx из контейнера:

    экземпляры:

    • хост: 0.0.0.0 порт: 9998 теги: newTag: my_streams jmx_url: "служба:jmx:rmi:///jndi/rmi://0.0.0.0:9998/jmxrmi" имя: jmx_instance

    docker_images: - my_streams_app

    init_config: is_jmx: true conf: - include: domain: '"kafka.streams"' bean: '"kafka.streams": type = "stream-metrics", client-id = "my_test-1-StreamThread-1"' атрибут: commit-call-rate: metric_type: gauge commit-time-avg: metric_type: gauge commit-time-max: metric_type: gauge poll-call-rate: metric_type: gauge

JConsole:
* собирает метрики из my_streams_app в док-контейнере 0 выше через:

jconsole 0.0.0.0:9998  

Ошибка вывода:

2017-07-05 20:48:20,236 | ERROR | App | Cannot connect to instance service:jmx:rmi:///jndi/rmi://0.0.0.0:9998/jmxrmi. java.io.IOException: 

Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 0.0.0.0; nested exception is: 
    java.net.ConnectException: Connection refused (Connection refused)]
java.io.IOException: java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 0.0.0.0; nested exception is: 
    java.net.ConnectException: Connection refused (Connection refused)]
    at org.datadog.jmxfetch.Connection.connectWithTimeout(Connection.java:117)
    at org.datadog.jmxfetch.Connection.createConnection(Connection.java:61)
    at org.datadog.jmxfetch.RemoteConnection.<init>(RemoteConnection.java:56)
    at org.datadog.jmxfetch.ConnectionFactory.createConnection(ConnectionFactory.java:29)
    at org.datadog.jmxfetch.Instance.getConnection(Instance.java:162)
    at org.datadog.jmxfetch.Instance.init(Instance.java:173)
    at org.datadog.jmxfetch.App.init(App.java:511)
    at org.datadog.jmxfetch.App.main(App.java:115)
Caused by: java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 0.0.0.0; nested exception is: 
    java.net.ConnectException: Connection refused (Connection refused)]
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:370)
    at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:268)
    at org.datadog.jmxfetch.Connection$1.run(Connection.java:86)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:473)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 0.0.0.0; nested exception is: 
    java.net.ConnectException: Connection refused (Connection refused)]
    at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:142)
    at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:204)
    at javax.naming.InitialContext.lookup(InitialContext.java:415)
    at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1928)
    at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1895)
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:287)
    ... 7 more
Caused by: java.rmi.ConnectException: Connection refused to host: 0.0.0.0; nested exception is: 
    java.net.ConnectException: Connection refused (Connection refused)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:138)
    ... 12 more
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:198)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:580)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.<init>(Socket.java:429)
    at java.net.Socket.<init>(Socket.java:209)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)

rmiregistry был запущен в соответствии с Не удалось получить заглушку RMIServer

1 ответ

Решение:

  • док-контейнер 0

    • запуск приложения, которое выводит метрики
    • создайте скрипт bash в приложении, которое выводит метрики.
    • в скрипте используйте значение переменной окружения $HOSTNAME контейнера-докера для jmxremote.host и rmi.server.hostname.

    #! / Bin / ш
    java -Djava.util.logging.config.file=logging.properties -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.rmi.port=9998 -Dcom.sun.management.jmxremote.port=9998 -Djava.rmi.server.hostname=$HOSTNAME -Dcom.sun.management.jmxremote.host=$HOSTNAME -Dcom.sun.management.jmxremote.local.only=false -jar /app/my-streams.jar

    • не забудьте установить chmod +x
    • установите CMD dockerfile для запуска приведенного выше сценария следующим образом:
      CMD [ "./"]
  • док-контейнер 1

    • контейнер с агентом данных
    • настройте файл jmx.yaml, как указано выше в вопросе. просто установите хост на имя приложения
  • таким образом, было сделано больше материала, доступного из сообщений переполнения стека. но вышеупомянутое исправляет ошибку поиска метрик от datadog-agent.


Вот как запустить каждый компонент:

док-контейнер 0
* мои потоки
* раскрутить зависимые сервисы во вкладке
** mvn чистый пакет докер: сборка
** докер-сочинить

  • еще одна вкладка раскрутить приложение my-streams-app
    ** docker kill my-streams-app
    ** docker rm my-streams-app
    ** docker run -d - имя my-streams-app -p 9998:9998 - сеть =mystreams_default quay.io/myimage/my-streams

док-контейнер 1
* сборка докера -t dd-agent-my-streams.
* docker run -v /var/run/docker.sock:/var/run/docker.sock:ro -v / proc /: / host / proc /: ro -v / sys / fs / cgroup /: / host / sys / fs / cgroup: ro -e LOG_LEVEL = DEBUG -e SD_BACKEND = docker --network = mystreams_default

SSH в Docker контейнер 1, чтобы проверить, работают ли метрики
* docker ps // чтобы найти имя контейнера для входа
* docker exec -it / bin / bash
root @ 904e6561cc97: / # service-datadog-agent configcheck
root @ 904e6561cc97: / # сервисный агент по обработке данных jmx list_everything
root @ 904e6561cc97: / # служба datadog-agent jmx collect

Другие вопросы по тегам