Skip to content

Commit 4d5d6ee

Browse files
authored
feat(alerts): add outlier detection support (#1346)
1 parent 1836e9a commit 4d5d6ee

File tree

2 files changed

+337
-0
lines changed

2 files changed

+337
-0
lines changed

pkg/alerts/nrql_conditions.go

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,11 @@ var (
128128
// NrqlConditionTypes enumerates the possible NRQL condition type values for NRQL alert conditions.
129129
NrqlConditionTypes = struct {
130130
Baseline NrqlConditionType
131+
Outlier NrqlConditionType
131132
Static NrqlConditionType
132133
}{
133134
Baseline: "BASELINE",
135+
Outlier: "OUTLIER",
134136
Static: "STATIC",
135137
}
136138
)
@@ -222,6 +224,23 @@ var (
222224
}
223225
)
224226

227+
type NrqlOutlierDbScanConfigurationInput struct {
228+
Epsilon float64 `json:"epsilon"`
229+
MinimumPoints int `json:"minimumPoints"`
230+
EvaluationGroupFacet *string `json:"evaluationGroupFacet,omitempty"`
231+
}
232+
233+
type NrqlOutlierConfigurationInput struct {
234+
DBSCAN NrqlOutlierDbScanConfigurationInput `json:"dbscan"`
235+
}
236+
237+
type NrqlOutlierConfigurationOutput struct {
238+
Algorithm string `json:"algorithm"`
239+
Epsilon float64 `json:"epsilon"`
240+
MinimumPoints int `json:"minimumPoints"`
241+
EvaluationGroupFacet *string `json:"evaluationGroupFacet,omitempty"`
242+
}
243+
225244
type NrqlConditionThresholdPrediction struct {
226245
PredictBy int `json:"predictBy,omitempty"`
227246
PreferPredictionViolation bool `json:"preferPredictionViolation"`
@@ -317,6 +336,8 @@ type NrqlConditionCreateInput struct {
317336

318337
// BaselineDirection ONLY applies to NRQL conditions of type BASELINE.
319338
BaselineDirection *NrqlBaselineDirection `json:"baselineDirection,omitempty"`
339+
// OutlierConfiguration ONLY applies to NRQL conditions of type OUTLIER.
340+
OutlierConfiguration *NrqlOutlierConfigurationInput `json:"outlierConfiguration,omitempty"`
320341
// SignalSeasonality ONLY applies to NRQL conditions of type BASELINE.
321342
SignalSeasonality *NrqlSignalSeasonality `json:"signalSeasonality,omitempty"`
322343
}
@@ -327,6 +348,8 @@ type NrqlConditionUpdateInput struct {
327348

328349
// BaselineDirection ONLY applies to NRQL conditions of type BASELINE.
329350
BaselineDirection *NrqlBaselineDirection `json:"baselineDirection,omitempty"`
351+
// OutlierConfiguration ONLY applies to NRQL conditions of type OUTLIER.
352+
OutlierConfiguration *NrqlOutlierConfigurationInput `json:"outlierConfiguration,omitempty"`
330353
// SignalSeasonality ONLY applies to NRQL conditions of type BASELINE.
331354
SignalSeasonality *NrqlSignalSeasonality `json:"signalSeasonality,omitempty"`
332355
}
@@ -348,6 +371,8 @@ type NrqlAlertCondition struct {
348371

349372
// BaselineDirection exists ONLY for NRQL conditions of type BASELINE.
350373
BaselineDirection *NrqlBaselineDirection `json:"baselineDirection,omitempty"`
374+
// OutlierConfiguration ONLY applies to NRQL conditions of type OUTLIER.
375+
OutlierConfiguration *NrqlOutlierConfigurationOutput `json:"outlierConfiguration,omitempty"`
351376
// SignalSeasonality exists ONLY for NRQL conditions of type BASELINE.
352377
SignalSeasonality *NrqlSignalSeasonality `json:"signalSeasonality,omitempty"`
353378
}
@@ -613,6 +638,66 @@ func (a *Alerts) UpdateNrqlConditionBaselineMutationWithContext(
613638
return &resp.AlertsNrqlConditionBaselineUpdate, nil
614639
}
615640

641+
// CreateNrqlConditionOutlierMutation creates an outlier NRQL alert condition via New Relic's NerdGraph API.
642+
func (a *Alerts) CreateNrqlConditionOutlierMutation(
643+
accountID int,
644+
policyID string,
645+
nrqlCondition NrqlConditionCreateInput,
646+
) (*NrqlAlertCondition, error) {
647+
return a.CreateNrqlConditionOutlierMutationWithContext(context.Background(), accountID, policyID, nrqlCondition)
648+
}
649+
650+
// CreateNrqlConditionOutlierMutationWithContext creates an outlier NRQL alert condition via New Relic's NerdGraph API.
651+
func (a *Alerts) CreateNrqlConditionOutlierMutationWithContext(
652+
ctx context.Context,
653+
accountID int,
654+
policyID string,
655+
nrqlCondition NrqlConditionCreateInput,
656+
) (*NrqlAlertCondition, error) {
657+
resp := nrqlConditionOutlierCreateResponse{}
658+
vars := map[string]interface{}{
659+
"accountId": accountID,
660+
"policyId": policyID,
661+
"condition": nrqlCondition,
662+
}
663+
664+
if err := a.NerdGraphQueryWithContext(ctx, createNrqlConditionOutlierMutation, vars, &resp); err != nil {
665+
return nil, err
666+
}
667+
668+
return &resp.AlertsNrqlConditionOutlierCreate, nil
669+
}
670+
671+
// UpdateNrqlConditionOutlierMutation updates an outlier NRQL alert condition via New Relic's NerdGraph API.
672+
func (a *Alerts) UpdateNrqlConditionOutlierMutation(
673+
accountID int,
674+
conditionID string,
675+
nrqlCondition NrqlConditionUpdateInput,
676+
) (*NrqlAlertCondition, error) {
677+
return a.UpdateNrqlConditionOutlierMutationWithContext(context.Background(), accountID, conditionID, nrqlCondition)
678+
}
679+
680+
// UpdateNrqlConditionOutlierMutationWithContext updates an outlier NRQL alert condition via New Relic's NerdGraph API.
681+
func (a *Alerts) UpdateNrqlConditionOutlierMutationWithContext(
682+
ctx context.Context,
683+
accountID int,
684+
conditionID string,
685+
nrqlCondition NrqlConditionUpdateInput,
686+
) (*NrqlAlertCondition, error) {
687+
resp := nrqlConditionOutlierUpdateResponse{}
688+
vars := map[string]interface{}{
689+
"accountId": accountID,
690+
"id": conditionID,
691+
"condition": nrqlCondition,
692+
}
693+
694+
if err := a.NerdGraphQueryWithContext(ctx, updateNrqlConditionOutlierMutation, vars, &resp); err != nil {
695+
return nil, err
696+
}
697+
698+
return &resp.AlertsNrqlConditionOutlierUpdate, nil
699+
}
700+
616701
// CreateNrqlConditionStaticMutation creates a static NRQL alert condition via New Relic's NerdGraph API.
617702
func (a *Alerts) CreateNrqlConditionStaticMutation(
618703
accountID int,
@@ -716,6 +801,14 @@ type nrqlConditionBaselineUpdateResponse struct {
716801
AlertsNrqlConditionBaselineUpdate NrqlAlertCondition `json:"alertsNrqlConditionBaselineUpdate"`
717802
}
718803

804+
type nrqlConditionOutlierCreateResponse struct {
805+
AlertsNrqlConditionOutlierCreate NrqlAlertCondition `json:"alertsNrqlConditionOutlierCreate"`
806+
}
807+
808+
type nrqlConditionOutlierUpdateResponse struct {
809+
AlertsNrqlConditionOutlierUpdate NrqlAlertCondition `json:"alertsNrqlConditionOutlierUpdate"`
810+
}
811+
719812
type nrqlConditionStaticCreateResponse struct {
720813
AlertsNrqlConditionStaticCreate NrqlAlertCondition `json:"alertsNrqlConditionStaticCreate"`
721814
}
@@ -800,6 +893,19 @@ const (
800893
}
801894
`
802895

896+
graphqlFragmentNrqlOutlierConditionFields = `
897+
... on AlertsNrqlOutlierCondition {
898+
outlierConfiguration {
899+
... on AlertsOutlierDbScanConfiguration {
900+
algorithm
901+
epsilon
902+
minimumPoints
903+
evaluationGroupFacet
904+
}
905+
}
906+
}
907+
`
908+
803909
graphqlFragmentNrqlStaticConditionFields = `
804910
... on AlertsNrqlStaticCondition {
805911
terms {
@@ -822,6 +928,7 @@ const (
822928
nrqlConditions {` +
823929
graphqlNrqlConditionStructFields +
824930
graphqlFragmentNrqlBaselineConditionFields +
931+
graphqlFragmentNrqlOutlierConditionFields +
825932
graphqlFragmentNrqlStaticConditionFields +
826933
`} } } } } }`
827934

@@ -833,6 +940,7 @@ const (
833940
nrqlCondition(id: $id) {` +
834941
graphqlNrqlConditionStructFields +
835942
graphqlFragmentNrqlBaselineConditionFields +
943+
graphqlFragmentNrqlOutlierConditionFields +
836944
graphqlFragmentNrqlStaticConditionFields +
837945
`} } } } }`
838946

