Comment accéder à une interface JMX dans le panneau de l'extérieur?
Je suis en train de surveiller à distance une machine virtuelle java s'exécutant dans le panneau. La configuration ressemble à ceci:
-
machine 1: exécute une JVM (dans mon cas, l'exécution de kafka) dans le menu fixe sur une machine ubuntu; l'adresse IP de cette machine est 10.0.1.201; l'application en cours d'exécution dans le menu fixe est à 172.17.0.85.
-
machine 2: pistes de JMX surveillance
Remarque que quand je lance JMX de surveillance de la machine 2, il ne fonctionne pas avec une version de l'erreur suivante (remarque: la même erreur se produit quand je lance jconsole, jvisualvm, jmxtrans, et le nœud-jmx/mnp:jmx):
La trace de la pile en cas d'absence ressemble à quelque chose comme ce qui suit pour chacun des JMX outils de suivi:
java.rmi.ConnectException: Connection refused to host: 172.17.0.85; nested exception is
java.net.ConnectException: Operation timed out
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
(followed by a large stack trace)
Maintenant la partie intéressante, c'est quand je lance le même outils (jconsole, jvisualvm, jmxtrans, et le nœud-jmx/mnp:jmx) sur la même machine que celle qui est en cours d'exécution docker (machine 1 à partir de ci-dessus) JMX de surveillance fonctionne correctement.
Je pense que cela donne à penser que mon JMX port est actif et fonctionne correctement, mais quand je l'execute JMX de surveillance à distance (à partir de la machine 2), il ressemble à la JMX outil ne reconnaît pas l'interne docker IP (172.17.0.85)
Ci-dessous sont pertinentes (je pense) réseau d'éléments de configuration sur la machine 1, où JMX de surveillance de travaux (notez le menu fixe ip, 172.17.42.1):
docker0 Link encap:Ethernet HWaddr ...
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr:... Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6787941 errors:0 dropped:0 overruns:0 frame:0
TX packets:4875190 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1907319636 (1.9 GB) TX bytes:639691630 (639.6 MB)
wlan0 Link encap:Ethernet HWaddr ...
inet addr:10.0.1.201 Bcast:10.0.1.255 Mask:255.255.255.0
inet6 addr:... Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4054252 errors:0 dropped:66 overruns:0 frame:0
TX packets:2447230 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2421399498 (2.4 GB) TX bytes:1672522315 (1.6 GB)
Et c'est le réseau concerné les éléments de configuration sur la machine distante (machine 2) à partir de laquelle je suis JMX erreurs:
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=1<PERFORMNUD>
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether ....
inet6 ....%en1 prefixlen 64 scopeid 0x5
inet 10.0.1.203 netmask 0xffffff00 broadcast 10.0.1.255
nd6 options=1<PERFORMNUD>
media: autoselect
status: active
- J'ai créé un projet GitHub qui contient un prêt à aller de mise en œuvre de JMX à partir d'un conteneur Docker. Il contient un
Dockerfile
avec une bonneentrypoint.sh
, et undocker-compose.yml
pour un déploiement facile.
Vous devez vous connecter pour publier un commentaire.
Pour l'exhaustivité, la solution suivante a travaillé. La JVM doit être exécuté avec les paramètres spécifiques établies pour activer à distance le panneau de JMX de surveillance ont été comme suit:
Une fois que ceci est fait, vous devriez être en mesure d'exécuter JMX de surveillance (jmxtrans, nœud-jmx, jconsole, etc) à partir d'un local ou à distance de la machine.
Grâce à @Chris-Heald pour faire ce vraiment une solution rapide et simple!
-Dcom.sun.management.jmxremote.port=1098
Et se connecter à ce port au lieurmi.port
-Djava.rmi.server.hostname=<IP>
était le plus important pour moi. Merci!!!!-Dcom.sun.management.jmxremote.rmi.port
est utilisé par le client (c'est à dire VisualVM) pour se connecter, même lors de l'utilisation de SSH de la redirection de port. Par exemple, si vous définissez-Dcom.sun.management.jmxremote.rmi.port=8888
et vous nedocker run -p25000:8888 ...
, alors vous SSH avec la redirection de portssh -L 8888:localhost:25000 your-docker-host.com
et ensuite vous pouvez vous connecter avec VisualVM à l'aide delocalhost:8888
.Pour l'environnement de dev, vous pouvez définir
java.rmi.server.hostname
à la fourre-tout de l'adresse IP 0.0.0.0Exemple:
Je l'ai trouvé qu'en essayant de mettre en place JMX plus de RMI est une douleur, surtout en raison de la
-Djava.rmi.server.hostname=<IP>
lequel vous devez spécifier au démarrage. Nous menons notre menu fixe des images dans Kubernetes où tout est dynamique.J'ai fini par utiliser JMXMP au lieu de RMI, que ce besoin soit d'un port TCP ouvert, et pas de nom d'hôte.
Mon projet actuel utilise Printemps, qui peut être configuré par l'ajout de cette:
(À l'extérieur au Printemps, vous devez configurer votre propre JMXConncetorServer pour faire ce travail)
Avec cette dépendance (depuis JMXMP est une extension facultative et ne fait pas partie du JDK):
Et vous devez ajouter le même bocal votre classpath lors du démarrage de JVisualVM afin de se connecter sur JMXMP:
Puis se connecter avec la chaîne de connexion suivante:
(Port par défaut est 9875)