Loading src/webui/grafana_prom_load_generator.json 0 → 100644 +414 −0 Original line number Diff line number Diff line { "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 src/webui/service/load_gen/forms.py +2 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ class LoadGenForm(FlaskForm): 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)]) max_workers = IntegerField('Max Workers', default=10, validators=[DataRequired(), NumberRange(min=1)]) do_teardown = BooleanField('Do Teardown', default=True) record_to_dlt = BooleanField('Record to DLT', default=False) Loading src/webui/service/load_gen/routes.py +2 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ def home(): set_properties(form.availability , _availability , 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.max_workers , status.parameters.max_workers , readonly=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.dlt_domain_id , status.parameters.dlt_domain_id, readonly=status.running) Loading Loading @@ -100,6 +101,7 @@ def start(): load_gen_params.offered_load = form.offered_load.data load_gen_params.holding_time = form.holding_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.dry_mode = False load_gen_params.record_to_dlt = form.record_to_dlt.data Loading src/webui/service/templates/load_gen/home.html +15 −0 Original line number Diff line number Diff line Loading @@ -158,6 +158,21 @@ </div> <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="col-sm-10"> {{ form.do_teardown }} {{ form.do_teardown.label(class="col-sm-3 col-form-label") }}<br/> Loading Loading
src/webui/grafana_prom_load_generator.json 0 → 100644 +414 −0 Original line number Diff line number Diff line { "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
src/webui/service/load_gen/forms.py +2 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ class LoadGenForm(FlaskForm): 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)]) max_workers = IntegerField('Max Workers', default=10, validators=[DataRequired(), NumberRange(min=1)]) do_teardown = BooleanField('Do Teardown', default=True) record_to_dlt = BooleanField('Record to DLT', default=False) Loading
src/webui/service/load_gen/routes.py +2 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ def home(): set_properties(form.availability , _availability , 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.max_workers , status.parameters.max_workers , readonly=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.dlt_domain_id , status.parameters.dlt_domain_id, readonly=status.running) Loading Loading @@ -100,6 +101,7 @@ def start(): load_gen_params.offered_load = form.offered_load.data load_gen_params.holding_time = form.holding_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.dry_mode = False load_gen_params.record_to_dlt = form.record_to_dlt.data Loading
src/webui/service/templates/load_gen/home.html +15 −0 Original line number Diff line number Diff line Loading @@ -158,6 +158,21 @@ </div> <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="col-sm-10"> {{ form.do_teardown }} {{ form.do_teardown.label(class="col-sm-3 col-form-label") }}<br/> Loading