Search code examples
load-testingartillery

In Artillery. How do I log ETIMEDOUT?


I have a test that gets an ETIMEDOUT error. I want to know which URL is giving the timeout. I have the following hook already

function logIfError(requestParams, response, context, ee, next) {
  if (response.statusCode !== 200 && response.statusCode !== 204) {
      console.error("%i %s", response.statusCode, response.url);
      if (response.statusCode >= 500) {
          console.log(response.headers['X-Trace-Id'])
      }
      if (response.statusCode >= 400) {
          console.log(response.rawBody.toString())
      }
  }
  next();
}

I added to my scenario

scenarios:
  - name: My Scenario
    afterResponse: logIfError

But I can't see any messages when it times out. There's a note in https://github.com/artilleryio/artillery/issues/437#issuecomment-371801777 that indicates an onError but it is not documented anywhere.

I tried to add it in like this

scenarios:
  - name: My Scenario
    afterResponse: logIfError
    onError: myOnErrorHandler

With my implementation as

function myOnErrorHandler(err, requestParams, context, events, callback) {
  console.log("ERR", err);
  return callback();
}

But again no output


Solution

  • I add the following processor

    function trapError(requestParams, context, ee, next) {
      if (!requestParams.hooks) {
        requestParams.hooks = {};
      }
      if (!requestParams.hooks.beforeError) {
        requestParams.hooks.beforeError = [];
      }
      requestParams.hooks.beforeError.push((error) => {
        if (error.name !== "HTTPError") {
          console.error(requestParams.url, error.name);
        }
        return error;
      });
      next();
    }
    

    And register it as follows

    scenarios:
      - name: My Scenario
        beforeRequest: trapError
    

    What this does is exploits the fact that it is using got which provides a beforeError hook