Skip to content

Commit 02f8af5

Browse files
committed
feat(alerts): adds support for pollingFrequency for CCI events
1 parent 496cc4b commit 02f8af5

File tree

3 files changed

+147
-0
lines changed

3 files changed

+147
-0
lines changed

pkg/alerts/nrql_conditions.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type AlertsNrqlConditionSignal struct {
3131
AggregationDelay *int `json:"aggregationDelay,omitempty"`
3232
AggregationTimer *int `json:"aggregationTimer,omitempty"`
3333
SlideBy *int `json:"slideBy,omitempty"`
34+
PollingFrequency *int `json:"pollingFrequency,omitempty"`
3435
}
3536

3637
// AlertsNrqlConditionCreateSignal - Configuration that defines the signal that the NRQL condition will use to evaluate for Create.
@@ -45,6 +46,7 @@ type AlertsNrqlConditionCreateSignal struct {
4546
AggregationDelay *int `json:"aggregationDelay,omitempty"`
4647
AggregationTimer *int `json:"aggregationTimer,omitempty"`
4748
SlideBy *int `json:"slideBy,omitempty"`
49+
PollingFrequency *int `json:"pollingFrequency"`
4850
}
4951

5052
// AlertsNrqlConditionUpdateSignal - Configuration that defines the signal that the NRQL condition will use to evaluate for Update.
@@ -59,6 +61,7 @@ type AlertsNrqlConditionUpdateSignal struct {
5961
AggregationDelay *int `json:"aggregationDelay"`
6062
AggregationTimer *int `json:"aggregationTimer"`
6163
SlideBy *int `json:"slideBy"`
64+
PollingFrequency *int `json:"pollingFrequency,omitempty"`
6265
}
6366

