This 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 testjobs, inclusive their states)
  • getTestjobOutDirectoryFilesInfo (Get from testjob 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 testjob locally and also on the measuring agent or cluster controller)
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
}

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”):

  • subscribeToHeartbeat : Subscribe to a periodic timestamp which is received every second.
  • 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.
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.

subscribeToHeartbeat

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

subscribeToRealtimeMonitor

As first you will receive instantly the 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.

Notifications for Monitoring Groups

  • Received action: “onMonitoringGroupEvent”
  • monitoringGroupAction: “groupExists”, “groupAdded”, “groupModified” or “groupDeleted”
{
    "action":"onMonitoringGroupEvent",
    "monitoringGroupId":17,
    "monitoringEvent":
    {
        "eventTimestamp":1677522195873,
        "monitoringGroup":
        {
            "monitoringGroupId":17,
            "ownerUserId":13,
            "title":"Group 1",
            "description":"My First Group",
            "maxDataStorageDays":14,
            "agentType":"agent",
            "executionEnabled":false,
            "executionInterval":180,
            "executionTimeout":300,
            "currentExecutionState":"dormant",
            "lastExecutionStartTime":1677506934041
        },
        "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 “groupModified” action is released.

Notification for Monitoring Jobs

  • Received action: “onMonitoringJobEvent”
  • monitoringJobAction: “jobExists”, “jobAdded”, “jobModified”, or “jobDeleted”
{
    "action":"onMonitoringJobEvent",
    "monitoringGroupId":17,
    "monitoringJobId":39,
    "monitoringEvent":
    {
        "eventTimestamp":1677522195875,
        "monitoringJobProperties":
        {
            "enableJobExecution":"true",
            "testjobConcurrentUsers":"1",
            "testjobDelayPerLoop":"1000",
            "testjobDebugMeasuring":"false",
            "enableAutomaticFileSync":"false",
            "testjobMaxTestDuration":"60",
            "testjobDebugExecution":"false",
            "testjobRampUpTime":"5",
            "definedFromMonitoringGroupId":"17",
            "testjobMaxLoopsPerUser":"1",
            "productVersion":"4.8.3",
            "monitoringJobId":"39",
            "monitoringJobTitle":"SimpleTest",
            "lastExecutionStartTime":"1677506934086",
            "testjobAdditionalArguments":"",
            "definedFromTestId":"311",
            "testjobUserInputFieldsValuesJsonArray":"[]",
            "monitoringJobDescription":""
        },
        "monitoringTestProperties":
        {
            "referencedResourceFilesList":[{"projectId":130,"testplanId":203,"fileName":"com.dkfqs.tools.jar"}],
            "productVersion":"4.7.14",
            "executingScript":"SimpleTest.jar",
            "definedFromProjectId":"137",
            "executingScriptResourceFileList":"",
            "visibleTestName":"SimpleTest",
            "scriptType":"OpenJDK11Jar",
            "createTimeStamp":"1675464639177",
            "testId":"311",
            "testDescription":"",
            "definedFromTestplanId":"251"
        },
        "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 “jobModified” action is released.

Notification for Monitoring Group Execution

  • Received action: “onMonitoringGroupExecuted”
  • oldEvent: true or false | Note: the oldEvent is false at the first time (if the monitoring group was executed in the past) and then will always be true each time when the monitoring group is executed.
{
    "action":"onMonitoringGroupExecuted",
    "monitoringGroupId":17,
    "monitoringEvent":
    {"
        eventTimestamp":1677522195877,
        "oldEvent":true,
        "groupExecutionResult":
        {
            "magicPattern":"MonitoringGroupExecutionResult",
            "productVersion":"4.8.3",
            "userId":13,
            "monitoringGroupId":17,
            "groupExecutionId":2430,
            "resultTimestamp":1677506950103,
            "monitoringJobIdToLocalTestjobIdArray":[{"monitoringJobId":39,"localTestjobId":5015}],
            "groupSystemStatus":0,
            "groupCombinedTestjobState":"completed",
            "groupExecutionLogArray":[
                "2023-02-27 15:08:54.067 |  | INFO | Monitoring Group Execution Thread started",
                "2023-02-27 15:09:10.102 |  | INFO | Monitoring Job Id 39 executed",
                "2023-02-27 15:09:10.103 |  | INFO | Monitoring Group Execution Thread terminated"],
            "numberOfPassedSamples":6,
            "numberOfFailedSamples":0,
            "numberOfPassedLoops":2,
            "numberOfFailedLoops":0,
            "sumErrorsSeverityWarning":0,
            "sumErrorsSeverityError":0,
            "sumErrorsSeverityFatal":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 testjobs of the monitoring group have been successfully executed on all measuring agents.
  • “partial failed”: The execution of some of the testjobs of the monitoring group did fail on some measuring agents.
  • “failed”: The execution of all of the testjobs 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 testjobs.

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 false at the first time (if the monitoring job was executed in the past) and then will always be true each time when the monitoring job is executed.
{
  "action": "onMonitoringJobExecuted",
  "monitoringGroupId": 17,
  "monitoringJobId": 39,
  "monitoringEvent": {
    "eventTimestamp": 1677522195878,
    "oldEvent": true,
    "jobExecutionResult": {
      "magicPattern": "MonitoringJobExecutionResult",
      "productVersion": "4.8.3",
      "userId": 13,
      "monitoringGroupId": 17,
      "groupExecutionId": 2430,
      "monitoringJobId": 39,
      "localTestjobId": 5015,
      "resultTimestamp": 1677506949101,
      "systemStatus": 0,
      "jobExecutionLogArray": [
        "2023-02-27 15:08:54.085 |  | INFO | Monitoring Job Execution Thread started",
        "2023-02-27 15:08:54.436 | Ubuntu 10 | INFO | Job submitted to measuring agent",
        "2023-02-27 15:08:59.854 | Ubuntu 10 | INFO | Job executed on measuring agent, exit code = process executed successfully",
        "2023-02-27 15:09:01.847 | Ubuntu 11 | INFO | Job submitted to measuring agent",
        "2023-02-27 15:09:07.438 | Ubuntu 11 | INFO | Job executed on measuring agent, exit code = process executed successfully",
        "2023-02-27 15:09:09.101 |  | INFO | Monitoring Job Execution Thread terminated"
      ],
      "combinedTestjobState": "completed",
      "hasCombinedTestResult": true,
      "combinedTestResultFileName": "TestResult_MonitoringJob_39_2023-02-27@15-09-09.json",
      "combinedTestResultSummaryStatistic": {
        "productVersion": "4.8.3",
        "localTestjobId": 5015,
        "remoteTestjobId": 2430,
        "samplingGranularity": 4000,
        "jobStartTimestamp": 1677506938135,
        "jobEndTimestamp": 1677506945975,
        "osCpuLoadPercent": -1,
        "numberOfPassedLoopsTimeSum": 506,
        "numberOfConcurrentUsers": 0,
        "currentlyPendingSamples": -1,
        "numberOfPassedSamples": 6,
        "numberOfFailedSamples": 0,
        "numberOfPassedLoops": 2,
        "numberOfFailedLoops": 0
      },
      "averagePassedLoopTime": 266,
      "sumErrorsSeverityWarning": 0,
      "sumErrorsSeverityError": 0,
      "sumErrorsSeverityFatal": 0,
      "measuringAgentResultArray": [
        {
          "userId": 13,
          "monitoringGroupId": 17,
          "groupExecutionId": 2430,
          "monitoringJobId": 39,
          "localTestjobId": 5015,
          "resultTimestamp": 1677506949076,
          "measuringAgent": {
            "agentId": 69,
            "createdBySystem": false,
            "ownerUserId": 13,
            "agentActive": true,
            "agentDescription": "Ubuntu 10",
            "agentHost": "192.168.0.110",
            "agentPort": 8080
          },
          "systemStatus": 0,
          "testjobState": "completed",
          "testjobExitCode": 0,
          "remoteTestjobId": 2169,
          "testjobResultFileName": "TestResult_SimpleTest_2023-02-27@15-08-58.json",
          "averagePassedLoopTime": 232,
          "sumErrorsSeverityWarning": 0,
          "sumErrorsSeverityError": 0,
          "sumErrorsSeverityFatal": 0,
          "additionalTextFilesArray": [
            {
              "fileName": ".testjob.properties",
              "fileLinesArray": [
                "#Test Job Properties",
                "#Mon Feb 27 15:08:59 CET 2023",
                "testjobResultFileName=TestResult_SimpleTest_2023-02-27@15-08-58.json",
                "testjobConcurrentUsers=1",
                "testjobDescription=SimpleTest",
                "testjobDebugMeasuring=false",
                "testjobMaxTestDuration=60",
                "testjobRampUpTime=5",
                "isClusterJob=false",
                "localTestjobId=5015",
                "testjobMaxLoopsPerUser=1",
                "productVersion=4.8.3",
                "remoteTestjobId=2169",
                "testjobAdditionalArguments=",
                "definedFromTestId=311",
                "testjobSignature=T9E26sxc4yzIxFsaV3J8nn9XJIbBX137/GMDJODyGQG73pES7iSopralt4rTLoqq9VG/cMFiTxexzCLYksYlF2w8sMls+9oWkPk/Yd0cjSAZgUO24gr7pCjJfU+GuJ6uJ/ts5XeHUSXPqFWiNh0SJG2dBx5wnuyGbvlsYKuUck6c51+6pjz1EaO3k+1eVgri9oREDBZEMOIf4ePlrbmgEf+Y9/X/dm0+PjdxZoi+AKKhK+TpXiWpmyyiw8X6RrckznJ3z/XhRFxcAAzurcz7qxa7Qjb2z64lO0lMMelLjXnTXRgSCVhYngKq6HWvoFUclGK8Z1Ju3cgiGtKT3Bn/mw\\=\\=",
                "testjobDelayPerLoop=1000",
                "testjobExitCode=0",
                "userInputFieldsFileName=",
                "createTimeStamp=1677506934097",
                "testjobType=monitoring",
                "enableAutomaticFileSync=false",
                "testjobState=completed",
                "testjobDebugExecution=false",
                "executeOnUserMeasuringAgentId=69",
                "definedFromTimeZoneId=Europe/Berlin",
                "executeMeasuringAgentInfo=192.168.0.110\\:8080"
              ]
            },
            {
              "fileName": "DataCollector.err",
              "fileLinesArray": []
            },
            {
              "fileName": "DataCollector.out",
              "fileLinesArray": [
                "Max. Java Memory = 128 MB",
                "--- vvv --- TestjobProperties --- vvv ---",
                "testjobResultFileName=",
                "executeMeasuringAgentClusterInfo=",
                "testjobConcurrentUsers=1",
                "testjobDescription=SimpleTest",
                "testjobDebugMeasuring=false",
                "testjobMaxTestDuration=60",
                "isClusterJob=false",
                "testjobRampUpTime=5",
                "localTestjobId=5015",
                "testjobMaxLoopsPerUser=1",
                "productVersion=4.8.1",
                "remoteTestjobId=2169",
                "testjobAdditionalArguments=",
                "definedFromTestId=311",
                "testjobSignature=T9E26sxc4yzIxFsaV3J8nn9XJIbBX137/GMDJODyGQG73pES7iSopralt4rTLoqq9VG/cMFiTxexzCLYksYlF2w8sMls+9oWkPk/Yd0cjSAZgUO24gr7pCjJfU+GuJ6uJ/ts5XeHUSXPqFWiNh0SJG2dBx5wnuyGbvlsYKuUck6c51+6pjz1EaO3k+1eVgri9oREDBZEMOIf4ePlrbmgEf+Y9/X/dm0+PjdxZoi+AKKhK+TpXiWpmyyiw8X6RrckznJ3z/XhRFxcAAzurcz7qxa7Qjb2z64lO0lMMelLjXnTXRgSCVhYngKq6HWvoFUclGK8Z1Ju3cgiGtKT3Bn/mw==",
                "testjobDelayPerLoop=1000",
                "testjobExitCode=",
                "createTimeStamp=1677506935549",
                "userInputFieldsFileName=",
                "testjobType=monitoring",
                "enableAutomaticFileSync=false",
                "testjobState=submitted",
                "isClusterControllerJobProperties=",
                "testjobDebugExecution=false",
                "executeOnUserMeasuringAgentId=69",
                "definedFromTimeZoneId=Europe/Berlin",
                "executeMeasuringAgentInfo=192.168.0.110:8080",
                "executeOnMeasuringAgentClusterId=",
                "--- ^^^ --- TestjobProperties --- ^^^ ---",
                "--- vvv --- TestProperties --- vvv ---",
                "referencedResourceFilesList=[{\"projectId\":130,\"testplanId\":203,\"fileName\":\"com.dkfqs.tools.jar\"}]",
                "productVersion=4.7.14",
                "executingScript=SimpleTest.jar",
                "definedFromProjectId=137",
                "executingScriptResourceFileList=",
                "visibleTestName=SimpleTest",
                "scriptType=OpenJDK11Jar",
                "createTimeStamp=1675464639177",
                "testId=311",
                "testDescription=",
                "definedFromTestplanId=251",
                "--- ^^^ --- TestProperties --- ^^^ ---",
                "X509 TLS server certificate generated for CN = 127.0.0.1",
                "Internal RSA 2048 bit keypair generated in 96 ms",
                "2023-02-27 14:08:56.682 | QAHTTPd | WARN | QAHTTPd V1.4-B started",
                "2023-02-27 14:08:56.709 | QAHTTPd | INFO | HTTPS server starting at port 44941",
                "2023-02-27 14:08:56.727 | QAHTTPd | INFO | HTTPS server ready at port 44941",
                "2023-02-27 14:08:57.697 | DataCollector PID 280356 | INFO | Use data collector protocol #1 = \"one output file per user DKFQS tailer\"",
                "2023-02-27 14:08:57.711 | DataCollector PID 280356 | INFO | Initialize data collector protocol #1 ...",
                "2023-02-27 14:08:57.716 | DataCollector PID 280356 | INFO | Data collector protocol #1 testjob out subdirectory = /home/dkfqs/agent/usersData/User_13/TestJobs/Testjob_2169/out",
                "2023-02-27 14:08:57.717 | DataCollector PID 280356 | INFO | Number of concurrent users = 1",
                "2023-02-27 14:08:57.726 | DataCollector PID 280356 | INFO | File '/home/dkfqs/agent/usersData/User_13/TestJobs/Testjob_2169/out/user_1_statistics.out' created",
                "2023-02-27 14:08:57.726 | DataCollector PID 280356 | INFO | ... Initialize data collector protocol #1 done",
                "2023-02-27 14:08:57.777 | 127.0.0.1 : 50610 | INFO | https POST /dataCollectorApi HTTP/1.1",
                "2023-02-27 14:08:57.799 | 127.0.0.1 : 50610 | INFO | InternalApi action = checkStartupCompleted",
                "2023-02-27 14:08:57.803 | 127.0.0.1 : 50610 | INFO | HTTP/1.1 200 OK [34 application/json]",
                "2023-02-27 14:08:57.899 | 127.0.0.1 : 50612 | INFO | https POST /dataCollectorApi HTTP/1.1",
                "2023-02-27 14:08:57.901 | 127.0.0.1 : 50612 | INFO | InternalApi action = startProtocol",
                "2023-02-27 14:08:57.904 | 127.0.0.1 : 50612 | INFO | Start data collector protocol #1",
                "2023-02-27 14:08:57.905 | 127.0.0.1 : 50612 | INFO | Tailer delay millis = 500",
                "2023-02-27 14:08:57.905 | 127.0.0.1 : 50612 | INFO | Start tailer for user no. 1",
                "2023-02-27 14:08:57.911 | SamplingGranularityThread | INFO | SamplingGranularityThread started. Sampling granularity = 4000 ms",
                "2023-02-27 14:08:57.962 | 127.0.0.1 : 50612 | INFO | HTTP/1.1 200 OK [11 application/json]",
                "2023-02-27 14:08:59.988 | 127.0.0.1 : 50616 | INFO | https POST /dataCollectorApi HTTP/1.1",
                "2023-02-27 14:08:59.990 | 127.0.0.1 : 50616 | INFO | InternalApi action = stopProtocol",
                "2023-02-27 14:08:59.990 | 127.0.0.1 : 50616 | INFO | Stop data collector protocol #1",
                "2023-02-27 14:09:00.991 | 127.0.0.1 : 50616 | INFO | Stop tailer for user no. 1",
                "2023-02-27 14:09:00.996 | SamplingGranularityThread | INFO | SamplingGranularityThread stopped",
                "2023-02-27 14:09:00.996 | 127.0.0.1 : 50616 | INFO | HTTP/1.1 200 OK [11 application/json]",
                "2023-02-27 14:09:01.017 | 127.0.0.1 : 50618 | INFO | https POST /dataCollectorApi HTTP/1.1",
                "2023-02-27 14:09:01.018 | 127.0.0.1 : 50618 | INFO | InternalApi action = writeTestResultToDisk",
                "2023-02-27 14:09:01.033 | 127.0.0.1 : 50618 | INFO | Test result file = TestResult_SimpleTest_2023-02-27@15-08-58.json",
                "2023-02-27 14:09:01.039 | 127.0.0.1 : 50618 | INFO | HTTP/1.1 200 OK [80 application/json]"
              ]
            },
            {
              "fileName": "user_1_statistics.out",
              "fileLinesArray": [
                "{\"subject\":\"declare-statistic\",\"statistic-id\":0,\"statistic-type\":\"sample-event-time-chart\",\"statistic-title\":\"Measurement Group «Group 1»\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"Execution Time\",\"unit-text\":\"ms\",\"sort-position\":0,\"add-to-summary-statistic\":false,\"background-color\":\"table-info\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":1,\"statistic-type\":\"sample-event-time-chart\",\"statistic-title\":\"GET https://192.168.0.112/\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"Response Time\",\"unit-text\":\"ms\",\"sort-position\":1,\"add-to-summary-statistic\":true,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":2,\"statistic-type\":\"sample-event-time-chart\",\"statistic-title\":\"GET https://192.168.0.112/images/RealLoadPortal.gif\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"Response Time\",\"unit-text\":\"ms\",\"sort-position\":2,\"add-to-summary-statistic\":true,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":3,\"statistic-type\":\"sample-event-time-chart\",\"statistic-title\":\"GET https://192.168.0.112/images/QAHTTPd_188x112.gif\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"Response Time\",\"unit-text\":\"ms\",\"sort-position\":3,\"add-to-summary-statistic\":true,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100001,\"statistic-type\":\"cumulative-counter-long\",\"statistic-title\":\"Total Bytes Sent\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"\",\"unit-text\":\"Bytes\",\"sort-position\":100001,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100002,\"statistic-type\":\"cumulative-counter-long\",\"statistic-title\":\"Total Bytes Received\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"\",\"unit-text\":\"Bytes\",\"sort-position\":100002,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100003,\"statistic-type\":\"throughput-time-chart\",\"statistic-title\":\"Network Throughput\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"Network Throughput\",\"unit-text\":\"Mbps\",\"sort-position\":100003,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100004,\"statistic-type\":\"average-and-current-value\",\"statistic-title\":\"Avg. TCP Connect Time\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"\",\"unit-text\":\"ms\",\"sort-position\":100004,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100005,\"statistic-type\":\"average-and-current-value\",\"statistic-title\":\"Avg. SSL Handshake Time\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"\",\"unit-text\":\"ms\",\"sort-position\":100005,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100006,\"statistic-type\":\"efficiency-ratio-percent\",\"statistic-title\":\"HTTP Keep-Alive Efficiency\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"\",\"unit-text\":\"%\",\"sort-position\":100006,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"register-execute-start\",\"timestamp\":1677506938135}",
                "{\"subject\":\"register-loop-start\",\"timestamp\":1677506938136}",
                "{\"subject\":\"register-sample-start\",\"statistic-id\":0,\"timestamp\":1677506938136}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100001,\"value\":0}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100002,\"value\":0}",
                "{\"subject\":\"add-throughput-delta\",\"statistic-id\":100003,\"delta-value\":0,\"timestamp\":1677506938137}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100004,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":-1,\"currentValueTimestamp\":-1}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100005,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":-1,\"currentValueTimestamp\":-1}",
                "{\"subject\":\"add-efficiency-ratio-delta\",\"statistic-id\":100006,\"efficiencyDeltaValue\":0,\"inefficiencyDeltaValue\":0}",
                "{\"subject\":\"register-sample-start\",\"statistic-id\":1,\"timestamp\":1677506938151}",
                "{\"subject\":\"add-sample-long\",\"statistic-id\":1,\"value\":167,\"timestamp\":1677506938335}",
                "{\"subject\":\"register-sample-start\",\"statistic-id\":2,\"timestamp\":1677506938336}",
                "{\"subject\":\"add-sample-long\",\"statistic-id\":2,\"value\":8,\"timestamp\":1677506938346}",
                "{\"subject\":\"register-sample-start\",\"statistic-id\":3,\"timestamp\":1677506938347}",
                "{\"subject\":\"add-sample-long\",\"statistic-id\":3,\"value\":4,\"timestamp\":1677506938353}",
                "{\"subject\":\"add-sample-long\",\"statistic-id\":0,\"value\":217,\"timestamp\":1677506938353}",
                "{\"subject\":\"register-loop-passed\",\"loop-time\":217,\"timestamp\":1677506938353}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100001,\"value\":1038}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100002,\"value\":48631}",
                "{\"subject\":\"add-throughput-delta\",\"statistic-id\":100003,\"delta-value\":0.397352,\"timestamp\":1677506938389}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100004,\"sumValuesDelta\":2,\"numValuesDelta\":1,\"currentValue\":2,\"currentValueTimestamp\":1677506938322}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100005,\"sumValuesDelta\":61,\"numValuesDelta\":1,\"currentValue\":61,\"currentValueTimestamp\":1677506938322}",
                "{\"subject\":\"add-efficiency-ratio-delta\",\"statistic-id\":100006,\"efficiencyDeltaValue\":2,\"inefficiencyDeltaValue\":1}",
                "{\"subject\":\"register-execute-end\",\"timestamp\":1677506938406}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100001,\"value\":0}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100002,\"value\":0}",
                "{\"subject\":\"add-throughput-delta\",\"statistic-id\":100003,\"delta-value\":0,\"timestamp\":1677506938640}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100004,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":2,\"currentValueTimestamp\":1677506938322}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100005,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":61,\"currentValueTimestamp\":1677506938322}",
                "{\"subject\":\"add-efficiency-ratio-delta\",\"statistic-id\":100006,\"efficiencyDeltaValue\":0,\"inefficiencyDeltaValue\":0}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100001,\"value\":0}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100002,\"value\":0}",
                "{\"subject\":\"add-throughput-delta\",\"statistic-id\":100003,\"delta-value\":0,\"timestamp\":1677506938891}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100004,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":2,\"currentValueTimestamp\":1677506938322}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100005,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":61,\"currentValueTimestamp\":1677506938322}",
                "{\"subject\":\"add-efficiency-ratio-delta\",\"statistic-id\":100006,\"efficiencyDeltaValue\":0,\"inefficiencyDeltaValue\":0}"
              ]
            },
            {
              "fileName": "users.out",
              "fileLinesArray": [
                "2023-02-27 14:08:58.097 | main | INFO | Max. Java Memory = 256 MB",
                "2023-02-27 14:08:58.106 | main | INFO | --- vvv --- resource files --- vvv ---",
                "2023-02-27 14:08:58.107 | main | INFO | --- ^^^ --- resource files --- ^^^ ---",
                "2023-02-27 14:08:58.107 | main | INFO | --- vvv --- generic arguments --- vvv ---",
                "2023-02-27 14:08:58.107 | main | INFO | users = 1",
                "2023-02-27 14:08:58.107 | main | INFO | duration = 60",
                "2023-02-27 14:08:58.107 | main | INFO | maxLoops = 1",
                "2023-02-27 14:08:58.107 | main | INFO | delayPerLoop = 1000",
                "2023-02-27 14:08:58.108 | main | INFO | rampupTime = 5",
                "2023-02-27 14:08:58.108 | main | INFO | dataOutputDir = /home/dkfqs/agent/usersData/User_13/TestJobs/Testjob_2169/out",
                "2023-02-27 14:08:58.108 | main | INFO | debugExec = false",
                "2023-02-27 14:08:58.108 | main | INFO | debugData = false",
                "2023-02-27 14:08:58.108 | main | INFO | description = SimpleTest",
                "2023-02-27 14:08:58.108 | main | INFO | --- ^^^ --- generic arguments --- ^^^ ---",
                "2023-02-27 14:08:58.108 | main | INFO | --- vvv --- specific arguments --- vvv ---",
                "2023-02-27 14:08:58.114 | main | INFO | tcpTimeout = 10000",
                "2023-02-27 14:08:58.114 | main | INFO | sslTimeout = 5000",
                "2023-02-27 14:08:58.115 | main | INFO | httpTimeout = 30000",
                "2023-02-27 14:08:58.115 | main | INFO | --- ^^^ --- specific arguments --- ^^^ ---",
                "2023-02-27 14:08:58.123 | main | INFO | [Start of Test]",
                "2023-02-27 14:08:58.124 | User-1 | INFO | User started",
                "2023-02-27 14:08:58.136 | periodic-thread | INFO | Thread started",
                "2023-02-27 14:08:58.136 | User-1 | INFO | Start execute session no. 1 ...",
                "2023-02-27 14:08:58.353 | User-1 | INFO | ... End execute session no. 1 successful passed",
                "2023-02-27 14:08:58.406 | User-1 | INFO | User normal terminated",
                "2023-02-27 14:08:59.124 | main | INFO | [End of Test]"
              ]
            }
          ]
        },
        {
          "userId": 13,
          "monitoringGroupId": 17,
          "groupExecutionId": 2430,
          "monitoringJobId": 39,
          "localTestjobId": 5015,
          "resultTimestamp": 1677506949077,
          "measuringAgent": {
            "agentId": 70,
            "createdBySystem": false,
            "ownerUserId": 13,
            "agentActive": true,
            "agentDescription": "Ubuntu 11",
            "agentHost": "192.168.0.111",
            "agentPort": 8080
          },
          "systemStatus": 0,
          "testjobState": "completed",
          "testjobExitCode": 0,
          "remoteTestjobId": 1676,
          "testjobResultFileName": "TestResult_SimpleTest_2023-02-27@15-09-05.json",
          "averagePassedLoopTime": 299,
          "sumErrorsSeverityWarning": 0,
          "sumErrorsSeverityError": 0,
          "sumErrorsSeverityFatal": 0,
          "additionalTextFilesArray": [
            {
              "fileName": ".testjob.properties",
              "fileLinesArray": [
                "#Test Job Properties",
                "#Mon Feb 27 15:09:07 CET 2023",
                "testjobResultFileName=TestResult_SimpleTest_2023-02-27@15-09-05.json",
                "testjobConcurrentUsers=1",
                "testjobDescription=SimpleTest",
                "testjobDebugMeasuring=false",
                "testjobMaxTestDuration=60",
                "testjobRampUpTime=5",
                "isClusterJob=false",
                "localTestjobId=5015",
                "testjobMaxLoopsPerUser=1",
                "productVersion=4.8.3",
                "remoteTestjobId=1676",
                "testjobAdditionalArguments=",
                "definedFromTestId=311",
                "testjobSignature=T9E26sxc4yzIxFsaV3J8nn9XJIbBX137/GMDJODyGQG73pES7iSopralt4rTLoqq9VG/cMFiTxexzCLYksYlF2w8sMls+9oWkPk/Yd0cjSAZgUO24gr7pCjJfU+GuJ6uJ/ts5XeHUSXPqFWiNh0SJG2dBx5wnuyGbvlsYKuUck6c51+6pjz1EaO3k+1eVgri9oREDBZEMOIf4ePlrbmgEf+Y9/X/dm0+PjdxZoi+AKKhK+TpXiWpmyyiw8X6RrckznJ3z/XhRFxcAAzurcz7qxa7Qjb2z64lO0lMMelLjXnTXRgSCVhYngKq6HWvoFUclGK8Z1Ju3cgiGtKT3Bn/mw\\=\\=",
                "testjobDelayPerLoop=1000",
                "testjobExitCode=0",
                "userInputFieldsFileName=",
                "createTimeStamp=1677506941508",
                "testjobType=monitoring",
                "enableAutomaticFileSync=false",
                "testjobState=completed",
                "testjobDebugExecution=false",
                "executeOnUserMeasuringAgentId=70",
                "definedFromTimeZoneId=Europe/Berlin",
                "executeMeasuringAgentInfo=192.168.0.111\\:8080"
              ]
            },
            {
              "fileName": "DataCollector.err",
              "fileLinesArray": []
            },
            {
              "fileName": "DataCollector.out",
              "fileLinesArray": [
                "Max. Java Memory = 128 MB",
                "--- vvv --- TestjobProperties --- vvv ---",
                "testjobResultFileName=",
                "executeMeasuringAgentClusterInfo=",
                "testjobConcurrentUsers=1",
                "testjobDescription=SimpleTest",
                "testjobDebugMeasuring=false",
                "testjobMaxTestDuration=60",
                "isClusterJob=false",
                "testjobRampUpTime=5",
                "localTestjobId=5015",
                "testjobMaxLoopsPerUser=1",
                "productVersion=4.8.1",
                "remoteTestjobId=1676",
                "testjobAdditionalArguments=",
                "definedFromTestId=311",
                "testjobSignature=T9E26sxc4yzIxFsaV3J8nn9XJIbBX137/GMDJODyGQG73pES7iSopralt4rTLoqq9VG/cMFiTxexzCLYksYlF2w8sMls+9oWkPk/Yd0cjSAZgUO24gr7pCjJfU+GuJ6uJ/ts5XeHUSXPqFWiNh0SJG2dBx5wnuyGbvlsYKuUck6c51+6pjz1EaO3k+1eVgri9oREDBZEMOIf4ePlrbmgEf+Y9/X/dm0+PjdxZoi+AKKhK+TpXiWpmyyiw8X6RrckznJ3z/XhRFxcAAzurcz7qxa7Qjb2z64lO0lMMelLjXnTXRgSCVhYngKq6HWvoFUclGK8Z1Ju3cgiGtKT3Bn/mw==",
                "testjobDelayPerLoop=1000",
                "testjobExitCode=",
                "createTimeStamp=1677506942962",
                "userInputFieldsFileName=",
                "testjobType=monitoring",
                "enableAutomaticFileSync=false",
                "testjobState=submitted",
                "isClusterControllerJobProperties=",
                "testjobDebugExecution=false",
                "executeOnUserMeasuringAgentId=70",
                "definedFromTimeZoneId=Europe/Berlin",
                "executeMeasuringAgentInfo=192.168.0.111:8080",
                "executeOnMeasuringAgentClusterId=",
                "--- ^^^ --- TestjobProperties --- ^^^ ---",
                "--- vvv --- TestProperties --- vvv ---",
                "referencedResourceFilesList=[{\"projectId\":130,\"testplanId\":203,\"fileName\":\"com.dkfqs.tools.jar\"}]",
                "productVersion=4.7.14",
                "executingScript=SimpleTest.jar",
                "definedFromProjectId=137",
                "executingScriptResourceFileList=",
                "visibleTestName=SimpleTest",
                "scriptType=OpenJDK11Jar",
                "createTimeStamp=1675464639177",
                "testId=311",
                "testDescription=",
                "definedFromTestplanId=251",
                "--- ^^^ --- TestProperties --- ^^^ ---",
                "X509 TLS server certificate generated for CN = 127.0.0.1",
                "Internal RSA 2048 bit keypair generated in 58 ms",
                "2023-02-27 14:09:04.195 | QAHTTPd | WARN | QAHTTPd V1.4-B started",
                "2023-02-27 14:09:04.226 | QAHTTPd | INFO | HTTPS server starting at port 44448",
                "2023-02-27 14:09:04.258 | QAHTTPd | INFO | HTTPS server ready at port 44448",
                "2023-02-27 14:09:05.189 | DataCollector PID 262208 | INFO | Use data collector protocol #1 = \"one output file per user DKFQS tailer\"",
                "2023-02-27 14:09:05.194 | DataCollector PID 262208 | INFO | Initialize data collector protocol #1 ...",
                "2023-02-27 14:09:05.197 | DataCollector PID 262208 | INFO | Data collector protocol #1 testjob out subdirectory = /home/dkfqs/agent/usersData/User_13/TestJobs/Testjob_1676/out",
                "2023-02-27 14:09:05.198 | DataCollector PID 262208 | INFO | Number of concurrent users = 1",
                "2023-02-27 14:09:05.214 | 127.0.0.1 : 50182 | INFO | https POST /dataCollectorApi HTTP/1.1",
                "2023-02-27 14:09:05.215 | DataCollector PID 262208 | INFO | File '/home/dkfqs/agent/usersData/User_13/TestJobs/Testjob_1676/out/user_1_statistics.out' created",
                "2023-02-27 14:09:05.218 | DataCollector PID 262208 | INFO | ... Initialize data collector protocol #1 done",
                "2023-02-27 14:09:05.249 | 127.0.0.1 : 50182 | INFO | InternalApi action = checkStartupCompleted",
                "2023-02-27 14:09:05.257 | 127.0.0.1 : 50182 | INFO | HTTP/1.1 200 OK [34 application/json]",
                "2023-02-27 14:09:05.355 | 127.0.0.1 : 50184 | INFO | https POST /dataCollectorApi HTTP/1.1",
                "2023-02-27 14:09:05.359 | 127.0.0.1 : 50184 | INFO | InternalApi action = startProtocol",
                "2023-02-27 14:09:05.370 | 127.0.0.1 : 50184 | INFO | Start data collector protocol #1",
                "2023-02-27 14:09:05.371 | 127.0.0.1 : 50184 | INFO | Tailer delay millis = 500",
                "2023-02-27 14:09:05.371 | 127.0.0.1 : 50184 | INFO | Start tailer for user no. 1",
                "2023-02-27 14:09:05.378 | SamplingGranularityThread | INFO | SamplingGranularityThread started. Sampling granularity = 4000 ms",
                "2023-02-27 14:09:05.428 | 127.0.0.1 : 50184 | INFO | HTTP/1.1 200 OK [11 application/json]",
                "2023-02-27 14:09:05.933 | User 1 | ERROR | Tailer: Failed to parse JSON data at line 22 of file '/home/dkfqs/agent/usersData/User_13/TestJobs/Testjob_1676/out/user_1_statistics.out'",
                "2023-02-27 14:09:05.933 | User 1 | ERROR | libs.com.eclipsesource.json.ParseException: Unexpected character at 1:65",
                "2023-02-27 14:09:05.933 | User 1 | ERROR | \tat libs.com.eclipsesource.json.JsonParser.error(JsonParser.java:490)",
                "2023-02-27 14:09:05.934 | User 1 | ERROR | \tat libs.com.eclipsesource.json.JsonParser.parse(JsonParser.java:155)",
                "2023-02-27 14:09:05.934 | User 1 | ERROR | \tat libs.com.eclipsesource.json.JsonParser.parse(JsonParser.java:91)",
                "2023-02-27 14:09:05.934 | User 1 | ERROR | \tat libs.com.eclipsesource.json.Json.parse(Json.java:295)",
                "2023-02-27 14:09:05.934 | User 1 | ERROR | \tat com.dkfqs.measuringagent.datacollector.ProtocolType1AdapterTailerListener.onExtractLine(ProtocolType1AdapterTailerListener.java:91)",
                "2023-02-27 14:09:05.934 | User 1 | ERROR | \tat com.dkfqs.measuringagent.product.DKFQSFileTailerThread.convertOutputBufferToLines(DKFQSFileTailerThread.java:152)",
                "2023-02-27 14:09:05.934 | User 1 | ERROR | \tat com.dkfqs.measuringagent.product.DKFQSFileTailerThread.run(DKFQSFileTailerThread.java:86)",
                "2023-02-27 14:09:05.934 | User 1 | ERROR | Tailer: Invalid JSON data received at line 23 of file '/home/dkfqs/agent/usersData/User_13/TestJobs/Testjob_1676/out/user_1_statistics.out'",
                "2023-02-27 14:09:07.470 | 127.0.0.1 : 50188 | INFO | https POST /dataCollectorApi HTTP/1.1",
                "2023-02-27 14:09:07.472 | 127.0.0.1 : 50188 | INFO | InternalApi action = stopProtocol",
                "2023-02-27 14:09:07.472 | 127.0.0.1 : 50188 | INFO | Stop data collector protocol #1",
                "2023-02-27 14:09:08.473 | 127.0.0.1 : 50188 | INFO | Stop tailer for user no. 1",
                "2023-02-27 14:09:08.475 | 127.0.0.1 : 50188 | INFO | HTTP/1.1 200 OK [11 application/json]",
                "2023-02-27 14:09:08.476 | SamplingGranularityThread | INFO | SamplingGranularityThread stopped",
                "2023-02-27 14:09:08.512 | 127.0.0.1 : 50190 | INFO | https POST /dataCollectorApi HTTP/1.1",
                "2023-02-27 14:09:08.514 | 127.0.0.1 : 50190 | INFO | InternalApi action = writeTestResultToDisk",
                "2023-02-27 14:09:08.541 | 127.0.0.1 : 50190 | INFO | Test result file = TestResult_SimpleTest_2023-02-27@15-09-05.json",
                "2023-02-27 14:09:08.548 | 127.0.0.1 : 50190 | INFO | HTTP/1.1 200 OK [80 application/json]"
              ]
            },
            {
              "fileName": "user_1_statistics.out",
              "fileLinesArray": [
                "{\"subject\":\"declare-statistic\",\"statistic-id\":0,\"statistic-type\":\"sample-event-time-chart\",\"statistic-title\":\"Measurement Group «Group 1»\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"Execution Time\",\"unit-text\":\"ms\",\"sort-position\":0,\"add-to-summary-statistic\":false,\"background-color\":\"table-info\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":1,\"statistic-type\":\"sample-event-time-chart\",\"statistic-title\":\"GET https://192.168.0.112/\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"Response Time\",\"unit-text\":\"ms\",\"sort-position\":1,\"add-to-summary-statistic\":true,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":2,\"statistic-type\":\"sample-event-time-chart\",\"statistic-title\":\"GET https://192.168.0.112/images/RealLoadPortal.gif\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"Response Time\",\"unit-text\":\"ms\",\"sort-position\":2,\"add-to-summary-statistic\":true,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":3,\"statistic-type\":\"sample-event-time-chart\",\"statistic-title\":\"GET https://192.168.0.112/images/QAHTTPd_188x112.gif\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"Response Time\",\"unit-text\":\"ms\",\"sort-position\":3,\"add-to-summary-statistic\":true,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100001,\"statistic-type\":\"cumulative-counter-long\",\"statistic-title\":\"Total Bytes Sent\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"\",\"unit-text\":\"Bytes\",\"sort-position\":100001,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100002,\"statistic-type\":\"cumulative-counter-long\",\"statistic-title\":\"Total Bytes Received\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"\",\"unit-text\":\"Bytes\",\"sort-position\":100002,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100003,\"statistic-type\":\"throughput-time-chart\",\"statistic-title\":\"Network Throughput\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"Network Throughput\",\"unit-text\":\"Mbps\",\"sort-position\":100003,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100004,\"statistic-type\":\"average-and-current-value\",\"statistic-title\":\"Avg. TCP Connect Time\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"\",\"unit-text\":\"ms\",\"sort-position\":100004,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100005,\"statistic-type\":\"average-and-current-value\",\"statistic-title\":\"Avg. SSL Handshake Time\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"\",\"unit-text\":\"ms\",\"sort-position\":100005,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"declare-statistic\",\"statistic-id\":100006,\"statistic-type\":\"efficiency-ratio-percent\",\"statistic-title\":\"HTTP Keep-Alive Efficiency\",\"statistic-subtitle\":\"\",\"y-axis-title\":\"\",\"unit-text\":\"%\",\"sort-position\":100006,\"add-to-summary-statistic\":false,\"background-color\":\"\"}",
                "{\"subject\":\"register-execute-start\",\"timestamp\":1677506945634}",
                "{\"subject\":\"register-loop-start\",\"timestamp\":1677506945635}",
                "{\"subject\":\"register-sample-start\",\"statistic-id\":0,\"timestamp\":1677506945635}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100001,\"value\":0}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100002,\"value\":0}",
                "{\"subject\":\"add-throughput-delta\",\"statistic-id\":100003,\"delta-value\":0,\"timestamp\":1677506945637}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100004,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":-1,\"currentValueTimestamp\":-1}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100005,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":-1,\"currentValueTimestamp\":-1}",
                "{\"subject\":\"add-efficiency-ratio-delta\",\"statistic-id\":100006,\"efficiencyDeltaValue\":0,\"inefficiencyDeltaValue\":0}",
                "{\"subject\":\"register-sample-start\",\"statistic-id\":1,\"timestamp\":1677506945653}",
                "{\"subject\":\"add-sample-long\",\"statistic-id\":1,\"value\":209,\"timestamp\":1677506945886}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100001,\"value\":319}{\"subject\":\"register-sample-start\",\"statistic-id\":2,\"timestamp\":1677506945895}",
                "",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100002,\"value\":2681}",
                "{\"subject\":\"add-throughput-delta\",\"statistic-id\":100003,\"delta-value\":0.024,\"timestamp\":1677506945896}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100004,\"sumValuesDelta\":2,\"numValuesDelta\":1,\"currentValue\":2,\"currentValueTimestamp\":1677506945867}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100005,\"sumValuesDelta\":72,\"numValuesDelta\":1,\"currentValue\":72,\"currentValueTimestamp\":1677506945867}",
                "{\"subject\":\"add-efficiency-ratio-delta\",\"statistic-id\":100006,\"efficiencyDeltaValue\":0,\"inefficiencyDeltaValue\":1}",
                "{\"subject\":\"add-sample-long\",\"statistic-id\":2,\"value\":14,\"timestamp\":1677506945911}",
                "{\"subject\":\"register-sample-start\",\"statistic-id\":3,\"timestamp\":1677506945912}",
                "{\"subject\":\"add-sample-long\",\"statistic-id\":3,\"value\":4,\"timestamp\":1677506945923}",
                "{\"subject\":\"add-sample-long\",\"statistic-id\":0,\"value\":288,\"timestamp\":1677506945923}",
                "{\"subject\":\"register-loop-passed\",\"loop-time\":289,\"timestamp\":1677506945924}",
                "{\"subject\":\"register-execute-end\",\"timestamp\":1677506945975}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100001,\"value\":719}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100002,\"value\":45950}",
                "{\"subject\":\"add-throughput-delta\",\"statistic-id\":100003,\"delta-value\":0.373352,\"timestamp\":1677506946148}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100004,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":2,\"currentValueTimestamp\":1677506945867}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100005,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":72,\"currentValueTimestamp\":1677506945867}",
                "{\"subject\":\"add-efficiency-ratio-delta\",\"statistic-id\":100006,\"efficiencyDeltaValue\":2,\"inefficiencyDeltaValue\":0}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100001,\"value\":0}",
                "{\"subject\":\"add-counter-long\",\"statistic-id\":100002,\"value\":0}",
                "{\"subject\":\"add-throughput-delta\",\"statistic-id\":100003,\"delta-value\":0,\"timestamp\":1677506946400}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100004,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":2,\"currentValueTimestamp\":1677506945867}",
                "{\"subject\":\"add-average-delta-and-current-value\",\"statistic-id\":100005,\"sumValuesDelta\":0,\"numValuesDelta\":0,\"currentValue\":72,\"currentValueTimestamp\":1677506945867}",
                "{\"subject\":\"add-efficiency-ratio-delta\",\"statistic-id\":100006,\"efficiencyDeltaValue\":0,\"inefficiencyDeltaValue\":0}"
              ]
            },
            {
              "fileName": "users.out",
              "fileLinesArray": [
                "2023-02-27 14:09:05.586 | main | INFO | Max. Java Memory = 256 MB",
                "2023-02-27 14:09:05.599 | main | INFO | --- vvv --- resource files --- vvv ---",
                "2023-02-27 14:09:05.599 | main | INFO | --- ^^^ --- resource files --- ^^^ ---",
                "2023-02-27 14:09:05.599 | main | INFO | --- vvv --- generic arguments --- vvv ---",
                "2023-02-27 14:09:05.600 | main | INFO | users = 1",
                "2023-02-27 14:09:05.600 | main | INFO | duration = 60",
                "2023-02-27 14:09:05.600 | main | INFO | maxLoops = 1",
                "2023-02-27 14:09:05.600 | main | INFO | delayPerLoop = 1000",
                "2023-02-27 14:09:05.600 | main | INFO | rampupTime = 5",
                "2023-02-27 14:09:05.600 | main | INFO | dataOutputDir = /home/dkfqs/agent/usersData/User_13/TestJobs/Testjob_1676/out",
                "2023-02-27 14:09:05.601 | main | INFO | debugExec = false",
                "2023-02-27 14:09:05.601 | main | INFO | debugData = false",
                "2023-02-27 14:09:05.601 | main | INFO | description = SimpleTest",
                "2023-02-27 14:09:05.601 | main | INFO | --- ^^^ --- generic arguments --- ^^^ ---",
                "2023-02-27 14:09:05.601 | main | INFO | --- vvv --- specific arguments --- vvv ---",
                "2023-02-27 14:09:05.609 | main | INFO | tcpTimeout = 10000",
                "2023-02-27 14:09:05.609 | main | INFO | sslTimeout = 5000",
                "2023-02-27 14:09:05.610 | main | INFO | httpTimeout = 30000",
                "2023-02-27 14:09:05.610 | main | INFO | --- ^^^ --- specific arguments --- ^^^ ---",
                "2023-02-27 14:09:05.620 | main | INFO | [Start of Test]",
                "2023-02-27 14:09:05.621 | User-1 | INFO | User started",
                "2023-02-27 14:09:05.635 | periodic-thread | INFO | Thread started",
                "2023-02-27 14:09:05.635 | User-1 | INFO | Start execute session no. 1 ...",
                "2023-02-27 14:09:05.924 | User-1 | INFO | ... End execute session no. 1 successful passed",
                "2023-02-27 14:09:05.975 | User-1 | INFO | User normal terminated",
                "2023-02-27 14:09:06.621 | main | INFO | [End of Test]"
              ]
            }
          ]
        }
      ]
    }
  },
  "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 testjobs.

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

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
}