This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

API

Portal Server APIs

The portal server has three APIs:

  • Remote Admin API
  • Remote User API
  • Remote User Monitoring API

All APIs require so-called “Authentication Tokens” to verify the access authorization. If 5 or more invalid “Authentication Tokens” are sent within 60 seconds, the corresponding remote IP address is blocked for 30 minutes.

1 - Remote Admin API

Portal Server Remote Admin API Specification

Generating an Authentication Token

To perform a Remote Admin API call, you must first generate an “Admin API Auth Token” in the Administrator Menu of the portal. When generating the token you can enter a purpose (only used as information) and also restrict the remote IP addresses for which the token is valid. You can also specify whether the token has read/write access or read/only access.

“alt attribute”

API Functions

The API supports the following functions (so-called “actions”):

  • getAllUserAccounts (Get all user accounts of the portal server)
  • getAllPricePlans (Get all price plans of the portal server)
  • addLicenseCertificateToUser (Add a (new) license certificate to an user)
  • getServerSettings (Get the server settings)
  • setServerMaintenanceMode (Turn the server maintenance mode on or off)
URL HTTP Method
https://portal.realload.com/RemoteAdminAPI POST
All data are sent and received in JSON data format. The “authTokenValue” and the “action” must always be sent when an API call is made.

Example

API HTTP/S Request

curl -v --request POST --header "Content-Type: application/json" --data "@getAllUserAccounts.json"  https://portal.realload.com/RemoteAdminAPI

API Request Data

{
  "authTokenValue": "8mKSz1UzaQg17kfu",
  "action": "getAllUserAccounts"
}

API Response Data

{"allUserAccountsArray":
[{"userId":13,"nickname":"DKF","firstName":"Max","lastName":"Fischer","primaryEmail":"max@dkfqa.com","primarySMSPhone":"+41771111111","secondaryEmail":"","secondarySMSPhone":"","accountBlocked":false,"accountCreateTime":1538556183756,"lastLoginTime":1625181623869,"lastLoginIP":"127.0.0.1","pricePlanId":1,"accountExpiresTime":-1,"pricePlanTitle":"Unlimited"},{"userId":18,"nickname":"AX","firstName":"Alex","lastName":"Fischer","primaryEmail":"alexfischer66@yahoo.com","primarySMSPhone":"+41781111111","secondaryEmail":"","secondarySMSPhone":"","accountBlocked":false,"accountCreateTime":1539874749677,"lastLoginTime":1616111301975,"lastLoginIP":"127.0.0.1","pricePlanId":1,"accountExpiresTime":-1,"pricePlanTitle":"Unlimited"},{"userId":22,"nickname":"Kes","firstName":"Kesorn","lastName":"Fischer","primaryEmail":"gsklsta@yahoo.com","primarySMSPhone":"+66000000000","secondaryEmail":"","secondarySMSPhone":"","accountBlocked":false,"accountCreateTime":1605303204754,"lastLoginTime":1624389324770,"lastLoginIP":"127.0.0.1","pricePlanId":6,"accountExpiresTime":-1,"pricePlanTitle":"BASIC1"},{"userId":48,"nickname":"BET","firstName":"Bettina","lastName":"Meier","primaryEmail":"b123456@lucini.id.au","primarySMSPhone":"+61404905702","secondaryEmail":"","secondarySMSPhone":"","accountBlocked":false,"accountCreateTime":1623719604561,"lastLoginTime":-1,"lastLoginIP":"","pricePlanId":6,"accountExpiresTime":1625061600000,"pricePlanTitle":"BASIC1"}],
"isError":false}

If the API call is successful, then the response field “isError” is false. If a numeric field has a value of -1 (minus one), this means “no data” or “unlimited” depending on the context.

getAllUserAccounts

Specific Request Fields:

  • [none]

Specific Error Flags:

  • [none]

getAllPricePlans

Specific Request Fields:

  • [none]

Specific Error Flags:

  • [none]

addLicenseCertificateToUser

Specific Request Fields:

  • mapToUserEmailAddress
  • mapToUserMobilePhone
  • licenseProvider
  • licenseCertificate

The license is successfully assigned to a user if either mapToUserEmailAddress or mapToUserMobilePhone matches to a user account.

Specific Error Flags:

  • writeAccessError
  • mapToUserError
  • licenseProviderError
  • licenseCertificateError
  • licenseCertificateAlreadyAddedError
  • pricePlanError

JSON Request Example:

{
  "authTokenValue":"8mKSz1UzaQg17kfu",
  "action":"addLicenseCertificateToUser",
  "licenseProvider": "Real Load Pty Ltd / nopCommerce",
  "mapToUserEmailAddress": "max@dkfqa.com",
  "mapToUserMobilePhone": "+41771111111",
  "licenseCertificate": "-----BEGIN CERTIFICATE-----\r\nMIIEnjCCA4agAwIBAgIEyDnukzANBgkqhkiG9w0BA ...... Hn/UMGAGRB6xF4w+TewYqTAZrdhi/WLyYwg==\r\n-----END CERTIFICATE-----"
}

JSON Response Example (Success Case):

{"licenseId":12,"cloudCreditLicenseId":-1,"userId":13,"isCloudCreditsLicense":false,"isError":false}

JSON Response Example (Error Case):

{"isError":true,"genericErrorText":"","writeAccessError":false,"licenseProviderError":false,"mapToUserError":false,"pricePlanError":false,"licenseCertificateAlreadyAddedError":false,"licenseCertificateError":true}

getServerSettings

Specific Request Fields:

  • [none]

Specific Error Flags:

  • [none]

JSON Response Example:

{
  "isServerMaintenanceMode":false,
  "isSignInSelectPricePlanFromMultipleValidLicenseCertificates":true,
  "isSignInExpiredAccountCanEnterLicenseCertificate":true,
  "isSignUpEnabled":true,
  "isSignUpRequiresInvitationTicket":false,
  "signUpDefaultPricePlanId":2,
  "signUpDefaultAccountExpiresInDays":14,
  "deleteExpiredUserAccountsAfterDays":183,
  "isError":false
}

setServerMaintenanceMode

Specific Request Fields:

  • serverMaintenanceMode

Specific Error Flags:

  • writeAccessError

JSON Request Example:

{
  "authTokenValue":"8mKSz1UzaQg17kfu",
  "action":"setServerMaintenanceMode",
  "serverMaintenanceMode":true
}

JSON Response Example (Success Case):

{"isServerMaintenanceMode":true,"isError":false}

2 - Remote User API

Portal Server Remote User API Specification

Generating an Authentication Token

To perform a Remote User API call, you must first sign in into the portal and generate an “API Authentication Token”. When generating the token you can enter a purpose (only used as information) and also restrict the remote IP addresses for which the token is valid.

“alt attribute”

“alt attribute”

API Functions

The API supports the following functions (so-called “actions”):

Common Functions:

  • getUserAccountInfo (Get information about the own user account)
  • getPricePlanInfo (Get information about the current price plan)

Projects, Resource Sets and Files Functions:

  • getProjectTree (Get the project tree inclusive all resource sets and all file information)
  • createProject (Create a new project)
  • deleteProject (Delete a project)
  • getResourceSetsOfProject (Get all resource sets of a project, inclusive all file information)
  • createResourceSet (Create a new resource set)
  • deleteResourceSet (Delete a resource set)
  • getFilesInfoOfResourceSet (Get all files information of a resource set)
  • createFile (Create or overwrite a file)
  • getFile (Get the content of a file and the file information)
  • deleteFile (Delete a file)

Measuring Agents Functions:

  • getMeasuringAgents (Get all defined measuring agents)
  • getMinRequiredMeasuringAgentVersion (Get the minimum required measuring agent version)
  • addMeasuringAgent (Add a new measuring agent)
  • pingMeasuringAgent (Ping a measuring agent)
  • setMeasuringAgentActive (Set the state of a measuring agent to active or inactive)
  • deleteMeasuringAgent (Delete a measuring agent)

Measuring Agent Cluster Functions:

  • getMeasuringAgentClusters (Get all defined measuring agent clusters)
  • getClusterControllers (Get all cluster controllers and for each cluster controller a list of measuring agent clusters which are referencing the cluster controller)
  • getMinRequiredClusterControllerVersion (Get the minimum required cluster controller version)
  • pingClusterController (Ping a cluster controller)
  • addMeasuringAgentCluster (Add a new measuring agent cluster)
  • addMemberToMeasuringAgentCluster (Add a member to a measuring agent cluster)
  • removeMemberFromMeasuringAgentCluster (Remove a member from a measuring agent cluster)
  • pingMeasuringAgentClusterMembers (Ping the cluster members of a measuring agent cluster via cluster controller)
  • setMeasuringAgentClusterActive (Set the state of a measuring agent cluster to active or inactive)
  • deleteMeasuringAgentCluster (Delete a measuring agent cluster)

HTTP/S Remote Proxy Recorders Functions:

  • getProxyRecorders (Get all defined HTTP/S proxy recorders)
  • getMinRequiredProxyRecorderVersion (Get the minimum required HTTP/S proxy recorder version)
  • addProxyRecorder (Add a new HTTP/S proxy recorder)
  • pingProxyRecorder (Ping a HTTP/S proxy recorder)
  • deleteProxyRecorder (Delete a HTTP/S proxy recorder)
  • getProxyRecordersClientCertificates (Get all client certificates for HTTP/S proxy recorders)
  • addProxyRecordersClientCertificate (Add a client certificate for HTTP/S proxy recorders)
  • setProxyRecordersClientCertificateActive (Set a client certificate for HTTP/S proxy recorders to active or inactive)
  • modifyProxyRecordersClientCertificate (Modify a client certificate for HTTP/S proxy recorders)
  • deleteProxyRecordersClientCertificate (Delete a client certificate for HTTP/S proxy recorders)

Load Test Jobs Functions:

  • getTestjobTemplates (Get all test job templates)
  • defineNewTestjobFromTemplate (Define new test job from template)
  • submitTestjob (Submit a ‘defined’ test job to the measuring agent or to the cluster controller)
  • makeTestjobReadyToRun (Turn a remote test job which is in the state ‘submitted’ into the state ‘ready to run’)
  • startTestjob (Turn a remote test job which is in the state ‘ready to run’ into the state ‘running’)
  • getMeasuringAgentTestjobs (Get from a measuring agent all test jobs, inclusive their states)
  • getTestjobOutDirectoryFilesInfo (Get from test job information about all files located in a measuring agent job or cluster controller job ‘out’ subdirectory)
  • getTestjobOutDirectoryFile (Get from a measuring agent or from a cluster controller the content of a file located in a testjob/cluster-job out subdirectory in base64 format)
  • saveTestjobOutDirectoryFileToProjectTree (Get from a measuring agent or from a cluster controller the content of a file located in a testjob/cluster-job out subdirectory and save it in a resource set of the project tree)
  • deleteTestjob (Delete a test job locally and also on the measuring agent or cluster controller)

Test Execution Suites Functions:

  • getTestExecutionSuites (Get all test execution suites with a summary of all results of the executed test runs)
  • getCurrentlyRunningTestExecutionSuiteIds (Get the ID(s) of all currently running test execution suites)
  • startTestExecutionSuiteTestRun (Start a new run of a test execution suite)
  • getTestExecutionSuiteTestRunResultDetail (Get a test run result detail of a test execution suite)
  • getTestExecutionSuiteTestRunTestJobOutputFileContent (Get the content of a test job output file of a test execution suite run)
  • deleteTestExecutionSuiteTestRun (Delete a test run of a test execution suite)
URL HTTP Method
https://portal.realload.com/RemoteUserAPI POST
All data are sent and received in JSON data format. The “authTokenValue” and the “action” must always be sent when an API call is made.

Example

API HTTP/S Request

curl -v --request POST --header "Content-Type: application/json" --data {\"authTokenValue\":\"jPmFClqeDUXaEk8Q274q\",\"action\":\"getUserAccountInfo\"}  https://portal.realload.com/RemoteUserAPI

API Request Data

{
  "authTokenValue": "jPmFClqeDUXaEk8Q274q",
  "action": "getUserAccountInfo"
}

API Response Data

{
  "userAccountInfo":{
    "userId":48,
    "nickname":"BET",
    "firstName":"Bettina",
    "lastName":"MeierHans",
    "primaryEmail":"bettina@meierhans.id.au",
    "primarySMSPhone":"+61401111111",
    "secondaryEmail":"",
    "secondarySMSPhone":"",
    "accountBlocked":false,
    "accountCreateTime":1623719604561,
    "lastLoginTime":1625348376450,
    "lastLoginIP":"127.0.0.1",
    "pricePlanId":6,
    "accountExpiresTime":1625953109397,
    "pricePlanTitle":"BASIC1"
    },
  "isError":false
}

If the API call is successful, then the response field “isError” is false. If a numeric field has a value of -1 (minus one), this means “no data” or “unlimited” depending on the context.

getUserAccountInfo

Specific Request Fields:

  • [none]

Specific Error Flags:

  • [none]

getPricePlanInfo

Specific Request Fields:

  • [none]

Specific Error Flags:

  • [none]

JSON Response Example:

{
  "pricePlanInfo":{
    "pricePlanId":6,
    "title":"BASIC1",
    "description":"",
    "isDeprecated":false,
    "lastModified":1625348413042,
    "maxDiskSpaceMB":1024,
    "maxSubUserAccounts":0,
    "maxMeasuringAgentsOwnedByUser":3,
    "maxRemoteProxyRecordersOwnedByUser":3,
    "executeLoadJobsEnabled":true,
    "executeMonitoringJobsEnabled":false,
    "apiAccessEnabled":true,
    "maxStartLoadJobsLast24h":24,
    "maxUsersPerLoadJob":500,
    "maxDurationPerLoadJob":1800
  },
  "isError":false
}

The unit for “maxDurationPerLoadJob” is seconds.

getProjectTree

Specific Request Fields:

  • [none]

Specific Error Flags:

  • [none]

JSON Response Example:

{
  "projectsArray": [
    {
      "projectId": 97,
      "projectName": "Common",
      "projectDescription": "",
      "resourceSetsArray": [
        {
          "resourceSetId": 154,
          "resourceSetName": "Input Files",
          "resourceSetDescription": "",
          "filesArray": [
            {
              "fileName": "InputFile.txt",
              "fileSize": 233,
              "fileHashCode": 1873256029,
              "fileLastModified": 1613835992073
            }
          ]
        },
        {
          "resourceSetId": 155,
          "resourceSetName": "Jar Files",
          "resourceSetDescription": "",
          "filesArray": [
            {
              "fileName": "com.dkfqs.tools.jar",
              "fileSize": 578087,
              "fileHashCode": -2033420926,
              "fileLastModified": 1613838181727
            }
          ]
        },
        {
          "resourceSetId": 156,
          "resourceSetName": "Plug-Ins",
          "resourceSetDescription": "",
          "filesArray": [
            {
              "fileName": "HttpSessionPlugin_ChangeCopyright.json",
              "fileSize": 5321,
              "fileHashCode": 1958407366,
              "fileLastModified": 1613838287871
            }
          ]
        }
      ]
    },
...
...
...
  ],
  "isError": false
}

createProject

Specific Request Fields:

  • projectName
  • projectDescription (optional)

Response Fields:

  • projectId

Specific Error Flags:

  • projectNameError
  • diskSpaceLimitExceededError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"createProject",
  "projectName":"My New Project",
  "projectDescription": "Created by API call"
}

JSON Response Example (Success Case):

{"projectId":113,"isError":false}

JSON Response Example (Error Case):

{"isError":true,"genericErrorText":"","diskSpaceLimitExceededError":false,"projectNameError":true}

deleteProject

Specific Request Fields:

  • projectId
  • moveToTrash (optional, default: false)

Specific Error Flags:

  • projectIdError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"deleteProject",
  "projectId":113,
  "moveToTrash":false
}

getResourceSetsOfProject

Specific Request Fields:

  • projectId

Specific Error Flags:

  • projectIdError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getResourceSetsOfProject",
  "projectId":97
}

JSON Response Example (Success Case):

{
  "resourceSetsArray": [
    {
      "resourceSetId": 154,
      "resourceSetName": "Input Files",
      "resourceSetDescription": "",
      "filesArray": [
        {
          "fileName": "InputFile.txt",
          "fileSize": 233,
          "fileHashCode": 1873256029,
          "fileLastModified": 1613835992073
        }
      ]
    },
    {
      "resourceSetId": 155,
      "resourceSetName": "Jar Files",
      "resourceSetDescription": "",
      "filesArray": [
        {
          "fileName": "com.dkfqs.tools.jar",
          "fileSize": 578087,
          "fileHashCode": -2033420926,
          "fileLastModified": 1613838181727
        }
      ]
    },
    {
      "resourceSetId": 156,
      "resourceSetName": "Plug-Ins",
      "resourceSetDescription": "",
      "filesArray": [
        {
          "fileName": "HttpSessionPlugin_ChangeCopyright.json",
          "fileSize": 5321,
          "fileHashCode": 1958407366,
          "fileLastModified": 1613838287871
        }
      ]
    }
  ],
  "isError": false
}

createResourceSet

Specific Request Fields:

  • projectId
  • resourceSetName
  • resourceSetDescription (optional)

Response Fields:

  • resourceSetId

Specific Error Flags:

  • projectIdError
  • resourceSetNameError
  • diskSpaceLimitExceededError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"createResourceSet",
  "projectId":97,
  "resourceSetName":"My New Resource Set",
  "resourceSetDescription": "Created by API call"
}

JSON Response Example (Success Case):

{"resourceSetId":172,"isError":false}

JSON Response Example (Error Case):

{"isError":true,"genericErrorText":"","resourceSetNameError":true,"projectIdError":false,"diskSpaceLimitExceededError":false}

deleteResourceSet

Specific Request Fields:

  • projectId
  • resourceSetId
  • moveToTrash (optional, default: false)

Specific Error Flags:

  • projectIdError
  • resourceSetIdError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"deleteResourceSet",
  "projectId":97,
  "resourceSetId":172,
  "moveToTrash":false
}

getFilesInfoOfResourceSet

Specific Request Fields:

  • projectId
  • resourceSetId

Specific Error Flags:

  • projectIdError
  • resourceSetIdError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getFilesInfoOfResourceSet",
  "projectId":23,
  "resourceSetId":143
}

JSON Response Example:

{
  "filesArray": [
    {
      "fileName": "DKFQSLibrary2.psm1",
      "fileSize": 16339,
      "fileHashCode": -1503445747,
      "fileLastModified": 1603566144851
    },
    {
      "fileName": "powershell-http-bern2.ps1",
      "fileSize": 12900,
      "fileHashCode": -1174212096,
      "fileLastModified": 1603566162094
    },
    {
      "fileName": "TestResult_powershell-http-bern2Neu_2020-10-24@21-06-04.json",
      "fileSize": 14395,
      "fileHashCode": -951574615,
      "fileLastModified": 1603566379097
    },
    {
      "fileName": "TestResult_powershell-http-bern2Neu_2020-10-24@21-09-45.json",
      "fileSize": 55128,
      "fileHashCode": 1499924815,
      "fileLastModified": 1603566591322
    }
  ],
  "isError": false
}

createFile

Specific Request Fields:

  • projectId
  • resourceSetId
  • fileName
  • fileContentB64 (the content of the file, in Base64 format)

Response Fields:

  • fileName
  • fileSize
  • fileHashCode
  • fileLastModified

Specific Error Flags:

  • projectIdError
  • resourceSetIdError
  • fileNameError
  • diskSpaceLimitExceededError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"createFile",
  "projectId":23,
  "resourceSetId":143,
  "fileName":"test.txt",
  "fileContentB64":"VGhpcyBpcyB0aGUgY29udGVudCBvZiB0aGUgZmlsZS4=" 
}

JSON Response Example (Success Case):

{
  "fileName":"test.txt",
  "fileSize":32,
  "fileHashCode":-1460278014,
  "fileLastModified":1625423562384,
  "isError":false
}

JSON Response Example (Error Case):

{"isError":true,"genericErrorText":"","projectIdError":false,"resourceSetIdError":false,"diskSpaceLimitExceededError":false,"fileNameError":true}

getFile

Specific Request Fields:

  • projectId
  • resourceSetId
  • fileName

Response Fields:

  • fileName
  • fileContentB64 (the content of the file, in Base64 format)
  • fileSize
  • fileHashCode
  • fileLastModified

Specific Error Flags:

  • projectIdError
  • resourceSetIdError
  • fileNameError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getFile",
  "projectId":23,
  "resourceSetId":143,
  "fileName":"test.txt"
}

JSON Response Example (Success Case):

{
  "fileName":"test.txt",
  "fileContentB64":"VGhpcyBpcyB0aGUgY29udGVudCBvZiB0aGUgZmlsZS4=",
  "fileSize":32,
  "fileHashCode":-1460278014,
  "fileLastModified":1625423562384,
  "isError":false
}

deleteFile

Specific Request Fields:

  • projectId
  • resourceSetId
  • fileName
  • moveToTrash (optional, default: false)

Response Fields:

  • fileDeleted (a flag which is true if the file was deleted)

Specific Error Flags:

  • projectIdError
  • resourceSetIdError
  • fileNameError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"deleteFile",
  "projectId":23,
  "resourceSetId":143,
  "fileName":"test.txt",
  "moveToTrash":false
}

JSON Response Example (Success Case):

{"fileDeleted":true,"isError":false}

JSON Response Example (Error Case):

{"isError":true,"genericErrorText":"","projectIdError":false,"resourceSetIdError":false,"fileNameError":true}

getMeasuringAgents

Specific Request Fields:

  • [none]

Response Fields:

  • agentId (the unique measuring agent id)
  • createdBySystem (normally false, true = the user cannot modify or delete the measuring agent)
  • ownerUserId (always the same as the user account id)
  • agentActive (flag: if false then the availability of the measuring agent is not monitored)
  • agentDescription
  • agentHost
  • agentPort
  • authToken (the authentication token to access the measuring agent, or an empty string = no access protection | don’t confuse it with the API authTokenValue)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getMeasuringAgents"
}

JSON Response Example (Success Case):

{
  "measuringAgentsArray": [
    {
      "agentId": 46,
      "createdBySystem": false,
      "ownerUserId": 13,
      "agentActive": true,
      "agentDescription": "Local Agent",
      "agentHost": "127.0.0.1",
      "agentPort": 8080,
      "authToken": "OrKmpkbyNWEHok"
    },
    {
      "agentId": 49,
      "createdBySystem": false,
      "ownerUserId": 13,
      "agentActive": false,
      "agentDescription": "Rasberry 1",
      "agentHost": "192.168.0.51",
      "agentPort": 8080,
      "authToken": ""
    },
    {
      "agentId": 50,
      "createdBySystem": false,
      "ownerUserId": 13,
      "agentActive": true,
      "agentDescription": "Ubuntu 10",
      "agentHost": "192.168.0.110",
      "agentPort": 8080,
      "authToken": ""
    },
    {
      "agentId": 51,
      "createdBySystem": false,
      "ownerUserId": 13,
      "agentActive": true,
      "agentDescription": "Ubuntu 11",
      "agentHost": "192.168.0.111",
      "agentPort": 8080,
      "authToken": ""
    }
  ],
  "isError": false
}

getMinRequiredMeasuringAgentVersion

Specific Request Fields:

  • [none]

Response Fields:

  • minRequiredMeasuringAgentVersion (the minimum required measuring agent version)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getMinRequiredMeasuringAgentVersion"
}

JSON Response Example (Success Case):

{
  "minRequiredMeasuringAgentVersion":"3.9.34",
  "isError":false
}

addMeasuringAgent

Specific Request Fields:

  • agentDescription (must be unique across all measuring agents of the user, cannot be an empty string)
  • agentHost
  • agentPort
  • agentActive (flag: if false then the availability of the measuring agent is not monitored)
  • agentAuthToken (the authentication token to access the measuring agent, or an empty string = no access protection)

Response Fields (JSON object “measuringAgent”):

  • agentId (the unique measuring agent id)
  • createdBySystem (always false for this function)
  • ownerUserId (always the same as the user account id)
  • agentActive (flag: if false then the availability of the measuring agent is not monitored)
  • agentDescription
  • agentHost
  • agentPort
  • authToken (the authentication token to access the measuring agent, or an empty string = no access protection)

Specific Error Flags:

  • agentDescriptionError
  • agentHostError
  • agentPortError
  • maxNumberMeasuringAgentsLimitExceededError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"addMeasuringAgent",
  "agentDescription":"Ubuntu 12",
  "agentHost":"192.168.0.112",
  "agentPort":8080,
  "agentActive": true,
  "agentAuthToken": "nixda"
}

JSON Response Example (Success Case):

{
  "measuringAgent": {
    "agentId": 53,
    "createdBySystem": false,
    "ownerUserId": 13,
    "agentActive": true,
    "agentDescription": "Ubuntu 12",
    "agentHost": "192.168.0.112",
    "agentPort": 8080,
    "authToken": "nixda"
  },
  "isError": false
}

pingMeasuringAgent

Specific Request Fields:

  • agentId

Response Fields (JSON object “agentResponse”):

  • pingFromRemoteIp
  • pingFromRemoteUserId
  • productVersion (measuring agent version | don’t confuse with portal server version)
  • limitMaxUsersPerJob (limit of the measuring agent, -1 = unlimited | don’t confuse with price plan limit)
  • limitMaxJobDurationSeconds (limit of the measuring agent, -1 = unlimited | don’t confuse with price plan limit)
  • osName
  • osVersion
  • javaVersion
  • javaVendor
  • javaMaxMemory
  • systemTime
  • deltaTimeMillis
  • agentStartupTimeStamp
  • httpExecuteTimeMillis

Specific Error Flags:

  • agentIdError
  • agentAccessDeniedError
  • agentVersionOutdatedError
  • agentNotReachableError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"pingMeasuringAgent",
  "agentId":48
}

JSON Response Example (Success Case):

{
  "agentResponse": {
    "pingFromRemoteIp": "83.150.39.44",
    "pingFromRemoteUserId": 13,
    "productVersion": "3.9.30",
    "limitMaxUsersPerJob": 500,
    "limitMaxJobDurationSeconds": 300,
    "osName": "Linux",
    "osVersion": "4.15.0-136-generic",
    "javaVersion": "11.0.1",
    "javaVendor": "Oracle Corporation",
    "javaMaxMemory":"2048 MB",
    "systemTime": 1625513238236,
    "deltaTimeMillis": 841,
    "agentStartupTimeStamp": 1622836702172,
    "httpExecuteTimeMillis": 247
  },
  "isError": false
}

JSON Response Example (Error Case 1):

{
  "isError": true,
  "genericErrorText": "API V1 request to 192.168.0.51:8080 timed out",
  "agentIdError": false,
  "agentAccessDeniedError": false,
  "agentNotReachableError": true,
  "agentVersionOutdatedError": false
}

JSON Response Example (Error Case 2):

{
  "isError": true,
  "genericErrorText": "Min. measuring agent version required: 3.9.30",
  "agentIdError": false,
  "agentAccessDeniedError": false,
  "agentNotReachableError": false,
  "agentVersionOutdatedError": true
}

setMeasuringAgentActive

Specific Request Fields:

  • agentId
  • agentActive

Response Fields:

  • [none]

Specific Error Flags:

  • agentIdError
  • agentAccessDeniedError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"setMeasuringAgentActive",
  "agentId":46,
  "agentActive":false
}

JSON Response Example (Success Case):

{"isError":false}

deleteMeasuringAgent

Specific Request Fields:

  • agentId

Response Fields:

  • [none]

Specific Error Flags:

  • agentIdError
  • agentAccessDeniedError
  • agentDeleteDeniedError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"deleteMeasuringAgent",
  "agentId":54
}

JSON Response Example (Success Case):

{"isError":false}

getMeasuringAgentClusters

Specific Request Fields:

  • [none]

Response Fields (JSON array “measuringAgentClustersArray”):

  • clusterId (the unique cluster id)
  • createdBySystem (normally false, true = the user cannot modify or delete the cluster)
  • ownerUserId (always the same as the user account id)
  • clusterActive (flag: if false then the availability of the cluster is not monitored)
  • clusterDescription
  • controllerHost (the hostname or IP address of the cluster controller)
  • controllerPort (the IP port of the cluster controller)
  • controllerAuthToken (the authentication token to access the cluster controller, or an empty string = no access protection | don’t confuse it with the API authTokenValue)
  • clusterMembersArray
    • clusterMemberId (the unique cluster member id)
    • loadFactor (integer 0..100: the default load factor of this cluster member)
    • agentId (the referenced measuring agent id)
    • agentActive (flag: if false then the availability of the measuring agent is not monitored)
    • agentDescription
    • agentHost
    • agentPort
    • agentAuthToken (the authentication token to access the measuring agent, or an empty string = no access protection | don’t confuse it with the API authTokenValue)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getMeasuringAgentClusters"
}

JSON Response Example:

{
  "measuringAgentClustersArray": [
    {
      "clusterId": 11,
      "createdBySystem": false,
      "ownerUserId": 13,
      "clusterActive": true,
      "clusterDescription": "C1",
      "controllerHost": "192.168.0.50",
      "controllerPort": 8083,
      "controllerAuthToken": "aberaber",
      "clusterMembersArray": [
        {
          "clusterMemberId": 59,
          "loadFactor": 1,
          "agentId": 64,
          "agentActive": true,
          "agentDescription": "Agent 1",
          "agentHost": "192.168.0.10",
          "agentPort": 8080,
          "agentAuthToken": "OrKmAAbyNWEHok"
        },
        {
          "clusterMemberId": 60,
          "loadFactor": 1,
          "agentId": 59,
          "agentActive": true,
          "agentDescription": "Ubuntu 10",
          "agentHost": "192.168.0.110",
          "agentPort": 8080,
          "agentAuthToken": "asc7jhacab"
        },
        {
          "clusterMemberId": 61,
          "loadFactor": 1,
          "agentId": 60,
          "agentActive": true,
          "agentDescription": "Ubuntu 11",
          "agentHost": "192.168.0.111",
          "agentPort": 8080,
          "agentAuthToken": "66ascascsdac"
        }
      ]
    },
    {
      "clusterId": 14,
      "createdBySystem": false,
      "ownerUserId": 13,
      "clusterActive": true,
      "clusterDescription": "C2",
      "controllerHost": "192.168.0.50",
      "controllerPort": 8083,
      "controllerAuthToken": "aberaber",
      "clusterMembersArray": [
        {
          "clusterMemberId": 66,
          "loadFactor": 1,
          "agentId": 56,
          "agentActive": true,
          "agentDescription": "Test System",
          "agentHost": "192.168.0.60",
          "agentPort": 8080,
          "agentAuthToken": "aberdoch"
        },
        {
          "clusterMemberId": 67,
          "loadFactor": 1,
          "agentId": 59,
          "agentActive": true,
          "agentDescription": "Ubuntu 10",
          "agentHost": "192.168.0.110",
          "agentPort": 8080,
          "agentAuthToken": "asc7jhacab"
        }
      ]
    }
  ],
  "isError": false
}

getClusterControllers

Specific Request Fields:

  • [none]

Response Fields (JSON array “clusterControllersArray”):

  • controllerHost (the hostname or IP address of the cluster controller)
  • controllerPort (the IP port of the cluster controller)
  • controllerAuthToken (the authentication token to access the cluster controller)
  • measuringAgentClustersArray (an array of measuring agent clusters which are referencing this cluster controller)
    • clusterId
    • clusterDescription
    • clusterActive

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getClusterControllers"
}

JSON Response Example:

{
  "clusterControllersArray": [
    {
      "controllerHost": "192.168.0.33",
      "controllerPort": 8083,
      "controllerAuthToken": "2fasdtfffe",
      "measuringAgentClustersArray": [
        {
          "clusterId": 11,
          "clusterDescription": "C1",
          "clusterActive": 1
        },
        {
          "clusterId": 13,
          "clusterDescription": "C2",
          "clusterActive": 1
        },
        {
          "clusterId": 14,
          "clusterDescription": "C3",
          "clusterActive": 1
        }
      ]
    },
    {
      "controllerHost": "192.168.0.50",
      "controllerPort": 8083,
      "controllerAuthToken": "asfsdgh763",
      "measuringAgentClustersArray": [
        {
          "clusterId": 15,
          "clusterDescription": "C4",
          "clusterActive": 1
        },
        {
          "clusterId": 16,
          "clusterDescription": "C7",
          "clusterActive": 1
        }
      ]
    }
  ],
  "isError": false
}

getMinRequiredClusterControllerVersion

Specific Request Fields:

  • [none]

Response Fields:

  • minRequiredClusterControllerVersion (the minimum required cluster controller version)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getMinRequiredClusterControllerVersion"
}

JSON Response Example:

{
  "minRequiredClusterControllerVersion":"4.0.4",
  "isError":false
}

pingClusterController

Specific Request Fields:

  • controllerHost (the cluster controller host name or IP address)
  • controllerPort (the cluster controller IP port)
  • controllerAuthToken (the authentication token to access the cluster controller, or an empty string = no access protection)

Response Fields (JSON object “controllerResponse”):

  • pingFromRemoteIp
  • pingFromRemoteUserId
  • productVersion (cluster controller version | don’t confuse with portal server version)
  • osName
  • osVersion
  • javaVersion
  • javaVendor
  • javaMaxMemory
  • systemTime
  • deltaTimeMillis
  • controllerStartupTimeStamp
  • httpExecuteTimeMillis
  • clusterControllerOutdated

