From 7c44fc5ff1d3aaa53e58ec968896d5b74c39adb7 Mon Sep 17 00:00:00 2001 From: Daniel Reuter Date: Tue, 22 Oct 2024 16:18:11 +0200 Subject: [PATCH] feat: added LineChartWidget --- docs/img/widgets/line-chart.png | Bin 0 -> 57182 bytes docs/widgets.md | 134 +++++- go/action_kit_api/CHANGELOG.md | 4 + go/action_kit_api/action_kit_api.go | 434 ++++++++++++------ ...apu_extras.go => action_kit_api_extras.go} | 1 + go/action_kit_api/build.sh | 2 +- go/action_kit_api/generator-config.yml | 1 + openapi/spec.yml | 218 ++++++++- 8 files changed, 653 insertions(+), 141 deletions(-) create mode 100644 docs/img/widgets/line-chart.png rename go/action_kit_api/{action_kit_apu_extras.go => action_kit_api_extras.go} (64%) diff --git a/docs/img/widgets/line-chart.png b/docs/img/widgets/line-chart.png new file mode 100644 index 0000000000000000000000000000000000000000..c176811c5af1d9eb0ed01fc7d1b6288c26a516cf GIT binary patch literal 57182 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 `Sn*U%tqfd@oEIZx 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

>;Vn&!9*Bm!|E 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 literal 0 HcmV?d00001 diff --git a/docs/widgets.md b/docs/widgets.md index 32d5e53c..47c46324 100644 --- a/docs/widgets.md +++ b/docs/widgets.md @@ -5,21 +5,21 @@ To enhance the user experience, ActionKit also supports the extension of the exp Supported widgets types: * [State Over Time](#state-over-time) +* [Line Chart](#line-chart) * [Log Widget](#log-widget) * [Markdown Widget](#markdown-widget) +All widgets require two components to function: + +- Metrics or Logs containing the information. These are returned by the action during experiment execution by the various endpoints, e.g., the `status` endpoint. +- Static configuration describes how the widget should filter, aggregate, and label the metrics for user presentation. This configuration is part of the `ActionDescription` and is returned by the `describe` endpoint. + ## State Over Time This widget helps visualize how the state of a system or component evolved. For example, to show a Kubernetes pod's readiness state or the state of the monitoring system's alarms. The screenshot below depicts how the [Datadog extension](https://github.com/steadybit/extension-datadog) uses this widget type to visualize the state of [Datadog monitors](https://docs.datadoghq.com/monitors/) over time. ![An run view widget visualizing the status of a Datadog monitor over time](./img/widgets/state-over-time.png) -The state over time widget requires two components to function: - -- Metrics containing information about the status at any one time. -- Static configuration describes how to filter, aggregate and label the metrics for user presentation. - - ### Configuration The widget configuration describes from which metric fields Steadybit should retrieve information. More specifically: @@ -29,8 +29,8 @@ The widget configuration describes from which metric fields Steadybit should ret - `state.from`: Maps to the name of a metric field containing the current state at any time. Supported values for this field are: - `danger` - ![#f4857d](https://placehold.co/10x20/f4857d/f4857d.png)![#ed5d50](https://placehold.co/10x20/ed5d50/ed5d50.png) - `warn` - ![#F9D34C](https://placehold.co/10x20/F9D34C/F9D34C.png)![#F99F4C](https://placehold.co/10x20/F99F4C/F99F4C.png) - - `info` - ![#d5d8e0](https://placehold.co/10x20/d5d8e0/d5d8e0.png)![#cbced9](https://placehold.co/10x20/cbced9/cbced9.png) - `success` - ![#4ab3ae](https://placehold.co/20x20/4ab3ae/4ab3ae.png) + - `info` - ![#d5d8e0](https://placehold.co/10x20/d5d8e0/d5d8e0.png)![#cbced9](https://placehold.co/10x20/cbced9/cbced9.png) - `tooltip.from`: Maps to the name of a metric field containing the current tooltip at any time. - `url.from`: Maps to the name of a metric field containing a URL. When available, it causes a chart segment to turn into a hyperlink. - `value.hide`: Controls whether the metric values carry meaning and should be shown. @@ -68,7 +68,7 @@ The following snippet is an example depicting the Datadog extension's configurat ### Metrics -You can provide data points for this widget through metrics. You can define metrics through various ActionKit endpoints, e.g., the `status` endpoint. The following snippet is an example of a metric generated by the Datadog extension. +You need to provide data points for this widget through metrics. You can define metrics through various ActionKit endpoints, e.g., the `status` endpoint. The following snippet is an example of a metric generated by the Datadog extension. ```json { @@ -89,6 +89,120 @@ You can provide data points for this widget through metrics. You can define metr } ``` +## Line Chart + +This widget helps visualize value in a line chart. For example, to show response times of an HTTP Endpoint. The screenshot below shows how the [HTTP extension](https://github.com/steadybit/extension-http) uses this widget type. + +![An run view widget visualizing the HTTP response times of a given url](./img/widgets/line-chart.png) + +### Configuration + +The widget configuration describes from which metric fields Steadybit should retrieve information. More specifically: + +- `Identity` + - `Metric` & `From`: Which metrics should be considered to be part of the same line chart. The `identity.metric` is the name of the metric, `identity.from` is the name of the metric attribute which will form a line. + - `Mode`: The mode of the identity. Supported values are: + - `widget_per_value`: Each value returned by the attribute specified by `identity.from` will be a separate widget in the run view. + - `select`: Each value returned by the attribute specified by `identity.from` can be selected in the header of a single widget in the run view. +- `Grouping`: Optional - can be used to group datapoints and color them. If not provided, all values will be shown in the same color. + - `ShowSummary`: Controls whether a summary of the values should be shown in a pie-chart. + - `Groups`: A list of groups that should be shown in the line chart. Each group has a title, color, and a matcher. The matcher specifies how to filter the values of the metric to be part of the group. + - `Color`: + - `danger` - ![#f4857d](https://placehold.co/20x20/f4857d/f4857d.png) + - `warn` - ![#F9D34C](https://placehold.co/20x20/F9D34C/F9D34C.png) + - `success` - ![#4ab3ae](https://placehold.co/20x20/4ab3ae/4ab3ae.png) + - `info` - ![#d5d8e0](https://placehold.co/20x20/d5d8e0/d5d8e0.png) + - `Matcher`:' + - `action_kit_api.LineChartWidgetGroupMatcherFallback`: All values that do not match any other group will be part of this group. + - `action_kit_api.LineChartWidgetGroupMatcherNotEmpty`: All values with a non empty attribute specified by `key` will be part of this group. + - `action_kit_api.LineChartWidgetGroupMatcherKeyEqualsValue`: `key` with a specific `value` will be part of this group. +- `Tooltip`: Optional - can be used to configure the tooltip of the line chart. + - `MetricValueTitle`: The value of the metric specified by `identity` is always shown in the tooltip. `MetricValueTitle` specifies the title of the metric value. + - `MetricValueUnit`: The unit of the value for the y-axis. + - `AdditionalContent`: A list of additional content that should be shown in the tooltip. Each additional content has a title and a from attribute. Attribute which don't exist in the metric will be ignored. + +The following snippet is an example of the widget definition in extension-http. + +```go +return action_kit_api.ActionDescription{ +... + Widgets: extutil.Ptr([]action_kit_api.Widget{ + action_kit_api.LineChartWidget{ + Type: action_kit_api.ComSteadybitWidgetLineChart, + Title: "HTTP Responses", + Identity: action_kit_api.LineChartWidgetIdentityConfig{ + MetricName: "response_time", + From: "url", + Mode: action_kit_api.ComSteadybitWidgetLineChartIdentityModeWidgetPerValue, + }, + Grouping: extutil.Ptr(action_kit_api.LineChartWidgetGroupingConfig{ + ShowSummary: extutil.Ptr(true), + Groups: []action_kit_api.LineChartWidgetGroup{ + { + Title: "Successul", + Color: "success", + Matcher: action_kit_api.LineChartWidgetGroupMatcherFallback{ + Type: action_kit_api.ComSteadybitWidgetLineChartGroupMatcherFallback, + }, + }, + { + Title: "Failure", + Color: "danger", + Matcher: action_kit_api.LineChartWidgetGroupMatcherNotEmpty{ + Type: action_kit_api.ComSteadybitWidgetLineChartGroupMatcherNotEmpty, + Key: "error", + }, + }, + { + Title: "Unexpected Status", + Color: "warn", + Matcher: action_kit_api.LineChartWidgetGroupMatcherKeyEqualsValue{ + Type: action_kit_api.ComSteadybitWidgetLineChartGroupMatcherKeyEqualsValue, + Key: "expected_http_status", + Value: "false", + }, + }, + ... + }, + }), + Tooltip: extutil.Ptr(action_kit_api.LineChartWidgetTooltipConfig{ + MetricValueTitle: extutil.Ptr("Response Time"), + MetricValueUnit: extutil.Ptr("ms"), + AdditionalContent: []action_kit_api.LineChartWidgetTooltipContent{ + { + From: "error", + Title: "Error", + }, + { + From: "http_status", + Title: "HTTP Status", + }, + }, + }), + }, + }) +``` + +### Metrics + +You need to provide data points for this widget through metrics. You can define metrics through various ActionKit endpoints, e.g., the `status` endpoint. The following snippet is an example of a metric generated by the HTTP extension. + +```json +{ + "metrics": [ + { + "name": "response_time", + "metric": { + "url": "https://www.steadybit.com", + "http_status": "200", + "response_time_constraints_fulfilled": "false" + }, + "timestamp": "2024-10-04T19:16:52+0100", + "value": 156 + } + ] +} +``` ## Log Widget @@ -107,7 +221,7 @@ The following snippet is an example depicting the Kubernetes extension's configu ```go return action_kit_api.ActionDescription{ - ... + ... Widgets: extutil.Ptr([]action_kit_api.Widget{ action_kit_api.LogWidget{ Type: action_kit_api.ComSteadybitWidgetLog, @@ -155,7 +269,7 @@ Example: ```go return action_kit_api.ActionDescription{ - ... + ... Widgets: extutil.Ptr([]action_kit_api.Widget{ action_kit_api.MarkdownWidget{ Type: action_kit_api.ComSteadybitWidgetMarkdown, diff --git a/go/action_kit_api/CHANGELOG.md b/go/action_kit_api/CHANGELOG.md index 9ad8c5b3..12d13141 100644 --- a/go/action_kit_api/CHANGELOG.md +++ b/go/action_kit_api/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 2.9.4 + +- adding `LineChartWidget` + ## 2.9.3 - adding `technology` to `ActionDescription` diff --git a/go/action_kit_api/action_kit_api.go b/go/action_kit_api/action_kit_api.go index 85a774e6..aa423147 100644 --- a/go/action_kit_api/action_kit_api.go +++ b/go/action_kit_api/action_kit_api.go @@ -1,6 +1,6 @@ // Package action_kit_api provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.3.0 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.4.1 DO NOT EDIT. package action_kit_api import ( @@ -64,6 +64,32 @@ const ( Url ActionParameterType = "url" ) +// Defines values for LineChartWidgetType. +const ( + ComSteadybitWidgetLineChart LineChartWidgetType = "com.steadybit.widget.line_chart" +) + +// Defines values for LineChartWidgetGroupMatcherFallbackType. +const ( + ComSteadybitWidgetLineChartGroupMatcherFallback LineChartWidgetGroupMatcherFallbackType = "com.steadybit.widget.line_chart.group_matcher_fallback" +) + +// Defines values for LineChartWidgetGroupMatcherKeyEqualsValueType. +const ( + ComSteadybitWidgetLineChartGroupMatcherKeyEqualsValue LineChartWidgetGroupMatcherKeyEqualsValueType = "com.steadybit.widget.line_chart.group_matcher_key_equals_value" +) + +// Defines values for LineChartWidgetGroupMatcherNotEmptyType. +const ( + ComSteadybitWidgetLineChartGroupMatcherNotEmpty LineChartWidgetGroupMatcherNotEmptyType = "com.steadybit.widget.line_chart.group_matcher_not_empty" +) + +// Defines values for LineChartWidgetIdentityConfigMode. +const ( + ComSteadybitWidgetLineChartIdentityModeSelect LineChartWidgetIdentityConfigMode = "com.steadybit.widget.line_chart.identity_mode.select" + ComSteadybitWidgetLineChartIdentityModeWidgetPerValue LineChartWidgetIdentityConfigMode = "com.steadybit.widget.line_chart.identity_mode.widget-per-value" +) + // Defines values for LogWidgetType. const ( ComSteadybitWidgetLog LogWidgetType = "com.steadybit.widget.log" @@ -270,7 +296,9 @@ type ActionParameter struct { // Name The key under which the action parameter is stored. This key can then be found within the prepare request's config field. Name string `json:"name"` - // Options Optional options for the `string`, `string[]` and `string_array` parameter types. Which result in suggestions for end-users. + // Options Optional options for the `string`, `string[]` and `string_array` parameter types. Which result in suggestions for end-users. Any of: + // - `action_kit_api.ExplicitParameterOption` + // - `action_kit_api.ParameterOptionsFromTargetAttribute` Options *[]ParameterOption `json:"options,omitempty"` // OptionsOnly Define if for a type = 'string' with options, if only the options should be allowed or also free text. Default is true. @@ -345,17 +373,135 @@ type ExplicitParameterOption struct { Value string `json:"value"` } +// LineChartWidget A widget that shows a line chart. +type LineChartWidget struct { + // Grouping Optional configuration to group some data points in the line chart. Groups can be colored and a summary can be shown in an Pie chart next to the line chart. + Grouping *LineChartWidgetGroupingConfig `json:"grouping,omitempty"` + Identity LineChartWidgetIdentityConfig `json:"identity"` + + // Title The title of the widget. This will be displayed in the widget header. + Title string `json:"title"` + Tooltip *LineChartWidgetTooltipConfig `json:"tooltip,omitempty"` + + // Type The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChart`. + Type LineChartWidgetType `json:"type"` +} + +// LineChartWidgetType The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChart`. +type LineChartWidgetType string + +// LineChartWidgetGroup A group of data points in the line chart. +type LineChartWidgetGroup struct { + // Color The color of the group. This will be used to color the matching data points in the line chart. + Color string `json:"color"` + + // Matcher The matcher that should be used to match the data points that should be part of this group. Any of + // - `action_kit_api.LineChartWidgetGroupMatcherFallback` + // - `action_kit_api.LineChartWidgetGroupMatcherKeyEqualsValue` + // - `action_kit_api.LineChartWidgetGroupMatcherNotEmpty` + Matcher LineChartWidgetGroupMatcher `json:"matcher"` + + // Title The title of the group. This will be displayed in the tooltip and the pie chart summary of the widget + Title string `json:"title"` +} + +// LineChartWidgetGroupMatcherFallback A fallback matcher that will match all data points that are not matched by any other group. +type LineChartWidgetGroupMatcherFallback struct { + // Type The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChartGroupMatcherFallback`. + Type LineChartWidgetGroupMatcherFallbackType `json:"type"` +} + +// LineChartWidgetGroupMatcherFallbackType The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChartGroupMatcherFallback`. +type LineChartWidgetGroupMatcherFallbackType string + +// LineChartWidgetGroupMatcherKeyEqualsValue A matcher that will match all data points where the value of the specified key equals the specified value. +type LineChartWidgetGroupMatcherKeyEqualsValue struct { + Key string `json:"key"` + + // Type The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChartGroupMatcherKeyEqualsValue`. + Type LineChartWidgetGroupMatcherKeyEqualsValueType `json:"type"` + Value string `json:"value"` +} + +// LineChartWidgetGroupMatcherKeyEqualsValueType The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChartGroupMatcherKeyEqualsValue`. +type LineChartWidgetGroupMatcherKeyEqualsValueType string + +// LineChartWidgetGroupMatcherNotEmpty A matcher that will match all data points where the value of the specified key is not empty. +type LineChartWidgetGroupMatcherNotEmpty struct { + Key string `json:"key"` + + // Type The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChartGroupMatcherNotEmpty`. + Type LineChartWidgetGroupMatcherNotEmptyType `json:"type"` +} + +// LineChartWidgetGroupMatcherNotEmptyType The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChartGroupMatcherNotEmpty`. +type LineChartWidgetGroupMatcherNotEmptyType string + +// LineChartWidgetGroupingConfig Optional configuration to group some data points in the line chart. Groups can be colored and a summary can be shown in an Pie chart next to the line chart. +type LineChartWidgetGroupingConfig struct { + // Groups A list of groups that should be displayed in the line chart. Each group can be colored and a matcher can be defined to match the data points that should be part of this group. + Groups []LineChartWidgetGroup `json:"groups"` + + // ShowSummary If set to `true`, a pie chart will be shown next to the line chart. The pie chart will show the summary of the groups and can be used to filter data points in the line chart. + ShowSummary *bool `json:"showSummary,omitempty"` +} + +// LineChartWidgetIdentityConfig defines model for LineChartWidgetIdentityConfig. +type LineChartWidgetIdentityConfig struct { + // From The name of a metric field containing a unique identifier per desired line chart within the UI. + From string `json:"from"` + + // MetricName The name of the metrics that should be considered for this line chart. + MetricName string `json:"metricName"` + + // Mode If there are multiple values by evaluating `from`, how should the widgets be rendered? + // - `com.steadybit.widget.line_chart.identity_mode.select` - A single widget is rendered and the user can select the value that should be displayed in the widget. + // - `com.steadybit.widget.line_chart.identity_mode.widget-per-value` - A separate widget is rendered per given value. + Mode LineChartWidgetIdentityConfigMode `json:"mode"` +} + +// LineChartWidgetIdentityConfigMode If there are multiple values by evaluating `from`, how should the widgets be rendered? +// - `com.steadybit.widget.line_chart.identity_mode.select` - A single widget is rendered and the user can select the value that should be displayed in the widget. +// - `com.steadybit.widget.line_chart.identity_mode.widget-per-value` - A separate widget is rendered per given value. +type LineChartWidgetIdentityConfigMode string + +// LineChartWidgetTooltipConfig defines model for LineChartWidgetTooltipConfig. +type LineChartWidgetTooltipConfig struct { + // AdditionalContent Additional content that should be displayed in the tooltip. This can be used to show additional information about the data points in the line chart. + AdditionalContent []LineChartWidgetTooltipContent `json:"additionalContent"` + + // MetricValueTitle Optional title of the metric value that should be displayed in the tooltip. + MetricValueTitle *string `json:"metricValueTitle,omitempty"` + + // MetricValueUnit Optional unit of the metric value that should be displayed in the tooltip. + MetricValueUnit *string `json:"metricValueUnit,omitempty"` +} + +// LineChartWidgetTooltipContent defines model for LineChartWidgetTooltipContent. +type LineChartWidgetTooltipContent struct { + // From The name of a metric field containing the value for this additional content. + From string `json:"from"` + + // Title The title of the additional content. This will be displayed as caption for the value in the tooltip. + Title string `json:"title"` + + // Unit Optional unit which should be added next to the value in the tooltip. + Unit *string `json:"unit,omitempty"` +} + // LogWidget A widget that shows log messages. type LogWidget struct { // LogType The type of messages that should be displayed in the widget. Needs to match `type` in `action_kit_api.Message`. LogType string `json:"logType"` // Title The title of the widget. This will be displayed in the widget header. - Title string `json:"title"` - Type LogWidgetType `json:"type"` + Title string `json:"title"` + + // Type The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLog`. + Type LogWidgetType `json:"type"` } -// LogWidgetType defines model for LogWidget.Type. +// LogWidgetType The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLog`. type LogWidgetType string // MarkdownWidget A widget that renders Markdown content. @@ -367,11 +513,13 @@ type MarkdownWidget struct { MessageType string `json:"messageType"` // Title The title of the widget. This will be displayed in the widget header. - Title string `json:"title"` - Type MarkdownWidgetType `json:"type"` + Title string `json:"title"` + + // Type The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetMarkdown`. + Type MarkdownWidgetType `json:"type"` } -// MarkdownWidgetType defines model for MarkdownWidget.Type. +// MarkdownWidgetType The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetMarkdown`. type MarkdownWidgetType string // Message Log-message that will be passed to the platform (default agent log). @@ -456,11 +604,13 @@ type ParameterOptionsFromTargetAttribute struct { // PredefinedWidget The platform contains a set of hand crafted predefined widgets. This widget type allows to use one of them. type PredefinedWidget struct { - PredefinedWidgetId string `json:"predefinedWidgetId"` - Type PredefinedWidgetType `json:"type"` + PredefinedWidgetId string `json:"predefinedWidgetId"` + + // Type The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetPredefined`. + Type PredefinedWidgetType `json:"type"` } -// PredefinedWidgetType defines model for PredefinedWidget.Type. +// PredefinedWidgetType The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetPredefined`. type PredefinedWidgetType string // PrepareResult defines model for PrepareResult. @@ -532,36 +682,43 @@ type StateOverTimeWidget struct { // Title The title of the widget. This will be displayed in the widget header. Title string `json:"title"` Tooltip StateOverTimeWidgetTooltipConfig `json:"tooltip"` - Type StateOverTimeWidgetType `json:"type"` - Url *StateOverTimeWidgetUrlConfig `json:"url,omitempty"` - Value *StateOverTimeWidgetValueConfig `json:"value,omitempty"` + + // Type The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetStateOverTime`. + Type StateOverTimeWidgetType `json:"type"` + Url *StateOverTimeWidgetUrlConfig `json:"url,omitempty"` + Value *StateOverTimeWidgetValueConfig `json:"value,omitempty"` } -// StateOverTimeWidgetType defines model for StateOverTimeWidget.Type. +// StateOverTimeWidgetType The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetStateOverTime`. type StateOverTimeWidgetType string // StateOverTimeWidgetIdentityConfig defines model for StateOverTimeWidgetIdentityConfig. type StateOverTimeWidgetIdentityConfig struct { + // From The name of a metric field containing a unique identifier per desired chart row within the UI. From string `json:"from"` } // StateOverTimeWidgetLabelConfig defines model for StateOverTimeWidgetLabelConfig. type StateOverTimeWidgetLabelConfig struct { + // From The name of a metric field containing a human-readable label per desired chart row within the UI. From string `json:"from"` } // StateOverTimeWidgetStateConfig defines model for StateOverTimeWidgetStateConfig. type StateOverTimeWidgetStateConfig struct { + // From The name of a metric field containing the current state at any time. From string `json:"from"` } // StateOverTimeWidgetTooltipConfig defines model for StateOverTimeWidgetTooltipConfig. type StateOverTimeWidgetTooltipConfig struct { + // From The name of a metric field containing the current tooltip at any time. From string `json:"from"` } // StateOverTimeWidgetUrlConfig defines model for StateOverTimeWidgetUrlConfig. type StateOverTimeWidgetUrlConfig struct { + // From The name of a metric field containing a URL. When available, it causes a chart segment to turn into a hyperlink. From *string `json:"from,omitempty"` } @@ -1178,120 +1335,139 @@ func (t *StopActionResponse) UnmarshalJSON(b []byte) error { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/go/action_kit_api/action_kit_apu_extras.go b/go/action_kit_api/action_kit_api_extras.go similarity index 64% rename from go/action_kit_api/action_kit_apu_extras.go rename to go/action_kit_api/action_kit_api_extras.go index dcbf357f..3c72bd1a 100644 --- a/go/action_kit_api/action_kit_apu_extras.go +++ b/go/action_kit_api/action_kit_api_extras.go @@ -2,3 +2,4 @@ package action_kit_api type ParameterOption interface{} type Widget interface{} +type LineChartWidgetGroupMatcher interface{} diff --git a/go/action_kit_api/build.sh b/go/action_kit_api/build.sh index f6f50f8f..357057cc 100755 --- a/go/action_kit_api/build.sh +++ b/go/action_kit_api/build.sh @@ -7,5 +7,5 @@ set -eo pipefail -go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@v2.3.0 +go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@v2.4.1 oapi-codegen -config generator-config.yml -o action_kit_api.go ../../openapi/spec.yml \ No newline at end of file diff --git a/go/action_kit_api/generator-config.yml b/go/action_kit_api/generator-config.yml index 15437a3a..4b2852d8 100644 --- a/go/action_kit_api/generator-config.yml +++ b/go/action_kit_api/generator-config.yml @@ -7,5 +7,6 @@ output-options: exclude-schemas: - ParameterOption - Widget + - LineChartWidgetGroupMatcher additional-imports: - package: "github.com/google/uuid" diff --git a/openapi/spec.yml b/openapi/spec.yml index 101860d4..ca8cdc57 100644 --- a/openapi/spec.yml +++ b/openapi/spec.yml @@ -170,11 +170,20 @@ components: $ref: '#/components/schemas/Widget' Widget: title: Widget + description: >- + A widget that can be rendered in the experiment result view after an experiment has finished. + Any of + - `action_kit_api.StateOverTimeWidget` + - `action_kit_api.LogWidget` + - `action_kit_api.MarkdownWidget` + - `action_kit_api.PredefinedWidget` + - `action_kit_api.LineChartWidget` anyOf: - $ref: '#/components/schemas/StateOverTimeWidget' - $ref: '#/components/schemas/LogWidget' - $ref: '#/components/schemas/MarkdownWidget' - $ref: '#/components/schemas/PredefinedWidget' + - $ref: '#/components/schemas/LineChartWidget' LogWidget: title: LogWidget description: >- @@ -182,6 +191,8 @@ components: type: object properties: type: + description: >- + The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLog`. type: string enum: [ com.steadybit.widget.log ] title: @@ -205,6 +216,8 @@ components: type: object properties: type: + description: >- + The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetMarkdown`. type: string enum: [ com.steadybit.widget.markdown ] title: @@ -234,6 +247,8 @@ components: type: object properties: type: + description: >- + The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetPredefined`. type: string enum: [ com.steadybit.widget.predefined ] predefinedWidgetId: @@ -242,6 +257,191 @@ components: required: - type - predefinedWidgetId + LineChartWidget: + title: LineChartWidget + description: >- + A widget that shows a line chart. + type: object + properties: + type: + description: >- + The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChart`. + type: string + enum: [ com.steadybit.widget.line_chart ] + title: + description: >- + The title of the widget. This will be displayed in the widget header. + type: string + maxLength: 128 + identity: + $ref: '#/components/schemas/LineChartWidgetIdentityConfig' + grouping: + $ref: '#/components/schemas/LineChartWidgetGroupingConfig' + tooltip: + $ref: '#/components/schemas/LineChartWidgetTooltipConfig' + required: + - type + - title + - identity + LineChartWidgetIdentityConfig: + title: LineChartWidgetIdentityConfig + type: object + properties: + metricName: + description: >- + The name of the metrics that should be considered for this line chart. + type: string + from: + description: >- + The name of a metric field containing a unique identifier per desired line chart within the UI. + type: string + mode: + description: >- + If there are multiple values by evaluating `from`, how should the widgets be rendered? + - `com.steadybit.widget.line_chart.identity_mode.select` - A single widget is rendered and the user can select the value that should be displayed in the widget. + - `com.steadybit.widget.line_chart.identity_mode.widget-per-value` - A separate widget is rendered per given value. + type: string + enum: + - com.steadybit.widget.line_chart.identity_mode.select + - com.steadybit.widget.line_chart.identity_mode.widget-per-value + required: + - metricName + - from + - mode + LineChartWidgetGroupingConfig: + title: LineChartWidgetGroupingConfig + description: >- + Optional configuration to group some data points in the line chart. Groups can be colored and a summary can be shown in an Pie chart next to the line chart. + type: object + properties: + showSummary: + type: boolean + description: >- + If set to `true`, a pie chart will be shown next to the line chart. The pie chart will show the summary of the groups and can be used to filter data points in the line chart. + groups: + type: array + description: >- + A list of groups that should be displayed in the line chart. Each group can be colored and a matcher can be defined to match the data points that should be part of this group. + items: + $ref: '#/components/schemas/LineChartWidgetGroup' + required: + - groups + LineChartWidgetGroup: + title: LineChartWidgetGroup + description: >- + A group of data points in the line chart. + type: object + properties: + title: + description: >- + The title of the group. This will be displayed in the tooltip and the pie chart summary of the widget + type: string + color: + description: >- + The color of the group. This will be used to color the matching data points in the line chart. + type: string + format: color + matcher: + $ref: '#/components/schemas/LineChartWidgetGroupMatcher' + required: + - title + - color + - matcher + LineChartWidgetGroupMatcher: + description: >- + The matcher that should be used to match the data points that should be part of this group. + Any of + - `action_kit_api.LineChartWidgetGroupMatcherFallback` + - `action_kit_api.LineChartWidgetGroupMatcherKeyEqualsValue` + - `action_kit_api.LineChartWidgetGroupMatcherNotEmpty` + anyOf: + - $ref: '#/components/schemas/LineChartWidgetGroupMatcherFallback' + - $ref: '#/components/schemas/LineChartWidgetGroupMatcherKeyEqualsValue' + - $ref: '#/components/schemas/LineChartWidgetGroupMatcherNotEmpty' + LineChartWidgetGroupMatcherFallback: + description: >- + A fallback matcher that will match all data points that are not matched by any other group. + type: object + properties: + type: + description: >- + The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChartGroupMatcherFallback`. + type: string + enum: [ com.steadybit.widget.line_chart.group_matcher_fallback ] + required: + - type + LineChartWidgetGroupMatcherKeyEqualsValue: + description: >- + A matcher that will match all data points where the value of the specified key equals the specified value. + type: object + properties: + type: + description: >- + The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChartGroupMatcherKeyEqualsValue`. + type: string + enum: [ com.steadybit.widget.line_chart.group_matcher_key_equals_value ] + key: + type: string + value: + type: string + required: + - type + - key + - value + LineChartWidgetGroupMatcherNotEmpty: + description: >- + A matcher that will match all data points where the value of the specified key is not empty. + type: object + properties: + type: + description: >- + The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetLineChartGroupMatcherNotEmpty`. + type: string + enum: [ com.steadybit.widget.line_chart.group_matcher_not_empty ] + key: + type: string + required: + - type + - key + LineChartWidgetTooltipConfig: + title: LineChartWidgetTooltipConfig + type: object + properties: + metricValueUnit: + description: >- + Optional unit of the metric value that should be displayed in the tooltip. + type: string + metricValueTitle: + description: >- + Optional title of the metric value that should be displayed in the tooltip. + type: string + additionalContent: + description: >- + Additional content that should be displayed in the tooltip. This can be used to show additional information about the data points in the line chart. + type: array + items: + $ref: '#/components/schemas/LineChartWidgetTooltipContent' + required: + - additionalContent + LineChartWidgetTooltipContent: + title: LineChartWidgetTooltipContent + type: object + properties: + title: + description: >- + The title of the additional content. This will be displayed as caption for the value in the tooltip. + type: string + from: + description: >- + The name of a metric field containing the value for this additional content. + type: string + unit: + description: >- + Optional unit which should be added next to the value in the tooltip. + type: string + required: + - title + - from StateOverTimeWidget: title: StateOverTimeWidget description: >- @@ -249,6 +449,8 @@ components: type: object properties: type: + description: >- + The type of the widget. Needs to be set to `action_kit_api.ComSteadybitWidgetStateOverTime`. type: string enum: [ com.steadybit.widget.state_over_time ] title: @@ -280,6 +482,8 @@ components: type: object properties: from: + description: >- + The name of a metric field containing a unique identifier per desired chart row within the UI. type: string required: - from @@ -288,6 +492,8 @@ components: type: object properties: from: + description: >- + The name of a metric field containing a human-readable label per desired chart row within the UI. type: string required: - from @@ -296,6 +502,8 @@ components: type: object properties: from: + description: >- + The name of a metric field containing the current tooltip at any time. type: string required: - from @@ -304,12 +512,16 @@ components: type: object properties: from: + description: >- + The name of a metric field containing a URL. When available, it causes a chart segment to turn into a hyperlink. type: string StateOverTimeWidgetStateConfig: title: StateOverTimeWidgetStateConfig type: object properties: from: + description: >- + The name of a metric field containing the current state at any time. type: string required: - from @@ -646,7 +858,11 @@ components: Define if for a type = 'string' with options, if only the options should be allowed or also free text. Default is true. options: type: array - description: Optional options for the `string`, `string[]` and `string_array` parameter types. Which result in suggestions for end-users. + description: >- + Optional options for the `string`, `string[]` and `string_array` parameter types. Which result in suggestions for end-users. + Any of: + - `action_kit_api.ExplicitParameterOption` + - `action_kit_api.ParameterOptionsFromTargetAttribute` items: $ref: '#/components/schemas/ParameterOption' uniqueItems: true