diff --git a/alert/queries.go b/alert/queries.go index 94235dee..06526abc 100644 --- a/alert/queries.go +++ b/alert/queries.go @@ -6,6 +6,8 @@ import ( "github.com/K-Phoen/grabana/alert/queries/loki" "github.com/K-Phoen/grabana/alert/queries/prometheus" "github.com/K-Phoen/grabana/alert/queries/stackdriver" + "github.com/K-Phoen/grabana/target/cloudmonitoring" + "github.com/K-Phoen/sdk" ) // WithPrometheusQuery adds a prometheus query to the alert. @@ -39,6 +41,22 @@ func WithStackdriverQuery(query *stackdriver.Stackdriver) Option { } } +// WithStackdriverQuery adds a cloud montioring query to the alert. +func WithCloudMonitoringQuery(ref, datasource string, q cloudmonitoring.AlertModel) Option { + return func(alert *Alert) { + alert.Builder.Rules[0].GrafanaAlert.Data = append( + alert.Builder.Rules[0].GrafanaAlert.Data, + sdk.AlertQuery{ + RefID: ref, + QueryType: "", + DatasourceUID: "__FILL_ME__", + RelativeTimeRange: &sdk.AlertRelativeTimeRange{}, + Model: q.AlertModel(), + }, + ) + } +} + // WithInfluxDBQuery adds an InfluxDB query to the alert. func WithInfluxDBQuery(ref string, query string, options ...influxdb.Option) Option { return func(alert *Alert) { diff --git a/target/cloudmonitoring/cloudmonitoring.go b/target/cloudmonitoring/cloudmonitoring.go index 1af97fb1..1c10c743 100644 --- a/target/cloudmonitoring/cloudmonitoring.go +++ b/target/cloudmonitoring/cloudmonitoring.go @@ -79,3 +79,8 @@ const ( type Target interface { Target() *sdk.Target } + +// Target allows to return an alert model for a specific builder. +type AlertModel interface { + AlertModel() sdk.AlertModel +} diff --git a/target/cloudmonitoring/mql.go b/target/cloudmonitoring/mql.go index d79b3e95..521d6dbc 100644 --- a/target/cloudmonitoring/mql.go +++ b/target/cloudmonitoring/mql.go @@ -45,3 +45,11 @@ func NewMQL(projectName, query string, options ...MQLOption) *MQL { } func (m *MQL) Target() *sdk.Target { return m.target } + +// AlertModel implements the AlertModel interface +func (m *MQL) AlertModel() sdk.AlertModel { + return sdk.AlertModel{ + QueryType: m.target.QueryType, + TimeSeriesQuery: m.target.TimeSeriesQuery, + } +} diff --git a/target/cloudmonitoring/promql.go b/target/cloudmonitoring/promql.go index 6cbabee3..863f2c12 100644 --- a/target/cloudmonitoring/promql.go +++ b/target/cloudmonitoring/promql.go @@ -44,3 +44,10 @@ func NewPromQL(projectName, expr string, options ...PromQLOption) *PromQL { } func (p *PromQL) Target() *sdk.Target { return p.target } + +func (p *PromQL) AlertModel() sdk.AlertModel { + return sdk.AlertModel{ + QueryType: p.target.QueryType, + PromQLQuery: p.target.PromQLQuery, + } +} diff --git a/target/cloudmonitoring/slo.go b/target/cloudmonitoring/slo.go index 1080ed60..13cdb431 100644 --- a/target/cloudmonitoring/slo.go +++ b/target/cloudmonitoring/slo.go @@ -66,3 +66,9 @@ func NewSLO(projectName string, options ...SLOOption) *SLO { } func (s *SLO) Target() *sdk.Target { return s.target } +func (s *SLO) AlertModel() sdk.AlertModel { + return sdk.AlertModel{ + QueryType: s.target.QueryType, + SLOQuery: s.target.SLOQuery, + } +} diff --git a/target/cloudmonitoring/timeseries.go b/target/cloudmonitoring/timeseries.go index 4df12559..9380d32d 100644 --- a/target/cloudmonitoring/timeseries.go +++ b/target/cloudmonitoring/timeseries.go @@ -110,3 +110,11 @@ func NewTimeSeries(projectName, metricType string, options ...TimeSeriesOption) // Target implements the Target interface func (t *TimeSeries) Target() *sdk.Target { return t.target } + +// AlertModel implements the AlertModel interface +func (t *TimeSeries) AlertModel() sdk.AlertModel { + return sdk.AlertModel{ + QueryType: t.target.QueryType, + TimeSeriesList: t.target.TimeSeriesList, + } +}