JSR223 Listener с одинаковым UUID для каждого запроса - PullRequest
0 голосов
/ 02 августа 2020

Контекст: Моя текущая структура запускает мой скрипт и отправляет сведения о результатах в Azure cosmosdb с идентификатором (который я генерирую с помощью функции JMeter) в качестве ключа раздела. Но для каждого запроса я получаю один и тот же UUID. Может ли кто-нибудь помочь в том, что мне здесь не хватает. Вот мой слушатель JSR223 с groovy скриптом,

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.util.EntityUtils;
import org.apache.jmeter.samplers.SampleResult;
import groovy.json.*

def payload = [:]
def uuid = '${__UUID}';
payload.put('id', uuid)
def testDetails = []
testDetails.add(['project_name': '${Project_Name}']);
testDetails.add(['test_Name': '${Test_Name}']);
testDetails.add(['test_id': '${test_Id}']);
testDetails.add(['test_executer':'${Test_Triggered_By}']);
payload.put('test_details', testDetails);
String status = 'Failure'; 
//def responseDetails = []


try {
    if (ctx.getPreviousResult().isSuccessful())
    {
        status = "Success";
        def responseDetails = []
        responseDetails.add(['requestName'   : ctx.getPreviousResult().getSampleLabel(),
                            'status'         : status,
                            'responseTime'   : ctx.getPreviousResult().getTime(),
                            'responsecode'   : ctx.getPreviousResult().getResponseCode(),
                            'sentBytes'      : ctx.getPreviousResult().getSentBytes(),
                            'receivedBytes'  : ctx.getPreviousResult().getBytesAsLong(),
                            'responseMessage': ctx.getPreviousResult().getResponseMessage(),
                            'samplecount'    : ctx.getPreviousResult().getSampleCount(),
                            'errorCount'     : ctx.getPreviousResult().getErrorCount(),
                            'time'           : ctx.getPreviousResult().getTimeStamp()])
        payload.put('response_Details', responseDetails)
        payload.put('thread_Details', ['number_vusers': ctx.getThreadGroup().getNumberOfThreads()])
        log.info(new groovy.json.JsonBuilder(payload).toPrettyString())
    }
    else 
    {
        log.info("Something is not correct, please check the values");
    }
 }
catch (Exception e) {
 log.error("Error in Grafana Metrics Listener : " +e );
}
    //Ignore the Auth token generator from sending the report to cosmos db
    if(sampleResult.getSampleLabel().equals("JSR223 Sampler"))
        {}
    else 
      {PostMeasurement(new JsonBuilder(payload).toPrettyString());}
//post the result to influxdb
void PostMeasurement(String Metrics) {
 def httpclient = new DefaultHttpClient(new BasicHttpParams());
 def httpPost = new HttpPost();
    httpPost.setURI(new URI(vars.get("CosmosDB_API")));
    httpPost.setEntity(new StringEntity(Metrics));
    httpPost.addHeader("Accept" , "application/json");
    httpPost.addHeader("x-ms-version" , "2016-07-11");
    httpPost.addHeader("Authorization" , '${auth}'); //AuthToken for cosmosdb 
    httpPost.addHeader("x-ms-date" , '${RFC1123time}');
    HttpResponse response = httpclient.execute(httpPost);
    EntityUtils.consumeQuietly(response.getEntity());
}

пример полезной нагрузки,

