From fd91ed812427b51fcc545fa5bc640576a34b6193 Mon Sep 17 00:00:00 2001 From: Kevin Turner <83819+keturn@users.noreply.github.com> Date: Wed, 17 Nov 2021 15:12:21 -0800 Subject: [PATCH 1/8] doc: introducing JDK Mission Control's JMX Console --- docs/.nojekyll | 0 ... Metrics with JMC - JDK Mission Control.md | 102 ++++++++++++++++++ docs/_sidebar.md | 1 + docs/index.html | 56 ++++++++++ 4 files changed, 159 insertions(+) create mode 100644 docs/.nojekyll create mode 100644 docs/Monitoring Metrics with JMC - JDK Mission Control.md create mode 100644 docs/_sidebar.md create mode 100644 docs/index.html diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/Monitoring Metrics with JMC - JDK Mission Control.md b/docs/Monitoring Metrics with JMC - JDK Mission Control.md new file mode 100644 index 0000000..eee0ad2 --- /dev/null +++ b/docs/Monitoring Metrics with JMC - JDK Mission Control.md @@ -0,0 +1,102 @@ +# Monitoring Metrics with JMC (JDK Mission Control) + + + +# Introduction + +## Who is this for? + +This document is for contributors to Terasology— +mainly developers and testers— +who want a way to peek under the hood while the game is running. + +Some of these techniques can be used without a full Terasology development environment, +but you should be comfortable running Java applications from the command line. + +## How is this different than Java Flight Recordings? + +If you've read [Analyzing JFR Recordings], you might be wondering how this is different. + +[Analyzing JFR Recordings]: https://github.com/Terasology/TutorialProfiling/wiki/Analyzing-JFR-Recordings + +Flight recordings are detailed logs of events over a short period of time. +You can analyze a flight recording to learn about what happened during that time in the past. + +Here we'll be exploring a different feature of JMC, its JMX Console.1 +The JMX Console lets you see the _current state_ of a process. +Instead of reading a log recorded by the application, it polls it for the current value of metrics you're interested in. + +
+
+ +**JFR** + +- 🖨 writes a log file +- 📥 can be attached to a bug report for later review + +
+
+ +**JMX** + +- 🩺 connects to a live process +- 📡 can connect to a remote server + +
+
+ + + + +1. When you see “MBean Server” in Mission Control, it's referring to the same thing. +Its JMX Console is the interface it provides to an application's MBean server. + + +# Prerequisite: Install JMC + +Download the latest stable release of [JDK Mission Control from AdoptOpenJDK](https://adoptopenjdk.net/jmc.html). + +Unpack the archive and run the program inside:`jmc` + + + + +# Local Use + +## Connecting to Terasology + +## Terasology's Metrics + +- adding custom charts + +## Adding a Connection + +### Creating a password file + +- create `jmxremote.password` + +### Setting the ports + +- configuring the process + - `gradle game --jmx-port` + - with Terasology.bat or .sh: set `TERASOLOGY_OPTS` + - with Launcher: ??? + +### New Connection in JMC + +- creating the connection +- your charts should now be persistent + +# Remote Use + +- same process as “adding a connection” +- use a SSH tunnel? + + +# Adding New Metrics to Terasology + +🚧 We haven't settled on the API for this yet. +Add a meter to Micrometer's global registry, and it'll be available via JMX. diff --git a/docs/_sidebar.md b/docs/_sidebar.md new file mode 100644 index 0000000..3576952 --- /dev/null +++ b/docs/_sidebar.md @@ -0,0 +1 @@ +- [Monitoring Metrics with JMC (JDK Mission Control)](Monitoring%20Metrics%20with%20JMC%20-%20JDK%20Mission%20Control.md) diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..6588f9f --- /dev/null +++ b/docs/index.html @@ -0,0 +1,56 @@ + + + + + + + + Terasology Profiling Tutorial + + + + + + + +
+ + + + + + + + + + + + From bb5f73bdf2f01deace8ba771e2cb82ef5b96499a Mon Sep 17 00:00:00 2001 From: Kevin Turner <83819+keturn@users.noreply.github.com> Date: Sun, 21 Nov 2021 15:17:00 -0800 Subject: [PATCH 2/8] doc(JMX): connecting and adding a new chart --- ... Metrics with JMC - JDK Mission Control.md | 53 +++++++++++++++--- .../JMC JMX Console - Default.halfsize.webp | Bin 0 -> 27074 bytes docs/_media/JMC/JMC JVM Browser.webp | Bin 0 -> 9550 bytes .../JMC/JMC MBean Browser - Filtered.webp | Bin 0 -> 9550 bytes 4 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 docs/_media/JMC/JMC JMX Console - Default.halfsize.webp create mode 100644 docs/_media/JMC/JMC JVM Browser.webp create mode 100644 docs/_media/JMC/JMC MBean Browser - Filtered.webp diff --git a/docs/Monitoring Metrics with JMC - JDK Mission Control.md b/docs/Monitoring Metrics with JMC - JDK Mission Control.md index eee0ad2..24ccda1 100644 --- a/docs/Monitoring Metrics with JMC - JDK Mission Control.md +++ b/docs/Monitoring Metrics with JMC - JDK Mission Control.md @@ -50,7 +50,7 @@ Instead of reading a log recorded by the application, it polls it for the curren - +#### Footnotes 1. When you see “MBean Server” in Mission Control, it's referring to the same thing. Its JMX Console is the interface it provides to an application's MBean server. @@ -68,31 +68,70 @@ Unpack the archive and run the program inside:`jmc` ## Connecting to Terasology +The JVM Browser in JMC shows all Java processes running on your computer: + +Each is listed with its main class and process identifier. Selecting a process reveals several options. + +Choose the MBean Server for the Terasology process. +The dashboard shows current memory and CPU usage on speedometer-style gauges, and charts recent values on line graphs. + +This should take you to an Overview with charts showing the process's current resource usage. + +
+ ## Terasology's Metrics -- adding custom charts +By default, the Overview shows you some measurements common to all Java processes: Memory and CPU usage. +What if we're interested in something else? + +We can create custom charts to include other metrics, including those unique to the Terasology engine. +Please experiment here and make the charts your own, but a word of warning: +_do not get too attached to your charts right now._ +There is a good chance that JMC will not save them.2 + +We'll talk about how to work around that later, but first let's find out what we can look at. +Make sure you have a Terasology game running for this part; +some metrics are only collected while a world is loaded, and won't show up if you're still at the main menu. + +Select the MBean Browser tab: + +The MBean Browser shows a tree with available MBeans, and the attributes of the selected entry. + +Each MBean represents some value we can monitor. +The **Filter** control lets us search them by name: +for example, we can filter by `*fps` to find the entry for the engine's framerate.3 + +Right-click on its **Number** attribute, choose **Visualize**, and JMC will prompt you about adding it to a chart. + +#### Footnotes +2. At least as of JMC 8.1.0, it seems to treat every process as unique. +When the current process ends and you connect to a different Terasology process later, +it reverts to the default configuration. +3. If your version has something named differently, it's okay. +We haven't figured out how we're categorizing all these things yet. +Regardless of the name, as long as it has a Number attached to it, you can chart it. -## Adding a Connection +# Adding a Connection -### Creating a password file +## Creating a password file - create `jmxremote.password` -### Setting the ports +## Setting the ports - configuring the process - `gradle game --jmx-port` - with Terasology.bat or .sh: set `TERASOLOGY_OPTS` - with Launcher: ??? -### New Connection in JMC +## New Connection in JMC - creating the connection - your charts should now be persistent # Remote Use -- same process as “adding a connection” +- set up jmx port, create Connection - use a SSH tunnel? diff --git a/docs/_media/JMC/JMC JMX Console - Default.halfsize.webp b/docs/_media/JMC/JMC JMX Console - Default.halfsize.webp new file mode 100644 index 0000000000000000000000000000000000000000..ea8515d29b271317e60f7bd32722795b230cd445 GIT binary patch literal 27074 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 xZ0OWjr!ZlSeMd$U-D3&A6!;~=FJtDHF@Bx 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 T?aHkwJX`kV^R!uM2kQR=?fO7R literal 0 HcmV?d00001 diff --git a/docs/_media/JMC/JMC MBean Browser - Filtered.webp b/docs/_media/JMC/JMC MBean Browser - Filtered.webp new file mode 100644 index 0000000000000000000000000000000000000000..c24892d669779700f9414062a52f5377079774de GIT binary patch literal 9550 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 literal 0 HcmV?d00001 From 0740657d97f393863d2d04e1cd5a160246649a77 Mon Sep 17 00:00:00 2001 From: Kevin Turner <83819+keturn@users.noreply.github.com> Date: Sat, 27 Nov 2021 16:56:29 -0800 Subject: [PATCH 3/8] doc(JMX): server ports and password --- ... Metrics with JMC - JDK Mission Control.md | 111 ++++++++++++++++-- 1 file changed, 102 insertions(+), 9 deletions(-) diff --git a/docs/Monitoring Metrics with JMC - JDK Mission Control.md b/docs/Monitoring Metrics with JMC - JDK Mission Control.md index 24ccda1..4a88b1b 100644 --- a/docs/Monitoring Metrics with JMC - JDK Mission Control.md +++ b/docs/Monitoring Metrics with JMC - JDK Mission Control.md @@ -111,28 +111,121 @@ it reverts to the default configuration. We haven't figured out how we're categorizing all these things yet. Regardless of the name, as long as it has a Number attached to it, you can chart it. + # Adding a Connection +The JVM browser gave us a quick way to get started, +but if we're going to be using this often it helps to explicitly define a Connection. +The two main benefits of this are: + +1. It's how we make connections remotely accessible. + This can be especially useful for troubleshooting a headless server. +2. A named Connection keeps its configuration through restarts. + That's why it's helpful to set up even for local use. + +There some tools available to help configure this for a server running in a development workspace. +An installed version can be configured this way too, +it's just a little more verbose to do so. + ## Creating a password file -- create `jmxremote.password` +First we set up the username and password that will secure the connection to the JMX server. + +
+
+ +If you are running a server from a **development workspace**: + +- run `gradlew jmxPassword` +- edit `config/jmxremote.password` + + +
+
+ +If you are running a server **without development sources**: + +- Find the [`jmxremote.password.template`][passwordTemplate] file. + You can use the linked version + or look in the `conf/management` subdirectory of your local Java installation. +- Save a copy as `jmxremote.password` someplace that you can edit. +- Set its file permissions so it is readable _only_ by its owner, + not open to other users on the system. + +[passwordTemplate]: https://raw.githubusercontent.com/openjdk/jdk/jdk-11%2B28/src/jdk.management.agent/share/conf/jmxremote.password.template +
+
+ +For **all cases,** add a line (uncommented) to your `jmxremote.password` defining a password for `controlRole`. +Change it to something other than the example `R&D`. + + +## Setting Server Ports + +The JMX server needs two open ports. + +
+
+ +If you are running a server from a **development workspace**, +add the `--jmx-port` parameter to the task when you start your game. +For example: + + gradlew game --jmx-port=8901 + +Note that because JMX requires _two_ ports, +the server in the above example will need both 8901 **and** 8902 to be available. + +
+
+ +If you are starting the server **without development sources** from the `Terasology.bat` or `Terasology` script, +you can configure Java options by setting the `TERASOLOGY_OPTS` environment variable: -## Setting the ports +TERASOLOGY_OPTS="-Dcom.sun.management.jmxremote.port=**8901** +-Dcom.sun.management.jmxremote.rmi.port=**8902** +-Dcom.sun.management.jmxremote.password.file=**config/jmxremote.password** +-Dcom.sun.management.jmxremote.ssl=false" + + +Set the bold values (the two port numbers and the password filename) as appropriate for your environment. + +The specifics of how to set an environment variable and ensure it is available to the Terasology script +depend on your operating system and choice of command shell. + +
+
+ + -- configuring the process - - `gradle game --jmx-port` - - with Terasology.bat or .sh: set `TERASOLOGY_OPTS` - - with Launcher: ??? ## New Connection in JMC - creating the connection - your charts should now be persistent -# Remote Use -- set up jmx port, create Connection -- use a SSH tunnel? +# TODO: Remote Use + +_[🧩 Help with investigating and documenting this topic is welcome!]_ + +We already set up the server to listen on network ports. + +We also want to +- either set up SSL certificates + + likely requires more configuration for both JMC _and_ server, which sounds no fun +- **or** make sure non-SSL ports are accessible _only_ on the loopback interface + + then set up an encrypted tunnel to them with ssh or …? + + +#### What would be the risk of using unencrypted connections? + +The password provides some bit of protection, +but it could be intercepted from an unencrypted connection. + +Worst case, an adversary with access to the port and the password can run arbitrary code in the server process. + +Do not expect Terasology's module sandbox to protect against code invoked by JMX. # Adding New Metrics to Terasology From e123d6a57e2a57fa898b5cc93b2586724adfc335 Mon Sep 17 00:00:00 2001 From: Kevin Turner <83819+keturn@users.noreply.github.com> Date: Sat, 27 Nov 2021 17:56:00 -0800 Subject: [PATCH 4/8] doc(JMX): allow flexboxes to wrap --- ... Metrics with JMC - JDK Mission Control.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/Monitoring Metrics with JMC - JDK Mission Control.md b/docs/Monitoring Metrics with JMC - JDK Mission Control.md index 4a88b1b..96ea6ba 100644 --- a/docs/Monitoring Metrics with JMC - JDK Mission Control.md +++ b/docs/Monitoring Metrics with JMC - JDK Mission Control.md @@ -29,8 +29,8 @@ Here we'll be exploring a different feature of JMC, its JMX Console.1 The JMX Console lets you see the _current state_ of a process. Instead of reading a log recorded by the application, it polls it for the current value of metrics you're interested in. -
-
+
+
**JFR** @@ -38,7 +38,7 @@ Instead of reading a log recorded by the application, it polls it for the curren - 📥 can be attached to a bug report for later review
-
+
**JMX** @@ -131,17 +131,16 @@ it's just a little more verbose to do so. First we set up the username and password that will secure the connection to the JMX server. -
-
+
+
If you are running a server from a **development workspace**: - run `gradlew jmxPassword` - edit `config/jmxremote.password` -
-
+
If you are running a server **without development sources**: @@ -164,8 +163,8 @@ Change it to something other than the example `R&D`. The JMX server needs two open ports. -
-
+
+
If you are running a server from a **development workspace**, add the `--jmx-port` parameter to the task when you start your game. @@ -177,7 +176,7 @@ Note that because JMX requires _two_ ports, the server in the above example will need both 8901 **and** 8902 to be available.
-
+
If you are starting the server **without development sources** from the `Terasology.bat` or `Terasology` script, you can configure Java options by setting the `TERASOLOGY_OPTS` environment variable: From 1157aff80fd7bb20593608229f16fe75f2a62e87 Mon Sep 17 00:00:00 2001 From: Kevin Turner <83819+keturn@users.noreply.github.com> Date: Sun, 28 Nov 2021 17:23:10 -0800 Subject: [PATCH 5/8] doc(TutorialProfiling): use docsify-tabs Cleaner markup than my inline flexbox styling, and all tabs with the same name switch together. --- ... Metrics with JMC - JDK Mission Control.md | 41 ++++++++----------- docs/index.html | 3 +- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/docs/Monitoring Metrics with JMC - JDK Mission Control.md b/docs/Monitoring Metrics with JMC - JDK Mission Control.md index 96ea6ba..bb4fb72 100644 --- a/docs/Monitoring Metrics with JMC - JDK Mission Control.md +++ b/docs/Monitoring Metrics with JMC - JDK Mission Control.md @@ -131,18 +131,14 @@ it's just a little more verbose to do so. First we set up the username and password that will secure the connection to the JMX server. -
-
+ -If you are running a server from a **development workspace**: +### **Source** - run `gradlew jmxPassword` - edit `config/jmxremote.password` -
-
- -If you are running a server **without development sources**: +### **Installation** - Find the [`jmxremote.password.template`][passwordTemplate] file. You can use the linked version @@ -152,10 +148,10 @@ If you are running a server **without development sources**: not open to other users on the system. [passwordTemplate]: https://raw.githubusercontent.com/openjdk/jdk/jdk-11%2B28/src/jdk.management.agent/share/conf/jmxremote.password.template -
-
-For **all cases,** add a line (uncommented) to your `jmxremote.password` defining a password for `controlRole`. + + +Add a line (uncommented) to your `jmxremote.password` defining a password for `controlRole`. Change it to something other than the example `R&D`. @@ -163,11 +159,11 @@ Change it to something other than the example `R&D`. The JMX server needs two open ports. -
-
+ -If you are running a server from a **development workspace**, -add the `--jmx-port` parameter to the task when you start your game. +### **Source** + +Add the `--jmx-port` parameter to the task when you start your game. For example: gradlew game --jmx-port=8901 @@ -175,16 +171,16 @@ For example: Note that because JMX requires _two_ ports, the server in the above example will need both 8901 **and** 8902 to be available. -
-
-If you are starting the server **without development sources** from the `Terasology.bat` or `Terasology` script, +### **Installation** + +If you are starting the server from the `Terasology.bat` or `Terasology` script, you can configure Java options by setting the `TERASOLOGY_OPTS` environment variable: -TERASOLOGY_OPTS="-Dcom.sun.management.jmxremote.port=**8901** --Dcom.sun.management.jmxremote.rmi.port=**8902** --Dcom.sun.management.jmxremote.password.file=**config/jmxremote.password** --Dcom.sun.management.jmxremote.ssl=false" +TERASOLOGY_OPTS="-Dcom.sun.management.jmxremote.port=**8901** + -Dcom.sun.management.jmxremote.rmi.port=**8902** + -Dcom.sun.management.jmxremote.password.file=**config/jmxremote.password** + -Dcom.sun.management.jmxremote.ssl=false" Set the bold values (the two port numbers and the password filename) as appropriate for your environment. @@ -192,8 +188,7 @@ Set the bold values (the two port numbers and the password filename) as appropri The specifics of how to set an environment variable and ensure it is available to the Terasology script depend on your operating system and choice of command shell. -
-
+ diff --git a/docs/index.html b/docs/index.html index 6588f9f..37af1e6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -20,7 +20,7 @@ window.$docsify = { name: 'Profiling Terasology, a tutorial', repo: 'Terasology/TutorialProfiling', - logo: '/_media/icon.svg', +// logo: '/_media/icon.svg', themeColor: '#08A045', loadSidebar: true, search: 'auto', @@ -49,6 +49,7 @@ + From 0698a5d437ea39ed20f394a8d127b68551a1304b Mon Sep 17 00:00:00 2001 From: Kevin Turner <83819+keturn@users.noreply.github.com> Date: Sun, 5 Dec 2021 10:35:03 -0800 Subject: [PATCH 6/8] doc(JMC): New Connection --- ... Metrics with JMC - JDK Mission Control.md | 23 ++++++++++++++++-- docs/_media/JMC/JMC New Connection.webp | Bin 0 -> 20170 bytes 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 docs/_media/JMC/JMC New Connection.webp diff --git a/docs/Monitoring Metrics with JMC - JDK Mission Control.md b/docs/Monitoring Metrics with JMC - JDK Mission Control.md index bb4fb72..31dbcbe 100644 --- a/docs/Monitoring Metrics with JMC - JDK Mission Control.md +++ b/docs/Monitoring Metrics with JMC - JDK Mission Control.md @@ -1,5 +1,7 @@ # Monitoring Metrics with JMC (JDK Mission Control) + +