【问题标题】:How to include a JSON query in a batch request in k6如何在 k6 的批处理请求中包含 JSON 查询
【发布时间】:2020-08-31 18:19:11
【问题描述】:

我已经使用 k6 为我的应用程序创建了一个负载测试,并使用批处理请求来并行运行我的所有 url,但是,我的一些 url 是相同的,只是它们的 JSON 查询不同。如果我并行运行 url,它将发布或获取相同的确切数据,而无需查询来区分它们。有没有办法做到这一点?这是我的批处理请求示例。

group(' elasticsearch', function () {

      group(':8000', function () {

         let responses = http.batch([
            ['POST', 'http://10.1.11.2:8000'],
            ['POST', 'http://10.1.11.2:8000'],..........

这是我的 JSON 查询和其他标头信息的示例。

  response = http.post(

      "http://10.1.11.2:8000",

      '{"size":0,"query":{"bool":{"must":[],"must_not":[],"filter":[]}},"aggregations":{"1__cfgroup":{"terms":{"field":"measure_name","size":10000,"order":{"_term":"asc"}},"aggregations":{}}}}',

      {

        headers: {

          Host: "10.1.11.2:8000",

          Connection: "keep-alive",

          "User-Agent":

            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147 Safari/537.36",

          "content-type": "application/json",

          Accept: "*/*",

          Origin: "http://chart.com",

          Referer: "http://chart.com",

          "Accept-Encoding": "gzip, deflate",

          "Accept-Language": "en-US,en;q=0.9",

          "Content-Type": "application/json",

        },

      }

    );

 response = http.post(

      "http://10.1.11.2:8000",

      '{"size":0,"query":{"bool":{"must":[],"must_not":[],"filter":[]}},"aggregations":{"1__cfgroup":{"terms":{"field":"compliance_year","size":10000,"order":{"_term":"desc"}},"aggregations":{}}}}',

      {

        headers: {

          Host: "10.1.11.2:8000",

          Connection: "keep-alive",

          "User-Agent":

            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147 Safari/537.36",

          "content-type": "application/json",

          Accept: "*/*",

          Origin: "http://chart.com",

          Referer: "http://chart.com/",

          "Accept-Encoding": "gzip, deflate",

          "Accept-Language": "en-US,en;q=0.9",

          "Content-Type": "application/json",

        },

      }

    );

【问题讨论】:

    标签: javascript json k6


    【解决方案1】:

    我认为您想在 outputs 之一中区分它们。

    每个 HTTP 请求都会生成一堆metrics,每个指标都有tags。在您的情况下,我认为您可以只使用默认发出的method tag

    如果这还不够,您可以随时添加自己的自定义标签,或者为这个reason (and others) 添加name 标签,它通常等于url,但可以被覆盖。

    name 标记对于 k6 云 UI 具有特殊含义,它用于对请求进行分组,而不是 url,再次...因为您在此处遇到的特定情况。不过,您也可以将其用于任何其他输出。

    如果您希望在测试摘要结束时对它们进行分组,我认为您应该开始使用输出;),但是有一种方法可以让它工作,那就是创建一个阈值。

    import http from "k6/http";
    
    export let options = {
        thresholds: {
            'http_req_duration{method:GET}': ['p(90) < 1000'],
            'http_req_duration{method:POST}': ['p(90) < 1000'],
            'http_reqs{method:GET}': ['count < 1000'],
            'http_reqs{method:POST}': ['count < 1000'],
        },
    };
    
    export default function () {
        http.get('https://test.k6.io/');
        http.post('https://test.k6.io/');
        http.post('https://test.k6.io/');
    }
    
    
    running (00m00.8s), 0/1 VUs, 1 complete and 0 interrupted iterations
    default ✓ [======================================] 1 VUs  00m00.7s/10m0s  1/1 iters, 1 per VU
    
    
        data_received..............: 38 kB 49 kB/s
        data_sent..................: 951 B 1.2 kB/s
        http_req_blocked...........: avg=127.15ms min=5.72µs   med=6.14µs   max=381.46ms p(90)=305.16ms p(95)=343.31ms
        http_req_connecting........: avg=37.27ms  min=0s       med=0s       max=111.82ms p(90)=89.45ms  p(95)=100.64ms
        http_req_duration..........: avg=114.1ms  min=113.72ms med=113.9ms  max=114.68ms p(90)=114.53ms p(95)=114.61ms
        ✓ { method:GET }...........: avg=114.68ms min=114.68ms med=114.68ms max=114.68ms p(90)=114.68ms p(95)=114.68ms
        ✓ { method:POST }..........: avg=113.81ms min=113.72ms med=113.81ms max=113.9ms  p(90)=113.88ms p(95)=113.89ms
        http_req_receiving.........: avg=162.07µs min=132.62µs med=174.32µs max=179.28µs p(90)=178.29µs p(95)=178.78µs
        http_req_sending...........: avg=128.62µs min=44.28µs  med=44.83µs  max=296.75µs p(90)=246.37µs p(95)=271.56µs
        http_req_tls_handshaking...: avg=89.22ms  min=0s       med=0s       max=267.67ms p(90)=214.13ms p(95)=240.9ms
        http_req_waiting...........: avg=113.81ms min=113.5ms  med=113.72ms max=114.21ms p(90)=114.11ms p(95)=114.16ms
        http_reqs..................: 3     3.800233/s
        ✓ { method:GET }...........: 1     1.266744/s
        ✓ { method:POST }..........: 2     2.533488/s
        iteration_duration.........: avg=724.34ms min=724.34ms med=724.34ms max=724.34ms p(90)=724.34ms p(95)=724.34ms
        iterations.................: 1     1.266744/s
    

    如您所见,您需要为所需的每个指标/标签组合执行此操作,这会增加额外的计算复杂性,因为现在需要一直计算这些阈值。对于像这个例子这样的小用例,这很好,但如果你需要它来做更大的事情,使用an output 这样做会更好,而且用途广泛。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 2018-02-04
      • 2015-10-03
      • 2017-10-16
      • 2014-07-06
      • 2011-05-02
      • 2015-09-10
      相关资源
      最近更新 更多