From 709fdf1e0c86ac342014323a194f426abf0fdaac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20SZKIBA?= Date: Tue, 6 Feb 2024 18:52:15 +0100 Subject: [PATCH] feat: add "custom" property with true value to custom metrics on SSE stream --- .../assets/packages/model/src/Metrics.ts | 1 + dashboard/builtin.go | 125 ++++++++++++++++++ dashboard/meter.go | 2 + 3 files changed, 128 insertions(+) create mode 100644 dashboard/builtin.go diff --git a/dashboard/assets/packages/model/src/Metrics.ts b/dashboard/assets/packages/model/src/Metrics.ts index 84f2d89..c0b77ff 100644 --- a/dashboard/assets/packages/model/src/Metrics.ts +++ b/dashboard/assets/packages/model/src/Metrics.ts @@ -39,6 +39,7 @@ export type Metric = { contains?: ValueType type?: MetricType thresholds?: Array + custom?: boolean } export class Query { diff --git a/dashboard/builtin.go b/dashboard/builtin.go new file mode 100644 index 0000000..c272286 --- /dev/null +++ b/dashboard/builtin.go @@ -0,0 +1,125 @@ +package dashboard + +import ( + "sort" + + "go.k6.io/k6/metrics" +) + +const ( + // xk6-dashboard's time + keyTime = "time" + + // from k6 metrics/builtin.go + keyVUsName = metrics.VUsName + keyVUsMaxName = metrics.VUsMaxName + keyIterationsName = metrics.IterationsName + keyIterationDurationName = metrics.IterationDurationName + keyDroppedIterationsName = metrics.DroppedIterationsName + + keyChecksName = metrics.ChecksName + keyGroupDurationName = metrics.GroupDurationName + + keyHTTPReqsName = metrics.HTTPReqsName + keyHTTPReqFailedName = metrics.HTTPReqFailedName + keyHTTPReqDurationName = metrics.HTTPReqDurationName + keyHTTPReqBlockedName = metrics.HTTPReqBlockedName + keyHTTPReqConnectingName = metrics.HTTPReqConnectingName + keyHTTPReqTLSHandshakingName = metrics.HTTPReqTLSHandshakingName + keyHTTPReqSendingName = metrics.HTTPReqSendingName + keyHTTPReqWaitingName = metrics.HTTPReqWaitingName + keyHTTPReqReceivingName = metrics.HTTPReqReceivingName + + keyWSSessionsName = metrics.WSSessionsName + keyWSMessagesSentName = metrics.WSMessagesSentName + keyWSMessagesReceivedName = metrics.WSMessagesReceivedName + keyWSPingName = metrics.WSPingName + keyWSSessionDurationName = metrics.WSSessionDurationName + keyWSConnectingName = metrics.WSConnectingName + + keyGRPCReqDurationName = metrics.GRPCReqDurationName + + keyDataSentName = metrics.DataSentName + keyDataReceivedName = metrics.DataReceivedName + + // from xk6-browser + + keyfidName = "browser_web_vital_fid" + keyttfbName = "browser_web_vital_ttfb" + keylcpName = "browser_web_vital_lcp" + keyclsName = "browser_web_vital_cls" + keyinpName = "browser_web_vital_inp" + keyfcpName = "browser_web_vital_fcp" + + keybrowserDataSentName = "browser_data_sent" + keybrowserDataReceivedName = "browser_data_received" + keybrowserHTTPReqDurationName = "browser_http_req_duration" + keybrowserHTTPReqFailedName = "browser_http_req_failed" + + // from k6/grpc + + keyGRPCStreamsName = "grpc_streams" + keyGRPCStreamsMsgsReceivedName = "grpc_streams_msgs_received" + keyGRPCStreamsMsgsSentName = "grpc_streams_msgs_sent" +) + +var builtinNames = []string{ //nolint:gochecknoglobals + keyTime, + + keyVUsName, + keyVUsMaxName, + keyIterationsName, + keyIterationDurationName, + keyDroppedIterationsName, + + keyChecksName, + keyGroupDurationName, + + keyHTTPReqsName, + keyHTTPReqFailedName, + keyHTTPReqDurationName, + keyHTTPReqBlockedName, + keyHTTPReqConnectingName, + keyHTTPReqTLSHandshakingName, + keyHTTPReqSendingName, + keyHTTPReqWaitingName, + keyHTTPReqReceivingName, + + keyWSSessionsName, + keyWSMessagesSentName, + keyWSMessagesReceivedName, + keyWSPingName, + keyWSSessionDurationName, + keyWSConnectingName, + + keyGRPCReqDurationName, + + keyDataSentName, + keyDataReceivedName, + + keyfidName, + keyttfbName, + keylcpName, + keyclsName, + keyinpName, + keyfcpName, + + keybrowserDataSentName, + keybrowserDataReceivedName, + keybrowserHTTPReqDurationName, + keybrowserHTTPReqFailedName, + + keyGRPCStreamsName, + keyGRPCStreamsMsgsReceivedName, + keyGRPCStreamsMsgsSentName, +} + +func init() { + sort.Strings(builtinNames) +} + +func isBuiltin(name string) bool { + idx := sort.SearchStrings(builtinNames, name) + + return idx < len(builtinNames) && builtinNames[idx] == name +} diff --git a/dashboard/meter.go b/dashboard/meter.go index e2805a4..8da8f6f 100644 --- a/dashboard/meter.go +++ b/dashboard/meter.go @@ -220,6 +220,7 @@ type metricData struct { Contains metrics.ValueType `json:"contains,omitempty"` Tainted bool `json:"tainted,omitempty"` Thresholds []string `json:"thresholds,omitempty"` + Custom bool `json:"custom,omitempty"` } func newMetricData(origin *metrics.Metric) *metricData { @@ -228,6 +229,7 @@ func newMetricData(origin *metrics.Metric) *metricData { Contains: origin.Contains, Tainted: origin.Tainted.Bool, Thresholds: thresholdsSources(origin.Thresholds), + Custom: !isBuiltin(origin.Name), } }