The below code takes the following parameters:
- Host Name in the pcHost parameter
- Port Number in the pcPort parameter(optional)
- Instance name in the pcInstance parameter
- Agent Id of an Agent running in the Instance
- Component name you wish to gather information about
Then calls the REST API to fetch details about the selected component for a given agent within an instance.
USING OpenEdge.Net.HTTP.RequestBuilder.
USING openedge.net.http.IHttpRequest.
USING openedge.net.http.IHttpResponse.
USING Progress.Json.ObjectModel.*.
USING OpenEdge.Net.HTTP.ClientBuilder.
USING OpenEdge.Net.HTTP.ResponseBuilder.
USING OpenEdge.Net.HTTP.IHttpClientLibrary.
USING OpenEdge.Net.HTTP.Lib.ClientLibraryBuilder.
USING OpenEdge.Net.HTTP.Credentials.
DEFINE INPUT PARAMETER pcHost AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcPort AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcInstance AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcAgentId AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcComponent AS CHARACTER NO-UNDO.
DEFINE VARIABLE oResponse AS IHttpResponse NO-UNDO.
DEFINE VARIABLE oEntity AS JsonObject NO-UNDO.
DEFINE VARIABLE oResult AS JsonObject NO-UNDO.
DEFINE VARIABLE oSessions AS JsonArray NO-UNDO.
DEFINE VARIABLE oConnections AS JsonArray NO-UNDO.
DEFINE VARIABLE oRequests AS JsonArray NO-UNDO.
DEFINE VARIABLE oCredentials AS Credentials NO-UNDO.
DEFINE VARIABLE oRequest AS IHttpRequest NO-UNDO.
DEFINE VARIABLE oLib AS IHttpClientLibrary NO-UNDO.
DEFINE VARIABLE cURL AS CHARACTER NO-UNDO.
DEFINE VARIABLE cMessage AS CHARACTER NO-UNDO FORMAT "x(35)".
DEFINE TEMP-TABLE AgentSession NO-UNDO
FIELD SessionId AS INTEGER
FIELD SessionState AS CHARACTER
FIELD StartTime AS CHARACTER
FIELD EndTime AS CHARACTER
FIELD ThreadId AS INTEGER FORMAT "-zzzzzzz9"
FIELD ConnectionId AS CHARACTER
FIELD SessionExternalState AS INTEGER
FIELD SessionMemory AS INT64
FIELD tcInstanceName AS CHARACTER
FIELD tcAgentId AS CHARACTER.
DEFINE TEMP-TABLE AgentConnection NO-UNDO
FIELD ConnectionId AS INTEGER LABEL "Connection Id" FORMAT "->>>>>>>>>9"
FIELD ConnectionState AS CHARACTER LABEL "State" FORMAT "x(15)"
FIELD SessionId AS INTEGER LABEL "Session Id" FORMAT "->>>>>>>>>9".
DEFINE TEMP-TABLE AgentRequest NO-UNDO
FIELD RequestProcName AS CHARACTER LABEL "Procedure" FORMAT "x(25)"
FIELD SessionId AS INTEGER LABEL "Session Id" FORMAT "->>>>>>>>>9"
FIELD ConnectionId AS INTEGER LABEL "Connection Id" FORMAT "->>>>>>>>>9"
FIELD StartTime AS DATETIME LABEL "Request Start"
FIELD EndTime AS DATETIME LABEL "Request End"
FIELD RequestNum AS INTEGER LABEL "Request Num" FORMAT "zzzzzzzzzz9".
DEFINE QUERY qConnections FOR AgentConnection SCROLLING.
DEFINE QUERY qRequests FOR AgentRequest SCROLLING.
DEFINE BROWSE bConnections QUERY qConnections
DISPLAY AgentConnection.ConnectionId
AgentConnection.ConnectionState
AgentConnection.SessionId
WITH WIDTH 50 10 DOWN.
DEFINE BROWSE bRequests QUERY qRequests
DISPLAY AgentRequest.RequestNum
AgentRequest.RequestProcName
AgentRequest.SessionId
AgentRequest.ConnectionId
AgentRequest.StartTime
AgentRequest.EndTime
WITH WIDTH 70 10 DOWN.
DEFINE FRAME fConnections bConnections.
DEFINE FRAME fRequests bRequests.
cURL = "http://" + pcHost + (IF (pcPort GT "") EQ TRUE THEN ":" + pcPort ELSE "") +
"/oemanager/applications/" + pcInstance + "/agents/" +
pcAgentId + "/" + pcComponent.
// You have to login with admin rights to the tomcat manager. If you've changed
// the password you'll need to use the modified password
oCredentials = NEW Credentials("http://localhost","tomcat","tomcat").
// Make the HTTP call
oRequest = RequestBuilder:Get(cUrl)
:UsingBasicAuthentication(oCredentials)
:Request.
oResponse = ResponseBuilder:Build():Response.
oLib = ClientLibraryBuilder:Build():sslVerifyHost(NO):Library.
ClientBuilder:Build()
:UsingLibrary(oLib)
:Client:Execute(oRequest,oResponse).
// Cast the result of the call into a JsonObject.
oEntity = CAST(oResponse:Entity,JsonObject).
oEntity:WriteFile("getAgent" + pcComponent + ".json").
oResult = CAST(oEntity:GetJsonObject('result'),JsonObject).
// Check for error messages and return if one is encountered
cMessage = oEntity:GetCharacter("errmsg").
IF (cMessage GT "") EQ TRUE THEN DO:
MESSAGE "Request failed with the below Error:" SKIP(1)
cMessage
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
RETURN.
END.
CASE pcComponent:
WHEN "sessions" THEN DO:
oSessions = CAST(oResult:GetJsonArray('AgentSession'),JsonArray).
BUFFER AgentSession:READ-JSON("JsonArray",oSessions,"APPEND").
FOR EACH AgentSession:
DISPLAY "A-" + STRING(AgentSession.sessionId).
END.
END.
WHEN "status" THEN
MESSAGE "Threads: " oResult:GetInteger('threads') SKIP
"Sessions: " oResult:GetInteger('sessions') SKIP
"Connections: " oResult:GetInteger('connections') SKIP
"Requests: " oResult:GetInteger('requests')
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
WHEN "connections" THEN DO:
oConnections = CAST(oResult:GetJsonArray('AgentConnection'),JsonArray).
BUFFER AgentConnection:READ-JSON("JsonArray",oConnections,"APPEND").
OPEN QUERY qConnections FOR EACH AgentConnection.
UPDATE bConnections WITH FRAME fConnections.
END.
WHEN "requests" THEN DO:
oRequests = CAST(oResult:GetJsonArray('AgentRequest'),JsonArray).
BUFFER AgentRequest:READ-JSON("JsonArray",oRequests,"APPEND").
OPEN QUERY qRequests FOR EACH AgentRequest.
UPDATE bRequests WITH FRAME fRequests.
END.
END CASE.
The RAW JSON Response String generated by a request for "sessions" information is below:
{
"result":{
"AgentSession":[
{
"SessionId":4,
"SessionState":"IDLE",
"StartTime":"2019-03-27T08:38:58.421",
"EndTime":null,
"ThreadId":-1,
"ConnectionId":null,
"SessionExternalState":0,
"SessionMemory":778220
},
{
"SessionId":7,
"SessionState":"IDLE",
"StartTime":"2019-03-27T08:38:58.421",
"EndTime":null,
"ThreadId":-1,
"ConnectionId":140,
"SessionExternalState":0,
"SessionMemory":373546318
}
]
},
"versionNo":1,
"outcome":"SUCCESS",
"versionStr":"v11.7.4 ( 2018-10-10 )",
"errmsg":"",
"operation":""
}
The RAW JSON Response String generated by a request for "status" information is below:
{
"result":{
"threads":1,
"sessions":2,
"connections":1,
"requests":1001
},
"versionNo":1,
"outcome":"SUCCESS",
"versionStr":"v11.7.4 ( 2018-10-10 )",
"errmsg":"",
"operation":"GET AGENT STATUS"
}
The RAW JSON Response String generated by a request for "connections" information is below:
{
"result":{
"AgentConnection":[
{
"ConnectionId":140,
"ConnectionState":"CONNECTED",
"SessionId":7
}
]
},
"versionNo":1,
"outcome":"SUCCESS",
"versionStr":"v11.7.4 ( 2018-10-10 )",
"errmsg":"",
"operation":""
}
The RAW JSON Response String generated by a request for "requests" information is below:
{
"result":{
"AgentRequest":[
{
"RequestProcName":"SERVER.p",
"SessionId":7,
"ConnectionId":140,
"StartTime":"2019-03-27T08:55:11.993",
"EndTime":"2019-03-27T08:55:11.994",
"RequestNum":1
},
{
"RequestProcName":"SERVER.p",
"SessionId":7,
"ConnectionId":140,
"StartTime":"2019-03-27T08:55:12.008",
"EndTime":"2019-03-27T08:55:12.009",
"RequestNum":2
},
{
"RequestProcName":"SERVER.p",
"SessionId":7,
"ConnectionId":140,
"StartTime":"2019-03-27T08:55:12.022",
"EndTime":"2019-03-27T08:55:12.023",
"RequestNum":3
}
]
},
"versionNo":1,
"outcome":"SUCCESS",
"versionStr":"v11.7.4 ( 2018-10-10 )",
"errmsg":"",
"operation":""
}
The RAW JSON Response String generated by a request for "metrics" information is below:
{
"result":null,
"versionNo":1,
"outcome":"SUCCESS",
"versionStr":"v11.7.4 ( 2018-10-10 )",
"errmsg":"",
"operation":""
}
Note: The "metrics" API has not yet been implemented, so will only return a null result at the time of this writing. However it's documented\listed in Swagger, therefore is included here.