index.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { randomSeed, check } from 'k6';
  2. import http from 'k6/http';
  3. import { SharedArray } from 'k6/data';
  4. import exec from 'k6/execution';
  5. import { Trend } from 'k6/metrics';
  6. export let options = {
  7. discardResponseBodies: true,
  8. noConnectionReuse: false,
  9. vus: 20,
  10. iterations: 10000,
  11. };
  12. randomSeed(42)
  13. const urls = new SharedArray('urls', function () {
  14. const urls_path = __ENV.URLS_PATH || './urls.json'
  15. let data = JSON.parse(open(urls_path));
  16. const groups = (__ENV.URL_GROUPS || "").split(",").filter((g) => g != "")
  17. if (groups.length > 0) {
  18. data = data.filter((d) => groups.includes(d.group))
  19. }
  20. const url_prefix = __ENV.URL_PREFIX || "http://localhost:8082/unsafe"
  21. let unshuffled = [];
  22. data.forEach((e) => {
  23. let url = url_prefix + e.url
  24. let weight = e.weight || 1
  25. for (var i = 0; i < weight; i++) {
  26. unshuffled.push({url, group: e.group})
  27. }
  28. })
  29. let shuffled = unshuffled
  30. .map(value => ({ value, sort: Math.random() }))
  31. .sort((a, b) => a.sort - b.sort)
  32. .map(({ value }) => value)
  33. return shuffled;
  34. });
  35. if (urls.length == 0) {
  36. throw "URLs list is empty"
  37. }
  38. let group_durations = [...new Set(urls.map(url => url.group))]
  39. .reduce((trends, group) => {
  40. trends[group] = new Trend(`http_req_duration_${group}`, true);
  41. return trends;
  42. }, {});
  43. let group_sizes = [...new Set(urls.map(url => url.group))]
  44. .reduce((trends, group) => {
  45. trends[group] = new Trend(`http_res_body_size_${group}`, false);
  46. return trends;
  47. }, {});
  48. export default function() {
  49. const url = urls[exec.scenario.iterationInTest % urls.length]
  50. const res = http.get(url.url);
  51. check(res, {
  52. 'is status 200': (r) => r.status === 200,
  53. });
  54. group_durations[url.group].add(res.timings.duration);
  55. const body_size = Math.round(parseInt(res.headers["Content-Length"]) / 10.24) / 100;
  56. if (!isNaN(body_size)) group_sizes[url.group].add(body_size);
  57. }