1个不稳定版本

0.1.0 2019年6月23日

#16#周期

MIT 许可证

37KB
923

candia

Candia是历史上最长的围攻。在这里,它是一个负载测试工具,允许您将场景建模为每间隔发起的请求数

Candia不允许您构建复杂的漏斗,跟随用户的浏览模式,带有条件和复杂的场景。相反,它提供了控制在给定时间段内发起多少请求数的工具。为此,目前,您可以使用四种策略

  • 常量请求:对于每个时间段,candia将生成X个请求。
  • 阶梯常量请求:与常量请求相同,但允许您指定多个阶段,在每个阶段中增加和减少生成的请求数量。
  • 每周期翻倍:每段时间内生成的请求数量翻倍。
  • 斜坡:在两个界限之间线性增加一段时间内生成的请求数量。
  • 暂停:在一段时间内不发送任何请求。

对于每个生成的请求,都会从配置的上游中选择一个随机的请求规范。

配置

场景表示为以下配置文件

options:
  timeout: 5

schedulers:
  - kind: SteppedConstant
    steps:
      - duration: 30
        count: 10
        interval: 2
      - duration: 30
        count: 20
        interval: 2
  - kind: Pause
    args:
      duration: 5
  - kind: RampUp
    args:
      duration: 60
      from: 10
      to: 100
      interval: 5

upstreams:
  - name: example
    method: GET
    url: https://example.com/api/users/1
    headers:
      Accept: application/json
      Authorization: Bearer abcdefghijklmnopqrstuvwxyz

目前,仅支持GETPOST请求。

除了设置每个请求的超时时间外,timeout设置定义了当所有调度程序完成后,运行程序将等待多长时间,以等待可能尚未满足的请求。我们希望在将来实际上检查是否所有请求都已满足。

使用上游过滤

默认情况下,对于每个调度程序,每个请求都会从一个随机上游中选择。您可以使用上游过滤器将调度程序约束为使用一个或多个特定的上游。

schedulers:
  - kind: RampUp
    args:
      duration: 60
      from: 10
      to: 100
      interval: 5
    upstreams: ["upstream1", "upstream2"]

此调度程序将在upstream1upstream2之间随机选择一个上游,并且永远不会选择其他上游。

动态参数

您有权替换某些配置属性中的子字符串,从数据源中随机获取的数据种子。目前,您可以在url字符串header值正文中插值数据。目前,有两种检索数据的方法:从文本文件(每行一个值)和从配置中定义的静态数组。

每个数据源必须在配置的单独datasource部分中声明,包括用于字符串的标签,并用作{label}

可以使用以下方法检索数据

  • array:YAML数组中的每个项映射到池中的值。
  • 文件:每行映射到池中的一个值。
  • 目录:目录中的每个文件映射到池中的一个值。
upstreams:
  - method: GET
    url: https://{domain}/user?user={users}
    headers:
      Authorization: {users}
  - method: POST
    url: https://{domain}/user
    bodies: "{bodies}"

datasources:
  bodies:
    kind: directory
    source: /tmp/bodies
  domains:
    kind: array
    data:
      - example.net
      - api.example.net
  users:
    kind: file
    source: /tmp/users    

将来,这些插值器将在更多位置使用,并且将实现更多数据源(例如来自文件目录)。

检查配置

$ candia check config.yml
OPTIONS:
  - timeout: 5s

SCHEDULERS:
  - kind: RampUp
    ramp up requests every 1s from 1 to 100 for 15s
  
  - kind: Pause
    pause for 10s
  
  - kind: Constant
    100 requests every 5s for 10s

UPSTREAMS:
  - name: localhost
    GET http://127.0.0.1:8080/

运行场景

$ candia run config.yml
INFO: running batch with 1 requests over 1 seconds...
INFO: running batch with 7 requests over 1 seconds...
INFO: running batch with 14 requests over 1 seconds...
[...]
INFO: running batch with 86 requests over 1 seconds...
INFO: running batch with 93 requests over 1 seconds...
INFO: running batch with 100 requests over 1 seconds...

INFO: done.

STATISTICS:
  Requests count 801
  Success count: 801
    Error count: 0
   Success rate: 100.00%
           Mean: 17ms
      Std. dev.: 14ms
90th percentile: 34ms
95th percentile: 46ms
99th percentile: 69ms

查看和处理结果

run命令返回的简单统计数据的基础上,每个运行都会创建一个CSV日志文件,详细记录每个请求的执行情况,其名称为candia-YYYY-MM-DDTHH:MM:SS.log,如下所示

$ cat candia-2018-11-08T16:33:13.csv
Start offset,Request,State,Status code,Duration (ms)
1,GET http://127.1.1.1:8080/?user=user1,OK,200,8
1,GET http://127.0.0.1:8080/?user=user1,OK,200,28
1,GET http://127.0.0.1:8080/?user=user1,OK,200,9
2,GET http://127.1.1.1:8080/?user=user1,OK,200,21
2,GET http://127.0.0.1:8080/?user=user2,OK,200,25
2,GET http://127.0.0.1:8080/?user=user1,OK,200,14
2,GET http://127.0.0.1:8080/?user=user1,OK,200,24
3,GET http://127.1.1.1:8080/?user=user3,OK,200,14
3,GET http://127.1.1.1:8080/?user=user3,OK,200,24

依赖关系

~21–32MB
~554K SLoC