Specific Error Flags:

  • controllerHostError
  • controllerPortError
  • controllerVersionOutdatedError
  • controllerNotReachableError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"pingClusterController",
    "controllerHost":"192.168.0.50",
    "controllerPort":8083,
    "controllerAuthToken":"hagsajjs99"
}

JSON Response Example (Success Case):

{
  "controllerResponse": {
    "pingFromRemoteIp": "192.168.0.100",
    "pingFromRemoteUserId": 13,
    "productVersion": "4.0.4",
    "osName": "Linux",
    "osVersion": "4.15.0-135-generic",
    "javaVersion": "11.0.1",
    "javaVendor": "Oracle Corporation",
    "javaMaxMemory": "512 MB",
    "systemTime": 1643406118552,
    "deltaTimeMillis": 1120,
    "controllerStartupTimeStamp": 1643322597013,
    "httpExecuteTimeMillis": 249,
    "clusterControllerOutdated": false
  },
  "isError": false
}

JSON Response Example (Error Case 1):

{
  "isError": true,
  "genericErrorText": "API call pingGetControllerInfo failed. Error code = 18, Error message = Invalid authentication token",
  "controllerHostError": false,
  "controllerVersionOutdatedError": false,
  "controllerNotReachableError": true,
  "controllerPortError": false
}

JSON Response Example (Error Case 2):

{
  "isError": true,
  "genericErrorText": "Min. cluster controller version required: 4.0.4",
  "controllerHostError": false,
  "controllerVersionOutdatedError": true,
  "controllerNotReachableError": false,
  "controllerPortError": false
}

addMeasuringAgentCluster

Specific Request Fields:

  • clusterActive (flag: if false then the availability of the cluster is not monitored)
  • clusterDescription (must be unique across all measuring agent clusters and all measuring agents of the user, cannot be an empty string)
  • controllerHost (the cluster controller host name or IP address)
  • controllerPort (the cluster controller IP port)
  • controllerAuthToken (the authentication token to access the cluster controller, or an empty string = no access protection)
  • clusterMembersArray (an array of cluster members - can also be empty)
    • agentId (the referenced measuring agent id)
    • loadFactor (integer 0..100: the load factor of this cluster member, recommended value = 1)

Response Fields:

  • clusterId (the unique cluster id)
  • clusterMembersArray (the array of cluster members)
    • clusterMemberId (the unique cluster member id)
    • agentId (the referenced measuring agent id)
    • loadFactor (integer 0..100: the load factor of this cluster member)

Specific Error Flags:

  • clusterDescriptionError
  • controllerHostError
  • controllerPortError
  • agentIdError
  • loadFactorError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"addMeasuringAgentCluster",
  "clusterActive":true,
  "clusterDescription":"C7",
  "controllerHost":"192.168.0.50",
  "controllerPort":8083,
  "controllerAuthToken":"aberaber",
  "clusterMembersArray":[
    {
      "agentId":59,
      "loadFactor":1
    },
    {
      "agentId":60,
      "loadFactor":1
    }
  ]
}

JSON Response Example (Success Case):

{
  "clusterId":16,
  "clusterMembersArray":[
    {
      "clusterMemberId":71,
      "agentId":59,
      "loadFactor":1
    },
    {
      "clusterMemberId":72,
      "agentId":60,
      "loadFactor":1
    }
  ],
  "isError":false
}

JSON Response Example (Error Case):

{
  "isError": true,
  "genericErrorText": "Invalid agentId = 101",
  "controllerHostError": false,
  "agentIdError": true,
  "controllerPortError": false,
  "loadFactorError": false,
  "clusterDescriptionError": false
}

addMemberToMeasuringAgentCluster

Specific Request Fields:

  • clusterId
  • agentId (the referenced measuring agent id)
  • loadFactor (integer 0..100: the load factor of this cluster member, recommended value = 1)

Response Fields (JSON object “clusterMember”):

  • clusterMemberId (the unique cluster member id)
  • agentId
  • loadFactor

Specific Error Flags:

  • clusterIdError
  • clusterAccessDeniedError
  • clusterModifyDeniedError
  • agentIdError
  • agentAccessDeniedError
  • loadFactorError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"addMemberToMeasuringAgentCluster",
  "clusterId":17,
  "agentId":64,
  "loadFactor":1
}

JSON Response Example:

{
  "clusterMember": {
    "clusterMemberId": 75,
    "agentId": 64,
    "loadFactor": 1
  },
  "isError": false
}

removeMemberFromMeasuringAgentCluster

Specific Request Fields:

  • clusterId
  • clusterMemberId

Response Fields:

  • [none]

Specific Error Flags:

  • clusterIdError
  • clusterAccessDeniedError
  • clusterModifyDeniedError
  • clusterMemberIdError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"removeMemberFromMeasuringAgentCluster",
  "clusterId":17,
  "clusterMemberId":75
}

JSON Response Example:

{"isError":false}

pingMeasuringAgentClusterMembers

Specific Request Fields:

  • clusterId

Response Fields (JSON object “controllerResponse”):

  • productVersion (cluster controller version)
  • clusterConnectResult (the connect information to the cluster members)
    • measuringAgentClusterMemberArray (the array of cluster members)
      • clusterMemberId
      • loadFactor
      • agentId
      • agentActive
      • agentDescription
      • agentHost
      • agentPort
      • agentAuthToken
    • connectSuccessfulClusterMemberArray (the array of cluster member ids to which the connection was successful established)
    • connectFailedClusterMemberArray (the array of cluster members to which the connection has failed)
      • clusterMemberId
      • errorMessage
    • clusterConnectStartTimestamp
    • clusterConnectDurationMillis
  • clusterActionResult (the ping result of the cluster members)
    • actionSuccessfulClusterMemberArray (the array of cluster member ids which have performed the ping to the measuring agent)
    • actionFailedClusterMemberArray (the array of cluster members which have not performed the ping to the measuring agent)
      • clusterMemberId
      • errorMessage
    • jsonResponseClusterMemberArray (the array of cluster member which have performed the ping)
      • clusterMemberId
      • jsonResponseObject (the pong response of the cluster member)
        • productVersion (measuring agent product version)
        • systemTime
        • deltaTimeMillis (the OS time difference in milliseconds between the cluster controller and the measuring agent)
        • osName
        • osVersion
        • javaVersion
        • javaVendor
        • javaMaxMemory
        • samplingGranularityMillis (the data collector sampling granularity in milliseconds)
        • isError (boolean flag, normally always false)
        • measuringAgentOutdated (a boolean flag, true = measuring agent product version is outdated)
    • clusterActionStartTimestamp
    • clusterActionDurationMillis
  • httpExecuteTimeMillis
  • clusterControllerOutdated

Specific Error Flags:

  • clusterIdError
  • clusterAccessDeniedError
  • controllerVersionOutdatedError
  • controllerNotReachableError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"pingMeasuringAgentClusterMembers",
  "clusterId":16
}

JSON Response Example (Success Case):

{
  "controllerResponse": {
    "productVersion": "4.0.4",
    "clusterConnectResult": {
      "measuringAgentClusterMemberArray": [
        {
          "clusterMemberId": 71,
          "loadFactor": 1,
          "agentId": 59,
          "agentActive": true,
          "agentDescription": "Ubuntu 10",
          "agentHost": "192.168.0.110",
          "agentPort": 8080,
          "agentAuthToken": "agsdhagsj"
        },
        {
          "clusterMemberId": 72,
          "loadFactor": 1,
          "agentId": 60,
          "agentActive": true,
          "agentDescription": "Ubuntu 11",
          "agentHost": "192.168.0.111",
          "agentPort": 8080,
          "agentAuthToken": "nvbjnvbnn"
        }
      ],
      "connectSuccessfulClusterMemberArray": [
        71,
        72
      ],
      "connectFailedClusterMemberArray": [],
      "clusterConnectStartTimestamp": 1643410829270,
      "clusterConnectDurationMillis": 79
    },
    "clusterActionResult": {
      "actionSuccessfulClusterMemberArray": [
        71,
        72
      ],
      "actionFailedClusterMemberArray": [],
      "jsonResponseClusterMemberArray": [
        {
          "clusterMemberId": 71,
          "jsonResponseObject": {
            "productVersion": "4.0.4",
            "systemTime": 1643410829340,
            "deltaTimeMillis": -10,
            "osName": "Linux",
            "osVersion": "5.4.0-92-generic",
            "javaVersion": "11.0.1",
            "javaVendor": "Oracle Corporation",
            "javaMaxMemory": "2048 MB",
            "samplingGranularityMillis": 4000,
            "isError": false,
            "measuringAgentOutdated": false
          }
        },
        {
          "clusterMemberId": 72,
          "jsonResponseObject": {
            "productVersion": "4.0.4",
            "systemTime": 1643410829351,
            "deltaTimeMillis": -10,
            "osName": "Linux",
            "osVersion": "5.4.0-92-generic",
            "javaVersion": "11.0.1",
            "javaVendor": "Oracle Corporation",
            "javaMaxMemory": "2048 MB",
            "samplingGranularityMillis": 4000,
            "isError": false,
            "measuringAgentOutdated": false
          }
        }
      ],
      "clusterActionStartTimestamp": 1643410829349,
      "clusterActionDurationMillis": 43
    },
    "httpExecuteTimeMillis": 1778,
    "clusterControllerOutdated": false
  },
  "isError": false
}

JSON Response Example (Error Case / Partly failed):

{
  "controllerResponse": {
    "productVersion": "4.0.4",
    "clusterConnectResult": {
      "measuringAgentClusterMemberArray": [
        {
          "clusterMemberId": 71,
          "loadFactor": 1,
          "agentId": 59,
          "agentActive": true,
          "agentDescription": "Ubuntu 10",
          "agentHost": "192.168.0.110",
          "agentPort": 8080,
          "agentAuthToken": "marderzahn"
        },
        {
          "clusterMemberId": 72,
          "loadFactor": 1,
          "agentId": 60,
          "agentActive": true,
          "agentDescription": "Ubuntu 11",
          "agentHost": "192.168.0.111",
          "agentPort": 8080,
          "agentAuthToken": "marderzahn"
        }
      ],
      "connectSuccessfulClusterMemberArray": [
        72
      ],
      "connectFailedClusterMemberArray": [
        {
          "clusterMemberId": 71,
          "errorMessage": "Connection refused (Connection refused)"
        }
      ],
      "clusterConnectStartTimestamp": 1643414272214,
      "clusterConnectDurationMillis": 97
    },
    "clusterActionResult": {
      "actionSuccessfulClusterMemberArray": [
        72
      ],
      "actionFailedClusterMemberArray": [],
      "jsonResponseClusterMemberArray": [
        {
          "clusterMemberId": 72,
          "jsonResponseObject": {
            "productVersion": "4.0.4",
            "systemTime": 1643414272310,
            "deltaTimeMillis": -8,
            "osName": "Linux",
            "osVersion": "5.4.0-92-generic",
            "javaVersion": "11.0.1",
            "javaVendor": "Oracle Corporation",
            "javaMaxMemory": "2048 MB",
            "samplingGranularityMillis": 4000,
            "isError": false,
            "measuringAgentOutdated": false
          }
        }
      ],
      "clusterActionStartTimestamp": 1643414272311,
      "clusterActionDurationMillis": 21
    },
    "httpExecuteTimeMillis": 1769,
    "clusterControllerOutdated": false
  }
}

setMeasuringAgentClusterActive

Specific Request Fields:

  • clusterId
  • clusterActive

Response Fields:

  • [none]

Specific Error Flags:

  • clusterIdError
  • clusterAccessDeniedError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"setMeasuringAgentClusterActive",
  "clusterId":16,
  "clusterActive":true
}

JSON Response Example (Success Case):

{"isError":false}

deleteMeasuringAgentCluster

Specific Request Fields:

  • clusterId

Response Fields:

  • [none]

Specific Error Flags:

  • clusterIdError
  • clusterAccessDeniedError
  • clusterDeleteDeniedError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"deleteMeasuringAgentCluster",
  "clusterId":16
}

JSON Response Example (Success Case):

{"isError":false}

getProxyRecorders

Specific Request Fields:

  • [none]

Response Fields (JSON array “proxyRecordersArray”):

  • recorderId (the unique proxy recorder id)
  • createdBySystem (normally false, true = the user cannot modify or delete the proxy recorder)
  • ownerUserId (always the same as the user account id)
  • recorderDescription
  • recorderProxyHost
  • recorderProxyPort (HTTP and HTTPS port of the proxy)
  • recorderProxyAuthUsername (proxy authentication username, or an empty string = no proxy authentication required)
  • recorderProxyAuthPassword (proxy authentication password)
  • recorderControlPort (the proxy recorder control port)
  • recorderControlAuthToken (the authentication token to access the proxy recorder control port, or an empty string = no access protection | don’t confuse it with the API authTokenValue)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getProxyRecorders"
}

JSON Response Example:

{
  "proxyRecordersArray": [
    {
      "recorderId": 3,
      "createdBySystem": false,
      "ownerUserId": 13,
      "recorderDescription": "Erster",
      "recorderProxyHost": "192.168.0.40",
      "recorderProxyPort": 8082,
      "recorderProxyAuthUsername": "",
      "recorderProxyAuthPassword": "",
      "recorderControlPort": 8081,
      "recorderControlAuthToken": ""
    },
    {
      "recorderId": 4,
      "createdBySystem": false,
      "ownerUserId": 13,
      "recorderDescription": "proxy.realload.com",
      "recorderProxyHost": "proxy.realload.com",
      "recorderProxyPort": 8082,
      "recorderProxyAuthUsername": "max.meier",
      "recorderProxyAuthPassword": "123456",
      "recorderControlPort": 8081,
      "recorderControlAuthToken": "aZujkl97zuwert"
    }
  ],
  "isError": false
}

getMinRequiredProxyRecorderVersion

Specific Request Fields:

  • [none]

Response Fields:

  • minRequiredProxyRecorderVersion (the minimum required HTTP/S proxy recorder version)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getMinRequiredProxyRecorderVersion"
}

JSON Response Example (Success Case):

{
  "minRequiredProxyRecorderVersion":"0.2.2",
  "isError":false
}

addProxyRecorder

Specific Request Fields:

  • recorderDescription (must be unique across all HTTP/S proxy recorders of the user, cannot be an empty string)
  • recorderProxyHost
  • recorderProxyPort (HTTP and HTTPS port of the proxy)
  • recorderProxyAuthUsername (proxy authentication username, or an empty string = no proxy authentication required)
  • recorderProxyAuthPassword (proxy authentication password, applied if recorderProxyAuthUsername is not an empty string)
  • recorderControlPort (the proxy recorder control port)
  • recorderControlAuthToken (the authentication token to access the proxy recorder control port, or an empty string = no access protection)

Response Fields (JSON object “proxyRecorder”):

  • recorderId (the unique HTTP/S proxy recorder id)
  • createdBySystem (always false for this function)
  • ownerUserId (always the same as the user account id)
  • recorderDescription
  • recorderProxyHost
  • recorderProxyPort
  • recorderProxyAuthUsername
  • recorderProxyAuthPassword
  • recorderControlPort
  • recorderControlAuthToken

Specific Error Flags:

  • recorderDescriptionError
  • recorderProxyHostError
  • recorderProxyPortError
  • recorderControlPortError
  • maxNumberProxyRecordersLimitExceededError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"addProxyRecorder",
  "recorderDescription":"My New Proxy Recorder",
  "recorderProxyHost":"192.168.0.148",
  "recorderProxyPort":8082,
  "recorderProxyAuthUsername":"max.meier",
  "recorderProxyAuthPassword":"123456",
  "recorderControlPort":8081,
  "recorderControlAuthToken":"aZujkl97zuwert"
}

JSON Response Example (Success Case):

{
  "proxyRecorder": {
    "recorderId": 10,
    "createdBySystem": false,
    "ownerUserId": 13,
    "recorderDescription": "My New Proxy Recorder",
    "recorderProxyHost": "192.168.0.148",
    "recorderProxyPort": 8082,
    "recorderProxyAuthUsername": "max.meier",
    "recorderProxyAuthPassword": "123456",
    "recorderControlPort": 8081,
    "recorderControlAuthToken": "aZujkl97zuwert"
  },
  "isError": false
}

pingProxyRecorder

Specific Request Fields:

  • recorderId

Response Fields (JSON object “pongResponse”):

  • pingFromRemoteIp
  • pingFromRemoteUserId
  • productVersion (the remote proxy recorder version | don’t confuse with portal server version)
  • recorderComponentVersion (the proxy recorder component version | don’t confuse with portal server version)
  • isRecording
  • recordHostFilter
  • numRecordedElements
  • osName
  • osVersion
  • javaMemoryMB
  • javaVersion
  • javaVendor
  • systemTime
  • deltaTimeMillis
  • httpExecuteTimeMillis