@@ -852,6 +960,22 @@ const (
852960
graphqlFragmentNrqlBaselineConditionFields +
853961
` } }`
854962

963+
// Outlier
964+
createNrqlConditionOutlierMutation = `
965+
mutation($accountId: Int!, $policyId: ID!, $condition: AlertsNrqlConditionOutlierInput!) {
966+
alertsNrqlConditionOutlierCreate(accountId: $accountId, policyId: $policyId, condition: $condition) {` +
967+
graphqlNrqlConditionStructFields +
968+
graphqlFragmentNrqlOutlierConditionFields +
969+
` } }`
970+
971+
// Outlier
972+
updateNrqlConditionOutlierMutation = `
973+
mutation($accountId: Int!, $id: ID!, $condition: AlertsNrqlConditionUpdateOutlierInput!) {
974+
alertsNrqlConditionOutlierUpdate(accountId: $accountId, id: $id, condition: $condition) { ` +
975+
graphqlNrqlConditionStructFields +
976+
graphqlFragmentNrqlOutlierConditionFields +
977+
` } }`
978+
855979
// Static
856980
createNrqlConditionStaticMutation = `
857981
mutation($accountId: Int!, $policyId: ID!, $condition: AlertsNrqlConditionStaticInput!) {

0 commit comments

Comments
 (0)