在Docker容器输出JMX RMI连接错误的Datadog代理启动

我正在尝试从自己的Docker容器中存在的内部应用程序收集JMX(通过RMI)指标的datadog-agent拒绝连接。 但是,jconsole能够从自己的Docker容器中存在的应用程序收集指标。 datadog-agent存在于它自己的容器中。 两个容器都存在于同一主机上的同一个networking中。 有任何想法吗? 我看了其他堆栈溢出问题。

  • 已经在自定义的jmx.yaml文件/etc/dd-agent/conf.d/jmx.yaml中尝试了IP地址0.0.0.0以及特定的主机地址

Docker容器0:
*运行输出kafkastream指标的my_streams_app
*执行通过:

`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是能够拿起度量emmitted。

docker集装箱1:
*在容器中运行datadog-agent * Datadog-agent使用JMX默认(RMI)从上面的容器0中的my_streams_app中获取指标。
*两个容器在相同的主机(我的笔记本电脑的MAC OSX)在同一个networking上运行
*能够从docker容器中的datadog-agent内的netcat到另一个容器中的my_streams_app ip和端口。 使用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 
  • jmxconfiguration从容器内通过datadog jmx收集指标:

    实例:

    • host:0.0.0.0 port:9998 tags:newTag:my_streams jmx_url:“service:jmx:rmi:/// jndi / rmi://0.0.0.0:9998 / jmxrmi”name: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-calls-rate:metric_type:gauge commit-time-avg:metric_type:gauge提交时间最大值:metric_type:gauge poll-calls-rate:metric_type:gauge

JConsole的:
*通过以下方式从Docker容器0中的my_streams_app收集指标:

 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) 

rmir​​egistry已经启动,因为无法检索RMIServer存根

解决scheme:

  • docker集装箱0

    • 运行输出指标的应用程序
    • 在输出指标的应用程序中创build一个bash脚本。
    • 在脚本中使用Docker容器$ HOSTNAME环境variables的值设置为jmxremote.host和rmi.server.hostname。

    #!/ bin / sh的
    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
    • 设置dockerfile CMD运行上面的脚本,如下所示:
      CMD [ “./”]
  • docker集装箱1

    • 运行datadog代理的容器
    • 在问题中configuration上面提到的jmx.yaml文件。 只需将主机设置为应用程序名称
  • 方式更多的东西已经完成,可从堆栈溢出post。 但上面修复了从datadog-agent发现错误的指标。


以下是如何运行每个组件:

docker集装箱0
*我的stream
*在标签中打开相关的服务
** mvn清洁套件docker:build
docker工人组成起来

  • 另一个选项卡旋转了我的stream应用程序
    docker工杀死我的stream应用程序
    docker工人我的stream应用程序
    **docker运行-d –name my-streams-app -p 9998:9998 – network = mystreams_default quay.io/myimage/my-streams

docker集装箱1
docker build -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以validation指标是否正常工作
* docker ps //find要login的容器的名称
docker exec -it / bin / bash
root @ 904e6561cc97:/#service datadog-agent configcheck
root @ 904e6561cc97:/#service datadog-agent jmx list_everything
root @ 904e6561cc97:/#service datadog-agent jmx collect