2020-08-02 10:48:51,787 INFO o.a.j.e.StandardJMeterEngine: Running the test!
2020-08-02 10:48:51,787 INFO o.a.j.s.SampleEvent: List of sample_variables: []
2020-08-02 10:48:51,788 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, *local*)
2020-08-02 10:48:52,412 INFO o.a.j.v.J.Request Sender To Cosmos DB: {
    "id": "d3055bf8-3b33-4ff8-9a9e-59fbb9bef729",
    "test_details": [
        {
            "project_name": "APIM"
        },
        {
            "test_Name": "SimpleLoadTest"
        },
        {
            "test_id": "LoadTest02"
        },
        {
            "test_executer": "Administrator"
        }
    ],
    "response_Details": [
        {
            "requestName": "JSR223 Sampler",
            "status": "Success",
            "responseTime": 264,
            "responsecode": "200",
            "sentBytes": 0,
            "receivedBytes": 0,
            "responseMessage": "OK",
            "samplecount": 1,
            "errorCount": 0,
            "time": 1596345532124
        }
    ],
    "thread_Details": {
        "number_vusers": 1
    }
}
2020-08-02 10:48:54,629 INFO o.a.j.v.J.Request Sender To Cosmos DB: {
    "id": "d3055bf8-3b33-4ff8-9a9e-59fbb9bef729",
    "test_details": [
        {
            "project_name": "APIM"
        },
        {
            "test_Name": "SimpleLoadTest"
        },
        {
            "test_id": "LoadTest02"
        },
        {
            "test_executer": "Administrator"
        }
    ],
    "response_Details": [
        {
            "requestName": "T01_Generate_Bearer_Token",
            "status": "Success",
            "responseTime": 2188,
            "responsecode": "200",
            "sentBytes": 642,
            "receivedBytes": 4349,
            "responseMessage": "OK",
            "samplecount": 1,
            "errorCount": 0,
            "time": 1596345532440
        }
    ],
    "thread_Details": {
        "number_vusers": 1
    }
}
2020-08-02 10:48:58,423 INFO o.a.j.v.J.Request Sender To Cosmos DB: {
    "id": "d3055bf8-3b33-4ff8-9a9e-59fbb9bef729",
    "test_details": [
        {
            "project_name": "APIM"
        },
        {
            "test_Name": "SimpleLoadTest"
        },
        {
            "test_id": "LoadTest02"
        },
        {
            "test_executer": "Administrator"
        }
    ],
    "response_Details": [
        {
            "requestName": "T01_Generate_Bearer_Token",
            "status": "Success",
            "responseTime": 2021,
            "responsecode": "200",
            "sentBytes": 640,
            "receivedBytes": 4202,
            "responseMessage": "OK",
            "samplecount": 1,
            "errorCount": 0,
            "time": 1596345536400
        }
    ],
    "thread_Details": {
        "number_vusers": 1
    }
}
2020-08-02 10:49:03,132 INFO o.a.j.v.J.Request Sender To Cosmos DB: {
    "id": "d3055bf8-3b33-4ff8-9a9e-59fbb9bef729",
    "test_details": [
        {
            "project_name": "APIM"
        },
        {
            "test_Name": "SimpleLoadTest"
        },
        {
            "test_id": "LoadTest02"
        },
        {
            "test_executer": "Administrator"
        }
    ],
    "response_Details": [
        {
            "requestName": "T02_Retrieve_Country_Details",
            "status": "Success",
            "responseTime": 3250,
            "responsecode": "200",
            "sentBytes": 1750,
            "receivedBytes": 269674,
            "responseMessage": "OK",
            "samplecount": 1,
            "errorCount": 0,
            "time": 1596345539880
        }
    ],
    "thread_Details": {
        "number_vusers": 1
    }
}
2020-08-02 10:49:06,003 INFO o.a.j.v.J.Request Sender To Cosmos DB: {
    "id": "d3055bf8-3b33-4ff8-9a9e-59fbb9bef729",
    "test_details": [
        {
            "project_name": "APIM"
        },
        {
            "test_Name": "SimpleLoadTest"
        },
        {
            "test_id": "LoadTest02"
        },
        {
            "test_executer": "Administrator"
        }
    ],
    "response_Details": [
        {
            "requestName": "T04_Add_New_Country",
            "status": "Success",
            "responseTime": 1369,
            "responsecode": "200",
            "sentBytes": 1948,
            "receivedBytes": 537,
            "responseMessage": "OK",
            "samplecount": 1,
            "errorCount": 0,
            "time": 1596345544633
        }
    ],
    "thread_Details": {
        "number_vusers": 1
    }
}
2020-08-02 10:49:08,869 INFO o.a.j.v.J.Request Sender To Cosmos DB: {
    "id": "d3055bf8-3b33-4ff8-9a9e-59fbb9bef729",
    "test_details": [
        {
            "project_name": "APIM"
        },
        {
            "test_Name": "SimpleLoadTest"
        },
        {
            "test_id": "LoadTest02"
        },
        {
            "test_executer": "Administrator"
        }
    ],
    "response_Details": [
        {
            "requestName": "T01_Generate_Bearer_Token",
            "status": "Success",
            "responseTime": 1351,
            "responsecode": "200",
            "sentBytes": 647,
            "receivedBytes": 4397,
            "responseMessage": "OK",
            "samplecount": 1,
            "errorCount": 0,
            "time": 1596345547518
        }
    ],
    "thread_Details": {
        "number_vusers": 1
    }
}
2020-08-02 10:49:11,741 INFO o.a.j.v.J.Request Sender To Cosmos DB: {
    "id": "d3055bf8-3b33-4ff8-9a9e-59fbb9bef729",
    "test_details": [
        {
            "project_name": "APIM"
        },
        {
            "test_Name": "SimpleLoadTest"
        },
        {
            "test_id": "LoadTest02"
        },
        {
            "test_executer": "Administrator"
        }
    ],
    "response_Details": [
        {
            "requestName": "T03_Retrieve_Any_Random_Country_Details",
            "status": "Success",
            "responseTime": 1427,
            "responsecode": "200",
            "sentBytes": 1830,
            "receivedBytes": 544,
            "responseMessage": "OK",
            "samplecount": 1,
            "errorCount": 0,
            "time": 1596345550311
        }
    ],
    "thread_Details": {
        "number_vusers": 1
    }
}
2020-08-02 10:49:13,210 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test
2020-08-02 10:49:13,210 INFO o.a.j.g.u.JMeterMenuBar: setRunning(false, *local*)

** Все идентификаторы в полезной нагрузке такие же, чего мне здесь не хватает

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Не встраивать функции или переменные JMeter в сценарии JSR223 согласно документации :

У тестовых элементов JSR223 есть особенность (компиляция) что может значительно повысить производительность. Чтобы воспользоваться этой функцией:

Используйте файлы сценариев вместо их встраивания. Это заставит JMeter скомпилировать их, если эта функция доступна в ScriptEngine, и кэшировать их.

Или использовать текст сценария и проверить свойство Кэшировать скомпилированный сценарий, если доступно.

When using this feature, ensure your script code does not use JMeter variables or JMeter function calls directly in script code as caching would only cache first replacement. Instead use script parameters.

Более того, ваш подход может конфликтовать с Groovy механизмом шаблонов Gstring

Поэтому измените эту строку:

def uuid = '${__UUID}';

на эту:

def uuid = UUID.randomUUID().toString()

Образец для "testDetails"

testDetails.add(['project_name': vars.get('Project_Name')]);
testDetails.add(['test_Name': vars.get('Test_Name')]);
testDetails.add(['test_id': vars.get('test_Id')]);
testDetails.add(['test_executer':vars.get('Test_Triggered_By')]);

Дополнительная информация: Apache Groovy - Почему и как вы должны его использовать

1 голос
/ 02 августа 2020

Это из-за атрибута Cache compiled script if available, который вы отметили как да.

checked

unchecked

Using variable and function, with a Dollar sign is not great practise, I prefer vars.get("variableName") to get variable value.

You can pass the Jmeter function as an argument and access those as argument as shown below:

Хороший способ

...