Specific Error Flags:

  • recorderIdError
  • recorderAccessDeniedError
  • recorderNotReachableError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"pingProxyRecorder",
  "recorderId":4
}

JSON Response Example (Success Case):

{
  "pongResponse": {
    "pingFromRemoteIp": "83.150.39.44",
    "pingFromRemoteUserId": 13,
    "productVersion": "0.2.0",
    "recorderComponentVersion": "1.1.0",
    "isRecording": false,
    "recordHostFilter": "www.dkfqa.com",
    "numRecordedElements": 0,
    "osName": "Linux",
    "osVersion": "5.4.0-74-generic",
    "javaMemoryMB": 2048,
    "javaVersion": "11.0.1",
    "javaVendor": "Oracle Corporation",
    "systemTime": 1625529858405,
    "deltaTimeMillis": 790,
    "httpExecuteTimeMillis": 88
  },
  "isError": false
}

JSON Response Example (Error Case):

{
  "isError": true,
  "genericErrorText": "connect timed out",
  "recorderNotReachableError": true,
  "recorderIdError": false,
  "recorderAccessDeniedError": false
}

deleteProxyRecorder

Specific Request Fields:

  • recorderId

Response Fields:

  • [none]

Specific Error Flags:

  • recorderIdError
  • recorderAccessDeniedError
  • recorderDeleteDeniedError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"deleteProxyRecorder",
  "recorderId":10
}

JSON Response Example (Success Case):

{"isError":false}

getProxyRecordersClientCertificates

Specific Request Fields:

  • [none]

Response Fields:

  • certificateId (unique ID)
  • ownerUserId (always the own user ID)
  • recorderId (always -1 = apply for all proxy recorders)
  • originalCertFileName (without disk path)
  • certFileType (always PKCS#12)
  • certFileDataB64 (the file data in base64 format)
  • certPassword
  • certDescription
  • certActive (if false then do not transmit the certificate to the proxy recorders)
  • applyForHost
  • applyForPort

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getProxyRecordersClientCertificates"
}

JSON Response Example (Success Case):

{
  "clientCertificatesArray": [
    {
      "certificateId": 1,
      "ownerUserId": 13,
      "recorderId": -1,
      "originalCertFileName": "fischer@dkfqa.com.p12",
      "certFileType": "PKCS#12",
      "certFileDataB64": "MIIRQQ.....CAA=",
      "certPassword": "12345678",
      "certDescription": "Fischer's Cert",
      "certActive": true,
      "applyForHost": "192.168.0.100",
      "applyForPort": 499
    },
    {
      "certificateId": 3,
      "ownerUserId": 13,
      "recorderId": -1,
      "originalCertFileName": "miller@dkfqa.com.p12",
      "certFileType": "PKCS#12",
      "certFileDataB64": "MIIRXB.....CCAA=",
      "certPassword": "abcdefgh",
      "certDescription": "",
      "certActive": false,
      "applyForHost": "www.werwaswo.com",
      "applyForPort": 443
    }
  ],
  "isError": false
}

addProxyRecordersClientCertificate

Specific Request Fields:

  • recorderId (always -1 = apply for all proxy recorders)
  • certFileName (without disk path)
  • certFileType (always PKCS#12)
  • certFileDataB64 (the file data in base64 format)
  • certPassword
  • certDescription (optional, but not null)
  • certActive (if false then do not transmit the certificate to the proxy recorders)
  • applyForHost
  • applyForPort

Response Fields:

  • certificateId (the new unique ID)
  • ownerUserId (always the own user ID)
  • recorderId (always -1 = apply for all proxy recorders)
  • originalCertFileName (without disk path)
  • certFileType (always PKCS#12)
  • certDescription
  • certActive
  • applyForHost
  • applyForPort

Specific Error Flags:

  • certDescriptionError
  • applyForHostError
  • applyForPortError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"addProxyRecordersClientCertificate",
  "recorderId": -1,
  "certFileName": "felix@dkfqa.com.p12",
  "certFileType": "PKCS#12",
  "certFileDataB64": "MIIRQQIBAzCCEQ.....3dUWQICCAA=",
  "certPassword": "mammamia",
  "certDescription":"",
  "certActive": true,
  "applyForHost": "www.dkfqa.com",
  "applyForPort": 443
}

JSON Response Example (Success Case):

{
  "addedClientCertificate": {
    "certificateId": 5,
    "ownerUserId": 13,
    "recorderId": -1,
    "originalCertFileName": "felix@dkfqa.com.p12",
    "certFileType": "PKCS#12",
    "certDescription": "",
    "certActive": true,
    "applyForHost": "www.dkfqa.com",
    "applyForPort": 443
  },
  "isError": false
}

setProxyRecordersClientCertificateActive

Specific Request Fields:

  • certificateId
  • certActive (if false then do not transmit the certificate to the proxy recorders)

Response Fields:

  • certificateId
  • ownerUserId (always the own user ID)
  • recorderId (always -1 = apply for all proxy recorders)
  • originalCertFileName (without disk path)
  • certFileType (always PKCS#12)
  • certDescription
  • certActive
  • applyForHost
  • applyForPort

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"setProxyRecordersClientCertificateActive",
  "certificateId": 5,
  "certActive": false
}

JSON Response Example (Success Case):

{
  "updatedClientCertificate": {
    "certificateId": 5,
    "ownerUserId": 13,
    "recorderId": -1,
    "originalCertFileName": "felix@dkfqa.com.p12",
    "certFileType": "PKCS#12",
    "certDescription": "",
    "certActive": false,
    "applyForHost": "www.dkfqa.com",
    "applyForPort": 443
  },
  "isError": false
}

modifyProxyRecordersClientCertificate

Specific Request Fields:

  • certificateId
  • certDescription (optional but not null)
  • applyForHost (required)
  • applyForPort (required)

Response Fields:

  • certificateId
  • ownerUserId (always the own user ID)
  • recorderId (always -1 = apply for all proxy recorders)
  • originalCertFileName (without disk path)
  • certFileType (always PKCS#12)
  • certDescription
  • certActive
  • applyForHost
  • applyForPort

Specific Error Flags:

  • certDescriptionError
  • applyForHostError
  • applyForPortError

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"modifyProxyRecordersClientCertificate",
  "certificateId": 5,
  "certDescription": "My Cert",
  "applyForHost": "www.dkfqa.com",
  "applyForPort": 444
}

JSON Response Example (Success Case):

{
  "updatedClientCertificate": {
    "certificateId": 5,
    "ownerUserId": 13,
    "recorderId": -1,
    "originalCertFileName": "felix@dkfqa.com.p12",
    "certFileType": "PKCS#12",
    "certDescription": "My Cert",
    "certActive": false,
    "applyForHost": "www.dkfqa.com",
    "applyForPort": 444
  },
  "isError": false
}

deleteProxyRecordersClientCertificate

Specific Request Fields:

  • certificateId

Response Fields:

  • [none]

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"deleteProxyRecordersClientCertificate",
  "certificateId": 5
}

JSON Response Example (Success Case):

{"isError": false}

JSON Response Example (Error Case):

{"isError": true, "genericErrorText": "Invalid certificate Id"}

getTestjobTemplates

Specific Request Fields:

  • [none]

Response Fields:

  • testjobTemplatesArray

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getTestjobTemplates"
}

JSON Response Example (Success Case):

{
  "testjobTemplatesArray": [
    {
      "testjobTemplate": {
        "templateId": 10,
        "templateName": "SimpleTest 1VU",
        "templateDescription": "",
        "testjobProperties": {
          "testjobResultFileName": "",
          "executeMeasuringAgentClusterInfo": "",
          "testjobConcurrentUsers": "1",
          "testjobDescription": "SimpleTest",
          "testjobDebugMeasuring": "false",
          "testjobMaxTestDuration": "30",
          "isClusterJob": "",
          "testjobRampUpTime": "10",
          "localTestjobId": "",
          "testjobMaxLoopsPerUser": "1",
          "productVersion": "4.8.23",
          "remoteTestjobId": "",
          "testjobAdditionalArguments": "",
          "definedFromTestId": "384",
          "testjobSignature": "",
          "testjobDelayPerLoop": "1000",
          "testjobExitCode": "",
          "createTimeStamp": "1694549684261",
          "userInputFieldsFileName": "",
          "testjobType": "load test",
          "enableAutomaticFileSync": "true",
          "testjobState": "invalid",
          "isClusterControllerJobProperties": "",
          "testjobDebugExecution": "false",
          "executeOnUserMeasuringAgentId": "",
          "definedFromTimeZoneId": "Europe/Berlin",
          "executeMeasuringAgentInfo": "",
          "executeOnMeasuringAgentClusterId": ""
        },
        "hasUserInputFields": false
      },
      "testIsHealthy": true
    },
    {
      "testjobTemplate": {
        "templateId": 11,
        "templateName": "SimpleTestWithInputFields 10VU",
        "templateDescription": "",
        "testjobProperties": {
          "testjobResultFileName": "",
          "executeMeasuringAgentClusterInfo": "",
          "testjobConcurrentUsers": "10",
          "testjobDescription": "SimpleTestWithInputFields",
          "testjobDebugMeasuring": "false",
          "testjobMaxTestDuration": "60",
          "isClusterJob": "",
          "testjobRampUpTime": "10",
          "localTestjobId": "",
          "testjobMaxLoopsPerUser": "5",
          "productVersion": "4.8.23",
          "remoteTestjobId": "",
          "testjobAdditionalArguments": "",
          "definedFromTestId": "385",
          "testjobSignature": "",
          "testjobDelayPerLoop": "1000",
          "testjobExitCode": "",
          "createTimeStamp": "1695047319785",
          "userInputFieldsFileName": "InputFields_SimpleTestWithInputFields.json",
          "testjobType": "load test",
          "enableAutomaticFileSync": "true",
          "testjobState": "invalid",
          "isClusterControllerJobProperties": "",
          "testjobDebugExecution": "true",
          "executeOnUserMeasuringAgentId": "",
          "definedFromTimeZoneId": "Europe/Berlin",
          "executeMeasuringAgentInfo": "",
          "executeOnMeasuringAgentClusterId": ""
        },
        "hasUserInputFields": true,
        "userInputFieldsFile": {
          "useShortNames": false,
          "magicPattern": "UserInputFields",
          "productVersion": "4.8.23",
          "userInputFieldsArray": [
            {
              "useShortNames": false,
              "productVersion": "4.8.23",
              "label": "Input Host",
              "variableName": "vHost",
              "inputType": "string",
              "defaultValue": "126.3.4.5",
              "currentValue": "126.3.4.5"
            },
            {
              "useShortNames": false,
              "productVersion": "4.8.23",
              "label": "Input Port",
              "variableName": "vPort",
              "inputType": "integer",
              "defaultValue": "444",
              "currentValue": "444"
            }
          ]
        }
      },
      "testIsHealthy": true
    }
  ],
  "isError": false
}

defineNewTestjobFromTemplate

Specific Request Fields:

  • templateId
  • measuringAgentOrClusterId
  • isCluster (boolean)
  • jobDescription

Response Fields:

  • newTestjobId

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"defineNewTestjobFromTemplate",
  "templateId":10,
  "measuringAgentOrClusterId":65,
  "isCluster":false,
  "jobDescription": "Simple Test"
}

JSON Response Example (Success Case):

{ 
  "newTestjobId":33533,
  "isError":false
}

submitTestjob

Specific Request Fields:

  • localTestjobId

Response Fields:

  • agentResponse (for measuring agents), or
  • controllerResponse (for cluster controllers)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"submitTestjob",
  "localTestjobId":33534
}

JSON Response Example (Success Case):

{
  "isClusterJob": false,
  "agentResponse": {
    "remoteTestjobId": 24129,
    "httpExecuteTimeMillis": 338
  },
  "isError": false
}

makeTestjobReadyToRun

Specific Request Fields:

  • localTestjobId

Response Fields:

  • agentResponse (for measuring agents), or
  • controllerResponse (for cluster controllers)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"makeTestjobReadyToRun",
  "localTestjobId":33534
}

JSON Response Example (Success Case):

{
  "isClusterJob": false,
  "agentResponse": {
    "testjobProperties": {
      "testjobResultFileName": "",
      "executeMeasuringAgentClusterInfo": "",
      "testjobConcurrentUsers": "1",
      "testjobDescription": "Simple Test",
      "testjobDebugMeasuring": "false",
      "testjobMaxTestDuration": "30",
      "isClusterJob": "false",
      "testjobRampUpTime": "10",
      "localTestjobId": "33534",
      "testjobMaxLoopsPerUser": "1",
      "productVersion": "4.8.18",
      "remoteTestjobId": "24129",
      "testjobAdditionalArguments": "",
      "definedFromTestId": "384",
      "testjobSignature": "Z9B963yIj232nht1DIX5aSRt8m77QuXpvVA5736Tl9Wc7UZ7jOiU3l6UC7y3Nx6CXDDZB4qUg4FHDtTuHsD9xd0T/CSq/g==",
      "testjobDelayPerLoop": "1000",
      "testjobExitCode": "",
      "createTimeStamp": "1695050460395",
      "userInputFieldsFileName": "",
      "testjobType": "load test",
      "enableAutomaticFileSync": "true",
      "testjobState": "ready to run",
      "isClusterControllerJobProperties": "",
      "testjobDebugExecution": "false",
      "executeOnUserMeasuringAgentId": "65",
      "definedFromTimeZoneId": "Europe/Berlin",
      "executeMeasuringAgentInfo": "agent2.realload.com:8080",
      "executeOnMeasuringAgentClusterId": ""
    },
    "httpExecuteTimeMillis": 2871
  },
  "isError": false
}

startTestjob

Specific Request Fields:

  • localTestjobId

Response Fields:

  • agentResponse (for measuring agents), or
  • controllerResponse (for cluster controllers)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"startTestjob",
  "localTestjobId":33534
}

JSON Response Example (Success Case):

{
  "isClusterJob": false,
  "agentResponse": {
    "testjobProperties": {
      "testjobResultFileName": "",
      "executeMeasuringAgentClusterInfo": "",
      "testjobConcurrentUsers": "1",
      "testjobDescription": "Simple Test",
      "testjobDebugMeasuring": "false",
      "testjobMaxTestDuration": "30",
      "isClusterJob": "false",
      "testjobRampUpTime": "10",
      "localTestjobId": "33534",
      "testjobMaxLoopsPerUser": "1",
      "productVersion": "4.8.18",
      "remoteTestjobId": "24129",
      "testjobAdditionalArguments": "",
      "definedFromTestId": "384",
      "testjobSignature": "Z9B963yIj232nht1DIX5aSRt8m77QuXpvVA5736Tl9Wc7UZ7jOiU3l6UC7y3Nx6CXDDZB4qUg4FHDtTuHsD9xd0T/CSq/g==",
      "testjobDelayPerLoop": "1000",
      "testjobExitCode": "",
      "createTimeStamp": "1695050460395",
      "userInputFieldsFileName": "",
      "testjobType": "load test",
      "enableAutomaticFileSync": "true",
      "testjobState": "running",
      "isClusterControllerJobProperties": "",
      "testjobDebugExecution": "false",
      "executeOnUserMeasuringAgentId": "65",
      "definedFromTimeZoneId": "Europe/Berlin",
      "executeMeasuringAgentInfo": "agent2.realload.com:8080",
      "executeOnMeasuringAgentClusterId": ""
    },
    "httpExecuteTimeMillis": 249
  },
  "isError": false
}

getMeasuringAgentTestjobs

Specific Request Fields:

  • measuringAgentId
  • synchronizeLocalTestjobsState (boolean)

Response Fields:

  • agentResponse

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getMeasuringAgentTestjobs",
  "measuringAgentId":65,
  "synchronizeLocalTestjobsState":true
}

JSON Response Example (Success Case):

