Skip to content
Snippets Groups Projects
Commit 3a6ccab9 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

WebUI component:

- Added parametrization for maximum number of workers
- Added preliminar dashboard for load generator's status
parent d041e8d6
No related branches found
No related tags found
2 merge requests!142Release TeraFlowSDN 2.1,!92New features in Load Generator
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "datasource",
"uid": "grafana"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"target": {
"limit": 100,
"matchAny": false,
"tags": [],
"type": "dashboard"
},
"type": "dashboard"
}
]
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"id": 7,
"iteration": 1682521708178,
"links": [],
"liveNow": false,
"panels": [
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": {
"type": "prometheus",
"uid": "uq1HQksVk"
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 0
},
"hiddenSeries": false,
"id": 4,
"legend": {
"alignAsTable": false,
"avg": false,
"current": false,
"max": false,
"min": false,
"rightSide": false,
"show": false,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"percentage": false,
"pluginVersion": "8.5.22",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "uq1HQksVk"
},
"exemplar": true,
"expr": "sum(tfs_loadgen_rpc_[[method]]_counter_requests_started_total{pod=~\"[[pod]]\"})",
"hide": false,
"interval": "",
"legendFormat": "started",
"refId": "A"
},
{
"datasource": {
"type": "prometheus",
"uid": "uq1HQksVk"
},
"exemplar": true,
"expr": "sum(tfs_loadgen_rpc_[[method]]_counter_requests_completed_total{pod=~\"[[pod]]\"})",
"hide": false,
"interval": "",
"legendFormat": "completed",
"refId": "B"
},
{
"datasource": {
"type": "prometheus",
"uid": "uq1HQksVk"
},
"exemplar": true,
"expr": "sum(tfs_loadgen_rpc_[[method]]_counter_requests_failed_total{pod=~\"[[pod]]\"})",
"hide": false,
"interval": "",
"legendFormat": "failed",
"refId": "C"
}
],
"thresholds": [],
"timeRegions": [],
"title": "Requests",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"transformations": [],
"type": "graph",
"xaxis": {
"mode": "time",
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:935",
"format": "short",
"logBase": 1,
"min": "0",
"show": true
},
{
"$$hashKey": "object:936",
"format": "short",
"logBase": 1,
"show": true
}
],
"yaxis": {
"align": false
}
},
{
"cards": {},
"color": {
"cardColor": "#b4ff00",
"colorScale": "linear",
"colorScheme": "interpolateRdYlGn",
"exponent": 0.5,
"min": 0,
"mode": "opacity"
},
"dataFormat": "tsbuckets",
"datasource": {
"type": "prometheus",
"uid": "uq1HQksVk"
},
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 6
},
"heatmap": {},
"hideZeroBuckets": true,
"highlightCards": true,
"id": 2,
"interval": "60s",
"legend": {
"show": true
},
"pluginVersion": "7.5.4",
"reverseYBuckets": false,
"targets": [
{
"exemplar": true,
"expr": "sum(\r\n max_over_time(tfs_[[component]]_rpc_[[method]]_histogram_duration_bucket{pod=~\"[[pod]]\"}[1m]) -\r\n min_over_time(tfs_[[component]]_rpc_[[method]]_histogram_duration_bucket{pod=~\"[[pod]]\"}[1m])\r\n) by (le)",
"format": "heatmap",
"instant": false,
"interval": "1m",
"intervalFactor": 1,
"legendFormat": "{{le}}",
"refId": "A"
}
],
"title": "Histogram",
"tooltip": {
"show": true,
"showHistogram": true
},
"type": "heatmap",
"xAxis": {
"show": true
},
"yAxis": {
"format": "s",
"logBase": 1,
"show": true
},
"yBucketBound": "auto"
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": {
"type": "prometheus",
"uid": "uq1HQksVk"
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 14
},
"hiddenSeries": false,
"id": 5,
"legend": {
"alignAsTable": false,
"avg": false,
"current": false,
"max": false,
"min": false,
"rightSide": false,
"show": false,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"percentage": false,
"pluginVersion": "8.5.22",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"exemplar": true,
"expr": "sum(tfs_[[component]]_rpc_[[method]]_histogram_duration_sum{pod=~\"[[pod]]\"})",
"hide": false,
"interval": "",
"legendFormat": "total time",
"refId": "B"
}
],
"thresholds": [],
"timeRegions": [],
"title": "Total Exec Time",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"transformations": [],
"type": "graph",
"xaxis": {
"mode": "time",
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:407",
"format": "s",
"logBase": 1,
"min": "0",
"show": true
},
{
"$$hashKey": "object:408",
"format": "short",
"logBase": 1,
"show": true
}
],
"yaxis": {
"align": false
}
}
],
"refresh": "5s",
"schemaVersion": 36,
"style": "dark",
"tags": [],
"templating": {
"list": [
{
"allValue": ".*",
"current": {
"selected": true,
"text": [
"setup",
"teardown"
],
"value": [
"setup",
"teardown"
]
},
"datasource": {
"type": "prometheus",
"uid": "uq1HQksVk"
},
"definition": "metrics(tfs_loadgen_requests_)",
"hide": 0,
"includeAll": true,
"label": "Method",
"multi": true,
"name": "method",
"options": [],
"query": {
"query": "metrics(tfs_loadgen_requests_)",
"refId": "StandardVariableQuery"
},
"refresh": 2,
"regex": "/tfs_loadgen_requests_(.+)_histogram_duration_bucket/",
"skipUrlSync": false,
"sort": 0,
"tagValuesQuery": "",
"tagsQuery": "",
"type": "query",
"useTags": false
},
{
"allValue": ".*",
"current": {
"selected": true,
"text": [
"All"
],
"value": [
"$__all"
]
},
"datasource": {
"type": "prometheus",
"uid": "uq1HQksVk"
},
"definition": "label_values(tfs_loadgen_requests_[[method]]_histogram_duration_bucket, pod)",
"error": {
"config": {
"data": {
"end": "1682522070",
"match[]": "tfs_loadgen_requests_(setup|teardown)_histogram_duration_bucket",
"start": "1682349270"
},
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"X-Grafana-Org-Id": 1
},
"hideFromInspector": true,
"method": "POST",
"retry": 0,
"url": "api/datasources/proxy/3/api/v1/series"
},
"data": {
"error": "invalid parameter \"match[]\": 1:22: parse error: unexpected \"(\"",
"errorType": "bad_data",
"message": "invalid parameter \"match[]\": 1:22: parse error: unexpected \"(\"",
"status": "error"
},
"message": "invalid parameter \"match[]\": 1:22: parse error: unexpected \"(\"",
"status": 400,
"statusText": "Bad Request"
},
"hide": 0,
"includeAll": true,
"label": "Pod",
"multi": true,
"name": "pod",
"options": [],
"query": {
"query": "label_values(tfs_loadgen_requests_[[method]]_histogram_duration_bucket, pod)",
"refId": "StandardVariableQuery"
},
"refresh": 2,
"regex": "",
"skipUrlSync": false,
"sort": 0,
"tagValuesQuery": "",
"tagsQuery": "",
"type": "query",
"useTags": false
}
]
},
"time": {
"from": "now-2d",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "TFS / Load Generator",
"uid": "SDgbwzsVk",
"version": 5,
"weekStart": ""
}
\ No newline at end of file
...@@ -40,6 +40,8 @@ class LoadGenForm(FlaskForm): ...@@ -40,6 +40,8 @@ class LoadGenForm(FlaskForm):
capacity_gbps = StringField('Capacity [Gbps]', default=DEFAULT_CAPACITY_GBPS, validators=[Regexp(RE_SCALAR_RANGE_LIST)]) capacity_gbps = StringField('Capacity [Gbps]', default=DEFAULT_CAPACITY_GBPS, validators=[Regexp(RE_SCALAR_RANGE_LIST)])
e2e_latency_ms = StringField('E2E Latency [ms]', default=DEFAULT_E2E_LATENCY_MS, validators=[Regexp(RE_SCALAR_RANGE_LIST)]) e2e_latency_ms = StringField('E2E Latency [ms]', default=DEFAULT_E2E_LATENCY_MS, validators=[Regexp(RE_SCALAR_RANGE_LIST)])
max_workers = IntegerField('Max Workers', default=10, validators=[DataRequired(), NumberRange(min=1)])
do_teardown = BooleanField('Do Teardown', default=True) do_teardown = BooleanField('Do Teardown', default=True)
record_to_dlt = BooleanField('Record to DLT', default=False) record_to_dlt = BooleanField('Record to DLT', default=False)
......
...@@ -69,6 +69,7 @@ def home(): ...@@ -69,6 +69,7 @@ def home():
set_properties(form.availability , _availability , readonly=status.running) set_properties(form.availability , _availability , readonly=status.running)
set_properties(form.capacity_gbps , _capacity_gbps , readonly=status.running) set_properties(form.capacity_gbps , _capacity_gbps , readonly=status.running)
set_properties(form.e2e_latency_ms , _e2e_latency_ms , readonly=status.running) set_properties(form.e2e_latency_ms , _e2e_latency_ms , readonly=status.running)
set_properties(form.max_workers , status.parameters.max_workers , readonly=status.running)
set_properties(form.do_teardown , status.parameters.do_teardown , disabled=status.running) set_properties(form.do_teardown , status.parameters.do_teardown , disabled=status.running)
set_properties(form.record_to_dlt , status.parameters.record_to_dlt, disabled=status.running) set_properties(form.record_to_dlt , status.parameters.record_to_dlt, disabled=status.running)
set_properties(form.dlt_domain_id , status.parameters.dlt_domain_id, readonly=status.running) set_properties(form.dlt_domain_id , status.parameters.dlt_domain_id, readonly=status.running)
...@@ -100,6 +101,7 @@ def start(): ...@@ -100,6 +101,7 @@ def start():
load_gen_params.offered_load = form.offered_load.data load_gen_params.offered_load = form.offered_load.data
load_gen_params.holding_time = form.holding_time.data load_gen_params.holding_time = form.holding_time.data
load_gen_params.inter_arrival_time = form.inter_arrival_time.data load_gen_params.inter_arrival_time = form.inter_arrival_time.data
load_gen_params.max_workers = form.max_workers.data
load_gen_params.do_teardown = form.do_teardown.data load_gen_params.do_teardown = form.do_teardown.data
load_gen_params.dry_mode = False load_gen_params.dry_mode = False
load_gen_params.record_to_dlt = form.record_to_dlt.data load_gen_params.record_to_dlt = form.record_to_dlt.data
......
...@@ -158,6 +158,21 @@ ...@@ -158,6 +158,21 @@
</div> </div>
<br /> <br />
<div class="row mb-3">
{{ form.max_workers.label(class="col-sm-2 col-form-label") }}
<div class="col-sm-10">
{% if form.max_workers.errors %}
{{ form.max_workers(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in form.max_workers.errors %}<span>{{ error }}</span>{% endfor %}
</div>
{% else %}
{{ form.max_workers(class="form-control") }}
{% endif %}
</div>
</div>
<br />
<div class="row mb-3"> <div class="row mb-3">
<div class="col-sm-10"> <div class="col-sm-10">
{{ form.do_teardown }} {{ form.do_teardown.label(class="col-sm-3 col-form-label") }}<br/> {{ form.do_teardown }} {{ form.do_teardown.label(class="col-sm-3 col-form-label") }}<br/>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment