Salesforce

How to get Agent Status, Sessions, Connections and Requests for a PASOE Agent using OE Manager REST API?

« Go Back

Information

 
TitleHow to get Agent Status, Sessions, Connections and Requests for a PASOE Agent using OE Manager REST API?
URL NameHow-to-get-Agent-Status-Metrics-Connections-and-Requests-for-a-PASOE-Agent-using-OE-Manager-REST-API
Article Number000110524
EnvironmentProduct: OpenEdge
Version: 11.7.4, 12.0
OS: All Supported Platforms
Question/Problem Description
This article provides an single program, which can be called differently, to demonstrate using the ABL HttpClient libraries for fetching an Agent's Status, Sessions, Metrics, Connections and Requests from the OE Manager REST API for a Progress AppServer for OpenEdge (PASOE) instance.
 
Steps to Reproduce
Clarifying Information
Error Message
Defect Number
Enhancement Number
Cause
Resolution
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.
 
Workaround
Notes
Keyword Phrase
Last Modified Date11/20/2020 7:01 AM

Powered by