{
  "agentResponse": {
    "allTestjobsArray": [
      {
        "testjobProperties": {
          "testjobResultFileName": "TestResult_RealloadTest_2023-09-09@23-45-34.json",
          "executeMeasuringAgentClusterInfo": "",
          "testjobConcurrentUsers": "1",
          "testjobDescription": "RealloadTest",
          "testjobDebugMeasuring": "false",
          "testjobMaxTestDuration": "60",
          "isClusterJob": "false",
          "testjobRampUpTime": "10",
          "localTestjobId": "30717",
          "testjobMaxLoopsPerUser": "1",
          "productVersion": "4.8.18",
          "remoteTestjobId": "15240",
          "testjobAdditionalArguments": "",
          "definedFromTestId": "379",
          "testjobSignature": "NeYJG4vf8/joAwz4nR4Fie3W0Qr7ijps25ONuk6F5BLghuD8/clPL9mBKc/ogQiic7wI8OXOf53Mi4YDCpg4dQzuaWQ==",
          "testjobDelayPerLoop": "1000",
          "testjobExitCode": "0",
          "createTimeStamp": "1694295923799",
          "userInputFieldsFileName": "",
          "testjobType": "load test",
          "enableAutomaticFileSync": "true",
          "testjobState": "completed",
          "isClusterControllerJobProperties": "",
          "testjobDebugExecution": "true",
          "executeOnUserMeasuringAgentId": "65",
          "definedFromTimeZoneId": "Europe/Berlin",
          "executeMeasuringAgentInfo": "agent2.realload.com:8080",
          "executeOnMeasuringAgentClusterId": ""
        },
        "testProperties": {
          "referencedResourceFilesList": [
            {
              "projectId": 130,
              "testplanId": 203,
              "fileName": "com.dkfqs.selenium.jar"
            },
            {
              "projectId": 130,
              "testplanId": 203,
              "fileName": "commons-io-2.13.0.jar"
            },
            {
              "projectId": 130,
              "testplanId": 203,
              "fileName": "hamcrest-core-1.3.jar"
            },
            {
              "projectId": 130,
              "testplanId": 203,
              "fileName": "com.dkfqs.tools.jar"
            },
            {
              "projectId": 130,
              "testplanId": 203,
              "fileName": "junit-4.13.2.jar"
            },
            {
              "projectId": 130,
              "testplanId": 203,
              "fileName": "selenium_bundle-4.12.1.jar"
            }
          ],
          "jsonConfigObject": {
            "productVersion": "4.8.20",
            "jUnitConfigExecutionClassArray": [
              {
                "productVersion": "4.8.20",
                "executingClassName": "RealloadTest",
                "testMethodNamesArray": [
                  "realload"
                ]
              }
            ],
            "seleniumWebBrowserType": "Firefox"
          },
          "executingScript": "RealloadTest.jar",
          "executingScriptResourceFileList": "",
          "createTimeStamp": "1694293491984",
          "testDescription": "",
          "definedFromTestplanId": "251",
          "productVersion": "4.8.20",
          "definedFromProjectId": "137",
          "visibleTestName": "RealloadTest",
          "scriptType": "Selenium4byJUnit4",
          "testId": "379"
        }
      },
      {
        "testjobProperties": {
          "testjobResultFileName": "TestResult_SimpleTest_2023-09-18@17-01-08.json",
          "executeMeasuringAgentClusterInfo": "",
          "testjobConcurrentUsers": "1",
          "testjobDescription": "Simple Test",
          "testjobDebugMeasuring": "false",
          "testjobMaxTestDuration": "30",
          "isClusterJob": "false",
          "testjobRampUpTime": "10",
          "localTestjobId": "33533",
          "testjobMaxLoopsPerUser": "1",
          "productVersion": "4.8.18",
          "remoteTestjobId": "24112",
          "testjobAdditionalArguments": "",
          "definedFromTestId": "384",
          "testjobSignature": "JYstx+myVNqbyVMr24u4Pi8IXkLGH0iXUquRh5+NL0veKs4DRJX/w2ZT77wLXF70J9YmTPzR7g==",
          "testjobDelayPerLoop": "1000",
          "testjobExitCode": "0",
          "createTimeStamp": "1695049264730",
          "userInputFieldsFileName": "",
          "testjobType": "load test",
          "enableAutomaticFileSync": "true",
          "testjobState": "completed",
          "isClusterControllerJobProperties": "",
          "testjobDebugExecution": "false",
          "executeOnUserMeasuringAgentId": "65",
          "definedFromTimeZoneId": "Europe/Berlin",
          "executeMeasuringAgentInfo": "agent2.realload.com:8080",
          "executeOnMeasuringAgentClusterId": ""
        },
        "testProperties": {
          "referencedResourceFilesList": [
            {
              "projectId": 130,
              "testplanId": 203,
              "fileName": "com.dkfqs.tools.jar"
            }
          ],
          "jsonConfigObject": {},
          "executingScript": "SimpleTest.jar",
          "executingScriptResourceFileList": "",
          "createTimeStamp": "1694549112155",
          "testDescription": "",
          "definedFromTestplanId": "251",
          "productVersion": "4.8.21",
          "definedFromProjectId": "137",
          "visibleTestName": "SimpleTest",
          "scriptType": "OpenJDK11Jar",
          "testId": "384"
        }
      },
      {
        "testjobProperties": {
          "testjobResultFileName": "TestResult_SimpleTest_2023-09-18@17-51-53.json",
          "executeMeasuringAgentClusterInfo": "",
          "testjobConcurrentUsers": "1",
          "testjobDescription": "Simple Test",
          "testjobDebugMeasuring": "false",
          "testjobMaxTestDuration": "30",
          "isClusterJob": "false",
          "testjobRampUpTime": "10",
          "localTestjobId": "33534",
          "testjobMaxLoopsPerUser": "1",
          "productVersion": "4.8.18",
          "remoteTestjobId": "24129",
          "testjobAdditionalArguments": "",
          "definedFromTestId": "384",
          "testjobSignature": "Z9B963yIj232nht1DIX5aSRt8m77QuXYjP9rn4OBSq/g==",
          "testjobDelayPerLoop": "1000",
          "testjobExitCode": "0",
          "createTimeStamp": "1695050460395",
          "userInputFieldsFileName": "",
          "testjobType": "load test",
          "enableAutomaticFileSync": "true",
          "testjobState": "completed",
          "isClusterControllerJobProperties": "",
          "testjobDebugExecution": "false",
          "executeOnUserMeasuringAgentId": "65",
          "definedFromTimeZoneId": "Europe/Berlin",
          "executeMeasuringAgentInfo": "agent2.realload.com:8080",
          "executeOnMeasuringAgentClusterId": ""
        },
        "testProperties": {
          "referencedResourceFilesList": [
            {
              "projectId": 130,
              "testplanId": 203,
              "fileName": "com.dkfqs.tools.jar"
            }
          ],
          "jsonConfigObject": {},
          "executingScript": "SimpleTest.jar",
          "executingScriptResourceFileList": "",
          "createTimeStamp": "1694549112155",
          "testDescription": "",
          "definedFromTestplanId": "251",
          "productVersion": "4.8.21",
          "definedFromProjectId": "137",
          "visibleTestName": "SimpleTest",
          "scriptType": "OpenJDK11Jar",
          "testId": "384"
        }
      }
    ],
    "httpExecuteTimeMillis": 141
  },
  "isError": false
}

getTestjobOutDirectoryFilesInfo

Specific Request Fields:

  • localTestjobId

Response Fields:

  • filesInfoArray (for measuring agents), or
  • controllerResponse (for cluster controllers)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getTestjobOutDirectoryFilesInfo",
  "localTestjobId":33534
}

JSON Response Example (Success Case):

{
  "isClusterJob": false,
  "measuringAgentData": {
    "agentId": 65,
    "createdBySystem": false,
    "ownerUserId": 13,
    "agentActive": true,
    "agentDescription": "Demo Agent 2",
    "agentHost": "agent2.realload.com",
    "agentPort": 8080,
    "authToken": "************",
    "sharedMeasuringAgentTemplateId": -1,
    "isLaunchedByCloudCredits": false
  },
  "filesInfoArray": [
    {
      "fileName": "DataCollector.err",
      "fileSize": 0,
      "lastModified": 1695051456261,
      "mimeType": "application/octet-stream"
    },
    {
      "fileName": "DataCollector.out",
      "fileSize": 5647,
      "lastModified": 1695052318516,
      "mimeType": "application/octet-stream"
    },
    {
      "fileName": "DataCollector.pid",
      "fileSize": 8,
      "lastModified": 1695051456273,
      "mimeType": "application/octet-stream"
    },
    {
      "fileName": "DataCollector.port",
      "fileSize": 6,
      "lastModified": 1695051457729,
      "mimeType": "application/octet-stream"
    },
    {
      "fileName": "DataCollector.state",
      "fileSize": 2,
      "lastModified": 1695052318512,
      "mimeType": "application/octet-stream"
    },
    {
      "fileName": "TestResult_SimpleTest_2023-09-18@17-51-53.json",
      "fileSize": 7421,
      "lastModified": 1695052315488,
      "mimeType": "application/json"
    },
    {
      "fileName": "user_1_statistics.out",
      "fileSize": 5037,
      "lastModified": 1695052313788,
      "mimeType": "application/octet-stream"
    },
    {
      "fileName": "users.out",
      "fileSize": 1923,
      "lastModified": 1695052314000,
      "mimeType": "application/octet-stream"
    }
  ],
  "isError": false
}

getTestjobOutDirectoryFile

Specific Request Fields:

  • localTestjobId
  • clusterMemberId (optional, -1 = no cluster member file)
  • fileName

Response Fields:

  • filesInfoArray (for measuring agents), or
  • controllerResponse (for cluster controllers)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getTestjobOutDirectoryFile",
  "localTestjobId":33534,
  "fileName":"users.out"
}

JSON Response Example (Success Case):

{
  "isClusterJob": false,
  "measuringAgentData": {
    "agentId": 65,
    "createdBySystem": false,
    "ownerUserId": 13,
    "agentActive": true,
    "agentDescription": "Demo Agent 2",
    "agentHost": "agent2.realload.com",
    "agentPort": 8080,
    "authToken": "************",
    "sharedMeasuringAgentTemplateId": -1,
    "isLaunchedByCloudCredits": false
  },
  "fileContentB64": "MjAyMy0wOS0xOCAxNTo1MTo1Mi42MjYgfCBtYWluIHwgSU5GTyB8IE1heC4gSmF2YSBNZW1vcnkgPSAzMzAwIE1CCjIwMjMtMDktMTggMTU6NTE6NTIuNjU1IHwgbWFpbiB8IElORk8gfCBUaW1lIFpvbmUgPSBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSArMDA6MDAKMjAyMy0wOS0xOCAxNTo1MTo1Mi42NjggfCBtYWluIHwgSU5GTyB8IC0tLSB2dnYgLS0tIHJlc291cmNlIGZpbGVzIC0tLSB2dnYgLS0tCjIwMjMtMDktMTggMTU6NTE6NTIuNjY5IHwgbWFpbiB8IElORk8gfCAtLS0gXl5eIC0tLSByZXNvdXJjZSBmaWxlcyAtLS0gXl5eIC0tLQoyMDIzLTA5LTE4IDE1OjUxOjUyLjY2OSB8IG1haW4gfCBJTkZPIHwgLS0tIHZ2diAtLS0gZ2VuZXJpYyBhcmd1bWVudHMgLS0tIHZ2diAtLS0KMjAyMy0wOS0xOCAxNTo1MTo1Mi42NjkgfCBtYWluIHwgSU5GTyB8IHVzZXJzID0gMQoyMDIzLTA5LTE4IDE1OjUxOjUyLjY2OSB8IG1haW4gfCBJTkZPIHwgZHVyYXRpb24gPSAzMAoyMDIzLTA5LTE4IDE1OjUxOjUyLjY3MCB8IG1haW4gfCBJTkZPIHwgbWF4TG9vcHMgPSAxCjIwMjMtMDktMTggMTU6NTE6NTIuNjcwIHwgbWFpbiB8IElORk8gfCBkZWxheVBlckxvb3AgPSAxMDAwCjIwMjMtMDktMTggMTU6NTE6NTIuNjcwIHwgbWFpbiB8IElORk8gfCByYW1wdXBUaW1lID0gMTAKMjAyMy0wOS0xOCAxNTo1MTo1Mi42NzAgfCBtYWluIHwgSU5GTyB8IGRhdGFPdXRwdXREaXIgPSAvaG9tZS9ka2Zxcy9hZ2VudC91c2Vyc0RhdGEvVXNlcl8xMy9UZXN0Sm9icy9UZXN0am9iXzI0MTI5L291dAoyMDIzLTA5LTE4IDE1OjUxOjUyLjY3MCB8IG1haW4gfCBJTkZPIHwgZGVidWdFeGVjID0gZmFsc2UKMjAyMy0wOS0xOCAxNTo1MTo1Mi42NzEgfCBtYWluIHwgSU5GTyB8IGRlYnVnRGF0YSA9IGZhbHNlCjIwMjMtMDktMTggMTU6NTE6NTIuNjcxIHwgbWFpbiB8IElORk8gfCBkZXNjcmlwdGlvbiA9IFNpbXBsZSBUZXN0CjIwMjMtMDktMTggMTU6NTE6NTIuNjcxIHwgbWFpbiB8IElORk8gfCAtLS0gXl5eIC0tLSBnZW5lcmljIGFyZ3VtZW50cyAtLS0gXl5eIC0tLQoyMDIzLTA5LTE4IDE1OjUxOjUyLjkyMSB8IG1haW4gfCBJTkZPIHwgSlZNIFdhcm11cCBwZXJmb3JtZWQgaW4gMjM2IG1zCjIwMjMtMDktMTggMTU6NTE6NTIuOTc3IHwgbWFpbiB8IElORk8gfCAtLS0gdnZ2IC0tLSBzcGVjaWZpYyBhcmd1bWVudHMgLS0tIHZ2diAtLS0KMjAyMy0wOS0xOCAxNTo1MTo1Mi45OTQgfCBtYWluIHwgSU5GTyB8IHRjcFRpbWVvdXQgPSAxMDAwMAoyMDIzLTA5LTE4IDE1OjUxOjUyLjk5NSB8IG1haW4gfCBJTkZPIHwgc3NsVGltZW91dCA9IDUwMDAKMjAyMy0wOS0xOCAxNTo1MTo1Mi45OTcgfCBtYWluIHwgSU5GTyB8IGh0dHBUaW1lb3V0ID0gMzAwMDAKMjAyMy0wOS0xOCAxNTo1MTo1Mi45OTcgfCBtYWluIHwgSU5GTyB8IC0tLSBeXl4gLS0tIHNwZWNpZmljIGFyZ3VtZW50cyAtLS0gXl5eIC0tLQoyMDIzLTA5LTE4IDE1OjUxOjUzLjAwMiB8IG1haW4gfCBJTkZPIHwgW1N0YXJ0IG9mIFRlc3RdCjIwMjMtMDktMTggMTU6NTE6NTMuMDAzIHwgVXNlci0xIHwgSU5GTyB8IFVzZXIgc3RhcnRlZAoyMDIzLTA5LTE4IDE1OjUxOjUzLjAyNiB8IHBlcmlvZGljLXRocmVhZCB8IElORk8gfCBUaHJlYWQgc3RhcnRlZAoyMDIzLTA5LTE4IDE1OjUxOjUzLjAyNiB8IFVzZXItMSB8IElORk8gfCBTdGFydCBleGVjdXRlIHNlc3Npb24gbm8uIDEgLi4uCjIwMjMtMDktMTggMTU6NTE6NTMuNTk3IHwgVXNlci0xIHwgSU5GTyB8IC4uLiBFbmQgZXhlY3V0ZSBzZXNzaW9uIG5vLiAxIHN1Y2Nlc3NmdWwgcGFzc2VkCjIwMjMtMDktMTggMTU6NTE6NTMuNjQ5IHwgVXNlci0xIHwgSU5GTyB8IFVzZXIgbm9ybWFsIHRlcm1pbmF0ZWQKMjAyMy0wOS0xOCAxNTo1MTo1NC4wMDMgfCBtYWluIHwgSU5GTyB8IFtFbmQgb2YgVGVzdF0K",
  "isError": false
}

saveTestjobOutDirectoryFileToProjectTree

Specific Request Fields:

  • localTestjobId
  • clusterMemberId (optional, -1 = no cluster member file)
  • fileName
  • saveAsFileName
  • projectId
  • resourceSetId

Response Fields:

  • fileHashCode

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"saveTestjobOutDirectoryFileToProjectTree",
  "localTestjobId":33534,
  "fileName":"users.out",
  "saveAsFileName":"users.out",
  "projectId":137,
  "resourceSetId":251
}

JSON Response Example (Success Case):

{
  "isClusterJob": false,
  "fileHashCode": 4557110,
  "isError": false
}

deleteTestjob

Specific Request Fields:

  • localTestjobId
  • deleteAlsoRemoteTestjob (boolean)

Response Fields:

  • localTestjobState (before the testjob was delete)
  • agentResponse (for measuring agents), or
  • controllerResponse (for cluster controllers)

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"deleteTestjob",
  "localTestjobId":33534,
  "deleteAlsoRemoteTestjob":true
}

JSON Response Example (Success Case):

{
  "isClusterJob": false,
  "localTestjobState": "completed",
  "agentResponse": {
    "httpExecuteTimeMillis": 143
  },
  "isError": false
}

getTestExecutionSuites

Specific Request Fields:

  • [none]

