Rather than set up traditional JMX, where you specify the JMX port etc, you can use the REST support provided in LIberty to access the JMX data. The rest support is easier to set up.
The Liberty documentation recommends that you do not have the native JMX support (configured in jvm.options), and the Liberty REST support for JMX configured at the same time.
The REST request to get the statistics worked and was easy to use. I could not get the “traditional JMX interface”, such as jconsole to work with the REST interface. See below.
Configure the server: mqwebuser.xml
In mqwebuser.xml add the support
<featureManager> <feature>restConnector-2.0</feature> </featureManager>
Set up authorisation with
<administrator-role> <user>colinpaice</user> <group>MQADMIN</group> </administrator-role> <reader-role> <user>John</user> </reader-role>
As the mqconsole and rest statistics are read only, then it may be better to set up every user as a reader-role.
As with the MQ support, it will use the userid if specified, or the Common Name from the digital certificate.
Using Curl and the rest API
I used
curl --cacert ./cacert.pem --cert-type P12 --cert colinpaice.p12:password -url https : //localhost:9443/IBMJMXConnectorREST/mbeans/...
Where … was WebSphere:name=com.ibm.mq.console.javax.ws.rs.core.Application,type=ServletStats/attributes/ResponseTimeDetails . This gives the JMX statistics for the mq.console.
The data comes back as JSON (as you might expect) for example
"name": "ResponseTimeDetails", "value": { "value": { "count": "99", "description": "Average Response Time for servlet", "maximumValue": "3183755861", "mean": "1.116053166969697E8", "minimumValue": "1777114", "reading": { "count": "99", "maximumValue": "3183755861", "mean": "1.116053166969697E8", "minimumValue": "1777114", "standardDeviation": "4.360373971884932E8", "timestamp": "1580819294060", "total": "1.1048926353E10", "unit": "ns", "variance": "1.90128611746915776E17" }, "standardDeviation": "3.218674128849494E8", "total": "1.1048926353E10", "unit": "ns", "variance": "1.63102693370991648E17" ...
As well as the data I have covered before, you also get the time stamp value. This is the value in milliseconds from a well known time.
I used the python to convert the timestamp (1580978634610) to a date time
import datetime s = 1580978634610 / 1000.0 print(datetime.datetime.fromtimestamp(s).strftime('%Y-%m-%d %H:%M:%S.%f'))
to give 2020-02-04 12:28:14.060000.
Which URL to use for traditional JMX?
The IBM documentation says the url to access the JMX data using “traditional JMX” is in file /var/mqm/web/installations/Installation1/servers/mqweb/log/state/com.ibm.ws.jmx.rest.address. For me this was service:jmx:rest://localhost:9443/IBMJMXConnectorREST .
Client set up: Using the “traditional JMX interface” did not work for me
The Configuring secure JMX connection to Liberty page says you can use this url in jconsole and other tools. I could not get this to work. I got messages like Error connecting to JMX endpoint: Unsupported protocol: rest. This page gives a lot of information on JMX, and towards the end of the second page it says Error connecting to JMX endpoint: Unsupported protocol: xxxx is likely to be a problem with the class path. I used -verbose=class, and did not see the jar file being loaded.
What else can you do with the REST interface?
Show what is available
- https://localhost:9443/IBMJMXConnectorREST/graph shows a picture of the facilities available with the JMX connector, and how the facilities are connected
- https://localhost:9443/IBMJMXConnectorREST/api . This gives you a small pull down to select what you want to display. For example
- “MBean info”gives “GET https://localhost:9443/IBMJMXConnectorREST/mbeans/{objectName}”
- “Query single attribute” gives “GET https://localhost:9443/IBMJMXConnectorREST/mbeans/{objectName}/attributes/{attribute}“
- https://localhost:9443/IBMJMXConnectorREST/mbeans list all the beans
You may get data like
WebSphere%3Aname%3Dcom.ibm.mq.console.javax.ws.rs.core.Application %2C type%3DServletStats
The punctuation has been “escaped” so you need to change
- %3A- to :
- %3D to :
- %2C to ,
and the string becomes the familiar
WebSphere: name=com.ibm.mq.console.javax.ws.rs.core.Application, type=ServletStats