2017-07-05 2 views
0

Je reçois une connexion refusée par mon agent de datadog qui tente de collecter des métriques JMX (via RMI) à partir d'une application interne existant dans son propre conteneur docker. Cependant, jconsole est capable de collecter les métriques de l'application qui existe dans son propre conteneur docker. L'agent de datadog existe dans un conteneur qui lui est propre. Les deux conteneurs existent dans le même réseau sur le même hôte. Des idées? J'ai regardé les autres questions de débordement de pile.Datadog-agent généré dans les sorties de conteneur docker Erreur de connexion JMX RMI

  • L'adresse IP 0.0.0.0 et aussi l'adresse hôte spécifique ont été jugés dans la coutume jmx.yaml fichier /etc/dd-agent/conf.d/jmx.yaml

Docker Container 0 :
* Exécute la my_streams_app qui délivre en sortie les métriques flux kafka
* exécuté via:

`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 est capable de ramasser les métriques émises.

Docker Container 1:
* Runs datadog agent dans le récipient * Datadog-agent utilise par défaut JMX (RMI) pour récupérer les paramètres à partir de my_streams_app qui existe dans le contenant 0, ci-dessus.
* les deux conteneurs s'exécutent sur le même réseau dans le même hôte (mon ordinateur portable MAC OSX)
* capable de netcat depuis l'intérieur de l'agent de données dans le conteneur docker vers l'adresse IP my_streams_app et le port de l'autre conteneur. L'utilisation 0.0.0.0 et 9998, peuvent également utiliser des adresses IP spécifiques
* commande pour exécuter l'agent datadog à l'intérieur d'un conteneur

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 
  • configuration JMX pour la collecte des paramètres par datadog JMX à l'intérieur du conteneur:

    instances:

    • hôte: 0.0.0.0 Port : 9998 tags: newTag: my_streams jmx_url: "service: JMX: rmi: /// jndi/rmi: //0.0.0.0: 9998/jmxrmi" Nom : jmx_instance

    docker_images: - my_streams_app

    init_config: is_jmx: true conf: - inclure: domaine: '"kafka.streams"' haricot: '"kafka.flux ": type =" flux-Metrics », client-id = « my_test-1-StreamThread-1" » attribut: commit-appels de taux: metric_type: jauge commit-temps moyen: metric_type: jauge commit-temps max: metric_type: évaluer sondage-appels taux: metric_type: jauge

JConsole:
* recueille les métriques de my_streams_app dans le conteneur docker 0, au-dessus via:

jconsole 0.0.0.0:9998 

sortie d'erreur:

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 a été démarré selon Failed to retrieve RMIServer stub

+0

Il vous manque beaucoup d'informations pertinentes ici. Quelle est la configuration de Datadog pour se connecter à JMX? Comment les conteneurs sont-ils démarrés (commandes 'docker')? Comment se connecte jconsole (IP, informations d'identification, port, etc.)? Quelles versions des choses (Docker, OS hôte, etc)? Veuillez modifier votre question pour ajouter cette information afin que nous puissions mieux reproduire le problème. –

Répondre

0

La solution:

  • conteneur docker 0

    • exécution de l'application qui génère les métriques
    • crée un script bash dans l'application qui génère les métriques.
    • Dans le script, utilisez la valeur de la variable d'environnement $ HOSTNAME du conteneur de docker pour le jmxremote.host et le 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

    • n'oubliez pas de mettre chmod + x
    • définir le dockerfile CMD pour exécuter le scri pt ci-dessus comme ceci:
      CMD [ "./"]
  • conteneur docker 1

    • le récipient exécutant l'agent de datadog
    • configurer le fichier jmx.yaml comme mentionné ci-dessus dans la question. Il suffit de définir l'hôte sur le nom de l'application.
  • De nombreuses autres tâches ont été effectuées depuis les postes de débordement de la pile. mais ce qui précède corrige l'erreur de recherche de métrique de l'agent de datadog.


Voici comment exécuter chaque composant:

conteneur docker 0
* my-flux
* spin up services dépendants dans l'onglet
** package mvn clean docker: build
** docker-composer vers le haut

  • un autre onglet spin up my-flux-app
    ** docker tuer mes-flux-app
    ** docker rm my-flux-app
    ** run docker -d --name my-flux-app -p 9998: 9998 - network = mystreams_default quay.io/myimage/my-streams~~V~~singular~~3rd

récipient de menu fixe 1
* docker construire dd -t-agent-my-flux.
* docker run -v /var/run/docker.sock:/var/run/docker.sock:ro -v/proc /: /hôte/proc/: ro -v/sys/fs/cgroup /:/hôte/sys/fs/cgroup: ro -e LOG_LEVEL = DEBUG -e SD_BACKEND = docker --network = mystreams_default

ssh dans le conteneur docker 1 pour vérifier si les mesures fonctionnent
* docker ps // pour trouver le nom de le conteneur de se connecter à
* docker exec -it/bin/bash
root @ 904e6561cc97:/# Service datadog agent configcheck
root @ 904e6561cc97:/# Service JMX datadog agent list_everything
root @ 904e6561cc97:/# service datadog-agent jmx collect