6467
// NrqlConditionAggregationMethod - The available aggregation methods.
@@ -785,6 +788,7 @@ const (
785788
aggregationDelay
786789
aggregationTimer
787790
slideBy
791+
pollingFrequency
788792
}
789793
`
790794

pkg/alerts/nrql_conditions_integration_test.go

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ var (
3030
nrqlConditionTitleTemplate = "Title {{ createdAt }}" // needed for setting pointer
3131
nrqlConditionPredictBy = 7200 // needed for setting pointer
3232
nrqlConditionSignalSeasonality = NrqlSignalSeasonalities.Weekly // needed for setting pointer
33+
nrqlConditionBasePollingFrequency = 3600 // needed for setting pointer
34+
nrqlConditionBasePollingAggWindow = 3600 // needed for setting pointer
3335
nrqlConditionCreateBase = NrqlConditionCreateBase{
3436
Description: "test description",
3537
Enabled: true,
@@ -1229,3 +1231,143 @@ func TestIntegrationNrqlConditions_DisableHealthStatusReporting(t *testing.T) {
12291231
}
12301232
}()
12311233
}
1234+
1235+
func TestIntegrationNrqlConditions_SignalPollingFrequency(t *testing.T) {
1236+
t.Parallel()
1237+
1238+
testAccountID, err := mock.GetTestAccountID()
1239+
if err != nil {
1240+
t.Skipf("%s", err)
1241+
}
1242+
1243+
var (
1244+
updatedPollingFrequency = 7200
1245+
)
1246+
1247+
var conditionCreateInput = NrqlConditionCreateInput{
1248+
NrqlConditionCreateBase: NrqlConditionCreateBase{
1249+
Enabled: true,
1250+
Name: fmt.Sprintf("test-nrql-condition-%s", testNrqlConditionRandomString),
1251+
Nrql: NrqlConditionCreateQuery{
1252+
Query: "select count(*) from CloudCost",
1253+
DataAccountId: &testAccountID,
1254+
},
1255+
Terms: []NrqlConditionTerm{
1256+
{
1257+
Threshold: &nrqlConditionBaseThreshold,
1258+
ThresholdOccurrences: ThresholdOccurrences.AtLeastOnce,
1259+
ThresholdDuration: 3600,
1260+
Operator: AlertsNRQLConditionTermsOperatorTypes.ABOVE,
1261+
Priority: NrqlConditionPriorities.Critical,
1262+
},
1263+
},
1264+
ViolationTimeLimitSeconds: 3600,
1265+
Signal: &AlertsNrqlConditionCreateSignal{
1266+
AggregationWindow: &nrqlConditionBasePollingAggWindow,
1267+
EvaluationDelay: &nrqlConditionEvaluationDelay,
1268+
AggregationDelay: &nrqlConditionBaseAggDelay,
1269+
PollingFrequency: &nrqlConditionBasePollingFrequency,
1270+
},
1271+
},
1272+
}
1273+
var conditionCreateNilInput = NrqlConditionCreateInput{
1274+
NrqlConditionCreateBase: NrqlConditionCreateBase{
1275+
Enabled: true,
1276+
Name: fmt.Sprintf("test-nrql-condition-%s", testNrqlConditionRandomString),
1277+
Nrql: NrqlConditionCreateQuery{
1278+
Query: "SELECT rate(sum(apm.service.cpu.usertime.utilization), 1 second) * 100 as cpuUsage FROM Metric WHERE appName like 'Dummy App'",
1279+
DataAccountId: &testAccountID,
1280+
},
1281+
Terms: []NrqlConditionTerm{
1282+
{
1283+
Threshold: &nrqlConditionBaseThreshold,
1284+
ThresholdOccurrences: ThresholdOccurrences.AtLeastOnce,
1285+
ThresholdDuration: 3600,
1286+
Operator: AlertsNRQLConditionTermsOperatorTypes.ABOVE,
1287+
Priority: NrqlConditionPriorities.Critical,
1288+
},
1289+
},
1290+
ViolationTimeLimitSeconds: 3600,
1291+
Signal: &AlertsNrqlConditionCreateSignal{
1292+
AggregationWindow: &nrqlConditionBasePollingAggWindow,
1293+
EvaluationDelay: &nrqlConditionEvaluationDelay,
1294+
AggregationDelay: &nrqlConditionBaseAggDelay,
1295+
PollingFrequency: nil,
1296+
},
1297+
},
1298+
}
1299+
var conditionUpdateInput = NrqlConditionUpdateInput{
1300+
NrqlConditionUpdateBase: NrqlConditionUpdateBase{
1301+
Enabled: true,
1302+
Name: fmt.Sprintf("test-nrql-condition-%s", testNrqlConditionRandomString),
1303+
Nrql: NrqlConditionUpdateQuery{
1304+
Query: "select count(*) from CloudCost",
1305+
DataAccountId: &testAccountID,
1306+
},
1307+
Terms: []NrqlConditionTerm{
1308+
{
1309+
Threshold: &nrqlConditionBaseThreshold,
1310+
ThresholdOccurrences: ThresholdOccurrences.AtLeastOnce,
1311+
ThresholdDuration: 7200,
1312+
Operator: AlertsNRQLConditionTermsOperatorTypes.ABOVE,
1313+
Priority: NrqlConditionPriorities.Critical,
1314+
},
1315+
},
1316+
ViolationTimeLimitSeconds: 3600,
1317+
Signal: &AlertsNrqlConditionUpdateSignal{
1318+
AggregationWindow: &nrqlConditionBasePollingAggWindow,
1319+
EvaluationDelay: &nrqlConditionEvaluationDelay,
1320+
AggregationDelay: &nrqlConditionBaseAggDelay,
1321+
PollingFrequency: &updatedPollingFrequency,
1322+
},
1323+
},
1324+
}
1325+
1326+
var randStr = mock.RandSeq(5)
1327+
1328+
// Setup
1329+
client := newIntegrationTestClient(t)
1330+
testPolicy := AlertsPolicyInput{
1331+
IncidentPreference: AlertsIncidentPreferenceTypes.PER_POLICY,
1332+
Name: fmt.Sprintf("test-alert-policy-%s", randStr),
1333+
}
1334+
policy, err := client.CreatePolicyMutation(testAccountID, testPolicy)
1335+
require.NoError(t, err)
1336+
1337+
// Test: Create (condition with Signal.PollingFrequency field)
1338+
1339+
createdCondition, err := client.CreateNrqlConditionStaticMutation(testAccountID, policy.ID, conditionCreateInput)
1340+
require.NoError(t, err)
1341+
require.NotNil(t, createdCondition)
1342+
require.NotNil(t, createdCondition.ID)
1343+
require.NotNil(t, createdCondition.PolicyID)
1344+
require.Equal(t, &nrqlConditionBasePollingFrequency, createdCondition.Signal.PollingFrequency)
1345+
1346+
// Test: Create nil (condition with Signal.PollingFrequency field that is nil)
1347+
1348+
createdNilCondition, err := client.CreateNrqlConditionStaticMutation(testAccountID, policy.ID, conditionCreateNilInput)
1349+
require.NoError(t, err)
1350+
require.NotNil(t, createdNilCondition)
1351+
require.NotNil(t, createdNilCondition.ID)
1352+
require.NotNil(t, createdNilCondition.PolicyID)
1353+
require.Nil(t, createdNilCondition.Signal.PollingFrequency)
1354+
1355+
// Test: Get (condition with Signal.PollingFrequency field)
1356+
readResult, err := client.GetNrqlConditionQuery(testAccountID, createdCondition.ID)
1357+
require.NoError(t, err)
1358+
require.NotNil(t, readResult)
1359+
require.Equal(t, &nrqlConditionBasePollingFrequency, readResult.Signal.PollingFrequency)
1360+
1361+
// Test: Update (condition with non-default Signal.PollingFrequency field)
1362+
updatedCondition, err := client.UpdateNrqlConditionStaticMutation(testAccountID, createdCondition.ID, conditionUpdateInput)
1363+
require.NoError(t, err)
1364+
require.Equal(t, &updatedPollingFrequency, updatedCondition.Signal.PollingFrequency)
1365+
1366+
// Deferred teardown
1367+
defer func() {
1368+
_, err := client.DeletePolicyMutation(testAccountID, policy.ID)
1369+
if err != nil {
1370+
t.Logf("error cleaning up alert policy %s (%s): %s", policy.ID, policy.Name, err)
1371+
}
1372+
}()
1373+
}

pkg/entityrelationship/entityrelationship_api.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)