Response Fields:

  • testExecutionSuitesArray
    • testExecutionSuite
    • testRunResultsArray

Specific Error Flags:

  • [none]

Values of testRunResultsArray[n].executionState :

  • EXECUTION_STATE_INITIALIZED = 0;
  • EXECUTION_STATE_RUNNING = 1;
  • EXECUTION_STATE_RUN_COMPLETED = 2;
  • EXECUTION_STATE_RUN_FAILED = 3;
  • EXECUTION_STATE_RUN_ABORTED = 4;

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getTestExecutionSuites"
}

JSON Response Example (Success Case):

{
  "testExecutionSuitesArray": [
    {
      "testExecutionSuite": {
        "testExecutionSuiteId": 2,
        "testExecutionSuiteName": "First Suite",
        "testExecutionSuiteDescription": "",
        "topExecuteOnMeasuringAgentOrClusterId": "m-145",
        "topExecutionOrder": 2,
        "totalNumberOfTestjobs": 3,
        "isTestExecutionSuiteHealthy": true
      },
      "testRunResultsArray": [
        {
          "userId": 13,
          "subUserId": -1,
          "testRunId": 1,
          "executionState": 2,
          "annotationArray": [],
          "testRunStartTimestamp": 1699716014207,
          "testRunLastUpdatedTimestamp": 1699716054368,
          "numTestjobTemplatesToExecute": 3,
          "numTestjobTemplatesExecutionPassed": 3,
          "numTestjobTemplatesExecutionFailed": 0,
          "totalSessionsPassed": 8,
          "totalSessionsFailed": 0,
          "totalSessionsPassedTimeSum": 5295,
          "totalSamplesPassed": 12,
          "totalSamplesFailed": 0,
          "maxConcurrentUsers": 1,
          "maxPendingSamples": 1
        },
        {
          "userId": 13,
          "subUserId": -1,
          "testRunId": 2,
          "executionState": 2,
          "annotationArray": [],
          "testRunStartTimestamp": 1699716108571,
          "testRunLastUpdatedTimestamp": 1699716151826,
          "numTestjobTemplatesToExecute": 3,
          "numTestjobTemplatesExecutionPassed": 3,
          "numTestjobTemplatesExecutionFailed": 0,
          "totalSessionsPassed": 8,
          "totalSessionsFailed": 0,
          "totalSessionsPassedTimeSum": 5503,
          "totalSamplesPassed": 12,
          "totalSamplesFailed": 0,
          "maxConcurrentUsers": 1,
          "maxPendingSamples": 1
        }
      ]
    },
    {
      "testExecutionSuite": {
        "testExecutionSuiteId": 3,
        "testExecutionSuiteName": "Second Suite Long Run",
        "testExecutionSuiteDescription": "",
        "topExecuteOnMeasuringAgentOrClusterId": "c-27",
        "topExecutionOrder": 1,
        "totalNumberOfTestjobs": 2,
        "isTestExecutionSuiteHealthy": true
      },
      "testRunResultsArray": [
        {
          "userId": 13,
          "subUserId": -1,
          "testRunId": 1,
          "executionState": 2,
          "annotationArray": [],
          "testRunStartTimestamp": 1699715808192,
          "testRunLastUpdatedTimestamp": 1699715867468,
          "numTestjobTemplatesToExecute": 2,
          "numTestjobTemplatesExecutionPassed": 2,
          "numTestjobTemplatesExecutionFailed": 0,
          "totalSessionsPassed": 44,
          "totalSessionsFailed": 0,
          "totalSessionsPassedTimeSum": 4400,
          "totalSamplesPassed": 44,
          "totalSamplesFailed": 0,
          "maxConcurrentUsers": 4,
          "maxPendingSamples": 4
        },
        {
          "userId": 13,
          "subUserId": -1,
          "testRunId": 2,
          "executionState": 2,
          "annotationArray": [],
          "testRunStartTimestamp": 1699715952212,
          "testRunLastUpdatedTimestamp": 1699716012124,
          "numTestjobTemplatesToExecute": 2,
          "numTestjobTemplatesExecutionPassed": 2,
          "numTestjobTemplatesExecutionFailed": 0,
          "totalSessionsPassed": 44,
          "totalSessionsFailed": 0,
          "totalSessionsPassedTimeSum": 4400,
          "totalSamplesPassed": 44,
          "totalSamplesFailed": 0,
          "maxConcurrentUsers": 4,
          "maxPendingSamples": 3
        },
        {
          "userId": 13,
          "subUserId": -1,
          "testRunId": 3,
          "executionState": 2,
          "annotationArray": [],
          "testRunStartTimestamp": 1699717843777,
          "testRunLastUpdatedTimestamp": 1699717905674,
          "numTestjobTemplatesToExecute": 2,
          "numTestjobTemplatesExecutionPassed": 2,
          "numTestjobTemplatesExecutionFailed": 0,
          "totalSessionsPassed": 43,
          "totalSessionsFailed": 0,
          "totalSessionsPassedTimeSum": 4300,
          "totalSamplesPassed": 43,
          "totalSamplesFailed": 0,
          "maxConcurrentUsers": 4,
          "maxPendingSamples": 3
        }
      ]
    }
  ],
  "isError": false
}

getCurrentlyRunningTestExecutionSuiteIds

Specific Request Fields:

  • [none]

Response Fields:

  • testExecutionSuiteIdArray

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getCurrentlyRunningTestExecutionSuiteIds"
}

JSON Response Example (Success Case):

{
  "testExecutionSuiteIdArray": [
    3
  ],
  "isError": false
}

startTestExecutionSuiteTestRun

Specific Request Fields:

  • testExecutionSuiteId
  • testRunAnnotation (optional, can also be an empty string)
  • topExecuteOnMeasuringAgentOrClusterId (the ’top execution’ measuring agent id or cluster id)
  • topExecuteOnCluster (boolean, if true: top execution = cluster id, or false: top execution = measuring agent id)

Response Fields:

  • newTestRunId

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"startTestExecutionSuiteTestRun",
  "testExecutionSuiteId":3,
  "testRunAnnotation":"",
  "topExecuteOnMeasuringAgentOrClusterId":143,
  "topExecuteOnCluster":false
}

JSON Response Example (Success Case):

{
  "newTestRunId": 5,
  "isError": false
}

JSON Response Example (Error Case):

{
  "isError": true,
  "genericErrorText": "Test execution suite currently running"
}

getTestExecutionSuiteTestRunResultDetail

Specific Request Fields:

  • testExecutionSuiteId
  • testRunId

Response Fields:

  • testRunResultDetail
    • testRunResult
    • executedByUserNickname
    • testjobsOutFilesArray

Specific Error Flags:

  • [none]

Values of executionState :

  • EXECUTION_STATE_INITIALIZED = 0;
  • EXECUTION_STATE_RUNNING = 1;
  • EXECUTION_STATE_RUN_COMPLETED = 2;
  • EXECUTION_STATE_RUN_FAILED = 3;
  • EXECUTION_STATE_RUN_ABORTED = 4;

Values of logLevel :

  • LOG_DEBUG = 4;
  • LOG_INFO = 7;
  • LOG_WARN = 8;
  • LOG_ERROR = 9;
  • LOG_FATAL = 10;

Values of elementType :

  • ELEMENT_TYPE_TESTJOB_TEMPLATE = 1;
  • ELEMENT_TYPE_EXECUTION_GROUP = 10;

Values of executionOrder :

  • EXECUTION_ORDER_SEQUENTIAL = 1;
  • EXECUTION_ORDER_PARALLEL = 2;

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getTestExecutionSuiteTestRunResultDetail",
  "testExecutionSuiteId":3,
  "testRunId":5
}

JSON Response Example (Success Case):

{
  "testRunResultDetail": {
    "testRunResult": {
      "userId": 13,
      "subUserId": -1,
      "testExecutionSuite": {
        "testExecutionSuiteId": 3,
        "testExecutionSuiteName": "Second Suite Long Run",
        "testExecutionSuiteDescription": "",
        "topExecuteOnMeasuringAgentOrClusterId": "c-27",
        "topExecutionOrder": 1,
        "testExecutionElementsArray": [
          {
            "productVersion": "4.8.24",
            "elementType": 10,
            "elementId": 737867696,
            "elementInactive": false,
            "executionGroupName": "Top Group",
            "executionGroupDescription": "",
            "executionOrder": 2,
            "executeOnMeasuringAgentOrClusterId": "",
            "executionElementsArray": [
              {
                "productVersion": "4.8.24",
                "elementType": 1,
                "elementId": 1040705161,
                "elementInactive": false,
                "templateId": 18
              },
              {
                "productVersion": "4.8.24",
                "elementType": 1,
                "elementId": 493179849,
                "elementInactive": false,
                "templateId": 18
              }
            ]
          }
        ]
      },
      "testjobTemplatesArray": [
        {
          "templateId": 18,
          "templateName": "Simple Test 2VU Long Run",
          "templateDescription": "",
          "testjobProperties": {
            "testjobResultFileName": "",
            "executeMeasuringAgentClusterInfo": "",
            "testjobConcurrentUsers": "2",
            "testjobDescription": "Simple Test 2VU Long Run",
            "testjobDebugMeasuring": "false",
            "testjobMaxTestDuration": "30",
            "isClusterJob": "",
            "testjobRampUpTime": "1",
            "localTestjobId": "",
            "testjobMaxLoopsPerUser": "-1",
            "productVersion": "4.8.24",
            "remoteTestjobId": "",
            "testjobAdditionalArguments": "",
            "definedFromTestId": "384",
            "testjobSignature": "",
            "testjobDelayPerLoop": "3000",
            "testjobExitCode": "",
            "createTimeStamp": "1697224057753",
            "userInputFieldsFileName": "",
            "testjobType": "load test",
            "enableAutomaticFileSync": "true",
            "testjobState": "invalid",
            "isClusterControllerJobProperties": "",
            "testjobDebugExecution": "false",
            "executeOnUserMeasuringAgentId": "",
            "definedFromTimeZoneId": "Europe/Berlin",
            "executeMeasuringAgentInfo": "",
            "executeOnMeasuringAgentClusterId": ""
          },
          "hasUserInputFields": false
        }
      ],
      "testRunId": 5,
      "executorLog": {
        "userId": 13,
        "testExecutionSuiteId": 3,
        "testRunId": 5,
        "logEntriesArray": [
          {
            "timestamp": 1699726961703,
            "logLevel": 7,
            "threadName": "TestSuiteExecutor-S:3-R:5",
            "testExecutionElementId": -1,
            "logMessage": "Test run #5 started",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699726963704,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-G:737867696",
            "testExecutionElementId": 737867696,
            "logMessage": "Execution Group 'Top Group' started",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699726963706,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:1040705161",
            "testExecutionElementId": 1040705161,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' execution started",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699726963708,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:493179849",
            "testExecutionElementId": 493179849,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' execution started",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699726963731,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:1040705161",
            "testExecutionElementId": 1040705161,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' test job defined with id = 34442",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699726963753,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:493179849",
            "testExecutionElementId": 493179849,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' test job defined with id = 34443",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699726964081,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:1040705161",
            "testExecutionElementId": 1040705161,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' test job submitted to 'Shared Agent 2', remote test job id = 791",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699726964128,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:493179849",
            "testExecutionElementId": 493179849,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' test job submitted to 'Shared Agent 2', remote test job id = 792",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699726968458,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:493179849",
            "testExecutionElementId": 493179849,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' started on 'Shared Agent 2', remote test job id = 792",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699726968466,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:1040705161",
            "testExecutionElementId": 1040705161,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' started on 'Shared Agent 2', remote test job id = 791",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699727005910,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:493179849",
            "testExecutionElementId": 493179849,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' execution successful",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699727006912,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:1040705161",
            "testExecutionElementId": 1040705161,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' execution successful",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699727012111,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:1040705161",
            "testExecutionElementId": 1040705161,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' execution terminated",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699727012112,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-T:493179849",
            "testExecutionElementId": 493179849,
            "logMessage": "Test Job Template 'Simple Test 2VU Long Run' execution terminated",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699727012113,
            "logLevel": 7,
            "threadName": "TestSuiteExecutorGroup-S:3-R:5-G:737867696",
            "testExecutionElementId": 737867696,
            "logMessage": "Execution Group 'Top Group' terminated",
            "stacktraceArray": []
          },
          {
            "timestamp": 1699727014114,
            "logLevel": 7,
            "threadName": "TestSuiteExecutor-S:3-R:5",
            "testExecutionElementId": -1,
            "logMessage": "Test run #5 done. Execution state = completed",
            "stacktraceArray": []
          }
        ]
      },
      "executionState": 2,
      "annotationArray": [],
      "testRunStartTimestamp": 1699726961701,
      "testRunLastUpdatedTimestamp": 1699727012113,
      "numTestjobTemplatesToExecute": 2,
      "numTestjobTemplatesExecutionPassed": 2,
      "numTestjobTemplatesExecutionFailed": 0,
      "totalSessionsPassed": 44,
      "totalSessionsFailed": 0,
      "totalSessionsPassedTimeSum": 4400,
      "totalSamplesPassed": 44,
      "totalSamplesFailed": 0,
      "maxConcurrentUsers": 4,
      "maxPendingSamples": 2,
      "testRunExecutionGroupResultArray": [
        {
          "testExecutionSuiteId": 3,
          "testRunId": 5,
          "executionGroupElementId": 737867696,
          "containsMeasuringAgent": true,
          "measuringAgent": {
            "agentId": 143,
            "createdBySystem": true,
            "ownerUserId": 13,
            "agentActive": true,
            "agentDescription": "Shared Agent 2",
            "agentHost": "192.168.0.50",
            "agentPort": 8081,
            "sharedMeasuringAgentTemplateId": 5,
            "isLaunchedByCloudCredits": false
          },
          "containsMeasuringAgentCluster": false,
          "executionState": 2,
          "executionStartTimestamp": 1699726963704,
          "executionEndTimestamp": 1699727012113,
          "numTestjobTemplatesExecutionPassed": 2,
          "numTestjobTemplatesExecutionFailed": 0,
          "totalSessionsPassed": 44,
          "totalSessionsFailed": 0,
          "totalSessionsPassedTimeSum": 4400,
          "totalSamplesPassed": 44,
          "totalSamplesFailed": 0
        }
      ],
      "testRunTestjobResultArray": [
        {
          "testExecutionSuiteId": 3,
          "testRunId": 5,
          "testExecutionGroupElementId": 737867696,
          "testjobTemplateElementId": 493179849,
          "testjobTemplate": {
            "templateId": 18,
            "templateName": "Simple Test 2VU Long Run",
            "templateDescription": "",
            "testjobProperties": {
              "testjobResultFileName": "TestResult_SimpleTest_2023-11-11@19-22-49.json",
              "executeMeasuringAgentClusterInfo": "",
              "testjobConcurrentUsers": "2",
              "testjobDescription": "Simple Test 2VU Long Run",
              "testjobDebugMeasuring": "false",
              "testjobMaxTestDuration": "30",
              "isClusterJob": "false",
              "testjobRampUpTime": "1",
              "localTestjobId": "34443",
              "testjobMaxLoopsPerUser": "-1",
              "productVersion": "4.8.24",
              "remoteTestjobId": "792",
              "testjobAdditionalArguments": "",
              "definedFromTestId": "384",
              "testjobSignature": "",
              "testjobDelayPerLoop": "3000",
              "testjobExitCode": "",
              "createTimeStamp": "1697224057753",
              "userInputFieldsFileName": "",
              "testjobType": "load test",
              "enableAutomaticFileSync": "true",
              "testjobState": "invalid",
              "isClusterControllerJobProperties": "",
              "testjobDebugExecution": "false",
              "executeOnUserMeasuringAgentId": "143",
              "definedFromTimeZoneId": "Europe/Berlin",
              "executeMeasuringAgentInfo": "Shared Agent 2",
              "executeOnMeasuringAgentClusterId": ""
            },
            "hasUserInputFields": false
          },
          "executionState": 2,
          "executionStartTimestamp": 1699726963708,
          "executionEndTimestamp": 1699727005710,
          "jobStartTimestamp": 1699726969618,
          "jobEndTimestamp": 1699727003517,
          "totalSessionsPassed": 22,
          "totalSessionsFailed": 0,
          "totalSessionsPassedTimeSum": 2200,
          "totalSamplesPassed": 22,
          "totalSamplesFailed": 0,
          "maxConcurrentUsers": 2,
          "maxPendingSamples": 1
        },
        {
          "testExecutionSuiteId": 3,
          "testRunId": 5,
          "testExecutionGroupElementId": 737867696,
          "testjobTemplateElementId": 1040705161,
          "testjobTemplate": {
            "templateId": 18,
            "templateName": "Simple Test 2VU Long Run",
            "templateDescription": "",
            "testjobProperties": {
              "testjobResultFileName": "TestResult_SimpleTest_2023-11-11@19-22-49.json",
              "executeMeasuringAgentClusterInfo": "",
              "testjobConcurrentUsers": "2",
              "testjobDescription": "Simple Test 2VU Long Run",
              "testjobDebugMeasuring": "false",
              "testjobMaxTestDuration": "30",
              "isClusterJob": "false",
              "testjobRampUpTime": "1",
              "localTestjobId": "34442",
              "testjobMaxLoopsPerUser": "-1",
              "productVersion": "4.8.24",
              "remoteTestjobId": "791",
              "testjobAdditionalArguments": "",
              "definedFromTestId": "384",
              "testjobSignature": "",
              "testjobDelayPerLoop": "3000",
              "testjobExitCode": "",
              "createTimeStamp": "1697224057753",
              "userInputFieldsFileName": "",
              "testjobType": "load test",
              "enableAutomaticFileSync": "true",
              "testjobState": "invalid",
              "isClusterControllerJobProperties": "",
              "testjobDebugExecution": "false",
              "executeOnUserMeasuringAgentId": "143",
              "definedFromTimeZoneId": "Europe/Berlin",
              "executeMeasuringAgentInfo": "Shared Agent 2",
              "executeOnMeasuringAgentClusterId": ""
            },
            "hasUserInputFields": false
          },
          "executionState": 2,
          "executionStartTimestamp": 1699726963706,
          "executionEndTimestamp": 1699727006711,
          "jobStartTimestamp": 1699726969515,
          "jobEndTimestamp": 1699727003517,
          "totalSessionsPassed": 22,
          "totalSessionsFailed": 0,
          "totalSessionsPassedTimeSum": 2200,
          "totalSamplesPassed": 22,
          "totalSamplesFailed": 0,
          "maxConcurrentUsers": 2,
          "maxPendingSamples": 1
        }
      ]
    },
    "executedByUserNickname": "DKF",
    "testjobsOutFilesArray": [
      {
        "elementId": 1040705161,
        "outFileInfoArray": [
          {
            "fileName": "DataCollector.err",
            "fileSize": 0,
            "lastModified": 1699727006724,
            "mimeType": "application/octet-stream"
          },
          {
            "fileName": "DataCollector.out",
            "fileSize": 6537,
            "lastModified": 1699727006726,
            "mimeType": "application/octet-stream"
          },
          {
            "fileName": "DataCollector.pid",
            "fileSize": 7,
            "lastModified": 1699727006736,
            "mimeType": "application/octet-stream"
          },
          {
            "fileName": "DataCollector.port",
            "fileSize": 6,
            "lastModified": 1699727006737,
            "mimeType": "application/octet-stream"
          },
          {
            "fileName": "DataCollector.state",
            "fileSize": 1,
            "lastModified": 1699727006738,
            "mimeType": "application/octet-stream"
          },
          {
            "fileName": "TestResult_SimpleTest_2023-11-11@19-22-49.json",
            "fileSize": 11913,
            "lastModified": 1699727006739,
            "mimeType": "application/json"
          },
          {
            "fileName": "users.out",
            "fileSize": 5507,
            "lastModified": 1699727006741,
            "mimeType": "application/octet-stream"
          }
        ]
      },
      {
        "elementId": 493179849,
        "outFileInfoArray": [
          {
            "fileName": "DataCollector.err",
            "fileSize": 0,
            "lastModified": 1699727005722,
            "mimeType": "application/octet-stream"
          },
          {
            "fileName": "DataCollector.out",
            "fileSize": 6264,
            "lastModified": 1699727005725,
            "mimeType": "application/octet-stream"
          },
          {
            "fileName": "DataCollector.pid",
            "fileSize": 7,
            "lastModified": 1699727005733,
            "mimeType": "application/octet-stream"
          },
          {
            "fileName": "DataCollector.port",
            "fileSize": 6,
            "lastModified": 1699727005734,
            "mimeType": "application/octet-stream"
          },
          {
            "fileName": "DataCollector.state",
            "fileSize": 1,
            "lastModified": 1699727005735,
            "mimeType": "application/octet-stream"
          },
          {
            "fileName": "TestResult_SimpleTest_2023-11-11@19-22-49.json",
            "fileSize": 11850,
            "lastModified": 1699727005736,
            "mimeType": "application/json"
          },
          {
            "fileName": "users.out",
            "fileSize": 5507,
            "lastModified": 1699727005738,
            "mimeType": "application/octet-stream"
          }
        ]
      }
    ]
  },
  "isError": false
}

