grafana / cog

Code Generation with a human touch
Apache License 2.0
43 stars 2 forks source link

Rules: Add DefaultToConstant rule #529

Closed spinillos closed 3 weeks ago

spinillos commented 3 weeks ago

Closes https://github.com/grafana/cog/issues/527

It creates an action to avoid to lose defaults when we modify the options of the builders. These defaults will appear in the constructors of each language that uses Builders to parse the defaults.

We have important defaults like schemaVersion where we are omitting its option and loosing its value.

Note: Probably it could have coolest way to do it but its the cleanest way that I found to solve the issue.

github-actions[bot] commented 3 weeks ago

Note: in addition to the changes introduced by this PR, the diff includes unreleased changes living in main.

### 🔎 Changes to `grafana-foundation-sdk@next+cog-v0.0.x` ```patch diff --git a/go/alerting/notificationpolicy_builder_gen.go b/go/alerting/notificationpolicy_builder_gen.go index 6e5da26..6feca2c 100644 --- a/go/alerting/notificationpolicy_builder_gen.go +++ b/go/alerting/notificationpolicy_builder_gen.go @@ -41,6 +41,14 @@ func (builder *NotificationPolicyBuilder) Build() (NotificationPolicy, error) { return *builder.internal, nil } +// A Route is a node that contains definitions of how to handle alerts. This is modified +// from the upstream alertmanager in that it adds the ObjectMatchers property. +func (builder *NotificationPolicyBuilder) ActiveTimeIntervals(activeTimeIntervals []string) *NotificationPolicyBuilder { + builder.internal.ActiveTimeIntervals = activeTimeIntervals + + return builder +} + // A Route is a node that contains definitions of how to handle alerts. This is modified // from the upstream alertmanager in that it adds the ObjectMatchers property. func (builder *NotificationPolicyBuilder) Continue(continueArg bool) *NotificationPolicyBuilder { diff --git a/go/alerting/notificationtemplate_builder_gen.go b/go/alerting/notificationtemplate_builder_gen.go index 7087deb..2af7cac 100644 --- a/go/alerting/notificationtemplate_builder_gen.go +++ b/go/alerting/notificationtemplate_builder_gen.go @@ -57,5 +57,11 @@ func (builder *NotificationTemplateBuilder) Template(template string) *Notificat return builder } +func (builder *NotificationTemplateBuilder) Version(version string) *NotificationTemplateBuilder { + builder.internal.Version = &version + + return builder +} + func (builder *NotificationTemplateBuilder) applyDefaults() { } diff --git a/go/alerting/types_gen.go b/go/alerting/types_gen.go index e4205d0..89f5def 100644 --- a/go/alerting/types_gen.go +++ b/go/alerting/types_gen.go @@ -141,6 +141,7 @@ type NotificationTemplate struct { Name *string `json:"name,omitempty"` Provenance *Provenance `json:"provenance,omitempty"` Template *string `json:"template,omitempty"` + Version *string `json:"version,omitempty"` } type ObjectMatcher []string @@ -191,6 +192,9 @@ type RelativeTimeRange struct { // A Route is a node that contains definitions of how to handle alerts. This is modified // from the upstream alertmanager in that it adds the ObjectMatchers property. type NotificationPolicy struct { + // A Route is a node that contains definitions of how to handle alerts. This is modified + // from the upstream alertmanager in that it adds the ObjectMatchers property. + ActiveTimeIntervals []string `json:"active_time_intervals,omitempty"` // A Route is a node that contains definitions of how to handle alerts. This is modified // from the upstream alertmanager in that it adds the ObjectMatchers property. Continue *bool `json:"continue,omitempty"` diff --git a/go/bargauge/panel_builder_gen.go b/go/bargauge/panel_builder_gen.go index 10ee5aa..6600f82 100644 --- a/go/bargauge/panel_builder_gen.go +++ b/go/bargauge/panel_builder_gen.go @@ -478,6 +478,20 @@ func (builder *PanelBuilder) MinVizHeight(minVizHeight uint32) *PanelBuilder { return builder } +func (builder *PanelBuilder) Legend(legend cog.Builder[common.VizLegendOptions]) *PanelBuilder { + if builder.internal.Options == nil { + builder.internal.Options = &Options{} + } + legendResource, err := legend.Build() + if err != nil { + builder.errors["options.legend"] = err.(cog.BuildErrors) + return builder + } + builder.internal.Options.(*Options).Legend = legendResource + + return builder +} + func (builder *PanelBuilder) ReduceOptions(reduceOptions cog.Builder[common.ReduceDataOptions]) *PanelBuilder { if builder.internal.Options == nil { builder.internal.Options = &Options{} diff --git a/go/bargauge/types_gen.go b/go/bargauge/types_gen.go index cb37a70..4dfcd63 100644 --- a/go/bargauge/types_gen.go +++ b/go/bargauge/types_gen.go @@ -17,6 +17,7 @@ type Options struct { Sizing common.BarGaugeSizing `json:"sizing"` MinVizWidth uint32 `json:"minVizWidth"` MinVizHeight uint32 `json:"minVizHeight"` + Legend common.VizLegendOptions `json:"legend"` ReduceOptions common.ReduceDataOptions `json:"reduceOptions"` Text *common.VizTextDisplayOptions `json:"text,omitempty"` MaxVizHeight uint32 `json:"maxVizHeight"` diff --git a/go/common/types_gen.go b/go/common/types_gen.go index c089dee..f5d6c0c 100644 --- a/go/common/types_gen.go +++ b/go/common/types_gen.go @@ -622,9 +622,10 @@ const ( type BarGaugeNamePlacement string const ( - BarGaugeNamePlacementAuto BarGaugeNamePlacement = "auto" - BarGaugeNamePlacementTop BarGaugeNamePlacement = "top" - BarGaugeNamePlacementLeft BarGaugeNamePlacement = "left" + BarGaugeNamePlacementAuto BarGaugeNamePlacement = "auto" + BarGaugeNamePlacementTop BarGaugeNamePlacement = "top" + BarGaugeNamePlacementLeft BarGaugeNamePlacement = "left" + BarGaugeNamePlacementHidden BarGaugeNamePlacement = "hidden" ) // Allows for the bar gauge size to be set explicitly diff --git a/go/dashboard/dashboard_builder_gen.go b/go/dashboard/dashboard_builder_gen.go index b8a326e..d6e8a59 100644 --- a/go/dashboard/dashboard_builder_gen.go +++ b/go/dashboard/dashboard_builder_gen.go @@ -27,6 +27,9 @@ func NewDashboardBuilder(title string) *DashboardBuilder { builder.applyDefaults() builder.internal.Title = &title + builder.internal.SchemaVersion = 39 + valEditable := true + builder.internal.Editable = &valEditable return builder } diff --git a/go/dashboard/types_gen.go b/go/dashboard/types_gen.go index a95bc16..6bb90ae 100644 --- a/go/dashboard/types_gen.go +++ b/go/dashboard/types_gen.go @@ -291,6 +291,7 @@ const ( VariableTypeTextbox VariableType = "textbox" VariableTypeCustom VariableType = "custom" VariableTypeSystem VariableType = "system" + VariableTypeSnapshot VariableType = "snapshot" ) // Color mode for a field. You can specify a single color, or select a continuous (gradient) color schemes, based on a value. diff --git a/go/expr/types_gen.go b/go/expr/types_gen.go index f154a57..3d0826d 100644 --- a/go/expr/types_gen.go +++ b/go/expr/types_gen.go @@ -676,8 +676,9 @@ const ( type TypeClassicConditionsType string const ( - TypeClassicConditionsTypeAnd TypeClassicConditionsType = "and" - TypeClassicConditionsTypeOr TypeClassicConditionsType = "or" + TypeClassicConditionsTypeAnd TypeClassicConditionsType = "and" + TypeClassicConditionsTypeOr TypeClassicConditionsType = "or" + TypeClassicConditionsTypeLogicOr TypeClassicConditionsType = "logic-or" ) type TypeThresholdType string diff --git a/go/logs/panel_builder_gen.go b/go/logs/panel_builder_gen.go index b3880c7..2fcdccc 100644 --- a/go/logs/panel_builder_gen.go +++ b/go/logs/panel_builder_gen.go @@ -542,6 +542,33 @@ func (builder *PanelBuilder) OnClickFilterOutString(onClickFilterOutString any) return builder } +func (builder *PanelBuilder) OnClickShowField(onClickShowField any) *PanelBuilder { + if builder.internal.Options == nil { + builder.internal.Options = &Options{} + } + builder.internal.Options.(*Options).OnClickShowField = &onClickShowField + + return builder +} + +func (builder *PanelBuilder) OnClickHideField(onClickHideField any) *PanelBuilder { + if builder.internal.Options == nil { + builder.internal.Options = &Options{} + } + builder.internal.Options.(*Options).OnClickHideField = &onClickHideField + + return builder +} + +func (builder *PanelBuilder) DisplayedFields(displayedFields []string) *PanelBuilder { + if builder.internal.Options == nil { + builder.internal.Options = &Options{} + } + builder.internal.Options.(*Options).DisplayedFields = displayedFields + + return builder +} + func (builder *PanelBuilder) applyDefaults() { builder.Transparent(false) builder.Height(9) diff --git a/go/logs/types_gen.go b/go/logs/types_gen.go index b79fc6a..baa6855 100644 --- a/go/logs/types_gen.go +++ b/go/logs/types_gen.go @@ -20,11 +20,14 @@ type Options struct { SortOrder common.LogsSortOrder `json:"sortOrder"` DedupStrategy common.LogsDedupStrategy `json:"dedupStrategy"` // TODO: figure out how to define callbacks - OnClickFilterLabel any `json:"onClickFilterLabel,omitempty"` - OnClickFilterOutLabel any `json:"onClickFilterOutLabel,omitempty"` - IsFilterLabelActive any `json:"isFilterLabelActive,omitempty"` - OnClickFilterString any `json:"onClickFilterString,omitempty"` - OnClickFilterOutString any `json:"onClickFilterOutString,omitempty"` + OnClickFilterLabel any `json:"onClickFilterLabel,omitempty"` + OnClickFilterOutLabel any `json:"onClickFilterOutLabel,omitempty"` + IsFilterLabelActive any `json:"isFilterLabelActive,omitempty"` + OnClickFilterString any `json:"onClickFilterString,omitempty"` + OnClickFilterOutString any `json:"onClickFilterOutString,omitempty"` + OnClickShowField any `json:"onClickShowField,omitempty"` + OnClickHideField any `json:"onClickHideField,omitempty"` + DisplayedFields []string `json:"displayedFields,omitempty"` } func VariantConfig() variants.PanelcfgConfig { diff --git a/go/statetimeline/panel_builder_gen.go b/go/statetimeline/panel_builder_gen.go index fb9edc2..ef438e2 100644 --- a/go/statetimeline/panel_builder_gen.go +++ b/go/statetimeline/panel_builder_gen.go @@ -449,6 +449,16 @@ func (builder *PanelBuilder) MergeValues(mergeValues bool) *PanelBuilder { return builder } +// Controls value alignment on the timelines +func (builder *PanelBuilder) AlignValue(alignValue common.TimelineValueAlignment) *PanelBuilder { + if builder.internal.Options == nil { + builder.internal.Options = &Options{} + } + builder.internal.Options.(*Options).AlignValue = &alignValue + + return builder +} + func (builder *PanelBuilder) Legend(legend cog.Builder[common.VizLegendOptions]) *PanelBuilder { if builder.internal.Options == nil { builder.internal.Options = &Options{} @@ -486,12 +496,16 @@ func (builder *PanelBuilder) Timezone(timezone []common.TimeZone) *PanelBuilder return builder } -// Controls value alignment on the timelines -func (builder *PanelBuilder) AlignValue(alignValue common.TimelineValueAlignment) *PanelBuilder { +// Enables pagination when > 0 +func (builder *PanelBuilder) PerPage(perPage float64) *PanelBuilder { + if !(perPage >= 1) { + builder.errors["perPage"] = cog.MakeBuildErrors("perPage", errors.New("perPage must be >= 1")) + return builder + } if builder.internal.Options == nil { builder.internal.Options = &Options{} } - builder.internal.Options.(*Options).AlignValue = &alignValue + builder.internal.Options.(*Options).PerPage = &perPage return builder } @@ -553,6 +567,7 @@ func (builder *PanelBuilder) applyDefaults() { builder.RowHeight(0.9) builder.MergeValues(true) builder.AlignValue("left") + builder.PerPage(20) builder.LineWidth(0) builder.FillOpacity(70) } diff --git a/go/statetimeline/types_gen.go b/go/statetimeline/types_gen.go index 305599d..14095c4 100644 --- a/go/statetimeline/types_gen.go +++ b/go/statetimeline/types_gen.go @@ -15,12 +15,14 @@ type Options struct { // Controls the row height RowHeight float64 `json:"rowHeight"` // Merge equal consecutive values - MergeValues *bool `json:"mergeValues,omitempty"` - Legend common.VizLegendOptions `json:"legend"` - Tooltip common.VizTooltipOptions `json:"tooltip"` - Timezone []common.TimeZone `json:"timezone,omitempty"` + MergeValues *bool `json:"mergeValues,omitempty"` // Controls value alignment on the timelines AlignValue *common.TimelineValueAlignment `json:"alignValue,omitempty"` + Legend common.VizLegendOptions `json:"legend"` + Tooltip common.VizTooltipOptions `json:"tooltip"` + Timezone []common.TimeZone `json:"timezone,omitempty"` + // Enables pagination when > 0 + PerPage *float64 `json:"perPage,omitempty"` } type FieldConfig struct { diff --git a/java/gradle.properties b/java/gradle.properties index 26ea477..ecdc8fd 100644 --- a/java/gradle.properties +++ b/java/gradle.properties @@ -1 +1 @@ -grafanaFoundationSDKVersion=next-1722522306 +grafanaFoundationSDKVersion=next-1725534865 diff --git a/java/src/main/java/com/grafana/foundation/alerting/NotificationPolicy.java b/java/src/main/java/com/grafana/foundation/alerting/NotificationPolicy.java index 2680962..6e72c67 100644 --- a/java/src/main/java/com/grafana/foundation/alerting/NotificationPolicy.java +++ b/java/src/main/java/com/grafana/foundation/alerting/NotificationPolicy.java @@ -12,6 +12,10 @@ import com.fasterxml.jackson.databind.ObjectWriter; // A Route is a node that contains definitions of how to handle alerts. This is modified // from the upstream alertmanager in that it adds the ObjectMatchers property. public class NotificationPolicy { + // A Route is a node that contains definitions of how to handle alerts. This is modified + // from the upstream alertmanager in that it adds the ObjectMatchers property. + @JsonProperty("active_time_intervals") + public List activeTimeIntervals; // A Route is a node that contains definitions of how to handle alerts. This is modified // from the upstream alertmanager in that it adds the ObjectMatchers property. @JsonProperty("continue") @@ -77,6 +81,11 @@ public class NotificationPolicy { public Builder() { this.internal = new NotificationPolicy(); } + public Builder activeTimeIntervals(List activeTimeIntervals) { + this.internal.activeTimeIntervals = activeTimeIntervals; + return this; + } + public Builder continueArg(Boolean continueArg) { this.internal.continueArg = continueArg; return this; diff --git a/java/src/main/java/com/grafana/foundation/alerting/NotificationTemplate.java b/java/src/main/java/com/grafana/foundation/alerting/NotificationTemplate.java index 508f3a1..cd57282 100644 --- a/java/src/main/java/com/grafana/foundation/alerting/NotificationTemplate.java +++ b/java/src/main/java/com/grafana/foundation/alerting/NotificationTemplate.java @@ -13,7 +13,9 @@ public class NotificationTemplate { @JsonProperty("provenance") public String provenance; @JsonProperty("template") - public String template; + public String template; + @JsonProperty("version") + public String version; public String toJSON() throws JsonProcessingException { ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); @@ -41,6 +43,11 @@ public class NotificationTemplate { this.internal.template = template; return this; } + + public Builder version(String version) { + this.internal.version = version; + return this; + } public NotificationTemplate build() { return this.internal; } diff --git a/java/src/main/java/com/grafana/foundation/bargauge/Options.java b/java/src/main/java/com/grafana/foundation/bargauge/Options.java index 385c854..cfb1ead 100644 --- a/java/src/main/java/com/grafana/foundation/bargauge/Options.java +++ b/java/src/main/java/com/grafana/foundation/bargauge/Options.java @@ -6,6 +6,7 @@ import com.grafana.foundation.common.BarGaugeDisplayMode; import com.grafana.foundation.common.BarGaugeValueMode; import com.grafana.foundation.common.BarGaugeNamePlacement; import com.grafana.foundation.common.BarGaugeSizing; +import com.grafana.foundation.common.VizLegendOptions; import com.grafana.foundation.common.ReduceDataOptions; import com.grafana.foundation.common.VizTextDisplayOptions; import com.grafana.foundation.common.VizOrientation; @@ -29,6 +30,8 @@ public class Options { public Integer minVizWidth; @JsonProperty("minVizHeight") public Integer minVizHeight; + @JsonProperty("legend") + public VizLegendOptions legend; @JsonProperty("reduceOptions") public ReduceDataOptions reduceOptions; @JsonProperty("text") diff --git a/java/src/main/java/com/grafana/foundation/bargauge/PanelBuilder.java b/java/src/main/java/com/grafana/foundation/bargauge/PanelBuilder.java index 009843b..88a115c 100644 --- a/java/src/main/java/com/grafana/foundation/bargauge/PanelBuilder.java +++ b/java/src/main/java/com/grafana/foundation/bargauge/PanelBuilder.java @@ -6,6 +6,7 @@ import com.grafana.foundation.common.BarGaugeDisplayMode; import com.grafana.foundation.common.BarGaugeValueMode; import com.grafana.foundation.common.BarGaugeNamePlacement; import com.grafana.foundation.common.BarGaugeSizing; +import com.grafana.foundation.common.VizLegendOptions; import com.grafana.foundation.common.ReduceDataOptions; import com.grafana.foundation.common.VizTextDisplayOptions; import com.grafana.foundation.common.VizOrientation; @@ -333,6 +334,15 @@ public class PanelBuilder implements com.grafana.foundation.cog.Builder { this.internal.options = optionsResource; return this; } + public PanelBuilder legend(com.grafana.foundation.cog.Builder legend) { + if (this.internal.options == null) { + this.internal.options = new com.grafana.foundation.bargauge.Options(); + } + com.grafana.foundation.bargauge.Options optionsResource = (com.grafana.foundation.bargauge.Options) this.internal.options; + optionsResource.legend = legend.build(); + this.internal.options = optionsResource; + return this; + } public PanelBuilder reduceOptions(com.grafana.foundation.cog.Builder reduceOptions) { if (this.internal.options == null) { this.internal.options = new com.grafana.foundation.bargauge.Options(); diff --git a/java/src/main/java/com/grafana/foundation/common/BarGaugeNamePlacement.java b/java/src/main/java/com/grafana/foundation/common/BarGaugeNamePlacement.java index 0e43966..3780c34 100644 --- a/java/src/main/java/com/grafana/foundation/common/BarGaugeNamePlacement.java +++ b/java/src/main/java/com/grafana/foundation/common/BarGaugeNamePlacement.java @@ -12,6 +12,7 @@ public enum BarGaugeNamePlacement { AUTO("auto"), TOP("top"), LEFT("left"), + HIDDEN("hidden"), _EMPTY(""); private final String value; diff --git a/java/src/main/java/com/grafana/foundation/common/Constants.java b/java/src/main/java/com/grafana/foundation/common/Constants.java index be9af52..cc841b4 100644 --- a/java/src/main/java/com/grafana/foundation/common/Constants.java +++ b/java/src/main/java/com/grafana/foundation/common/Constants.java @@ -3,6 +3,6 @@ package com.grafana.foundation.common; public class Constants { - public static final String TimeZoneBrowser = "browser"; public static final String TimeZoneUtc = "utc"; + public static final String TimeZoneBrowser = "browser"; } diff --git a/java/src/main/java/com/grafana/foundation/dashboard/Dashboard.java b/java/src/main/java/com/grafana/foundation/dashboard/Dashboard.java index 0146375..80c7b52 100644 --- a/java/src/main/java/com/grafana/foundation/dashboard/Dashboard.java +++ b/java/src/main/java/com/grafana/foundation/dashboard/Dashboard.java @@ -108,6 +108,8 @@ public class Dashboard { public Builder(String title) { this.internal = new Dashboard(); this.internal.title = title; + this.internal.schemaVersion = 39; + this.internal.editable = true; this.currentY = 0; this.currentX = 0; this.lastPanelHeight = 0; diff --git a/java/src/main/java/com/grafana/foundation/dashboard/VariableType.java b/java/src/main/java/com/grafana/foundation/dashboard/VariableType.java index 6c61345..dec7e8e 100644 --- a/java/src/main/java/com/grafana/foundation/dashboard/VariableType.java +++ b/java/src/main/java/com/grafana/foundation/dashboard/VariableType.java @@ -26,6 +26,7 @@ public enum VariableType { TEXTBOX("textbox"), CUSTOM("custom"), SYSTEM("system"), + SNAPSHOT("snapshot"), _EMPTY(""); private final String value; diff --git a/java/src/main/java/com/grafana/foundation/expr/TypeClassicConditionsType.java b/java/src/main/java/com/grafana/foundation/expr/TypeClassicConditionsType.java index ae5daef..fdafbcf 100644 --- a/java/src/main/java/com/grafana/foundation/expr/TypeClassicConditionsType.java +++ b/java/src/main/java/com/grafana/foundation/expr/TypeClassicConditionsType.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum TypeClassicConditionsType { AND("and"), OR("or"), + LOGIC_OR("logic-or"), _EMPTY(""); private final String value; diff --git a/java/src/main/java/com/grafana/foundation/logs/Options.java b/java/src/main/java/com/grafana/foundation/logs/Options.java index 6170125..8b4ec92 100644 --- a/java/src/main/java/com/grafana/foundation/logs/Options.java +++ b/java/src/main/java/com/grafana/foundation/logs/Options.java @@ -4,6 +4,7 @@ package com.grafana.foundation.logs; import com.grafana.foundation.common.LogsSortOrder; import com.grafana.foundation.common.LogsDedupStrategy; +import java.util.List; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -38,7 +39,13 @@ public class Options { @JsonProperty("onClickFilterString") public Object onClickFilterString; @JsonProperty("onClickFilterOutString") - public Object onClickFilterOutString; + public Object onClickFilterOutString; + @JsonProperty("onClickShowField") + public Object onClickShowField; + @JsonProperty("onClickHideField") + public Object onClickHideField; + @JsonProperty("displayedFields") + public List displayedFields; public String toJSON() throws JsonProcessingException { ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); diff --git a/java/src/main/java/com/grafana/foundation/logs/PanelBuilder.java b/java/src/main/java/com/grafana/foundation/logs/PanelBuilder.java index b0c93fb..be02dfb 100644 --- a/java/src/main/java/com/grafana/foundation/logs/PanelBuilder.java +++ b/java/src/main/java/com/grafana/foundation/logs/PanelBuilder.java @@ -4,12 +4,12 @@ package com.grafana.foundation.logs; import com.grafana.foundation.common.LogsSortOrder; import com.grafana.foundation.common.LogsDedupStrategy; +import java.util.List; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.grafana.foundation.dashboard.Panel; -import java.util.List; import com.grafana.foundation.cog.variants.Dataquery; import java.util.LinkedList; import com.grafana.foundation.dashboard.DataSourceRef; @@ -383,6 +383,33 @@ public class PanelBuilder implements com.grafana.foundation.cog.Builder { this.internal.options = optionsResource; return this; } + public PanelBuilder onClickShowField(Object onClickShowField) { + if (this.internal.options == null) { + this.internal.options = new com.grafana.foundation.logs.Options(); + } + com.grafana.foundation.logs.Options optionsResource = (com.grafana.foundation.logs.Options) this.internal.options; + optionsResource.onClickShowField = onClickShowField; + this.internal.options = optionsResource; + return this; + } + public PanelBuilder onClickHideField(Object onClickHideField) { + if (this.internal.options == null) { + this.internal.options = new com.grafana.foundation.logs.Options(); + } + com.grafana.foundation.logs.Options optionsResource = (com.grafana.foundation.logs.Options) this.internal.options; + optionsResource.onClickHideField = onClickHideField; + this.internal.options = optionsResource; + return this; + } + public PanelBuilder displayedFields(List displayedFields) { + if (this.internal.options == null) { + this.internal.options = new com.grafana.foundation.logs.Options(); + } + com.grafana.foundation.logs.Options optionsResource = (com.grafana.foundation.logs.Options) this.internal.options; + optionsResource.displayedFields = displayedFields; + this.internal.options = optionsResource; + return this; + } public Panel build() { return this.internal; diff --git a/java/src/main/java/com/grafana/foundation/statetimeline/Options.java b/java/src/main/java/com/grafana/foundation/statetimeline/Options.java index 8f4eedc..1c2ed88 100644 --- a/java/src/main/java/com/grafana/foundation/statetimeline/Options.java +++ b/java/src/main/java/com/grafana/foundation/statetimeline/Options.java @@ -3,10 +3,10 @@ package com.grafana.foundation.statetimeline; import com.grafana.foundation.common.VisibilityMode; +import com.grafana.foundation.common.TimelineValueAlignment; import com.grafana.foundation.common.VizLegendOptions; import com.grafana.foundation.common.VizTooltipOptions; import java.util.List; -import com.grafana.foundation.common.TimelineValueAlignment; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -21,16 +21,19 @@ public class Options { public Double rowHeight; // Merge equal consecutive values @JsonProperty("mergeValues") - public Boolean mergeValues; + public Boolean mergeValues; + // Controls value alignment on the timelines + @JsonProperty("alignValue") + public TimelineValueAlignment alignValue; @JsonProperty("legend") public VizLegendOptions legend; @JsonProperty("tooltip") public VizTooltipOptions tooltip; @JsonProperty("timezone") public List timezone; - // Controls value alignment on the timelines - @JsonProperty("alignValue") - public TimelineValueAlignment alignValue; + // Enables pagination when > 0 + @JsonProperty("perPage") + public Double perPage; public String toJSON() throws JsonProcessingException { ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); diff --git a/java/src/main/java/com/grafana/foundation/statetimeline/PanelBuilder.java b/java/src/main/java/com/grafana/foundation/statetimeline/PanelBuilder.java index 067a82e..4c634a5 100644 --- a/java/src/main/java/com/grafana/foundation/statetimeline/PanelBuilder.java +++ b/java/src/main/java/com/grafana/foundation/statetimeline/PanelBuilder.java @@ -3,10 +3,10 @@ package com.grafana.foundation.statetimeline; import com.grafana.foundation.common.VisibilityMode; +import com.grafana.foundation.common.TimelineValueAlignment; import com.grafana.foundation.common.VizLegendOptions; import com.grafana.foundation.common.VizTooltipOptions; import java.util.List; -import com.grafana.foundation.common.TimelineValueAlignment; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -39,6 +39,7 @@ public class PanelBuilder implements com.grafana.foundation.cog.Builder { this.rowHeight(0.9); this.mergeValues(true); this.alignValue(TimelineValueAlignment.LEFT); + this.perPage(20.0); this.lineWidth(0); this.fillOpacity(70); } @@ -296,6 +297,15 @@ public class PanelBuilder implements com.grafana.foundation.cog.Builder { this.internal.options = optionsResource; return this; } + public PanelBuilder alignValue(TimelineValueAlignment alignValue) { + if (this.internal.options == null) { + this.internal.options = new com.grafana.foundation.statetimeline.Options(); + } + com.grafana.foundation.statetimeline.Options optionsResource = (com.grafana.foundation.statetimeline.Options) this.internal.options; + optionsResource.alignValue = alignValue; + this.internal.options = optionsResource; + return this; + } public PanelBuilder legend(com.grafana.foundation.cog.Builder legend) { if (this.internal.options == null) { this.internal.options = new com.grafana.foundation.statetimeline.Options(); @@ -323,12 +333,15 @@ public class PanelBuilder implements com.grafana.foundation.cog.Builder { this.internal.options = optionsResource; return this; } - public PanelBuilder alignValue(TimelineValueAlignment alignValue) { + public PanelBuilder perPage(Double perPage) { + if (!(perPage >= 1)) { + throw new IllegalArgumentException("perPage must be >= 1"); + } if (this.internal.options == null) { this.internal.options = new com.grafana.foundation.statetimeline.Options(); } com.grafana.foundation.statetimeline.Options optionsResource = (com.grafana.foundation.statetimeline.Options) this.internal.options; - optionsResource.alignValue = alignValue; + optionsResource.perPage = perPage; this.internal.options = optionsResource; return this; } diff --git a/jsonschema/alerting.jsonschema.json b/jsonschema/alerting.jsonschema.json index bb926f0..e4b5d3a 100644 --- a/jsonschema/alerting.jsonschema.json +++ b/jsonschema/alerting.jsonschema.json @@ -209,6 +209,9 @@ }, "template": { "type": "string" + }, + "version": { + "type": "string" } } }, @@ -358,6 +361,13 @@ "type": "object", "additionalProperties": false, "properties": { + "active_time_intervals": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A Route is a node that contains definitions of how to handle alerts. This is modified\nfrom the upstream alertmanager in that it adds the ObjectMatchers property." + }, "continue": { "type": "boolean", "description": "A Route is a node that contains definitions of how to handle alerts. This is modified\nfrom the upstream alertmanager in that it adds the ObjectMatchers property." diff --git a/jsonschema/bargauge.jsonschema.json b/jsonschema/bargauge.jsonschema.json index f9406c8..7c506f8 100644 --- a/jsonschema/bargauge.jsonschema.json +++ b/jsonschema/bargauge.jsonschema.json @@ -12,6 +12,7 @@ "sizing", "minVizWidth", "minVizHeight", + "legend", "reduceOptions", "maxVizHeight", "orientation" @@ -45,6 +46,9 @@ "type": "integer", "default": 16 }, + "legend": { + "$ref": "#/definitions/VizLegendOptions" + }, "reduceOptions": { "$ref": "#/definitions/ReduceDataOptions" }, @@ -80,7 +84,8 @@ "enum": [ "auto", "top", - "left" + "left", + "hidden" ], "description": "Allows for the bar gauge name to be placed explicitly" }, @@ -91,6 +96,52 @@ ], "description": "Allows for the bar gauge size to be set explicitly" }, + "VizLegendOptions": { + "type": "object", + "additionalProperties": false, + "required": [ + "displayMode", + "placement", + "showLegend", + "calcs" + ], + "properties": { + "displayMode": { + "$ref": "#/definitions/LegendDisplayMode", + "default": "list" + }, + "placement": { + "$ref": "#/definitions/LegendPlacement", + "default": "bottom" + }, + "showLegend": { + "type": "boolean" + }, + "asTable": { + "type": "boolean" + }, + "isVisible": { + "type": "boolean" + }, + "sortBy": { + "type": "string" + }, + "sortDesc": { + "type": "boolean" + }, + "width": { + "type": "number" + }, + "calcs": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "description": "TODO docs" + }, "ReduceDataOptions": { "type": "object", "additionalProperties": false, @@ -142,6 +193,21 @@ "horizontal" ], "description": "TODO docs" + }, + "LegendDisplayMode": { + "enum": [ + "list", + "table", + "hidden" + ], + "description": "TODO docs\nNote: \"hidden\" needs to remain as an option for plugins compatibility" + }, + "LegendPlacement": { + "enum": [ + "bottom", + "right" + ], + "description": "TODO docs" } } } \ No newline at end of file diff --git a/jsonschema/common.jsonschema.json b/jsonschema/common.jsonschema.json index ee3f341..8022a09 100644 --- a/jsonschema/common.jsonschema.json +++ b/jsonschema/common.jsonschema.json @@ -997,7 +997,8 @@ "enum": [ "auto", "top", - "left" + "left", + "hidden" ], "description": "Allows for the bar gauge name to be placed explicitly" }, diff --git a/jsonschema/dashboard.jsonschema.json b/jsonschema/dashboard.jsonschema.json index 78923dc..a1454e7 100644 --- a/jsonschema/dashboard.jsonschema.json +++ b/jsonschema/dashboard.jsonschema.json @@ -537,7 +537,8 @@ "interval", "textbox", "custom", - "system" + "system", + "snapshot" ], "description": "Dashboard variable type\n`query`: Query-generated list of values such as metric names, server names, sensor IDs, data centers, and so on.\n`adhoc`: Key/value filters that are automatically added to all metric queries for a data source (Prometheus, Loki, InfluxDB, and Elasticsearch only).\n`constant`: \tDefine a hidden constant.\n`datasource`: Quickly change the data source for an entire dashboard.\n`interval`: Interval variables represent time spans.\n`textbox`: Display a free text input field with an optional default value.\n`custom`: Define the variable options manually using a comma-separated list.\n`system`: Variables defined by Grafana. See: https://grafana.com/docs/grafana/latest/dashboards/variables/add-template-variables/#global-variables" }, diff --git a/jsonschema/expr.jsonschema.json b/jsonschema/expr.jsonschema.json index 0edafd9..7179f7a 100644 --- a/jsonschema/expr.jsonschema.json +++ b/jsonschema/expr.jsonschema.json @@ -500,7 +500,8 @@ "type": { "enum": [ "and", - "or" + "or", + "logic-or" ] } } diff --git a/jsonschema/logs.jsonschema.json b/jsonschema/logs.jsonschema.json index bcf9764..9cdf0f8 100644 --- a/jsonschema/logs.jsonschema.json +++ b/jsonschema/logs.jsonschema.json @@ -63,6 +63,20 @@ "onClickFilterOutString": { "type": "object", "additionalProperties": {} + }, + "onClickShowField": { + "type": "object", + "additionalProperties": {} + }, + "onClickHideField": { + "type": "object", + "additionalProperties": {} + }, + "displayedFields": { + "type": "array", + "items": { + "type": "string" + } } } }, diff --git a/jsonschema/statetimeline.jsonschema.json b/jsonschema/statetimeline.jsonschema.json index 7547899..f7490ec 100644 --- a/jsonschema/statetimeline.jsonschema.json +++ b/jsonschema/statetimeline.jsonschema.json @@ -27,6 +27,11 @@ "description": "Merge equal consecutive values", "default": true }, + "alignValue": { + "$ref": "#/definitions/TimelineValueAlignment", + "description": "Controls value alignment on the timelines", + "default": "left" + }, "legend": { "$ref": "#/definitions/VizLegendOptions" }, @@ -39,10 +44,11 @@ "$ref": "#/definitions/TimeZone" } }, - "alignValue": { - "$ref": "#/definitions/TimelineValueAlignment", - "description": "Controls value alignment on the timelines", - "default": "left" + "perPage": { + "type": "number", + "minimum": 1, + "description": "Enables pagination when \u003e 0", + "default": 20 } } }, @@ -73,6 +79,14 @@ ], "description": "TODO docs" }, + "TimelineValueAlignment": { + "enum": [ + "center", + "left", + "right" + ], + "description": "Controls the value alignment in the TimelineChart component" + }, "VizLegendOptions": { "type": "object", "additionalProperties": false, @@ -146,14 +160,6 @@ "type": "string", "description": "A specific timezone from https://en.wikipedia.org/wiki/Tz_database" }, - "TimelineValueAlignment": { - "enum": [ - "center", - "left", - "right" - ], - "description": "Controls the value alignment in the TimelineChart component" - }, "HideSeriesConfig": { "type": "object", "additionalProperties": false, diff --git a/openapi/alerting.openapi.json b/openapi/alerting.openapi.json index 9d6de84..ac08e52 100644 --- a/openapi/alerting.openapi.json +++ b/openapi/alerting.openapi.json @@ -217,6 +217,9 @@ }, "template": { "type": "string" + }, + "version": { + "type": "string" } } }, @@ -366,6 +369,13 @@ "type": "object", "additionalProperties": false, "properties": { + "active_time_intervals": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A Route is a node that contains definitions of how to handle alerts. This is modified\nfrom the upstream alertmanager in that it adds the ObjectMatchers property." + }, "continue": { "type": "boolean", "description": "A Route is a node that contains definitions of how to handle alerts. This is modified\nfrom the upstream alertmanager in that it adds the ObjectMatchers property." diff --git a/openapi/bargauge.openapi.json b/openapi/bargauge.openapi.json index 82c8979..2897cfb 100644 --- a/openapi/bargauge.openapi.json +++ b/openapi/bargauge.openapi.json @@ -21,6 +21,7 @@ "sizing", "minVizWidth", "minVizHeight", + "legend", "reduceOptions", "maxVizHeight", "orientation" @@ -54,6 +55,9 @@ "type": "integer", "default": 16 }, + "legend": { + "$ref": "#/components/schemas/VizLegendOptions" + }, "reduceOptions": { "$ref": "#/components/schemas/ReduceDataOptions" }, @@ -89,7 +93,8 @@ "enum": [ "auto", "top", - "left" + "left", + "hidden" ], "description": "Allows for the bar gauge name to be placed explicitly" }, @@ -100,6 +105,52 @@ ], "description": "Allows for the bar gauge size to be set explicitly" }, + "VizLegendOptions": { + "type": "object", + "additionalProperties": false, + "required": [ + "displayMode", + "placement", + "showLegend", + "calcs" + ], + "properties": { + "displayMode": { + "$ref": "#/components/schemas/LegendDisplayMode", + "default": "list" + }, + "placement": { + "$ref": "#/components/schemas/LegendPlacement", + "default": "bottom" + }, + "showLegend": { + "type": "boolean" + }, + "asTable": { + "type": "boolean" + }, + "isVisible": { + "type": "boolean" + }, + "sortBy": { + "type": "string" + }, + "sortDesc": { + "type": "boolean" + }, + "width": { + "type": "number" + }, + "calcs": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "description": "TODO docs" + }, "ReduceDataOptions": { "type": "object", "additionalProperties": false, @@ -151,6 +202,21 @@ "horizontal" ], "description": "TODO docs" + }, + "LegendDisplayMode": { + "enum": [ + "list", + "table", + "hidden" + ], + "description": "TODO docs\nNote: \"hidden\" needs to remain as an option for plugins compatibility" + }, + "LegendPlacement": { + "enum": [ + "bottom", + "right" + ], + "description": "TODO docs" } } } diff --git a/openapi/common.openapi.json b/openapi/common.openapi.json index 2493889..c50f545 100644 --- a/openapi/common.openapi.json +++ b/openapi/common.openapi.json @@ -1005,7 +1005,8 @@ "enum": [ "auto", "top", - "left" + "left", + "hidden" ], "description": "Allows for the bar gauge name to be placed explicitly" }, diff --git a/openapi/dashboard.openapi.json b/openapi/dashboard.openapi.json index 91548cc..ab92de9 100644 --- a/openapi/dashboard.openapi.json +++ b/openapi/dashboard.openapi.json @@ -544,7 +544,8 @@ "interval", "textbox", "custom", - "system" + "system", + "snapshot" ], "description": "Dashboard variable type\n`query`: Query-generated list of values such as metric names, server names, sensor IDs, data centers, and so on.\n`adhoc`: Key/value filters that are automatically added to all metric queries for a data source (Prometheus, Loki, InfluxDB, and Elasticsearch only).\n`constant`: \tDefine a hidden constant.\n`datasource`: Quickly change the data source for an entire dashboard.\n`interval`: Interval variables represent time spans.\n`textbox`: Display a free text input field with an optional default value.\n`custom`: Define the variable options manually using a comma-separated list.\n`system`: Variables defined by Grafana. See: https://grafana.com/docs/grafana/latest/dashboards/variables/add-template-variables/#global-variables" }, diff --git a/openapi/expr.openapi.json b/openapi/expr.openapi.json index 68b8893..266fef1 100644 --- a/openapi/expr.openapi.json +++ b/openapi/expr.openapi.json @@ -508,7 +508,8 @@ "type": { "enum": [ "and", - "or" + "or", + "logic-or" ] } } diff --git a/openapi/logs.openapi.json b/openapi/logs.openapi.json index bc26d8e..9dbff17 100644 --- a/openapi/logs.openapi.json +++ b/openapi/logs.openapi.json @@ -72,6 +72,20 @@ "onClickFilterOutString": { "type": "object", "additionalProperties": {} + }, + "onClickShowField": { + "type": "object", + "additionalProperties": {} + }, + "onClickHideField": { + "type": "object", + "additionalProperties": {} + }, + "displayedFields": { + "type": "array", + "items": { + "type": "string" + } } } }, diff --git a/openapi/statetimeline.openapi.json b/openapi/statetimeline.openapi.json index 2b91df9..2b91221 100644 --- a/openapi/statetimeline.openapi.json +++ b/openapi/statetimeline.openapi.json @@ -36,6 +36,11 @@ "description": "Merge equal consecutive values", "default": true }, + "alignValue": { + "$ref": "#/components/schemas/TimelineValueAlignment", + "description": "Controls value alignment on the timelines", + "default": "left" + }, "legend": { "$ref": "#/components/schemas/VizLegendOptions" }, @@ -48,10 +53,11 @@ "$ref": "#/components/schemas/TimeZone" } }, - "alignValue": { - "$ref": "#/components/schemas/TimelineValueAlignment", - "description": "Controls value alignment on the timelines", - "default": "left" + "perPage": { + "type": "number", + "minimum": 1, + "description": "Enables pagination when \u003e 0", + "default": 20 } } }, @@ -82,6 +88,14 @@ ], "description": "TODO docs" }, + "TimelineValueAlignment": { + "enum": [ + "center", + "left", + "right" + ], + "description": "Controls the value alignment in the TimelineChart component" + }, "VizLegendOptions": { "type": "object", "additionalProperties": false, @@ -155,14 +169,6 @@ "type": "string", "description": "A specific timezone from https://en.wikipedia.org/wiki/Tz_database" }, - "TimelineValueAlignment": { - "enum": [ - "center", - "left", - "right" - ], - "description": "Controls the value alignment in the TimelineChart component" - }, "HideSeriesConfig": { "type": "object", "additionalProperties": false, diff --git a/php/src/Alerting/NotificationPolicy.php b/php/src/Alerting/NotificationPolicy.php index 3c2a3bc..e5a1dd0 100644 --- a/php/src/Alerting/NotificationPolicy.php +++ b/php/src/Alerting/NotificationPolicy.php @@ -8,6 +8,13 @@ namespace Grafana\Foundation\Alerting; */ class NotificationPolicy implements \JsonSerializable { + /** + * A Route is a node that contains definitions of how to handle alerts. This is modified + * from the upstream alertmanager in that it adds the ObjectMatchers property. + * @var array|null + */ + public ?array $activeTimeIntervals; + /** * A Route is a node that contains definitions of how to handle alerts. This is modified * from the upstream alertmanager in that it adds the ObjectMatchers property. @@ -94,6 +101,7 @@ class NotificationPolicy implements \JsonSerializable public ?array $routes; /** + * @param array|null $activeTimeIntervals * @param bool|null $continue * @param array|null $groupBy * @param string|null $groupInterval @@ -108,8 +116,9 @@ class NotificationPolicy implements \JsonSerializable * @param string|null $repeatInterval * @param array<\Grafana\Foundation\Alerting\NotificationPolicy>|null $routes */ - public function __construct(?bool $continue = null, ?array $groupBy = null, ?string $groupInterval = null, ?string $groupWait = null, ?array $match = null, ?array $matchRe = null, ?array $matchers = null, ?array $muteTimeIntervals = null, ?array $objectMatchers = null, ?string $provenance = null, ?string $receiver = null, ?string $repeatInterval = null, ?array $routes = null) + public function __construct(?array $activeTimeIntervals = null, ?bool $continue = null, ?array $groupBy = null, ?string $groupInterval = null, ?string $groupWait = null, ?array $match = null, ?array $matchRe = null, ?array $matchers = null, ?array $muteTimeIntervals = null, ?array $objectMatchers = null, ?string $provenance = null, ?string $receiver = null, ?string $repeatInterval = null, ?array $routes = null) { + $this->activeTimeIntervals = $activeTimeIntervals; $this->continue = $continue; $this->groupBy = $groupBy; $this->groupInterval = $groupInterval; @@ -130,9 +139,10 @@ class NotificationPolicy implements \JsonSerializable */ public static function fromArray(array $inputData): self { - /** @var array{continue?: bool, group_by?: array, group_interval?: string, group_wait?: string, match?: array, match_re?: array, matchers?: array, mute_time_intervals?: array, object_matchers?: array>, provenance?: string, receiver?: string, repeat_interval?: string, routes?: array} $inputData */ + /** @var array{active_time_intervals?: array, continue?: bool, group_by?: array, group_interval?: string, group_wait?: string, match?: array, match_re?: array, matchers?: array, mute_time_intervals?: array, object_matchers?: array>, provenance?: string, receiver?: string, repeat_interval?: string, routes?: array} $inputData */ $data = $inputData; return new self( + activeTimeIntervals: $data["active_time_intervals"] ?? null, continue: $data["continue"] ?? null, groupBy: $data["group_by"] ?? null, groupInterval: $data["group_interval"] ?? null, @@ -150,7 +160,7 @@ class NotificationPolicy implements \JsonSerializable receiver: $data["receiver"] ?? null, repeatInterval: $data["repeat_interval"] ?? null, routes: array_filter(array_map((function($input) { - /** @var array{continue?: bool, group_by?: array, group_interval?: string, group_wait?: string, match?: array, match_re?: array, matchers?: array, mute_time_intervals?: array, object_matchers?: array>, provenance?: string, receiver?: string, repeat_interval?: string, routes?: array} */ + /** @var array{active_time_intervals?: array, continue?: bool, group_by?: array, group_interval?: string, group_wait?: string, match?: array, match_re?: array, matchers?: array, mute_time_intervals?: array, object_matchers?: array>, provenance?: string, receiver?: string, repeat_interval?: string, routes?: array} */ $val = $input; return \Grafana\Foundation\Alerting\NotificationPolicy::fromArray($val); }), $data["routes"] ?? [])), @@ -168,6 +178,9 @@ class NotificationPolicy implements \JsonSerializable "object_matchers" => $this->objectMatchers, "provenance" => $this->provenance, ]; + if (isset($this->activeTimeIntervals)) { + $data["active_time_intervals"] = $this->activeTimeIntervals; + } if (isset($this->continue)) { $data["continue"] = $this->continue; } diff --git a/php/src/Alerting/NotificationPolicyBuilder.php b/php/src/Alerting/NotificationPolicyBuilder.php index c024b2c..57cefc4 100644 --- a/php/src/Alerting/NotificationPolicyBuilder.php +++ b/php/src/Alerting/NotificationPolicyBuilder.php @@ -24,6 +24,17 @@ class NotificationPolicyBuilder implements \Grafana\Foundation\Cog\Builder return $this->internal; } + /** + * A Route is a node that contains definitions of how to handle alerts. This is modified + * from the upstream alertmanager in that it adds the ObjectMatchers property. + * @param array $activeTimeIntervals + */ + public function activeTimeIntervals(array $activeTimeIntervals): static + { + $this->internal->activeTimeIntervals = $activeTimeIntervals; + + return $this; + } /** * A Route is a node that contains definitions of how to handle alerts. This is modified * from the upstream alertmanager in that it adds the ObjectMatchers property. diff --git a/php/src/Alerting/NotificationTemplate.php b/php/src/Alerting/NotificationTemplate.php index e914c7a..19e9790 100644 --- a/php/src/Alerting/NotificationTemplate.php +++ b/php/src/Alerting/NotificationTemplate.php @@ -10,16 +10,20 @@ class NotificationTemplate implements \JsonSerializable public ?string $template; + public ?string $version; + /** * @param string|null $name * @param string|null $provenance * @param string|null $template + * @param string|null $version */ - public function __construct(?string $name = null, ?string $provenance = null, ?string $template = null) + public function __construct(?string $name = null, ?string $provenance = null, ?string $template = null, ?string $version = null) { $this->name = $name; $this->provenance = $provenance ?: ""; $this->template = $template; + $this->version = $version; } /** @@ -27,12 +31,13 @@ class NotificationTemplate implements \JsonSerializable */ public static function fromArray(array $inputData): self { - /** @var array{name?: string, provenance?: string, template?: string} $inputData */ + /** @var array{name?: string, provenance?: string, template?: string, version?: string} $inputData */ $data = $inputData; return new self( name: $data["name"] ?? null, provenance: $data["provenance"] ?? null, template: $data["template"] ?? null, + version: $data["version"] ?? null, ); } @@ -50,6 +55,9 @@ class NotificationTemplate implements \JsonSerializable if (isset($this->template)) { $data["template"] = $this->template; } + if (isset($this->version)) { + $data["version"] = $this->version; + } return $data; } } diff --git a/php/src/Alerting/NotificationTemplateBuilder.php b/php/src/Alerting/NotificationTemplateBuilder.php index 7ab6d93..1f48d27 100644 --- a/php/src/Alerting/NotificationTemplateBuilder.php +++ b/php/src/Alerting/NotificationTemplateBuilder.php @@ -40,5 +40,11 @@ class NotificationTemplateBuilder implements \Grafana\Foundation\Cog\Builder return $this; } + public function version(string $version): static + { + $this->internal->version = $version; + + return $this; + } } diff --git a/php/src/Azuremonitor/AzureMonitorQuery.php b/php/src/Azuremonitor/AzureMonitorQuery.php index d7854cb..78ec962 100644 --- a/php/src/Azuremonitor/AzureMonitorQuery.php +++ b/php/src/Azuremonitor/AzureMonitorQuery.php @@ -159,26 +159,26 @@ class AzureMonitorQuery implements \JsonSerializable, \Grafana\Foundation\Cog\Da \assert(is_array($input), 'expected disjunction value to be an array'); switch ($input["kind"]) { - case "AppInsightsMetricNameQuery": - return AppInsightsMetricNameQuery::fromArray($input); case "ResourceNamesQuery": return ResourceNamesQuery::fromArray($input); - case "SubscriptionsQuery": - return SubscriptionsQuery::fromArray($input); - case "UnknownQuery": - return UnknownQuery::fromArray($input); - case "MetricNamesQuery": - return MetricNamesQuery::fromArray($input); case "MetricNamespaceQuery": return MetricNamespaceQuery::fromArray($input); - case "MetricDefinitionsQuery": - return MetricDefinitionsQuery::fromArray($input); case "WorkspacesQuery": return WorkspacesQuery::fromArray($input); case "AppInsightsGroupByQuery": return AppInsightsGroupByQuery::fromArray($input); case "ResourceGroupsQuery": return ResourceGroupsQuery::fromArray($input); + case "MetricDefinitionsQuery": + return MetricDefinitionsQuery::fromArray($input); + case "MetricNamesQuery": + return MetricNamesQuery::fromArray($input); + case "SubscriptionsQuery": + return SubscriptionsQuery::fromArray($input); + case "UnknownQuery": + return UnknownQuery::fromArray($input); + case "AppInsightsMetricNameQuery": + return AppInsightsMetricNameQuery::fromArray($input); default: throw new \ValueError('can not parse disjunction from array'); } diff --git a/php/src/Bargauge/Options.php b/php/src/Bargauge/Options.php index ae6383b..6901e1b 100644 --- a/php/src/Bargauge/Options.php +++ b/php/src/Bargauge/Options.php @@ -18,6 +18,8 @@ class Options implements \JsonSerializable public int $minVizHeight; + public \Grafana\Foundation\Common\VizLegendOptions $legend; + public \Grafana\Foundation\Common\ReduceDataOptions $reduceOptions; public ?\Grafana\Foundation\Common\VizTextDisplayOptions $text; @@ -34,12 +36,13 @@ class Options implements \JsonSerializable * @param \Grafana\Foundation\Common\BarGaugeSizing|null $sizing * @param int|null $minVizWidth * @param int|null $minVizHeight + * @param \Grafana\Foundation\Common\VizLegendOptions|null $legend * @param \Grafana\Foundation\Common\ReduceDataOptions|null $reduceOptions * @param \Grafana\Foundation\Common\VizTextDisplayOptions|null $text * @param int|null $maxVizHeight * @param \Grafana\Foundation\Common\VizOrientation|null $orientation */ - public function __construct(?\Grafana\Foundation\Common\BarGaugeDisplayMode $displayMode = null, ?\Grafana\Foundation\Common\BarGaugeValueMode $valueMode = null, ?\Grafana\Foundation\Common\BarGaugeNamePlacement $namePlacement = null, ?bool $showUnfilled = null, ?\Grafana\Foundation\Common\BarGaugeSizing $sizing = null, ?int $minVizWidth = null, ?int $minVizHeight = null, ?\Grafana\Foundation\Common\ReduceDataOptions $reduceOptions = null, ?\Grafana\Foundation\Common\VizTextDisplayOptions $text = null, ?int $maxVizHeight = null, ?\Grafana\Foundation\Common\VizOrientation $orientation = null) + public function __construct(?\Grafana\Foundation\Common\BarGaugeDisplayMode $displayMode = null, ?\Grafana\Foundation\Common\BarGaugeValueMode $valueMode = null, ?\Grafana\Foundation\Common\BarGaugeNamePlacement $namePlacement = null, ?bool $showUnfilled = null, ?\Grafana\Foundation\Common\BarGaugeSizing $sizing = null, ?int $minVizWidth = null, ?int $minVizHeight = null, ?\Grafana\Foundation\Common\VizLegendOptions $legend = null, ?\Grafana\Foundation\Common\ReduceDataOptions $reduceOptions = null, ?\Grafana\Foundation\Common\VizTextDisplayOptions $text = null, ?int $maxVizHeight = null, ?\Grafana\Foundation\Common\VizOrientation $orientation = null) { $this->displayMode = $displayMode ?: \Grafana\Foundation\Common\BarGaugeDisplayMode::gradient(); $this->valueMode = $valueMode ?: \Grafana\Foundation\Common\BarGaugeValueMode::color(); @@ -48,6 +51,7 @@ class Options implements \JsonSerializable $this->sizing = $sizing ?: \Grafana\Foundation\Common\BarGaugeSizing::auto(); $this->minVizWidth = $minVizWidth ?: 8; $this->minVizHeight = $minVizHeight ?: 16; + $this->legend = $legend ?: new \Grafana\Foundation\Common\VizLegendOptions(); $this->reduceOptions = $reduceOptions ?: new \Grafana\Foundation\Common\ReduceDataOptions(); $this->text = $text; $this->maxVizHeight = $maxVizHeight ?: 300; @@ -59,7 +63,7 @@ class Options implements \JsonSerializable */ public static function fromArray(array $inputData): self { - /** @var array{displayMode?: string, valueMode?: string, namePlacement?: string, showUnfilled?: bool, sizing?: string, minVizWidth?: int, minVizHeight?: int, reduceOptions?: mixed, text?: mixed, maxVizHeight?: int, orientation?: string} $inputData */ + /** @var array{displayMode?: string, valueMode?: string, namePlacement?: string, showUnfilled?: bool, sizing?: string, minVizWidth?: int, minVizHeight?: int, legend?: mixed, reduceOptions?: mixed, text?: mixed, maxVizHeight?: int, orientation?: string} $inputData */ $data = $inputData; return new self( displayMode: isset($data["displayMode"]) ? (function($input) { return \Grafana\Foundation\Common\BarGaugeDisplayMode::fromValue($input); })($data["displayMode"]) : null, @@ -69,6 +73,11 @@ class Options implements \JsonSerializable sizing: isset($data["sizing"]) ? (function($input) { return \Grafana\Foundation\Common\BarGaugeSizing::fromValue($input); })($data["sizing"]) : null, minVizWidth: $data["minVizWidth"] ?? null, minVizHeight: $data["minVizHeight"] ?? null, + legend: isset($data["legend"]) ? (function($input) { + /** @var array{displayMode?: string, placement?: string, showLegend?: bool, asTable?: bool, isVisible?: bool, sortBy?: string, sortDesc?: bool, width?: float, calcs?: array} */ + $val = $input; + return \Grafana\Foundation\Common\VizLegendOptions::fromArray($val); + })($data["legend"]) : null, reduceOptions: isset($data["reduceOptions"]) ? (function($input) { /** @var array{values?: bool, limit?: float, calcs?: array, fields?: string} */ $val = $input; @@ -97,6 +106,7 @@ class Options implements \JsonSerializable "sizing" => $this->sizing, "minVizWidth" => $this->minVizWidth, "minVizHeight" => $this->minVizHeight, + "legend" => $this->legend, "reduceOptions" => $this->reduceOptions, "maxVizHeight" => $this->maxVizHeight, "orientation" => $this->orientation, diff --git a/php/src/Bargauge/PanelBuilder.php b/php/src/Bargauge/PanelBuilder.php index 85644b4..351d0a4 100644 --- a/php/src/Bargauge/PanelBuilder.php +++ b/php/src/Bargauge/PanelBuilder.php @@ -540,6 +540,20 @@ class PanelBuilder implements \Grafana\Foundation\Cog\Builder return $this; } + /** + * @param \Grafana\Foundation\Cog\Builder<\Grafana\Foundation\Common\VizLegendOptions> $legend + */ + public function legend(\Grafana\Foundation\Cog\Builder $legend): static + { + if ($this->internal->options === null) { + $this->internal->options = new \Grafana\Foundation\Bargauge\Options(); + } + assert($this->internal->options instanceof \Grafana\Foundation\Bargauge\Options); + $legendResource = $legend->build(); + $this->internal->options->legend = $legendResource; + + return $this; + } /** * @param \Grafana\Foundation\Cog\Builder<\Grafana\Foundation\Common\ReduceDataOptions> $reduceOptions */ diff --git a/php/src/Cloudwatch/QueryEditorArrayExpression.php b/php/src/Cloudwatch/QueryEditorArrayExpression.php index 3a87b04..3b3ed16 100644 --- a/php/src/Cloudwatch/QueryEditorArrayExpression.php +++ b/php/src/Cloudwatch/QueryEditorArrayExpression.php @@ -34,10 +34,6 @@ class QueryEditorArrayExpression implements \JsonSerializable \assert(is_array($input), 'expected disjunction value to be an array'); switch ($input["type"]) { - case "operator": - return QueryEditorOperatorExpression::fromArray($input); - case "and": - return QueryEditorArrayExpression::fromArray($input); case "or": return QueryEditorArrayExpression::fromArray($input); case "property": @@ -48,6 +44,10 @@ class QueryEditorArrayExpression implements \JsonSerializable return QueryEditorFunctionExpression::fromArray($input); case "functionParameter": return QueryEditorFunctionParameterExpression::fromArray($input); + case "operator": + return QueryEditorOperatorExpression::fromArray($input); + case "and": + return QueryEditorArrayExpression::fromArray($input); default: throw new \ValueError('can not parse disjunction from array'); } diff --git a/php/src/Cloudwatch/SQLExpression.php b/php/src/Cloudwatch/SQLExpression.php index 2fb8653..88380e3 100644 --- a/php/src/Cloudwatch/SQLExpression.php +++ b/php/src/Cloudwatch/SQLExpression.php @@ -77,10 +77,10 @@ class SQLExpression implements \JsonSerializable \assert(is_array($input), 'expected disjunction value to be an array'); switch ($input["type"]) { - case "property": - return QueryEditorPropertyExpression::fromArray($input); case "function": return QueryEditorFunctionExpression::fromArray($input); + case "property": + return QueryEditorPropertyExpression::fromArray($input); default: throw new \ValueError('can not parse disjunction from array'); } diff --git a/php/src/Cloudwatch/VariantConfig.php b/php/src/Cloudwatch/VariantConfig.php index 0e16d2d..e8860cc 100644 --- a/php/src/Cloudwatch/VariantConfig.php +++ b/php/src/Cloudwatch/VariantConfig.php @@ -12,12 +12,12 @@ final class VariantConfig \assert(is_array($input), 'expected disjunction value to be an array'); ...*[Comment body truncated]*