Skip to content

Instantly share code, notes, and snippets.

@welshstew
Created May 8, 2019 19:47
Show Gist options
  • Save welshstew/edb71ce13e94218bd03ddade63ff537f to your computer and use it in GitHub Desktop.
Save welshstew/edb71ce13e94218bd03ddade63ff537f to your computer and use it in GitHub Desktop.
Groovy to Get Jolokia Metrics over HTTP
2019-05-08 08:39:20,801 | INFO | Connector ws started | org.apache.activemq.broker.TransportConnector | main
2019-05-08 08:39:20,803 | INFO | Apache ActiveMQ 5.14.5 (localhost, ID:user-somehost-33725-1557301160364-0:1) started |
2019-05-08 08:39:21,288 | INFO | ActiveMQ WebConsole available at http://0.0.0.0:8161/ | org.apache.activemq.web.WebConsoleStarter | main
2019-05-08 08:39:21,289 | INFO | ActiveMQ Jolokia REST API available at http://0.0.0.0:8161/api/jolokia/ | org.apache.activemq.web.WebConsoleStarter | main
2019-05-08 08:39:21,335 | INFO | Initializing Spring FrameworkServlet 'dispatcher' | /admin | main
2019-05-08 08:39:21,525 | INFO | No Spring WebApplicationInitializer types detected on classpath | /api | main
2019-05-08 08:39:21,587 | INFO | jolokia-agent: Using policy access restrictor classpath:/jolokia-access.xml | /api | main
2019-05-08 08:53:46,777 | INFO | Connector vm://localhost started | org.apache.activemq.broker.TransportConnector | qtp593103894-60
{
"request": {
"mbean": "org.apache.activemq:brokerName=localhost,type=Broker",
"type": "read"
},
"value": {
"StatisticsEnabled": true,
"TemporaryQueueSubscribers": [],
"TotalConnectionsCount": 2,
"TotalMessageCount": 3,
"TempPercentUsage": 0,
"MemoryPercentUsage": 0,
"TransportConnectors": {
"openwire": "tcp://user-somehost:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600",
"amqp": "amqp://user-somehost:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600",
"mqtt": "mqtt://user-somehost:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600",
"stomp": "stomp://user-somehost:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600",
"ws": "ws://user-somehost:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"
},
"InactiveDurableTopicSubscribers": [],
"StoreLimit": 107374182400,
"TotalProducerCount": 0,
"TopicProducers": [],
"CurrentConnectionsCount": 2,
"QueueProducers": [],
"JMSJobScheduler": null,
"VMURL": "vm://localhost",
"UptimeMillis": 1696116,
"TemporaryTopicProducers": [],
"TemporaryQueueProducers": [],
"TotalDequeueCount": 0,
"Topics": [
{
"objectName": "org.apache.activemq:brokerName=localhost,destinationName=ActiveMQ.Advisory.MasterBroker,destinationType=Topic,type=Broker"
},
{
"objectName": "org.apache.activemq:brokerName=localhost,destinationName=ActiveMQ.Advisory.Connection,destinationType=Topic,type=Broker"
},
{
"objectName": "org.apache.activemq:brokerName=localhost,destinationName=ActiveMQ.Advisory.Consumer.Queue.incomingOrdersSpringBoot,destinationType=Topic,type=Broker"
},
{
"objectName": "org.apache.activemq:brokerName=localhost,destinationName=ActiveMQ.Advisory.Consumer.Queue.incomingOrders,destinationType=Topic,type=Broker"
}
],
"DurableTopicSubscribers": [],
"JobSchedulerStorePercentUsage": 0,
"Uptime": "28 minutes",
"QueueSubscribers": [],
"BrokerId": "ID:user-somehost-33725-1557301160364-0:1",
"AverageMessageSize": 1029,
"DataDirectory": "/home/swinches/AppServers/apache-activemq-5.14.5/data",
"Persistent": true,
"TopicSubscribers": [
{
"objectName": "org.apache.activemq:brokerName=localhost,clientId=ID_user-somehost-33725-1557301160364-3_2,consumerId=ID_user-somehost-33725-1557301160364-4_2_-1_1,destinationName=ActiveMQ.Advisory.TempQueue_ActiveMQ.Advisory.TempTopic,destinationType=Topic,endpoint=Consumer,type=Broker"
},
{
"objectName": "org.apache.activemq:brokerName=localhost,clientId=ID_user-somehost-33725-1557301160364-3_1,consumerId=ID_user-somehost-33725-1557301160364-4_1_-1_1,destinationName=ActiveMQ.Advisory.TempQueue_ActiveMQ.Advisory.TempTopic,destinationType=Topic,endpoint=Consumer,type=Broker"
}
],
"TemporaryQueues": [],
"BrokerVersion": "5.14.5",
"BrokerName": "localhost",
"MinMessageSize": 1024,
"MemoryLimit": 668309914,
"Slave": false,
"DynamicDestinationProducers": [
{
"objectName": "org.apache.activemq:brokerName=localhost,clientId=ID_user-somehost-33725-1557301160364-3_2,endpoint=dynamicProducer,producerId=ID_user-somehost-33725-1557301160364-4_2_1_1,type=Broker"
}
],
"TotalEnqueueCount": 10,
"TempLimit": 53687091200,
"TemporaryTopicSubscribers": [],
"TemporaryTopics": [],
"JobSchedulerStoreLimit": 0,
"Queues": [
{
"objectName": "org.apache.activemq:brokerName=localhost,destinationName=incomingOrdersSpringBoot,destinationType=Queue,type=Broker"
},
{
"objectName": "org.apache.activemq:brokerName=localhost,destinationName=incomingOrders,destinationType=Queue,type=Broker"
}
],
"TotalConsumerCount": 0,
"StorePercentUsage": 0,
"MaxMessageSize": 1046
},
"timestamp": 1557302856,
"status": 200
}
curl --user admin:admin http://localhost:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost | jq
curl --user admin:admin http://localhost:8161/api/jolokia/list
curl --user admin:admin http://localhost:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=incomingOrders/QueueSize
curl --user admin:admin \
--header "Content-Type: application/json" \
--request POST \
--data '{ "type":"read", "mbean":"org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=incomingOrders", "attribute":"QueueSize"
}' http://localhost:8161/api/jolokia
{"request":{"mbean":"org.apache.activemq:brokerName=localhost,destinationName=incomingOrders,destinationType=Queue,type=Broker","attribute":"QueueSize","type":"read"},"value":3,"timestamp":1557303537,"status":200}
{
"request": {
"mbean": "org.apache.activemq:brokerName=localhost,destinationName=incomingOrders,destinationType=Queue,type=Broker",
"type": "read"
},
"value": {
"ProducerFlowControl": true,
"Options": "",
"AlwaysRetroactive": false,
"MemoryUsageByteCount": 3128,
"AverageBlockedTime": 0,
"MemoryPercentUsage": 0,
"CursorMemoryUsage": 3128,
"Subscriptions": [],
"InFlightCount": 0,
"CacheEnabled": true,
"StoreMessageSize": 0,
"ForwardCount": 0,
"DLQ": false,
"AverageEnqueueTime": 0,
"Name": "incomingOrders",
"TotalBlockedTime": 0,
"MaxAuditDepth": 2048,
"BlockedSends": 0,
"QueueSize": 3,
"MaxPageSize": 200,
"PrioritizedMessages": false,
"MemoryUsagePortion": 1,
"Paused": false,
"EnqueueCount": 3,
"MessageGroups": {},
"ConsumerCount": 0,
"AverageMessageSize": 1042,
"CursorFull": false,
"ExpiredCount": 0,
"MaxProducersToAudit": 1024,
"CursorPercentUsage": 0,
"MinEnqueueTime": 0,
"MinMessageSize": 1040,
"MemoryLimit": 668309914,
"DispatchCount": 0,
"MaxEnqueueTime": 0,
"DequeueCount": 0,
"BlockedProducerWarningInterval": 30000,
"ProducerCount": 0,
"MessageGroupType": "cached",
"MaxMessageSize": 1046,
"UseCache": true,
"SlowConsumerStrategy": null
},
"timestamp": 1557303482,
"status": 200
}
curl --user admin:admin http://localhost:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=incomingOrders
curl --user admin:admin \
--header "Content-Type: application/json" \
--request POST \
--data '{ "type":"read", "mbean":"org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=incomingOrders"
}' http://localhost:8161/api/jolokia
queueName: org.apache.activemq:brokerName=localhost,destinationName=incomingOrdersSpringBoot,destinationType=Queue,type=Broker
queueName: org.apache.activemq:brokerName=localhost,destinationName=incomingOrders,destinationType=Queue,type=Broker
┌───────────┬───────────────┬──────────────────────────┐
│ QueueSize │ ConsumerCount │ Name │
├───────────┼───────────────┼──────────────────────────┤
│ 0 │ 0 │ incomingOrdersSpringBoot │
├───────────┼───────────────┼──────────────────────────┤
│ 3 │ 0 │ incomingOrders │
└───────────┴───────────────┴──────────────────────────┘
@Grab(group='de.vandermeer', module = 'asciitable', version = '0.3.2')
import de.vandermeer.asciitable.v2.RenderedTable
import de.vandermeer.asciitable.v2.V2_AsciiTable
import de.vandermeer.asciitable.v2.render.V2_AsciiTableRenderer
import de.vandermeer.asciitable.v2.render.WidthLongestWord
import de.vandermeer.asciitable.v2.themes.V2_E_TableThemes
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
String callJolokia(String mBean, def postData){
String basicAuth = "admin:admin".bytes.encodeBase64().toString()
URL url = new URL("http://localhost:8161/api/jolokia/read/$mBean")
HttpURLConnection httpCon = (HttpURLConnection)url.openConnection()
httpCon.setRequestProperty("Authorization", "Basic $basicAuth")
if( postData ){
String postDataString = JsonOutput.toJson(postData)
httpCon.setRequestMethod("POST")
httpCon.setRequestProperty("Content-Type", "application/json")
httpCon.setDoOutput(true)
httpCon.connect()
DataOutputStream wr
try{
wr = new DataOutputStream( httpCon.getOutputStream())
wr.write( postDataString.bytes )
}finally {
if (wr != null){
wr.close()
}
}
}else{
httpCon.connect()
}
String json = httpCon.getInputStream().text
httpCon.disconnect()
return json
}
//Get Queue Names
def slurpedQueueNames = new JsonSlurper().parseText(callJolokia("org.apache.activemq:type=Broker,brokerName=localhost/Queues", null))
slurpedQueueNames.value.each { singleQueue ->
println "queueName: $singleQueue.objectName"
}
//Get QueueSize with a destinationName wildcard:destinationName=*
def slurpedQueues = new JsonSlurper()
.parseText(callJolokia("", [type:"read",
mbean:"org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=*",
attribute: ["Name", "QueueSize", "ConsumerCount"]]))
generate(slurpedQueues.value)
def generate(Map mapOfMaps){
V2_AsciiTable at = new V2_AsciiTable()
List columns = new ArrayList<String>(mapOfMaps.entrySet().first().value.keySet())
at.addRule()
at.addRow(columns.toArray())
at.addRule()
mapOfMaps.each { it ->
at.addRow(it.value.values().asList().toArray())
at.addRule()
}
V2_AsciiTableRenderer rend = new V2_AsciiTableRenderer()
rend.setTheme(V2_E_TableThemes.UTF_LIGHT.get())
rend.setWidth(new WidthLongestWord())
RenderedTable rt = rend.render(at)
println rt
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment