diff --git a/observability-lib/cmd/api/api.go b/observability-lib/cmd/api/api.go index d6c407f76..ecf08cf5f 100644 --- a/observability-lib/cmd/api/api.go +++ b/observability-lib/cmd/api/api.go @@ -4,6 +4,7 @@ import ( "github.com/smartcontractkit/chainlink-common/observability-lib/cmd/api/contact_point" "github.com/smartcontractkit/chainlink-common/observability-lib/cmd/api/dashboard" "github.com/smartcontractkit/chainlink-common/observability-lib/cmd/api/notification_policy" + "github.com/smartcontractkit/chainlink-common/observability-lib/cmd/api/rule" "github.com/spf13/cobra" ) @@ -16,6 +17,7 @@ func init() { Cmd.AddCommand(contact_point.Cmd) Cmd.AddCommand(dashboard.Cmd) Cmd.AddCommand(notification_policy.Cmd) + Cmd.AddCommand(rule.Cmd) Cmd.PersistentFlags().String("grafana-url", "", "Grafana URL") errURL := Cmd.MarkPersistentFlagRequired("grafana-url") diff --git a/observability-lib/cmd/api/rule/delete.go b/observability-lib/cmd/api/rule/delete.go new file mode 100644 index 000000000..47ca40c8d --- /dev/null +++ b/observability-lib/cmd/api/rule/delete.go @@ -0,0 +1,24 @@ +package rule + +import ( + "github.com/smartcontractkit/chainlink-common/observability-lib/api" + "github.com/spf13/cobra" +) + +var deleteCmd = &cobra.Command{ + Use: "delete [name]", + Short: "Delete rule by UID", + RunE: func(cmd *cobra.Command, args []string) error { + grafanaClient := api.NewClient( + cmd.Flag("grafana-url").Value.String(), + cmd.Flag("grafana-token").Value.String(), + ) + + _, _, errDelete := grafanaClient.DeleteAlertRule(args[0]) + if errDelete != nil { + return errDelete + } + + return nil + }, +} diff --git a/observability-lib/cmd/api/rule/rule.go b/observability-lib/cmd/api/rule/rule.go new file mode 100644 index 000000000..47f0525f5 --- /dev/null +++ b/observability-lib/cmd/api/rule/rule.go @@ -0,0 +1,14 @@ +package rule + +import ( + "github.com/spf13/cobra" +) + +var Cmd = &cobra.Command{ + Use: "rule [actions]", + Short: "Perform actions on dashboard", +} + +func init() { + Cmd.AddCommand(deleteCmd) +} diff --git a/observability-lib/grafana/alerts.go b/observability-lib/grafana/alerts.go index e812f857f..e2fb8ae5f 100644 --- a/observability-lib/grafana/alerts.go +++ b/observability-lib/grafana/alerts.go @@ -12,6 +12,7 @@ type RuleQuery struct { RefID string Datasource string LegendFormat string + TimeRange int64 Instant bool } @@ -20,9 +21,13 @@ func newRuleQuery(query RuleQuery) *alerting.QueryBuilder { query.LegendFormat = "__auto" } + if query.TimeRange == 0 { + query.TimeRange = 600 + } + res := alerting.NewQueryBuilder(query.RefID). DatasourceUid(query.Datasource). - RelativeTimeRange(600, 0) // TODO + RelativeTimeRange(alerting.Duration(query.TimeRange), alerting.Duration(0)) model := prometheus.NewDataqueryBuilder(). Expr(query.Expr). diff --git a/observability-lib/grafana/panels.go b/observability-lib/grafana/panels.go index 818b41cdb..2e4b20c6a 100644 --- a/observability-lib/grafana/panels.go +++ b/observability-lib/grafana/panels.go @@ -120,20 +120,21 @@ func newToolTip(options *ToolTipOptions) *common.VizTooltipOptionsBuilder { } type PanelOptions struct { - Datasource string - Title string - Description string - Span uint32 - Height uint32 - Decimals float64 - Unit string - NoValue string - Min *float64 - Max *float64 - Query []Query - Threshold *ThresholdOptions - Transform *TransformOptions - ColorScheme dashboard.FieldColorModeId + Datasource string + Title string + Description string + Span uint32 + Height uint32 + Decimals float64 + Unit string + NoValue string + Min *float64 + Max *float64 + MaxDataPoints *float64 + Query []Query + Threshold *ThresholdOptions + Transform *TransformOptions + ColorScheme dashboard.FieldColorModeId } type Panel struct { @@ -214,6 +215,10 @@ func NewStatPanel(options *StatPanelOptions) *Panel { Mappings(options.Mappings). ReduceOptions(common.NewReduceDataOptionsBuilder().Calcs([]string{"last"})) + if options.MaxDataPoints != nil { + newPanel.MaxDataPoints(*options.MaxDataPoints) + } + if options.Min != nil { newPanel.Min(*options.Min) } @@ -296,6 +301,10 @@ func NewTimeSeriesPanel(options *TimeSeriesPanelOptions) *Panel { ). Tooltip(newToolTip(options.ToolTipOptions)) + if options.MaxDataPoints != nil { + newPanel.MaxDataPoints(*options.MaxDataPoints) + } + if options.Min != nil { newPanel.Min(*options.Min) } @@ -363,6 +372,10 @@ func NewGaugePanel(options *GaugePanelOptions) *Panel { Calcs([]string{"lastNotNull"}).Values(false), ) + if options.MaxDataPoints != nil { + newPanel.MaxDataPoints(*options.MaxDataPoints) + } + if options.Min != nil { newPanel.Min(*options.Min) } @@ -405,6 +418,10 @@ func NewTablePanel(options *TablePanelOptions) *Panel { Unit(options.Unit). NoValue(options.NoValue) + if options.MaxDataPoints != nil { + newPanel.MaxDataPoints(*options.MaxDataPoints) + } + if options.Min != nil { newPanel.Min(*options.Min) } @@ -451,6 +468,10 @@ func NewLogPanel(options *LogPanelOptions) *Panel { NoValue(options.NoValue). PrettifyLogMessage(options.PrettifyJSON) + if options.MaxDataPoints != nil { + newPanel.MaxDataPoints(*options.MaxDataPoints) + } + if options.Min != nil { newPanel.Min(*options.Min) }