locust 2.27.0__py3-none-any.whl → 2.27.1.dev7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- locust/_version.py +2 -2
- locust/argument_parser.py +1 -1
- locust/env.py +0 -2
- locust/html.py +37 -83
- locust/main.py +8 -12
- locust/stats.py +3 -10
- locust/test/test_fasthttp.py +6 -4
- locust/test/test_main.py +6 -15
- locust/test/test_web.py +53 -199
- locust/web.py +18 -56
- {locust-2.27.0.dist-info → locust-2.27.1.dev7.dist-info}/METADATA +1 -1
- {locust-2.27.0.dist-info → locust-2.27.1.dev7.dist-info}/RECORD +16 -41
- locust/static/chart.js +0 -133
- locust/static/css/application.css +0 -491
- locust/static/css/application.css.map +0 -1
- locust/static/css/tables.css +0 -74
- locust/static/css/tables.css.map +0 -1
- locust/static/echarts.common.min.js +0 -22
- locust/static/img/favicon.ico +0 -0
- locust/static/img/logo.png +0 -0
- locust/static/img/ui-screenshot-charts.png +0 -0
- locust/static/img/ui-screenshot-start-test.png +0 -0
- locust/static/img/ui-screenshot-stats.png +0 -0
- locust/static/img/ui-screenshot-workers.png +0 -0
- locust/static/jquery-1.11.3.min.js +0 -5
- locust/static/jquery.jqote2.min.js +0 -14
- locust/static/jquery.tools.min.js +0 -17
- locust/static/locust.js +0 -324
- locust/static/sass/_base.sass +0 -27
- locust/static/sass/_mixins.sass +0 -3
- locust/static/sass/application.sass +0 -320
- locust/static/sass/tables.sass +0 -61
- locust/static/tasks.js +0 -48
- locust/static/vintage.js +0 -35
- locust/templates/index.html +0 -370
- locust/templates/report.html +0 -265
- locust/templates/stats_data.html +0 -10
- {locust-2.27.0.dist-info → locust-2.27.1.dev7.dist-info}/LICENSE +0 -0
- {locust-2.27.0.dist-info → locust-2.27.1.dev7.dist-info}/WHEEL +0 -0
- {locust-2.27.0.dist-info → locust-2.27.1.dev7.dist-info}/entry_points.txt +0 -0
- {locust-2.27.0.dist-info → locust-2.27.1.dev7.dist-info}/top_level.txt +0 -0
locust/static/sass/tables.sass
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
@import "mixins"
|
2
|
-
|
3
|
-
table.stats
|
4
|
-
width: 100%
|
5
|
-
border-radius: 3px
|
6
|
-
border: 2px solid #11251c
|
7
|
-
border-spacing: 0
|
8
|
-
margin-bottom: 30px
|
9
|
-
|
10
|
-
thead
|
11
|
-
|
12
|
-
padding: 0
|
13
|
-
margin: 0
|
14
|
-
color: #a9c5ba
|
15
|
-
|
16
|
-
tr
|
17
|
-
background: #11251c
|
18
|
-
&:nth-child(even)
|
19
|
-
background: #11251c
|
20
|
-
&:hover
|
21
|
-
background: #11251c
|
22
|
-
th
|
23
|
-
font-weight: bold
|
24
|
-
cursor: default
|
25
|
-
&.nowrap
|
26
|
-
white-space: nowrap
|
27
|
-
&[data-sortkey]
|
28
|
-
cursor: pointer
|
29
|
-
tr
|
30
|
-
&:hover
|
31
|
-
background: #1d4434
|
32
|
-
|
33
|
-
td, th
|
34
|
-
padding: 10px
|
35
|
-
margin: 0
|
36
|
-
text-align: left
|
37
|
-
|
38
|
-
&:first-child
|
39
|
-
padding-left: 16px
|
40
|
-
&:last-child
|
41
|
-
padding-right: 16px
|
42
|
-
|
43
|
-
&.numeric
|
44
|
-
text-align: right
|
45
|
-
td
|
46
|
-
max-width: 450px
|
47
|
-
overflow: hidden
|
48
|
-
word-wrap: break-word
|
49
|
-
white-space: no-wrap
|
50
|
-
text-overflow: ellipsis
|
51
|
-
+max-width(1100px)
|
52
|
-
max-width: 350px
|
53
|
-
|
54
|
-
&:nth-child(even)
|
55
|
-
background: #153126
|
56
|
-
&:hover
|
57
|
-
background: #1d4434
|
58
|
-
&.total
|
59
|
-
background: #11251c
|
60
|
-
td
|
61
|
-
font-weight: bold
|
locust/static/tasks.js
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
function getRatioPercent(ratio) {
|
2
|
-
return (ratio * 100).toFixed(1) + "%";
|
3
|
-
}
|
4
|
-
|
5
|
-
function _initTasks_sub(li, tasks) {
|
6
|
-
if (tasks) {
|
7
|
-
var ul = $('<ul></ul>');
|
8
|
-
for (const [key, task] of Object.entries(tasks)) {
|
9
|
-
var liTask = $('<li></li>').text(getRatioPercent(task.ratio) + " " + key);
|
10
|
-
_initTasks_sub(liTask, task.tasks);
|
11
|
-
ul.append(liTask);
|
12
|
-
}
|
13
|
-
li.append(ul);
|
14
|
-
}
|
15
|
-
}
|
16
|
-
|
17
|
-
function _getTasks_div(root, title) {
|
18
|
-
var taskDiv = $('<div></div>');
|
19
|
-
var taskDivHeading = $('<h3></h3>').text(title);
|
20
|
-
taskDiv.append(taskDivHeading);
|
21
|
-
var ulClasses = $('<ul></ul>');
|
22
|
-
for (const [key, clazz] of Object.entries(root)) {
|
23
|
-
var liClass = $('<li></li>').text(getRatioPercent(clazz.ratio) + " " + key);
|
24
|
-
_initTasks_sub(liClass, clazz.tasks)
|
25
|
-
ulClasses.append(liClass);
|
26
|
-
}
|
27
|
-
taskDiv.append(ulClasses);
|
28
|
-
return taskDiv
|
29
|
-
}
|
30
|
-
|
31
|
-
function _renderTasks(data) {
|
32
|
-
var tasks = $('#tasks .tasks');
|
33
|
-
tasks.empty();
|
34
|
-
tasks.append(_getTasks_div(data.per_class, 'Ratio per User class'));
|
35
|
-
tasks.append(_getTasks_div(data.total, 'Total ratio'));
|
36
|
-
}
|
37
|
-
|
38
|
-
function fillTasksFromObj() {
|
39
|
-
var tasks = $('#tasks .tasks')
|
40
|
-
var data = tasks.data('tasks');
|
41
|
-
_renderTasks(data)
|
42
|
-
}
|
43
|
-
|
44
|
-
function fillTasksFromRequest() {
|
45
|
-
$.get('./tasks', function (data) {
|
46
|
-
_renderTasks(data)
|
47
|
-
});
|
48
|
-
}
|
locust/static/vintage.js
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
(function (root, factory) {
|
2
|
-
if (typeof define === 'function' && define.amd) {
|
3
|
-
// AMD. Register as an anonymous module.
|
4
|
-
define(['exports', 'echarts'], factory);
|
5
|
-
} else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
|
6
|
-
// CommonJS
|
7
|
-
factory(exports, require('echarts'));
|
8
|
-
} else {
|
9
|
-
// Browser globals
|
10
|
-
factory({}, root.echarts);
|
11
|
-
}
|
12
|
-
}(this, function (exports, echarts) {
|
13
|
-
var log = function (msg) {
|
14
|
-
if (typeof console !== 'undefined') {
|
15
|
-
console && console.error && console.error(msg);
|
16
|
-
}
|
17
|
-
};
|
18
|
-
if (!echarts) {
|
19
|
-
log('ECharts is not Loaded');
|
20
|
-
return;
|
21
|
-
}
|
22
|
-
var colorPalette = ['#00ca5a','#ffca5a', '#d7ab82', '#6e7074','#61a0a8','#efa18d', '#787464', '#cc7e63', '#724e58', '#4b565b'];
|
23
|
-
echarts.registerTheme('vintage', {
|
24
|
-
color: colorPalette,
|
25
|
-
backgroundColor: '#132b21',
|
26
|
-
xAxis: {lineColor: "#f00"},
|
27
|
-
graph: {
|
28
|
-
color: colorPalette,
|
29
|
-
},
|
30
|
-
textStyle: {color:"#b3c3bc"},
|
31
|
-
title: {
|
32
|
-
textStyle:{color:"#b3c3bc"}
|
33
|
-
},
|
34
|
-
});
|
35
|
-
}));
|
locust/templates/index.html
DELETED
@@ -1,370 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>Locust for {{ locustfile }}</title>
|
5
|
-
<link rel="stylesheet" type="text/css" href="./static/css/application.css?v={{ version }}" media="screen">
|
6
|
-
<link rel="shortcut icon" href="./static/img/favicon.ico" type="image/x-icon"/>
|
7
|
-
{% block extended_head %}
|
8
|
-
{% endblock extended_head %}
|
9
|
-
</head>
|
10
|
-
<body class="{{state}}">
|
11
|
-
<div class="top">
|
12
|
-
<div class="top-content container">
|
13
|
-
<img src="./static/img/logo.png?v={{ version }}" class="logo" />
|
14
|
-
<div class="boxes">
|
15
|
-
<div class="top_box box_url">
|
16
|
-
<div class="label">HOST</div>
|
17
|
-
<div class="value" id="host_url">
|
18
|
-
<a id="host_url_link" href="" target="_blank"><span id="host_url_link_value">{{host}}</span></a>
|
19
|
-
</div>
|
20
|
-
</div>
|
21
|
-
<div class="top_box box_status">
|
22
|
-
<div class="label">STATUS</div>
|
23
|
-
<div class="value" id="status_text">
|
24
|
-
{{state}}
|
25
|
-
</div>
|
26
|
-
<div class="user_count">
|
27
|
-
<span id="userCount">{{user_count}}</span> users
|
28
|
-
</div>
|
29
|
-
<a href="#" class="new-test" id="new-test">New test</a>
|
30
|
-
<a href="#" class="edit-test" id="edit-test">Edit</a>
|
31
|
-
</div>
|
32
|
-
{% if is_distributed %}
|
33
|
-
<div class="top_box box_workers" id="box_workers">
|
34
|
-
<div class="label">WORKERS</div>
|
35
|
-
<div class="value" id="workerCount">{{worker_count}}</div>
|
36
|
-
</div>
|
37
|
-
{% endif %}
|
38
|
-
<div class="top_box box_rps box_running" id="box_rps">
|
39
|
-
<div class="label">RPS</div>
|
40
|
-
<div class="value" id="total_rps">0</div>
|
41
|
-
</div>
|
42
|
-
<div class="top_box box_fail box_running" id="box_fail">
|
43
|
-
<div class="label">FAILURES</div>
|
44
|
-
<div class="value"><span id="fail_ratio"></span>%</div>
|
45
|
-
</div>
|
46
|
-
<div class="top_box box_stop box_running" id="box_stop">
|
47
|
-
<a href="./stop" class="stop-button"><i></i>STOP</a>
|
48
|
-
<a href="./stats/reset" class="reset-button">Reset<br>Stats</a>
|
49
|
-
</div>
|
50
|
-
</div>
|
51
|
-
<div style="clear:both;"></div>
|
52
|
-
</div>
|
53
|
-
</div>
|
54
|
-
<div class="dialogs">
|
55
|
-
<div class="dialog start" id="start">
|
56
|
-
<div style="position:relative;">
|
57
|
-
<a href="#" class="close_link">Close</a>
|
58
|
-
</div>
|
59
|
-
<div class="padder">
|
60
|
-
<h2>Start new load test</h2>
|
61
|
-
<form action="./swarm" method="POST" id="swarm_form">
|
62
|
-
{% if show_userclass_picker %}
|
63
|
-
<label for="available_user_classes">UserClasses </label>
|
64
|
-
<select multiple name="user_classes" id="user-classes" class="userClass">
|
65
|
-
{% for user in available_user_classes %}
|
66
|
-
<option value="{{user}}" selected>{{user}}</option>
|
67
|
-
{% endfor %}
|
68
|
-
</select><br>
|
69
|
-
<label for="available_shape_classes">ShapeClass </label>
|
70
|
-
<select name="shape_class" id="shape-classes" class="shapeClass">
|
71
|
-
{% for shape_class in available_shape_classes %}
|
72
|
-
<option value="{{shape_class}}">{{shape_class}}</option>
|
73
|
-
{% endfor %}
|
74
|
-
</select><br>
|
75
|
-
{% endif %}
|
76
|
-
{% if hide_common_options %}
|
77
|
-
<label for="user_count">Number of users <span style="color:#8a8a8a;">(peak concurrency)</span></label>
|
78
|
-
<input type="text" name="user_count" id="user_count" class="val_disabled" value="-" disabled="disabled" title="Disabled for tests using LoadTestShape class"/><br>
|
79
|
-
<input type="hidden" name="user_count" id="user_count" value="0"/><br>
|
80
|
-
<label for="spawn_rate">Spawn rate <span style="color:#8a8a8a;">(users started/second)</span></label>
|
81
|
-
<input type="text" name="spawn_rate" id="spawn_rate" class="val_disabled" value="-" disabled="disabled" title="Disabled for tests using LoadTestShape class"/><br>
|
82
|
-
<input type="hidden" name="spawn_rate" id="spawn_rate" value="0"/><br>
|
83
|
-
{% else %}
|
84
|
-
<label for="user_count">Number of users <span style="color:#8a8a8a;">(peak concurrency)</span></label>
|
85
|
-
<input type="text" name="user_count" id="user_count" class="val" value="{{ num_users or "1" }}" onfocus="this.select()"/><br>
|
86
|
-
<label for="spawn_rate">Spawn rate <span style="color:#8a8a8a;">(users started/second)</span></label>
|
87
|
-
<input type="text" name="spawn_rate" id="spawn_rate" class="val" value="{{ spawn_rate or "1" }}" onfocus="this.select()"/><br>
|
88
|
-
{% endif %}
|
89
|
-
<label for="host">
|
90
|
-
Host <span style="color:#8a8a8a;">(e.g. http://www.example.com)</span>
|
91
|
-
{% if override_host_warning %}
|
92
|
-
<span style="color:#8a8a8a; font-size:12px;">(setting this will override the host on all User classes)</span>
|
93
|
-
{% endif %}
|
94
|
-
</label>
|
95
|
-
<input type="text" name="host" id="host" class="val" autocapitalize="off" autocorrect="off" value="{{ host or "" }}" onfocus="this.select()"/><br>
|
96
|
-
<a href="#" onclick="$('.advancedOptions').toggle();">Advanced options</a>
|
97
|
-
<div class="advancedOptions" style="display:none">
|
98
|
-
<label for="run_time">
|
99
|
-
Run time
|
100
|
-
<span style="color:#8a8a8a;">(e.g. 20, 20s, 3m, 2h, 1h20m, 3h30m10s, etc.)</span>
|
101
|
-
</label>
|
102
|
-
<input type="text" name="run_time" id="run_time" class="val" value="{{ run_time or "" }}" onfocus="this.select()"/><br>
|
103
|
-
</div>
|
104
|
-
{% if extra_options %}<label>Custom parameters:</label>{% endif %}
|
105
|
-
{% for key, value in extra_options.items() %}
|
106
|
-
{% if not ((value.default_value is none) or (value.default_value is boolean)) %}
|
107
|
-
<label for="{{key}}">
|
108
|
-
{{key.replace('_', ' ').capitalize()}}
|
109
|
-
{% if value.help_text %}
|
110
|
-
<span style="color:#8a8a8a;">({{value.help_text}})</span>
|
111
|
-
{% endif %}
|
112
|
-
</label>
|
113
|
-
{% if value.choices %}
|
114
|
-
<select name="{{key}}" id="{{key}}" class="val">
|
115
|
-
{% for choice in value.choices %}
|
116
|
-
<option value="{{choice}}" {% if choice == value.default_value %}selected{% endif %}>{{choice}}</option>
|
117
|
-
{% endfor %}
|
118
|
-
</select><br>
|
119
|
-
{% else %}
|
120
|
-
<input type="{{'password' if value.is_secret else 'text'}}" name="{{key}}" id="{{key}}" class="val" value="{{value.default_value}}" /><br>
|
121
|
-
{% endif %}
|
122
|
-
{% endif %}
|
123
|
-
{% endfor %}
|
124
|
-
{% set glob={'header_printed': False} %}
|
125
|
-
{% for key, value in extra_options.items() %}
|
126
|
-
{% if (value.default_value is none) or (value.default_value is boolean) %}
|
127
|
-
{% if not glob.header_printed %}
|
128
|
-
The following custom parameters can't be set in the Web UI, because it is a boolean or None type:<br>
|
129
|
-
{% set _ = glob.update({'header_printed':True}) %}
|
130
|
-
{% endif %}
|
131
|
-
{{key}}<br>
|
132
|
-
{% endif %}
|
133
|
-
{% endfor %}
|
134
|
-
<button type="submit">Start</button>
|
135
|
-
</form>
|
136
|
-
<div style="clear:right;margin-bottom: 60px;"></div>
|
137
|
-
</div>
|
138
|
-
</div>
|
139
|
-
|
140
|
-
<div class="dialog edit" id="edit">
|
141
|
-
<div style="position:relative;">
|
142
|
-
<a href="#" class="close_link">Close</a>
|
143
|
-
</div>
|
144
|
-
<div class="padder">
|
145
|
-
<h2>Edit running load test</h2>
|
146
|
-
<form action="./swarm" method="POST" id="edit_form">
|
147
|
-
{% if hide_common_options %}
|
148
|
-
<label for="new_user_count">Number of users (peak concurrency)</label>
|
149
|
-
<input type="text" name="user_count" id="new_user_count" class="val_disabled" value="-" disabled="disabled" title="Disabled for tests using LoadTestShape class"/><br>
|
150
|
-
<label for="spawn_rate">Spawn rate <span style="color:#8a8a8a;">(users added/stopped per second)</span></label>
|
151
|
-
<input type="text" name="spawn_rate" id="new_spawn_rate" class="val_disabled" value="-" disabled="disabled" title="Disabled for tests using LoadTestShape class"/><br>
|
152
|
-
{% else %}
|
153
|
-
<label for="new_user_count">Number of users (peak concurrency)</label>
|
154
|
-
<input type="text" name="user_count" id="new_user_count" class="val" value="{{ num_users or "1" }}" onfocus="this.select()"/><br>
|
155
|
-
<label for="spawn_rate">Spawn rate <span style="color:#8a8a8a;">(users added/stopped per second)</span></label>
|
156
|
-
<input type="text" name="spawn_rate" id="new_spawn_rate" class="val" value="{{ spawn_rate or "1" }}" onfocus="this.select()"/><br>
|
157
|
-
{% endif %}
|
158
|
-
{% if hide_common_options %}
|
159
|
-
<button type="submit" disabled>Start</button>
|
160
|
-
{% else %}
|
161
|
-
<button type="submit">Start</button>
|
162
|
-
{% endif %}
|
163
|
-
</form>
|
164
|
-
<div style="clear:right;"></div>
|
165
|
-
</div>
|
166
|
-
</div>
|
167
|
-
</div>
|
168
|
-
|
169
|
-
<div class="main" id="main">
|
170
|
-
<nav class="menu">
|
171
|
-
<ul class="tabs container">
|
172
|
-
<li><a href="#">Statistics</a></li>
|
173
|
-
<li><a href="#" class="chart-tab-link">Charts</a></li>
|
174
|
-
<li><a href="#">Failures</a></li>
|
175
|
-
<li><a href="#">Exceptions</a></li>
|
176
|
-
<li><a href="#">Current ratio</a></li>
|
177
|
-
<li><a href="#">Download Data</a></li>
|
178
|
-
{% if is_distributed %}
|
179
|
-
<li><a href="#">Workers</a></li>
|
180
|
-
{% endif %}
|
181
|
-
{% block extended_tabs %}{% endblock extended_tabs %}
|
182
|
-
</ul>
|
183
|
-
</nav>
|
184
|
-
<div class="panes container">
|
185
|
-
<div style="display:none;">
|
186
|
-
<table id="stats" class="stats">
|
187
|
-
<thead>
|
188
|
-
<tr>
|
189
|
-
<th class="stats_label" href="#" data-sortkey="method">Type</th>
|
190
|
-
<th class="stats_label" href="#" data-sortkey="name">Name</th>
|
191
|
-
<th class="stats_label numeric nowrap" href="#" data-sortkey="num_requests" title="Number of requests"># Requests</th>
|
192
|
-
<th class="stats_label numeric nowrap" href="#" data-sortkey="num_failures" title="Number of failures"># Fails</th>
|
193
|
-
<th class="stats_label numeric" href="#" data-sortkey="median_response_time" title="Median response time">Median (ms)</th>
|
194
|
-
<th class="stats_label numeric" href="#" data-sortkey="ninetieth_response_time" title="Ninetieth percentile response time, because the response time greater than 100ms is rounded, you may see it greater than the max response time">90%ile (ms)</th>
|
195
|
-
<th class="stats_label numeric" href="#" data-sortkey="ninety_ninth_response_time"
|
196
|
-
title="Ninety-ninth percentile response time, because the response time greater than 100ms is rounded, you may see it greater than the max response time">
|
197
|
-
99%ile (ms)</th>
|
198
|
-
<th class="stats_label numeric" href="#" data-sortkey="avg_response_time" title="Average response time">Average (ms)</th>
|
199
|
-
<th class="stats_label numeric" href="#" data-sortkey="min_response_time" title="Min response time">Min (ms)</th>
|
200
|
-
<th class="stats_label numeric" href="#" data-sortkey="max_response_time" title="Max response time">Max (ms)</th>
|
201
|
-
<th class="stats_label numeric" href="#" data-sortkey="avg_content_length" title="Average response size">Average size (bytes)</th>
|
202
|
-
<th class="stats_label numeric" href="#" data-sortkey="current_rps" title="Current number of requests per second">Current RPS</th>
|
203
|
-
<th class="stats_label numeric" href="#" data-sortkey="current_fail_per_sec" title="Current number of failures per second">Current Failures/s</th>
|
204
|
-
</tr>
|
205
|
-
</thead>
|
206
|
-
<tbody>
|
207
|
-
</tbody>
|
208
|
-
</table>
|
209
|
-
</div>
|
210
|
-
<div id="charts" style="display:none;">
|
211
|
-
<div class="charts-container"></div>
|
212
|
-
</div>
|
213
|
-
<div style="display:none;">
|
214
|
-
<table id="errors" class="stats">
|
215
|
-
<thead>
|
216
|
-
<th class="error_count stats_label" data-sortkey="occurrences"># fails</th>
|
217
|
-
<th class="stats_label" href="#" data-sortkey="method">Method</th>
|
218
|
-
<th class="stats_label" href="#" data-sortkey="name">Name</th>
|
219
|
-
<th class="error_type stats_label" data-sortkey="error">Type</th>
|
220
|
-
</thead>
|
221
|
-
<tbody>
|
222
|
-
</tbody>
|
223
|
-
</table>
|
224
|
-
</div>
|
225
|
-
<div style="display:none;">
|
226
|
-
<table id="exceptions" class="stats">
|
227
|
-
<thead>
|
228
|
-
<th class="exception_occurrences stats_label"># occurrences</th>
|
229
|
-
<th class="exception_traceback stats_label">Traceback</th>
|
230
|
-
</thead>
|
231
|
-
<tbody>
|
232
|
-
</tbody>
|
233
|
-
</table>
|
234
|
-
</div>
|
235
|
-
<div id="tasks" style="display:none;">
|
236
|
-
<p>Script: <span>{{ locustfile }}</span></p>
|
237
|
-
<div class="tasks" data-tasks="{{tasks}}"></div>
|
238
|
-
</div>
|
239
|
-
<div style="display:none;">
|
240
|
-
<div style="margin-top:20px;">
|
241
|
-
<a href="./stats/requests/csv">Download request statistics CSV</a><br>
|
242
|
-
{% if stats_history_enabled %}
|
243
|
-
<a href="./stats/requests_full_history/csv">Download full request statistics history CSV</a><br>
|
244
|
-
{% endif %}
|
245
|
-
<a href="./stats/failures/csv">Download failures CSV</a><br>
|
246
|
-
<a href="./exceptions/csv">Download exceptions CSV</a><br>
|
247
|
-
<a href="./stats/report" target="_blank">Download Report</a><br>
|
248
|
-
</div>
|
249
|
-
</div>
|
250
|
-
{% if is_distributed %}
|
251
|
-
<div style="display:none;">
|
252
|
-
<table class="stats" id="workers">
|
253
|
-
<thead>
|
254
|
-
<tr>
|
255
|
-
<th class="stats_label" href="#" data-sortkey="id">Worker</th>
|
256
|
-
<th class="stats_label" href="#" data-sortkey="state">State</th>
|
257
|
-
<th class="stats_label numeric" href="#" data-sortkey="user_count" title="Number of users on this worker"># users</th>
|
258
|
-
<th class="stats_label numeric" href="#" data-sortkey="cpu_usage" title="CPU usage of process">CPU usage</th>
|
259
|
-
<th class="stats_label numeric" href="#" data-sortkey="memory_usage" title="Memory usage of process">Memory usage</th>
|
260
|
-
</tr>
|
261
|
-
</thead>
|
262
|
-
<tbody>
|
263
|
-
</tbody>
|
264
|
-
</table>
|
265
|
-
</div>
|
266
|
-
{% endif %}
|
267
|
-
{% block extended_panes %}{% endblock extended_panes %}
|
268
|
-
</div>
|
269
|
-
</div>
|
270
|
-
<div class="about" style="display:none;">
|
271
|
-
<div style="position:relative;">
|
272
|
-
<a href="#" class="close_link">Close</a>
|
273
|
-
</div>
|
274
|
-
<div class="padder">
|
275
|
-
<h1>About</h1>
|
276
|
-
<h2>Authors and Copyright</h2>
|
277
|
-
<a href="https://github.com/heyman">Jonatan Heyman</a><br>
|
278
|
-
<a href="https://github.com/cyberw">Lars Holmberg</a><br>
|
279
|
-
<a href="https://github.com/andrewbaldwin44">Andrew Baldwin</a><br>
|
280
|
-
Carl Byström, Joakim Hamrén & Hugo Heyman<br>
|
281
|
-
Many thanks to our other great <a href="https://github.com/locustio/locust/graphs/contributors">contributors</a>!
|
282
|
-
<h2>Version <a href="https://github.com/locustio/locust/releases/tag/{{version}}">{{version}}</a></h2>
|
283
|
-
<h1>License</h1>
|
284
|
-
<a href="https://github.com/locustio/locust/blob/master/LICENSE">MIT license</a>
|
285
|
-
</div>
|
286
|
-
</div>
|
287
|
-
<nav class="footer">
|
288
|
-
<div class="container">
|
289
|
-
<a href="#" onclick="$('.about').fadeIn();">About</a>
|
290
|
-
</div>
|
291
|
-
</nav>
|
292
|
-
<script type="text/javascript" src="./static/jquery-1.11.3.min.js"></script>
|
293
|
-
<script type="text/javascript" src="./static/jquery.jqote2.min.js"></script>
|
294
|
-
<script type="text/javascript" src="./static/jquery.tools.min.js"></script>
|
295
|
-
<!-- echarts from https://github.com/ecomfe/echarts -->
|
296
|
-
<script type="text/javascript" src="./static/echarts.common.min.js"></script>
|
297
|
-
<!-- vintage theme of echarts -->
|
298
|
-
<script type="text/javascript" src="./static/vintage.js"></script>
|
299
|
-
<script type="text/x-jqote-template" id="stats-template">
|
300
|
-
<![CDATA[
|
301
|
-
<tr class="<%=(this.is_aggregated ? "total" : "")%>">
|
302
|
-
<td><%= (this.method ? this.method : "") %></td>
|
303
|
-
<td class="name" title="<%= this.name %>"><%= this.safe_name %></td>
|
304
|
-
<td class="numeric"><%= this.num_requests %></td>
|
305
|
-
<td class="numeric"><%= this.num_failures %></td>
|
306
|
-
<td class="numeric"><%= Math.round(this.median_response_time) %></td>
|
307
|
-
<td class="numeric"><%= Math.round(this.ninetieth_response_time) %></td>
|
308
|
-
<td class="numeric"><%= Math.round(this.ninety_ninth_response_time) %></td>
|
309
|
-
<td class="numeric"><%= Math.round(this.avg_response_time) %></td>
|
310
|
-
<td class="numeric"><%= this.min_response_time %></td>
|
311
|
-
<td class="numeric"><%= this.max_response_time %></td>
|
312
|
-
<td class="numeric"><%= Math.round(this.avg_content_length) %></td>
|
313
|
-
<td class="numeric"><%= Math.round(this.current_rps*100)/100 %></td>
|
314
|
-
<td class="numeric"><%= Math.round(this.current_fail_per_sec*100)/100 %></td>
|
315
|
-
</tr>
|
316
|
-
<% alternate = !alternate; %>
|
317
|
-
]]>
|
318
|
-
</script>
|
319
|
-
<script type="text/x-jqote-template" id="errors-template">
|
320
|
-
<![CDATA[
|
321
|
-
<tr>
|
322
|
-
<td><%= this.occurrences %></td>
|
323
|
-
<td><%= this.method %></td>
|
324
|
-
<td><%= this.name %></td>
|
325
|
-
<td><%= function(e) { return e.replace("<", "<"); }(this.error) %></td>
|
326
|
-
</tr>
|
327
|
-
<% alternate = !alternate; %>
|
328
|
-
]]>
|
329
|
-
</script>
|
330
|
-
<script type="text/x-jqote-template" id="exceptions-template">
|
331
|
-
<![CDATA[
|
332
|
-
<tr>
|
333
|
-
<td class="occurrences"><%= this.count %></td>
|
334
|
-
<td class="traceback" title="Occurred on: <%= this.nodes %>"><%= function(e) { return e.replace("<", "<"); }(this.traceback) %>
|
335
|
-
<%= function(e) { return e.replace("<", "<"); }(this.msg) %></td>
|
336
|
-
</tr>
|
337
|
-
<% alternate = !alternate; %>
|
338
|
-
]]>
|
339
|
-
</script>
|
340
|
-
<script type="text/x-jqote-template" id="worker-template">
|
341
|
-
<![CDATA[
|
342
|
-
<tr class="<%=(this.name == "Total" ? "total" : "")%>">
|
343
|
-
<td><%= this.id %></td>
|
344
|
-
<td><%= this.state %></td>
|
345
|
-
<td class="numeric"><%= this.user_count %></td>
|
346
|
-
<td class="numeric"><%= this.cpu_usage %>%</td>
|
347
|
-
<td class="numeric"><%= formatBytes(this.memory_usage) %></td>
|
348
|
-
</tr>
|
349
|
-
<% alternate = !alternate; %>
|
350
|
-
]]>
|
351
|
-
</script>
|
352
|
-
<script type="text/javascript">
|
353
|
-
var percentile1 = {{ percentile1|tojson }};
|
354
|
-
var percentile2 = {{ percentile2|tojson }};
|
355
|
-
{% include 'stats_data.html' %}
|
356
|
-
</script>
|
357
|
-
<script type="text/javascript" src="./static/chart.js?v={{ version }}"></script>
|
358
|
-
<script type="text/javascript" src="./static/locust.js?v={{ version }}"></script>
|
359
|
-
<script type="text/javascript" src="./static/tasks.js?v={{ version }}"></script>
|
360
|
-
<script type="text/javascript">
|
361
|
-
function updateTasksWithTimeout() {
|
362
|
-
fillTasksFromRequest()
|
363
|
-
setTimeout(updateTasksWithTimeout, 1000);
|
364
|
-
}
|
365
|
-
updateTasksWithTimeout()
|
366
|
-
</script>
|
367
|
-
{% block extended_script %}
|
368
|
-
{% endblock extended_script %}
|
369
|
-
</body>
|
370
|
-
</html>
|