getTestExecutionSuiteTestRunTestJobOutputFileContent

Specific Request Fields:

  • testExecutionSuiteId
  • testRunId
  • testjobTemplateElementId (don’t confuse with testjobTemplateId)
  • fileName

Response Fields:

  • fileContentB64

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"getTestExecutionSuiteTestRunTestJobOutputFileContent",
  "testExecutionSuiteId":3,
  "testRunId":5,
  "testjobTemplateElementId":1040705161,
  "fileName":"users.out"
}

JSON Response Example (Success Case):

{
  "fileContentB64": "MjAyMy0xMS0xMSAxO ... uZCBvZiBUZXN0XQo=",
  "isError": false
}

deleteTestExecutionSuiteTestRun

Specific Request Fields:

  • testExecutionSuiteId
  • testRunId

Response Fields:

  • [none]

Specific Error Flags:

  • [none]

JSON Request Example:

{
  "authTokenValue":"jPmFClqeDUXaEk8Q274q",
  "action":"deleteTestExecutionSuiteTestRun",
  "testExecutionSuiteId":3,
  "testRunId":5
}

JSON Response Example (Success Case):

{
  "isError": false
}

3 - Remote User Monitoring API

Portal Server Remote User Monitoring API Specification

Abstract

The “Remote User Monitoring API” is a WebSocket API that supports developers to implement their own version of a Synthetic Monitoring “Real Time Dashboard”.

Similar to the Remote User API there is also an “API Authentication Token” required to access the API.

“alt attribute”

API Functions

The API supports the following functions (so-called “actions”):

  • pingPortalServer : Ping the Portal Server at API level.
  • subscribeToHeartbeat : Subscribe to a periodic timestamp which is received every second.
  • unsubscribeFromHeartbeat : Cancel subscription to ‘subscribeToHeartbeat’.
  • subscribeToPeriodicAliveThread: Same functionality as ‘subscribeToHeartbeat’, but the time interval (in seconds) can be specified arbitrarily.
  • unsubscribeFromPeriodicAliveThread: Cancel subscription to ‘subscribeToPeriodicAliveThread’.
  • subscribeToRealtimeMonitor : Subscribe to events when a Monitoring Group or a Monitoring Job is created, modified or deleted, and subscribe to be notified each time when a Monitoring Group or a Monitoring Job is executed.
  • unsubscribeFromRealtimeMonitor : Cancel subscription to ‘subscribeToRealtimeMonitor’.
  • subscribeToMonitoringAlerts : Subscribe to monitoring alerts.
  • unsubscribeFromMonitoringAlerts : Cancel subscription to ‘subscribeToMonitoringAlerts’.
  • subscribeToGroupExecutionHistoryCache : Subscribe to a monitoring group’s execution history cache, which contains the measured data over the last 24 hours. The received data can be used to draw a chart or sparkline of the corresponding monitoring group.
  • unsubscribeFromAllGroupExecutionHistoryCaches : Cancel subscription to ‘subscribeToGroupExecutionHistoryCache’ for all monitoring groups.
  • subscribeToJobExecutionHistoryCache : Subscribe to a monitoring job’s execution history cache, which contains the measured data over the last 24 hours. The received data can be used to draw a chart or sparkline of the corresponding monitoring job.
  • unsubscribeFromAllJobExecutionHistoryCaches : Cancel subscription to ‘subscribeToJobExecutionHistoryCache’ for all monitoring jobs.
WebSocket URL
wss://portal.realload.com/RemoteUserMonitoringAPI
HTTP Request Header Fields
x-api-key: <API Authentication Token> required
subscribeToHeartbeat: true optional
subscribeToRealtimeMonitor: true optional

The subscribed data are received in JSON format. The received JSON values are never null.

Runtime Behavior

  • When the WebSocket connection is closed, all subscriptions are terminated.
  • When you send an “action”, the action is confirmed with a response frame with the name of the action repeated (except for “pingPortalServer”).
  • If you send an invalid “action”, the WebSocket connection will be closed.
  • The WebSocket connection doesn’t last forever. It will be closed after a few hours by the Portal Server. You then have to reestablish the WebSocket connection and renew the subscriptions.

Example:

Send: {"action":"subscribeToHeartbeat"}
Received: {"action":"subscribeToHeartbeat","isError":false}
Received: {"action":"heartbeat","timestamp":1708466543962,"isError":false}
Received: {"action":"heartbeat","timestamp":1708466544963,"isError":false}
Received: {"action":"heartbeat","timestamp":1708466545963,"isError":false}

Implementation Recommendations

  • We recommend that you implement two hash maps on the client side which contain the current configuration data of the monitoring jobs and monitoring groups - based on the actions of onMonitoringGroupEvent and onMonitoringJobEvent received from subscribeToRealtimeMonitor (hash map keys = Monitoring Group ID, Monitoring Job ID).
  • Preferably use a WebSocket client framework that can detect the closure of the WebSocket connection to the server. If this is not possible, use “subscribeToPeriodicAliveThread” or “pingPortalServer”.

pingPortalServer

Example:

Send: {"action":"pingPortalServer"}
Received: {"action":"pongFromPortalServer","portalServerVersion":"4.8.35","portalServerTimestamp":1708468300516,"isError":false}

subscribeToHeartbeat

  • Send action : “subscribeToHeartbeat”
{
  "action":"subscribeToHeartbeat"
}
  • Received action: “heartbeat”
{
  "action":"heartbeat",
  "timestamp":1677521478771,
  "isError":false
}

subscribeToPeriodicAliveThread

  • Send action : “subscribeToPeriodicAliveThread”
{
  "action":"subscribeToPeriodicAliveThread",
  "periodicIntervalSeconds":60
}
  • Received action: “periodicAlive”
{
  "action":"periodicAlive",
  "timestamp":1708469366167,
  "isError":false
}

subscribeToRealtimeMonitor

  • Send action : “subscribeToRealtimeMonitor”
{
  "action":"subscribeToRealtimeMonitor"
}
  • Received actions:
    • onMonitoringGroupEvent(The configuration data of a monitoring group)
    • onMonitoringJobEvent(The configuration data of a monitoring job)
    • onMonitoringGroupExecuted(The execution result of a monitoring group)
    • onMonitoringJobExecuted(The execution result of a monitoring job)
    • onMonitoringGroupTemporarilyEvent(Notification whether a monitoring group is temporarily disabled)
    • onMonitoringJobTemporarilyEvent(Notification whether a monitoring job is temporarily disabled)

As first you will receive instantly the configuration data of all already defined Monitoring Groups and Monitoring Jobs, and also the data of the last Execution Result of the Monitoring Groups and Monitoring Jobs (if they have been executed in the past).

After that you will receive update information of all Monitoring Groups and Monitoring Jobs when they are new-defined/modified/deleted, and you will receive also update information about the result of executed Monitoring Groups and Monitoring Jobs.

Because monitoring groups and jobs can be temporarily disabled by configuring one or multiple “Monitoring Downtime(s)” you receive the actions “onMonitoringGroupTemporarilyEvent” and “onMonitoringJobTemporarilyEvent”. “alt attribute”

Notifications for Monitoring Groups

  • Received action: “onMonitoringGroupEvent”
  • monitoringGroupAction:
    • “groupExists”
    • “groupAdded”
    • “groupModified”
    • “groupDeleted”
{
  "action": "onMonitoringGroupEvent",
  "monitoringGroupId": 34,
  "monitoringEvent": {
    "eventTimestamp": 1708541771774,
    "monitoringGroup": {
      "monitoringGroupId": 34,
      "ownerUserId": 13,
      "title": "First Group",
      "description": "",
      "maxDataStorageDays": 14,
      "agentType": "agent",
      "executionEnabled": true,
      "executionInterval": 300,
      "executionTimeout": 300,
      "currentExecutionState": "executing",
      "lastExecutionStartTime": 1708541763897
    },
    "monitoringGroupAction": "groupExists"
  },
  "isError": false
}

The executionInterval and the executionTimeout are in seconds. The lastExecutionStartTime has a value of -1 (minus one) if the Monitoring Group was never executed. The agentType has currently no meaning.

Any modification of a Monitoring Group made by the Portal Server Web Interface such as modify executionEnabled or title effects that a new frame with monitoringGroupAction = “groupModified” is received.

Notification for Monitoring Jobs

  • Received action: “onMonitoringJobEvent”
  • monitoringJobAction:
    • “jobExists”
    • “jobAdded”
    • “jobModified”
    • “jobDeleted”
{
  "action": "onMonitoringJobEvent",
  "monitoringGroupId": 36,
  "monitoringJobId": 79,
  "monitoringEvent": {
    "eventTimestamp": 1708541771790,
    "monitoringJobProperties": {
      "performanceErrorAlertThresholdMillis": "-1",
      "enableJobExecution": "true",
      "performanceWarningAlertsEnabled": "false",
      "testjobConcurrentUsers": "1",
      "testjobDelayPerLoop": "1000",
      "testjobDebugMeasuring": "false",
      "performanceErrorAlertsEnabled": "false",
      "enableAutomaticFileSync": "false",
      "performanceWarningAlertThresholdMillis": "-1",
      "testjobMaxTestDuration": "60",
      "testjobDebugExecution": "false",
      "testjobRampUpTime": "5",
      "definedFromMonitoringGroupId": "36",
      "testjobMaxLoopsPerUser": "1",
      "productVersion": "4.8.35",
      "monitoringJobId": "79",
      "monitoringJobTitle": "Local_Cinema",
      "lastExecutionStartTime": "1708541731138",
      "testjobAdditionalArguments": "",
      "definedFromTestId": "399",
      "testjobUserInputFieldsValuesJsonArray": "[]",
      "monitoringJobDescription": ""
    },
    "monitoringTestProperties": {
      "referencedResourceFilesList": [
        {
          "projectId": 130,
          "testplanId": 203,
          "fileName": "com.dkfqs.tools.jar"
        }
      ],
      "jsonConfigObject": {},
      "executingScript": "Local_Cinema.jar",
      "executingScriptResourceFileList": "",
      "createTimeStamp": "1708293851731",
      "testDescription": "",
      "definedFromTestplanId": "287",
      "productVersion": "4.8.34",
      "definedFromProjectId": "137",
      "visibleTestName": "Local_Cinema",
      "scriptType": "OpenJDK11Jar",
      "testId": "399"
    },
    "monitoringTestIsHealthy": true,
    "monitoringJobAction": "jobExists"
  },
  "isError": false
}

The testjobMaxTestDuration and the testjobRampUpTime are in seconds. The testjobDelayPerLoop are in milliseconds. The lastExecutionStartTime has a value of -1 (minus one) if the Monitoring Job was never executed.

Any modification of a Monitoring Job made by the Portal Server Web Interface such as modify enableJobExecution or monitoringJobTitle effects that a new frame with monitoringJobAction = “jobModified” is received.

Notification for Monitoring Group Execution

  • Received action: “onMonitoringGroupExecuted”
  • oldEvent: true or false | Note: the oldEvent is true at the first time (if the monitoring group was executed in the past) and then will always be false each time when the monitoring group is executed.
{
  "action": "onMonitoringGroupExecuted",
  "monitoringGroupId": 34,
  "monitoringEvent": {
    "eventTimestamp": 1708541771806,
    "oldEvent": true,
    "groupExecutionResult": {
      "magicPattern": "MonitoringGroupExecutionResult",
      "productVersion": "4.8.35",
      "userId": 13,
      "monitoringGroupId": 34,
      "groupExecutionId": 39412,
      "resultTimestamp": 1708541492973,
      "monitoringJobIdToLocalTestjobIdArray": [
        {
          "monitoringJobId": 60,
          "localTestjobId": 73932
        },
        {
          "monitoringJobId": 61,
          "localTestjobId": 73934
        },
        {
          "monitoringJobId": 62,
          "localTestjobId": 73933
        }
      ],
      "groupSystemStatus": 0,
      "groupCombinedTestjobState": "completed",
      "groupExecutionLogArray": [
        "2024-02-21 19:51:03.915 |  | INFO | Monitoring Group Execution Thread started",
        "2024-02-21 19:51:32.972 |  | INFO | Monitoring Job Id 60 executed",
        "2024-02-21 19:51:32.972 |  | INFO | Monitoring Job Id 62 executed",
        "2024-02-21 19:51:32.972 |  | INFO | Monitoring Job Id 61 executed",
        "2024-02-21 19:51:32.973 |  | INFO | Monitoring Group Execution Thread terminated"
      ],
      "numberOfPassedSamples": 10,
      "numberOfFailedSamples": 0,
      "numberOfPassedLoops": 6,
      "numberOfFailedLoops": 0,
      "sumErrorsSeverityWarning": 0,
      "sumErrorsSeverityError": 0,
      "sumErrorsSeverityFatal": 0
    }
  },
  "hasGroupExecutionStatistic": true,
  "groupExecutionStatistic": {
    "userId": 13,
    "monitoringGroupId": 34,
    "fromTimestamp": 1708455371812,
    "toTimestamp": 1708541771812,
    "systemAvailabilityPercent": 100,
    "measuredAvailabilityPercent": 100,
    "measuredFaultyTimeSumSeconds": 0
  },
  "isError": false
}

