Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(alerts): add support for ignoreOnExpectedTermination in expiration to NRQL alert conditions #1180

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pkg/alerts/nrql_conditions.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ type AlertsNrqlConditionExpiration struct {
ExpirationDuration *int `json:"expirationDuration"`
CloseViolationsOnExpiration bool `json:"closeViolationsOnExpiration"`
OpenViolationOnExpiration bool `json:"openViolationOnExpiration"`
IgnoreOnExpectedTermination bool `json:"ignoreOnExpectedTermination"`
}

// AlertsNrqlConditionSignal - Configuration that defines the signal that the NRQL condition will use to evaluate.
Expand Down Expand Up @@ -735,6 +736,7 @@ const (
closeViolationsOnExpiration
expirationDuration
openViolationOnExpiration
ignoreOnExpectedTermination
}
signal {
aggregationWindow
Expand Down
109 changes: 104 additions & 5 deletions pkg/alerts/nrql_conditions_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -722,10 +722,10 @@ func TestIntegrationNrqlConditions_DataAccountId(t *testing.T) {
}

var nrqlConditionCreateWithDataAccountId = NrqlConditionCreateBase{
Enabled: true,
Name: fmt.Sprintf("test-nrql-condition-%s", testNrqlConditionRandomString),
Enabled: true,
Name: fmt.Sprintf("test-nrql-condition-%s", testNrqlConditionRandomString),
Nrql: NrqlConditionCreateQuery{
Query: "SELECT rate(sum(apm.service.cpu.usertime.utilization), 1 second) * 100 as cpuUsage FROM Metric WHERE appName like 'Dummy App'",
Query: "SELECT rate(sum(apm.service.cpu.usertime.utilization), 1 second) * 100 as cpuUsage FROM Metric WHERE appName like 'Dummy App'",
DataAccountId: &testAccountID,
},
Terms: []NrqlConditionTerm{
Expand All @@ -749,8 +749,8 @@ func TestIntegrationNrqlConditions_DataAccountId(t *testing.T) {
}

var (
randStr = mock.RandSeq(5)
createDataAccountIdInput = NrqlConditionCreateInput{
randStr = mock.RandSeq(5)
createDataAccountIdInput = NrqlConditionCreateInput{
NrqlConditionCreateBase: nrqlConditionCreateWithDataAccountId,
}
)
Expand Down Expand Up @@ -787,3 +787,102 @@ func TestIntegrationNrqlConditions_DataAccountId(t *testing.T) {
}
}()
}

func TestIntegrationNrqlConditions_IgnoreOnExpectedTermination(t *testing.T) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New test

t.Parallel()

testAccountID, err := mock.GetTestAccountID()
if err != nil {
t.Skipf("%s", err)
}

var (
randStr = mock.RandSeq(5)
conditionName = fmt.Sprintf("test-nrql-condition-%s", randStr)
conditionInput = NrqlConditionCreateInput{
NrqlConditionCreateBase: NrqlConditionCreateBase{
Description: "test description",
Enabled: true,
Name: conditionName,
Nrql: NrqlConditionCreateQuery{
Query: "SELECT rate(sum(apm.service.cpu.usertime.utilization), 1 second) * 100 as cpuUsage FROM Metric WHERE appName like 'Dummy App'",
},
RunbookURL: "test.com",
Terms: []NrqlConditionTerm{
{
Threshold: &nrqlConditionBaseThresholdZeroValue,
ThresholdOccurrences: ThresholdOccurrences.AtLeastOnce,
ThresholdDuration: 600,
Operator: AlertsNRQLConditionTermsOperatorTypes.ABOVE,
Priority: NrqlConditionPriorities.Critical,
},
},
Expiration: &AlertsNrqlConditionExpiration{
CloseViolationsOnExpiration: true,
ExpirationDuration: &nrqlConditionBaseExpirationDuration,
OpenViolationOnExpiration: false,
IgnoreOnExpectedTermination: true,
},
ViolationTimeLimitSeconds: 3600,
},
}
updateInput = NrqlConditionUpdateInput{
NrqlConditionUpdateBase: NrqlConditionUpdateBase{
Description: "test description",
Enabled: true,
Name: conditionName,
Nrql: NrqlConditionUpdateQuery{
Query: "SELECT rate(sum(apm.service.cpu.usertime.utilization), 1 second) * 100 as cpuUsage FROM Metric WHERE appName like 'Dummy App'",
},
RunbookURL: "test.com",
Terms: []NrqlConditionTerm{
{
Threshold: &nrqlConditionBaseThresholdZeroValue,
ThresholdOccurrences: ThresholdOccurrences.AtLeastOnce,
ThresholdDuration: 600,
Operator: AlertsNRQLConditionTermsOperatorTypes.ABOVE,
Priority: NrqlConditionPriorities.Critical,
},
},
ViolationTimeLimitSeconds: 3600,
// this part is updated
Expiration: &AlertsNrqlConditionExpiration{
CloseViolationsOnExpiration: true,
ExpirationDuration: &nrqlConditionBaseExpirationDuration,
OpenViolationOnExpiration: false,
IgnoreOnExpectedTermination: false,
},
},
}
)

// Setup
client := newIntegrationTestClient(t)
testPolicy := AlertsPolicyInput{
IncidentPreference: AlertsIncidentPreferenceTypes.PER_POLICY,
Name: fmt.Sprintf("test-alert-policy-%s", randStr),
}
policy, err := client.CreatePolicyMutation(testAccountID, testPolicy)
require.NoError(t, err)

// Test: Create (static condition with expected termination field)
createdCondition, err := client.CreateNrqlConditionStaticMutation(testAccountID, policy.ID, conditionInput)
require.NoError(t, err)
require.NotNil(t, createdCondition)
require.NotNil(t, createdCondition.ID)
require.NotNil(t, createdCondition.PolicyID)
require.NotNil(t, createdCondition.Expiration)
require.Equal(t, true, createdCondition.Expiration.IgnoreOnExpectedTermination)

updatedCondition, err := client.UpdateNrqlConditionStaticMutation(testAccountID, createdCondition.ID, updateInput)
require.NoError(t, err)
require.Equal(t, false, updatedCondition.Expiration.IgnoreOnExpectedTermination)

// Deferred teardown
defer func() {
_, err := client.DeletePolicyMutation(testAccountID, policy.ID)
if err != nil {
t.Logf("error cleaning up alert policy %s (%s): %s", policy.ID, policy.Name, err)
}
}()
}
Loading