groupSystemStatus:

  • 0: Healthy = All monitoring jobs of the monitoring group have been started on all measuring agents.
  • -1 (minus one): Partial Malfunction = Some monitoring jobs of the monitoring group have not been started on some measuring agents.
  • -2 (minus two): Malfunction = No monitoring jobs of the monitoring group have been started on any measuring agent.

groupCombinedTestjobState

  • “completed”: All test jobs of the monitoring group have been successfully executed on all measuring agents.
  • “partial failed”: The execution of some of the test jobs of the monitoring group did fail on some measuring agents.
  • “failed”: The execution of all of the test jobs of the monitoring group did fail on all measuring agents.

Hint for groupCombinedTestjobState : Note that is value does not reflect if any warnings or errors have been measured by the test jobs.

The Reference Implementation on the Real Load Portal Server shows the measured (sumErrorsSeverityError + sumErrorsSeverityFatal) simple as “number of measured errors”.

Notification for Monitoring Job Execution

  • Received action: “onMonitoringJobExecuted”
  • oldEvent: true or false | Note: the oldEvent is true at the first time (if the monitoring job was executed in the past) and then will always be false each time when the monitoring job is executed.
{
  "action": "onMonitoringJobExecuted",
  "monitoringGroupId": 36,
  "monitoringJobId": 79,
  "monitoringEvent": {
    "eventTimestamp": 1708541771849,
    "oldEvent": true,
    "jobExecutionResult": {
      "magicPattern": "MonitoringJobExecutionResult",
      "productVersion": "4.8.35",
      "userId": 13,
      "monitoringGroupId": 36,
      "groupExecutionId": 39417,
      "monitoringJobId": 79,
      "localTestjobId": 73939,
      "resultTimestamp": 1708541748100,
      "systemStatus": 0,
      "jobExecutionLogArray": [
        "2024-02-21 19:55:31.137 |  | INFO | Monitoring Job Execution Thread started",
        "2024-02-21 19:55:31.495 | Shared Agent 1 | INFO | Job submitted to measuring agent, remote testjob id = 19015",
        "2024-02-21 19:55:38.034 | Shared Agent 1 | INFO | Job executed on measuring agent, exit code = process executed successfully",
        "2024-02-21 19:55:40.014 | Shared Agent 2 | INFO | Job submitted to measuring agent, remote testjob id = 4864",
        "2024-02-21 19:55:46.446 | Shared Agent 2 | INFO | Job executed on measuring agent, exit code = process executed successfully",
        "2024-02-21 19:55:48.100 |  | INFO | Monitoring Job Execution Thread terminated"
      ],
      "combinedTestjobState": "completed",
      "hasCombinedTestResult": true,
      "combinedTestResultFileName": "TestResult_MonitoringJob_79_2024-02-21@19-55-48.json",
      "combinedTestResultSummaryStatistic": {
        "productVersion": "4.8.35",
        "localTestjobId": 73939,
        "remoteTestjobId": 39417,
        "samplingGranularity": 4000,
        "jobStartTimestamp": 1708541736385,
        "jobEndTimestamp": 1708541744994,
        "osCpuLoadPercent": -1,
        "numberOfPassedLoopsTimeSum": 178,
        "numberOfConcurrentUsers": 0,
        "currentlyPendingSamples": 0,
        "numberOfPassedSamples": 2,
        "numberOfFailedSamples": 0,
        "numberOfPassedLoops": 2,
        "numberOfFailedLoops": 0,
        "numberOfMeasuredErrors": 0,
        "numErrorsSeverityWarning": 0,
        "numErrorsSeverityError": 0,
        "numErrorsSeverityFatal": 0
      },
      "averagePassedLoopTime": 89,
      "sumErrorsSeverityWarning": 0,
      "sumErrorsSeverityError": 0,
      "sumErrorsSeverityFatal": 0
    }
  },
  "hasJobExecutionStatistic": true,
  "jobExecutionStatistic": {
    "userId": 13,
    "monitoringGroupId": 36,
    "monitoringJobId": 79,
    "fromTimestamp": 1708455371849,
    "toTimestamp": 1708541771849,
    "systemAvailabilityPercent": 100,
    "measuredAvailabilityPercent": 100,
    "measuredFaultyTimeSumSeconds": 0,
    "averagePassedLoopTime": 93,
    "hasPassedLoopTimePercentileArray": false
  },
  "isError": false
}

systemStatus:

  • 0: Healthy = The monitoring job have been started on all measuring agents.
  • -1 (minus one): Partial Malfunction = The monitoring job was not started on some measuring agents.
  • -2 (minus two): Malfunction = The monitoring job was not started on any measuring agent.

combinedTestjobState

  • “completed”: The testjob was successfully executed on all measuring agents.
  • “partial failed”: The execution of the testjob did fail on some measuring agents.
  • “failed”: The execution of the testjob did fail on all measuring agents.

Hint for combinedTestjobState : Note that is value does not reflect if any warnings or errors have been measured by the test jobs.

The Reference Implementation of the Monitoring Dashboard on the RealLoad Portal Server shows the measured (sumErrorsSeverityError + sumErrorsSeverityFatal) simple as “number of measured errors”.

Notification for Monitoring Group Temporarily Event

  • Received action: “onMonitoringGroupTemporarilyEvent”
  • monitoringGroupTemporarilyAction: “groupExecutionTemporarilyNotDisabled” or “groupExecutionTemporarilyDisabled”
{
  "action": "onMonitoringGroupTemporarilyEvent",
  "monitoringGroupId": 34,
  "monitoringEvent": {
    "eventTimestamp": 1708541771851,
    "monitoringGroup": {
      "monitoringGroupId": 34,
      "ownerUserId": 13,
      "title": "First Group",
      "description": "",
      "maxDataStorageDays": 14,
      "agentType": "agent",
      "executionEnabled": true,
      "executionInterval": 300,
      "executionTimeout": 300,
      "currentExecutionState": "executing",
      "lastExecutionStartTime": 1708541763897
    },
    "monitoringGroupTemporarilyAction": "groupExecutionTemporarilyNotDisabled"
  },
  "isError": false
}

Notification for Monitoring Job Temporarily Event

  • Received action: “onMonitoringJobTemporarilyEvent”
  • monitoringJobTemporarilyAction: “jobExecutionTemporarilyNotDisabled” or “jobExecutionTemporarilyDisabled”
{
  "action": "onMonitoringJobTemporarilyEvent",
  "monitoringGroupId": 36,
  "monitoringJobId": 79,
  "monitoringEvent": {
    "eventTimestamp": 1708541771854,
    "monitoringJobProperties": {
      "performanceErrorAlertThresholdMillis": "-1",
      "enableJobExecution": "true",
      "performanceWarningAlertsEnabled": "false",
      "testjobConcurrentUsers": "1",
      "testjobDelayPerLoop": "1000",
      "testjobDebugMeasuring": "false",
      "performanceErrorAlertsEnabled": "false",
      "enableAutomaticFileSync": "false",
      "performanceWarningAlertThresholdMillis": "-1",
      "testjobMaxTestDuration": "60",
      "testjobDebugExecution": "false",
      "testjobRampUpTime": "5",
      "definedFromMonitoringGroupId": "36",
      "testjobMaxLoopsPerUser": "1",
      "productVersion": "4.8.35",
      "monitoringJobId": "79",
      "monitoringJobTitle": "Local_Cinema",
      "lastExecutionStartTime": "1708541731138",
      "testjobAdditionalArguments": "",
      "definedFromTestId": "399",
      "testjobUserInputFieldsValuesJsonArray": "[]",
      "monitoringJobDescription": ""
    },
    "monitoringJobTemporarilyAction": "jobExecutionTemporarilyNotDisabled"
  },
  "isError": false
}

subscribeToMonitoringAlerts

  • Send action : “subscribeToMonitoringAlerts”
{
  "action":"subscribeToMonitoringAlerts"
}
  • Received action: “onMonitoringAlert”
  • alertLevel: “Monitoring Group”, “Monitoring Job” or “Monitoring Job Measuring Agent”
  • alertType: “New Alert”, “Modified Alert”, “Repeated Alert” or “Canceled Alert”
{
  "action": "onMonitoringAlert",
  "monitoringEvent": {
    "eventTimestamp": 1708547148410,
    "monitoringAlert": {
      "userId": 13,
      "alertLevel": "Monitoring Group",
      "alertType": "New Alert",
      "alertId": 579,
      "alertContext": {
        "alertIdUpdateCounter": 0,
        "currentSystemStatus": "Healthy",
        "currentExecutionState": "Successful",
        "currentNumMeasuredWarnings": 0,
        "currentNumMeasuredErrors": 2,
        "previousSystemStatus": "Healthy",
        "previousExecutionState": "Successful",
        "previousNumMeasuredWarnings": 0,
        "previousNumMeasuredErrors": 0
      },
      "monitoringGroupId": 36,
      "monitoringGroupExecutionResult": {
        "magicPattern": "MonitoringGroupExecutionResult",
        "productVersion": "4.8.35",
        "userId": 13,
        "monitoringGroupId": 36,
        "groupExecutionId": 39525,
        "resultTimestamp": 1708547148390,
        "monitoringJobIdToLocalTestjobIdArray": [
          {
            "monitoringJobId": 79,
            "localTestjobId": 74083
          }
        ],
        "groupSystemStatus": 0,
        "groupCombinedTestjobState": "completed",
        "groupExecutionLogArray": [
          "2024-02-21 21:25:31.365 |  | INFO | Monitoring Group Execution Thread started",
          "2024-02-21 21:25:48.383 |  | INFO | Monitoring Job Id 79 executed",
          "2024-02-21 21:25:48.390 |  | INFO | Monitoring Group Execution Thread terminated"
        ],
        "numberOfPassedSamples": 0,
        "numberOfFailedSamples": 2,
        "numberOfPassedLoops": 0,
        "numberOfFailedLoops": 2,
        "sumErrorsSeverityWarning": 0,
        "sumErrorsSeverityError": 2,
        "sumErrorsSeverityFatal": 0
      }
    }
  },
  "isError": false
}

subscribeToGroupExecutionHistoryCache

  • Send action : “subscribeToGroupExecutionHistoryCache”
{
  "action": "subscribeToGroupExecutionHistoryCache",
  "monitoringGroupId": 36
}

Error Case

{
  "action": "subscribeToGroupExecutionHistoryCache",
  "isError": true,
  "genericErrorText": "subscribeToGroupExecutionHistoryCache failed: java.lang.IllegalArgumentException: Invalid monitoringGroupId : 35"
}

Received actions:

  • onMonitoringGroupExecutionHistoryInitialEntries(history data of the last 24 hours)
  • onMonitoringGroupExecutionHistoryNewEntry(last update of history data)
{
  "action": "onMonitoringGroupExecutionHistoryInitialEntries",
  "monitoringGroupId": 36,
  "monitoringEvent": {
    "eventTimestamp": 1708548777246,
    "historyEntriesArray": [
      {
        "t": 1708463444623,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "w": 0,
        "e": 0,
        "f": 0,
        "gid": 37851
      },
      {
        "t": 1708463504557,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "w": 0,
        "e": 0,
        "f": 0,
        "gid": 37853
      },
      {
        "t": 1708463563635,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "w": 0,
        "e": 0,
        "f": 0,
        "gid": 37854
      },
      {
        "t": 1708548588515,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "w": 0,
        "e": 2,
        "f": 0,
        "gid": 39554
      },
      {
        "t": 1708548648466,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "w": 0,
        "e": 2,
        "f": 0,
        "gid": 39555
      },
      {
        "t": 1708548708464,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "w": 0,
        "e": 2,
        "f": 0,
        "gid": 39557
      },
      {
        "t": 1708548768449,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "w": 0,
        "e": 2,
        "f": 0,
        "gid": 39558
      }
    ]
  },
  "isError": false
}
{
  "action": "onMonitoringGroupExecutionHistoryNewEntry",
  "monitoringGroupId": 36,
  "monitoringEvent": {
    "eventTimestamp": 1708549188525,
    "historyEntry": {
      "t": 1708549188468,
      "ge": 60,
      "ss": 0,
      "ct": "completed",
      "w": 0,
      "e": 2,
      "f": 0,
      "gid": 39566
    }
  },
  "isError": false
}
  • t : Unix-like timestamp
  • ge : Monitoring group execution interval (seconds)
  • ss : Group system status: 0 = HEALTHY, -1 = PARTIAL MALFUNCTION, -2 = MALFUNCTION
  • ct : Group combined test job state: “completed”, “partial failed” or “failed”
  • w : Sum of errors with severity warning
  • e : Sum of errors with severity error
  • f : Sum of errors with severity fatal
  • gid : Group execution ID

subscribeToJobExecutionHistoryCache

  • Send action : “subscribeToJobExecutionHistoryCache”
{
  "action": "subscribeToJobExecutionHistoryCache",
  "monitoringJobId": 79
}

Error Case

{
  "action": "subscribeToJobExecutionHistoryCache",
  "isError": true,
  "genericErrorText": "subscribeToJobExecutionHistoryCache failed: java.lang.IllegalArgumentException: Invalid monitoringJobId : 80"
}

Received actions:

  • onMonitoringJobExecutionHistoryInitialEntries(history data of the last 24 hours)
  • onMonitoringJobExecutionHistoryNewEntry(last update of history data)
{
  "action": "onMonitoringJobExecutionHistoryInitialEntries",
  "monitoringGroupId": 36,
  "monitoringJobId": 79,
  "monitoringEvent": {
    "eventTimestamp": 1708551216713,
    "historyEntriesArray": [
      {
        "t": 1708464823243,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "al": 118,
        "w": 0,
        "e": 0,
        "f": 0,
        "lid": 71889,
        "h": true
      },
      {
        "t": 1708464882694,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "al": 107,
        "w": 0,
        "e": 0,
        "f": 0,
        "lid": 71890,
        "h": true
      },
      {
        "t": 1708464943399,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "al": 96,
        "w": 0,
        "e": 0,
        "f": 0,
        "lid": 71891,
        "h": true
      },
      {
        "t": 1708550987656,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "al": -1,
        "w": 0,
        "e": 2,
        "f": 0,
        "lid": 74186,
        "h": true
      },
      {
        "t": 1708551047722,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "al": -1,
        "w": 0,
        "e": 2,
        "f": 0,
        "lid": 74187,
        "h": true
      },
      {
        "t": 1708551108599,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "al": -1,
        "w": 0,
        "e": 2,
        "f": 0,
        "lid": 74191,
        "h": true
      },
      {
        "t": 1708551167586,
        "ge": 60,
        "ss": 0,
        "ct": "completed",
        "al": -1,
        "w": 0,
        "e": 2,
        "f": 0,
        "lid": 74192,
        "h": true
      }
    ]
  },
  "isError": false
}
{
  "action": "onMonitoringJobExecutionHistoryNewEntry",
  "monitoringGroupId": 36,
  "monitoringJobId": 79,
  "monitoringEvent": {
    "eventTimestamp": 1708551228189,
    "historyEntry": {
      "t": 1708551228183,
      "ge": 60,
      "ss": 0,
      "ct": "completed",
      "al": -1,
      "w": 0,
      "e": 2,
      "f": 0,
      "lid": 74193,
      "h": true
    }
  },
  "isError": false
}
  • t : Unix-like timestamp
  • ge : Monitoring group execution interval (seconds)
  • ss : System status: 0 = HEALTHY, -1 = PARTIAL MALFUNCTION, -2 = MALFUNCTION
  • ct : Combined test job state: “completed”, “partial failed” or “failed”
  • al : Average passed loop time (milliseconds), -1 = no data
  • w : Sum of errors with severity warning
  • e : Sum of errors with severity error
  • f : Sum of errors with severity fatal
  • lid : Local test job ID
  • h: Has combined test result: true or false

Other Received Actions

You will also receive other actions than previously described above. These are confirmations that you can ignore. Example:

{
    "action":"subscribeToRealtimeMonitor",
    "isError":false
}